From eb82a985d1a097e0a95326a705deba3d23cd8b1d Mon Sep 17 00:00:00 2001 From: summetdev Date: Mon, 7 Sep 2020 19:59:55 +0300 Subject: [PATCH 001/460] added port field --- core/src/mindustry/ui/dialogs/HostDialog.java | 23 +++++++++++++++++-- 1 file changed, 21 insertions(+), 2 deletions(-) diff --git a/core/src/mindustry/ui/dialogs/HostDialog.java b/core/src/mindustry/ui/dialogs/HostDialog.java index 25300fc0b1..ee5d97977f 100644 --- a/core/src/mindustry/ui/dialogs/HostDialog.java +++ b/core/src/mindustry/ui/dialogs/HostDialog.java @@ -14,6 +14,7 @@ import static mindustry.Vars.*; public class HostDialog extends BaseDialog{ float w = 300; + TextField portField; public HostDialog(){ super("@hostserver"); @@ -39,6 +40,24 @@ public class HostDialog extends BaseDialog{ cont.row(); + cont.table(t -> { + t.add("@server.port").padRight(10); + portField = t.field(String.valueOf(Core.settings.getInt("port", port)), text -> { + Core.settings.put("port", Integer.parseInt(text)); + }).pad(8).grow().get(); + portField.setMaxLength(5); + portField.setValidator(text -> { + try { + int port = Integer.parseInt(text); + return port >= 1 && port <= 65535; + } catch(NumberFormatException e){ + return false; + } + }); + }).width(w).height(70f).pad(4).colspan(3); + + cont.row(); + cont.add().width(65f); cont.button("@host", () -> { @@ -48,7 +67,7 @@ public class HostDialog extends BaseDialog{ } runHost(); - }).width(w).height(70f); + }).width(w).height(70f).disabled(b -> !portField.isValid()); cont.button("?", () -> ui.showInfo("@host.info")).size(65f, 70f).padLeft(6f); @@ -63,7 +82,7 @@ public class HostDialog extends BaseDialog{ ui.loadfrag.show("@hosting"); Time.runTask(5f, () -> { try{ - net.host(Vars.port); + net.host(Core.settings.getInt("port", port)); player.admin(true); if(steam){ From 3caaadd68b7820c0f51888b3c9225e1e6c9b356a Mon Sep 17 00:00:00 2001 From: summetdev Date: Mon, 7 Sep 2020 20:45:57 +0300 Subject: [PATCH 002/460] unused import --- core/src/mindustry/ui/dialogs/HostDialog.java | 1 - 1 file changed, 1 deletion(-) diff --git a/core/src/mindustry/ui/dialogs/HostDialog.java b/core/src/mindustry/ui/dialogs/HostDialog.java index ee5d97977f..7962e46e10 100644 --- a/core/src/mindustry/ui/dialogs/HostDialog.java +++ b/core/src/mindustry/ui/dialogs/HostDialog.java @@ -3,7 +3,6 @@ package mindustry.ui.dialogs; import arc.*; import arc.scene.ui.*; import arc.util.*; -import mindustry.*; import mindustry.core.*; import mindustry.gen.*; import mindustry.ui.*; From 4d8bf876c26cb751d23639ba378f05273938a2a9 Mon Sep 17 00:00:00 2001 From: summetdev Date: Mon, 7 Sep 2020 20:55:41 +0300 Subject: [PATCH 003/460] :) --- core/assets/contributors | 1 + 1 file changed, 1 insertion(+) diff --git a/core/assets/contributors b/core/assets/contributors index ee8b77ddb9..ed908aac6f 100644 --- a/core/assets/contributors +++ b/core/assets/contributors @@ -89,3 +89,4 @@ Daniel Dusek DeltaNedas GioIacca9 SnakkiZXZ +Summet From 484f50d63099e715e62d1c4b8cbd8eb772221667 Mon Sep 17 00:00:00 2001 From: summetdev Date: Mon, 7 Sep 2020 21:10:47 +0300 Subject: [PATCH 004/460] help message refactor --- core/assets/bundles/bundle.properties | 2 +- core/assets/bundles/bundle_ru.properties | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/core/assets/bundles/bundle.properties b/core/assets/bundles/bundle.properties index 6b9f8d5e82..f1f995f72e 100644 --- a/core/assets/bundles/bundle.properties +++ b/core/assets/bundles/bundle.properties @@ -168,7 +168,7 @@ server.kicked.customClient = This server does not support custom builds. Downloa server.kicked.gameover = Game over! server.kicked.serverRestarting = The server is restarting. server.versions = Your version:[accent] {0}[]\nServer version:[accent] {1}[] -host.info = The [accent]host[] button hosts a server on port [scarlet]6567[]. \nAnybody on the same [lightgray]wifi or local network[] should be able to see your server in their server list.\n\nIf you want people to be able to connect from anywhere by IP, [accent]port forwarding[] is required.\n\n[lightgray]Note: If someone is experiencing trouble connecting to your LAN game, make sure you have allowed Mindustry access to your local network in your firewall settings. Note that public networks sometimes do not allow server discovery. +host.info = The [accent]host[] button hosts a server on specified port.\nAnybody on the same [lightgray]wifi or local network[] should be able to see your server in their server list.\n\nIf you want people to be able to connect from anywhere by IP, [accent]port forwarding[] is required.\n\n[lightgray]Note: If someone is experiencing trouble connecting to your LAN game, make sure you have allowed Mindustry access to your local network in your firewall settings. Note that public networks sometimes do not allow server discovery. join.info = Here, you can enter a [accent]server IP[] to connect to, or discover [accent]local network[] or [accent]global[] servers to connect to.\nBoth LAN and WAN multiplayer is supported.\n\n[lightgray]If you want to connect to someone by IP, you would need to ask the host for their IP, which can be found by googling "my ip" from their device. hostserver = Host Multiplayer Game invitefriends = Invite Friends diff --git a/core/assets/bundles/bundle_ru.properties b/core/assets/bundles/bundle_ru.properties index 2fb9106b6d..724dc3c775 100644 --- a/core/assets/bundles/bundle_ru.properties +++ b/core/assets/bundles/bundle_ru.properties @@ -166,7 +166,7 @@ server.kicked.customClient = Этот сервер не поддерживает server.kicked.gameover = Игра окончена! server.kicked.serverRestarting = Сервер перезапускается. server.versions = Ваша версия:[accent] {0}[]\nВерсия сервера:[accent] {1}[] -host.info = Кнопка [accent]Открыть сервер[] запускает сервер на порте [scarlet]6567[].\nЛюбой пользователь в той же [lightgray]локальной сети или WiFi[] должен увидеть ваш сервер в своём списке серверов.\n\nЕсли вы хотите, чтобы люди могли подключаться откуда угодно по IP, то требуется [accent]переадресация (проброс) портов[] и наличие [red]ВНЕШНЕГО[] WAN адреса (WAN адрес [red]НЕ должен[] начинаться с [red]10[][lightgray].x.x.x[], [red]100.64[][lightgray].x.x[], [red]172.16[][lightgray].x.x[], [red]192.168[][lightgray].x.x[], [red]127[][lightgray].x.x.x[])!\nКлиентам мобильных операторов нужно уточнять информацию в личном кабинете на сайте вашего оператора!\n\n[lightgray]Примечание: Если у кого-то возникают проблемы с подключением к вашей игре по локальной сети, убедитесь, что вы разрешили доступ Mindustry к вашей локальной сети в настройках брандмауэра. Обратите внимание, что публичные сети иногда не позволяют обнаружение сервера. +host.info = Кнопка [accent]Открыть сервер[] запускает сервер на указанном порте.\nЛюбой пользователь в той же [lightgray]локальной сети или WiFi[] должен увидеть ваш сервер в своём списке серверов.\n\nЕсли вы хотите, чтобы люди могли подключаться откуда угодно по IP, то требуется [accent]переадресация (проброс) портов[] и наличие [red]ВНЕШНЕГО[] WAN адреса (WAN адрес [red]НЕ должен[] начинаться с [red]10[][lightgray].x.x.x[], [red]100.64[][lightgray].x.x[], [red]172.16[][lightgray].x.x[], [red]192.168[][lightgray].x.x[], [red]127[][lightgray].x.x.x[])!\nКлиентам мобильных операторов нужно уточнять информацию в личном кабинете на сайте вашего оператора!\n\n[lightgray]Примечание: Если у кого-то возникают проблемы с подключением к вашей игре по локальной сети, убедитесь, что вы разрешили доступ Mindustry к вашей локальной сети в настройках брандмауэра. Обратите внимание, что публичные сети иногда не позволяют обнаружение сервера. join.info = Здесь вы можете ввести [accent]IP-адрес сервера[], найти доступные [accent]локальные[] и [accent]глобальные[] серверы для подключения.\nПоддерживаются оба многопользовательских режима: LAN и WAN.\n\n[lightgray]Если вы хотите подключиться к кому-то по IP-адресу, Вам нужно будет попросить IP-адрес у самого хоста. Хост может узнать IP-адрес своего устройства через Google запрос [accent]"my ip"[]. hostserver = Запустить многопользовательский сервер invitefriends = Пригласить друзей From e5dcca27f526304818619f20342d02cd07b34e5c Mon Sep 17 00:00:00 2001 From: Antsiferov Andrew Date: Sat, 12 Sep 2020 23:31:35 +0300 Subject: [PATCH 005/460] oh no --- core/assets/contributors | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/core/assets/contributors b/core/assets/contributors index 926b3d17d4..731248cd86 100644 --- a/core/assets/contributors +++ b/core/assets/contributors @@ -89,5 +89,5 @@ Daniel Dusek DeltaNedas GioIacca9 SnakkiZXZ -sk772 -Summet \ No newline at end of file +sk7725 +Summet From e390ee97ddb88c4302ecc1f08df2ae7df9bfce91 Mon Sep 17 00:00:00 2001 From: zethnest <16971676+zethnest@users.noreply.github.com> Date: Fri, 1 Jan 2021 13:11:34 +0800 Subject: [PATCH 006/460] Flexible port --- core/src/mindustry/net/Host.java | 13 +++++++++---- core/src/mindustry/net/NetworkIO.java | 6 +++++- core/src/mindustry/ui/dialogs/JoinDialog.java | 2 +- 3 files changed, 15 insertions(+), 6 deletions(-) diff --git a/core/src/mindustry/net/Host.java b/core/src/mindustry/net/Host.java index 123fdad341..fe80c879ce 100644 --- a/core/src/mindustry/net/Host.java +++ b/core/src/mindustry/net/Host.java @@ -14,20 +14,25 @@ public class Host{ public final String versionType; public final Gamemode mode; public final @Nullable String modeName; - public int ping, port = Vars.port; + public int ping, port; - public Host(int ping, String name, String address, String mapname, int wave, int players, int version, String versionType, Gamemode mode, int playerLimit, String description, String modeName){ + public Host(int ping, String name, String address, int port, String mapname, int wave, int players, int version, String versionType, Gamemode mode, int playerLimit, String description, String modeName){ this.ping = ping; this.name = name; this.address = address; - this.players = players; + this.port = port; this.mapname = mapname; this.wave = wave; + this.players = players; this.version = version; this.versionType = versionType; - this.playerLimit = playerLimit; this.mode = mode; + this.playerLimit = playerLimit; this.description = description; this.modeName = modeName; } + + public Host(int ping, String name, String address, String mapname, int wave, int players, int version, String versionType, Gamemode mode, int playerLimit, String description, String modeName){ + this(ping, name, address, Vars.port, mapname, wave, players, version, versionType, mode, playerLimit, description, modeName); + } } diff --git a/core/src/mindustry/net/NetworkIO.java b/core/src/mindustry/net/NetworkIO.java index 05bd69fe32..68e5f02f80 100644 --- a/core/src/mindustry/net/NetworkIO.java +++ b/core/src/mindustry/net/NetworkIO.java @@ -3,6 +3,7 @@ package mindustry.net; import arc.Core; import arc.util.*; import arc.util.io.*; +import mindustry.*; import mindustry.core.*; import mindustry.game.*; import mindustry.gen.*; @@ -80,6 +81,7 @@ public class NetworkIO{ buffer.put((byte)state.rules.mode().ordinal()); buffer.putInt(netServer.admins.getPlayerLimit()); + buffer.putInt(Core.settings.getInt("port", port)); writeString(buffer, description, 100); if(state.rules.modeName != null){ @@ -99,8 +101,10 @@ public class NetworkIO{ int limit = buffer.getInt(); String description = readString(buffer); String modeName = readString(buffer); + int hostPort = buffer.getInt(); + hostPort = hostPort != 0 ? hostPort : Vars.port; - return new Host(ping, host, hostAddress, map, wave, players, version, vertype, gamemode, limit, description, modeName.isEmpty() ? null : modeName); + return new Host(ping, host, hostAddress, hostPort, map, wave, players, version, vertype, gamemode, limit, description, modeName.isEmpty() ? null : modeName); } private static void writeString(ByteBuffer buffer, String string, int maxlen){ diff --git a/core/src/mindustry/ui/dialogs/JoinDialog.java b/core/src/mindustry/ui/dialogs/JoinDialog.java index 1c80418708..233dab599b 100644 --- a/core/src/mindustry/ui/dialogs/JoinDialog.java +++ b/core/src/mindustry/ui/dialogs/JoinDialog.java @@ -487,4 +487,4 @@ public class JoinDialog extends BaseDialog{ public Server(){ } } -} \ No newline at end of file +} From 009af9976ce9a4c175f95dde0f72dc695c620129 Mon Sep 17 00:00:00 2001 From: Antsiferov Andrew Date: Fri, 1 Jan 2021 21:56:14 +0300 Subject: [PATCH 007/460] Update contributors --- core/assets/contributors | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/core/assets/contributors b/core/assets/contributors index 9e0676f107..e11fc8b808 100644 --- a/core/assets/contributors +++ b/core/assets/contributors @@ -91,7 +91,6 @@ DeltaNedas GioIacca9 SnakkiZXZ sk7725 -Summet The Slaylord ThePlayerA YellOw139 @@ -112,4 +111,4 @@ Quick-Korx Catchears younggam simba-fs -RedRadiation \ No newline at end of file +RedRadiation From 0bed22a5094e33b0ffaba91087aca18ef265f6f1 Mon Sep 17 00:00:00 2001 From: Shade Date: Sun, 4 Feb 2024 15:49:46 +0800 Subject: [PATCH 008/460] implemented optionalBoostIntensity in BurstDrill --- .../world/blocks/production/BurstDrill.java | 27 ++++++++++++++++++- 1 file changed, 26 insertions(+), 1 deletion(-) diff --git a/core/src/mindustry/world/blocks/production/BurstDrill.java b/core/src/mindustry/world/blocks/production/BurstDrill.java index cf4340866e..07020961bf 100644 --- a/core/src/mindustry/world/blocks/production/BurstDrill.java +++ b/core/src/mindustry/world/blocks/production/BurstDrill.java @@ -11,6 +11,11 @@ import mindustry.entities.*; import mindustry.gen.*; import mindustry.graphics.*; import mindustry.type.*; +import mindustry.world.blocks.environment.*; +import mindustry.world.consumers.*; +import mindustry.world.meta.*; + +import static mindustry.Vars.*; public class BurstDrill extends Drill{ public float shake = 2f; @@ -22,6 +27,8 @@ public class BurstDrill extends Drill{ public @Load("@-arrow-blur") TextureRegion arrowBlurRegion; public float invertedTime = 200f; + /** How many times faster the drill will progress when boosted by an optional consumer. */ + public float optionalBoostIntensity = 1.5f; public float arrowSpacing = 4f, arrowOffset = 0f; public int arrows = 3; public Color arrowColor = Color.valueOf("feb380"), baseArrowColor = Color.valueOf("6e7080"); @@ -53,6 +60,23 @@ public class BurstDrill extends Drill{ return drillTime / drillMultipliers.get(item, 1f); } + @Override + public void setStats(){ + stats.add(Stat.drillTier, StatValues.drillables(drillTime, hardnessDrillMultiplier, size * size, drillMultipliers, b -> b instanceof Floor f && !f.wallOre && f.itemDrop != null && + f.itemDrop.hardness <= tier && f.itemDrop != blockedItem && (indexer.isBlockPresent(f) || state.isMenu()))); + + stats.add(Stat.drillSpeed, 60f / drillTime * size * size, StatUnit.itemsSecond); + + if(optionalBoostIntensity != 1 && findConsumer(f -> f instanceof ConsumeLiquidBase && f.booster) instanceof ConsumeLiquidBase consBase){ + stats.remove(Stat.booster); + stats.add(Stat.booster, + StatValues.speedBoosters("{0}" + StatUnit.timesSpeed.localized(), + consBase.amount, optionalBoostIntensity, false, + l -> (consumesLiquid(l) && (findConsumer(f -> f instanceof ConsumeLiquid).booster || ((ConsumeLiquid)findConsumer(f -> f instanceof ConsumeLiquid)).liquid != l))) + ); + } + } + public class BurstDrillBuild extends DrillBuild{ //used so the lights don't fade out immediately public float smoothProgress = 0f; @@ -70,7 +94,8 @@ public class BurstDrill extends Drill{ dump(items.has(dominantItem) ? dominantItem : null); } - float drillTime = getDrillTime(dominantItem); + float multiplier = Mathf.lerp(1f, optionalBoostIntensity, optionalEfficiency); + float drillTime = getDrillTime(dominantItem) / multiplier; smoothProgress = Mathf.lerpDelta(smoothProgress, progress / (drillTime - 20f), 0.1f); From efcd99f505da9271782f70c32f895f5757c479e6 Mon Sep 17 00:00:00 2001 From: Shade Date: Sun, 4 Feb 2024 17:07:48 +0800 Subject: [PATCH 009/460] Fixes... pt 1 Thanks BalaM314 using liquidBoostIntensity rather than optionalBoostIntensity applied on speed rather than drillTime --- .../world/blocks/production/BurstDrill.java | 13 +++++-------- 1 file changed, 5 insertions(+), 8 deletions(-) diff --git a/core/src/mindustry/world/blocks/production/BurstDrill.java b/core/src/mindustry/world/blocks/production/BurstDrill.java index 07020961bf..3bc3e76abf 100644 --- a/core/src/mindustry/world/blocks/production/BurstDrill.java +++ b/core/src/mindustry/world/blocks/production/BurstDrill.java @@ -27,8 +27,6 @@ public class BurstDrill extends Drill{ public @Load("@-arrow-blur") TextureRegion arrowBlurRegion; public float invertedTime = 200f; - /** How many times faster the drill will progress when boosted by an optional consumer. */ - public float optionalBoostIntensity = 1.5f; public float arrowSpacing = 4f, arrowOffset = 0f; public int arrows = 3; public Color arrowColor = Color.valueOf("feb380"), baseArrowColor = Color.valueOf("6e7080"); @@ -67,11 +65,11 @@ public class BurstDrill extends Drill{ stats.add(Stat.drillSpeed, 60f / drillTime * size * size, StatUnit.itemsSecond); - if(optionalBoostIntensity != 1 && findConsumer(f -> f instanceof ConsumeLiquidBase && f.booster) instanceof ConsumeLiquidBase consBase){ + if(liquidBoostIntensity != 1 && findConsumer(f -> f instanceof ConsumeLiquidBase && f.booster) instanceof ConsumeLiquidBase consBase){ stats.remove(Stat.booster); stats.add(Stat.booster, StatValues.speedBoosters("{0}" + StatUnit.timesSpeed.localized(), - consBase.amount, optionalBoostIntensity, false, + consBase.amount, liquidBoostIntensity, false, l -> (consumesLiquid(l) && (findConsumer(f -> f instanceof ConsumeLiquid).booster || ((ConsumeLiquid)findConsumer(f -> f instanceof ConsumeLiquid)).liquid != l))) ); } @@ -93,16 +91,15 @@ public class BurstDrill extends Drill{ if(timer(timerDump, dumpTime)){ dump(items.has(dominantItem) ? dominantItem : null); } - - float multiplier = Mathf.lerp(1f, optionalBoostIntensity, optionalEfficiency); - float drillTime = getDrillTime(dominantItem) / multiplier; + + float drillTime = getDrillTime(dominantItem); smoothProgress = Mathf.lerpDelta(smoothProgress, progress / (drillTime - 20f), 0.1f); if(items.total() <= itemCapacity - dominantItems && dominantItems > 0 && efficiency > 0){ warmup = Mathf.approachDelta(warmup, progress / drillTime, 0.01f); - float speed = efficiency; + float speed = Mathf.lerp(1f, liquidBoostIntensity, optionalEfficiency) * efficiency; timeDrilled += speedCurve.apply(progress / drillTime) * speed; From c0047c0f49774de2e7965f6a66a27e81a4a34079 Mon Sep 17 00:00:00 2001 From: Shade Date: Sun, 4 Feb 2024 18:12:46 +0800 Subject: [PATCH 010/460] Stat Changes Round 1 impact drill beryl multi (2.5x -> 2x) nitro buff (2.5x) (2/s) eruption drill base drill (6 sec -> 5.5 sec, or 4.16 -> 4.54) beryl multi (2.5x -> 1.5x) cyano buff (2.1x) (0.64/s) --- core/src/mindustry/content/Blocks.java | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/core/src/mindustry/content/Blocks.java b/core/src/mindustry/content/Blocks.java index c86f3ffe56..b2191841b4 100644 --- a/core/src/mindustry/content/Blocks.java +++ b/core/src/mindustry/content/Blocks.java @@ -2847,17 +2847,19 @@ public class Blocks{ blockedItem = Items.thorium; researchCostMultiplier = 0.5f; - drillMultipliers.put(Items.beryllium, 2.5f); + drillMultipliers.put(Items.beryllium, 2f); + liquidBoostIntensity = 2.5f; fogRadius = 4; consumePower(160f / 60f); consumeLiquid(Liquids.water, 0.2f); + consumeLiquid(Liquids.nitrogen, 2f / 60f).boost(); }}; eruptionDrill = new BurstDrill("eruption-drill"){{ requirements(Category.production, with(Items.silicon, 200, Items.oxide, 20, Items.tungsten, 200, Items.thorium, 120)); - drillTime = 60f * 6f; + drillTime = 60f * 5.5f; size = 5; hasPower = true; tier = 7; @@ -2876,11 +2878,13 @@ public class Blocks{ glowColor.a = 0.6f; fogRadius = 5; - drillMultipliers.put(Items.beryllium, 2.5f); - + drillMultipliers.put(Items.beryllium, 1.5f); + liquidBoostIntensity = 2.1f; + //TODO different requirements consumePower(6f); - consumeLiquids(LiquidStack.with(Liquids.hydrogen, 4f / 60f)); + consumeLiquid(Liquids.hydrogen, 4f / 60f); + consumeLiquid(Liquids.cyanogen, 0.64f / 60f).boost(); }}; //endregion From 096f3ec0d39ef75ae736f989d88fd3feb162e31b Mon Sep 17 00:00:00 2001 From: Shade Date: Sun, 4 Feb 2024 20:34:30 +0800 Subject: [PATCH 011/460] forgor super.setStats(), removed uneccesary liquidBoostIntensity from Constructor --- core/src/mindustry/world/blocks/production/BurstDrill.java | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/core/src/mindustry/world/blocks/production/BurstDrill.java b/core/src/mindustry/world/blocks/production/BurstDrill.java index 3bc3e76abf..c8e92996d8 100644 --- a/core/src/mindustry/world/blocks/production/BurstDrill.java +++ b/core/src/mindustry/world/blocks/production/BurstDrill.java @@ -40,7 +40,6 @@ public class BurstDrill extends Drill{ //does not drill in the traditional sense, so this is not even used hardnessDrillMultiplier = 0f; - liquidBoostIntensity = 1f; //generally at center drillEffectRnd = 0f; drillEffect = Fx.shockwave; @@ -60,10 +59,7 @@ public class BurstDrill extends Drill{ @Override public void setStats(){ - stats.add(Stat.drillTier, StatValues.drillables(drillTime, hardnessDrillMultiplier, size * size, drillMultipliers, b -> b instanceof Floor f && !f.wallOre && f.itemDrop != null && - f.itemDrop.hardness <= tier && f.itemDrop != blockedItem && (indexer.isBlockPresent(f) || state.isMenu()))); - - stats.add(Stat.drillSpeed, 60f / drillTime * size * size, StatUnit.itemsSecond); + super.setStats(); if(liquidBoostIntensity != 1 && findConsumer(f -> f instanceof ConsumeLiquidBase && f.booster) instanceof ConsumeLiquidBase consBase){ stats.remove(Stat.booster); From 6f4716cb53761fd77727d81387fd4c9cd030c88a Mon Sep 17 00:00:00 2001 From: Shade Date: Fri, 9 Feb 2024 23:22:01 +0800 Subject: [PATCH 012/460] Round 2 Drill Stats Eruption and nitro impact now has the same tile efficiency Beryl nitro impact doesn't beat Beryl eruption Buffed Base Eruption Further (now to 5.33 * 60f) Nerfed Cyano Boost Cost --- core/src/mindustry/content/Blocks.java | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/core/src/mindustry/content/Blocks.java b/core/src/mindustry/content/Blocks.java index b2191841b4..9b1265b9d6 100644 --- a/core/src/mindustry/content/Blocks.java +++ b/core/src/mindustry/content/Blocks.java @@ -2847,8 +2847,8 @@ public class Blocks{ blockedItem = Items.thorium; researchCostMultiplier = 0.5f; - drillMultipliers.put(Items.beryllium, 2f); - liquidBoostIntensity = 2.5f; + drillMultipliers.put(Items.beryllium, 1.3f); + liquidBoostIntensity = 2.25f; fogRadius = 4; @@ -2859,7 +2859,7 @@ public class Blocks{ eruptionDrill = new BurstDrill("eruption-drill"){{ requirements(Category.production, with(Items.silicon, 200, Items.oxide, 20, Items.tungsten, 200, Items.thorium, 120)); - drillTime = 60f * 5.5f; + drillTime = 320f; size = 5; hasPower = true; tier = 7; @@ -2879,12 +2879,12 @@ public class Blocks{ fogRadius = 5; drillMultipliers.put(Items.beryllium, 1.5f); - liquidBoostIntensity = 2.1f; + liquidBoostIntensity = 2f; //TODO different requirements consumePower(6f); consumeLiquid(Liquids.hydrogen, 4f / 60f); - consumeLiquid(Liquids.cyanogen, 0.64f / 60f).boost(); + consumeLiquid(Liquids.cyanogen, 1.5f / 60f).boost(); }}; //endregion From bfbd11b11f81ddbd75bcddb8c6cc17412b5ee108 Mon Sep 17 00:00:00 2001 From: Shade Date: Fri, 9 Feb 2024 23:40:47 +0800 Subject: [PATCH 013/460] Forgot This nitro beryl impact can now match lpd if at full ore coverage --- core/src/mindustry/content/Blocks.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/src/mindustry/content/Blocks.java b/core/src/mindustry/content/Blocks.java index 9b1265b9d6..128fa1b814 100644 --- a/core/src/mindustry/content/Blocks.java +++ b/core/src/mindustry/content/Blocks.java @@ -2847,7 +2847,7 @@ public class Blocks{ blockedItem = Items.thorium; researchCostMultiplier = 0.5f; - drillMultipliers.put(Items.beryllium, 1.3f); + drillMultipliers.put(Items.beryllium, 1.5f); liquidBoostIntensity = 2.25f; fogRadius = 4; From 4cdd0b9646b6c678c6f70fdcf9e5cb4334e09953 Mon Sep 17 00:00:00 2001 From: way-zer Date: Wed, 14 Feb 2024 14:36:27 +0800 Subject: [PATCH 014/460] Extend logic `read` and `write`,support targeting `LogicBuild` --- core/src/mindustry/logic/LExecutor.java | 62 +++++++++++++++++++------ 1 file changed, 48 insertions(+), 14 deletions(-) diff --git a/core/src/mindustry/logic/LExecutor.java b/core/src/mindustry/logic/LExecutor.java index 2e87d6c84b..926b8141f4 100644 --- a/core/src/mindustry/logic/LExecutor.java +++ b/core/src/mindustry/logic/LExecutor.java @@ -60,6 +60,8 @@ public class LExecutor{ //yes, this is a minor memory leak, but it's probably not significant enough to matter protected IntFloatMap unitTimeouts = new IntFloatMap(); + //lookup variable by name, lazy init. + protected ObjectIntMap nameMap; boolean timeoutDone(Unit unit, float delay){ return Time.time >= unitTimeouts.get(unit.id) + delay; @@ -123,6 +125,16 @@ public class LExecutor{ return index < 0 ? logicVars.get(-index) : vars[index]; } + public @Nullable Var optionalVar(String name){ + if(nameMap == null){ + nameMap = new ObjectIntMap<>(); + for(int i = 0; i < vars.length; i++){ + nameMap.put(vars[i].name, i); + } + } + return optionalVar(nameMap.get(name, -1)); + } + /** @return a Var from this processor, never a global constant. May be null if out of bounds. */ public @Nullable Var optionalVar(int index){ return index < 0 || index >= vars.length ? null : vars[index]; @@ -133,6 +145,13 @@ public class LExecutor{ return var(index).isobj && o instanceof Building building ? building : null; } + public @Nullable Building accissibleBuilding(int index){ + Building res = building(index); + if(res == null || privileged) return res; + if(res.block.privileged || res.team != team) return null; + return res; + } + public @Nullable Object obj(int index){ Object o = var(index).objval; return var(index).isobj ? o : null; @@ -331,8 +350,8 @@ public class LExecutor{ cache.found = false; exec.setnum(outFound, 0); } - - if(res != null && res.build != null && + + if(res != null && res.build != null && (unit.within(res.build.x, res.build.y, Math.max(unit.range(), buildingRange)) || res.build.team == exec.team)){ cache.build = res.build; exec.setobj(outBuild, res.build); @@ -660,12 +679,18 @@ public class LExecutor{ @Override public void run(LExecutor exec){ - int address = exec.numi(position); - Building from = exec.building(target); - - if(from instanceof MemoryBuild mem && (exec.privileged || from.team == exec.team)){ - + Building from = exec.accissibleBuilding(target); + if(from instanceof MemoryBuild mem){ + int address = exec.numi(position); exec.setnum(output, address < 0 || address >= mem.memory.length ? 0 : mem.memory[address]); + }else if(from instanceof LogicBuild logic && exec.obj(position) instanceof String name){ + Var fromVar = logic.executor.optionalVar(name); + Var toVar = exec.var(output); + if(fromVar != null && !toVar.constant){ + toVar.objval = fromVar.objval; + toVar.numval = fromVar.numval; + toVar.isobj = fromVar.isobj; + } } } } @@ -684,11 +709,20 @@ public class LExecutor{ @Override public void run(LExecutor exec){ - int address = exec.numi(position); - Building from = exec.building(target); - - if(from instanceof MemoryBuild mem && (exec.privileged || from.team == exec.team) && address >= 0 && address < mem.memory.length){ - mem.memory[address] = exec.num(value); + Building from = exec.accissibleBuilding(target); + if(from instanceof MemoryBuild mem){ + int address = exec.numi(position); + if(address >= 0 && address < mem.memory.length){ + mem.memory[address] = exec.num(value); + } + }else if(from instanceof LogicBuild logic && exec.obj(position) instanceof String name){ + Var toVar = logic.executor.optionalVar(name); + Var fromVar = exec.var(value); + if(toVar != null && !toVar.constant){ + toVar.objval = fromVar.objval; + toVar.numval = fromVar.numval; + toVar.isobj = fromVar.isobj; + } } } } @@ -989,7 +1023,7 @@ public class LExecutor{ //graphics on headless servers are useless. if(Vars.headless) return; - if(exec.building(target) instanceof LogicDisplayBuild d && (d.team == exec.team || exec.privileged)){ + if(exec.accissibleBuilding(target) instanceof LogicDisplayBuild d){ if(d.commands.size + exec.graphicsBuffer.size < maxDisplayBuffer){ for(int i = 0; i < exec.graphicsBuffer.size; i++){ d.commands.addLast(exec.graphicsBuffer.items[i]); @@ -1058,7 +1092,7 @@ public class LExecutor{ @Override public void run(LExecutor exec){ - if(exec.building(target) instanceof MessageBuild d && (d.team == exec.team || exec.privileged)){ + if(exec.accissibleBuilding(target) instanceof MessageBuild d){ d.message.setLength(0); d.message.append(exec.textBuffer, 0, Math.min(exec.textBuffer.length(), maxTextBuffer)); From 95817a955cf6f855556b28f2352ea32e5273e1a0 Mon Sep 17 00:00:00 2001 From: way-zer Date: Wed, 14 Feb 2024 14:36:27 +0800 Subject: [PATCH 015/460] amend --- core/src/mindustry/logic/LExecutor.java | 1 + 1 file changed, 1 insertion(+) diff --git a/core/src/mindustry/logic/LExecutor.java b/core/src/mindustry/logic/LExecutor.java index 62a84d85ab..56699d266f 100644 --- a/core/src/mindustry/logic/LExecutor.java +++ b/core/src/mindustry/logic/LExecutor.java @@ -97,6 +97,7 @@ public class LExecutor{ /** Loads with a specified assembler. Resets all variables. */ public void load(LAssembler builder){ + nameMap = null; vars = new Var[builder.vars.size]; instructions = builder.instructions; iptIndex = -1; From 33faade4265951785435c8ba670c5d89d702fe07 Mon Sep 17 00:00:00 2001 From: way-zer Date: Wed, 14 Feb 2024 16:57:17 +0800 Subject: [PATCH 016/460] typo --- core/src/mindustry/logic/LExecutor.java | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/core/src/mindustry/logic/LExecutor.java b/core/src/mindustry/logic/LExecutor.java index 56699d266f..5be0b9e555 100644 --- a/core/src/mindustry/logic/LExecutor.java +++ b/core/src/mindustry/logic/LExecutor.java @@ -154,7 +154,7 @@ public class LExecutor{ return var(index).isobj && o instanceof Building building ? building : null; } - public @Nullable Building accissibleBuilding(int index){ + public @Nullable Building accessibleBuilding(int index){ Building res = building(index); if(res == null || privileged) return res; if(res.block.privileged || res.team != team) return null; @@ -699,7 +699,7 @@ public class LExecutor{ @Override public void run(LExecutor exec){ - Building from = exec.accissibleBuilding(target); + Building from = exec.accessibleBuilding(target); if(from instanceof MemoryBuild mem){ int address = exec.numi(position); exec.setnum(output, address < 0 || address >= mem.memory.length ? 0 : mem.memory[address]); @@ -729,7 +729,7 @@ public class LExecutor{ @Override public void run(LExecutor exec){ - Building from = exec.accissibleBuilding(target); + Building from = exec.accessibleBuilding(target); if(from instanceof MemoryBuild mem){ int address = exec.numi(position); if(address >= 0 && address < mem.memory.length){ @@ -1095,7 +1095,7 @@ public class LExecutor{ //graphics on headless servers are useless. if(Vars.headless) return; - if(exec.accissibleBuilding(target) instanceof LogicDisplayBuild d){ + if(exec.accessibleBuilding(target) instanceof LogicDisplayBuild d){ if(d.commands.size + exec.graphicsBuffer.size < maxDisplayBuffer){ for(int i = 0; i < exec.graphicsBuffer.size; i++){ d.commands.addLast(exec.graphicsBuffer.items[i]); @@ -1213,7 +1213,7 @@ public class LExecutor{ @Override public void run(LExecutor exec){ - if(exec.accissibleBuilding(target) instanceof MessageBuild d){ + if(exec.accessibleBuilding(target) instanceof MessageBuild d){ d.message.setLength(0); d.message.append(exec.textBuffer, 0, Math.min(exec.textBuffer.length(), maxTextBuffer)); From 08ad8ad7de00ec064fbf4775a0b5389b4a042b33 Mon Sep 17 00:00:00 2001 From: way-zer Date: Sun, 18 Feb 2024 17:45:18 +0800 Subject: [PATCH 017/460] limit `write` with `@writable` --- core/src/mindustry/logic/LExecutor.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/core/src/mindustry/logic/LExecutor.java b/core/src/mindustry/logic/LExecutor.java index 5be0b9e555..d2ea9c6cf9 100644 --- a/core/src/mindustry/logic/LExecutor.java +++ b/core/src/mindustry/logic/LExecutor.java @@ -736,6 +736,8 @@ public class LExecutor{ mem.memory[address] = exec.num(value); } }else if(from instanceof LogicBuild logic && exec.obj(position) instanceof String name){ + Var writable = logic.executor.optionalVar("@writable"); + if(writable == null || (writable.isobj ? writable.objval == null : Math.abs(writable.numval) < 0.00001)) return; Var toVar = logic.executor.optionalVar(name); Var fromVar = exec.var(value); if(toVar != null && !toVar.constant){ From 69c3e368c3806b36ea9ef65b95abf23c5b35b4ad Mon Sep 17 00:00:00 2001 From: Shade Date: Tue, 27 Feb 2024 22:51:40 +0800 Subject: [PATCH 018/460] Final Stats for Attempt#2 nitro -> ozone and base eruption buff (which causes knock on effects as shown) --- core/src/mindustry/content/Blocks.java | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/core/src/mindustry/content/Blocks.java b/core/src/mindustry/content/Blocks.java index 128fa1b814..e561767aff 100644 --- a/core/src/mindustry/content/Blocks.java +++ b/core/src/mindustry/content/Blocks.java @@ -2847,19 +2847,19 @@ public class Blocks{ blockedItem = Items.thorium; researchCostMultiplier = 0.5f; - drillMultipliers.put(Items.beryllium, 1.5f); - liquidBoostIntensity = 2.25f; + drillMultipliers.put(Items.beryllium, 1.95f); + liquidBoostIntensity = 1.75f; fogRadius = 4; consumePower(160f / 60f); - consumeLiquid(Liquids.water, 0.2f); - consumeLiquid(Liquids.nitrogen, 2f / 60f).boost(); + consumeLiquid(Liquids.water, 10f / 60f); + consumeLiquid(Liquids.ozone, 3f / 60f).boost(); }}; eruptionDrill = new BurstDrill("eruption-drill"){{ requirements(Category.production, with(Items.silicon, 200, Items.oxide, 20, Items.tungsten, 200, Items.thorium, 120)); - drillTime = 320f; + drillTime = 3000f / 11f; size = 5; hasPower = true; tier = 7; @@ -2871,14 +2871,14 @@ public class Blocks{ Fx.mineImpactWave.wrap(Liquids.hydrogen.color, 45f) ); shake = 4f; - itemCapacity = 50; + itemCapacity = 60; arrowOffset = 2f; arrowSpacing = 5f; arrows = 2; glowColor.a = 0.6f; fogRadius = 5; - drillMultipliers.put(Items.beryllium, 1.5f); + drillMultipliers.put(Items.beryllium, 1.35f); liquidBoostIntensity = 2f; //TODO different requirements From edd235774c17ff359e2ee5a0a39bb976d80a852c Mon Sep 17 00:00:00 2001 From: Shade Date: Sat, 2 Mar 2024 23:47:00 +0800 Subject: [PATCH 019/460] Nerfed Eruption Drill Speed (5.5 i/s -> 5.33 i/s) --- core/src/mindustry/content/Blocks.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/src/mindustry/content/Blocks.java b/core/src/mindustry/content/Blocks.java index e561767aff..7ce7e26741 100644 --- a/core/src/mindustry/content/Blocks.java +++ b/core/src/mindustry/content/Blocks.java @@ -2859,7 +2859,7 @@ public class Blocks{ eruptionDrill = new BurstDrill("eruption-drill"){{ requirements(Category.production, with(Items.silicon, 200, Items.oxide, 20, Items.tungsten, 200, Items.thorium, 120)); - drillTime = 3000f / 11f; + drillTime = 281.25f; size = 5; hasPower = true; tier = 7; From 65156e440953297b1bc9a41a4a0c5ef12bf85b73 Mon Sep 17 00:00:00 2001 From: Shade Date: Mon, 4 Mar 2024 22:39:08 +0800 Subject: [PATCH 020/460] Cyano Boost Requirement Nerfed 1.5 -> 3 cyano/s I knew it felt too high, this should be better by a long shot --- core/src/mindustry/content/Blocks.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/src/mindustry/content/Blocks.java b/core/src/mindustry/content/Blocks.java index 7ce7e26741..1463c0be0f 100644 --- a/core/src/mindustry/content/Blocks.java +++ b/core/src/mindustry/content/Blocks.java @@ -2884,7 +2884,7 @@ public class Blocks{ //TODO different requirements consumePower(6f); consumeLiquid(Liquids.hydrogen, 4f / 60f); - consumeLiquid(Liquids.cyanogen, 1.5f / 60f).boost(); + consumeLiquid(Liquids.cyanogen, 3f / 60f).boost(); }}; //endregion From 3e682859402e272785cf1698923ba4475841d334 Mon Sep 17 00:00:00 2001 From: MEEPofFaith <54301439+MEEPofFaith@users.noreply.github.com> Date: Sun, 10 Mar 2024 12:47:30 -0700 Subject: [PATCH 021/460] Better display for efficiency multiplier consumes --- core/assets/bundles/bundle.properties | 1 + .../world/consumers/ConsumeItemCharged.java | 6 +++ .../world/consumers/ConsumeItemExplosive.java | 6 +++ .../world/consumers/ConsumeItemFlammable.java | 6 +++ .../consumers/ConsumeItemRadioactive.java | 6 +++ .../consumers/ConsumeLiquidFlammable.java | 6 +++ core/src/mindustry/world/meta/StatValues.java | 38 ++++++++++++++++++- 7 files changed, 68 insertions(+), 1 deletion(-) diff --git a/core/assets/bundles/bundle.properties b/core/assets/bundles/bundle.properties index e9805b2eb0..314251af28 100644 --- a/core/assets/bundles/bundle.properties +++ b/core/assets/bundles/bundle.properties @@ -996,6 +996,7 @@ stat.buildspeedmultiplier = Build Speed Multiplier stat.reactive = Reacts stat.immunities = Immunities stat.healing = Healing +stat.efficiency = [accent]{0}% Efficiency ability.forcefield = Force Field ability.repairfield = Repair Field diff --git a/core/src/mindustry/world/consumers/ConsumeItemCharged.java b/core/src/mindustry/world/consumers/ConsumeItemCharged.java index 20d6a00769..f466ec4b28 100644 --- a/core/src/mindustry/world/consumers/ConsumeItemCharged.java +++ b/core/src/mindustry/world/consumers/ConsumeItemCharged.java @@ -1,6 +1,7 @@ package mindustry.world.consumers; import mindustry.gen.*; +import mindustry.world.meta.*; /** For mods. I don't use this (yet). */ public class ConsumeItemCharged extends ConsumeItemFilter{ @@ -20,4 +21,9 @@ public class ConsumeItemCharged extends ConsumeItemFilter{ var item = getConsumed(build); return item == null ? 0f : item.charge; } + + @Override + public void display(Stats stats){ + stats.add(booster ? Stat.booster : Stat.input, StatValues.itemEffMultiplier(i -> i.charge, filter)); + } } diff --git a/core/src/mindustry/world/consumers/ConsumeItemExplosive.java b/core/src/mindustry/world/consumers/ConsumeItemExplosive.java index 0bed91970b..776008542c 100644 --- a/core/src/mindustry/world/consumers/ConsumeItemExplosive.java +++ b/core/src/mindustry/world/consumers/ConsumeItemExplosive.java @@ -1,6 +1,7 @@ package mindustry.world.consumers; import mindustry.gen.*; +import mindustry.world.meta.*; public class ConsumeItemExplosive extends ConsumeItemFilter{ public float minExplosiveness; @@ -19,4 +20,9 @@ public class ConsumeItemExplosive extends ConsumeItemFilter{ var item = getConsumed(build); return item == null ? 0f : item.explosiveness; } + + @Override + public void display(Stats stats){ + stats.add(booster ? Stat.booster : Stat.input, StatValues.itemEffMultiplier(i -> i.explosiveness, filter)); + } } diff --git a/core/src/mindustry/world/consumers/ConsumeItemFlammable.java b/core/src/mindustry/world/consumers/ConsumeItemFlammable.java index 34b5a74b02..1515cf010a 100644 --- a/core/src/mindustry/world/consumers/ConsumeItemFlammable.java +++ b/core/src/mindustry/world/consumers/ConsumeItemFlammable.java @@ -1,6 +1,7 @@ package mindustry.world.consumers; import mindustry.gen.*; +import mindustry.world.meta.*; public class ConsumeItemFlammable extends ConsumeItemFilter{ public float minFlammability; @@ -19,4 +20,9 @@ public class ConsumeItemFlammable extends ConsumeItemFilter{ var item = getConsumed(build); return item == null ? 0f : item.flammability; } + + @Override + public void display(Stats stats){ + stats.add(booster ? Stat.booster : Stat.input, StatValues.itemEffMultiplier(i -> i.flammability, filter)); + } } diff --git a/core/src/mindustry/world/consumers/ConsumeItemRadioactive.java b/core/src/mindustry/world/consumers/ConsumeItemRadioactive.java index b4beca53b2..03583d747a 100644 --- a/core/src/mindustry/world/consumers/ConsumeItemRadioactive.java +++ b/core/src/mindustry/world/consumers/ConsumeItemRadioactive.java @@ -1,6 +1,7 @@ package mindustry.world.consumers; import mindustry.gen.*; +import mindustry.world.meta.*; public class ConsumeItemRadioactive extends ConsumeItemFilter{ public float minRadioactivity; @@ -19,4 +20,9 @@ public class ConsumeItemRadioactive extends ConsumeItemFilter{ var item = getConsumed(build); return item == null ? 0f : item.radioactivity; } + + @Override + public void display(Stats stats){ + stats.add(booster ? Stat.booster : Stat.input, StatValues.itemEffMultiplier(i -> i.radioactivity, filter)); + } } diff --git a/core/src/mindustry/world/consumers/ConsumeLiquidFlammable.java b/core/src/mindustry/world/consumers/ConsumeLiquidFlammable.java index be39903154..63ca76cdb3 100644 --- a/core/src/mindustry/world/consumers/ConsumeLiquidFlammable.java +++ b/core/src/mindustry/world/consumers/ConsumeLiquidFlammable.java @@ -1,6 +1,7 @@ package mindustry.world.consumers; import mindustry.gen.*; +import mindustry.world.meta.*; public class ConsumeLiquidFlammable extends ConsumeLiquidFilter{ public float minFlammability; @@ -24,4 +25,9 @@ public class ConsumeLiquidFlammable extends ConsumeLiquidFilter{ var liq = getConsumed(build); return liq == null ? 0f : liq.flammability; } + + @Override + public void display(Stats stats){ + stats.add(booster ? Stat.booster : Stat.input, StatValues.liquidEffMultiplier(l -> l.flammability, filter)); + } } diff --git a/core/src/mindustry/world/meta/StatValues.java b/core/src/mindustry/world/meta/StatValues.java index 36872d3546..b135b14bc1 100644 --- a/core/src/mindustry/world/meta/StatValues.java +++ b/core/src/mindustry/world/meta/StatValues.java @@ -292,6 +292,42 @@ public class StatValues{ }; } + public static StatValue itemEffMultiplier(Floatf efficiency, Boolf filter){ + return table -> { + table.row(); + table.table(c -> { + for(Item item : content.items()){ + if(!filter.get(item)) continue; + + c.table(Styles.grayPanel, b -> { + b.image(item.uiIcon).size(40).pad(10f).left().scaling(Scaling.fit); + b.add(item.localizedName).left().grow(); + b.add(Core.bundle.format("stat.efficiency", fixValue(efficiency.get(item) * 100f))).right().pad(10f).padRight(15f); + }).growX().pad(5).row(); + } + }).growX().colspan(table.getColumns()); + table.row(); + }; + } + + public static StatValue liquidEffMultiplier(Floatf efficiency, Boolf filter){ + return table -> { + table.row(); + table.table(c -> { + for(Liquid liquid : content.liquids()){ + if(!filter.get(liquid)) continue; + + c.table(Styles.grayPanel, b -> { + b.image(liquid.uiIcon).size(40).pad(10f).left().scaling(Scaling.fit); + b.add(liquid.localizedName).left().grow(); + b.add(Core.bundle.format("stat.efficiency", fixValue(efficiency.get(liquid) * 100f))).right().pad(10f).padRight(15f); + }).growX().pad(5).row(); + } + }).growX().colspan(table.getColumns()); + table.row(); + }; + } + public static StatValue speedBoosters(String unit, float amount, float speed, boolean strength, Boolf filter){ return table -> { table.row(); @@ -554,4 +590,4 @@ public class StatValues{ private static TextureRegion icon(UnlockableContent t){ return t.uiIcon; } -} \ No newline at end of file +} From 8e0d3fee67984f7ab3d6eb67e9b843d1b91df863 Mon Sep 17 00:00:00 2001 From: MEEPofFaith <54301439+MEEPofFaith@users.noreply.github.com> Date: Sun, 10 Mar 2024 13:01:52 -0700 Subject: [PATCH 022/460] Allow for simultaneously having both item and liquid efficiency multipliers --- .../mindustry/world/blocks/power/ConsumeGenerator.java | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/core/src/mindustry/world/blocks/power/ConsumeGenerator.java b/core/src/mindustry/world/blocks/power/ConsumeGenerator.java index a3b29b4cfd..1347a2141e 100644 --- a/core/src/mindustry/world/blocks/power/ConsumeGenerator.java +++ b/core/src/mindustry/world/blocks/power/ConsumeGenerator.java @@ -80,12 +80,14 @@ public class ConsumeGenerator extends PowerGenerator{ @Override public void updateEfficiencyMultiplier(){ + efficiencyMultiplier = 1f; if(filterItem != null){ float m = filterItem.efficiencyMultiplier(this); - if(m > 0) efficiencyMultiplier = m; - }else if(filterLiquid != null){ + if(m > 0) efficiencyMultiplier *= m; + } + if(filterLiquid != null){ float m = filterLiquid.efficiencyMultiplier(this); - if(m > 0) efficiencyMultiplier = m; + if(m > 0) efficiencyMultiplier *= m; } } From afddb274f6aa44183a9cb34e9db174bec2a9cfca Mon Sep 17 00:00:00 2001 From: MEEPofFaith <54301439+MEEPofFaith@users.noreply.github.com> Date: Sun, 10 Mar 2024 13:06:56 -0700 Subject: [PATCH 023/460] Don't display locked or hidden items --- core/src/mindustry/world/meta/StatValues.java | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/core/src/mindustry/world/meta/StatValues.java b/core/src/mindustry/world/meta/StatValues.java index b135b14bc1..045ecac88e 100644 --- a/core/src/mindustry/world/meta/StatValues.java +++ b/core/src/mindustry/world/meta/StatValues.java @@ -296,9 +296,7 @@ public class StatValues{ return table -> { table.row(); table.table(c -> { - for(Item item : content.items()){ - if(!filter.get(item)) continue; - + for(Item item : content.items().select(i -> filter.get(i) && i.unlockedNow() && !i.isHidden())){ c.table(Styles.grayPanel, b -> { b.image(item.uiIcon).size(40).pad(10f).left().scaling(Scaling.fit); b.add(item.localizedName).left().grow(); @@ -314,9 +312,7 @@ public class StatValues{ return table -> { table.row(); table.table(c -> { - for(Liquid liquid : content.liquids()){ - if(!filter.get(liquid)) continue; - + for(Liquid liquid : content.liquids().select(l -> filter.get(l) && l.unlockedNow() && !l.isHidden())){ c.table(Styles.grayPanel, b -> { b.image(liquid.uiIcon).size(40).pad(10f).left().scaling(Scaling.fit); b.add(liquid.localizedName).left().grow(); From 24b845e8b1bdabd07fb991b07aa3e0dc3ae4cf24 Mon Sep 17 00:00:00 2001 From: MEEPofFaith <54301439+MEEPofFaith@users.noreply.github.com> Date: Fri, 15 Mar 2024 09:25:10 -0700 Subject: [PATCH 024/460] Notice of explosiveness I feel like my changes are getting a *bit* intrusive. --- core/assets/bundles/bundle.properties | 3 ++- .../world/blocks/power/ConsumeGenerator.java | 8 ++++++++ .../world/consumers/ConsumeItemCharged.java | 12 ++++++------ .../world/consumers/ConsumeItemExplosive.java | 12 ++++++------ .../world/consumers/ConsumeItemFilter.java | 10 ++++++++++ .../world/consumers/ConsumeItemFlammable.java | 12 ++++++------ .../world/consumers/ConsumeItemRadioactive.java | 12 ++++++------ core/src/mindustry/world/meta/StatValues.java | 15 +++++++++++++-- 8 files changed, 57 insertions(+), 27 deletions(-) diff --git a/core/assets/bundles/bundle.properties b/core/assets/bundles/bundle.properties index 3f28157541..43ae441a01 100644 --- a/core/assets/bundles/bundle.properties +++ b/core/assets/bundles/bundle.properties @@ -996,7 +996,8 @@ stat.buildspeedmultiplier = Build Speed Multiplier stat.reactive = Reacts stat.immunities = Immunities stat.healing = Healing -stat.efficiency = [accent]{0}% Efficiency +stat.efficiency = [stat]{0}% Efficiency +stat.explosive = [negstat]Explosive ability.forcefield = Force Field ability.repairfield = Repair Field diff --git a/core/src/mindustry/world/blocks/power/ConsumeGenerator.java b/core/src/mindustry/world/blocks/power/ConsumeGenerator.java index 1347a2141e..5b52cc3d16 100644 --- a/core/src/mindustry/world/blocks/power/ConsumeGenerator.java +++ b/core/src/mindustry/world/blocks/power/ConsumeGenerator.java @@ -73,6 +73,14 @@ public class ConsumeGenerator extends PowerGenerator{ if(outputLiquid != null){ stats.add(Stat.output, StatValues.liquid(outputLiquid.liquid, outputLiquid.amount * 60f, true)); } + + if(filterItem != null){ + ConsumeItemExplode explode = findConsumer(c -> c instanceof ConsumeItemExplode); + if(explode != null){ + stats.remove(Stat.input); + stats.add(Stat.input, StatValues.itemEffMultiplier(i -> filterItem.itemEfficiencyMultiplier(i), filterItem.filter, explode.filter)); + } + } } public class ConsumeGeneratorBuild extends GeneratorBuild{ diff --git a/core/src/mindustry/world/consumers/ConsumeItemCharged.java b/core/src/mindustry/world/consumers/ConsumeItemCharged.java index f466ec4b28..3139143024 100644 --- a/core/src/mindustry/world/consumers/ConsumeItemCharged.java +++ b/core/src/mindustry/world/consumers/ConsumeItemCharged.java @@ -1,6 +1,7 @@ package mindustry.world.consumers; import mindustry.gen.*; +import mindustry.type.*; import mindustry.world.meta.*; /** For mods. I don't use this (yet). */ @@ -16,14 +17,13 @@ public class ConsumeItemCharged extends ConsumeItemFilter{ this(0.2f); } - @Override - public float efficiencyMultiplier(Building build){ - var item = getConsumed(build); - return item == null ? 0f : item.charge; - } - @Override public void display(Stats stats){ stats.add(booster ? Stat.booster : Stat.input, StatValues.itemEffMultiplier(i -> i.charge, filter)); } + + @Override + public float itemEfficiencyMultiplier(Item item){ + return item.charge; + } } diff --git a/core/src/mindustry/world/consumers/ConsumeItemExplosive.java b/core/src/mindustry/world/consumers/ConsumeItemExplosive.java index 776008542c..e0801c1c7a 100644 --- a/core/src/mindustry/world/consumers/ConsumeItemExplosive.java +++ b/core/src/mindustry/world/consumers/ConsumeItemExplosive.java @@ -1,6 +1,7 @@ package mindustry.world.consumers; import mindustry.gen.*; +import mindustry.type.*; import mindustry.world.meta.*; public class ConsumeItemExplosive extends ConsumeItemFilter{ @@ -15,14 +16,13 @@ public class ConsumeItemExplosive extends ConsumeItemFilter{ this(0.2f); } - @Override - public float efficiencyMultiplier(Building build){ - var item = getConsumed(build); - return item == null ? 0f : item.explosiveness; - } - @Override public void display(Stats stats){ stats.add(booster ? Stat.booster : Stat.input, StatValues.itemEffMultiplier(i -> i.explosiveness, filter)); } + + @Override + public float itemEfficiencyMultiplier(Item item){ + return item.explosiveness; + } } diff --git a/core/src/mindustry/world/consumers/ConsumeItemFilter.java b/core/src/mindustry/world/consumers/ConsumeItemFilter.java index 8993bd59e1..422a23752d 100644 --- a/core/src/mindustry/world/consumers/ConsumeItemFilter.java +++ b/core/src/mindustry/world/consumers/ConsumeItemFilter.java @@ -68,4 +68,14 @@ public class ConsumeItemFilter extends Consume{ public void display(Stats stats){ stats.add(booster ? Stat.booster : Stat.input, stats.timePeriod < 0 ? StatValues.items(filter) : StatValues.items(stats.timePeriod, filter)); } + + @Override + public float efficiencyMultiplier(Building build){ + var item = getConsumed(build); + return item == null ? 0f : itemEfficiencyMultiplier(item); + } + + public float itemEfficiencyMultiplier(Item item){ + return 1f; + } } diff --git a/core/src/mindustry/world/consumers/ConsumeItemFlammable.java b/core/src/mindustry/world/consumers/ConsumeItemFlammable.java index 1515cf010a..d9d113f809 100644 --- a/core/src/mindustry/world/consumers/ConsumeItemFlammable.java +++ b/core/src/mindustry/world/consumers/ConsumeItemFlammable.java @@ -1,6 +1,7 @@ package mindustry.world.consumers; import mindustry.gen.*; +import mindustry.type.*; import mindustry.world.meta.*; public class ConsumeItemFlammable extends ConsumeItemFilter{ @@ -15,14 +16,13 @@ public class ConsumeItemFlammable extends ConsumeItemFilter{ this(0.2f); } - @Override - public float efficiencyMultiplier(Building build){ - var item = getConsumed(build); - return item == null ? 0f : item.flammability; - } - @Override public void display(Stats stats){ stats.add(booster ? Stat.booster : Stat.input, StatValues.itemEffMultiplier(i -> i.flammability, filter)); } + + @Override + public float itemEfficiencyMultiplier(Item item){ + return item.flammability; + } } diff --git a/core/src/mindustry/world/consumers/ConsumeItemRadioactive.java b/core/src/mindustry/world/consumers/ConsumeItemRadioactive.java index 03583d747a..8d96bfbc83 100644 --- a/core/src/mindustry/world/consumers/ConsumeItemRadioactive.java +++ b/core/src/mindustry/world/consumers/ConsumeItemRadioactive.java @@ -1,6 +1,7 @@ package mindustry.world.consumers; import mindustry.gen.*; +import mindustry.type.*; import mindustry.world.meta.*; public class ConsumeItemRadioactive extends ConsumeItemFilter{ @@ -15,14 +16,13 @@ public class ConsumeItemRadioactive extends ConsumeItemFilter{ this(0.2f); } - @Override - public float efficiencyMultiplier(Building build){ - var item = getConsumed(build); - return item == null ? 0f : item.radioactivity; - } - @Override public void display(Stats stats){ stats.add(booster ? Stat.booster : Stat.input, StatValues.itemEffMultiplier(i -> i.radioactivity, filter)); } + + @Override + public float itemEfficiencyMultiplier(Item item){ + return item.radioactivity; + } } diff --git a/core/src/mindustry/world/meta/StatValues.java b/core/src/mindustry/world/meta/StatValues.java index 045ecac88e..68b1873570 100644 --- a/core/src/mindustry/world/meta/StatValues.java +++ b/core/src/mindustry/world/meta/StatValues.java @@ -292,7 +292,7 @@ public class StatValues{ }; } - public static StatValue itemEffMultiplier(Floatf efficiency, Boolf filter){ + public static StatValue itemEffMultiplier(Floatf efficiency, Boolf filter, Boolf explosive){ return table -> { table.row(); table.table(c -> { @@ -300,7 +300,14 @@ public class StatValues{ c.table(Styles.grayPanel, b -> { b.image(item.uiIcon).size(40).pad(10f).left().scaling(Scaling.fit); b.add(item.localizedName).left().grow(); - b.add(Core.bundle.format("stat.efficiency", fixValue(efficiency.get(item) * 100f))).right().pad(10f).padRight(15f); + b.table(e -> { + e.add(Core.bundle.format("stat.efficiency", fixValue(efficiency.get(item) * 100f))).right().labelAlign(Align.right); + if(explosive.get(item)){ + e.row(); + e.add(Core.bundle.get("stat.explosive")).right().labelAlign(Align.right); + } + }).right().pad(10f).padRight(15f); + }).growX().pad(5).row(); } }).growX().colspan(table.getColumns()); @@ -308,6 +315,10 @@ public class StatValues{ }; } + public static StatValue itemEffMultiplier(Floatf efficiency, Boolf filter){ + return itemEffMultiplier(efficiency, filter, i -> false); + } + public static StatValue liquidEffMultiplier(Floatf efficiency, Boolf filter){ return table -> { table.row(); From e1476abbfdd9a431dafc49dc62a6a2d59f603af7 Mon Sep 17 00:00:00 2001 From: MEEPofFaith <54301439+MEEPofFaith@users.noreply.github.com> Date: Sat, 16 Mar 2024 14:28:44 -0700 Subject: [PATCH 025/460] Remove explosive danger notice Surprise!!!! --- .../mindustry/world/blocks/power/ConsumeGenerator.java | 8 -------- core/src/mindustry/world/meta/StatValues.java | 10 +--------- 2 files changed, 1 insertion(+), 17 deletions(-) diff --git a/core/src/mindustry/world/blocks/power/ConsumeGenerator.java b/core/src/mindustry/world/blocks/power/ConsumeGenerator.java index 5b52cc3d16..1347a2141e 100644 --- a/core/src/mindustry/world/blocks/power/ConsumeGenerator.java +++ b/core/src/mindustry/world/blocks/power/ConsumeGenerator.java @@ -73,14 +73,6 @@ public class ConsumeGenerator extends PowerGenerator{ if(outputLiquid != null){ stats.add(Stat.output, StatValues.liquid(outputLiquid.liquid, outputLiquid.amount * 60f, true)); } - - if(filterItem != null){ - ConsumeItemExplode explode = findConsumer(c -> c instanceof ConsumeItemExplode); - if(explode != null){ - stats.remove(Stat.input); - stats.add(Stat.input, StatValues.itemEffMultiplier(i -> filterItem.itemEfficiencyMultiplier(i), filterItem.filter, explode.filter)); - } - } } public class ConsumeGeneratorBuild extends GeneratorBuild{ diff --git a/core/src/mindustry/world/meta/StatValues.java b/core/src/mindustry/world/meta/StatValues.java index 68b1873570..8880ba0712 100644 --- a/core/src/mindustry/world/meta/StatValues.java +++ b/core/src/mindustry/world/meta/StatValues.java @@ -292,7 +292,7 @@ public class StatValues{ }; } - public static StatValue itemEffMultiplier(Floatf efficiency, Boolf filter, Boolf explosive){ + public static StatValue itemEffMultiplier(Floatf efficiency, Boolf filter){ return table -> { table.row(); table.table(c -> { @@ -302,10 +302,6 @@ public class StatValues{ b.add(item.localizedName).left().grow(); b.table(e -> { e.add(Core.bundle.format("stat.efficiency", fixValue(efficiency.get(item) * 100f))).right().labelAlign(Align.right); - if(explosive.get(item)){ - e.row(); - e.add(Core.bundle.get("stat.explosive")).right().labelAlign(Align.right); - } }).right().pad(10f).padRight(15f); }).growX().pad(5).row(); @@ -315,10 +311,6 @@ public class StatValues{ }; } - public static StatValue itemEffMultiplier(Floatf efficiency, Boolf filter){ - return itemEffMultiplier(efficiency, filter, i -> false); - } - public static StatValue liquidEffMultiplier(Floatf efficiency, Boolf filter){ return table -> { table.row(); From a1b3f54516952ab1c29c4af676302c5f4d93840c Mon Sep 17 00:00:00 2001 From: MEEPofFaith <54301439+MEEPofFaith@users.noreply.github.com> Date: Sat, 16 Mar 2024 15:04:27 -0700 Subject: [PATCH 026/460] Add liquid consumption rates --- .../consumers/ConsumeLiquidFlammable.java | 2 +- core/src/mindustry/world/meta/StatValues.java | 21 ++++++++++++------- 2 files changed, 14 insertions(+), 9 deletions(-) diff --git a/core/src/mindustry/world/consumers/ConsumeLiquidFlammable.java b/core/src/mindustry/world/consumers/ConsumeLiquidFlammable.java index 63ca76cdb3..0ab32aa70a 100644 --- a/core/src/mindustry/world/consumers/ConsumeLiquidFlammable.java +++ b/core/src/mindustry/world/consumers/ConsumeLiquidFlammable.java @@ -28,6 +28,6 @@ public class ConsumeLiquidFlammable extends ConsumeLiquidFilter{ @Override public void display(Stats stats){ - stats.add(booster ? Stat.booster : Stat.input, StatValues.liquidEffMultiplier(l -> l.flammability, filter)); + stats.add(booster ? Stat.booster : Stat.input, StatValues.liquidEffMultiplier(l -> l.flammability, amount * 60f, filter)); } } diff --git a/core/src/mindustry/world/meta/StatValues.java b/core/src/mindustry/world/meta/StatValues.java index 8880ba0712..5ebb83ba34 100644 --- a/core/src/mindustry/world/meta/StatValues.java +++ b/core/src/mindustry/world/meta/StatValues.java @@ -300,10 +300,7 @@ public class StatValues{ c.table(Styles.grayPanel, b -> { b.image(item.uiIcon).size(40).pad(10f).left().scaling(Scaling.fit); b.add(item.localizedName).left().grow(); - b.table(e -> { - e.add(Core.bundle.format("stat.efficiency", fixValue(efficiency.get(item) * 100f))).right().labelAlign(Align.right); - }).right().pad(10f).padRight(15f); - + b.add(Core.bundle.format("stat.efficiency", fixValue(efficiency.get(item) * 100f))).right().pad(10f).padRight(15f); }).growX().pad(5).row(); } }).growX().colspan(table.getColumns()); @@ -311,18 +308,26 @@ public class StatValues{ }; } - public static StatValue liquidEffMultiplier(Floatf efficiency, Boolf filter){ + public static StatValue liquidEffMultiplier(Floatf efficiency, float amount, Boolf filter){ return table -> { table.row(); table.table(c -> { for(Liquid liquid : content.liquids().select(l -> filter.get(l) && l.unlockedNow() && !l.isHidden())){ c.table(Styles.grayPanel, b -> { - b.image(liquid.uiIcon).size(40).pad(10f).left().scaling(Scaling.fit); - b.add(liquid.localizedName).left().grow(); + b.add(new Stack(){{ + Image i = new Image(liquid.uiIcon).setScaling(Scaling.fit); + i.setAlign(Align.left); + add(i); + + Table t = new Table().left().bottom(); + t.add(Strings.autoFixed(amount, 2) + StatUnit.perSecond.localized()).style(Styles.outlineLabel); + add(t); + }}).height(40).pad(10f).padRight(0).left(); + b.add(liquid.localizedName).left().padLeft(6f).grow(); b.add(Core.bundle.format("stat.efficiency", fixValue(efficiency.get(liquid) * 100f))).right().pad(10f).padRight(15f); }).growX().pad(5).row(); } - }).growX().colspan(table.getColumns()); + }).growX().colspan(table.getColumns()).row(); table.row(); }; } From 11dcbe19f40b5054fad739f2ecb48dae4c1a0a01 Mon Sep 17 00:00:00 2001 From: MEEPofFaith <54301439+MEEPofFaith@users.noreply.github.com> Date: Sat, 16 Mar 2024 15:16:15 -0700 Subject: [PATCH 027/460] Better LiquidDisplay --- core/src/mindustry/ui/LiquidDisplay.java | 20 ++++++++++--------- core/src/mindustry/world/meta/StatValues.java | 11 +--------- 2 files changed, 12 insertions(+), 19 deletions(-) diff --git a/core/src/mindustry/ui/LiquidDisplay.java b/core/src/mindustry/ui/LiquidDisplay.java index d0982374ab..84cd9db95f 100644 --- a/core/src/mindustry/ui/LiquidDisplay.java +++ b/core/src/mindustry/ui/LiquidDisplay.java @@ -15,25 +15,27 @@ public class LiquidDisplay extends Table{ public final float amount; public final boolean perSecond; - public LiquidDisplay(Liquid liquid, float amount, boolean perSecond){ + public LiquidDisplay(Liquid liquid, float size, float amount, boolean perSecond){ this.liquid = liquid; this.amount = amount; this.perSecond = perSecond; + left(); add(new Stack(){{ - add(new Image(liquid.uiIcon).setScaling(Scaling.fit)); + Image i = new Image(liquid.uiIcon).setScaling(Scaling.fit); + i.setAlign(Align.left); + add(i); if(amount != 0){ Table t = new Table().left().bottom(); - t.add(Strings.autoFixed(amount, 2)).style(Styles.outlineLabel); + t.add(Strings.autoFixed(amount, 2) + (perSecond ? StatUnit.perSecond.localized() : "")).style(Styles.outlineLabel); add(t); } - }}).size(iconMed).padRight(3 + (amount != 0 && Strings.autoFixed(amount, 2).length() > 2 ? 8 : 0)); + }}).height(size).left(); + add(liquid.localizedName).padLeft(6f).left(); + } - if(perSecond){ - add(StatUnit.perSecond.localized()).padLeft(2).padRight(5).color(Color.lightGray).style(Styles.outlineLabel); - } - - add(liquid.localizedName); + public LiquidDisplay(Liquid liquid, float amount, boolean perSecond){ + this(liquid, iconMed, amount, perSecond); } } diff --git a/core/src/mindustry/world/meta/StatValues.java b/core/src/mindustry/world/meta/StatValues.java index 5ebb83ba34..6017315a44 100644 --- a/core/src/mindustry/world/meta/StatValues.java +++ b/core/src/mindustry/world/meta/StatValues.java @@ -314,16 +314,7 @@ public class StatValues{ table.table(c -> { for(Liquid liquid : content.liquids().select(l -> filter.get(l) && l.unlockedNow() && !l.isHidden())){ c.table(Styles.grayPanel, b -> { - b.add(new Stack(){{ - Image i = new Image(liquid.uiIcon).setScaling(Scaling.fit); - i.setAlign(Align.left); - add(i); - - Table t = new Table().left().bottom(); - t.add(Strings.autoFixed(amount, 2) + StatUnit.perSecond.localized()).style(Styles.outlineLabel); - add(t); - }}).height(40).pad(10f).padRight(0).left(); - b.add(liquid.localizedName).left().padLeft(6f).grow(); + b.add(new LiquidDisplay(liquid, 40f, amount, true)).pad(10f).left().grow(); b.add(Core.bundle.format("stat.efficiency", fixValue(efficiency.get(liquid) * 100f))).right().pad(10f).padRight(15f); }).growX().pad(5).row(); } From 66893e5c85cc2391b221ba0e9b6221bb9836505b Mon Sep 17 00:00:00 2001 From: MEEPofFaith <54301439+MEEPofFaith@users.noreply.github.com> Date: Sat, 16 Mar 2024 15:25:13 -0700 Subject: [PATCH 028/460] Text Style --- core/src/mindustry/ui/LiquidDisplay.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/src/mindustry/ui/LiquidDisplay.java b/core/src/mindustry/ui/LiquidDisplay.java index 84cd9db95f..d05fc14208 100644 --- a/core/src/mindustry/ui/LiquidDisplay.java +++ b/core/src/mindustry/ui/LiquidDisplay.java @@ -32,7 +32,7 @@ public class LiquidDisplay extends Table{ add(t); } }}).height(size).left(); - add(liquid.localizedName).padLeft(6f).left(); + add(liquid.localizedName).left().style(Styles.outlineLabel); } public LiquidDisplay(Liquid liquid, float amount, boolean perSecond){ From 4070a5e1803ab5b238f7db0bbc8d6adfe89f21c0 Mon Sep 17 00:00:00 2001 From: Shade Date: Tue, 19 Mar 2024 19:03:06 +0800 Subject: [PATCH 029/460] Code Cleanup --- core/src/mindustry/world/blocks/production/BurstDrill.java | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/core/src/mindustry/world/blocks/production/BurstDrill.java b/core/src/mindustry/world/blocks/production/BurstDrill.java index c8e92996d8..f38a1ec687 100644 --- a/core/src/mindustry/world/blocks/production/BurstDrill.java +++ b/core/src/mindustry/world/blocks/production/BurstDrill.java @@ -11,12 +11,9 @@ import mindustry.entities.*; import mindustry.gen.*; import mindustry.graphics.*; import mindustry.type.*; -import mindustry.world.blocks.environment.*; import mindustry.world.consumers.*; import mindustry.world.meta.*; -import static mindustry.Vars.*; - public class BurstDrill extends Drill{ public float shake = 2f; public Interp speedCurve = Interp.pow2In; @@ -87,7 +84,7 @@ public class BurstDrill extends Drill{ if(timer(timerDump, dumpTime)){ dump(items.has(dominantItem) ? dominantItem : null); } - + float drillTime = getDrillTime(dominantItem); smoothProgress = Mathf.lerpDelta(smoothProgress, progress / (drillTime - 20f), 0.1f); From c3823b8477beaee9ef112d0fe4640539349daf71 Mon Sep 17 00:00:00 2001 From: MEEPofFaith <54301439+MEEPofFaith@users.noreply.github.com> Date: Tue, 19 Mar 2024 12:22:32 -0700 Subject: [PATCH 030/460] Cleaner liquid display + Display item rate --- core/src/mindustry/ui/LiquidDisplay.java | 6 +++--- core/src/mindustry/world/blocks/power/ConsumeGenerator.java | 1 + 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/core/src/mindustry/ui/LiquidDisplay.java b/core/src/mindustry/ui/LiquidDisplay.java index d05fc14208..28a11c424e 100644 --- a/core/src/mindustry/ui/LiquidDisplay.java +++ b/core/src/mindustry/ui/LiquidDisplay.java @@ -26,13 +26,13 @@ public class LiquidDisplay extends Table{ i.setAlign(Align.left); add(i); - if(amount != 0){ + if(!perSecond && amount != 0){ Table t = new Table().left().bottom(); - t.add(Strings.autoFixed(amount, 2) + (perSecond ? StatUnit.perSecond.localized() : "")).style(Styles.outlineLabel); + t.add(Strings.autoFixed(amount, 2)).style(Styles.outlineLabel); add(t); } }}).height(size).left(); - add(liquid.localizedName).left().style(Styles.outlineLabel); + add(liquid.localizedName + (perSecond && amount != 0 ? "\n[lightgray]" + Strings.autoFixed(amount, 2) + StatUnit.perSecond.localized() : "[]")).left().style(Styles.outlineLabel); } public LiquidDisplay(Liquid liquid, float amount, boolean perSecond){ diff --git a/core/src/mindustry/world/blocks/power/ConsumeGenerator.java b/core/src/mindustry/world/blocks/power/ConsumeGenerator.java index 1347a2141e..49cad2fc7e 100644 --- a/core/src/mindustry/world/blocks/power/ConsumeGenerator.java +++ b/core/src/mindustry/world/blocks/power/ConsumeGenerator.java @@ -64,6 +64,7 @@ public class ConsumeGenerator extends PowerGenerator{ @Override public void setStats(){ + stats.timePeriod = itemDuration; super.setStats(); if(hasItems){ From e40dab9733cf1eaeda14c83ef98f05004414742a Mon Sep 17 00:00:00 2001 From: MEEPofFaith <54301439+MEEPofFaith@users.noreply.github.com> Date: Tue, 19 Mar 2024 18:37:03 -0700 Subject: [PATCH 031/460] Shift the item display over a column instead --- core/src/mindustry/world/meta/StatValues.java | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/core/src/mindustry/world/meta/StatValues.java b/core/src/mindustry/world/meta/StatValues.java index 6017315a44..b5900d206a 100644 --- a/core/src/mindustry/world/meta/StatValues.java +++ b/core/src/mindustry/world/meta/StatValues.java @@ -66,7 +66,7 @@ public class StatValues{ } public static StatValue liquid(Liquid liquid, float amount, boolean perSecond){ - return table -> table.add(new LiquidDisplay(liquid, amount, perSecond)); + return table -> table.add(new LiquidDisplay(liquid, amount, perSecond)).left(); } public static StatValue liquids(Boolf filter, float amount, boolean perSecond){ @@ -295,7 +295,9 @@ public class StatValues{ public static StatValue itemEffMultiplier(Floatf efficiency, Boolf filter){ return table -> { table.row(); + table.add().size(0); table.table(c -> { + c.left(); for(Item item : content.items().select(i -> filter.get(i) && i.unlockedNow() && !i.isHidden())){ c.table(Styles.grayPanel, b -> { b.image(item.uiIcon).size(40).pad(10f).left().scaling(Scaling.fit); @@ -303,23 +305,23 @@ public class StatValues{ b.add(Core.bundle.format("stat.efficiency", fixValue(efficiency.get(item) * 100f))).right().pad(10f).padRight(15f); }).growX().pad(5).row(); } - }).growX().colspan(table.getColumns()); - table.row(); + }).growX().colspan(table.getColumns() - 2).row(); }; } public static StatValue liquidEffMultiplier(Floatf efficiency, float amount, Boolf filter){ return table -> { table.row(); + table.add().size(0); table.table(c -> { + c.left(); for(Liquid liquid : content.liquids().select(l -> filter.get(l) && l.unlockedNow() && !l.isHidden())){ c.table(Styles.grayPanel, b -> { b.add(new LiquidDisplay(liquid, 40f, amount, true)).pad(10f).left().grow(); b.add(Core.bundle.format("stat.efficiency", fixValue(efficiency.get(liquid) * 100f))).right().pad(10f).padRight(15f); }).growX().pad(5).row(); } - }).growX().colspan(table.getColumns()).row(); - table.row(); + }).growX().colspan(table.getColumns() - 2).row(); }; } From 92485bd4e65912cc51d6a4552659aa4cab9954eb Mon Sep 17 00:00:00 2001 From: MEEPofFaith <54301439+MEEPofFaith@users.noreply.github.com> Date: Tue, 19 Mar 2024 18:45:09 -0700 Subject: [PATCH 032/460] Revert "Shift the item display over a column instead" This reverts commit e40dab9733cf1eaeda14c83ef98f05004414742a. --- core/src/mindustry/world/meta/StatValues.java | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/core/src/mindustry/world/meta/StatValues.java b/core/src/mindustry/world/meta/StatValues.java index b5900d206a..f4fd1e5b9b 100644 --- a/core/src/mindustry/world/meta/StatValues.java +++ b/core/src/mindustry/world/meta/StatValues.java @@ -295,9 +295,7 @@ public class StatValues{ public static StatValue itemEffMultiplier(Floatf efficiency, Boolf filter){ return table -> { table.row(); - table.add().size(0); table.table(c -> { - c.left(); for(Item item : content.items().select(i -> filter.get(i) && i.unlockedNow() && !i.isHidden())){ c.table(Styles.grayPanel, b -> { b.image(item.uiIcon).size(40).pad(10f).left().scaling(Scaling.fit); @@ -305,23 +303,21 @@ public class StatValues{ b.add(Core.bundle.format("stat.efficiency", fixValue(efficiency.get(item) * 100f))).right().pad(10f).padRight(15f); }).growX().pad(5).row(); } - }).growX().colspan(table.getColumns() - 2).row(); + }).growX().colspan(table.getColumns()).row(); }; } public static StatValue liquidEffMultiplier(Floatf efficiency, float amount, Boolf filter){ return table -> { table.row(); - table.add().size(0); table.table(c -> { - c.left(); for(Liquid liquid : content.liquids().select(l -> filter.get(l) && l.unlockedNow() && !l.isHidden())){ c.table(Styles.grayPanel, b -> { b.add(new LiquidDisplay(liquid, 40f, amount, true)).pad(10f).left().grow(); b.add(Core.bundle.format("stat.efficiency", fixValue(efficiency.get(liquid) * 100f))).right().pad(10f).padRight(15f); }).growX().pad(5).row(); } - }).growX().colspan(table.getColumns() - 2).row(); + }).growX().colspan(table.getColumns()).row(); }; } From a3a7598e6da99c7ca5dae561f6853e0cbec0fa16 Mon Sep 17 00:00:00 2001 From: MEEPofFaith <54301439+MEEPofFaith@users.noreply.github.com> Date: Mon, 25 Mar 2024 10:48:21 -0700 Subject: [PATCH 033/460] Un-lonely the liquid display --- core/src/mindustry/ui/LiquidDisplay.java | 2 +- core/src/mindustry/ui/dialogs/ContentInfoDialog.java | 1 - core/src/mindustry/world/meta/StatValues.java | 2 ++ 3 files changed, 3 insertions(+), 2 deletions(-) diff --git a/core/src/mindustry/ui/LiquidDisplay.java b/core/src/mindustry/ui/LiquidDisplay.java index 28a11c424e..f49b4e7862 100644 --- a/core/src/mindustry/ui/LiquidDisplay.java +++ b/core/src/mindustry/ui/LiquidDisplay.java @@ -31,7 +31,7 @@ public class LiquidDisplay extends Table{ t.add(Strings.autoFixed(amount, 2)).style(Styles.outlineLabel); add(t); } - }}).height(size).left(); + }}).height(size).minWidth(size).left(); add(liquid.localizedName + (perSecond && amount != 0 ? "\n[lightgray]" + Strings.autoFixed(amount, 2) + StatUnit.perSecond.localized() : "[]")).left().style(Styles.outlineLabel); } diff --git a/core/src/mindustry/ui/dialogs/ContentInfoDialog.java b/core/src/mindustry/ui/dialogs/ContentInfoDialog.java index 8defe26a24..2d305e823a 100644 --- a/core/src/mindustry/ui/dialogs/ContentInfoDialog.java +++ b/core/src/mindustry/ui/dialogs/ContentInfoDialog.java @@ -82,7 +82,6 @@ public class ContentInfoDialog extends BaseDialog{ value.display(inset); inset.add().size(10f); } - }).fillX().padLeft(10); table.row(); } diff --git a/core/src/mindustry/world/meta/StatValues.java b/core/src/mindustry/world/meta/StatValues.java index f4fd1e5b9b..c1046d78ca 100644 --- a/core/src/mindustry/world/meta/StatValues.java +++ b/core/src/mindustry/world/meta/StatValues.java @@ -294,6 +294,7 @@ public class StatValues{ public static StatValue itemEffMultiplier(Floatf efficiency, Boolf filter){ return table -> { + table.getCells().peek().growX(); //Expand the spacer on the row above to push everything to the left table.row(); table.table(c -> { for(Item item : content.items().select(i -> filter.get(i) && i.unlockedNow() && !i.isHidden())){ @@ -309,6 +310,7 @@ public class StatValues{ public static StatValue liquidEffMultiplier(Floatf efficiency, float amount, Boolf filter){ return table -> { + table.getCells().peek().growX(); //Expand the spacer on the row above to push everything to the left table.row(); table.table(c -> { for(Liquid liquid : content.liquids().select(l -> filter.get(l) && l.unlockedNow() && !l.isHidden())){ From faf78b6e7784a228e95afda0b6986683e024caa6 Mon Sep 17 00:00:00 2001 From: MEEPofFaith <54301439+MEEPofFaith@users.noreply.github.com> Date: Mon, 25 Mar 2024 11:00:24 -0700 Subject: [PATCH 034/460] Display item consumption rate --- core/src/mindustry/world/consumers/ConsumeItemCharged.java | 2 +- core/src/mindustry/world/consumers/ConsumeItemExplosive.java | 2 +- core/src/mindustry/world/consumers/ConsumeItemFilter.java | 2 +- core/src/mindustry/world/consumers/ConsumeItemFlammable.java | 2 +- .../src/mindustry/world/consumers/ConsumeItemRadioactive.java | 2 +- core/src/mindustry/world/meta/StatValues.java | 4 ++-- 6 files changed, 7 insertions(+), 7 deletions(-) diff --git a/core/src/mindustry/world/consumers/ConsumeItemCharged.java b/core/src/mindustry/world/consumers/ConsumeItemCharged.java index 3139143024..a06bd71e00 100644 --- a/core/src/mindustry/world/consumers/ConsumeItemCharged.java +++ b/core/src/mindustry/world/consumers/ConsumeItemCharged.java @@ -19,7 +19,7 @@ public class ConsumeItemCharged extends ConsumeItemFilter{ @Override public void display(Stats stats){ - stats.add(booster ? Stat.booster : Stat.input, StatValues.itemEffMultiplier(i -> i.charge, filter)); + stats.add(booster ? Stat.booster : Stat.input, StatValues.itemEffMultiplier(i -> i.charge, stats.timePeriod, filter)); } @Override diff --git a/core/src/mindustry/world/consumers/ConsumeItemExplosive.java b/core/src/mindustry/world/consumers/ConsumeItemExplosive.java index e0801c1c7a..43b807a58b 100644 --- a/core/src/mindustry/world/consumers/ConsumeItemExplosive.java +++ b/core/src/mindustry/world/consumers/ConsumeItemExplosive.java @@ -18,7 +18,7 @@ public class ConsumeItemExplosive extends ConsumeItemFilter{ @Override public void display(Stats stats){ - stats.add(booster ? Stat.booster : Stat.input, StatValues.itemEffMultiplier(i -> i.explosiveness, filter)); + stats.add(booster ? Stat.booster : Stat.input, StatValues.itemEffMultiplier(i -> i.explosiveness, stats.timePeriod, filter)); } @Override diff --git a/core/src/mindustry/world/consumers/ConsumeItemFilter.java b/core/src/mindustry/world/consumers/ConsumeItemFilter.java index 422a23752d..01b630b7c0 100644 --- a/core/src/mindustry/world/consumers/ConsumeItemFilter.java +++ b/core/src/mindustry/world/consumers/ConsumeItemFilter.java @@ -66,7 +66,7 @@ public class ConsumeItemFilter extends Consume{ @Override public void display(Stats stats){ - stats.add(booster ? Stat.booster : Stat.input, stats.timePeriod < 0 ? StatValues.items(filter) : StatValues.items(stats.timePeriod, filter)); + stats.add(booster ? Stat.booster : Stat.input, StatValues.items(stats.timePeriod, filter)); } @Override diff --git a/core/src/mindustry/world/consumers/ConsumeItemFlammable.java b/core/src/mindustry/world/consumers/ConsumeItemFlammable.java index d9d113f809..dcd9432f6c 100644 --- a/core/src/mindustry/world/consumers/ConsumeItemFlammable.java +++ b/core/src/mindustry/world/consumers/ConsumeItemFlammable.java @@ -18,7 +18,7 @@ public class ConsumeItemFlammable extends ConsumeItemFilter{ @Override public void display(Stats stats){ - stats.add(booster ? Stat.booster : Stat.input, StatValues.itemEffMultiplier(i -> i.flammability, filter)); + stats.add(booster ? Stat.booster : Stat.input, StatValues.itemEffMultiplier(i -> i.flammability, stats.timePeriod, filter)); } @Override diff --git a/core/src/mindustry/world/consumers/ConsumeItemRadioactive.java b/core/src/mindustry/world/consumers/ConsumeItemRadioactive.java index 8d96bfbc83..866ccef898 100644 --- a/core/src/mindustry/world/consumers/ConsumeItemRadioactive.java +++ b/core/src/mindustry/world/consumers/ConsumeItemRadioactive.java @@ -18,7 +18,7 @@ public class ConsumeItemRadioactive extends ConsumeItemFilter{ @Override public void display(Stats stats){ - stats.add(booster ? Stat.booster : Stat.input, StatValues.itemEffMultiplier(i -> i.radioactivity, filter)); + stats.add(booster ? Stat.booster : Stat.input, StatValues.itemEffMultiplier(i -> i.radioactivity, stats.timePeriod, filter)); } @Override diff --git a/core/src/mindustry/world/meta/StatValues.java b/core/src/mindustry/world/meta/StatValues.java index c1046d78ca..c34cfb970b 100644 --- a/core/src/mindustry/world/meta/StatValues.java +++ b/core/src/mindustry/world/meta/StatValues.java @@ -292,7 +292,7 @@ public class StatValues{ }; } - public static StatValue itemEffMultiplier(Floatf efficiency, Boolf filter){ + public static StatValue itemEffMultiplier(Floatf efficiency, float timePeriod, Boolf filter){ return table -> { table.getCells().peek().growX(); //Expand the spacer on the row above to push everything to the left table.row(); @@ -300,7 +300,7 @@ public class StatValues{ for(Item item : content.items().select(i -> filter.get(i) && i.unlockedNow() && !i.isHidden())){ c.table(Styles.grayPanel, b -> { b.image(item.uiIcon).size(40).pad(10f).left().scaling(Scaling.fit); - b.add(item.localizedName).left().grow(); + b.add(item.localizedName + (timePeriod > 0 ? "\n[lightgray]" + Strings.autoFixed(1f / (timePeriod / 60f), 2) + StatUnit.perSecond.localized() : "")).left().grow(); b.add(Core.bundle.format("stat.efficiency", fixValue(efficiency.get(item) * 100f))).right().pad(10f).padRight(15f); }).growX().pad(5).row(); } From c8816816340bc2d103467fe282f1783a13106135 Mon Sep 17 00:00:00 2001 From: MEEPofFaith <54301439+MEEPofFaith@users.noreply.github.com> Date: Tue, 26 Mar 2024 00:21:32 -0700 Subject: [PATCH 035/460] Add consumers for other liquid fields Temperature, heat capacity, viscosity, and explosiveness --- .../world/consumers/ConsumeItemCharged.java | 1 - .../world/consumers/ConsumeItemExplosive.java | 1 - .../world/consumers/ConsumeItemFlammable.java | 1 - .../consumers/ConsumeItemRadioactive.java | 1 - .../consumers/ConsumeLiquidExplosive.java | 32 +++++++++++++++++++ .../world/consumers/ConsumeLiquidFilter.java | 12 ++++++- .../consumers/ConsumeLiquidFlammable.java | 13 ++++---- .../consumers/ConsumeLiquidHeatCapacity.java | 32 +++++++++++++++++++ .../consumers/ConsumeLiquidTemperature.java | 32 +++++++++++++++++++ .../consumers/ConsumeLiquidViscosity.java | 32 +++++++++++++++++++ .../consumers/ConsumeLiquidsDynamic.java | 14 ++++---- 11 files changed, 152 insertions(+), 19 deletions(-) create mode 100644 core/src/mindustry/world/consumers/ConsumeLiquidExplosive.java create mode 100644 core/src/mindustry/world/consumers/ConsumeLiquidHeatCapacity.java create mode 100644 core/src/mindustry/world/consumers/ConsumeLiquidTemperature.java create mode 100644 core/src/mindustry/world/consumers/ConsumeLiquidViscosity.java diff --git a/core/src/mindustry/world/consumers/ConsumeItemCharged.java b/core/src/mindustry/world/consumers/ConsumeItemCharged.java index a06bd71e00..91cb01fa6b 100644 --- a/core/src/mindustry/world/consumers/ConsumeItemCharged.java +++ b/core/src/mindustry/world/consumers/ConsumeItemCharged.java @@ -1,6 +1,5 @@ package mindustry.world.consumers; -import mindustry.gen.*; import mindustry.type.*; import mindustry.world.meta.*; diff --git a/core/src/mindustry/world/consumers/ConsumeItemExplosive.java b/core/src/mindustry/world/consumers/ConsumeItemExplosive.java index 43b807a58b..c7ee0840a9 100644 --- a/core/src/mindustry/world/consumers/ConsumeItemExplosive.java +++ b/core/src/mindustry/world/consumers/ConsumeItemExplosive.java @@ -1,6 +1,5 @@ package mindustry.world.consumers; -import mindustry.gen.*; import mindustry.type.*; import mindustry.world.meta.*; diff --git a/core/src/mindustry/world/consumers/ConsumeItemFlammable.java b/core/src/mindustry/world/consumers/ConsumeItemFlammable.java index dcd9432f6c..840d7158a6 100644 --- a/core/src/mindustry/world/consumers/ConsumeItemFlammable.java +++ b/core/src/mindustry/world/consumers/ConsumeItemFlammable.java @@ -1,6 +1,5 @@ package mindustry.world.consumers; -import mindustry.gen.*; import mindustry.type.*; import mindustry.world.meta.*; diff --git a/core/src/mindustry/world/consumers/ConsumeItemRadioactive.java b/core/src/mindustry/world/consumers/ConsumeItemRadioactive.java index 866ccef898..0d0f11f1d6 100644 --- a/core/src/mindustry/world/consumers/ConsumeItemRadioactive.java +++ b/core/src/mindustry/world/consumers/ConsumeItemRadioactive.java @@ -1,6 +1,5 @@ package mindustry.world.consumers; -import mindustry.gen.*; import mindustry.type.*; import mindustry.world.meta.*; diff --git a/core/src/mindustry/world/consumers/ConsumeLiquidExplosive.java b/core/src/mindustry/world/consumers/ConsumeLiquidExplosive.java new file mode 100644 index 0000000000..3134d145ca --- /dev/null +++ b/core/src/mindustry/world/consumers/ConsumeLiquidExplosive.java @@ -0,0 +1,32 @@ +package mindustry.world.consumers; + +import mindustry.type.*; +import mindustry.world.meta.*; + +public class ConsumeLiquidExplosive extends ConsumeLiquidFilter{ + public float minExplosiveness; + + public ConsumeLiquidExplosive(float minExplosiveness, float amount){ + this.amount = amount; + this.minExplosiveness = minExplosiveness; + this.filter = liquid -> liquid.heatCapacity >= this.minExplosiveness; + } + + public ConsumeLiquidExplosive(float amount){ + this(0.2f, amount); + } + + public ConsumeLiquidExplosive(){ + this(0.2f); + } + + @Override + public void display(Stats stats){ + stats.add(booster ? Stat.booster : Stat.input, StatValues.liquidEffMultiplier(l -> l.explosiveness, amount * 60f, filter)); + } + + @Override + public float liquidEfficiencyMultiplier(Liquid liquid){ + return liquid.explosiveness; + } +} diff --git a/core/src/mindustry/world/consumers/ConsumeLiquidFilter.java b/core/src/mindustry/world/consumers/ConsumeLiquidFilter.java index 7dbaab7043..fd55d6c597 100644 --- a/core/src/mindustry/world/consumers/ConsumeLiquidFilter.java +++ b/core/src/mindustry/world/consumers/ConsumeLiquidFilter.java @@ -53,7 +53,13 @@ public class ConsumeLiquidFilter extends ConsumeLiquidBase{ if(ed <= 0.00000001f) return 0f; return liq != null ? Math.min(build.liquids.get(liq) / (amount * ed * multiplier.get(build)), 1f) : 0f; } - + + @Override + public float efficiencyMultiplier(Building build){ + var liq = getConsumed(build); + return liq == null ? 0 : liquidEfficiencyMultiplier(liq); + } + public @Nullable Liquid getConsumed(Building build){ if(filter.get(build.liquids.current()) && build.liquids.currentAmount() > 0){ return build.liquids.current(); @@ -74,4 +80,8 @@ public class ConsumeLiquidFilter extends ConsumeLiquidBase{ public void display(Stats stats){ stats.add(booster ? Stat.booster : Stat.input, StatValues.liquids(filter, amount * 60f, true)); } + + public float liquidEfficiencyMultiplier(Liquid liquid){ + return 1f; + } } diff --git a/core/src/mindustry/world/consumers/ConsumeLiquidFlammable.java b/core/src/mindustry/world/consumers/ConsumeLiquidFlammable.java index 0ab32aa70a..df2826b0e7 100644 --- a/core/src/mindustry/world/consumers/ConsumeLiquidFlammable.java +++ b/core/src/mindustry/world/consumers/ConsumeLiquidFlammable.java @@ -1,6 +1,6 @@ package mindustry.world.consumers; -import mindustry.gen.*; +import mindustry.type.*; import mindustry.world.meta.*; public class ConsumeLiquidFlammable extends ConsumeLiquidFilter{ @@ -20,14 +20,13 @@ public class ConsumeLiquidFlammable extends ConsumeLiquidFilter{ this(0.2f); } - @Override - public float efficiencyMultiplier(Building build){ - var liq = getConsumed(build); - return liq == null ? 0f : liq.flammability; - } - @Override public void display(Stats stats){ stats.add(booster ? Stat.booster : Stat.input, StatValues.liquidEffMultiplier(l -> l.flammability, amount * 60f, filter)); } + + @Override + public float liquidEfficiencyMultiplier(Liquid liquid){ + return liquid.flammability; + } } diff --git a/core/src/mindustry/world/consumers/ConsumeLiquidHeatCapacity.java b/core/src/mindustry/world/consumers/ConsumeLiquidHeatCapacity.java new file mode 100644 index 0000000000..3d5975626d --- /dev/null +++ b/core/src/mindustry/world/consumers/ConsumeLiquidHeatCapacity.java @@ -0,0 +1,32 @@ +package mindustry.world.consumers; + +import mindustry.type.*; +import mindustry.world.meta.*; + +public class ConsumeLiquidHeatCapacity extends ConsumeLiquidFilter{ + public float minHeatCapacity; + + public ConsumeLiquidHeatCapacity(float minHeatCapacity, float amount){ + this.amount = amount; + this.minHeatCapacity = minHeatCapacity; + this.filter = liquid -> liquid.heatCapacity >= this.minHeatCapacity; + } + + public ConsumeLiquidHeatCapacity(float amount){ + this(0.2f, amount); + } + + public ConsumeLiquidHeatCapacity(){ + this(0.2f); + } + + @Override + public void display(Stats stats){ + stats.add(booster ? Stat.booster : Stat.input, StatValues.liquidEffMultiplier(l -> l.heatCapacity, amount * 60f, filter)); + } + + @Override + public float liquidEfficiencyMultiplier(Liquid liquid){ + return liquid.heatCapacity; + } +} diff --git a/core/src/mindustry/world/consumers/ConsumeLiquidTemperature.java b/core/src/mindustry/world/consumers/ConsumeLiquidTemperature.java new file mode 100644 index 0000000000..ca58f2798c --- /dev/null +++ b/core/src/mindustry/world/consumers/ConsumeLiquidTemperature.java @@ -0,0 +1,32 @@ +package mindustry.world.consumers; + +import mindustry.type.*; +import mindustry.world.meta.*; + +public class ConsumeLiquidTemperature extends ConsumeLiquidFilter{ + public float minTemperature; + + public ConsumeLiquidTemperature(float minTemperature, float amount){ + this.amount = amount; + this.minTemperature = minTemperature; + this.filter = liquid -> liquid.temperature >= this.minTemperature; + } + + public ConsumeLiquidTemperature(float amount){ + this(0.2f, amount); + } + + public ConsumeLiquidTemperature(){ + this(0.2f); + } + + @Override + public void display(Stats stats){ + stats.add(booster ? Stat.booster : Stat.input, StatValues.liquidEffMultiplier(l -> l.temperature, amount * 60f, filter)); + } + + @Override + public float liquidEfficiencyMultiplier(Liquid liquid){ + return liquid.temperature; + } +} diff --git a/core/src/mindustry/world/consumers/ConsumeLiquidViscosity.java b/core/src/mindustry/world/consumers/ConsumeLiquidViscosity.java new file mode 100644 index 0000000000..8f51569e7d --- /dev/null +++ b/core/src/mindustry/world/consumers/ConsumeLiquidViscosity.java @@ -0,0 +1,32 @@ +package mindustry.world.consumers; + +import mindustry.type.*; +import mindustry.world.meta.*; + +public class ConsumeLiquidViscosity extends ConsumeLiquidFilter{ + public float minViscosity; + + public ConsumeLiquidViscosity(float minViscosity, float amount){ + this.amount = amount; + this.minViscosity = minViscosity; + this.filter = liquid -> liquid.viscosity >= this.minViscosity; + } + + public ConsumeLiquidViscosity(float amount){ + this(0.2f, amount); + } + + public ConsumeLiquidViscosity(){ + this(0.2f); + } + + @Override + public void display(Stats stats){ + stats.add(booster ? Stat.booster : Stat.input, StatValues.liquidEffMultiplier(l -> l.viscosity, amount * 60f, filter)); + } + + @Override + public float liquidEfficiencyMultiplier(Liquid liquid){ + return liquid.viscosity; + } +} diff --git a/core/src/mindustry/world/consumers/ConsumeLiquidsDynamic.java b/core/src/mindustry/world/consumers/ConsumeLiquidsDynamic.java index 9079658629..ae82560ef4 100644 --- a/core/src/mindustry/world/consumers/ConsumeLiquidsDynamic.java +++ b/core/src/mindustry/world/consumers/ConsumeLiquidsDynamic.java @@ -1,12 +1,12 @@ package mindustry.world.consumers; -import arc.func.Func; -import arc.scene.ui.layout.Table; -import mindustry.Vars; -import mindustry.gen.Building; -import mindustry.type.LiquidStack; -import mindustry.ui.ReqImage; -import mindustry.world.Block; +import arc.func.*; +import arc.scene.ui.layout.*; +import mindustry.*; +import mindustry.gen.*; +import mindustry.type.*; +import mindustry.ui.*; +import mindustry.world.*; public class ConsumeLiquidsDynamic extends Consume{ public final Func liquids; From 1cd3b49539029cdf08d65b9114f02be04d418dfe Mon Sep 17 00:00:00 2001 From: MEEPofFaith <54301439+MEEPofFaith@users.noreply.github.com> Date: Fri, 29 Mar 2024 17:48:15 -0700 Subject: [PATCH 036/460] Remove unused bundle --- core/assets/bundles/bundle.properties | 1 - 1 file changed, 1 deletion(-) diff --git a/core/assets/bundles/bundle.properties b/core/assets/bundles/bundle.properties index 43ae441a01..1875cd1569 100644 --- a/core/assets/bundles/bundle.properties +++ b/core/assets/bundles/bundle.properties @@ -997,7 +997,6 @@ stat.reactive = Reacts stat.immunities = Immunities stat.healing = Healing stat.efficiency = [stat]{0}% Efficiency -stat.explosive = [negstat]Explosive ability.forcefield = Force Field ability.repairfield = Repair Field From c22e16d7b201a4f25eec2576f4dcc3c9635f0ca1 Mon Sep 17 00:00:00 2001 From: Atomic-Laboratory <146392884+Atomic-Laboratory@users.noreply.github.com> Date: Sat, 6 Apr 2024 21:31:08 -0400 Subject: [PATCH 037/460] Server Favourite Button I'm trying to add a feature while barely knowing what I'm doing... --- core/src/mindustry/ui/dialogs/JoinDialog.java | 17 ++++++++++++++--- 1 file changed, 14 insertions(+), 3 deletions(-) diff --git a/core/src/mindustry/ui/dialogs/JoinDialog.java b/core/src/mindustry/ui/dialogs/JoinDialog.java index 3c3fd58ba4..3ca05b6c56 100644 --- a/core/src/mindustry/ui/dialogs/JoinDialog.java +++ b/core/src/mindustry/ui/dialogs/JoinDialog.java @@ -462,10 +462,21 @@ public class JoinDialog extends BaseDialog{ head.image().height(3f).growX().color(col); //button for showing/hiding servers - ImageButton[] image = {null}; - image[0] = head.button(hidden ? Icon.eyeOffSmall : Icon.eyeSmall, Styles.grayi, () -> { + ImageButton[] image = {null, null}; + image[0] = head.button(Icon.star, new ImageButton.ImageButtonStyle(){{ + imageUpColor = group.favorite() ? Pal.accent : Color.lightGray; + imageDownColor = Color.white; + }}, () -> { + group.setFavorite(!group.favorite()); + image[0].getStyle().imageUpColor = group.favorite() ? Pal.accent : Pal.lightishGray; + }).size(40f).get(); + image[0].getStyle().imageUpColor = group.favorite() ? Pal.accent : Pal.lightishGray; + image[0].addListener(new Tooltip(t -> t.background(Styles.black6).margin(4).label(() -> !group.hidden() ? "@server.shown" : "@server.hidden"))); + + //button for showing/hiding servers + image[1] = head.button(hidden ? Icon.eyeOffSmall : Icon.eyeSmall, Styles.grayi, () -> { group.setHidden(!group.hidden()); - image[0].getStyle().imageUp = group.hidden() ? Icon.eyeOffSmall : Icon.eyeSmall; + image[1].getStyle().imageUp = group.hidden() ? Icon.eyeOffSmall : Icon.eyeSmall; if(group.hidden() && !showHidden){ groupTable[0].remove(); } From 87b154209f3af0948c7cf80955fd3a72f507ab9d Mon Sep 17 00:00:00 2001 From: atomic <146392884+Atomic-Laboratory@users.noreply.github.com> Date: Sat, 6 Apr 2024 21:44:47 -0400 Subject: [PATCH 038/460] things I forgot to commit --- core/src/mindustry/net/ServerGroup.java | 8 ++++++++ core/src/mindustry/ui/dialogs/JoinDialog.java | 2 ++ 2 files changed, 10 insertions(+) diff --git a/core/src/mindustry/net/ServerGroup.java b/core/src/mindustry/net/ServerGroup.java index 694058f050..d8d480f935 100644 --- a/core/src/mindustry/net/ServerGroup.java +++ b/core/src/mindustry/net/ServerGroup.java @@ -24,10 +24,18 @@ public class ServerGroup{ return Core.settings.getBool(key() + "-hidden", false); } + public boolean favorite(){ + return Core.settings.getBool(key() + "-favorite", false); + } + public void setHidden(boolean hidden){ Core.settings.put(key() + "-hidden", hidden); } + public void setFavorite(boolean favorite){ + Core.settings.put(key() + "-favorite", favorite); + } + String key(){ return "server-" + (name.isEmpty() ? addresses.length == 0 ? "" : addresses[0] : name); } diff --git a/core/src/mindustry/ui/dialogs/JoinDialog.java b/core/src/mindustry/ui/dialogs/JoinDialog.java index 3ca05b6c56..b7f8b6055e 100644 --- a/core/src/mindustry/ui/dialogs/JoinDialog.java +++ b/core/src/mindustry/ui/dialogs/JoinDialog.java @@ -407,6 +407,8 @@ public class JoinDialog extends BaseDialog{ if(group.prioritized){ addHeader(groupTable, group, hidden, false); + } else if (group.favorite()) { + addHeader(groupTable, group, hidden, true); } //table containing all groups for(String address : group.addresses){ From 96a82260f47f3abf87fd407dbc624cb30b0e36af Mon Sep 17 00:00:00 2001 From: atomic <146392884+Atomic-Laboratory@users.noreply.github.com> Date: Sat, 6 Apr 2024 21:59:47 -0400 Subject: [PATCH 039/460] oops --- core/src/mindustry/ui/dialogs/JoinDialog.java | 20 +++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/core/src/mindustry/ui/dialogs/JoinDialog.java b/core/src/mindustry/ui/dialogs/JoinDialog.java index b7f8b6055e..b29ee2213d 100644 --- a/core/src/mindustry/ui/dialogs/JoinDialog.java +++ b/core/src/mindustry/ui/dialogs/JoinDialog.java @@ -405,10 +405,11 @@ public class JoinDialog extends BaseDialog{ Table[] groupTable = {null, null}; + boolean favorite = group.favorite(); if(group.prioritized){ - addHeader(groupTable, group, hidden, false); - } else if (group.favorite()) { - addHeader(groupTable, group, hidden, true); + addHeader(groupTable, group, hidden, favorite, false); + } else if (favorite) { + addHeader(groupTable, group, hidden, true, true);//weird behaviour if false? } //table containing all groups for(String address : group.addresses){ @@ -433,9 +434,9 @@ public class JoinDialog extends BaseDialog{ || (res.modeName != null && res.modeName.toLowerCase().contains(serverSearch)))) return; if(groupTable[0] == null){ - addHeader(groupTable, group, hidden, true); + addHeader(groupTable, group, hidden, favorite, true); }else if(!groupTable[0].visible){ - addHeader(groupTable, group, hidden, true); + addHeader(groupTable, group, hidden, favorite, true); } addCommunityHost(res, groupTable[1]); @@ -447,7 +448,7 @@ public class JoinDialog extends BaseDialog{ } } - void addHeader(Table[] groupTable, ServerGroup group, boolean hidden, boolean doInit){ // outlined separately + void addHeader(Table[] groupTable, ServerGroup group, boolean hidden, boolean favorite, boolean doInit){ // outlined separately if(groupTable[0] == null){ global.table(t -> groupTable[0] = t).fillX().left().row(); } @@ -466,14 +467,13 @@ public class JoinDialog extends BaseDialog{ //button for showing/hiding servers ImageButton[] image = {null, null}; image[0] = head.button(Icon.star, new ImageButton.ImageButtonStyle(){{ - imageUpColor = group.favorite() ? Pal.accent : Color.lightGray; + imageUpColor = favorite ? Pal.accent : Color.lightGray; imageDownColor = Color.white; }}, () -> { group.setFavorite(!group.favorite()); image[0].getStyle().imageUpColor = group.favorite() ? Pal.accent : Pal.lightishGray; }).size(40f).get(); - image[0].getStyle().imageUpColor = group.favorite() ? Pal.accent : Pal.lightishGray; - image[0].addListener(new Tooltip(t -> t.background(Styles.black6).margin(4).label(() -> !group.hidden() ? "@server.shown" : "@server.hidden"))); + image[0].getStyle().imageUpColor = favorite ? Pal.accent : Pal.lightishGray; //button for showing/hiding servers image[1] = head.button(hidden ? Icon.eyeOffSmall : Icon.eyeSmall, Styles.grayi, () -> { @@ -483,7 +483,7 @@ public class JoinDialog extends BaseDialog{ groupTable[0].remove(); } }).size(40f).get(); - image[0].addListener(new Tooltip(t -> t.background(Styles.black6).margin(4).label(() -> !group.hidden() ? "@server.shown" : "@server.hidden"))); + image[1].addListener(new Tooltip(t -> t.background(Styles.black6).margin(4).label(() -> !group.hidden() ? "@server.shown" : "@server.hidden"))); }).width(targetWidth() * columns()).padBottom(-2).row(); groupTable[1] = groupTable[0].row().table().top().left().grow().get(); From a58ff06111ca7a6ce6f60441e893575dfa81dfcc Mon Sep 17 00:00:00 2001 From: MEEPofFaith <54301439+MEEPofFaith@users.noreply.github.com> Date: Thu, 11 Apr 2024 09:25:10 +0800 Subject: [PATCH 040/460] Remove added liquid consumes --- .../consumers/ConsumeLiquidExplosive.java | 32 ------------------- .../consumers/ConsumeLiquidHeatCapacity.java | 32 ------------------- .../consumers/ConsumeLiquidTemperature.java | 32 ------------------- .../consumers/ConsumeLiquidViscosity.java | 32 ------------------- 4 files changed, 128 deletions(-) delete mode 100644 core/src/mindustry/world/consumers/ConsumeLiquidExplosive.java delete mode 100644 core/src/mindustry/world/consumers/ConsumeLiquidHeatCapacity.java delete mode 100644 core/src/mindustry/world/consumers/ConsumeLiquidTemperature.java delete mode 100644 core/src/mindustry/world/consumers/ConsumeLiquidViscosity.java diff --git a/core/src/mindustry/world/consumers/ConsumeLiquidExplosive.java b/core/src/mindustry/world/consumers/ConsumeLiquidExplosive.java deleted file mode 100644 index 3134d145ca..0000000000 --- a/core/src/mindustry/world/consumers/ConsumeLiquidExplosive.java +++ /dev/null @@ -1,32 +0,0 @@ -package mindustry.world.consumers; - -import mindustry.type.*; -import mindustry.world.meta.*; - -public class ConsumeLiquidExplosive extends ConsumeLiquidFilter{ - public float minExplosiveness; - - public ConsumeLiquidExplosive(float minExplosiveness, float amount){ - this.amount = amount; - this.minExplosiveness = minExplosiveness; - this.filter = liquid -> liquid.heatCapacity >= this.minExplosiveness; - } - - public ConsumeLiquidExplosive(float amount){ - this(0.2f, amount); - } - - public ConsumeLiquidExplosive(){ - this(0.2f); - } - - @Override - public void display(Stats stats){ - stats.add(booster ? Stat.booster : Stat.input, StatValues.liquidEffMultiplier(l -> l.explosiveness, amount * 60f, filter)); - } - - @Override - public float liquidEfficiencyMultiplier(Liquid liquid){ - return liquid.explosiveness; - } -} diff --git a/core/src/mindustry/world/consumers/ConsumeLiquidHeatCapacity.java b/core/src/mindustry/world/consumers/ConsumeLiquidHeatCapacity.java deleted file mode 100644 index 3d5975626d..0000000000 --- a/core/src/mindustry/world/consumers/ConsumeLiquidHeatCapacity.java +++ /dev/null @@ -1,32 +0,0 @@ -package mindustry.world.consumers; - -import mindustry.type.*; -import mindustry.world.meta.*; - -public class ConsumeLiquidHeatCapacity extends ConsumeLiquidFilter{ - public float minHeatCapacity; - - public ConsumeLiquidHeatCapacity(float minHeatCapacity, float amount){ - this.amount = amount; - this.minHeatCapacity = minHeatCapacity; - this.filter = liquid -> liquid.heatCapacity >= this.minHeatCapacity; - } - - public ConsumeLiquidHeatCapacity(float amount){ - this(0.2f, amount); - } - - public ConsumeLiquidHeatCapacity(){ - this(0.2f); - } - - @Override - public void display(Stats stats){ - stats.add(booster ? Stat.booster : Stat.input, StatValues.liquidEffMultiplier(l -> l.heatCapacity, amount * 60f, filter)); - } - - @Override - public float liquidEfficiencyMultiplier(Liquid liquid){ - return liquid.heatCapacity; - } -} diff --git a/core/src/mindustry/world/consumers/ConsumeLiquidTemperature.java b/core/src/mindustry/world/consumers/ConsumeLiquidTemperature.java deleted file mode 100644 index ca58f2798c..0000000000 --- a/core/src/mindustry/world/consumers/ConsumeLiquidTemperature.java +++ /dev/null @@ -1,32 +0,0 @@ -package mindustry.world.consumers; - -import mindustry.type.*; -import mindustry.world.meta.*; - -public class ConsumeLiquidTemperature extends ConsumeLiquidFilter{ - public float minTemperature; - - public ConsumeLiquidTemperature(float minTemperature, float amount){ - this.amount = amount; - this.minTemperature = minTemperature; - this.filter = liquid -> liquid.temperature >= this.minTemperature; - } - - public ConsumeLiquidTemperature(float amount){ - this(0.2f, amount); - } - - public ConsumeLiquidTemperature(){ - this(0.2f); - } - - @Override - public void display(Stats stats){ - stats.add(booster ? Stat.booster : Stat.input, StatValues.liquidEffMultiplier(l -> l.temperature, amount * 60f, filter)); - } - - @Override - public float liquidEfficiencyMultiplier(Liquid liquid){ - return liquid.temperature; - } -} diff --git a/core/src/mindustry/world/consumers/ConsumeLiquidViscosity.java b/core/src/mindustry/world/consumers/ConsumeLiquidViscosity.java deleted file mode 100644 index 8f51569e7d..0000000000 --- a/core/src/mindustry/world/consumers/ConsumeLiquidViscosity.java +++ /dev/null @@ -1,32 +0,0 @@ -package mindustry.world.consumers; - -import mindustry.type.*; -import mindustry.world.meta.*; - -public class ConsumeLiquidViscosity extends ConsumeLiquidFilter{ - public float minViscosity; - - public ConsumeLiquidViscosity(float minViscosity, float amount){ - this.amount = amount; - this.minViscosity = minViscosity; - this.filter = liquid -> liquid.viscosity >= this.minViscosity; - } - - public ConsumeLiquidViscosity(float amount){ - this(0.2f, amount); - } - - public ConsumeLiquidViscosity(){ - this(0.2f); - } - - @Override - public void display(Stats stats){ - stats.add(booster ? Stat.booster : Stat.input, StatValues.liquidEffMultiplier(l -> l.viscosity, amount * 60f, filter)); - } - - @Override - public float liquidEfficiencyMultiplier(Liquid liquid){ - return liquid.viscosity; - } -} From 331fd2e803635bcb969564eff44e07b0a8247165 Mon Sep 17 00:00:00 2001 From: MEEPofFaith <54301439+MEEPofFaith@users.noreply.github.com> Date: Tue, 16 Apr 2024 11:36:59 -0700 Subject: [PATCH 041/460] Unmet dependencies dialog + auto import --- core/assets/bundles/bundle.properties | 3 ++ core/src/mindustry/mod/ModListing.java | 3 +- core/src/mindustry/mod/Mods.java | 41 ++++++++++++++++++- core/src/mindustry/ui/dialogs/ModsDialog.java | 8 ++++ 4 files changed, 53 insertions(+), 2 deletions(-) diff --git a/core/assets/bundles/bundle.properties b/core/assets/bundles/bundle.properties index cbf4f022d1..9235abcc53 100644 --- a/core/assets/bundles/bundle.properties +++ b/core/assets/bundles/bundle.properties @@ -183,6 +183,9 @@ mod.preview.missing = Before publishing this mod in the workshop, you must add a mod.folder.missing = Only mods in folder form can be published on the workshop.\nTo convert any mod into a folder, simply unzip its file into a folder and delete the old zip, then restart your game or reload your mods. mod.scripts.disable = Your device does not support mods with scripts. You must disable these mods to play the game. +mod.dependencies.error = [scarlet]Mods are missing dependencies +mod.dependencies.download = Download + about.button = About name = Name: noname = Pick a[accent] player name[] first. diff --git a/core/src/mindustry/mod/ModListing.java b/core/src/mindustry/mod/ModListing.java index e4dfbeccc6..1c029ac122 100644 --- a/core/src/mindustry/mod/ModListing.java +++ b/core/src/mindustry/mod/ModListing.java @@ -2,7 +2,7 @@ package mindustry.mod; /** Mod listing as a data class. */ public class ModListing{ - public String repo, name, subtitle, author, lastUpdated, description, minGameVersion; + public String repo, name, modName, subtitle, author, lastUpdated, description, minGameVersion; public boolean hasScripts, hasJava; public String[] contentTypes = {}; public int stars; @@ -12,6 +12,7 @@ public class ModListing{ return "ModListing{" + "repo='" + repo + '\'' + ", name='" + name + '\'' + + ", modName='" + modName + '\'' + ", author='" + author + '\'' + ", lastUpdated='" + lastUpdated + '\'' + ", description='" + description + '\'' + diff --git a/core/src/mindustry/mod/Mods.java b/core/src/mindustry/mod/Mods.java index 9e8e6b2b2b..563ed49e1d 100644 --- a/core/src/mindustry/mod/Mods.java +++ b/core/src/mindustry/mod/Mods.java @@ -609,7 +609,6 @@ public class Mods implements Loadable{ if(mods.contains(LoadedMod::hasContentErrors)){ ui.loadfrag.hide(); new Dialog(""){{ - setFillParent(true); cont.margin(15); cont.add("@error.title"); @@ -647,6 +646,46 @@ public class Mods implements Loadable{ cont.button("@ok", this::hide).size(300, 50); }}.show(); } + + //show list of missing dependencies + if(mods.contains(LoadedMod::hasUnmetDependencies)){ + ui.loadfrag.hide(); + new Dialog(""){{ + setFillParent(true); + cont.margin(15); + cont.add("@mod.dependencies.error"); + cont.row(); + cont.image().width(300f).pad(2).colspan(2).height(4f).color(Color.scarlet); + cont.row(); + cont.pane(p -> { + mods.each(LoadedMod::hasUnmetDependencies, mod -> { + p.add(mod.name).wrap().growX().left().get().setAlignment(Align.left); + p.row(); + p.table(d -> { + mod.missingDependencies.each(dep -> { + d.add(" - " + dep).wrap().growX().left().get().setAlignment(Align.left); + d.row(); + }); + }).growX(); + p.row(); + }); + }).fillX(); + + cont.row(); + + cont.table(b -> { + b.button("@ok", this::hide).size(150, 50); + b.button("@mod.dependencies.download", () -> { + hide(); + Seq missingDeps = new Seq<>(); + mods.each(m -> m.enabled() && m.hasUnmetDependencies(), mod -> { + mod.missingDependencies.each(missingDeps::addUnique); + }); + ui.mods.importDependencies(missingDeps); + }).size(150, 50); + }); + }}.show(); + } } public boolean hasContentErrors(){ diff --git a/core/src/mindustry/ui/dialogs/ModsDialog.java b/core/src/mindustry/ui/dialogs/ModsDialog.java index cfc64166ab..804e4ab8ed 100644 --- a/core/src/mindustry/ui/dialogs/ModsDialog.java +++ b/core/src/mindustry/ui/dialogs/ModsDialog.java @@ -673,6 +673,14 @@ public class ModsDialog extends BaseDialog{ } } + public void importDependencies(Seq dependencies){ + getModList(listings -> { + listings.each(l -> dependencies.contains(l.modName), l -> { + githubImportMod(l.repo, l.hasJava); + }); + }); + } + private void githubImportJavaMod(String repo, @Nullable String release){ //grab latest release Http.get(ghApi + "/repos/" + repo + "/releases/" + (release == null ? "latest" : release), res -> { From dd0719c6f11b3a4564aece58a00dd40f20ec52d0 Mon Sep 17 00:00:00 2001 From: MEEPofFaith <54301439+MEEPofFaith@users.noreply.github.com> Date: Tue, 16 Apr 2024 16:48:44 -0700 Subject: [PATCH 042/460] modName -> internalName https://github.com/Anuken/MindustryMods/pull/31/commits/4746a2fd1ea6928fe30df308c1c2a3505f02354c --- core/src/mindustry/mod/ModListing.java | 4 ++-- core/src/mindustry/ui/dialogs/ModsDialog.java | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/core/src/mindustry/mod/ModListing.java b/core/src/mindustry/mod/ModListing.java index 1c029ac122..ccdb88b717 100644 --- a/core/src/mindustry/mod/ModListing.java +++ b/core/src/mindustry/mod/ModListing.java @@ -2,7 +2,7 @@ package mindustry.mod; /** Mod listing as a data class. */ public class ModListing{ - public String repo, name, modName, subtitle, author, lastUpdated, description, minGameVersion; + public String repo, name, internalName, subtitle, author, lastUpdated, description, minGameVersion; public boolean hasScripts, hasJava; public String[] contentTypes = {}; public int stars; @@ -12,7 +12,7 @@ public class ModListing{ return "ModListing{" + "repo='" + repo + '\'' + ", name='" + name + '\'' + - ", modName='" + modName + '\'' + + ", internalName='" + internalName + '\'' + ", author='" + author + '\'' + ", lastUpdated='" + lastUpdated + '\'' + ", description='" + description + '\'' + diff --git a/core/src/mindustry/ui/dialogs/ModsDialog.java b/core/src/mindustry/ui/dialogs/ModsDialog.java index 804e4ab8ed..9d8041c7fb 100644 --- a/core/src/mindustry/ui/dialogs/ModsDialog.java +++ b/core/src/mindustry/ui/dialogs/ModsDialog.java @@ -675,7 +675,7 @@ public class ModsDialog extends BaseDialog{ public void importDependencies(Seq dependencies){ getModList(listings -> { - listings.each(l -> dependencies.contains(l.modName), l -> { + listings.each(l -> dependencies.contains(l.internalName), l -> { githubImportMod(l.repo, l.hasJava); }); }); From 5ac8abec0f5187615b913ae9901688eaf1bae299 Mon Sep 17 00:00:00 2001 From: MEEPofFaith <54301439+MEEPofFaith@users.noreply.github.com> Date: Tue, 16 Apr 2024 17:09:23 -0700 Subject: [PATCH 043/460] Display feedback to user --- core/assets/bundles/bundle.properties | 2 ++ core/src/mindustry/mod/Mods.java | 16 +++++++++++++--- core/src/mindustry/ui/dialogs/ModsDialog.java | 1 + 3 files changed, 16 insertions(+), 3 deletions(-) diff --git a/core/assets/bundles/bundle.properties b/core/assets/bundles/bundle.properties index 9235abcc53..aafb00daba 100644 --- a/core/assets/bundles/bundle.properties +++ b/core/assets/bundles/bundle.properties @@ -185,6 +185,8 @@ mod.scripts.disable = Your device does not support mods with scripts. You must d mod.dependencies.error = [scarlet]Mods are missing dependencies mod.dependencies.download = Download +mod.dependencies.success = Successfully downloaded all dependencies +mod.dependencies.failure = Failed to download some dependencies: about.button = About name = Name: diff --git a/core/src/mindustry/mod/Mods.java b/core/src/mindustry/mod/Mods.java index 563ed49e1d..1165a0bf71 100644 --- a/core/src/mindustry/mod/Mods.java +++ b/core/src/mindustry/mod/Mods.java @@ -663,10 +663,10 @@ public class Mods implements Loadable{ p.row(); p.table(d -> { mod.missingDependencies.each(dep -> { - d.add(" - " + dep).wrap().growX().left().get().setAlignment(Align.left); + d.add(" " + dep).wrap().growX().left().get().setAlignment(Align.left); d.row(); }); - }).growX(); + }).growX().padBottom(8f); p.row(); }); }).fillX(); @@ -678,10 +678,20 @@ public class Mods implements Loadable{ b.button("@mod.dependencies.download", () -> { hide(); Seq missingDeps = new Seq<>(); - mods.each(m -> m.enabled() && m.hasUnmetDependencies(), mod -> { + mods.each(LoadedMod::hasUnmetDependencies, mod -> { mod.missingDependencies.each(missingDeps::addUnique); }); + int amount = missingDeps.size; ui.mods.importDependencies(missingDeps); + if(missingDeps.size < amount) requiresReload = true; + + if(missingDeps.isEmpty()){ + ui.showInfo("@mod.dependencies.success"); + }else{ + String[] fail = {Core.bundle.get("mod.dependencies.failure")}; + missingDeps.each(d -> fail[0] += "\n " + d); + ui.showStartupInfo(fail[0]); + } }).size(150, 50); }); }}.show(); diff --git a/core/src/mindustry/ui/dialogs/ModsDialog.java b/core/src/mindustry/ui/dialogs/ModsDialog.java index 9d8041c7fb..8001ebe0c8 100644 --- a/core/src/mindustry/ui/dialogs/ModsDialog.java +++ b/core/src/mindustry/ui/dialogs/ModsDialog.java @@ -677,6 +677,7 @@ public class ModsDialog extends BaseDialog{ getModList(listings -> { listings.each(l -> dependencies.contains(l.internalName), l -> { githubImportMod(l.repo, l.hasJava); + dependencies.remove(l.internalName); }); }); } From 8f8bd67d4bf2cf5317bf6cec6bdc4c0300ddc4ef Mon Sep 17 00:00:00 2001 From: MEEPofFaith <54301439+MEEPofFaith@users.noreply.github.com> Date: Tue, 16 Apr 2024 17:22:41 -0700 Subject: [PATCH 044/460] Exit after importing --- core/src/mindustry/core/UI.java | 6 +++++- core/src/mindustry/mod/Mods.java | 28 ++++++++++++++++++++++++---- 2 files changed, 29 insertions(+), 5 deletions(-) diff --git a/core/src/mindustry/core/UI.java b/core/src/mindustry/core/UI.java index d634e122b5..554b483d6d 100644 --- a/core/src/mindustry/core/UI.java +++ b/core/src/mindustry/core/UI.java @@ -429,9 +429,13 @@ public class UI implements ApplicationListener, Loadable{ } public void showInfoOnHidden(String info, Runnable listener){ + showInfoOnHidden(info, Align.center, listener); + } + + public void showInfoOnHidden(String info, int align, Runnable listener){ new Dialog(""){{ getCell(cont).growX(); - cont.margin(15).add(info).width(400f).wrap().get().setAlignment(Align.center, Align.center); + cont.margin(15).add(info).width(400f).wrap().get().setAlignment(align, align); buttons.button("@ok", this::hide).size(110, 50).pad(4); hidden(listener); closeOnBack(); diff --git a/core/src/mindustry/mod/Mods.java b/core/src/mindustry/mod/Mods.java index 1165a0bf71..5d64a02812 100644 --- a/core/src/mindustry/mod/Mods.java +++ b/core/src/mindustry/mod/Mods.java @@ -681,16 +681,29 @@ public class Mods implements Loadable{ mods.each(LoadedMod::hasUnmetDependencies, mod -> { mod.missingDependencies.each(missingDeps::addUnique); }); - int amount = missingDeps.size; + int toImport = missingDeps.size; ui.mods.importDependencies(missingDeps); - if(missingDeps.size < amount) requiresReload = true; if(missingDeps.isEmpty()){ - ui.showInfo("@mod.dependencies.success"); + ui.showInfoOnHidden(Core.bundle.get("mod.dependencies.success") + "\n\n" + Core.bundle.get("mods.reloadexit"), () -> { + Log.info("Exiting to reload mods."); + Core.app.exit(); + }); }else{ String[] fail = {Core.bundle.get("mod.dependencies.failure")}; missingDeps.each(d -> fail[0] += "\n " + d); - ui.showStartupInfo(fail[0]); + + boolean imported = missingDeps.size < toImport; //Mods were loaded + if(imported){ + fail[0] += "\n\n" + Core.bundle.get("mods.reloadexit"); + } + + ui.showInfoOnHidden(fail[0], Align.left, () -> { + if(imported){ + Log.info("Exiting to reload mods."); + Core.app.exit(); + } + }); } }).size(150, 50); }); @@ -698,6 +711,13 @@ public class Mods implements Loadable{ } } + private void reload(){ + ui.showInfoOnHidden("@mods.reloadexit", () -> { + Log.info("Exiting to reload mods."); + Core.app.exit(); + }); + } + public boolean hasContentErrors(){ return mods.contains(LoadedMod::hasContentErrors) || (scripts != null && scripts.hasErrored()); } From e155bf7101c07be7be19238b088606084871128b Mon Sep 17 00:00:00 2001 From: MEEPofFaith <54301439+MEEPofFaith@users.noreply.github.com> Date: Tue, 16 Apr 2024 17:55:55 -0700 Subject: [PATCH 045/460] Cleaner feedback dialog --- core/assets/bundles/bundle.properties | 5 +- core/src/mindustry/core/UI.java | 6 +- core/src/mindustry/mod/Mods.java | 89 +++++++++++++++++---------- 3 files changed, 62 insertions(+), 38 deletions(-) diff --git a/core/assets/bundles/bundle.properties b/core/assets/bundles/bundle.properties index aafb00daba..e5fe685aa6 100644 --- a/core/assets/bundles/bundle.properties +++ b/core/assets/bundles/bundle.properties @@ -185,8 +185,9 @@ mod.scripts.disable = Your device does not support mods with scripts. You must d mod.dependencies.error = [scarlet]Mods are missing dependencies mod.dependencies.download = Download -mod.dependencies.success = Successfully downloaded all dependencies -mod.dependencies.failure = Failed to download some dependencies: +mod.dependencies.status = Import Results +mod.dependencies.success = Successfully downloaded: +mod.dependencies.failure = Failed to download: about.button = About name = Name: diff --git a/core/src/mindustry/core/UI.java b/core/src/mindustry/core/UI.java index 554b483d6d..d634e122b5 100644 --- a/core/src/mindustry/core/UI.java +++ b/core/src/mindustry/core/UI.java @@ -429,13 +429,9 @@ public class UI implements ApplicationListener, Loadable{ } public void showInfoOnHidden(String info, Runnable listener){ - showInfoOnHidden(info, Align.center, listener); - } - - public void showInfoOnHidden(String info, int align, Runnable listener){ new Dialog(""){{ getCell(cont).growX(); - cont.margin(15).add(info).width(400f).wrap().get().setAlignment(align, align); + cont.margin(15).add(info).width(400f).wrap().get().setAlignment(Align.center, Align.center); buttons.button("@ok", this::hide).size(110, 50).pad(4); hidden(listener); closeOnBack(); diff --git a/core/src/mindustry/mod/Mods.java b/core/src/mindustry/mod/Mods.java index 5d64a02812..e354f89e14 100644 --- a/core/src/mindustry/mod/Mods.java +++ b/core/src/mindustry/mod/Mods.java @@ -615,7 +615,7 @@ public class Mods implements Loadable{ cont.row(); cont.image().width(300f).pad(2).colspan(2).height(4f).color(Color.scarlet); cont.row(); - cont.add("@mod.errors").wrap().growX().center().get().setAlignment(Align.center); + cont.add("@mod.errors").wrap().growX().center().labelAlign(Align.center); cont.row(); cont.pane(p -> { mods.each(m -> m.enabled() && m.hasContentErrors(), m -> { @@ -655,18 +655,18 @@ public class Mods implements Loadable{ cont.margin(15); cont.add("@mod.dependencies.error"); cont.row(); - cont.image().width(300f).pad(2).colspan(2).height(4f).color(Color.scarlet); + cont.image().width(300f).pad(2).height(4f).color(Color.scarlet); cont.row(); cont.pane(p -> { mods.each(LoadedMod::hasUnmetDependencies, mod -> { - p.add(mod.name).wrap().growX().left().get().setAlignment(Align.left); + p.add(mod.name).wrap().growX().left().labelAlign(Align.left); p.row(); p.table(d -> { mod.missingDependencies.each(dep -> { - d.add(" " + dep).wrap().growX().left().get().setAlignment(Align.left); + d.add(dep).wrap().growX().left().labelAlign(Align.left); d.row(); }); - }).growX().padBottom(8f); + }).growX().padBottom(8f).padLeft(12f); p.row(); }); }).fillX(); @@ -677,40 +677,67 @@ public class Mods implements Loadable{ b.button("@ok", this::hide).size(150, 50); b.button("@mod.dependencies.download", () -> { hide(); - Seq missingDeps = new Seq<>(); + Seq toImport = new Seq<>(); mods.each(LoadedMod::hasUnmetDependencies, mod -> { - mod.missingDependencies.each(missingDeps::addUnique); + mod.missingDependencies.each(toImport::addUnique); }); - int toImport = missingDeps.size; - ui.mods.importDependencies(missingDeps); - - if(missingDeps.isEmpty()){ - ui.showInfoOnHidden(Core.bundle.get("mod.dependencies.success") + "\n\n" + Core.bundle.get("mods.reloadexit"), () -> { - Log.info("Exiting to reload mods."); - Core.app.exit(); - }); - }else{ - String[] fail = {Core.bundle.get("mod.dependencies.failure")}; - missingDeps.each(d -> fail[0] += "\n " + d); - - boolean imported = missingDeps.size < toImport; //Mods were loaded - if(imported){ - fail[0] += "\n\n" + Core.bundle.get("mods.reloadexit"); - } - - ui.showInfoOnHidden(fail[0], Align.left, () -> { - if(imported){ - Log.info("Exiting to reload mods."); - Core.app.exit(); - } - }); - } + Seq remaining = toImport.copy(); + ui.mods.importDependencies(remaining); + toImport.removeAll(remaining); + displayDependencyImportStatus(remaining, toImport); }).size(150, 50); }); }}.show(); } } + private void displayDependencyImportStatus(Seq failed, Seq success){ + new Dialog(""){{ + setFillParent(true); + cont.margin(15); + + cont.add("@mod.dependencies.status").center(); + cont.row(); + cont.image().width(300f).pad(2).height(4f).color(Color.lightGray); + cont.row(); + + cont.pane(p -> { + if(success.any()){ + p.add("@mod.dependencies.success").wrap().fillX().left().labelAlign(Align.left); + p.row(); + p.table(t -> { + success.each(d -> { + t.add(d).wrap().growX().left().labelAlign(Align.left); + t.row(); + }); + }).growX().padBottom(8f).padLeft(12f); + p.row(); + } + + if(failed.any()){ + p.add("@mod.dependencies.failure").wrap().fillX().left().labelAlign(Align.left); + p.row(); + p.table(t -> { + failed.each(d -> { + t.add(d).wrap().growX().left().labelAlign(Align.left); + t.row(); + }); + }).growX().padBottom(8f).padLeft(12f); + } + }).fillX(); + + if(success.any()){ + cont.image().width(300f).pad(2).height(4f).color(Color.lightGray); + cont.row(); + cont.add("@mods.reloadexit").center(); + hidden(() -> { + Log.info("Exiting to reload mods after dependency auto-import."); + Core.app.exit(); + }); + } + }}.show(); + } + private void reload(){ ui.showInfoOnHidden("@mods.reloadexit", () -> { Log.info("Exiting to reload mods."); From 250fb79fa3c5ccb624f8d0c406369309ce456df9 Mon Sep 17 00:00:00 2001 From: MEEPofFaith <54301439+MEEPofFaith@users.noreply.github.com> Date: Tue, 16 Apr 2024 17:57:05 -0700 Subject: [PATCH 046/460] "Auto-Import" instead of "Download"? --- core/assets/bundles/bundle.properties | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/assets/bundles/bundle.properties b/core/assets/bundles/bundle.properties index e5fe685aa6..db21adf1ac 100644 --- a/core/assets/bundles/bundle.properties +++ b/core/assets/bundles/bundle.properties @@ -184,7 +184,7 @@ mod.folder.missing = Only mods in folder form can be published on the workshop.\ mod.scripts.disable = Your device does not support mods with scripts. You must disable these mods to play the game. mod.dependencies.error = [scarlet]Mods are missing dependencies -mod.dependencies.download = Download +mod.dependencies.download = Auto-Import mod.dependencies.status = Import Results mod.dependencies.success = Successfully downloaded: mod.dependencies.failure = Failed to download: From ad1a3d694e4617b5b8cca3ac6d442c0fa80a37fe Mon Sep 17 00:00:00 2001 From: MEEPofFaith <54301439+MEEPofFaith@users.noreply.github.com> Date: Tue, 16 Apr 2024 18:00:47 -0700 Subject: [PATCH 047/460] There is now an escape Forgot to add the ok button --- core/src/mindustry/mod/Mods.java | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/core/src/mindustry/mod/Mods.java b/core/src/mindustry/mod/Mods.java index e354f89e14..49f4af97e2 100644 --- a/core/src/mindustry/mod/Mods.java +++ b/core/src/mindustry/mod/Mods.java @@ -725,16 +725,21 @@ public class Mods implements Loadable{ }).growX().padBottom(8f).padLeft(12f); } }).fillX(); + cont.row(); if(success.any()){ cont.image().width(300f).pad(2).height(4f).color(Color.lightGray); cont.row(); cont.add("@mods.reloadexit").center(); + cont.row(); + hidden(() -> { Log.info("Exiting to reload mods after dependency auto-import."); Core.app.exit(); }); } + + cont.button("@ok", this::hide).size(300, 50); }}.show(); } From 274184e234c0c328e6d986319a15aeb7dac571a0 Mon Sep 17 00:00:00 2001 From: MEEPofFaith <54301439+MEEPofFaith@users.noreply.github.com> Date: Tue, 16 Apr 2024 18:04:00 -0700 Subject: [PATCH 048/460] Less table --- core/src/mindustry/mod/Mods.java | 32 +++++++++++++++----------------- 1 file changed, 15 insertions(+), 17 deletions(-) diff --git a/core/src/mindustry/mod/Mods.java b/core/src/mindustry/mod/Mods.java index 49f4af97e2..85481aaf9e 100644 --- a/core/src/mindustry/mod/Mods.java +++ b/core/src/mindustry/mod/Mods.java @@ -653,9 +653,9 @@ public class Mods implements Loadable{ new Dialog(""){{ setFillParent(true); cont.margin(15); - cont.add("@mod.dependencies.error"); + cont.add("@mod.dependencies.error").colspan(2); cont.row(); - cont.image().width(300f).pad(2).height(4f).color(Color.scarlet); + cont.image().width(300f).colspan(2).pad(2).height(4f).color(Color.scarlet); cont.row(); cont.pane(p -> { mods.each(LoadedMod::hasUnmetDependencies, mod -> { @@ -669,24 +669,22 @@ public class Mods implements Loadable{ }).growX().padBottom(8f).padLeft(12f); p.row(); }); - }).fillX(); + }).fillX().colspan(2); cont.row(); - cont.table(b -> { - b.button("@ok", this::hide).size(150, 50); - b.button("@mod.dependencies.download", () -> { - hide(); - Seq toImport = new Seq<>(); - mods.each(LoadedMod::hasUnmetDependencies, mod -> { - mod.missingDependencies.each(toImport::addUnique); - }); - Seq remaining = toImport.copy(); - ui.mods.importDependencies(remaining); - toImport.removeAll(remaining); - displayDependencyImportStatus(remaining, toImport); - }).size(150, 50); - }); + cont.button("@ok", this::hide).size(150, 50); + cont.button("@mod.dependencies.download", () -> { + hide(); + Seq toImport = new Seq<>(); + mods.each(LoadedMod::hasUnmetDependencies, mod -> { + mod.missingDependencies.each(toImport::addUnique); + }); + Seq remaining = toImport.copy(); + ui.mods.importDependencies(remaining); + toImport.removeAll(remaining); + displayDependencyImportStatus(remaining, toImport); + }).size(150, 50); }}.show(); } } From 6e3bc2b4c393cd54c1b45e21a795a98884128acf Mon Sep 17 00:00:00 2001 From: MEEPofFaith <54301439+MEEPofFaith@users.noreply.github.com> Date: Tue, 16 Apr 2024 18:09:05 -0700 Subject: [PATCH 049/460] Show display name instead of name --- core/src/mindustry/mod/Mods.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/src/mindustry/mod/Mods.java b/core/src/mindustry/mod/Mods.java index 85481aaf9e..30ab2b470c 100644 --- a/core/src/mindustry/mod/Mods.java +++ b/core/src/mindustry/mod/Mods.java @@ -659,7 +659,7 @@ public class Mods implements Loadable{ cont.row(); cont.pane(p -> { mods.each(LoadedMod::hasUnmetDependencies, mod -> { - p.add(mod.name).wrap().growX().left().labelAlign(Align.left); + p.add(mod.meta.displayName).wrap().growX().left().labelAlign(Align.left); p.row(); p.table(d -> { mod.missingDependencies.each(dep -> { From eff7d75712054b8d9c7fdb22c74671d38ed15fcc Mon Sep 17 00:00:00 2001 From: MEEPofFaith <54301439+MEEPofFaith@users.noreply.github.com> Date: Thu, 18 Apr 2024 11:40:14 -0700 Subject: [PATCH 050/460] Display status after downloads are complete. --- core/src/mindustry/mod/Mods.java | 7 ++++--- core/src/mindustry/ui/dialogs/ModsDialog.java | 5 +++-- 2 files changed, 7 insertions(+), 5 deletions(-) diff --git a/core/src/mindustry/mod/Mods.java b/core/src/mindustry/mod/Mods.java index 30ab2b470c..348bfbceaa 100644 --- a/core/src/mindustry/mod/Mods.java +++ b/core/src/mindustry/mod/Mods.java @@ -681,9 +681,10 @@ public class Mods implements Loadable{ mod.missingDependencies.each(toImport::addUnique); }); Seq remaining = toImport.copy(); - ui.mods.importDependencies(remaining); - toImport.removeAll(remaining); - displayDependencyImportStatus(remaining, toImport); + ui.mods.importDependencies(remaining, () -> { + toImport.removeAll(remaining); + displayDependencyImportStatus(remaining, toImport); + }); }).size(150, 50); }}.show(); } diff --git a/core/src/mindustry/ui/dialogs/ModsDialog.java b/core/src/mindustry/ui/dialogs/ModsDialog.java index 8001ebe0c8..dee0edc4b6 100644 --- a/core/src/mindustry/ui/dialogs/ModsDialog.java +++ b/core/src/mindustry/ui/dialogs/ModsDialog.java @@ -673,12 +673,13 @@ public class ModsDialog extends BaseDialog{ } } - public void importDependencies(Seq dependencies){ + public void importDependencies(Seq dependencies, Runnable done){ getModList(listings -> { listings.each(l -> dependencies.contains(l.internalName), l -> { - githubImportMod(l.repo, l.hasJava); dependencies.remove(l.internalName); + githubImportMod(l.repo, l.hasJava); }); + done.run(); }); } From a51c4e6909b68c1516dde081d3ccec6b70d4cd63 Mon Sep 17 00:00:00 2001 From: MEEPofFaith <54301439+MEEPofFaith@users.noreply.github.com> Date: Thu, 18 Apr 2024 13:44:52 -0700 Subject: [PATCH 051/460] Don't check disabled mods --- core/src/mindustry/mod/Mods.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/core/src/mindustry/mod/Mods.java b/core/src/mindustry/mod/Mods.java index 348bfbceaa..5e3809144a 100644 --- a/core/src/mindustry/mod/Mods.java +++ b/core/src/mindustry/mod/Mods.java @@ -658,7 +658,7 @@ public class Mods implements Loadable{ cont.image().width(300f).colspan(2).pad(2).height(4f).color(Color.scarlet); cont.row(); cont.pane(p -> { - mods.each(LoadedMod::hasUnmetDependencies, mod -> { + mods.each(mod -> mod.shouldBeEnabled() && mod.hasUnmetDependencies(), mod -> { p.add(mod.meta.displayName).wrap().growX().left().labelAlign(Align.left); p.row(); p.table(d -> { @@ -677,7 +677,7 @@ public class Mods implements Loadable{ cont.button("@mod.dependencies.download", () -> { hide(); Seq toImport = new Seq<>(); - mods.each(LoadedMod::hasUnmetDependencies, mod -> { + mods.each(mod -> mod.shouldBeEnabled() && mod.hasUnmetDependencies(), mod -> { mod.missingDependencies.each(toImport::addUnique); }); Seq remaining = toImport.copy(); From e6b7d3f82e9f61495e8a9a8cedc2e4194a45727e Mon Sep 17 00:00:00 2001 From: MEEPofFaith <54301439+MEEPofFaith@users.noreply.github.com> Date: Thu, 18 Apr 2024 21:55:59 -0700 Subject: [PATCH 052/460] Fun fact: This bundle entry is unused --- core/assets/bundles/bundle.properties | 1 - core/assets/bundles/bundle_be.properties | 1 - core/assets/bundles/bundle_bg.properties | 1 - core/assets/bundles/bundle_ca.properties | 1 - core/assets/bundles/bundle_cs.properties | 1 - core/assets/bundles/bundle_da.properties | 1 - core/assets/bundles/bundle_de.properties | 1 - core/assets/bundles/bundle_es.properties | 1 - core/assets/bundles/bundle_et.properties | 1 - core/assets/bundles/bundle_eu.properties | 1 - core/assets/bundles/bundle_fi.properties | 1 - core/assets/bundles/bundle_fil.properties | 1 - core/assets/bundles/bundle_fr.properties | 1 - core/assets/bundles/bundle_hu.properties | 1 - core/assets/bundles/bundle_id_ID.properties | 1 - core/assets/bundles/bundle_it.properties | 1 - core/assets/bundles/bundle_ja.properties | 1 - core/assets/bundles/bundle_ko.properties | 1 - core/assets/bundles/bundle_lt.properties | 1 - core/assets/bundles/bundle_nl.properties | 1 - core/assets/bundles/bundle_nl_BE.properties | 1 - core/assets/bundles/bundle_pl.properties | 1 - core/assets/bundles/bundle_pt_BR.properties | 1 - core/assets/bundles/bundle_pt_PT.properties | 1 - core/assets/bundles/bundle_ro.properties | 1 - core/assets/bundles/bundle_ru.properties | 1 - core/assets/bundles/bundle_sr.properties | 1 - core/assets/bundles/bundle_sv.properties | 1 - core/assets/bundles/bundle_th.properties | 1 - core/assets/bundles/bundle_tk.properties | 1 - core/assets/bundles/bundle_tr.properties | 1 - core/assets/bundles/bundle_uk_UA.properties | 1 - core/assets/bundles/bundle_vi.properties | 1 - core/assets/bundles/bundle_zh_CN.properties | 1 - core/assets/bundles/bundle_zh_TW.properties | 1 - 35 files changed, 35 deletions(-) diff --git a/core/assets/bundles/bundle.properties b/core/assets/bundles/bundle.properties index db21adf1ac..2f3e5d531b 100644 --- a/core/assets/bundles/bundle.properties +++ b/core/assets/bundles/bundle.properties @@ -167,7 +167,6 @@ mod.requiresversion = Requires game version: [red]{0} mod.errors = Errors have occurred loading content. mod.noerrorplay = [red]You have mods with errors.[] Either disable the affected mods or fix the errors before playing. -mod.nowdisabled = [red]Mod '{0}' is missing dependencies:[accent] {1}\n[lightgray]These mods need to be downloaded first.\nThis mod will be automatically disabled. mod.enable = Enable mod.requiresrestart = The game will now close to apply the mod changes. mod.reloadrequired = [red]Restart Required diff --git a/core/assets/bundles/bundle_be.properties b/core/assets/bundles/bundle_be.properties index b1a94fc891..f279f83f59 100644 --- a/core/assets/bundles/bundle_be.properties +++ b/core/assets/bundles/bundle_be.properties @@ -160,7 +160,6 @@ mod.incompletedependencies.details = Гэтая мадыфікацыя не мо mod.requiresversion = Патрабуецца версія гульні: [red]{0} mod.errors = Памылкі былі выкліканыя загружаным змесцівам. mod.noerrorplay = [scarlet]У Вас ёсць мадыфікацыі з памылкамі.[] Выключыце праблемныя мадыфікацыі або выпраўце памылкі перад гульнёй. -mod.nowdisabled = [scarlet]Мадыфікацыі '{0}' патрабуюцца бацькоўскія мадыфікацыі:[accent] {1}\n[lightgray]Спачатку трэба загрузіць іх.\nГэтая мадыфікацыя будзе аўтаматычна адключаная. mod.enable = Укл. mod.requiresrestart = Цяпер гульня зачыніцца, каб прымяніць змены ў мадыфікацыях. mod.reloadrequired = [scarlet]Неабходны перазапуск diff --git a/core/assets/bundles/bundle_bg.properties b/core/assets/bundles/bundle_bg.properties index eafedcdd6b..accfcadfb8 100644 --- a/core/assets/bundles/bundle_bg.properties +++ b/core/assets/bundles/bundle_bg.properties @@ -163,7 +163,6 @@ mod.incompletedependencies.details = This mod is unable to be loaded due to inva mod.requiresversion = Requires game version: [red]{0} mod.errors = Възникнаха грешки при зареждане на съдържанието. mod.noerrorplay = [scarlet]Има грешки в някои от модовете, които използвате.[] Трябва да деактивирате тези модове или да поправите грешките преди да играете. -mod.nowdisabled = [scarlet]Липсват зависимости за мод '{0}':[accent] {1}\n[lightgray]Мод {0} ще бъде деактивиран докато не ги изтеглите. mod.enable = Активирай mod.requiresrestart = Играта ще се затвори за да приложи промените в модовете. mod.reloadrequired = [scarlet]Необходимо е рестартиране diff --git a/core/assets/bundles/bundle_ca.properties b/core/assets/bundles/bundle_ca.properties index 149756ce51..88cd669bc8 100644 --- a/core/assets/bundles/bundle_ca.properties +++ b/core/assets/bundles/bundle_ca.properties @@ -163,7 +163,6 @@ mod.incompletedependencies.details = Aquest mod no es pot carregar perquè té u mod.requiresversion = Cal la versió [red]{0}[] del joc. mod.errors = S’han produït errors quan es carregava el contingut. mod.noerrorplay = [scarlet]S’executen mods amb errors.[] Desactiveu els mods afectats o arregleu les errades abans de jugar. -mod.nowdisabled = [scarlet]Falten dependències del mod «{0}»s:[accent] {1}\n[lightgray]S’han de carregar els mods que fan falta.\nAquest mod es desactivarà automàticament. mod.enable = Activa mod.requiresrestart = El programa es tancarà per a aplicar els canvis. mod.reloadrequired = [scarlet]Cal reiniciar diff --git a/core/assets/bundles/bundle_cs.properties b/core/assets/bundles/bundle_cs.properties index 60ea6f6682..5963f0b210 100644 --- a/core/assets/bundles/bundle_cs.properties +++ b/core/assets/bundles/bundle_cs.properties @@ -163,7 +163,6 @@ mod.incompletedependencies.details = This mod is unable to be loaded due to inva mod.requiresversion = Requires game version: [red]{0} mod.errors = Při načítání obsahu hry se vyskytly problémy. mod.noerrorplay = [scarlet]Máš modifikace s chybami.[] Buď zakaž dotčené modifikace, nebo oprav chyby před tím, než začneš hrát. -mod.nowdisabled = [scarlet]Modifikaci '{0}' chybí tyto závislosti: [accent]{1}\n[lightgray]Tyto modifikace je třeba nejprve stáhnout.\nTato modifikace bude nyní automaticky zakázána. mod.enable = Povolit mod.requiresrestart = Hra bude ukončena, aby bylo možné nasadit modifikace. mod.reloadrequired = [scarlet]Je vyžadováno znovuspuštění hry. diff --git a/core/assets/bundles/bundle_da.properties b/core/assets/bundles/bundle_da.properties index cb118a0b54..dee38099c8 100644 --- a/core/assets/bundles/bundle_da.properties +++ b/core/assets/bundles/bundle_da.properties @@ -160,7 +160,6 @@ mod.incompletedependencies.details = This mod is unable to be loaded due to inva mod.requiresversion = Requires game version: [red]{0} mod.errors = Fejl ved afhentning af indhold. mod.noerrorplay = [scarlet]Du har mods med fejl.[] Deaktiver det eller løs fejl før du starter spillet. -mod.nowdisabled = [scarlet]Mod '{0}' mangler afhængigheder:[accent] {1}\n[lightgray]Disse mods skal hentes først.\nDenne mod vil blive deaktiveret automatisk. mod.enable = Aktiver mod.requiresrestart = Spillet vil nu lukke for at tilføje mod ændringerne mod.reloadrequired = [scarlet]Genindlæsning påkrævet diff --git a/core/assets/bundles/bundle_de.properties b/core/assets/bundles/bundle_de.properties index 4713fb1e5a..75d4484fce 100644 --- a/core/assets/bundles/bundle_de.properties +++ b/core/assets/bundles/bundle_de.properties @@ -166,7 +166,6 @@ mod.requiresversion = Benötigt Spielversion: [red]{0} mod.errors = Beim Laden von Inhalt sind Fehler aufgetreten. mod.noerrorplay = [red]Du hast Mods mit Fehlern.[] Deaktiviere die Mods oder behebe die Fehler, bevor du spielst. -mod.nowdisabled = [red]Mod '{0}' fehlen Abhängigkeiten:[accent] {1}\n[lightgray]Diese Mods müssen erst installiert werden.\nDieser Mod wird automatisch deaktiviert. mod.enable = Aktivieren mod.requiresrestart = Das Spiel wird jetzt beendet, um die Mod-Änderungen anzuwenden. mod.reloadrequired = [red]Neuladen benötigt diff --git a/core/assets/bundles/bundle_es.properties b/core/assets/bundles/bundle_es.properties index ce0c335822..1417f98184 100644 --- a/core/assets/bundles/bundle_es.properties +++ b/core/assets/bundles/bundle_es.properties @@ -163,7 +163,6 @@ mod.incompletedependencies.details = Este mod no se puede cargar debido a depend mod.requiresversion = Requiere la versión del juego: [red]{0} mod.errors = Ha ocurrido un fallo al cargar el contenido. mod.noerrorplay = [scarlet]Se están ejecutando algunos mods con fallos.[]Debes deshabilitarlos o arreglar los errores antes de jugar. -mod.nowdisabled = [scarlet]El mod '{0}' necesita ejecutarse junto a otros mods de los que depende:[accent] {1}\n[lightgray]Es necesario descargar primero estos mods.\nEste mod se desactivará automaticamente. mod.enable = Activar mod.requiresrestart = El juego se cerrará para aplicar los cambios del mod. mod.reloadrequired = [scarlet]Es necesario reiniciar diff --git a/core/assets/bundles/bundle_et.properties b/core/assets/bundles/bundle_et.properties index 6e5dc5c842..1e860d5ac4 100644 --- a/core/assets/bundles/bundle_et.properties +++ b/core/assets/bundles/bundle_et.properties @@ -160,7 +160,6 @@ mod.incompletedependencies.details = This mod is unable to be loaded due to inva mod.requiresversion = Requires game version: [red]{0} mod.errors = Errors have occurred loading content. mod.noerrorplay = [scarlet]You have mods with errors.[] Either disable the affected mods or fix the errors before playing. -mod.nowdisabled = [scarlet]Mod '{0}' is missing dependencies:[accent] {1}\n[lightgray]These mods need to be downloaded first.\nThis mod will be automatically disabled. mod.enable = Enable mod.requiresrestart = The game will now close to apply the mod changes. mod.reloadrequired = [scarlet]Reload Required diff --git a/core/assets/bundles/bundle_eu.properties b/core/assets/bundles/bundle_eu.properties index 20dcfa9f68..785ab0981c 100644 --- a/core/assets/bundles/bundle_eu.properties +++ b/core/assets/bundles/bundle_eu.properties @@ -160,7 +160,6 @@ mod.incompletedependencies.details = This mod is unable to be loaded due to inva mod.requiresversion = Requires game version: [red]{0} mod.errors = Erroreak gertatu dira edukia kargatzean. mod.noerrorplay = [scarlet]Erroreak dituzten mod-ak dituzu.[] Desgaitu kaltetutako mod-ak edo konpondu erroreak jolastu aurretik. -mod.nowdisabled = [scarlet]'{0}' mod-ak menpekotasunak ditu faltan:[accent] {1}\n[lightgray]Aurretik beste mod hauek deskargatu behar dira.\nMod hau automatikoki desgaituko da. mod.enable = Gaitu mod.requiresrestart = Jolasa itxi egingo da mod-aren aldaketak aplikatzeko. mod.reloadrequired = [scarlet]Birkargatu behar da diff --git a/core/assets/bundles/bundle_fi.properties b/core/assets/bundles/bundle_fi.properties index b81ad76e72..effecd2f51 100644 --- a/core/assets/bundles/bundle_fi.properties +++ b/core/assets/bundles/bundle_fi.properties @@ -160,7 +160,6 @@ mod.incompletedependencies.details = This mod is unable to be loaded due to inva mod.requiresversion = Requires game version: [red]{0} mod.errors = Virheitä on tapahtunut pelin ladatessa. mod.noerrorplay = [scarlet]Sinulla on virheellisiä modeja.[] Joko poista ne käytöstä tai korjaa virheet. -mod.nowdisabled = [scarlet]Lisäosa '{0}' tarvitsee muita lisäosia toimiakseen:[accent] {1}\n[lightgray]Nämä lisäosat täytyy asentaa ensin.\nTämä lisäosa poistetaan automaattisesti käytöstä. mod.enable = Käytä mod.requiresrestart = Peli suljetaan jotta muutokset voisivat toteutua. mod.reloadrequired = [scarlet]Vaatii Uudelleenkäynnistystä diff --git a/core/assets/bundles/bundle_fil.properties b/core/assets/bundles/bundle_fil.properties index 18b9fd2aab..61a0df99e4 100644 --- a/core/assets/bundles/bundle_fil.properties +++ b/core/assets/bundles/bundle_fil.properties @@ -160,7 +160,6 @@ mod.incompletedependencies.details = This mod is unable to be loaded due to inva mod.requiresversion = Requires game version: [red]{0} mod.errors = May mga error na naitala habang ni-lo-load ang nilalaman. mod.noerrorplay = [scarlet]May mga mod kang may error.[] Maaaring 'wag munang paganahin ang mga apektadong mod o 'di kaya'y ayusin ang mga error bago maglaro. -mod.nowdisabled = [scarlet]Ang mod na '{0}' ay ma kulang na mga dependency:[accent] {1}\n[lightgray]Ang mga ito'y kinakailangang i-download muna.\nAng mod na'to ay kusang 'di papaganahin. mod.enable = Paganahin mod.requiresrestart = Ang laro'y magsasara upang mai-apply ang mga pagbabago sa mod. mod.reloadrequired = [scarlet]Kinakalingang I-restart diff --git a/core/assets/bundles/bundle_fr.properties b/core/assets/bundles/bundle_fr.properties index 3ff26c05c4..68452ca1ec 100644 --- a/core/assets/bundles/bundle_fr.properties +++ b/core/assets/bundles/bundle_fr.properties @@ -167,7 +167,6 @@ mod.requiresversion = Requiert la version: [red]{0} mod.errors = Des erreurs se sont produites lors du chargement du contenu. mod.noerrorplay = [scarlet]Vous avez des mods avec des erreurs.[] Désactivez les mods concernés ou corrigez les erreurs avant de jouer. -mod.nowdisabled = [scarlet]Le mod '{0}' a des dépendances manquantes: [accent]{1}\n[lightgray]Ces mods doivent d'abord être téléchargés.\nCe mod sera automatiquement désactivé. mod.enable = Activer mod.requiresrestart = Le jeu va maintenant se fermer pour appliquer les modifications du mod. mod.reloadrequired = [scarlet]Redémarrage requis diff --git a/core/assets/bundles/bundle_hu.properties b/core/assets/bundles/bundle_hu.properties index b04b225ac8..fb98bd1553 100644 --- a/core/assets/bundles/bundle_hu.properties +++ b/core/assets/bundles/bundle_hu.properties @@ -167,7 +167,6 @@ mod.requiresversion = Szükséges játékverzió: [red]{0}[] mod.errors = Hiba történt a tartalom betöltése közben. mod.noerrorplay = [red]Hibákkal rendelkező modjaid vannak.[] Kapcsold ki, vagy javítsd ki őket a játék előtt. -mod.nowdisabled = [red]A(z) „{0}” modnak nincs megfelelő függősége:[accent] {1}\n[lightgray]Ezeket előbb le kell tölteni.\nEz a mod automatikusan ki lesz kapcsolva. mod.enable = Engedélyezés mod.requiresrestart = A játék kilép a módosítások alkalmazásához. mod.reloadrequired = [red]Újraindítás szükséges diff --git a/core/assets/bundles/bundle_id_ID.properties b/core/assets/bundles/bundle_id_ID.properties index e42084a3a7..b3f6c355d5 100644 --- a/core/assets/bundles/bundle_id_ID.properties +++ b/core/assets/bundles/bundle_id_ID.properties @@ -163,7 +163,6 @@ mod.incompletedependencies.details = This mod is unable to be loaded due to inva mod.requiresversion = Requires game version: [red]{0} mod.errors = Terjadi kesalahan saat memuat konten. mod.noerrorplay = [scarlet]Anda memiliki mod dengan suatu kesalahan.[] Nonaktifkan mod yang bersangkutan atau perbaiki kesalahan tersebut sebelum bermain. -mod.nowdisabled = [scarlet]Mod '{0}' tidak memiliki ketergantungan:[accent] {1}\n[lightgray]Mod ini harus diunduh terlebih dahulu.\nMod ini akan dinonaktifkan secara otomatis. mod.enable = Aktifkan mod.requiresrestart = Game akan keluar untuk mengaktifkan perubahan mod. mod.reloadrequired = [scarlet]Muat Ulang Diperlukan diff --git a/core/assets/bundles/bundle_it.properties b/core/assets/bundles/bundle_it.properties index 6383c512ca..11eb629da4 100644 --- a/core/assets/bundles/bundle_it.properties +++ b/core/assets/bundles/bundle_it.properties @@ -161,7 +161,6 @@ mod.incompletedependencies.details = This mod is unable to be loaded due to inva mod.requiresversion = Requires game version: [red]{0} mod.errors = Si sono verificati degli errori durante il caricamento del contenuto. mod.noerrorplay = [scarlet]Sono presenti delle mod con errori.[] Puoi disabilitare le mod affette oppure sistemarle prima di giocare. -mod.nowdisabled = [scarlet]Alla mod '{0}' mancano delle dipendenze:[accent] {1}\n[lightgray]Queste mod devono essere scaricate prima.\nQuesta mod verrà disabilitata automaticamente. mod.enable = Abilita mod.requiresrestart = Il gioco verrà chiuso per applicare i cambiamenti. mod.reloadrequired = [scarlet]Riavvio necessario diff --git a/core/assets/bundles/bundle_ja.properties b/core/assets/bundles/bundle_ja.properties index ed0dc7cc69..748be30899 100644 --- a/core/assets/bundles/bundle_ja.properties +++ b/core/assets/bundles/bundle_ja.properties @@ -163,7 +163,6 @@ mod.incompletedependencies.details = 依存関係が無効または欠損して mod.requiresversion = ゲームのバージョンが必要です: [red]{0} mod.errors = コンテンツの読み込み中にエラーが発生しました。 mod.noerrorplay = [scarlet]以下のModにエラーがあります。[] Modを無効化するか、エラーを修正してください。 -mod.nowdisabled = [scarlet]{0} 依存関係がありません。:[accent] {1}\n[lightgray]これらのModをダウンロードし有効化する必要があります。\nなお、このModは自動的に無効化されます。 mod.enable = 有効化 mod.requiresrestart = このModをインストールするためにはゲームの再起動が必要です。 mod.reloadrequired = [scarlet]Modを有効にするには、この画面を開き直してください。 diff --git a/core/assets/bundles/bundle_ko.properties b/core/assets/bundles/bundle_ko.properties index 2ec87a4548..8d6d6d4400 100644 --- a/core/assets/bundles/bundle_ko.properties +++ b/core/assets/bundles/bundle_ko.properties @@ -163,7 +163,6 @@ mod.incompletedependencies.details = 잘못되었거나 누락한 종속성으 mod.requiresversion = 필요한 게임 버전: [red]{0} mod.errors = 콘텐츠를 불러오는 중에 오류가 발생함 mod.noerrorplay = [scarlet]오류가 있는 모드가 있습니다.[] 영향을 받는 모드를 비활성화하거나 플레이하기 전에 오류를 수정하세요. -mod.nowdisabled = [scarlet]모드 '{0}'에 필요한 종속성이 없습니다:[accent] {1}\n[lightgray]이 모드를 먼저 내려받아야 합니다.\n이 모드는 자동으로 비활성화됩니다. mod.enable = 활성화 mod.requiresrestart = 모드 변경 사항을 적용하기 위해 게임을 종료합니다. mod.reloadrequired = [scarlet]재시작 필요 diff --git a/core/assets/bundles/bundle_lt.properties b/core/assets/bundles/bundle_lt.properties index 90cb6efbf4..7b45b3d53b 100644 --- a/core/assets/bundles/bundle_lt.properties +++ b/core/assets/bundles/bundle_lt.properties @@ -160,7 +160,6 @@ mod.incompletedependencies.details = This mod is unable to be loaded due to inva mod.requiresversion = Requires game version: [red]{0} mod.errors = Įvyko klaida kraunant turinį. mod.noerrorplay = [scarlet]Turite modifikacijas su klaidomis.[] Išjunkite modifikacijas su klaidomis arba patasykite jas prieš žaidžiant. -mod.nowdisabled = [scarlet]Modifikacijai '{0}' trūksta priklausomybių:[accent] {1}\n[lightgray] Šios modifikacijos turi būti atsisiųstos.\nŠi modifikacija bus automatiškai išjungta. mod.enable = Įjungti mod.requiresrestart = Žaidimas dabar išsijungs modifikacijų pakeitimui. mod.reloadrequired = [scarlet]Privalomas perkrovimas diff --git a/core/assets/bundles/bundle_nl.properties b/core/assets/bundles/bundle_nl.properties index fb69dc8371..3548a35b37 100644 --- a/core/assets/bundles/bundle_nl.properties +++ b/core/assets/bundles/bundle_nl.properties @@ -167,7 +167,6 @@ mod.requiresversion = Vereist spelversie: [red]{0} mod.errors = Er hebben zich fouten voordaan tijdens het laden van de inhoud. mod.noerrorplay = [red]Je mods bevatten fouten.[] Zet de mods uit of los de problemen op voordat je verder gaat met spelen. -mod.nowdisabled = [red]Mod '{0}' mist een aantal benodigdheden:[accent] {1}\n[lightgray]Deze moet je eerst zelf downloaden.\nDeze mod is nu voor je uitgezet. mod.enable = Activeer mod.requiresrestart = Het spel zal nu afsluiten om de veranderingen aan de mods door te voeren. mod.reloadrequired = [scarlet]Herstart Vereist diff --git a/core/assets/bundles/bundle_nl_BE.properties b/core/assets/bundles/bundle_nl_BE.properties index 1f345b97e0..6c6b699025 100644 --- a/core/assets/bundles/bundle_nl_BE.properties +++ b/core/assets/bundles/bundle_nl_BE.properties @@ -160,7 +160,6 @@ mod.incompletedependencies.details = This mod is unable to be loaded due to inva mod.requiresversion = Requires game version: [red]{0} mod.errors = Errors have occurred loading content. mod.noerrorplay = [scarlet]You have mods with errors.[] Either disable the affected mods or fix the errors before playing. -mod.nowdisabled = [scarlet]De volgende vereisten ontbreken voor mod '{0}':[accent] {1}\n[lightgray]Deze mods moeten eerst gedownload worden.\nDeze mod wordt automatisch uitgeschakeld. mod.enable = Schakel in mod.requiresrestart = The game will now close to apply the mod changes. mod.reloadrequired = [scarlet]Herladen Vereist diff --git a/core/assets/bundles/bundle_pl.properties b/core/assets/bundles/bundle_pl.properties index 53e9cf4317..8d7c24f294 100644 --- a/core/assets/bundles/bundle_pl.properties +++ b/core/assets/bundles/bundle_pl.properties @@ -163,7 +163,6 @@ mod.incompletedependencies.details = Moda nie da się załadować z powodu niepo mod.requiresversion = Wymagana wersja gry: [red]{0} mod.errors = Wystąpił błąd podczas ładowania treści. mod.noerrorplay = [scarlet]Twoje mody zawierają błędy.[] Wyłącz je lub napraw błędy przed rozpoczęciem gry. -mod.nowdisabled = [scarlet]Brakuje zależności dla moda '{0}':[accent] {1}\n[lightgray]Najpierw trzeba ściągnąć te mody.\nMod zostanie automatycznie wyłączony. mod.enable = Włącz mod.requiresrestart = Gra zostanie wyłączona aby wprowadzić zmiany w modzie. mod.reloadrequired = [scarlet]Wymagany restart diff --git a/core/assets/bundles/bundle_pt_BR.properties b/core/assets/bundles/bundle_pt_BR.properties index 4ba31c527b..122c01975c 100644 --- a/core/assets/bundles/bundle_pt_BR.properties +++ b/core/assets/bundles/bundle_pt_BR.properties @@ -163,7 +163,6 @@ mod.incompletedependencies.details = Este mod não pode ser carregado devido a d mod.requiresversion = Requer a versão do jogo: [red]{0} mod.errors = Ocorreram erros ao carregar o conteúdo. mod.noerrorplay = [scarlet]Você tem mods com erros.[] Desative os mods afetados ou conserte os erros antes de jogar. -mod.nowdisabled = [scarlet]O Mod '{0}' está com dependências ausentes:[accent] {1}\n[lightgray]Esses Mods precisam ser baixados primeiro.\nEsse Mod será desativado automaticamente. mod.enable = Ativar mod.requiresrestart = O jogo irá fechar para aplicar as mudanças do mod. mod.reloadrequired = [scarlet]Recarregamento necessário diff --git a/core/assets/bundles/bundle_pt_PT.properties b/core/assets/bundles/bundle_pt_PT.properties index 1780792fe3..63e30ed2b7 100644 --- a/core/assets/bundles/bundle_pt_PT.properties +++ b/core/assets/bundles/bundle_pt_PT.properties @@ -160,7 +160,6 @@ mod.incompletedependencies.details = This mod is unable to be loaded due to inva mod.requiresversion = Requires game version: [red]{0} mod.errors = Ocorreram erros ao carregar o conteúdo. mod.noerrorplay = [scarlet]Tens mods com erros.[] Desative os mods afetados ou corrija os erros antes de jogar. -mod.nowdisabled = [scarlet]Mod '{0}' está faltando dependências:[accent] {1}\n[lightgray]Esses mods precisam ser baixados primeiro. NEste mod será automaticamente desativado mod.enable = Ativar mod.requiresrestart = O jogo será fechado agora para aplicar as alterações no mod. mod.reloadrequired = [scarlet]É necessario recarregar diff --git a/core/assets/bundles/bundle_ro.properties b/core/assets/bundles/bundle_ro.properties index b2db9b66cd..373ce822d3 100644 --- a/core/assets/bundles/bundle_ro.properties +++ b/core/assets/bundles/bundle_ro.properties @@ -163,7 +163,6 @@ mod.incompletedependencies.details = This mod is unable to be loaded due to inva mod.requiresversion = Requires game version: [red]{0} mod.errors = Au apărut erori la încărcarea conținutului. mod.noerrorplay = [scarlet]Modurile tale au erori.[] Dezactivează modurile afectate sau repară erorile înainte să joci. -mod.nowdisabled = [scarlet]Modul '{0}' are dependențe lipsă:[accent] {1}\n[lightgray]Mai întâi trebuie să descarci aceste moduri.\nAcest mod va fi dezactivat automat. mod.enable = Activează mod.requiresrestart = Jocul se va închide acum pt a aplica modificările modurilor. mod.reloadrequired = [scarlet]E Nevoie de o Repornire diff --git a/core/assets/bundles/bundle_ru.properties b/core/assets/bundles/bundle_ru.properties index ae8defc92e..e11e611290 100644 --- a/core/assets/bundles/bundle_ru.properties +++ b/core/assets/bundles/bundle_ru.properties @@ -164,7 +164,6 @@ mod.incompletedependencies.details = Этот мод не может быть з mod.requiresversion = Требуется версия игры: [red]{0} mod.errors = Ошибки были вызваны загружаемым содержимым. mod.noerrorplay = [scarlet]У Вас есть модификации с ошибками.[] Выключите проблемные модификации или исправьте ошибки перед игрой. -mod.nowdisabled = [scarlet]Модификации '{0}' требуются родительские модификации:[accent] {1}\n[lightgray]Сначала нужно загрузить их.\nЭта модификация будет автоматически отключена. mod.enable = Вкл. mod.requiresrestart = Теперь игра закроется, чтобы применить изменения в модификациях. mod.reloadrequired = [scarlet]Необходим перезапуск diff --git a/core/assets/bundles/bundle_sr.properties b/core/assets/bundles/bundle_sr.properties index 57e10040b7..8bb1e32129 100644 --- a/core/assets/bundles/bundle_sr.properties +++ b/core/assets/bundles/bundle_sr.properties @@ -163,7 +163,6 @@ mod.incompletedependencies.details = This mod is unable to be loaded due to inva mod.requiresversion = Requires game version: [red]{0} mod.errors = Greške su nastale tokom učitavanja sadržaja. mod.noerrorplay = [scarlet]Imate modove sa greškama.[] Onemogućite te modove, ili ispravite greške. -mod.nowdisabled = [scarlet]Mod '{0}'nema potrebne zavisne modove:[accent] {1}\n[lightgray]Ove modove treba instalirati prvo.\nMod se automatski onemogućava. mod.enable = Omogući mod.requiresrestart = Igra će se zatvoriti da ažurira modove. mod.reloadrequired = [scarlet]Ponovno pokretanje potrebno diff --git a/core/assets/bundles/bundle_sv.properties b/core/assets/bundles/bundle_sv.properties index 2268e25ca8..941b7f4bf4 100644 --- a/core/assets/bundles/bundle_sv.properties +++ b/core/assets/bundles/bundle_sv.properties @@ -160,7 +160,6 @@ mod.incompletedependencies.details = This mod is unable to be loaded due to inva mod.requiresversion = Requires game version: [red]{0} mod.errors = Fel har inträffat under laddning av innehåll. mod.noerrorplay = [scarlet]Du har moddar med fel.[] Stäng antingen av de drabbade moddarna eller fixa felen innan du spelar. -mod.nowdisabled = [scarlet]Mod '{0}' saknar beroenden:[accent] {1}\n[lightgray]Dessa mods måste laddas ned först.\nDetta mod kommer att inaktiveras automatiskt. mod.enable = Aktivera mod.requiresrestart = Spelet kommer nu att stängas av för att tillämpa mod ändringarna. mod.reloadrequired = [scarlet]Omstart krävs diff --git a/core/assets/bundles/bundle_th.properties b/core/assets/bundles/bundle_th.properties index 91573f01ba..2b1ef434fb 100644 --- a/core/assets/bundles/bundle_th.properties +++ b/core/assets/bundles/bundle_th.properties @@ -163,7 +163,6 @@ mod.incompletedependencies.details = ม็อดนี้ไม่สามา mod.requiresversion = ต้องการเวอร์ชั่นเกม: [red]{0} mod.errors = มีข้อผิดพลาดเกิดขึ้นระหว่างโหลดเนื้อหา mod.noerrorplay = [scarlet]คุณมีม็อดที่มีข้อผิดพลาด[] กรุณาปิดม็อดนั้นๆ หรือแก้ไขข้อผิดพลาดก่อนที่จะเล่น -mod.nowdisabled = [scarlet]ม็อด '{0}' ขาดม็อดพื่งพา:[accent] {1}\n[lightgray]จำเป็นต้องโหลดม็อดพวกนี้ก่อน\nม็อดนี้จะถูกปิดใช้งานโดยอัตโนมัติ mod.enable = เปิดใช้งาน mod.requiresrestart = เกมจะปิดตัวลงเพื่อติดตั้งม็อด mod.reloadrequired = [scarlet]จำเป็นต้องรีโหลด diff --git a/core/assets/bundles/bundle_tk.properties b/core/assets/bundles/bundle_tk.properties index f2922470e8..2283a71fee 100644 --- a/core/assets/bundles/bundle_tk.properties +++ b/core/assets/bundles/bundle_tk.properties @@ -160,7 +160,6 @@ mod.incompletedependencies.details = This mod is unable to be loaded due to inva mod.requiresversion = Requires game version: [red]{0} mod.errors = Errors have occurred loading content. mod.noerrorplay = [scarlet]You have mods with errors.[] Either disable the affected mods or fix the errors before playing. -mod.nowdisabled = [scarlet]Mod '{0}' is missing dependencies:[accent] {1}\n[lightgray]These mods need to be downloaded first.\nThis mod will be automatically disabled. mod.enable = Enable mod.requiresrestart = The game will now close to apply the mod changes. mod.reloadrequired = [scarlet]Reload Required diff --git a/core/assets/bundles/bundle_tr.properties b/core/assets/bundles/bundle_tr.properties index 9a9ecead53..c721ab44ea 100644 --- a/core/assets/bundles/bundle_tr.properties +++ b/core/assets/bundles/bundle_tr.properties @@ -163,7 +163,6 @@ mod.incompletedependencies.details = Eksik veya yanlış bağlılıklardan dolay mod.requiresversion = Şu oyun sürümü gerekiyor: [red]{0} mod.errors = İçerik yüklenirken bir hata oluştu. mod.noerrorplay = [scarlet]Hatalı modlarınız var.[] Oynamadan önce bu modları devre dışı bırakın veya dosyadaki hataları düzeltin. -mod.nowdisabled = [scarlet]'{0}' modunun çalışması için gerekli olan modlardan bazıları bulunamadı:[accent] {1}\n[lightgray]Önce bu modların indirilmesi gerekmektedir.\nBu mod otomatik olarak devre dışı bırakılacaktır. mod.enable = Etkinleştir mod.requiresrestart = Oyun mod değişikliklerini uygulamak için kapatılacak. mod.reloadrequired = [scarlet]Yeniden Yükleme Gerekli diff --git a/core/assets/bundles/bundle_uk_UA.properties b/core/assets/bundles/bundle_uk_UA.properties index 24a8cf4738..223ae02b38 100644 --- a/core/assets/bundles/bundle_uk_UA.properties +++ b/core/assets/bundles/bundle_uk_UA.properties @@ -165,7 +165,6 @@ mod.incompletedependencies.details = Цей мод неможливо заван mod.requiresversion = Необхідна версія гри: [red]{0} mod.errors = Виникли помилки під час завантаження змісту. mod.noerrorplay = [red]Ви маєте модифікації з помилками.[] Або вимкніть проблемні модифікації, або виправте їх. -mod.nowdisabled = [red]Модифікації «{0}» не вистачає залежних модифікацій:[accent] {1}\n[lightgray]Ці модифікації потрібно завантажити спочатку.\nЦя модифікація буде автоматично вимкнена. mod.enable = Увімкнути mod.requiresrestart = А тепер гра закриється, щоби застосувати зміни модифікацій. mod.reloadrequired = [red]Потрібно перезавантаження diff --git a/core/assets/bundles/bundle_vi.properties b/core/assets/bundles/bundle_vi.properties index 7856f9339e..cbc5e31e80 100644 --- a/core/assets/bundles/bundle_vi.properties +++ b/core/assets/bundles/bundle_vi.properties @@ -167,7 +167,6 @@ mod.requiresversion = Yêu cầu phiên bản trò chơi: [red]{0} mod.errors = Đã xảy ra lỗi khi tải nội dung. mod.noerrorplay = [red]Bạn có mod bị lỗi.[]Tắt các mod bị lỗi hoặc sửa các lỗi trước khi chơi. -mod.nowdisabled = [red]Mod '{0}' cần mod này để chạy:[accent] {1}\n[lightgray]Trước tiên bạn cần tải các mod này xuống.\nBản mod này sẽ tự động tắt. mod.enable = Bật mod.requiresrestart = Trò chơi sẽ đóng để áp dụng các thay đổi của mod. mod.reloadrequired = [scarlet]Yêu cầu khởi động lại diff --git a/core/assets/bundles/bundle_zh_CN.properties b/core/assets/bundles/bundle_zh_CN.properties index a908d005a5..e7fa486b15 100644 --- a/core/assets/bundles/bundle_zh_CN.properties +++ b/core/assets/bundles/bundle_zh_CN.properties @@ -166,7 +166,6 @@ mod.requiresversion = 需要游戏版本: [red]{0} mod.errors = 读取内容时发生错误。 mod.noerrorplay = [scarlet]您的模组发生了错误。 []禁用相关模组或修复错误后才能进入游戏。 -mod.nowdisabled = [scarlet]“{0}”模组缺少依赖的其他模组:[accent]{1}\n[lightgray]需要先下载上述模组。 \n此模组现在将被自动禁用。 mod.enable = 启用 mod.requiresrestart = 游戏将退出以应用模组修改。 mod.reloadrequired = [scarlet]需要重启 diff --git a/core/assets/bundles/bundle_zh_TW.properties b/core/assets/bundles/bundle_zh_TW.properties index 049f543412..15796248d0 100644 --- a/core/assets/bundles/bundle_zh_TW.properties +++ b/core/assets/bundles/bundle_zh_TW.properties @@ -163,7 +163,6 @@ mod.incompletedependencies.details = This mod is unable to be loaded due to inva mod.requiresversion = Requires game version: [red]{0} mod.errors = 載入內容時發生錯誤 mod.noerrorplay = [scarlet]你使用了有問題的模組。[] 遊戲前請先停用相關模組或修正問題。 -mod.nowdisabled = [scarlet]「{0}」模組缺少依賴關係:[accent] {1}\n[lightgray]必須先下載這些模組。\n此模組將被自動停用。 mod.enable = 啟用 mod.requiresrestart = 遊戲將立即關閉以套用模組變更。 mod.reloadrequired = [scarlet]需要重新載入 From bfa329db1115c9665c532d7b01a7fc2184ac4007 Mon Sep 17 00:00:00 2001 From: MEEPofFaith <54301439+MEEPofFaith@users.noreply.github.com> Date: Mon, 22 Apr 2024 09:11:08 -0700 Subject: [PATCH 053/460] Incorrectly shows dialog when mods with missing dependencies are disabled --- core/src/mindustry/mod/Mods.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/src/mindustry/mod/Mods.java b/core/src/mindustry/mod/Mods.java index 5e3809144a..d05d3ec494 100644 --- a/core/src/mindustry/mod/Mods.java +++ b/core/src/mindustry/mod/Mods.java @@ -648,7 +648,7 @@ public class Mods implements Loadable{ } //show list of missing dependencies - if(mods.contains(LoadedMod::hasUnmetDependencies)){ + if(mods.contains(mod -> mod.shouldBeEnabled() && mod.hasUnmetDependencies())){ ui.loadfrag.hide(); new Dialog(""){{ setFillParent(true); From b167bcfbefb1f91e443c188dcd59831454cb270d Mon Sep 17 00:00:00 2001 From: MEEPofFaith <54301439+MEEPofFaith@users.noreply.github.com> Date: Mon, 22 Apr 2024 09:17:28 -0700 Subject: [PATCH 054/460] Check for dependencies when importing a mod --- core/assets/bundles/bundle.properties | 1 + core/src/mindustry/mod/Mods.java | 34 +++++++++++++++---- core/src/mindustry/ui/dialogs/ModsDialog.java | 1 + 3 files changed, 29 insertions(+), 7 deletions(-) diff --git a/core/assets/bundles/bundle.properties b/core/assets/bundles/bundle.properties index 2f3e5d531b..38c7296c32 100644 --- a/core/assets/bundles/bundle.properties +++ b/core/assets/bundles/bundle.properties @@ -187,6 +187,7 @@ mod.dependencies.download = Auto-Import mod.dependencies.status = Import Results mod.dependencies.success = Successfully downloaded: mod.dependencies.failure = Failed to download: +mod.dependencies.imported = This mod requires dependencies. Download? about.button = About name = Name: diff --git a/core/src/mindustry/mod/Mods.java b/core/src/mindustry/mod/Mods.java index d05d3ec494..285e9e2526 100644 --- a/core/src/mindustry/mod/Mods.java +++ b/core/src/mindustry/mod/Mods.java @@ -680,17 +680,21 @@ public class Mods implements Loadable{ mods.each(mod -> mod.shouldBeEnabled() && mod.hasUnmetDependencies(), mod -> { mod.missingDependencies.each(toImport::addUnique); }); - Seq remaining = toImport.copy(); - ui.mods.importDependencies(remaining, () -> { - toImport.removeAll(remaining); - displayDependencyImportStatus(remaining, toImport); - }); + downloadDependencies(toImport, true); }).size(150, 50); }}.show(); } } - private void displayDependencyImportStatus(Seq failed, Seq success){ + private void downloadDependencies(Seq toImport, boolean startup){ + Seq remaining = toImport.copy(); + ui.mods.importDependencies(remaining, () -> { + toImport.removeAll(remaining); + displayDependencyImportStatus(remaining, toImport, startup); + }); + } + + private void displayDependencyImportStatus(Seq failed, Seq success, boolean startup){ new Dialog(""){{ setFillParent(true); cont.margin(15); @@ -726,7 +730,7 @@ public class Mods implements Loadable{ }).fillX(); cont.row(); - if(success.any()){ + if(startup && success.any()){ cont.image().width(300f).pad(2).height(4f).color(Color.lightGray); cont.row(); cont.add("@mods.reloadexit").center(); @@ -973,6 +977,22 @@ public class Mods implements Loadable{ return result; } + /** Checks if a newly imported mod's dependencies are already added. */ + public void checkImportDependencies(LoadedMod mod){ + if(mod.meta.dependencies.isEmpty()) return; + Seq missing = mod.meta.dependencies.select(m -> getMod(m) == null); + if(missing.isEmpty()) return; + StringBuilder list = new StringBuilder(); + for(int i = 0; i < missing.size; i++){ + if(i > 0) list.append("\n"); + list.append(missing.get(i)); + } + + ui.showConfirm("@mod.dependencies.imported", list.toString(), () -> { + downloadDependencies(missing, false); + }); + } + private boolean resolve(String element, ModResolutionContext context){ context.visited.add(element); for(final var dependency : context.dependencies.get(element)){ diff --git a/core/src/mindustry/ui/dialogs/ModsDialog.java b/core/src/mindustry/ui/dialogs/ModsDialog.java index dee0edc4b6..bd4cda3ef1 100644 --- a/core/src/mindustry/ui/dialogs/ModsDialog.java +++ b/core/src/mindustry/ui/dialogs/ModsDialog.java @@ -626,6 +626,7 @@ public class ModsDialog extends BaseDialog{ var mod = mods.importMod(file); mod.setRepo(repo); + mods.checkImportDependencies(mod); file.delete(); Core.app.post(() -> { From 15491afe498a4f044415d11f643379beaa5d6ae7 Mon Sep 17 00:00:00 2001 From: MEEPofFaith <54301439+MEEPofFaith@users.noreply.github.com> Date: Mon, 22 Apr 2024 09:42:13 -0700 Subject: [PATCH 055/460] Check all at once --- core/src/mindustry/mod/Mods.java | 102 +++++++++--------- core/src/mindustry/ui/dialogs/ModsDialog.java | 7 +- 2 files changed, 54 insertions(+), 55 deletions(-) diff --git a/core/src/mindustry/mod/Mods.java b/core/src/mindustry/mod/Mods.java index 285e9e2526..7a406d968d 100644 --- a/core/src/mindustry/mod/Mods.java +++ b/core/src/mindustry/mod/Mods.java @@ -50,6 +50,7 @@ public class Mods implements Loadable{ private ModClassLoader mainLoader = new ModClassLoader(getClass().getClassLoader()); Seq mods = new Seq<>(); + private Seq newImports = new Seq<>(); private ObjectMap, ModMeta> metas = new ObjectMap<>(); private boolean requiresReload; @@ -422,6 +423,7 @@ public class Mods implements Loadable{ return; } mods.remove(mod); + newImports.remove(mod); mod.dispose(); requiresReload = true; } @@ -648,53 +650,57 @@ public class Mods implements Loadable{ } //show list of missing dependencies - if(mods.contains(mod -> mod.shouldBeEnabled() && mod.hasUnmetDependencies())){ + Seq toCheck = mods.select(mod -> mod.shouldBeEnabled() && mod.hasUnmetDependencies()); + if(!toCheck.isEmpty()){ ui.loadfrag.hide(); - new Dialog(""){{ - setFillParent(true); - cont.margin(15); - cont.add("@mod.dependencies.error").colspan(2); - cont.row(); - cont.image().width(300f).colspan(2).pad(2).height(4f).color(Color.scarlet); - cont.row(); - cont.pane(p -> { - mods.each(mod -> mod.shouldBeEnabled() && mod.hasUnmetDependencies(), mod -> { - p.add(mod.meta.displayName).wrap().growX().left().labelAlign(Align.left); - p.row(); - p.table(d -> { - mod.missingDependencies.each(dep -> { - d.add(dep).wrap().growX().left().labelAlign(Align.left); - d.row(); - }); - }).growX().padBottom(8f).padLeft(12f); - p.row(); - }); - }).fillX().colspan(2); - - cont.row(); - - cont.button("@ok", this::hide).size(150, 50); - cont.button("@mod.dependencies.download", () -> { - hide(); - Seq toImport = new Seq<>(); - mods.each(mod -> mod.shouldBeEnabled() && mod.hasUnmetDependencies(), mod -> { - mod.missingDependencies.each(toImport::addUnique); - }); - downloadDependencies(toImport, true); - }).size(150, 50); - }}.show(); + checkDependencies(toCheck); } } - private void downloadDependencies(Seq toImport, boolean startup){ + private void checkDependencies(Seq toCheck){ + new Dialog(""){{ + setFillParent(true); + cont.margin(15); + cont.add("@mod.dependencies.error").colspan(2); + cont.row(); + cont.image().width(300f).colspan(2).pad(2).height(4f).color(Color.scarlet); + cont.row(); + cont.pane(p -> { + toCheck.each(mod -> { + p.add(mod.meta.displayName).wrap().growX().left().labelAlign(Align.left); + p.row(); + p.table(d -> { + mod.missingDependencies.each(dep -> { + d.add(dep).wrap().growX().left().labelAlign(Align.left); + d.row(); + }); + }).growX().padBottom(8f).padLeft(12f); + p.row(); + }); + }).fillX().colspan(2); + + cont.row(); + + cont.button("@ok", this::hide).size(150, 50); + cont.button("@mod.dependencies.download", () -> { + hide(); + Seq toImport = new Seq<>(); + toCheck.each(mod -> mod.missingDependencies.each(toImport::addUnique)); + downloadDependencies(toImport); + }).size(150, 50); + }}.show(); + } + + private void downloadDependencies(Seq toImport){ Seq remaining = toImport.copy(); ui.mods.importDependencies(remaining, () -> { toImport.removeAll(remaining); - displayDependencyImportStatus(remaining, toImport, startup); + if(toImport.any()) requiresReload = true; + displayDependencyImportStatus(remaining, toImport); }); } - private void displayDependencyImportStatus(Seq failed, Seq success, boolean startup){ + private void displayDependencyImportStatus(Seq failed, Seq success){ new Dialog(""){{ setFillParent(true); cont.margin(15); @@ -730,7 +736,7 @@ public class Mods implements Loadable{ }).fillX(); cont.row(); - if(startup && success.any()){ + if(success.any()){ cont.image().width(300f).pad(2).height(4f).color(Color.lightGray); cont.row(); cont.add("@mods.reloadexit").center(); @@ -746,11 +752,13 @@ public class Mods implements Loadable{ }}.show(); } - private void reload(){ - ui.showInfoOnHidden("@mods.reloadexit", () -> { + public void reload(){ + if(newImports.any()){ + checkDependencies(newImports); + }else{ Log.info("Exiting to reload mods."); Core.app.exit(); - }); + } } public boolean hasContentErrors(){ @@ -978,19 +986,13 @@ public class Mods implements Loadable{ } /** Checks if a newly imported mod's dependencies are already added. */ - public void checkImportDependencies(LoadedMod mod){ + public void loadImportDependencies(LoadedMod mod){ if(mod.meta.dependencies.isEmpty()) return; Seq missing = mod.meta.dependencies.select(m -> getMod(m) == null); if(missing.isEmpty()) return; - StringBuilder list = new StringBuilder(); - for(int i = 0; i < missing.size; i++){ - if(i > 0) list.append("\n"); - list.append(missing.get(i)); - } - ui.showConfirm("@mod.dependencies.imported", list.toString(), () -> { - downloadDependencies(missing, false); - }); + mod.missingDependencies = missing; + newImports.add(mod); } private boolean resolve(String element, ModResolutionContext context){ diff --git a/core/src/mindustry/ui/dialogs/ModsDialog.java b/core/src/mindustry/ui/dialogs/ModsDialog.java index bd4cda3ef1..f69dce3b16 100644 --- a/core/src/mindustry/ui/dialogs/ModsDialog.java +++ b/core/src/mindustry/ui/dialogs/ModsDialog.java @@ -362,10 +362,7 @@ public class ModsDialog extends BaseDialog{ } private void reload(){ - ui.showInfoOnHidden("@mods.reloadexit", () -> { - Log.info("Exiting to reload mods."); - Core.app.exit(); - }); + ui.showInfoOnHidden("@mods.reloadexit", () -> mods.reload()); } private void showMod(LoadedMod mod){ @@ -626,7 +623,7 @@ public class ModsDialog extends BaseDialog{ var mod = mods.importMod(file); mod.setRepo(repo); - mods.checkImportDependencies(mod); + mods.loadImportDependencies(mod); file.delete(); Core.app.post(() -> { From 9e234444f1154570b21e3d478196945296364c84 Mon Sep 17 00:00:00 2001 From: MEEPofFaith <54301439+MEEPofFaith@users.noreply.github.com> Date: Mon, 22 Apr 2024 09:52:01 -0700 Subject: [PATCH 056/460] Less clunky Don't display the reload exit message before checking dependencies. --- core/src/mindustry/mod/Mods.java | 7 +++++-- core/src/mindustry/ui/dialogs/ModsDialog.java | 6 +----- 2 files changed, 6 insertions(+), 7 deletions(-) diff --git a/core/src/mindustry/mod/Mods.java b/core/src/mindustry/mod/Mods.java index 7a406d968d..bee900aa23 100644 --- a/core/src/mindustry/mod/Mods.java +++ b/core/src/mindustry/mod/Mods.java @@ -657,6 +657,7 @@ public class Mods implements Loadable{ } } + /** Assume mods in toCheck are missing dependencies. */ private void checkDependencies(Seq toCheck){ new Dialog(""){{ setFillParent(true); @@ -756,8 +757,10 @@ public class Mods implements Loadable{ if(newImports.any()){ checkDependencies(newImports); }else{ - Log.info("Exiting to reload mods."); - Core.app.exit(); + ui.showInfoOnHidden("@mods.reloadexit", () -> { + Log.info("Exiting to reload mods."); + Core.app.exit(); + }); } } diff --git a/core/src/mindustry/ui/dialogs/ModsDialog.java b/core/src/mindustry/ui/dialogs/ModsDialog.java index f69dce3b16..0ec929d3e7 100644 --- a/core/src/mindustry/ui/dialogs/ModsDialog.java +++ b/core/src/mindustry/ui/dialogs/ModsDialog.java @@ -93,7 +93,7 @@ public class ModsDialog extends BaseDialog{ hidden(() -> { if(mods.requiresReload()){ - reload(); + mods.reload(); } }); @@ -361,10 +361,6 @@ public class ModsDialog extends BaseDialog{ return null; } - private void reload(){ - ui.showInfoOnHidden("@mods.reloadexit", () -> mods.reload()); - } - private void showMod(LoadedMod mod){ BaseDialog dialog = new BaseDialog(mod.meta.displayName); From d21cab42a798994195aa157922500b67a57be227 Mon Sep 17 00:00:00 2001 From: MEEPofFaith <54301439+MEEPofFaith@users.noreply.github.com> Date: Mon, 22 Apr 2024 14:13:55 -0700 Subject: [PATCH 057/460] Mention soft dependencies on install but not startup --- core/assets/bundles/bundle.properties | 4 ++- core/src/mindustry/mod/Mods.java | 50 ++++++++++++++++++++------- 2 files changed, 40 insertions(+), 14 deletions(-) diff --git a/core/assets/bundles/bundle.properties b/core/assets/bundles/bundle.properties index 38c7296c32..6c0ea8693d 100644 --- a/core/assets/bundles/bundle.properties +++ b/core/assets/bundles/bundle.properties @@ -183,7 +183,9 @@ mod.folder.missing = Only mods in folder form can be published on the workshop.\ mod.scripts.disable = Your device does not support mods with scripts. You must disable these mods to play the game. mod.dependencies.error = [scarlet]Mods are missing dependencies -mod.dependencies.download = Auto-Import +mod.dependencies.soft = (optional) +mod.dependencies.download = Import Required +mod.dependencies.downloadall = Import All mod.dependencies.status = Import Results mod.dependencies.success = Successfully downloaded: mod.dependencies.failure = Failed to download: diff --git a/core/src/mindustry/mod/Mods.java b/core/src/mindustry/mod/Mods.java index bee900aa23..8c72deecf2 100644 --- a/core/src/mindustry/mod/Mods.java +++ b/core/src/mindustry/mod/Mods.java @@ -533,13 +533,20 @@ public class Mods implements Loadable{ private void updateDependencies(LoadedMod mod){ mod.dependencies.clear(); mod.missingDependencies.clear(); + mod.missingSoftDependencies.clear(); mod.dependencies = mod.meta.dependencies.map(this::locateMod); + mod.softDependencies = mod.meta.softDependencies.map(this::locateMod); for(int i = 0; i < mod.dependencies.size; i++){ if(mod.dependencies.get(i) == null){ mod.missingDependencies.add(mod.meta.dependencies.get(i)); } } + for(int i = 0; i < mod.softDependencies.size; i++){ + if(mod.softDependencies.get(i) == null){ + mod.missingSoftDependencies.add(mod.meta.softDependencies.get(i)); + } + } } /** @return mods ordered in the correct way needed for dependencies. */ @@ -653,12 +660,12 @@ public class Mods implements Loadable{ Seq toCheck = mods.select(mod -> mod.shouldBeEnabled() && mod.hasUnmetDependencies()); if(!toCheck.isEmpty()){ ui.loadfrag.hide(); - checkDependencies(toCheck); + checkDependencies(toCheck, false); } } /** Assume mods in toCheck are missing dependencies. */ - private void checkDependencies(Seq toCheck){ + private void checkDependencies(Seq toCheck, boolean soft){ new Dialog(""){{ setFillParent(true); cont.margin(15); @@ -675,6 +682,12 @@ public class Mods implements Loadable{ d.add(dep).wrap().growX().left().labelAlign(Align.left); d.row(); }); + if(soft){ + mod.missingSoftDependencies.each(dep -> { + d.add(dep + " " + Core.bundle.get("mod.dependencies.soft")).wrap().growX().left().labelAlign(Align.left); + d.row(); + }); + } }).growX().padBottom(8f).padLeft(12f); p.row(); }); @@ -682,13 +695,22 @@ public class Mods implements Loadable{ cont.row(); - cont.button("@ok", this::hide).size(150, 50); - cont.button("@mod.dependencies.download", () -> { + cont.button("@cancel", this::hide).size(soft ? 100 : 150, 50); + cont.button(soft ? "@mod.dependencies.downloadall" : "@mod.dependencies.download", () -> { hide(); Seq toImport = new Seq<>(); toCheck.each(mod -> mod.missingDependencies.each(toImport::addUnique)); downloadDependencies(toImport); - }).size(150, 50); + }).size(soft ? 100 : 150, 50); + if(soft){ + cont.button("@mod.dependencies.downloadall", () -> { + hide(); + Seq toImport = new Seq<>(); + toCheck.each(mod -> mod.missingDependencies.each(toImport::addUnique)); + toCheck.each(mod -> mod.missingSoftDependencies.each(toImport::addUnique)); + downloadDependencies(toImport); + }).size(100, 50); + } }}.show(); } @@ -755,7 +777,7 @@ public class Mods implements Loadable{ public void reload(){ if(newImports.any()){ - checkDependencies(newImports); + checkDependencies(newImports, true); }else{ ui.showInfoOnHidden("@mods.reloadexit", () -> { Log.info("Exiting to reload mods."); @@ -990,12 +1012,10 @@ public class Mods implements Loadable{ /** Checks if a newly imported mod's dependencies are already added. */ public void loadImportDependencies(LoadedMod mod){ - if(mod.meta.dependencies.isEmpty()) return; - Seq missing = mod.meta.dependencies.select(m -> getMod(m) == null); - if(missing.isEmpty()) return; - - mod.missingDependencies = missing; - newImports.add(mod); + updateDependencies(mod); + if(mod.missingDependencies.any() || mod.missingSoftDependencies.any()){ + newImports.add(mod); + } } private boolean resolve(String element, ModResolutionContext context){ @@ -1168,8 +1188,12 @@ public class Mods implements Loadable{ public final ModMeta meta; /** This mod's dependencies as already-loaded mods. */ public Seq dependencies = new Seq<>(); - /** All missing dependencies of this mod as strings. */ + /** This mod's soft dependencies as already-loaded mods. */ + public Seq softDependencies = new Seq<>(); + /** All missing required dependencies of this mod as strings. */ public Seq missingDependencies = new Seq<>(); + /** All missing soft dependencies of this mod as strings. */ + public Seq missingSoftDependencies = new Seq<>(); /** Content with initialization code. */ public ObjectSet erroredContent = new ObjectSet<>(); /** Current state of this mod. */ From 3019eb24dc4616e0ebbe8550b4541b378fade46f Mon Sep 17 00:00:00 2001 From: MEEPofFaith <54301439+MEEPofFaith@users.noreply.github.com> Date: Mon, 22 Apr 2024 14:23:19 -0700 Subject: [PATCH 058/460] Slightly cleaner code --- core/src/mindustry/mod/Mods.java | 13 +++++-------- core/src/mindustry/ui/dialogs/ModsDialog.java | 1 - 2 files changed, 5 insertions(+), 9 deletions(-) diff --git a/core/src/mindustry/mod/Mods.java b/core/src/mindustry/mod/Mods.java index 8c72deecf2..e202a3ef52 100644 --- a/core/src/mindustry/mod/Mods.java +++ b/core/src/mindustry/mod/Mods.java @@ -117,6 +117,7 @@ public class Mods implements Loadable{ var loaded = loadMod(dest, true, true); mods.add(loaded); + newImports.add(loaded); //invalidate ordered mods cache lastOrderedMods = null; requiresReload = true; @@ -772,10 +773,14 @@ public class Mods implements Loadable{ } cont.button("@ok", this::hide).size(300, 50); + closeOnBack(); }}.show(); } public void reload(){ + newImports.each(this::updateDependencies); + newImports.remove(m -> m.missingDependencies.isEmpty() && m.softDependencies.isEmpty()); + if(newImports.any()){ checkDependencies(newImports, true); }else{ @@ -1010,14 +1015,6 @@ public class Mods implements Loadable{ return result; } - /** Checks if a newly imported mod's dependencies are already added. */ - public void loadImportDependencies(LoadedMod mod){ - updateDependencies(mod); - if(mod.missingDependencies.any() || mod.missingSoftDependencies.any()){ - newImports.add(mod); - } - } - private boolean resolve(String element, ModResolutionContext context){ context.visited.add(element); for(final var dependency : context.dependencies.get(element)){ diff --git a/core/src/mindustry/ui/dialogs/ModsDialog.java b/core/src/mindustry/ui/dialogs/ModsDialog.java index 0ec929d3e7..57ddbfe2bb 100644 --- a/core/src/mindustry/ui/dialogs/ModsDialog.java +++ b/core/src/mindustry/ui/dialogs/ModsDialog.java @@ -619,7 +619,6 @@ public class ModsDialog extends BaseDialog{ var mod = mods.importMod(file); mod.setRepo(repo); - mods.loadImportDependencies(mod); file.delete(); Core.app.post(() -> { From 6862e18cefe1e2560cde4b6e7b9e9ca6f267c6ac Mon Sep 17 00:00:00 2001 From: MEEPofFaith <54301439+MEEPofFaith@users.noreply.github.com> Date: Mon, 22 Apr 2024 14:29:47 -0700 Subject: [PATCH 059/460] Fix UI --- core/assets/bundles/bundle.properties | 3 ++- core/src/mindustry/mod/Mods.java | 15 ++++++++------- 2 files changed, 10 insertions(+), 8 deletions(-) diff --git a/core/assets/bundles/bundle.properties b/core/assets/bundles/bundle.properties index 6c0ea8693d..d4a7c35097 100644 --- a/core/assets/bundles/bundle.properties +++ b/core/assets/bundles/bundle.properties @@ -184,7 +184,8 @@ mod.scripts.disable = Your device does not support mods with scripts. You must d mod.dependencies.error = [scarlet]Mods are missing dependencies mod.dependencies.soft = (optional) -mod.dependencies.download = Import Required +mod.dependencies.download = Import +mod.dependencies.downloadreq = Import Required mod.dependencies.downloadall = Import All mod.dependencies.status = Import Results mod.dependencies.success = Successfully downloaded: diff --git a/core/src/mindustry/mod/Mods.java b/core/src/mindustry/mod/Mods.java index e202a3ef52..3df79fc3bd 100644 --- a/core/src/mindustry/mod/Mods.java +++ b/core/src/mindustry/mod/Mods.java @@ -670,9 +670,10 @@ public class Mods implements Loadable{ new Dialog(""){{ setFillParent(true); cont.margin(15); - cont.add("@mod.dependencies.error").colspan(2); + int span = soft ? 3 : 2; + cont.add("@mod.dependencies.error").colspan(span); cont.row(); - cont.image().width(300f).colspan(2).pad(2).height(4f).color(Color.scarlet); + cont.image().width(300f).colspan(span).pad(2).height(4f).color(Color.scarlet); cont.row(); cont.pane(p -> { toCheck.each(mod -> { @@ -692,17 +693,17 @@ public class Mods implements Loadable{ }).growX().padBottom(8f).padLeft(12f); p.row(); }); - }).fillX().colspan(2); + }).fillX().colspan(span); cont.row(); - cont.button("@cancel", this::hide).size(soft ? 100 : 150, 50); - cont.button(soft ? "@mod.dependencies.downloadall" : "@mod.dependencies.download", () -> { + cont.button("@cancel", this::hide).size(150, 50); + cont.button(soft ? "@mod.dependencies.downloadreq" : "@mod.dependencies.download", () -> { hide(); Seq toImport = new Seq<>(); toCheck.each(mod -> mod.missingDependencies.each(toImport::addUnique)); downloadDependencies(toImport); - }).size(soft ? 100 : 150, 50); + }).size(150, 50); if(soft){ cont.button("@mod.dependencies.downloadall", () -> { hide(); @@ -710,7 +711,7 @@ public class Mods implements Loadable{ toCheck.each(mod -> mod.missingDependencies.each(toImport::addUnique)); toCheck.each(mod -> mod.missingSoftDependencies.each(toImport::addUnique)); downloadDependencies(toImport); - }).size(100, 50); + }).size(150, 50); } }}.show(); } From 189a794e58172b75107bbd8c1c0aa876b83a55dd Mon Sep 17 00:00:00 2001 From: MEEPofFaith <54301439+MEEPofFaith@users.noreply.github.com> Date: Mon, 22 Apr 2024 14:32:03 -0700 Subject: [PATCH 060/460] Don't separate if no soft dependencies --- core/src/mindustry/mod/Mods.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/src/mindustry/mod/Mods.java b/core/src/mindustry/mod/Mods.java index 3df79fc3bd..50124ad585 100644 --- a/core/src/mindustry/mod/Mods.java +++ b/core/src/mindustry/mod/Mods.java @@ -783,7 +783,7 @@ public class Mods implements Loadable{ newImports.remove(m -> m.missingDependencies.isEmpty() && m.softDependencies.isEmpty()); if(newImports.any()){ - checkDependencies(newImports, true); + checkDependencies(newImports, newImports.contains(m -> m.softDependencies.any())); }else{ ui.showInfoOnHidden("@mods.reloadexit", () -> { Log.info("Exiting to reload mods."); From f95a7fd97fe46bed14155a9ae554ed7a862c3352 Mon Sep 17 00:00:00 2001 From: Shade Date: Sat, 4 May 2024 15:49:14 +0800 Subject: [PATCH 061/460] Eruption material requirements nerf 200 sil -> 300 sil 200 tung -> 250 tung 120 thor -> 150 thor 20 oxi remains the same --- core/src/mindustry/content/Blocks.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/src/mindustry/content/Blocks.java b/core/src/mindustry/content/Blocks.java index eaee7091a7..42585ea28a 100644 --- a/core/src/mindustry/content/Blocks.java +++ b/core/src/mindustry/content/Blocks.java @@ -2858,7 +2858,7 @@ public class Blocks{ }}; eruptionDrill = new BurstDrill("eruption-drill"){{ - requirements(Category.production, with(Items.silicon, 200, Items.oxide, 20, Items.tungsten, 200, Items.thorium, 120)); + requirements(Category.production, with(Items.silicon, 300, Items.oxide, 20, Items.tungsten, 250, Items.thorium, 150)); drillTime = 281.25f; size = 5; hasPower = true; From ec7a8f886d8b7bfe426e9a41bdb12deb5e11d91e Mon Sep 17 00:00:00 2001 From: Shade Date: Sat, 4 May 2024 16:01:58 +0800 Subject: [PATCH 062/460] bundles - impact and eruption --- core/assets/bundles/bundle.properties | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/core/assets/bundles/bundle.properties b/core/assets/bundles/bundle.properties index 260c5af651..5ab63ab096 100644 --- a/core/assets/bundles/bundle.properties +++ b/core/assets/bundles/bundle.properties @@ -2168,8 +2168,8 @@ block.vent-condenser.description = Condenses vent gases into water. Consumes pow block.plasma-bore.description = When placed facing an ore wall, outputs items indefinitely. Requires small amounts of power.\nOptionally uses hydrogen to boost efficiency. block.large-plasma-bore.description = A larger plasma bore. Capable of mining tungsten and thorium. Requires hydrogen and power.\nOptionally uses nitrogen to boost efficiency. block.cliff-crusher.description = Crushes walls, outputting sand indefinitely. Requires power. Efficiency varies based on type of wall. -block.impact-drill.description = When placed on ore, outputs items in bursts indefinitely. Requires power and water. -block.eruption-drill.description = An improved impact drill. Capable of mining thorium. Requires hydrogen. +block.impact-drill.description = When placed on ore, outputs items in bursts indefinitely. Requires power and water.\nOptionally uses ozone to boost efficiency. +block.eruption-drill.description = An improved impact drill. Capable of mining thorium. Requires hydrogen.\nOptionally uses cyanogen to boost efficiency. block.reinforced-conduit.description = Moves fluids forward. Doesn't accept non-conduit inputs to the sides. block.reinforced-liquid-router.description = Distributes fluids equally to all sides. block.reinforced-liquid-tank.description = Stores a large amount of fluids. From b8c9a05963ca0817451850853ae8c47395d2f11a Mon Sep 17 00:00:00 2001 From: code-explorer786 <68312688+code-explorer786@users.noreply.github.com> Date: Sun, 16 Jun 2024 14:13:10 +0700 Subject: [PATCH 063/460] LCanvas: jumps -> statements.jumps Original canvas.jumps is now a reference to canvas.statements.jumps. Please remove canvas.jumps in favour of canvas.statements.jumps in a future release. Thanks! --- core/src/mindustry/logic/LCanvas.java | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/core/src/mindustry/logic/LCanvas.java b/core/src/mindustry/logic/LCanvas.java index b78908ef6f..8924f68d4b 100644 --- a/core/src/mindustry/logic/LCanvas.java +++ b/core/src/mindustry/logic/LCanvas.java @@ -26,7 +26,7 @@ public class LCanvas extends Table{ public DragLayout statements; public ScrollPane pane; - public Group jumps; + public Group jumps; // compatibility StatementElem dragging; StatementElem hovered; @@ -106,14 +106,14 @@ public class LCanvas extends Table{ clear(); statements = new DragLayout(); - jumps = new WidgetGroup(); + jumps = statements.jumps; pane = pane(t -> { t.center(); t.add(statements).pad(2f).center().width(targetWidth); - t.addChild(jumps); + t.addChild(statements.jumps); - jumps.cullable = false; + statements.jumps.cullable = false; }).grow().get(); pane.setFlickScroll(false); pane.setScrollYForce(s); @@ -141,7 +141,7 @@ public class LCanvas extends Table{ } public void load(String asm){ - jumps.clear(); + statements.jumps.clear(); Seq statements = LAssembler.read(asm, privileged); statements.truncate(LExecutor.maxInstructions); @@ -158,7 +158,7 @@ public class LCanvas extends Table{ } public void clearStatements(){ - jumps.clear(); + statements.jumps.clear(); statements.clearChildren(); statements.layout(); } @@ -195,6 +195,7 @@ public class LCanvas extends Table{ Seq seq = new Seq<>(); int insertPosition = 0; boolean invalidated; + public Group jumps = new WidgetGroup(); { setTransform(true); From b58a6bb8d6de7dc85c9933e11b46eaeb639007a9 Mon Sep 17 00:00:00 2001 From: code-explorer786 <68312688+code-explorer786@users.noreply.github.com> Date: Wed, 26 Jun 2024 10:37:20 +0700 Subject: [PATCH 064/460] wip: different heights for jump arrows Note that this is very incomplete, for two different reasons: - it's O(n^2) or potentially worse - it makes the GC work hard (it invokes `new` in `LCanvas.DragLayout.layout()`) For the second reason this does not clearly fit the criteria of CONTRIBUTING.md, but I have yet to figure out ways to work around this (or make the algorithm more efficient). --- core/assets/bundles/bundle.properties | 1 + core/src/mindustry/logic/LCanvas.java | 93 ++++++++++++++++++- core/src/mindustry/logic/LStatements.java | 2 +- .../ui/dialogs/SettingsMenuDialog.java | 2 + 4 files changed, 94 insertions(+), 4 deletions(-) diff --git a/core/assets/bundles/bundle.properties b/core/assets/bundles/bundle.properties index 08f271d82d..22a9289eed 100644 --- a/core/assets/bundles/bundle.properties +++ b/core/assets/bundles/bundle.properties @@ -1225,6 +1225,7 @@ setting.bridgeopacity.name = Bridge Opacity setting.playerchat.name = Display Player Bubble Chat setting.showweather.name = Show Weather Graphics setting.hidedisplays.name = Hide Logic Displays +setting.dynamicjumpheights.name = Dynamic Jump Heights setting.macnotch.name = Adapt interface to display notch setting.macnotch.description = Restart required to apply changes steam.friendsonly = Friends Only diff --git a/core/src/mindustry/logic/LCanvas.java b/core/src/mindustry/logic/LCanvas.java index 8924f68d4b..417931e792 100644 --- a/core/src/mindustry/logic/LCanvas.java +++ b/core/src/mindustry/logic/LCanvas.java @@ -21,8 +21,10 @@ import mindustry.ui.*; public class LCanvas extends Table{ public static final int maxJumpsDrawn = 100; + private static final int invalidJump = Integer.MAX_VALUE; // terrible hack //ew static variables static LCanvas canvas; + private static boolean dynamicJumpHeights = false; public DragLayout statements; public ScrollPane pane; @@ -108,6 +110,8 @@ public class LCanvas extends Table{ statements = new DragLayout(); jumps = statements.jumps; + dynamicJumpHeights = Core.settings.getBool("dynamicjumpheights", false); + pane = pane(t -> { t.center(); t.add(statements).pad(2f).center().width(targetWidth); @@ -196,6 +200,7 @@ public class LCanvas extends Table{ int insertPosition = 0; boolean invalidated; public Group jumps = new WidgetGroup(); + private Seq processedJumps = new Seq(); { setTransform(true); @@ -251,13 +256,73 @@ public class LCanvas extends Table{ } } - if(parent != null) parent.invalidateHierarchy(); + if(dynamicJumpHeights) setJumpHeights(); + + if(parent != null) parent.invalidateHierarchy();//don't invalid self if(parent != null && parent instanceof Table){ setCullingArea(parent.getCullingArea()); } } + private void setJumpHeights(){ + SnapshotSeq jumpsChildren = jumps.getChildren(); + processedJumps.clear(); + jumpsChildren.each(e -> { + if(e instanceof JumpCurve e2){ + e2.prepareHeight(); + if(e2.jumpUIBegin != invalidJump){ + processedJumps.add(e2); + } + } + }); + processedJumps.sort((a,b) -> a.jumpUIBegin - b.jumpUIBegin); + + Seq occupiers = new Seq(); + Bits occupied = new Bits(); + for(int i = 0; i < processedJumps.size; i++){ + JumpCurve cur = processedJumps.get(i); + occupiers.retainAll(e -> { + if(e.jumpUIEnd > cur.jumpUIBegin) return true; + occupied.clear(e.predHeight); + return false; + }); + int h = getJumpHeight(i, occupiers, occupied); + occupiers.add(cur); + occupied.set(h); + } + } + + private int getJumpHeight(int index, Seq occupiers, Bits occupied){ + JumpCurve jmp = processedJumps.get(index); + if(jmp.markedDone) return jmp.predHeight; + + // TODO: optimize for LESS cloning + Seq tmpOccupiers = new Seq(occupiers); + Bits tmpOccupied = new Bits(); + tmpOccupied.set(occupied); + + int max = -1; + for(int i = index + 1; i < processedJumps.size; i++){ + JumpCurve cur = processedJumps.get(i); + if(cur.jumpUIEnd > jmp.jumpUIEnd) continue; + tmpOccupiers.retainAll(e -> { + if(e.jumpUIEnd > cur.jumpUIBegin) return true; + tmpOccupied.clear(e.predHeight); + return false; + }); + int h = getJumpHeight(i, tmpOccupiers, tmpOccupied); + tmpOccupiers.add(cur); + tmpOccupied.set(h); + max = Math.max(max, h); + } + + jmp.predHeight = occupied.nextClearBit(max + 1); + jmp.markedDone = true; + + return jmp.predHeight; + } + @Override public float getPrefWidth(){ return prefWidth; @@ -452,12 +517,14 @@ public class LCanvas extends Table{ ClickListener listener; public JumpCurve curve; + public StatementElem elem; - public JumpButton(Prov getter, Cons setter){ + public JumpButton(Prov getter, Cons setter, StatementElem elem){ super(Tex.logicNode, new ImageButtonStyle(){{ imageUpColor = Color.white; }}); + this.elem = elem; to = getter; addListener(listener = new ClickListener()); @@ -518,6 +585,11 @@ public class LCanvas extends Table{ public static class JumpCurve extends Element{ public JumpButton button; + // for jump prediction; see DragLayout + public int predHeight = 0; + public boolean markedDone = false; + public int jumpUIBegin = 0, jumpUIEnd = 0; + public JumpCurve(JumpButton button){ this.button = button; } @@ -575,7 +647,7 @@ public class LCanvas extends Table{ Lines.stroke(4f, button.color); Draw.alpha(parentAlpha); - float dist = 100f; + float dist = 100f + 100f * (float) predHeight; //square jumps if(false){ @@ -599,5 +671,20 @@ public class LCanvas extends Table{ x2, y2, Math.max(18, (int)(Mathf.dst(x, y, x2, y2) / 6))); } + + public void prepareHeight(){ + if(this.button.to.get() == null){ + this.markedDone = true; + this.predHeight = 0; + this.jumpUIBegin = this.jumpUIEnd = invalidJump; + } else { + this.markedDone = false; + int i = this.button.elem.index; + int j = this.button.to.get().index; + this.jumpUIBegin = Math.min(i,j); + this.jumpUIEnd = Math.max(i,j); + // height will be recalculated later + } + } } } diff --git a/core/src/mindustry/logic/LStatements.java b/core/src/mindustry/logic/LStatements.java index 9d8faa880a..1c03625234 100644 --- a/core/src/mindustry/logic/LStatements.java +++ b/core/src/mindustry/logic/LStatements.java @@ -870,7 +870,7 @@ public class LStatements{ table.table(this::rebuild); table.add().growX(); - table.add(new JumpButton(() -> dest, s -> dest = s)).size(30).right().padLeft(-8); + table.add(new JumpButton(() -> dest, s -> dest = s, this.elem)).size(30).right().padLeft(-8); String name = name(); diff --git a/core/src/mindustry/ui/dialogs/SettingsMenuDialog.java b/core/src/mindustry/ui/dialogs/SettingsMenuDialog.java index 01f7c05a53..04d2d93e61 100644 --- a/core/src/mindustry/ui/dialogs/SettingsMenuDialog.java +++ b/core/src/mindustry/ui/dialogs/SettingsMenuDialog.java @@ -502,6 +502,8 @@ public class SettingsMenuDialog extends BaseDialog{ if(!mobile){ Core.settings.put("swapdiagonal", false); } + + graphics.checkPref("dynamicjumpheights", true); } public void exportData(Fi file) throws IOException{ From 26105a64f144dbad8ae01a025aa004f1e80a6022 Mon Sep 17 00:00:00 2001 From: code-explorer786 <68312688+code-explorer786@users.noreply.github.com> Date: Thu, 27 Jun 2024 10:25:37 +0700 Subject: [PATCH 065/460] Use pools It feels hacky, but it works regardless. The GC should be working as hard as it was beforehand. --- core/src/mindustry/logic/LCanvas.java | 24 +++++++++++++++++++----- 1 file changed, 19 insertions(+), 5 deletions(-) diff --git a/core/src/mindustry/logic/LCanvas.java b/core/src/mindustry/logic/LCanvas.java index 417931e792..10e2e8279b 100644 --- a/core/src/mindustry/logic/LCanvas.java +++ b/core/src/mindustry/logic/LCanvas.java @@ -13,6 +13,7 @@ import arc.scene.ui.*; import arc.scene.ui.layout.*; import arc.struct.*; import arc.util.*; +import arc.util.pooling.*; import mindustry.*; import mindustry.gen.*; import mindustry.graphics.*; @@ -278,8 +279,10 @@ public class LCanvas extends Table{ }); processedJumps.sort((a,b) -> a.jumpUIBegin - b.jumpUIBegin); - Seq occupiers = new Seq(); - Bits occupied = new Bits(); + Seq occupiers = Pools.obtain(Seq.class, Seq::new); + Bits occupied = Pools.obtain(Bits.class, Bits::new); + occupiers.clear(); + occupied.clear(); for(int i = 0; i < processedJumps.size; i++){ JumpCurve cur = processedJumps.get(i); occupiers.retainAll(e -> { @@ -291,15 +294,21 @@ public class LCanvas extends Table{ occupiers.add(cur); occupied.set(h); } + + occupied.clear(); + occupiers.clear(); + Pools.free(occupied); + Pools.free(occupiers); } private int getJumpHeight(int index, Seq occupiers, Bits occupied){ JumpCurve jmp = processedJumps.get(index); if(jmp.markedDone) return jmp.predHeight; - // TODO: optimize for LESS cloning - Seq tmpOccupiers = new Seq(occupiers); - Bits tmpOccupied = new Bits(); + Seq tmpOccupiers = Pools.obtain(Seq.class, Seq::new).clear(); + Bits tmpOccupied = Pools.obtain(Bits.class, Bits::new); + tmpOccupiers.set(occupiers); + tmpOccupied.clear(); tmpOccupied.set(occupied); int max = -1; @@ -320,6 +329,11 @@ public class LCanvas extends Table{ jmp.predHeight = occupied.nextClearBit(max + 1); jmp.markedDone = true; + tmpOccupied.clear(); + tmpOccupiers.clear(); + Pools.free(tmpOccupied); + Pools.free(tmpOccupiers); + return jmp.predHeight; } From 282d21db05b97b4e27448c765f5b3a542990f944 Mon Sep 17 00:00:00 2001 From: code-explorer786 <68312688+code-explorer786@users.noreply.github.com> Date: Thu, 27 Jun 2024 15:47:18 +0700 Subject: [PATCH 066/460] Update jump heights only when necessary. This method uses signaling (through a boolean) and I feel like it's extremely hacky, but I tested this and it (kind of?) works. Unfortunately I found this to potentially lag when resizing. I am not sure if this is guaranteed to work (as in, produce correct behaviour) or not, but to my understanding only LogicDialog uses LCanvas (grep out "LCanvas\|canvas" and see) so it will most likely work? I tested this and accidentally found an unrelated issue related to LCanvas.maxJumpsDrawn, but I hope this will be fixed in the near future. --- core/src/mindustry/logic/LCanvas.java | 13 ++++++++++++- core/src/mindustry/logic/LogicDialog.java | 2 ++ 2 files changed, 14 insertions(+), 1 deletion(-) diff --git a/core/src/mindustry/logic/LCanvas.java b/core/src/mindustry/logic/LCanvas.java index 10e2e8279b..0fe774b228 100644 --- a/core/src/mindustry/logic/LCanvas.java +++ b/core/src/mindustry/logic/LCanvas.java @@ -159,6 +159,7 @@ public class LCanvas extends Table{ st.setupUI(); } + this.statements.updateJumpHeights = true; this.statements.layout(); } @@ -202,6 +203,7 @@ public class LCanvas extends Table{ boolean invalidated; public Group jumps = new WidgetGroup(); private Seq processedJumps = new Seq(); + public boolean updateJumpHeights = true; { setTransform(true); @@ -257,7 +259,10 @@ public class LCanvas extends Table{ } } - if(dynamicJumpHeights) setJumpHeights(); + if(dynamicJumpHeights){ + if(updateJumpHeights) setJumpHeights(); + updateJumpHeights = false; + } if(parent != null) parent.invalidateHierarchy();//don't invalid self @@ -394,6 +399,7 @@ public class LCanvas extends Table{ dragging = null; } + updateJumpHeights = true; layout(); } } @@ -430,6 +436,7 @@ public class LCanvas extends Table{ t.button(Icon.cancel, Styles.logici, () -> { remove(); dragging = null; + statements.updateJumpHeights = true; statements.layout(); }).size(24f); @@ -449,6 +456,7 @@ public class LCanvas extends Table{ lasty = v.y; dragging = StatementElem.this; toFront(); + statements.updateJumpHeights = true; statements.layout(); return true; } @@ -506,6 +514,7 @@ public class LCanvas extends Table{ statements.layout(); copy.elem = s; copy.setupUI(); + statements.updateJumpHeights = true; } } @@ -549,6 +558,7 @@ public class LCanvas extends Table{ setter.get(null); mx = x; my = y; + canvas.statements.updateJumpHeights = true; return true; } @@ -569,6 +579,7 @@ public class LCanvas extends Table{ setter.get(null); } selecting = false; + canvas.statements.updateJumpHeights = true; } }); diff --git a/core/src/mindustry/logic/LogicDialog.java b/core/src/mindustry/logic/LogicDialog.java index eaac0dd322..65ce456c0f 100644 --- a/core/src/mindustry/logic/LogicDialog.java +++ b/core/src/mindustry/logic/LogicDialog.java @@ -256,6 +256,8 @@ public class LogicDialog extends BaseDialog{ dialog.addCloseButton(); dialog.show(); }).disabled(t -> canvas.statements.getChildren().size >= LExecutor.maxInstructions); + + Core.app.post(canvas::rebuild); } public void show(String code, LExecutor executor, boolean privileged, Cons modified){ From 89b67fc4b46ab86bbc5b8e93de3c2be75b2c889b Mon Sep 17 00:00:00 2001 From: code-explorer786 <68312688+code-explorer786@users.noreply.github.com> Date: Fri, 28 Jun 2024 10:34:27 +0700 Subject: [PATCH 067/460] Transition jump heights It looks good. --- core/src/mindustry/logic/LCanvas.java | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/core/src/mindustry/logic/LCanvas.java b/core/src/mindustry/logic/LCanvas.java index 0fe774b228..baba9bc617 100644 --- a/core/src/mindustry/logic/LCanvas.java +++ b/core/src/mindustry/logic/LCanvas.java @@ -615,6 +615,8 @@ public class LCanvas extends Table{ public boolean markedDone = false; public int jumpUIBegin = 0, jumpUIEnd = 0; + private float uiHeight = 100f; + public JumpCurve(JumpButton button){ this.button = button; } @@ -672,7 +674,8 @@ public class LCanvas extends Table{ Lines.stroke(4f, button.color); Draw.alpha(parentAlpha); - float dist = 100f + 100f * (float) predHeight; + // exponential smoothing + uiHeight = Mathf.lerp(100f + 100f * (float) predHeight, uiHeight, dynamicJumpHeights ? Mathf.pow(0.9f, Time.delta) : 0); //square jumps if(false){ @@ -691,8 +694,8 @@ public class LCanvas extends Table{ Lines.curve( x, y, - x + dist, y, - x2 + dist, y2, + x + uiHeight, y, + x2 + uiHeight, y2, x2, y2, Math.max(18, (int)(Mathf.dst(x, y, x2, y2) / 6))); } From 939f6939d0481ff3e2fdb1172b833dd10c8058d9 Mon Sep 17 00:00:00 2001 From: code-explorer786 <68312688+code-explorer786@users.noreply.github.com> Date: Fri, 28 Jun 2024 20:42:46 +0700 Subject: [PATCH 068/460] Jump curve coloring See #general-programming in the Mindustry Discord server: https://discord.com/channels/391020510269669376/663854113418641429/1256146387834372106 Co-authored-by: Ilya246 --- core/assets/bundles/bundle.properties | 1 + core/src/mindustry/logic/LCanvas.java | 17 ++++++++++++++++- .../ui/dialogs/SettingsMenuDialog.java | 1 + 3 files changed, 18 insertions(+), 1 deletion(-) diff --git a/core/assets/bundles/bundle.properties b/core/assets/bundles/bundle.properties index 22a9289eed..ec0655afd5 100644 --- a/core/assets/bundles/bundle.properties +++ b/core/assets/bundles/bundle.properties @@ -1226,6 +1226,7 @@ setting.playerchat.name = Display Player Bubble Chat setting.showweather.name = Show Weather Graphics setting.hidedisplays.name = Hide Logic Displays setting.dynamicjumpheights.name = Dynamic Jump Heights +setting.coloredjumps.name = Colored Jumps setting.macnotch.name = Adapt interface to display notch setting.macnotch.description = Restart required to apply changes steam.friendsonly = Friends Only diff --git a/core/src/mindustry/logic/LCanvas.java b/core/src/mindustry/logic/LCanvas.java index baba9bc617..e065a343bc 100644 --- a/core/src/mindustry/logic/LCanvas.java +++ b/core/src/mindustry/logic/LCanvas.java @@ -26,6 +26,7 @@ public class LCanvas extends Table{ //ew static variables static LCanvas canvas; private static boolean dynamicJumpHeights = false; + private static boolean coloredJumps = false; public DragLayout statements; public ScrollPane pane; @@ -112,6 +113,7 @@ public class LCanvas extends Table{ jumps = statements.jumps; dynamicJumpHeights = Core.settings.getBool("dynamicjumpheights", false); + coloredJumps = Core.settings.getBool("coloredjumps", false); pane = pane(t -> { t.center(); @@ -204,6 +206,7 @@ public class LCanvas extends Table{ public Group jumps = new WidgetGroup(); private Seq processedJumps = new Seq(); public boolean updateJumpHeights = true; + private Rand rand = new Rand(); { setTransform(true); @@ -264,6 +267,16 @@ public class LCanvas extends Table{ updateJumpHeights = false; } + if(coloredJumps){ + jumps.getChildren().each(e -> { + if(!(e instanceof JumpCurve e2) || e2.button.to.get() == null) return; + int idx = e2.button.to.get().index; + if(dragging != null && idx >= dragging.index) idx += 1; + rand.setSeed((long) idx); + Color.HSVtoRGB(rand.random(0.0f, 360.0f), rand.random(80.0f, 90.0f), 100.0f, e2.button.defaultColor); + }); + } + if(parent != null) parent.invalidateHierarchy();//don't invalid self if(parent != null && parent instanceof Table){ @@ -533,7 +546,7 @@ public class LCanvas extends Table{ public static class JumpButton extends ImageButton{ Color hoverColor = Pal.place; - Color defaultColor = Color.white; + Color defaultColor = new Color(Color.white); Prov to; boolean selecting; float mx, my; @@ -673,6 +686,7 @@ public class LCanvas extends Table{ public void drawCurve(float x, float y, float x2, float y2){ Lines.stroke(4f, button.color); Draw.alpha(parentAlpha); + Draw.color(button.color); // exponential smoothing uiHeight = Mathf.lerp(100f + 100f * (float) predHeight, uiHeight, dynamicJumpHeights ? Mathf.pow(0.9f, Time.delta) : 0); @@ -698,6 +712,7 @@ public class LCanvas extends Table{ x2 + uiHeight, y2, x2, y2, Math.max(18, (int)(Mathf.dst(x, y, x2, y2) / 6))); + Draw.reset(); } public void prepareHeight(){ diff --git a/core/src/mindustry/ui/dialogs/SettingsMenuDialog.java b/core/src/mindustry/ui/dialogs/SettingsMenuDialog.java index 04d2d93e61..78d1a4c241 100644 --- a/core/src/mindustry/ui/dialogs/SettingsMenuDialog.java +++ b/core/src/mindustry/ui/dialogs/SettingsMenuDialog.java @@ -504,6 +504,7 @@ public class SettingsMenuDialog extends BaseDialog{ } graphics.checkPref("dynamicjumpheights", true); + graphics.checkPref("coloredjumps", true); } public void exportData(Fi file) throws IOException{ From c5b8133ff91161706a067105fbf93ffe82d69d3d Mon Sep 17 00:00:00 2001 From: Ilya246 Date: Fri, 28 Jun 2024 19:03:04 +0400 Subject: [PATCH 069/460] optimise jump colors and attempt to space them apart --- core/src/mindustry/logic/LCanvas.java | 40 +++++++++++++++++++++++++-- 1 file changed, 37 insertions(+), 3 deletions(-) diff --git a/core/src/mindustry/logic/LCanvas.java b/core/src/mindustry/logic/LCanvas.java index e065a343bc..c9ce0c558f 100644 --- a/core/src/mindustry/logic/LCanvas.java +++ b/core/src/mindustry/logic/LCanvas.java @@ -206,10 +206,45 @@ public class LCanvas extends Table{ public Group jumps = new WidgetGroup(); private Seq processedJumps = new Seq(); public boolean updateJumpHeights = true; - private Rand rand = new Rand(); + private Color[] jumpColors = new Color[LExecutor.maxInstructions]; { setTransform(true); + + Time.mark(); + + //set seed so that colors are consistent between game launches + Rand rand = new Rand(0L); + + int checkAmount = 5; //to how many previous hues to compare + float minDistance = 360f / checkAmount / 2f; //by at least how much should each hue be different from the checkAmount previous and next ones + + Seq previousHues = new Seq<>(); + + for(int i = 0; i < LExecutor.maxInstructions; i++){ + float hue = 0f; + + boolean goodEnough = false; + while(!goodEnough){ + goodEnough = true; + hue = Mathf.random(360f); + for(float previousHue : previousHues){ + if(Math.abs(previousHue - hue) < minDistance) { + goodEnough = false; + break; + } + } + } + + jumpColors[i] = Color.HSVtoRGB(hue, rand.random(80f, 100f), 100f); + + previousHues.add(hue); + if(previousHues.size == checkAmount){ + previousHues.remove(0); + } + } + + Log.debug("Processed logic jump colors in @ms", Time.elapsed()); //2.2ms on my (Ilya246) machine } @Override @@ -272,8 +307,7 @@ public class LCanvas extends Table{ if(!(e instanceof JumpCurve e2) || e2.button.to.get() == null) return; int idx = e2.button.to.get().index; if(dragging != null && idx >= dragging.index) idx += 1; - rand.setSeed((long) idx); - Color.HSVtoRGB(rand.random(0.0f, 360.0f), rand.random(80.0f, 90.0f), 100.0f, e2.button.defaultColor); + e2.button.defaultColor.set(jumpColors[idx]); }); } From a5de1317117e6e9822ebc1e097faf21794532758 Mon Sep 17 00:00:00 2001 From: code-explorer786 <68312688+code-explorer786@users.noreply.github.com> Date: Sun, 30 Jun 2024 12:00:34 +0700 Subject: [PATCH 070/460] Trapezoidal jumps MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit I haven't checked this yet, but it seems like it also reduces the complexity (runtime) from ≈O(n^2) to ≈O(k^2 + n) (n = number of jump curves) (k = number of unique destinations) The worst case, that is k = n, is still O(n^2) but generally it's much more (scalably) performant. Thanks Arkanic for suggesting this! https://discord.com/channels/391020510269669376/663854113418641429/1256161815503704104 Co-authored-by: Arkanic <50847107+Arkanic@users.noreply.github.com> --- core/assets/bundles/bundle.properties | 1 + core/src/mindustry/logic/LCanvas.java | 76 +++++++++++++------ .../ui/dialogs/SettingsMenuDialog.java | 1 + 3 files changed, 53 insertions(+), 25 deletions(-) diff --git a/core/assets/bundles/bundle.properties b/core/assets/bundles/bundle.properties index ec0655afd5..30c21c154c 100644 --- a/core/assets/bundles/bundle.properties +++ b/core/assets/bundles/bundle.properties @@ -1227,6 +1227,7 @@ setting.showweather.name = Show Weather Graphics setting.hidedisplays.name = Hide Logic Displays setting.dynamicjumpheights.name = Dynamic Jump Heights setting.coloredjumps.name = Colored Jumps +setting.trapezoidaljumps.name = Trapezoidal Jumps setting.macnotch.name = Adapt interface to display notch setting.macnotch.description = Restart required to apply changes steam.friendsonly = Friends Only diff --git a/core/src/mindustry/logic/LCanvas.java b/core/src/mindustry/logic/LCanvas.java index c9ce0c558f..dcfbff1b28 100644 --- a/core/src/mindustry/logic/LCanvas.java +++ b/core/src/mindustry/logic/LCanvas.java @@ -21,12 +21,12 @@ import mindustry.logic.LStatements.*; import mindustry.ui.*; public class LCanvas extends Table{ - public static final int maxJumpsDrawn = 100; private static final int invalidJump = Integer.MAX_VALUE; // terrible hack //ew static variables static LCanvas canvas; private static boolean dynamicJumpHeights = false; private static boolean coloredJumps = false; + private static boolean trapezoidalJumps = false; public DragLayout statements; public ScrollPane pane; @@ -35,7 +35,6 @@ public class LCanvas extends Table{ StatementElem dragging; StatementElem hovered; float targetWidth; - int jumpCount = 0; boolean privileged; Seq tooltips = new Seq<>(); @@ -114,6 +113,7 @@ public class LCanvas extends Table{ dynamicJumpHeights = Core.settings.getBool("dynamicjumpheights", false); coloredJumps = Core.settings.getBool("coloredjumps", false); + trapezoidalJumps = Core.settings.getBool("trapezoidaljumps", false); pane = pane(t -> { t.center(); @@ -132,7 +132,6 @@ public class LCanvas extends Table{ @Override public void draw(){ - jumpCount = 0; super.draw(); } @@ -205,6 +204,8 @@ public class LCanvas extends Table{ boolean invalidated; public Group jumps = new WidgetGroup(); private Seq processedJumps = new Seq(); + private IntMap reprBefore = new IntMap(); + private IntMap reprAfter = new IntMap(); public boolean updateJumpHeights = true; private Color[] jumpColors = new Color[LExecutor.maxInstructions]; @@ -321,14 +322,32 @@ public class LCanvas extends Table{ private void setJumpHeights(){ SnapshotSeq jumpsChildren = jumps.getChildren(); processedJumps.clear(); - jumpsChildren.each(e -> { - if(e instanceof JumpCurve e2){ + if(trapezoidalJumps){ + reprBefore.clear(); + reprAfter.clear(); + jumpsChildren.each(e -> { + if(!(e instanceof JumpCurve e2)) return; e2.prepareHeight(); - if(e2.jumpUIBegin != invalidJump){ - processedJumps.add(e2); + if(e2.jumpUIBegin == invalidJump) return; + if(e2.flipped){ + JumpCurve prev = reprAfter.get(e2.jumpUIBegin); + if(prev != null && prev.jumpUIEnd >= e2.jumpUIEnd) return; + reprAfter.put(e2.jumpUIBegin, e2); + }else{ + JumpCurve prev = reprBefore.get(e2.jumpUIEnd); + if(prev != null && prev.jumpUIBegin <= e2.jumpUIBegin) return; + reprBefore.put(e2.jumpUIEnd, e2); } - } - }); + }); + processedJumps.add(reprBefore.values().toArray()); + processedJumps.add(reprAfter.values().toArray()); + } else { + jumpsChildren.each(e -> { + if(!(e instanceof JumpCurve e2)) return; + e2.prepareHeight(); + processedJumps.add(e2); + }); + } processedJumps.sort((a,b) -> a.jumpUIBegin - b.jumpUIBegin); Seq occupiers = Pools.obtain(Seq.class, Seq::new); @@ -351,6 +370,15 @@ public class LCanvas extends Table{ occupiers.clear(); Pools.free(occupied); Pools.free(occupiers); + + if(trapezoidalJumps){ + jumpsChildren.each(e -> { + if(!(e instanceof JumpCurve e2)) return; + if(e2.jumpUIBegin == invalidJump) return; + e2.predHeight = e2.flipped ? reprAfter.get(e2.jumpUIBegin).predHeight : reprBefore.get(e2.jumpUIEnd).predHeight; + e2.markedDone = true; + }); + } } private int getJumpHeight(int index, Seq occupiers, Bits occupied){ @@ -661,8 +689,9 @@ public class LCanvas extends Table{ public int predHeight = 0; public boolean markedDone = false; public int jumpUIBegin = 0, jumpUIEnd = 0; + public boolean flipped = false; - private float uiHeight = 100f; + private float uiHeight = 60f; public JumpCurve(JumpButton button){ this.button = button; @@ -679,12 +708,6 @@ public class LCanvas extends Table{ @Override public void draw(){ - canvas.jumpCount ++; - - if(canvas.jumpCount > maxJumpsDrawn && !button.selecting && !button.listener.isOver()){ - return; - } - Element hover = button.to.get() == null && button.selecting ? canvas.hovered : button.to.get(); boolean draw = false; Vec2 t = Tmp.v1, r = Tmp.v2; @@ -723,18 +746,19 @@ public class LCanvas extends Table{ Draw.color(button.color); // exponential smoothing - uiHeight = Mathf.lerp(100f + 100f * (float) predHeight, uiHeight, dynamicJumpHeights ? Mathf.pow(0.9f, Time.delta) : 0); - - //square jumps - if(false){ - float len = Scl.scl(Mathf.randomSeed(hashCode(), 10, 50)); - - float maxX = Math.max(x, x2) + len; + uiHeight = Mathf.lerp( + trapezoidalJumps ? 60f + 20f * (float) predHeight : 100f + 100f * (float) predHeight, + uiHeight, + dynamicJumpHeights ? Mathf.pow(0.9f, Time.delta) : 0 + ); + //trapezoidal jumps + if(trapezoidalJumps){ + float dy = (y2 == y ? 0f : y2 > y ? 1f : -1f) * uiHeight * 0.5f; Lines.beginLine(); Lines.linePoint(x, y); - Lines.linePoint(maxX, y); - Lines.linePoint(maxX, y2); + Lines.linePoint(x + uiHeight, y + dy); + Lines.linePoint(x + uiHeight, y2 - dy); Lines.linePoint(x2, y2); Lines.endLine(); return; @@ -753,11 +777,13 @@ public class LCanvas extends Table{ if(this.button.to.get() == null){ this.markedDone = true; this.predHeight = 0; + this.flipped = false; this.jumpUIBegin = this.jumpUIEnd = invalidJump; } else { this.markedDone = false; int i = this.button.elem.index; int j = this.button.to.get().index; + this.flipped = i >= j; this.jumpUIBegin = Math.min(i,j); this.jumpUIEnd = Math.max(i,j); // height will be recalculated later diff --git a/core/src/mindustry/ui/dialogs/SettingsMenuDialog.java b/core/src/mindustry/ui/dialogs/SettingsMenuDialog.java index 78d1a4c241..4390316bc6 100644 --- a/core/src/mindustry/ui/dialogs/SettingsMenuDialog.java +++ b/core/src/mindustry/ui/dialogs/SettingsMenuDialog.java @@ -505,6 +505,7 @@ public class SettingsMenuDialog extends BaseDialog{ graphics.checkPref("dynamicjumpheights", true); graphics.checkPref("coloredjumps", true); + graphics.checkPref("trapezoidaljumps", true); } public void exportData(Fi file) throws IOException{ From 116798e3284b18f88c1adeb5ebf9d9fec000a4e8 Mon Sep 17 00:00:00 2001 From: way-zer Date: Tue, 6 Aug 2024 01:30:38 +0800 Subject: [PATCH 071/460] OC: fix slow of LCanvas --- core/src/mindustry/logic/LCanvas.java | 91 +++++++++++++++------------ 1 file changed, 50 insertions(+), 41 deletions(-) diff --git a/core/src/mindustry/logic/LCanvas.java b/core/src/mindustry/logic/LCanvas.java index dcfbff1b28..db9cf7c231 100644 --- a/core/src/mindustry/logic/LCanvas.java +++ b/core/src/mindustry/logic/LCanvas.java @@ -120,10 +120,12 @@ public class LCanvas extends Table{ t.add(statements).pad(2f).center().width(targetWidth); t.addChild(statements.jumps); + jumps.touchable = Touchable.disabled; + jumps.update(()->jumps.setCullingArea(t.getCullingArea())); statements.jumps.cullable = false; }).grow().get(); pane.setFlickScroll(false); - pane.setScrollYForce(s); + pane.setScrollY(s); if(toLoad != null){ load(toLoad); @@ -161,13 +163,11 @@ public class LCanvas extends Table{ } this.statements.updateJumpHeights = true; - this.statements.layout(); } public void clearStatements(){ statements.jumps.clear(); statements.clearChildren(); - statements.layout(); } StatementElem checkHovered(){ @@ -254,10 +254,12 @@ public class LCanvas extends Table{ float cy = 0; seq.clear(); - float totalHeight = getChildren().sumf(e -> e.getHeight() + space); - - height = prefHeight = totalHeight; - width = prefWidth = Scl.scl(targetWidth); + float totalHeight = getChildren().sumf(e -> e.getPrefHeight() + space); + if(height != totalHeight || width != Scl.scl(targetWidth)){ + height = prefHeight = totalHeight; + width = prefWidth = Scl.scl(targetWidth); + invalidateHierarchy(); + } //layout everything normally for(int i = 0; i < getChildren().size; i++){ @@ -267,7 +269,7 @@ public class LCanvas extends Table{ if(dragging == e) continue; e.setSize(width, e.getPrefHeight()); - e.setPosition(0, height - cy, Align.topLeft); + e.setPosition(0, totalHeight - cy, Align.topLeft); ((StatementElem)e).updateAddress(i); cy += e.getPrefHeight() + space; @@ -312,8 +314,6 @@ public class LCanvas extends Table{ }); } - if(parent != null) parent.invalidateHierarchy();//don't invalid self - if(parent != null && parent instanceof Table){ setCullingArea(parent.getCullingArea()); } @@ -472,10 +472,10 @@ public class LCanvas extends Table{ } dragging = null; + invalidateHierarchy(); } updateJumpHeights = true; - layout(); } } @@ -512,7 +512,6 @@ public class LCanvas extends Table{ remove(); dragging = null; statements.updateJumpHeights = true; - statements.layout(); }).size(24f); t.addListener(new InputListener(){ @@ -532,7 +531,7 @@ public class LCanvas extends Table{ dragging = StatementElem.this; toFront(); statements.updateJumpHeights = true; - statements.layout(); + statements.invalidate(); return true; } @@ -544,7 +543,7 @@ public class LCanvas extends Table{ lastx = v.x; lasty = v.y; - statements.layout(); + statements.invalidate(); } @Override @@ -586,7 +585,6 @@ public class LCanvas extends Table{ StatementElem s = new StatementElem(copy); statements.addChildAfter(StatementElem.this, s); - statements.layout(); copy.elem = s; copy.setupUI(); statements.updateJumpHeights = true; @@ -684,6 +682,7 @@ public class LCanvas extends Table{ public static class JumpCurve extends Element{ public JumpButton button; + private boolean invertedHeight; // for jump prediction; see DragLayout public int predHeight = 0; @@ -697,10 +696,37 @@ public class LCanvas extends Table{ this.button = button; } + @Override + public void setSize(float width, float height){ + if(height < 0){ + y += height; + height = -height; + invertedHeight = true; + } + super.setSize(width, height); + } + @Override public void act(float delta){ super.act(delta); + //MDTX(WayZer, 2024/8/6) Support Cull + invertedHeight = false; + Group desc = canvas.jumps.parent; + Vec2 t = Tmp.v1.set(button.getWidth() / 2f, button.getHeight() / 2f); + button.localToAscendantCoordinates(desc, t); + setPosition(t.x, t.y); + Element hover = button.to.get() == null && button.selecting ? canvas.hovered : button.to.get(); + if(hover != null){ + t.set(hover.getWidth(), hover.getHeight() / 2f); + hover.localToAscendantCoordinates(desc, t); + setSize(t.x - x, t.y - y); + }else if(button.selecting){ + setSize(button.mx, button.my); + }else{ + setSize(0, 0); + } + if(button.listener.isOver()){ toFront(); } @@ -708,36 +734,19 @@ public class LCanvas extends Table{ @Override public void draw(){ - Element hover = button.to.get() == null && button.selecting ? canvas.hovered : button.to.get(); - boolean draw = false; - Vec2 t = Tmp.v1, r = Tmp.v2; + if(height == 0) return; + Vec2 t = Tmp.v1.set(width, !invertedHeight ? height : 0), r = Tmp.v2.set(0, !invertedHeight ? 0 : height); Group desc = canvas.pane; + localToAscendantCoordinates(desc, r); + localToAscendantCoordinates(desc, t); - button.localToAscendantCoordinates(desc, r.set(0, 0)); + drawCurve(r.x, r.y, t.x, t.y); - if(hover != null){ - hover.localToAscendantCoordinates(desc, t.set(hover.getWidth(), hover.getHeight()/2f)); - - draw = true; - }else if(button.selecting){ - t.set(r).add(button.mx, button.my); - draw = true; - } - - float offset = canvas.pane.getVisualScrollY() - canvas.pane.getMaxY(); - - t.y += offset; - r.y += offset; - - if(draw){ - drawCurve(r.x + button.getWidth()/2f, r.y + button.getHeight()/2f, t.x, t.y); - - float s = button.getWidth(); - Draw.color(button.color); - Tex.logicNode.draw(t.x + s*0.75f, t.y - s/2f, -s, s); - Draw.reset(); - } + float s = button.getWidth(); + Draw.color(button.color); + Tex.logicNode.draw(t.x + s * 0.75f, t.y - s / 2f, -s, s); + Draw.reset(); } public void drawCurve(float x, float y, float x2, float y2){ From d15a906402c5d9cf52e41ede8839e035226a1b59 Mon Sep 17 00:00:00 2001 From: Anuken Date: Thu, 9 Jan 2025 23:51:57 -0500 Subject: [PATCH 072/460] Factor in ammo reload multiplier + liquid heat capacity in turret coolant calculations --- core/src/mindustry/content/Blocks.java | 2 +- .../turrets/ContinuousLiquidTurret.java | 7 ----- .../blocks/defense/turrets/ReloadTurret.java | 29 +++++-------------- .../world/blocks/defense/turrets/Turret.java | 8 +++-- core/src/mindustry/world/meta/Stats.java | 6 ++++ 5 files changed, 20 insertions(+), 32 deletions(-) diff --git a/core/src/mindustry/content/Blocks.java b/core/src/mindustry/content/Blocks.java index 2c5f25b200..1de652091f 100644 --- a/core/src/mindustry/content/Blocks.java +++ b/core/src/mindustry/content/Blocks.java @@ -2812,7 +2812,7 @@ public class Blocks{ output = Items.sand; fogRadius = 3; ambientSound = Sounds.drill; - ambientSoundVolume = 0.05f; + ambientSoundVolume = 0.08f; consumeLiquid(Liquids.ozone, 1f / 60f); diff --git a/core/src/mindustry/world/blocks/defense/turrets/ContinuousLiquidTurret.java b/core/src/mindustry/world/blocks/defense/turrets/ContinuousLiquidTurret.java index 0d80699d8b..b785e3ec4f 100644 --- a/core/src/mindustry/world/blocks/defense/turrets/ContinuousLiquidTurret.java +++ b/core/src/mindustry/world/blocks/defense/turrets/ContinuousLiquidTurret.java @@ -50,13 +50,6 @@ public class ContinuousLiquidTurret extends ContinuousTurret{ public void display(Stats stats){ } - - //TODO - //@Override - //protected float use(Building entity){ - // BulletType type = ammoTypes.get(entity.liquids.current()); - // return Math.min(amount * entity.edelta(), entity.block.liquidCapacity) / (type == null ? 1f : type.ammoMultiplier); - //} }); ammoTypes.each((item, type) -> placeOverlapRange = Math.max(placeOverlapRange, range + type.rangeChange + placeOverlapMargin)); diff --git a/core/src/mindustry/world/blocks/defense/turrets/ReloadTurret.java b/core/src/mindustry/world/blocks/defense/turrets/ReloadTurret.java index 9203869459..8748b91ed8 100644 --- a/core/src/mindustry/world/blocks/defense/turrets/ReloadTurret.java +++ b/core/src/mindustry/world/blocks/defense/turrets/ReloadTurret.java @@ -1,9 +1,6 @@ package mindustry.world.blocks.defense.turrets; import arc.math.*; -import arc.struct.*; -import arc.util.*; -import mindustry.type.*; import mindustry.world.consumers.*; import mindustry.world.meta.*; @@ -21,23 +18,7 @@ public class ReloadTurret extends BaseTurret{ super.setStats(); if(coolant != null){ - stats.remove(Stat.booster); - - //TODO this is very hacky, there is no current way to check if a ConsumeLiquidBase accepts something individually. fix later - ObjectSet notBooster = content.liquids().select(l -> { - for(Consume c : consumers){ - if(!c.booster && c != coolant && - ((c instanceof ConsumeLiquid cl && cl.liquid == l) || - (c instanceof ConsumeLiquids cl2 && Structs.contains(cl2.liquids, s -> s.liquid == l)) || - (c instanceof ConsumeLiquidFilter clf && clf.filter.get(l)))){ - - return true; - } - } - return false; - }).asSet(); - - stats.add(Stat.booster, StatValues.boosters(reload, coolant.amount, coolantMultiplier, true, l -> l.coolant && consumesLiquid(l) && !notBooster.contains(l))); + stats.replace(Stat.booster, StatValues.boosters(reload, coolant.amount, coolantMultiplier, true, coolant::consumes)); } } @@ -46,10 +27,10 @@ public class ReloadTurret extends BaseTurret{ protected void updateCooling(){ if(reloadCounter < reload && coolant != null && coolant.efficiency(this) > 0 && efficiency > 0){ - float capacity = coolant instanceof ConsumeLiquidFilter filter ? filter.getConsumed(this).heatCapacity : 1f; + float capacity = coolant instanceof ConsumeLiquidFilter filter ? filter.getConsumed(this).heatCapacity : (coolant.consumes(liquids.current()) ? liquids.current().heatCapacity : 0.4f); float amount = coolant.amount * coolant.efficiency(this); coolant.update(this); - reloadCounter += amount * edelta() * capacity * coolantMultiplier; + reloadCounter += amount * edelta() * capacity * coolantMultiplier * ammoReloadMultiplier(); if(Mathf.chance(0.06 * amount)){ coolEffect.at(x + Mathf.range(size * tilesize / 2f), y + Mathf.range(size * tilesize / 2f)); @@ -57,6 +38,10 @@ public class ReloadTurret extends BaseTurret{ } } + protected float ammoReloadMultiplier(){ + return 1f; + } + protected float baseReloadSpeed(){ return efficiency; } diff --git a/core/src/mindustry/world/blocks/defense/turrets/Turret.java b/core/src/mindustry/world/blocks/defense/turrets/Turret.java index 426d038912..806cbd151a 100644 --- a/core/src/mindustry/world/blocks/defense/turrets/Turret.java +++ b/core/src/mindustry/world/blocks/defense/turrets/Turret.java @@ -575,13 +575,17 @@ public class Turret extends ReloadTurret{ } protected void updateReload(){ - float multiplier = hasAmmo() ? peekAmmo().reloadMultiplier : 1f; - reloadCounter += delta() * multiplier * baseReloadSpeed(); + reloadCounter += delta() * ammoReloadMultiplier() * baseReloadSpeed(); //cap reload for visual reasons reloadCounter = Math.min(reloadCounter, reload); } + @Override + protected float ammoReloadMultiplier(){ + return hasAmmo() ? peekAmmo().reloadMultiplier : 1f; + } + protected void updateShooting(){ if(reloadCounter >= reload && !charging() && shootWarmup >= minWarmup){ diff --git a/core/src/mindustry/world/meta/Stats.java b/core/src/mindustry/world/meta/Stats.java index 7056c6fa2c..b776994228 100644 --- a/core/src/mindustry/world/meta/Stats.java +++ b/core/src/mindustry/world/meta/Stats.java @@ -73,6 +73,12 @@ public class Stats{ add(stat, StatValues.string(format, args)); } + /** Replaces a stat, removing the old value if it exists. */ + public void replace(Stat stat, StatValue value){ + remove(stat); + add(stat, value); + } + /** Adds a stat value. */ public void add(Stat stat, StatValue value){ if(map == null) map = new OrderedMap<>(); From c5aefaae1f501d042c3c78c17871ed1520d0dc5e Mon Sep 17 00:00:00 2001 From: Anuken Date: Fri, 10 Jan 2025 00:01:29 -0500 Subject: [PATCH 073/460] Equivalent coolant multipliers --- core/src/mindustry/content/Blocks.java | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/core/src/mindustry/content/Blocks.java b/core/src/mindustry/content/Blocks.java index 1de652091f..123c305bae 100644 --- a/core/src/mindustry/content/Blocks.java +++ b/core/src/mindustry/content/Blocks.java @@ -4070,7 +4070,7 @@ public class Blocks{ }} ); - coolantMultiplier = 6f; + coolantMultiplier = 15f; shootSound = Sounds.shootAlt; targetUnderBlocks = false; @@ -4147,7 +4147,7 @@ public class Blocks{ shoot = new ShootSpread(15, 4f); - coolantMultiplier = 6f; + coolantMultiplier = 15f; inaccuracy = 0.2f; velocityRnd = 0.17f; @@ -4390,7 +4390,7 @@ public class Blocks{ warmupMaintainTime = 120f; coolant = consume(new ConsumeLiquid(Liquids.water, 30f / 60f)); - coolantMultiplier = 1.5f; + coolantMultiplier = 3.75f; drawer = new DrawTurret("reinforced-"){{ parts.addAll( @@ -4501,7 +4501,7 @@ public class Blocks{ size = 4; coolant = consume(new ConsumeLiquid(Liquids.water, 20f / 60f)); - coolantMultiplier = 2.5f; + coolantMultiplier = 6.25f; limitRange(5f); }}; @@ -4829,7 +4829,7 @@ public class Blocks{ recoil = 0.5f; fogRadiusMultiplier = 0.4f; - coolantMultiplier = 6f; + coolantMultiplier = 15f; shootSound = Sounds.missileLaunch; minWarmup = 0.94f; @@ -4933,7 +4933,7 @@ public class Blocks{ shootSound = Sounds.shootSmite; minWarmup = 0.99f; - coolantMultiplier = 6f; + coolantMultiplier = 15f; var haloProgress = PartProgress.warmup.delay(0.5f); float haloY = -15f, haloRotSpeed = 1f; From 5fc95b36a30e4f1c31df95e1ed8b0cfa1266065b Mon Sep 17 00:00:00 2001 From: Anuken Date: Sat, 11 Jan 2025 00:32:58 -0500 Subject: [PATCH 074/460] More disperse ammo --- core/src/mindustry/content/Blocks.java | 57 ++++++++++++++++++- .../mindustry/entities/bullet/BulletType.java | 2 + .../world/blocks/defense/turrets/Turret.java | 2 +- 3 files changed, 58 insertions(+), 3 deletions(-) diff --git a/core/src/mindustry/content/Blocks.java b/core/src/mindustry/content/Blocks.java index 123c305bae..9718e0cd25 100644 --- a/core/src/mindustry/content/Blocks.java +++ b/core/src/mindustry/content/Blocks.java @@ -4426,7 +4426,8 @@ public class Blocks{ disperse = new ItemTurret("disperse"){{ requirements(Category.turret, with(Items.thorium, 50, Items.oxide, 150, Items.silicon, 200, Items.beryllium, 350)); - ammo(Items.tungsten, new BasicBulletType(){{ + ammo( + Items.tungsten, new BasicBulletType(){{ damage = 65; speed = 8.5f; width = height = 16; @@ -4448,6 +4449,58 @@ public class Blocks{ trailRotation = true; trailEffect = Fx.disperseTrail; + hitEffect = despawnEffect = Fx.hitBulletColor; + }}, + Items.thorium, new BasicBulletType(){{ + damage = 90; + reloadMultiplier = 0.85f; + speed = 9.5f; + width = height = 16; + shrinkY = 0.3f; + backSprite = "large-bomb-back"; + sprite = "mine-bullet"; + velocityRnd = 0.5f; + collidesGround = false; + collidesTiles = false; + shootEffect = Fx.shootBig2; + smokeEffect = Fx.shootSmokeDisperse; + frontColor = Color.white; + backColor = trailColor = hitColor = Color.valueOf("e89dbd"); + trailChance = 0.44f; + ammoMultiplier = 2f; + + lifetime = 34f; + rotationOffset = 90f; + trailRotation = true; + trailEffect = Fx.disperseTrail; + + hitEffect = despawnEffect = Fx.hitBulletColor; + }}, + Items.silicon, new BasicBulletType(){{ + damage = 35; + homingPower = 0.03f; + + reloadMultiplier = 0.9f; + speed = 8.5f; + width = height = 16; + shrinkY = 0.3f; + backSprite = "large-bomb-back"; + sprite = "mine-bullet"; + velocityRnd = 0.11f; + collidesGround = false; + collidesTiles = false; + shootEffect = Fx.shootBig2; + smokeEffect = Fx.shootSmokeDisperse; + frontColor = Color.valueOf("dae1ee"); + backColor = trailColor = hitColor = Color.valueOf("858a9b"); + ammoMultiplier = 3f; + + lifetime = 34f; + rotationOffset = 90f; + trailLength = 7; + //for chasing targets + extraRangeMargin = 32f; + hitEffect = despawnEffect = Fx.hitBulletColor; }}); @@ -4503,7 +4556,7 @@ public class Blocks{ coolant = consume(new ConsumeLiquid(Liquids.water, 20f / 60f)); coolantMultiplier = 6.25f; - limitRange(5f); + limitRange(16f); }}; afflict = new PowerTurret("afflict"){{ diff --git a/core/src/mindustry/entities/bullet/BulletType.java b/core/src/mindustry/entities/bullet/BulletType.java index 71329a947f..2c18fa158a 100644 --- a/core/src/mindustry/entities/bullet/BulletType.java +++ b/core/src/mindustry/entities/bullet/BulletType.java @@ -141,6 +141,8 @@ public class BulletType extends Content implements Cloneable{ public float rangeOverride = -1f; /** When used in a turret with multiple ammo types, this can be set to a non-zero value to influence range. */ public float rangeChange = 0f; + /** When used in turrets with limitRange() applied, this adds extra range to the bullets that extends past targeting range. Only particularly relevant in vanilla. */ + public float extraRangeMargin = 0f; /** Range initialized in init(). */ public float range = 0f; /** % of block health healed **/ diff --git a/core/src/mindustry/world/blocks/defense/turrets/Turret.java b/core/src/mindustry/world/blocks/defense/turrets/Turret.java index 806cbd151a..183cf78743 100644 --- a/core/src/mindustry/world/blocks/defense/turrets/Turret.java +++ b/core/src/mindustry/world/blocks/defense/turrets/Turret.java @@ -209,7 +209,7 @@ public class Turret extends ReloadTurret{ public void limitRange(BulletType bullet, float margin){ float realRange = bullet.rangeChange + range; //doesn't handle drag - bullet.lifetime = (realRange + margin) / bullet.speed; + bullet.lifetime = (realRange + margin + bullet.extraRangeMargin) / bullet.speed; } public static abstract class AmmoEntry{ From 3af562e624c562c3c37384cda9e91028ab074943 Mon Sep 17 00:00:00 2001 From: Anuken Date: Sat, 11 Jan 2025 17:35:38 -0500 Subject: [PATCH 075/460] WIP scathe phase ammo / Shield ability fixes --- .../weapons/scathe-missile-phase-cell.png | Bin 0 -> 236 bytes .../units/weapons/scathe-missile-phase.png | Bin 0 -> 1157 bytes core/assets/icons/icons.properties | 1 + core/src/mindustry/content/Blocks.java | 102 ++++++++++++++++-- .../mindustry/entities/abilities/Ability.java | 1 + .../entities/abilities/ForceFieldAbility.java | 5 + .../entities/abilities/ShieldArcAbility.java | 3 +- core/src/mindustry/type/UnitType.java | 3 + gradle.properties | 2 +- 9 files changed, 108 insertions(+), 9 deletions(-) create mode 100644 core/assets-raw/sprites/units/weapons/scathe-missile-phase-cell.png create mode 100644 core/assets-raw/sprites/units/weapons/scathe-missile-phase.png diff --git a/core/assets-raw/sprites/units/weapons/scathe-missile-phase-cell.png b/core/assets-raw/sprites/units/weapons/scathe-missile-phase-cell.png new file mode 100644 index 0000000000000000000000000000000000000000..7854083dfd74dba7e77b2fd1d17ee5880abd5ac5 GIT binary patch literal 236 zcmeAS@N?(olHy`uVBq!ia0y~yV6b9fV2I~nV_;y|*>vR~0|NtNage(c!@6@aFBupZ zmU+53hE&XXd*!sRv!Q^)Meao+t33XD&1#5}tM+gb$!ueNzDDIxK$#`K6$$m eBgoQ*{oh#k9C7z{=M;?t@jYGrT-G@yGywqCDphy@ literal 0 HcmV?d00001 diff --git a/core/assets-raw/sprites/units/weapons/scathe-missile-phase.png b/core/assets-raw/sprites/units/weapons/scathe-missile-phase.png new file mode 100644 index 0000000000000000000000000000000000000000..fb807978c3043472b0d2d0c3c277f8324fb7b2fc GIT binary patch literal 1157 zcmeAS@N?(olHy`uVBq!ia0y~yV6b9fV2I~nV_;y|*>vR~0|NtNage(c!@6@aFBuqE z>^)r^Ln`LHoxL|t*iqoP_z`XeN5}Uj?G+6kHjEw$3zj-_g(&tvaOVgS= zaEdu%$Hw0xj*kSLOt0OmN`GFxamw%Tvb_AXy6x50#l?PJlhu50rQUt@^3COw*I)nn zy}SAP-9P2UAx=$I2g?eZ9Gj{Rv{^4uaJ;x-;jx_)7I@q+I2_~=AoAud$Ku^9tZnD& zPJeyzd*Y1J&v$d(yglCJ2fkvu#q^3*n(q|jOGarfEyj*EUgoPTa-7x4mrnOG@~(7R zpfyR)^~7qys}px0-1Oz~p=n2(&DX3pT(fU!!bYx>!q?6UgdR!W5F+`4_4PK%%(UL7 zFFxk$T>lpB%wyBne6+WCRdv-z4ueGn948k~b6C7edAhXh>DiZ_`@X5^=RKLzaB6l; z#48)^H7`^0?oD~OPOvhxc9BVb(m`+iF0rsuq2-6eZ-?0Jk(~eS-|21D=Yp;u=qiuR zmEPQP&*O?Y79NZ=v#v5gI?Ld*D;e4T$QJOOjf6bbhR^1=e6jM=Y zYUS6+dpM`~f1>!iKW|DNJ1=_HQ)e?TUo|P~*|pV2)gIc{RQAhq^vJeJo@Q6S7W3rN zS>6D~B~vbKey;C!-*Us#8JFCAD|JLtCfO{rt^C!s#_klu{deol=5I`$?OeC-hP3SC zJCp6}YmyB&m?`t7th{w5X!F^bk$yRy#*1Z~7xQWa+bx!vYV4KkvvbAF+;b~fj99Pj zniD&%%XCZQT3yESO^vb9VL=gGlQx%V?mV-CbsKxir&psdIad}<0WQOF|8LiWJGi?;ET{_EqF#Sx0-QxXnZ;H?4_a43EdDeWpkJci^J(T&rbMHBHvtFjmD|&{mGb07DNeq=?)1u-EQdKu*H(U8 zv+_0nWYzC$wx2Q9^0ohex}8&m>4VRkr3WCP+t;9*8VH>k+_|FDaH+V?iYSA? unit.shield / max)).row(); } + @Override + public void created(Unit unit){ + unit.shield = max; + } + public void checkRadius(Unit unit){ //timer2 is used to store radius scale as an effect realRad = radiusScale * radius; diff --git a/core/src/mindustry/entities/abilities/ShieldArcAbility.java b/core/src/mindustry/entities/abilities/ShieldArcAbility.java index 0af8f3377c..a4d60c3eec 100644 --- a/core/src/mindustry/entities/abilities/ShieldArcAbility.java +++ b/core/src/mindustry/entities/abilities/ShieldArcAbility.java @@ -11,7 +11,6 @@ import mindustry.*; import mindustry.content.*; import mindustry.gen.*; import mindustry.graphics.*; -import mindustry.type.*; import mindustry.ui.*; public class ShieldArcAbility extends Ability{ @@ -102,7 +101,7 @@ public class ShieldArcAbility extends Ability{ } @Override - public void init(UnitType type){ + public void created(Unit unit){ data = max; } diff --git a/core/src/mindustry/type/UnitType.java b/core/src/mindustry/type/UnitType.java index c12e1309e2..5ddbbe7763 100644 --- a/core/src/mindustry/type/UnitType.java +++ b/core/src/mindustry/type/UnitType.java @@ -465,6 +465,9 @@ public class UnitType extends UnlockableContent implements Senseable{ if(unit.controller() instanceof CommandAI command && defaultCommand != null){ command.command = defaultCommand; } + for(var ability : unit.abilities){ + ability.created(unit); + } unit.ammo = ammoCapacity; //fill up on ammo upon creation unit.elevation = flying ? 1f : 0; unit.heal(); diff --git a/gradle.properties b/gradle.properties index 32b6a7e754..68c4b0c8f4 100644 --- a/gradle.properties +++ b/gradle.properties @@ -26,4 +26,4 @@ org.gradle.caching=true org.gradle.internal.http.socketTimeout=100000 org.gradle.internal.http.connectionTimeout=100000 android.enableR8.fullMode=false -archash=124ba82104 +archash=d631900a9e From 7fbf4cacad7ee14cbdb79b7231b2175a7ee0e529 Mon Sep 17 00:00:00 2001 From: Anuken Date: Sat, 11 Jan 2025 21:11:48 -0500 Subject: [PATCH 076/460] Pruned server_v7.json to fix iOS server ping crash --- core/src/mindustry/logic/GlobalVars.java | 8 +- servers_v7.json | 442 +++++++++++------------ 2 files changed, 208 insertions(+), 242 deletions(-) diff --git a/core/src/mindustry/logic/GlobalVars.java b/core/src/mindustry/logic/GlobalVars.java index 4832be2ce8..e1a57959cd 100644 --- a/core/src/mindustry/logic/GlobalVars.java +++ b/core/src/mindustry/logic/GlobalVars.java @@ -34,9 +34,9 @@ public class GlobalVars{ private ObjectSet privilegedNames = new ObjectSet<>(); private UnlockableContent[][] logicIdToContent; private int[][] contentIdToLogicId; - + public static final Seq soundNames = new Seq<>(); - + public void init(){ putEntryOnly("sectionProcessor"); @@ -91,7 +91,7 @@ public class GlobalVars{ put("@ctrlProcessor", ctrlProcessor); put("@ctrlPlayer", ctrlPlayer); put("@ctrlCommand", ctrlCommand); - + //sounds if(Core.assets != null){ for(Sound sound : Core.assets.getAll(Sound.class, new Seq<>(Sound.class))){ @@ -203,7 +203,7 @@ public class GlobalVars{ varClient.numval = net.client() ? 1 : 0; //client - if(!net.server() && player != null){ + if(player != null){ varClientLocale.objval = player.locale(); varClientUnit.objval = player.unit(); varClientName.objval = player.name(); diff --git a/servers_v7.json b/servers_v7.json index 823fe41dfc..8e61f05869 100644 --- a/servers_v7.json +++ b/servers_v7.json @@ -1,339 +1,305 @@ [ { "name": "EscoCorp", - "address": ["121.127.37.17:6567", "121.127.37.17:6568", "121.127.37.17:6569", "121.127.37.17:6570", "121.127.37.17:6571"] - }, - { - "name": "Redundancy Dept", - "address": ["min7.include-once.org:8000", "min7.include-once.org:8001"] + "address": [ + "121.127.37.17:6567", + "121.127.37.17:6568", + "121.127.37.17:6569", + "121.127.37.17:6570", + "121.127.37.17:6571" + ] }, { "name": "EchoDustry", - "address": ["node1.stellarch.org:7003", "node1.stellarch.org:7004"] - }, - { - "name": "TSR Network", - "address": ["de-prem-01.hosts.optikservers.com:35526", "de-prem-01.hosts.optikservers.com:35915", "de-prem-01.hosts.optikservers.com:35250", "de-prem-01.hosts.optikservers.com:27526", "de-prem-01.hosts.optikservers.com:35376", "de-prem-01.hosts.optikservers.com:35895"] - }, - { - "name": "Toast Mindustry", - "address": ["192.3.139.5:6567", "192.3.139.5:6568", "192.3.139.5:6569", "104.168.64.154:6567", "104.168.64.154:6568", "104.168.64.154:6569"] + "address": [ + "node1.stellarch.org:7004" + ] }, { "name": "gods field", - "address": ["n2.akiracloud.net:10225","n2.akiracloud.net:10335"] - }, - { - "name": "STP", - "address": ["23.88.73.88:25617"] - }, - { - "name": "Meow Empire ≫ MEM PROJECT", - "address": ["a2.corenodes.host:25514"] - }, - { - "name" : "LesGarsCools", - "address": ["est1.be"] - }, - { - "name": "meiqiuMDT", - "address": ["cn.meiqiumdt.top","ai.meiqiumdt.top","cn2.meiqiumdt.top"] + "address": [ + "n2.akiracloud.net:10225", + "n2.akiracloud.net:10335" + ] }, { "name": "DontVin", - "address": ["45.84.59.49:1342","45.137.205.185:1068","45.137.205.185:1190","45.137.205.185:1191","134.255.218.3:1142","45.137.205.185:1192","45.137.205.185:1193","45.137.205.185:1221","be.phoenix-network.dev","be.phoenix-network.dev:1111","be.phoenix-network.dev:2222","be.phoenix-network.dev:3333","be.phoenix-network.dev:4444","be.phoenix-network.dev:5555","be.phoenix-network.dev:6666","be.phoenix-network.dev:7777","be.phoenix-network.dev:8888","be.phoenix-network.dev:9999"] - }, - { - "name": "Crux's Citadel", - "address": ["45.158.9.198:32865","45.158.9.198:30055","45.158.9.198:32175","45.158.9.198:30252","176.9.150.40:35899","129.154.47.57:26645","176.9.150.40:35930","129.154.47.57:27993","129.154.47.57:26881","176.9.150.40:35168","176.9.150.40:35900","176.9.150.40:35031","176.9.150.40:35154"] - }, - { - "name": "Chilldustry", - "address": ["trelesco.xyz", "95.84.198.97"] - }, - { - "name": "ShardDustry Eventos", - "address": ["45.158.9.198:31719"] - }, - { - "name": "ShardDustry ES", - "address": ["45.158.9.198:32389"] - }, - { - "name": "Tamazia", - "address": ["5.250.178.221:6567","5.250.178.221:6677"] - }, - { - "name": "Crux's Federation", - "address": ["de-free-01.hosts.optikservers.com:32538", "de-free-01.hosts.optikservers.com:31421", "fsn1.bbn.one:37019"] - }, - { - "name": "Tendhost", - "address": ["tendhost.ddns.net:7576"] - }, - { - "name": "ECAN", - "address": ["mindustry.ecansol.com:6597", "mindustry.ecansol.com:6499", "mindustry.ecansol.com:6599"] - }, - { - "name": "SMoke of Anarchy", - "address": ["mindustry.smokeofanarchy.ru", "mindustry.smokeofanarchy.ru:6568", "mindustry.smokeofanarchy.ru:6569", "mindustry.smokeofanarchy.ru:6570", "mindustry.smokeofanarchy.ru:6571", "mindustry.smokeofanarchy.ru:6572", "mindustry.smokeofanarchy.ru:6573", "mindustry.smokeofanarchy.ru:6574", "mindustry.smokeofanarchy.ru:6575", "mindustry.smokeofanarchy.ru:6576"] - }, - { - "name": "Mindustry.pl", - "address": ["1.baseduser.eu.org:6966", "1.baseduser.eu.org:6666", "1.baseduser.eu.org:6000"] - }, - { - "name": "SynapseOS", - "address": ["0nera.ru:7777"] - }, - { - "name": "Voiddustry Servers", - "address": ["45.144.66.250:6567", "185.189.14.201:6567"] + "address": [ + "be.phoenix-network.dev:4444" + ] }, { "name": "thedimas", - "address": ["130.162.212.232", "130.162.212.232:6503","130.162.212.232:6505", "130.162.212.232:6506", "130.162.212.232:6507", "130.162.212.232:6508", "130.162.212.232:6509", "130.162.212.232:6510", "130.162.212.232:6511", "130.162.212.232:6512", "130.162.212.232:6513"] - }, - { - "name": "HexPvP Network", - "address": ["hexpvp.ddns.net", "kycb42148.ddns.net:6614"] - }, - { - "name": "Unidustry", - "address": ["51.81.57.217:33703"] + "address": [ + "130.162.212.232", + "130.162.212.232:6503", + "130.162.212.232:6505", + "130.162.212.232:6507", + "130.162.212.232:6508", + "130.162.212.232:6509", + "130.162.212.232:6510", + "130.162.212.232:6511", + "130.162.212.232:6513" + ] }, { "name": "KMWStudios", - "address": ["kislota.kmwstudios.org:28101", "kislota.kmwstudios.org:28102", "kislota.kmwstudios.org:28103", "kislota.kmwstudios.org:28104", "kislota.kmwstudios.org:28105", "kislota.kmwstudios.org:28106", "kislota.kmwstudios.org:28107"] + "address": [ + "kislota.kmwstudios.org:28102", + "kislota.kmwstudios.org:28103", + "kislota.kmwstudios.org:28104", + "kislota.kmwstudios.org:28105", + "kislota.kmwstudios.org:28106", + "kislota.kmwstudios.org:28107" + ] }, { "name": "XCore", - "address": ["128.140.88.66", "128.140.88.66:6568", "128.140.88.66:6569", "128.140.88.66:6570", "128.140.88.66:6571", "128.140.88.66:6572", "128.140.88.66:6573", "128.140.88.66:6574", "128.140.88.66:6575"] + "address": [ + "128.140.88.66", + "128.140.88.66:6568", + "128.140.88.66:6569", + "128.140.88.66:6570", + "128.140.88.66:6571", + "128.140.88.66:6572", + "128.140.88.66:6573", + "128.140.88.66:6574", + "128.140.88.66:6575" + ] }, { "name": "MinDurka", - "address": ["mindurka.fun", "mindurka.fun:3001", "mindurka.fun:3002", "mindurka.fun:3003", "mindurka.fun:3004", "mindurka.fun:3005", "mindurka.fun:3006", "mindurka.fun:3007", "mindurka.fun:3008", "mindurka.fun:3009", "mindurka.fun:3010", "mindurka.fun:3011"] + "address": [ + "mindurka.fun", + "mindurka.fun:3001", + "mindurka.fun:3002", + "mindurka.fun:3003", + "mindurka.fun:3004", + "mindurka.fun:3005", + "mindurka.fun:3006", + "mindurka.fun:3007", + "mindurka.fun:3008", + "mindurka.fun:3009", + "mindurka.fun:3010", + "mindurka.fun:3011" + ] }, { "name": "Chaotic Neutral", - "address": ["37.187.73.180:7011", "37.187.73.180:7012", "37.187.73.180:7013", "37.187.73.180:7014", "37.187.73.180:7015", "37.187.73.180:7016", "37.187.73.180:7017"] + "address": [ + "37.187.73.180:7011", + "37.187.73.180:7013", + "37.187.73.180:7014", + "37.187.73.180:7015", + "37.187.73.180:7016", + "37.187.73.180:7017" + ] }, { "name": "io", - "address": ["148.251.184.58", "148.251.184.58:1000", "148.251.184.58:2000", "148.251.184.58:3000", "148.251.184.58:4000"] - }, - { - "name": "Korea", - "address": ["mindustry.kr"] - }, - { - "name": "LatamDustry", - "address": ["45.158.9.23:5532", "45.158.9.23:5422", "45.158.9.23:5463", "45.158.9.23:5520"] - }, - { - "name": "Pandorum", - "address": ["pandorum.su:5018", "pandorum.su:5019", "pandorum.su:5020"] + "address": [ + "148.251.184.58", + "148.251.184.58:1000", + "148.251.184.58:2000", + "148.251.184.58:3000", + "148.251.184.58:4000" + ] }, { "name": "Tinylake", - "address": ["cn.mindustry.top", "g.mindustry.top", "cn.mindustry.top:40003", "cn.mindustry.top:40500"] + "address": [ + "cn.mindustry.top" + ] }, { "name": "Fish", - "address": ["162.248.101.95", "162.248.100.98", "162.248.100.133", "162.248.102.204", "162.248.101.53", "37.187.73.180:7012"] + "address": [ + "162.248.101.95", + "162.248.100.98", + "162.248.100.133", + "162.248.101.53" + ] }, { "name": "OmniCorp Classic", - "address": ["omnidustry.ru:6567", "omnidustry.ru:6568", "omnidustry.ru:6569", "omnidustry.ru:6570", "omnidustry.ru:6571", "omnidustry.ru:6572", "omnidustry.ru:6573", "omnidustry.ru:6574"] + "address": [ + "omnidustry.ru:6567", + "omnidustry.ru:6568", + "omnidustry.ru:6569", + "omnidustry.ru:6570", + "omnidustry.ru:6571", + "omnidustry.ru:6572", + "omnidustry.ru:6573", + "omnidustry.ru:6574" + ] }, { "name": "The Devil", - "address": ["xem8k5.mindustry.top:8169", "test.xem8k5.top:8920", "other.xem8k5.top:10936", "n2.akiracloud.net:10404", "new.xem8k5.top"] + "address": [ + "new.xem8k5.top" + ] }, { "name": "Eradication Mindustry", - "address": ["140.238.246.78:7000", "140.238.246.78:7001", "140.238.246.78:7002", "140.238.246.78:7003", "130.61.22.183:7000", "130.61.22.183:7001", "130.61.22.183:7002", "130.61.22.183:7003", "62.30.47.116:7000", "62.30.47.116:7001", "62.30.47.116:7002", "62.30.47.116:7003", "144.24.196.119:7000", "144.24.196.119:7001", "144.24.196.119:7002", "144.24.196.119:7003"] + "address": [ + "130.61.22.183:7000", + "130.61.22.183:7001", + "144.24.196.119:7001" + ] }, { "name": "Conservatory", - "address": ["165.232.137.170:6567", "165.232.137.170:6568"] + "address": [ + "165.232.137.170:6567", + "165.232.137.170:6568" + ] }, { "name": "mindustry.ddns.net", - "address": ["mindustry.ddns.net", "mindustry.ddns.net:1000", "mindustry.ddns.net:2000", "mindustry.ddns.net:3000", "mindustry.ddns.net:4000", "mindustry.ddns.net:5000"] - }, - { - "name": "EasyPlay.su", - "address": ["easyplay.su", "s.easyplay.su:6577", "s.easyplay.su:6686", "s.easyplay.su:6567"] + "address": [ + "mindustry.ddns.net", + "mindustry.ddns.net:1000", + "mindustry.ddns.net:2000", + "mindustry.ddns.net:3000", + "mindustry.ddns.net:4000", + "mindustry.ddns.net:5000" + ] }, { "name": "Sectorized", - "address": ["sectorized.freeddns.org"] + "address": [ + "sectorized.freeddns.org" + ] }, { "name": "Apricot Alliance", - "address": ["apricotalliance.org"] + "address": [ + "apricotalliance.org" + ] }, { - "name": "Sakura", - "address": ["160.16.207.141:20527", "160.16.207.141:21527", "160.16.207.141:22527", "160.16.207.141:23527", "160.16.207.141:24527", "160.16.207.141:25527", "160.16.207.141:26527", "160.16.207.141:27527", "160.16.207.141:28527", "160.16.207.141:29527", "162.43.36.78:20527", "162.43.36.78:21527", "162.43.36.78:22527", "162.43.36.78:23527", "162.43.36.78:24527", "162.43.36.78:25527", "162.43.36.78:26527", "162.43.36.78:27527", "162.43.36.78:28527", "162.43.36.78:29527", "sakura-mindustry.jp:20527"] - }, - { - "name": "|RussianServers|[]", - "address": ["02calm.ru:6567", "02calm.ru:6568", "02calm.ru:6569", "02calm.ru:6570", "02calm.ru:6571", "02calm.ru:6572", "02calm.ru:6573"] - }, - { - "name": "Hungarian", - "address": ["play.hudustry.tk"] - }, - { - "name": "SubZero", - "address": ["mintyserver.net"] + "name": "Sakura", + "address": [ + "162.43.36.78:22527", + "162.43.36.78:24527", + "162.43.36.78:25527", + "162.43.36.78:27527", + "162.43.36.78:28527" + ] }, { "name": "Router Pi", - "address": ["a55c81b7c4d6e6d604651a93f8af5cd83.asuscomm.com", "a55c81b7c4d6e6d604651a93f8af5cd83.asuscomm.com:6568", "a55c81b7c4d6e6d604651a93f8af5cd83.asuscomm.com:6569", "a55c81b7c4d6e6d604651a93f8af5cd83.asuscomm.com:6570", "a55c81b7c4d6e6d604651a93f8af5cd83.asuscomm.com:6571", "a55c81b7c4d6e6d604651a93f8af5cd83.asuscomm.com:6572", "a55c81b7c4d6e6d604651a93f8af5cd83.asuscomm.com:6573", "a55c81b7c4d6e6d604651a93f8af5cd83.asuscomm.com:6574"] + "address": [ + "a55c81b7c4d6e6d604651a93f8af5cd83.asuscomm.com:6569", + "a55c81b7c4d6e6d604651a93f8af5cd83.asuscomm.com:6570" + ] }, { - "name": "Anana", - "address": ["mdt.mdtleague.top","mdt2.mdtleague.top"] - }, - { - "name": "Vortex", - "address": ["vortex.org.ru", "vortex.org.ru:6568", "vortex.org.ru:6569", "vortex.org.ru:6570", "vortex.org.ru:6571"] - }, - { - "name": "Botipont", - "address": ["213.181.206.126:6567", "213.181.206.126:6568", "213.181.206.126:6569"] + "name": "Anana", + "address": [ + "mdt.mdtleague.top" + ] }, { "name": "Exploding Cowards", - "address": ["45.43.163.225:25538"] + "address": [ + "45.43.163.225:25538" + ] }, { "name": "Realm of Serene Lime", - "address": ["mindustry.icu", "sx.mindustry.icu", "mod.mindustry.icu"] - }, - { - "name": "CreateDustry", - "address": ["95.216.68.161:55639"] - }, - { - "name": "Official Mindustry Events", - "address": ["event.baseduser.eu.org"], - "prioritized": true - }, - { - "name": "LifeTime", - "address": ["srv3.godlike.club:28561", "srv3.godlike.club:26508"] + "address": [ + "mindustry.icu", + "sx.mindustry.icu" + ] }, { "name": "Cyandustry", - "address": ["45.88.109.9:7000","45.88.109.9:7001", "45.88.109.9:7002", "45.88.109.9:7003", "45.88.109.9:7004", "45.88.109.9:7005", "45.88.109.9:7006", "45.88.109.9:7007", "45.88.109.9:7008"] - }, - { - "name": "Four Family", - "address": ["118.127.8.162:25503"] - }, - { - "name": "ToxoFlame", - "address": ["193.233.133.223", "193.233.133.223:6568", "193.233.133.223:6569"] + "address": [ + "45.88.109.9:7000", + "45.88.109.9:7001", + "45.88.109.9:7003", + "45.88.109.9:7004", + "45.88.109.9:7006", + "45.88.109.9:7008" + ] }, { "name": "MeowIsland", - "address": ["meowisland.ru:5000", "meowisland.ru:5001", "meowisland.ru:5002", "meowisland.ru:5003", "meowisland.ru:5004"] + "address": [ + "meowisland.ru:5000", + "meowisland.ru:5001", + "meowisland.ru:5003", + "meowisland.ru:5004" + ] }, { "name": "Exdustry", - "address": ["exd.noxia.cloud:6001", "exd.noxia.cloud:6002", "exd.noxia.cloud:6003", "exd.noxia.cloud:6004", "exd.noxia.cloud:6005", "exd.noxia.cloud:6006", "exd.noxia.cloud:6007", "exd.noxia.cloud:6008", "exd.noxia.cloud:6009", "exd.noxia.cloud:6010"] - }, - { - "name": "abcxyz remaster", - "address": ["144.76.57.59:25978", "23.88.73.88:13612", "144.76.57.59:11999", "144.76.57.59:16491", "144.76.57.59:28740"] + "address": [ + "exd.noxia.cloud:6001", + "exd.noxia.cloud:6002", + "exd.noxia.cloud:6003", + "exd.noxia.cloud:6004", + "exd.noxia.cloud:6006" + ] }, { "name": "CroCraft Network", - "address": ["193.122.53.98:6567", "193.122.53.98:20130"] - }, - { - "name": "Extra Utilities", - "address": ["kub.2k12.win:6567", "203.135.99.65:15142", "203.135.99.65:15143", "203.135.99.71:15142", "203.135.99.71:15143"] + "address": [ + "193.122.53.98:6567" + ] }, { "name": "Alex Multiverse", - "address": ["alexmindustryv7.servegame.com:25588", "172.234.80.96:6768", "139.162.41.78:6767", "172.245.187.143:6868", "172.245.187.143:6869", "92.119.127.171:6888", "181.215.58.41:1106", "181.215.58.41:1105", "181.215.58.9:1027", "23.95.107.12"] - }, - { - "name": "Open PVP", - "address": ["162.55.42.21:5555", "188.225.56.29:6567"] + "address": [ + "alexmindustryv7.servegame.com:25588", + "172.234.80.96:6768", + "139.162.41.78:6767", + "172.245.187.143:6868", + "172.245.187.143:6869", + "92.119.127.171:6888", + "23.95.107.12" + ] }, { "name": "XuwenHost", - "address": ["mdt.xuwenblock.cn:6567","mdt.nekopark.cloud:6567"] - }, - { - "name": "Gadgetroch's Server", - "address": ["mindustry.gadgetroch.com", "mindustry.gadgetroch.com:6568", "mindustry.gadgetroch.com:6569"] - }, - { - "name": "Duel.Server", - "address":["160.251.41.148:6567","160.251.41.148:6568","160.251.41.148:6569","160.251.41.148:6570"] - }, - { - "name": "AZDustry", - "address": ["148.251.77.197:2012"] + "address": [ + "mdt.nekopark.cloud:6567" + ] }, { "name": "Erepulo", - "address": ["95.84.198.97:5401", "95.84.198.97:5402", "95.84.198.97:5403", "95.84.198.97:5404", "95.84.198.97:5500", "199.83.103.251", "frost-heaven.ru", "frost-heaven.ru:6568", "frost-heaven.ru:6569", "91.200.150.116"] + "address": [ + "95.84.198.97:5401", + "95.84.198.97:5402", + "95.84.198.97:5403", + "frost-heaven.ru", + "frost-heaven.ru:6568", + "91.200.150.116" + ] }, { "name": "FrostHeaven", - "address": ["95.84.198.97:2357", "frost-heaven.ru", "frost-heaven.ru:6568", "frost-heaven.ru:6569", "91.200.150.116", "frost-heaven.ru:6570", "frost-heaven.ru:6571", "frost-heaven.ru:6572"] - }, - { - "name": "MineCore", - "address": ["194.247.42.11:27792", "194.247.42.11:27977", "194.247.42.61:27989", "194.247.42.181:28514"] - }, - { - "name": "Mindus•VN", - "address": ["167.71.199.155:25550"] - }, - { - "name": "Impact", - "address": ["impactmindustry.ddns.net"] - }, - { - "name": "2D2R", - "address": ["45.137.205.185:1045", "51.89.173.50:1432", "45.137.205.185:1052", "45.137.205.185:1040"] - }, - { - "name": "TRFACT", - "address": ["213.142.156.83:25565"] + "address": [ + "frost-heaven.ru", + "frost-heaven.ru:6568", + "91.200.150.116", + "frost-heaven.ru:6570" + ] }, { "name": "ArmyOFUkraine", - "address": ["194.247.42.131:27715", "194.247.42.131:27512", "194.247.42.130:27505"] - }, - { - "name": "Erbium", - "address": ["hp5.nexcord.com:12066", "hp5.nexcord.com:11999", "hp5.nexcord.com:12067"] - }, - { - "name": "Vndustry", - "address": ["vndustry.ddns.net"] - }, - { - "name": "ChillOut", - "address": ["87.228.8.133", "87.228.8.133:6568"] + "address": [ + "194.247.42.131:27715", + "194.247.42.131:27512", + "194.247.42.130:27505" + ] }, { "name": "VNM", - "address": ["server.mindustry-tool.com", "server.mindustry-tool.com:6568", "server.mindustry-tool.com:6569", "server.mindustry-tool.com:6760", "server.mindustry-tool.com:6761", "server.mindustry-tool.com:6762", "server.mindustry-tool.com:6763", "server.mindustry-tool.com:6764", "server.mindustry-tool.com:6765", "server.mindustry-tool.com:6766", "server.mindustry-tool.com:6767", "server.mindustry-tool.com:6768", "server.mindustry-tool.com:6769", "server.mindustry-tool.com:6770", "server.mindustry-tool.com:6771", "server.mindustry-tool.com:6772", "server.mindustry-tool.com:6773", "server.mindustry-tool.com:6774", "server.mindustry-tool.com:6775", "server.mindustry-tool.com:6776", "server.mindustry-tool.com:6777", "server.mindustry-tool.com:6778", "server.mindustry-tool.com:6779", "server.mindustry-tool.com:6780"] - }, - { - "name": "LibreDUSTRY", - "address": ["46.4.114.111"] + "address": [ + "server.mindustry-tool.com", + "server.mindustry-tool.com:6568" + ] } -] +] \ No newline at end of file From 46483713837a481b32068264d29f90c9a6bd4038 Mon Sep 17 00:00:00 2001 From: Anuken Date: Sat, 11 Jan 2025 21:32:44 -0500 Subject: [PATCH 077/460] iOS ping crash fix --- core/src/mindustry/net/Net.java | 5 ++++- gradle.properties | 2 +- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/core/src/mindustry/net/Net.java b/core/src/mindustry/net/Net.java index 145238bf88..a5c319220e 100644 --- a/core/src/mindustry/net/Net.java +++ b/core/src/mindustry/net/Net.java @@ -35,7 +35,10 @@ public class Net{ private final ObjectMap, Cons> clientListeners = new ObjectMap<>(); private final ObjectMap, Cons2> serverListeners = new ObjectMap<>(); private final IntMap streams = new IntMap<>(); - private final ExecutorService pingExecutor = OS.isWindows && !OS.is64Bit ? Threads.boundedExecutor("Ping Servers", 5) : Threads.unboundedExecutor(); + private final ExecutorService pingExecutor = + OS.isWindows && !OS.is64Bit ? Threads.boundedExecutor("Ping Servers", 5) : //on 32-bit windows, thread spam crashes + OS.isIos ? Threads.boundedExecutor("Ping Servers", 32) : //on IOS, 256 threads can crash, so limit the amount + Threads.unboundedExecutor(); private final NetProvider provider; diff --git a/gradle.properties b/gradle.properties index 68c4b0c8f4..c0897d5b42 100644 --- a/gradle.properties +++ b/gradle.properties @@ -26,4 +26,4 @@ org.gradle.caching=true org.gradle.internal.http.socketTimeout=100000 org.gradle.internal.http.connectionTimeout=100000 android.enableR8.fullMode=false -archash=d631900a9e +archash=9dd4c1ee65 From 9c3bfab09b94641cc96e27e1ee73921bc4d02b90 Mon Sep 17 00:00:00 2001 From: TheRadioactiveBanana <89061718+TheRadioactiveBanana@users.noreply.github.com> Date: Sun, 12 Jan 2025 08:31:52 +0530 Subject: [PATCH 078/460] unstab eradication IPs (#10413) adding all the addresses that I will be using soon, remove the ones i wont --- servers_v7.json | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/servers_v7.json b/servers_v7.json index 8e61f05869..7ecf91dde5 100644 --- a/servers_v7.json +++ b/servers_v7.json @@ -144,7 +144,16 @@ "address": [ "130.61.22.183:7000", "130.61.22.183:7001", - "144.24.196.119:7001" + "144.24.196.119:7001", + "144.24.196.119:7002", + "140.238.246.78:7000", + "140.238.246.78:7001", + "62.30.47.116:7000", + "62.30.47.116:7001", + "122.180.249.217:7000", + "122.180.249.217:7001", + "20.186.12.170:7000", + "20.2.202.238:7000" ] }, { @@ -302,4 +311,4 @@ "server.mindustry-tool.com:6568" ] } -] \ No newline at end of file +] From aadb994bdcdea185cbe6519e07e225964c8e5cef Mon Sep 17 00:00:00 2001 From: Anuken Date: Sun, 12 Jan 2025 09:01:14 -0500 Subject: [PATCH 079/460] Changed BlockPlan#block to Block --- core/src/mindustry/ai/BaseBuilderAI.java | 2 +- core/src/mindustry/ai/types/BuilderAI.java | 6 +- core/src/mindustry/content/Blocks.java | 86 +++++++++++++++++++ core/src/mindustry/core/Control.java | 2 +- core/src/mindustry/core/Logic.java | 3 +- .../mindustry/entities/comp/BuildingComp.java | 2 +- core/src/mindustry/game/Teams.java | 5 +- .../src/mindustry/graphics/BlockRenderer.java | 2 +- core/src/mindustry/input/InputHandler.java | 14 +-- core/src/mindustry/io/SaveVersion.java | 4 +- core/src/mindustry/io/versions/Save3.java | 2 +- .../world/blocks/defense/BuildTurret.java | 4 +- 12 files changed, 109 insertions(+), 23 deletions(-) diff --git a/core/src/mindustry/ai/BaseBuilderAI.java b/core/src/mindustry/ai/BaseBuilderAI.java index 3df72adb70..e9126f6ca5 100644 --- a/core/src/mindustry/ai/BaseBuilderAI.java +++ b/core/src/mindustry/ai/BaseBuilderAI.java @@ -258,7 +258,7 @@ public class BaseBuilderAI{ //queue it for(Stile tile : result.tiles){ - data.plans.add(new BlockPlan(cx + tile.x, cy + tile.y, tile.rotation, tile.block.id, tile.config)); + data.plans.add(new BlockPlan(cx + tile.x, cy + tile.y, tile.rotation, tile.block, tile.config)); } return true; diff --git a/core/src/mindustry/ai/types/BuilderAI.java b/core/src/mindustry/ai/types/BuilderAI.java index 4fa15db50e..7932ad8d9c 100644 --- a/core/src/mindustry/ai/types/BuilderAI.java +++ b/core/src/mindustry/ai/types/BuilderAI.java @@ -179,12 +179,12 @@ public class BuilderAI extends AIController{ BlockPlan block = blocks.first(); //check if it's already been placed - if(world.tile(block.x, block.y) != null && world.tile(block.x, block.y).block().id == block.block){ + if(world.tile(block.x, block.y) != null && world.tile(block.x, block.y).block() == block.block){ blocks.removeFirst(); - }else if(Build.validPlace(content.block(block.block), unit.team(), block.x, block.y, block.rotation) && (!alwaysFlee || !nearEnemy(block.x, block.y))){ //it's valid + }else if(Build.validPlace(block.block, unit.team(), block.x, block.y, block.rotation) && (!alwaysFlee || !nearEnemy(block.x, block.y))){ //it's valid lastPlan = block; //add build plan - unit.addBuild(new BuildPlan(block.x, block.y, block.rotation, content.block(block.block), block.config)); + unit.addBuild(new BuildPlan(block.x, block.y, block.rotation, block.block, block.config)); //shift build plan to tail so next unit builds something else blocks.addLast(blocks.removeFirst()); }else{ diff --git a/core/src/mindustry/content/Blocks.java b/core/src/mindustry/content/Blocks.java index 3d7c6ff13e..1bf9c9783c 100644 --- a/core/src/mindustry/content/Blocks.java +++ b/core/src/mindustry/content/Blocks.java @@ -4923,6 +4923,92 @@ public class Blocks{ abilities.add(new ForceFieldAbility(30f, 0f, 160f, 999999999f)); }}; + }}, + + //TODO finish this + Items.surgeAlloy, new BulletType(){{ + shootEffect = Fx.shootBig; + smokeEffect = Fx.shootSmokeMissile; + ammoMultiplier = 1f; + + spawnUnit = new MissileUnitType("scathe-missile-surge"){{ + speed = 4.6f; + maxRange = 6f; + lifetime = 60f * 5.5f; + outlineColor = Pal.darkOutline; + engineColor = trailColor = Pal.redLight; + engineLayer = Layer.effect; + engineSize = 3.1f; + engineOffset = 10f; + rotateSpeed = 0.25f; + trailLength = 18; + missileAccelTime = 50f; + lowAltitude = true; + loopSound = Sounds.missileTrail; + loopSoundVolume = 0.6f; + deathSound = Sounds.largeExplosion; + targetAir = false; + targetUnderBlocks = false; + + fogRadius = 6f; + + health = 210; + + weapons.add(new Weapon(){{ + shootCone = 360f; + mirror = false; + reload = 1f; + deathExplosionEffect = Fx.massiveExplosion; + shootOnDeath = true; + shake = 10f; + bullet = new ExplosionBulletType(1500f, 65f){{ + hitColor = Pal.redLight; + shootEffect = new MultiEffect(Fx.massiveExplosion, Fx.scatheExplosion, Fx.scatheLight, new WaveEffect(){{ + lifetime = 10f; + strokeFrom = 4f; + sizeTo = 130f; + }}); + + collidesAir = false; + buildingDamageMultiplier = 0.25f; + + ammoMultiplier = 1f; + fragLifeMin = 0.1f; + fragBullets = 7; + fragBullet = new ArtilleryBulletType(3.4f, 32){{ + buildingDamageMultiplier = 0.3f; + drag = 0.02f; + hitEffect = Fx.massiveExplosion; + despawnEffect = Fx.scatheSlash; + knockback = 0.8f; + lifetime = 23f; + width = height = 18f; + collidesTiles = false; + splashDamageRadius = 40f; + splashDamage = 160f; + backColor = trailColor = hitColor = Pal.redLight; + frontColor = Color.white; + smokeEffect = Fx.shootBigSmoke2; + despawnShake = 7f; + lightRadius = 30f; + lightColor = Pal.redLight; + lightOpacity = 0.5f; + + trailLength = 20; + trailWidth = 3.5f; + trailEffect = Fx.none; + }}; + }}; + }}); + + abilities.add(new MoveEffectAbility(){{ + effect = Fx.missileTrailSmoke; + rotation = 180f; + y = -9f; + color = Color.grays(0.6f).lerp(Pal.redLight, 0.5f).a(0.4f); + interval = 7f; + }}); + }}; }} ); diff --git a/core/src/mindustry/core/Control.java b/core/src/mindustry/core/Control.java index db1ccc68c3..da36e8009a 100644 --- a/core/src/mindustry/core/Control.java +++ b/core/src/mindustry/core/Control.java @@ -458,7 +458,7 @@ public class Control implements ApplicationListener, Loadable{ for(var plan : state.rules.waveTeam.data().plans){ Tile tile = world.tile(plan.x, plan.y); if(tile != null){ - tile.setBlock(content.block(plan.block), state.rules.waveTeam, plan.rotation); + tile.setBlock(plan.block, state.rules.waveTeam, plan.rotation); if(plan.config != null && tile.build != null){ tile.build.configureAny(plan.config); } diff --git a/core/src/mindustry/core/Logic.java b/core/src/mindustry/core/Logic.java index 09c9e67e55..4b4f0be7d3 100644 --- a/core/src/mindustry/core/Logic.java +++ b/core/src/mindustry/core/Logic.java @@ -210,8 +210,7 @@ public class Logic implements ApplicationListener{ var bounds = tile.block().bounds(tile.x, tile.y, Tmp.r1); while(it.hasNext()){ BlockPlan b = it.next(); - Block block = content.block(b.block); - if(bounds.overlaps(block.bounds(b.x, b.y, Tmp.r2))){ + if(bounds.overlaps(b.block.bounds(b.x, b.y, Tmp.r2))){ b.removed = true; it.remove(); } diff --git a/core/src/mindustry/entities/comp/BuildingComp.java b/core/src/mindustry/entities/comp/BuildingComp.java index 98c14d3497..b5611ca178 100644 --- a/core/src/mindustry/entities/comp/BuildingComp.java +++ b/core/src/mindustry/entities/comp/BuildingComp.java @@ -338,7 +338,7 @@ abstract class BuildingComp implements Posc, Teamc, Healthc, Buildingc, Timerc, } } - data.plans.addFirst(new BlockPlan(tile.x, tile.y, (short)rotation, toAdd.id, overrideConfig == null ? config() : overrideConfig)); + data.plans.addFirst(new BlockPlan(tile.x, tile.y, (short)rotation, toAdd, overrideConfig == null ? config() : overrideConfig)); } public @Nullable Tile findClosestEdge(Position to, Boolf solid){ diff --git a/core/src/mindustry/game/Teams.java b/core/src/mindustry/game/Teams.java index 036cbc2d43..4597e5874e 100644 --- a/core/src/mindustry/game/Teams.java +++ b/core/src/mindustry/game/Teams.java @@ -435,11 +435,12 @@ public class Teams{ /** Represents a block made by this team that was destroyed somewhere on the map. * This does not include deconstructed blocks.*/ public static class BlockPlan{ - public final short x, y, rotation, block; + public final short x, y, rotation; + public final Block block; public final Object config; public boolean removed; - public BlockPlan(int x, int y, short rotation, short block, Object config){ + public BlockPlan(int x, int y, short rotation, Block block, Object config){ this.x = (short)x; this.y = (short)y; this.rotation = rotation; diff --git a/core/src/mindustry/graphics/BlockRenderer.java b/core/src/mindustry/graphics/BlockRenderer.java index aec39b6661..10e29ef135 100644 --- a/core/src/mindustry/graphics/BlockRenderer.java +++ b/core/src/mindustry/graphics/BlockRenderer.java @@ -274,7 +274,7 @@ public class BlockRenderer{ if(brokenFade > 0.001f){ for(BlockPlan block : player.team().data().plans){ - Block b = content.block(block.block); + Block b = block.block; if(!camera.bounds(Tmp.r1).grow(tilesize * 2f).overlaps(Tmp.r2.setSize(b.size * tilesize).setCenter(block.x * tilesize + b.offset, block.y * tilesize + b.offset))) continue; Draw.alpha(0.33f * brokenFade); diff --git a/core/src/mindustry/input/InputHandler.java b/core/src/mindustry/input/InputHandler.java index 55961ae966..0ec6712921 100644 --- a/core/src/mindustry/input/InputHandler.java +++ b/core/src/mindustry/input/InputHandler.java @@ -1441,9 +1441,9 @@ public abstract class InputHandler implements InputProcessor, GestureListener{ } for(BlockPlan plan : player.team().data().plans){ - Block block = content.block(plan.block); + Block block = plan.block; if(block.bounds(plan.x, plan.y, Tmp.r2).overlaps(Tmp.r1)){ - drawSelected(plan.x, plan.y, content.block(plan.block), Pal.remove); + drawSelected(plan.x, plan.y, plan.block, Pal.remove); } } @@ -1463,9 +1463,9 @@ public abstract class InputHandler implements InputProcessor, GestureListener{ Tmp.r1.set(result.x, result.y, result.x2 - result.x, result.y2 - result.y); for(BlockPlan plan : player.team().data().plans){ - Block block = content.block(plan.block); + Block block = plan.block; if(block.bounds(plan.x, plan.y, Tmp.r2).overlaps(Tmp.r1)){ - drawSelected(plan.x, plan.y, content.block(plan.block), Pal.sapBullet); + drawSelected(plan.x, plan.y, plan.block, Pal.sapBullet); } } @@ -1629,7 +1629,7 @@ public abstract class InputHandler implements InputProcessor, GestureListener{ Iterator broken = player.team().data().plans.iterator(); while(broken.hasNext()){ BlockPlan plan = broken.next(); - Block block = content.block(plan.block); + Block block = plan.block; if(block.bounds(plan.x, plan.y, Tmp.r2).overlaps(Tmp.r1)){ removed.add(Point2.pack(plan.x, plan.y)); plan.removed = true; @@ -2000,9 +2000,9 @@ public abstract class InputHandler implements InputProcessor, GestureListener{ Iterator broken = player.team().data().plans.iterator(); while(broken.hasNext()){ BlockPlan plan = broken.next(); - Block block = content.block(plan.block); + Block block = plan.block; if(block.bounds(plan.x, plan.y, Tmp.r2).overlaps(Tmp.r1)){ - player.unit().addBuild(new BuildPlan(plan.x, plan.y, plan.rotation, content.block(plan.block), plan.config)); + player.unit().addBuild(new BuildPlan(plan.x, plan.y, plan.rotation, plan.block, plan.config)); } } diff --git a/core/src/mindustry/io/SaveVersion.java b/core/src/mindustry/io/SaveVersion.java index 71b7f72d72..1dff34d35f 100644 --- a/core/src/mindustry/io/SaveVersion.java +++ b/core/src/mindustry/io/SaveVersion.java @@ -368,7 +368,7 @@ public abstract class SaveVersion extends SaveFileReader{ stream.writeShort(block.x); stream.writeShort(block.y); stream.writeShort(block.rotation); - stream.writeShort(block.block); + stream.writeShort(block.block.id); TypeIO.writeObject(Writes.get(stream), block.config); } } @@ -426,7 +426,7 @@ public abstract class SaveVersion extends SaveFileReader{ var obj = TypeIO.readObject(reads); //cannot have two in the same position if(set.add(Point2.pack(x, y))){ - data.plans.addLast(new BlockPlan(x, y, rot, content.block(bid).id, obj)); + data.plans.addLast(new BlockPlan(x, y, rot, content.block(bid), obj)); } } } diff --git a/core/src/mindustry/io/versions/Save3.java b/core/src/mindustry/io/versions/Save3.java index 51cd8bf4aa..6eff300d88 100644 --- a/core/src/mindustry/io/versions/Save3.java +++ b/core/src/mindustry/io/versions/Save3.java @@ -21,7 +21,7 @@ public class Save3 extends LegacySaveVersion{ TeamData data = team.data(); int blocks = stream.readInt(); for(int j = 0; j < blocks; j++){ - data.plans.addLast(new BlockPlan(stream.readShort(), stream.readShort(), stream.readShort(), content.block(stream.readShort()).id, stream.readInt())); + data.plans.addLast(new BlockPlan(stream.readShort(), stream.readShort(), stream.readShort(), content.block(stream.readShort()), stream.readInt())); } } diff --git a/core/src/mindustry/world/blocks/defense/BuildTurret.java b/core/src/mindustry/world/blocks/defense/BuildTurret.java index 10330650ac..a6468c5433 100644 --- a/core/src/mindustry/world/blocks/defense/BuildTurret.java +++ b/core/src/mindustry/world/blocks/defense/BuildTurret.java @@ -146,10 +146,10 @@ public class BuildTurret extends BaseTurret{ for(int i = 0; i < blocks.size; i++){ var block = blocks.get(i); if(within(block.x * tilesize, block.y * tilesize, range)){ - var btype = content.block(block.block); + var btype = block.block; if(Build.validPlace(btype, unit.team(), block.x, block.y, block.rotation) && (state.rules.infiniteResources || team.rules().infiniteResources || team.items().has(btype.requirements, state.rules.buildCostMultiplier))){ - unit.addBuild(new BuildPlan(block.x, block.y, block.rotation, content.block(block.block), block.config)); + unit.addBuild(new BuildPlan(block.x, block.y, block.rotation, block.block, block.config)); //shift build plan to tail so next unit builds something else blocks.addLast(blocks.removeIndex(i)); lastPlan = block; From 0d5a4636c8bb98624768c101fd7ca0f678b4c893 Mon Sep 17 00:00:00 2001 From: Anuken Date: Sun, 12 Jan 2025 10:00:01 -0500 Subject: [PATCH 080/460] Fixed #10399 --- core/assets/bundles/bundle.properties | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/core/assets/bundles/bundle.properties b/core/assets/bundles/bundle.properties index ccadd6d8be..885f15e25d 100644 --- a/core/assets/bundles/bundle.properties +++ b/core/assets/bundles/bundle.properties @@ -1139,8 +1139,8 @@ bullet.healamount = [stat]{0}[lightgray] direct repair bullet.multiplier = [stat]{0}[lightgray] ammo/item bullet.reload = [stat]{0}%[lightgray] fire rate bullet.range = [stat]{0}[lightgray] tiles range -bullet.notargetsmissiles = [stat] ignores buildings -bullet.notargetsbuildings = [stat] ignores missiles +bullet.notargetsmissiles = [stat] ignores missiles +bullet.notargetsbuildings = [stat] ignores buildings unit.blocks = blocks unit.blockssquared = blocks\u00B2 From ca7f34e6e1e087ae94c65654117db5f1c1ac9b62 Mon Sep 17 00:00:00 2001 From: Anuken Date: Sun, 12 Jan 2025 10:02:42 -0500 Subject: [PATCH 081/460] Fixed #10410 --- core/src/mindustry/entities/comp/HealthComp.java | 3 +++ core/src/mindustry/entities/comp/ShieldComp.java | 2 ++ 2 files changed, 5 insertions(+) diff --git a/core/src/mindustry/entities/comp/HealthComp.java b/core/src/mindustry/entities/comp/HealthComp.java index c06e6909e3..f315b3fb75 100644 --- a/core/src/mindustry/entities/comp/HealthComp.java +++ b/core/src/mindustry/entities/comp/HealthComp.java @@ -59,6 +59,8 @@ abstract class HealthComp implements Entityc, Posc{ } void damage(float amount){ + if(Float.isNaN(health)) health = 0f; + health -= amount; hitTime = 1f; if(health <= 0 && !dead){ @@ -86,6 +88,7 @@ abstract class HealthComp implements Entityc, Posc{ void clampHealth(){ health = Math.min(health, maxHealth); + if(Float.isNaN(health)) health = 0f; } /** Heals by a flat amount. */ diff --git a/core/src/mindustry/entities/comp/ShieldComp.java b/core/src/mindustry/entities/comp/ShieldComp.java index c290fa6251..f2f6e4c808 100644 --- a/core/src/mindustry/entities/comp/ShieldComp.java +++ b/core/src/mindustry/entities/comp/ShieldComp.java @@ -45,6 +45,8 @@ abstract class ShieldComp implements Healthc, Posc{ protected void rawDamage(float amount){ boolean hadShields = shield > 0.0001f; + if(Float.isNaN(health)) health = 0f; + if(hadShields){ shieldAlpha = 1f; } From 75cd83286a0e50cea53796104953d483322f8a3b Mon Sep 17 00:00:00 2001 From: Anuken Date: Sun, 12 Jan 2025 10:10:26 -0500 Subject: [PATCH 082/460] Fixed #10385 --- core/src/mindustry/world/DirectionalItemBuffer.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/core/src/mindustry/world/DirectionalItemBuffer.java b/core/src/mindustry/world/DirectionalItemBuffer.java index 48cbdc84c0..0367664826 100644 --- a/core/src/mindustry/world/DirectionalItemBuffer.java +++ b/core/src/mindustry/world/DirectionalItemBuffer.java @@ -23,7 +23,7 @@ public class DirectionalItemBuffer{ public void accept(int buffer, Item item){ if(!accepts(buffer)) return; - buffers[buffer][indexes[buffer]++] = BufferItem.get((byte)item.id, Time.time); + buffers[buffer][indexes[buffer]++] = BufferItem.get(item.id, Time.time); } public Item poll(int buffer, float speed){ @@ -68,7 +68,7 @@ public class DirectionalItemBuffer{ @Struct class BufferItemStruct{ - byte item; + short item; float time; } } From d414a65cbbb4499e4e0d69ebc6c115f1fc4da428 Mon Sep 17 00:00:00 2001 From: Anuken Date: Sun, 12 Jan 2025 10:16:04 -0500 Subject: [PATCH 083/460] Fixed #10394 --- core/src/mindustry/editor/MapProcessorsDialog.java | 2 +- core/src/mindustry/logic/LogicDialog.java | 6 +++--- core/src/mindustry/ui/dialogs/IconSelectDialog.java | 7 ++++++- 3 files changed, 10 insertions(+), 5 deletions(-) diff --git a/core/src/mindustry/editor/MapProcessorsDialog.java b/core/src/mindustry/editor/MapProcessorsDialog.java index dd0f73d3f7..8867c2df13 100644 --- a/core/src/mindustry/editor/MapProcessorsDialog.java +++ b/core/src/mindustry/editor/MapProcessorsDialog.java @@ -19,7 +19,7 @@ import mindustry.world.blocks.logic.LogicBlock.*; import static mindustry.Vars.*; public class MapProcessorsDialog extends BaseDialog{ - private IconSelectDialog iconSelect = new IconSelectDialog(); + private IconSelectDialog iconSelect = new IconSelectDialog(true); private TextField search; private Seq processors = new Seq<>(); private Table list; diff --git a/core/src/mindustry/logic/LogicDialog.java b/core/src/mindustry/logic/LogicDialog.java index 1dd6907e98..ef3dfb4a53 100644 --- a/core/src/mindustry/logic/LogicDialog.java +++ b/core/src/mindustry/logic/LogicDialog.java @@ -155,13 +155,13 @@ public class LogicDialog extends BaseDialog{ buttons.button("@variables", Icon.menu, () -> { BaseDialog dialog = new BaseDialog("@variables"); dialog.hidden(() -> { - if(!wasPaused && !net.active()){ + if(!wasPaused && !net.active() && !state.isMenu()){ state.set(State.paused); } }); dialog.shown(() -> { - if(!wasPaused && !net.active()){ + if(!wasPaused && !net.active() && !state.isMenu()){ state.set(State.playing); } }); @@ -220,7 +220,7 @@ public class LogicDialog extends BaseDialog{ dialog.buttons.button("@logic.globals", Icon.list, () -> globalsDialog.show()).size(210f, 64f); dialog.show(); - }).name("variables").disabled(b -> executor == null || executor.vars.length == 0); + }).name("variables").disabled(b -> executor == null || executor.vars.length == 0 || state.isMenu()); buttons.button("@add", Icon.add, () -> { showAddDialog(); diff --git a/core/src/mindustry/ui/dialogs/IconSelectDialog.java b/core/src/mindustry/ui/dialogs/IconSelectDialog.java index 153d25761d..33766e6bfb 100644 --- a/core/src/mindustry/ui/dialogs/IconSelectDialog.java +++ b/core/src/mindustry/ui/dialogs/IconSelectDialog.java @@ -15,8 +15,13 @@ import static mindustry.Vars.*; public class IconSelectDialog extends Dialog{ private Intc consumer = i -> Log.info("you have mere seconds"); + private boolean allowLocked; public IconSelectDialog(){ + this(true); + } + + public IconSelectDialog(boolean allowLocked){ closeOnBack(); setFillParent(true); @@ -52,7 +57,7 @@ public class IconSelectDialog extends Dialog{ i = 0; for(UnlockableContent u : content.getBy(ctype).as()){ - if(!u.isHidden() && u.unlocked()){ + if(!u.isHidden() && (allowLocked || u.unlocked())){ t.button(new TextureRegionDrawable(u.uiIcon), Styles.flati, iconMed, () -> { hide(); consumer.get(u.emojiChar()); From db6e911fb9c264b1e7315a29c8b9186ff40dad9b Mon Sep 17 00:00:00 2001 From: Gureumi Date: Mon, 13 Jan 2025 00:21:49 +0900 Subject: [PATCH 084/460] Add server again (#10415) * Update servers_v7.json * Update servers_v7.json --- servers_v7.json | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/servers_v7.json b/servers_v7.json index 7ecf91dde5..abe666e179 100644 --- a/servers_v7.json +++ b/servers_v7.json @@ -310,5 +310,11 @@ "server.mindustry-tool.com", "server.mindustry-tool.com:6568" ] + }, + { + "name": "Korea", + "address": [ + "mindustry.kr" + ] } ] From 875b9e339c3be0572c64ae78a9009ead13c11502 Mon Sep 17 00:00:00 2001 From: OGalaxy <112196968+TheTrueInfinity@users.noreply.github.com> Date: Sun, 12 Jan 2025 18:38:01 +0300 Subject: [PATCH 085/460] Update servers_v7.json (#10414) Added a new game mode. --- servers_v7.json | 11 +---------- 1 file changed, 1 insertion(+), 10 deletions(-) diff --git a/servers_v7.json b/servers_v7.json index abe666e179..8fc29b630a 100644 --- a/servers_v7.json +++ b/servers_v7.json @@ -122,16 +122,7 @@ }, { "name": "OmniCorp Classic", - "address": [ - "omnidustry.ru:6567", - "omnidustry.ru:6568", - "omnidustry.ru:6569", - "omnidustry.ru:6570", - "omnidustry.ru:6571", - "omnidustry.ru:6572", - "omnidustry.ru:6573", - "omnidustry.ru:6574" - ] + "address": ["omnidustry.ru:6567", "omnidustry.ru:6568", "omnidustry.ru:6569", "omnidustry.ru:6570", "omnidustry.ru:6571", "omnidustry.ru:6572", "omnidustry.ru:6573", "omnidustry.ru:6574", "omnidustry.ru:6575"] }, { "name": "The Devil", From ddd4de7b7b914e0195361b6842b7c4cd2ecf4e08 Mon Sep 17 00:00:00 2001 From: Anuken Date: Sun, 12 Jan 2025 17:08:51 -0500 Subject: [PATCH 086/460] Scathe surge missiles --- .../weapons/scathe-missile-surge-cell.png | Bin 0 -> 236 bytes .../scathe-missile-surge-split-cell.png | Bin 0 -> 236 bytes .../weapons/scathe-missile-surge-split.png | Bin 0 -> 789 bytes .../units/weapons/scathe-missile-surge.png | Bin 0 -> 1399 bytes core/assets/icons/icons.properties | 2 + core/src/mindustry/ai/types/MissileAI.java | 2 +- core/src/mindustry/content/Blocks.java | 119 ++++++++++++------ core/src/mindustry/content/Fx.java | 57 +++++++++ .../mindustry/entities/bullet/BulletType.java | 4 +- .../src/mindustry/entities/comp/UnitComp.java | 4 + 10 files changed, 146 insertions(+), 42 deletions(-) create mode 100644 core/assets-raw/sprites/units/weapons/scathe-missile-surge-cell.png create mode 100644 core/assets-raw/sprites/units/weapons/scathe-missile-surge-split-cell.png create mode 100644 core/assets-raw/sprites/units/weapons/scathe-missile-surge-split.png create mode 100644 core/assets-raw/sprites/units/weapons/scathe-missile-surge.png diff --git a/core/assets-raw/sprites/units/weapons/scathe-missile-surge-cell.png b/core/assets-raw/sprites/units/weapons/scathe-missile-surge-cell.png new file mode 100644 index 0000000000000000000000000000000000000000..7854083dfd74dba7e77b2fd1d17ee5880abd5ac5 GIT binary patch literal 236 zcmeAS@N?(olHy`uVBq!ia0y~yV6b9fV2I~nV_;y|*>vR~0|NtNage(c!@6@aFBupZ zmU+53hE&XXd*!sRv!Q^)Meao+t33XD&1#5}tM+gb$!ueNzDDIxK$#`K6$$m eBgoQ*{oh#k9C7z{=M;?t@jYGrT-G@yGywqCDphy@ literal 0 HcmV?d00001 diff --git a/core/assets-raw/sprites/units/weapons/scathe-missile-surge-split-cell.png b/core/assets-raw/sprites/units/weapons/scathe-missile-surge-split-cell.png new file mode 100644 index 0000000000000000000000000000000000000000..7854083dfd74dba7e77b2fd1d17ee5880abd5ac5 GIT binary patch literal 236 zcmeAS@N?(olHy`uVBq!ia0y~yV6b9fV2I~nV_;y|*>vR~0|NtNage(c!@6@aFBupZ zmU+53hE&XXd*!sRv!Q^)Meao+t33XD&1#5}tM+gb$!ueNzDDIxK$#`K6$$m eBgoQ*{oh#k9C7z{=M;?t@jYGrT-G@yGywqCDphy@ literal 0 HcmV?d00001 diff --git a/core/assets-raw/sprites/units/weapons/scathe-missile-surge-split.png b/core/assets-raw/sprites/units/weapons/scathe-missile-surge-split.png new file mode 100644 index 0000000000000000000000000000000000000000..22d7b4a9a6c592b25cafa50c3de177f08cfd750e GIT binary patch literal 789 zcmeAS@N?(olHy`uVBq!ia0y~yV6b9fV2I~nV_;y|*>vR~0|NtNage(c!@6@aFBuq^ z&U?BzhE&XXJ8OTQu%kfx@s3%`3uaBe^h+^^#VK#4VCWRSi#wf5I=BLtZ(ZcFExPKK zN8Y1w2d6rQzO1ERv!0dZe>WFyezv-3-(TbVZ|~i^6W1Ygybu}v<5rtCxAu44<>SZS z-`{Kc`u>{5Aw~(R*_S$1BsWY5eXlU}&U=0rmn)^0Cl}q?w5r#85~FwI*0$nFjM_KT zrFx5&I9%Qx4T|;E-_hpaYZ+qpkKxd8L7~VAqsYKR?80-uWeg; zpuNQ;HFVmi)vrZobJqU*@%+h;!|HWTwSPA?9cRto0J51oH)l=C0jIFqt7ko@P0Mr* zE%6CjFxO#4=QWmfnyZy=32m6B6C)zHqD?16L{cG2Os%SP@2j0>o?Y+1e{)yN%)kE> z?AB#9bR1*sojO%z=eFn!v8PO$Q_p(xeKnl6>`d~$h;J?~m%F{c)m-;|`Luh!Yi@3z zvEfR48#@8Pi+Q`(^=+?mX-<*xI5lJY#5pOqo=2>5*~w=a`I4z%%C+@VTkYZ=9XND< z_G6uB{V5M$EpFIfQOuavXZ$hFSDz)yAYmK#iQb%(8H-m)UA$XnyK-l^K+;z2{I4C` zbiVpuOuu|(>y+HLtAEOEo#6U~k$ckabmwDJs)adEGHrjfNKd82Bdp&>uKJVdnmY6MHc4u^bD-X&@zVu(~Ny^g9-YKRhd)ma5 zSHE8p5cq^+&etov){Hw{)m^pfr_EPcQoH!~?%O$cck~>q6I|$4vM=J>oieXKK2x?u z7p3y`^FN;`>FLQd{pk{=okk~~FmAFGGv2#HrlyilX{XVPk`23(PP>J2KYPFUztpou zyWduQ648JAp}M3aWW&~f5(`$p69}5H_N#ZJt$X{q=S?|lufn|Ly3=9kmp00i_>zopr0ACn<)c^nh literal 0 HcmV?d00001 diff --git a/core/assets-raw/sprites/units/weapons/scathe-missile-surge.png b/core/assets-raw/sprites/units/weapons/scathe-missile-surge.png new file mode 100644 index 0000000000000000000000000000000000000000..fd05b27d08dabf614e74fe8921275d84cdb8a84c GIT binary patch literal 1399 zcmeAS@N?(olHy`uVBq!ia0y~yV6bCgV2I~nV_;y|kXf>ufq{XsILO_JVcj{ImkbQ7 zhMq2tAr*7p&fcFb;wW-lJxSIj`gHfv&fE=KLk&HoxE(zN*QiWQn(ntnNPDAz$~H%( ztl4Ha+Hw-N`ATyBV?6e%b!Yke?`LvCzHx`&d3&b%{`qrn{@l3jn|WnL;9|GlU(dG| z$a&u1_q$?Nef^$)1qJfW>PIdtSoo0L_n2dITZ_ETL^fV2uDS^-VHp<$KAaV`n~z^uAok%Zlikf5Hoi@j0_^!~zd!q$CVD=! ziNWLq_j}!V=6x0nZETqaVTHC!ME0#PV&~Ory?(4k=tqGouarpZ_H#^uKLS+OR#&f2 z)LB<|Ht+qqguTlae~8)}^&#}yE0HNzH-sD$GGCQcaI%B_-eu>k1LCDkLG3?4@PxOl2xt2}Vm zI`QHMo333=+0^u$k@3a5N8d~KR69-U@3}N*N5t{n>M!3t`Y!2zWA%~=&K?|WI&R)A z$VZ=;CUvY+4HV$W&XH>HBNi+(+?+j|7E@ZbSM9H zw7cfgDZdWaZd}K*%+WdL#L~)3B3U181kHpRw>t$}DqmQcvi4urdn4|f^6!?Pywp48 z+_OhF89kWKUVj+V_jT>!%`$>BqvqUtouzwQ{@r|Chjn*$rI@j#F2CHV*?v@8wK%-J zLCjfmX-WRme`m_MZS8+bI(a$>IrIy z%HQzplTBF?({rXr2U9nd9Nyx#zv%U)Gw#9HzozK*hwF&O{Fdk8dE%D!@9ga3hj#9; z5&Ln$rcXF;|9-t`oqCa)26MElCb@pNT^{!QoQxk!b#B)Ax2@L~?2HMCJXNhHCZkn% z@8=P<18iOo)?T>teGgy7veZK23bMTQ&O*S$`c(&GH^EZZi2 zi-Xgt53g=DX6~I=zh%#rbv&=0ewfxOdct(a*Y@AV>6Yg6q`%CV@F{TP$CFi6pO;(5 zPyPGj-%Pj6p;V@frd&Y~~dJY#}#d%wf-N$d9QD^1DD)Zw~tNqWV!ekXN4nR9DY zye0kO>vYf8EYkXTa@!7(DOStYPRZ&x_3$gF&~B^Hz@~MEt%XfD!YbC9uee?zci_?` z-3Ns}y!VPYMQq=xmcFks(5n35ZZ%Q$vCoc0PiOTVh+gOz_~Sx}nB)m1{{LG(O;Xa$ z^JV#dcn$y8f~Ozyx+iac8r!<}g2MaF**_|{D~bV?sJJeuFX$l6q~Zj=1+wk74KRU%(a{S!Fj^wy%qM$=P-#FVdQ&MBb@0M{76WdHyG literal 0 HcmV?d00001 diff --git a/core/assets/icons/icons.properties b/core/assets/icons/icons.properties index 7c59cb0a5d..c2f98f347f 100755 --- a/core/assets/icons/icons.properties +++ b/core/assets/icons/icons.properties @@ -593,3 +593,5 @@ 63089=small-heat-redirector|block-small-heat-redirector-ui 63088=large-cliff-crusher|block-large-cliff-crusher-ui 63087=scathe-missile-phase|unit-scathe-missile-phase-ui +63086=scathe-missile-surge|unit-scathe-missile-surge-ui +63085=scathe-missile-surge-split|unit-scathe-missile-surge-split-ui diff --git a/core/src/mindustry/ai/types/MissileAI.java b/core/src/mindustry/ai/types/MissileAI.java index 4dafbd6156..50b450afe5 100644 --- a/core/src/mindustry/ai/types/MissileAI.java +++ b/core/src/mindustry/ai/types/MissileAI.java @@ -33,7 +33,7 @@ public class MissileAI extends AIController{ @Override public Teamc target(float x, float y, float range, boolean air, boolean ground){ - return Units.closestTarget(unit.team, x, y, range, u -> u.checkTarget(air, ground), t -> ground && (!t.block.underBullets || (shooter != null && t == Vars.world.buildWorld(shooter.aimX, shooter.aimY)))); + return Units.closestTarget(unit.team, x, y, range, u -> u.checkTarget(air, ground) && !u.isMissile(), t -> ground && (!t.block.underBullets || (shooter != null && t == Vars.world.buildWorld(shooter.aimX, shooter.aimY)))); } @Override diff --git a/core/src/mindustry/content/Blocks.java b/core/src/mindustry/content/Blocks.java index 1bf9c9783c..013497374f 100644 --- a/core/src/mindustry/content/Blocks.java +++ b/core/src/mindustry/content/Blocks.java @@ -4752,7 +4752,8 @@ public class Blocks{ ammo( Items.carbide, new BulletType(){{ shootEffect = Fx.shootBig; - smokeEffect = Fx.shootSmokeMissile; + smokeEffect = Fx.shootSmokeMissileColor; + hitColor = Pal.redLight; ammoMultiplier = 1f; spawnUnit = new MissileUnitType("scathe-missile"){{ @@ -4838,7 +4839,8 @@ public class Blocks{ //TODO - needs balancing Items.phaseFabric, new BulletType(){{ shootEffect = Fx.shootBig; - smokeEffect = Fx.shootSmokeMissile; + smokeEffect = Fx.shootSmokeMissileColor; + hitColor = Color.valueOf("ffd37f"); ammoMultiplier = 1f; reloadMultiplier = 0.8f; @@ -4925,24 +4927,27 @@ public class Blocks{ }}; }}, - //TODO finish this Items.surgeAlloy, new BulletType(){{ shootEffect = Fx.shootBig; - smokeEffect = Fx.shootSmokeMissile; + smokeEffect = Fx.shootSmokeMissileColor; + hitColor = Color.valueOf("f7e97e"); + ammoMultiplier = 1f; + rangeChange = -8f*9f; + reloadMultiplier = 0.9f; spawnUnit = new MissileUnitType("scathe-missile-surge"){{ - speed = 4.6f; + speed = 4.4f; maxRange = 6f; - lifetime = 60f * 5.5f; + lifetime = 60f * 1.4f; outlineColor = Pal.darkOutline; - engineColor = trailColor = Pal.redLight; + engineColor = trailColor = Color.valueOf("f7e97e"); engineLayer = Layer.effect; engineSize = 3.1f; engineOffset = 10f; rotateSpeed = 0.25f; trailLength = 18; - missileAccelTime = 50f; + missileAccelTime = 30f; lowAltitude = true; loopSound = Sounds.missileTrail; loopSoundVolume = 0.6f; @@ -4952,7 +4957,7 @@ public class Blocks{ fogRadius = 6f; - health = 210; + health = 400; weapons.add(new Weapon(){{ shootCone = 360f; @@ -4961,42 +4966,78 @@ public class Blocks{ deathExplosionEffect = Fx.massiveExplosion; shootOnDeath = true; shake = 10f; - bullet = new ExplosionBulletType(1500f, 65f){{ - hitColor = Pal.redLight; - shootEffect = new MultiEffect(Fx.massiveExplosion, Fx.scatheExplosion, Fx.scatheLight, new WaveEffect(){{ - lifetime = 10f; - strokeFrom = 4f; - sizeTo = 130f; - }}); + bullet = new ExplosionBulletType(400f, 40f){{ + hitColor = engineColor; + shootEffect = new MultiEffect(Fx.massiveExplosion, Fx.scatheExplosionSmall); collidesAir = false; buildingDamageMultiplier = 0.25f; ammoMultiplier = 1f; fragLifeMin = 0.1f; - fragBullets = 7; - fragBullet = new ArtilleryBulletType(3.4f, 32){{ - buildingDamageMultiplier = 0.3f; - drag = 0.02f; - hitEffect = Fx.massiveExplosion; - despawnEffect = Fx.scatheSlash; - knockback = 0.8f; - lifetime = 23f; - width = height = 18f; - collidesTiles = false; - splashDamageRadius = 40f; - splashDamage = 160f; - backColor = trailColor = hitColor = Pal.redLight; - frontColor = Color.white; - smokeEffect = Fx.shootBigSmoke2; - despawnShake = 7f; - lightRadius = 30f; - lightColor = Pal.redLight; - lightOpacity = 0.5f; + fragBullets = 5; + fragRandomSpread = 0f; + fragSpread = 37f; + fragBullet = new BulletType(){{ + shootEffect = Fx.shootBig; + smokeEffect = Fx.shootSmokeMissile; + ammoMultiplier = 1f; - trailLength = 20; - trailWidth = 3.5f; - trailEffect = Fx.none; + spawnUnit = new MissileUnitType("scathe-missile-surge-split"){{ + speed = 4.8f; + maxRange = 6f; + lifetime = 60f * 3.5f; + outlineColor = Pal.darkOutline; + engineColor = trailColor = Color.valueOf("f7e97e"); + engineLayer = Layer.effect; + engineSize = 2.2f; + engineOffset = 8f; + rotateSpeed = 1.35f; + trailLength = 12; + //missileAccelTime = 20f; + lowAltitude = true; + loopSound = Sounds.missileTrail; + loopSoundVolume = 0.6f; + deathSound = Sounds.largeExplosion; + targetAir = false; + targetUnderBlocks = false; + + fogRadius = 6f; + + health = 100; + + weapons.add(new Weapon(){{ + shootCone = 360f; + mirror = false; + reload = 1f; + deathExplosionEffect = Fx.massiveExplosion; + shootOnDeath = true; + shake = 10f; + bullet = new ExplosionBulletType(340f, 35f){{ + lightning = 5; + lightningDamage = 35f; + lightningLength = 8; + + hitColor = engineColor; + shootEffect = new MultiEffect(Fx.massiveExplosion, Fx.scatheExplosionSmall, Fx.scatheLightSmall, new WaveEffect(){{ + lifetime = 10f; + strokeFrom = 4f; + sizeTo = 100f; + }}); + + collidesAir = false; + buildingDamageMultiplier = 0.2f; + }}; + }}); + + abilities.add(new MoveEffectAbility(){{ + effect = Fx.missileTrailSmokeSmall; + rotation = 180f; + y = -9f; + color = Color.grays(0.6f).lerp(Color.valueOf("f7e97e"), 0.5f).a(0.4f); + interval = 5f; + }}); + }}; }}; }}; }}); @@ -5005,7 +5046,7 @@ public class Blocks{ effect = Fx.missileTrailSmoke; rotation = 180f; y = -9f; - color = Color.grays(0.6f).lerp(Pal.redLight, 0.5f).a(0.4f); + color = Color.grays(0.6f).lerp(Color.valueOf("f7e97e"), 0.5f).a(0.4f); interval = 7f; }}); }}; diff --git a/core/src/mindustry/content/Fx.java b/core/src/mindustry/content/Fx.java index 9fdbe7ac4d..3709d935f9 100644 --- a/core/src/mindustry/content/Fx.java +++ b/core/src/mindustry/content/Fx.java @@ -519,6 +519,26 @@ public class Fx{ } }).layer(Layer.bullet - 1f), + missileTrailSmokeSmall = new Effect(120f, 200f, b -> { + float intensity = 1.3f; + + color(b.color, 0.7f); + for(int i = 0; i < 3; i++){ + rand.setSeed(b.id*2 + i); + float lenScl = rand.random(0.5f, 1f); + int fi = i; + b.scaled(b.lifetime * lenScl, e -> { + randLenVectors(e.id + fi - 1, e.fin(Interp.pow10Out), (int)(2.9f * intensity), 13f * intensity, (x, y, in, out) -> { + float fout = e.fout(Interp.pow5Out) * rand.random(0.5f, 1f); + float rad = fout * ((2f + intensity) * 2.35f); + + Fill.circle(e.x + x, e.y + y, rad); + Drawf.light(e.x + x, e.y + y, rad * 2.5f, b.color, 0.5f); + }); + }); + } + }).layer(Layer.bullet - 1f), + neoplasmSplat = new Effect(400f, 300f, b -> { float intensity = 3f; @@ -557,6 +577,24 @@ public class Fx{ } }), + scatheExplosionSmall = new Effect(40f, 160f, e -> { + color(e.color); + stroke(e.fout() * 4f); + float circleRad = 6f + e.finpow() * 40f; + Lines.circle(e.x, e.y, circleRad); + + rand.setSeed(e.id); + for(int i = 0; i < 16; i++){ + float angle = rand.random(360f); + float lenRand = rand.random(0.5f, 1f); + Tmp.v1.trns(angle, circleRad); + + for(int s : Mathf.signs){ + Drawf.tri(e.x + Tmp.v1.x, e.y + Tmp.v1.y, e.foutpow() * 30f, e.fout() * 25f * lenRand + 6f, angle + 90f + s * 90f); + } + } + }), + scatheLight = new Effect(60f, 160f, e -> { float circleRad = 6f + e.finpow() * 60f; @@ -564,6 +602,13 @@ public class Fx{ Fill.circle(e.x, e.y, circleRad); }).layer(Layer.bullet + 2f), + scatheLightSmall = new Effect(60f, 160f, e -> { + float circleRad = 6f + e.finpow() * 40f; + + color(e.color, e.foutpow()); + Fill.circle(e.x, e.y, circleRad); + }).layer(Layer.bullet + 2f), + scatheSlash = new Effect(40f, 160f, e -> { Draw.color(e.color); for(int s : Mathf.signs){ @@ -1737,6 +1782,18 @@ public class Fx{ } }), + shootSmokeMissileColor = new Effect(130f, 300f, e -> { + color(e.color); + alpha(0.5f); + rand.setSeed(e.id); + for(int i = 0; i < 35; i++){ + v.trns(e.rotation + 180f + rand.range(21f), rand.random(e.finpow() * 90f)).add(rand.range(3f), rand.range(3f)); + e.scaled(e.lifetime * rand.random(0.2f, 1f), b -> { + Fill.circle(e.x + v.x, e.y + v.y, b.fout() * 9f + 0.3f); + }); + } + }), + regenParticle = new Effect(100f, e -> { color(Pal.regen); diff --git a/core/src/mindustry/entities/bullet/BulletType.java b/core/src/mindustry/entities/bullet/BulletType.java index 2c18fa158a..a4ad4fff13 100644 --- a/core/src/mindustry/entities/bullet/BulletType.java +++ b/core/src/mindustry/entities/bullet/BulletType.java @@ -527,7 +527,7 @@ public class BulletType extends Content implements Cloneable{ if(fragBullet != null && (fragOnAbsorb || !b.absorbed) && !(b.frags >= pierceFragCap && pierceFragCap > 0)){ for(int i = 0; i < fragBullets; i++){ float len = Mathf.random(fragOffsetMin, fragOffsetMax); - float a = b.rotation() + Mathf.range(fragRandomSpread / 2) + fragAngle + ((i - fragBullets/2) * fragSpread); + float a = b.rotation() + Mathf.range(fragRandomSpread / 2) + fragAngle + fragSpread * i - (fragBullets - 1) * fragSpread / 2f; fragBullet.create(b, x + Angles.trnsx(a, len), y + Angles.trnsy(a, len), a, Mathf.random(fragVelocityMin, fragVelocityMax), Mathf.random(fragLifeMin, fragLifeMax)); } b.frags++; @@ -819,7 +819,7 @@ public class BulletType extends Content implements Cloneable{ Bullet bullet = Bullet.create(); bullet.type = this; - bullet.owner = owner; + bullet.owner = shooter == null ? owner : shooter; bullet.team = team; bullet.time = 0f; bullet.originX = x; diff --git a/core/src/mindustry/entities/comp/UnitComp.java b/core/src/mindustry/entities/comp/UnitComp.java index 548e34965e..ef479e2956 100644 --- a/core/src/mindustry/entities/comp/UnitComp.java +++ b/core/src/mindustry/entities/comp/UnitComp.java @@ -445,6 +445,10 @@ abstract class UnitComp implements Healthc, Physicsc, Hitboxc, Statusc, Teamc, I } } + public boolean isMissile(){ + return this instanceof TimedKillc; + } + public int count(){ return team.data().countType(type); } From 59e64ab37c81877833b7818cc87c162209a1de90 Mon Sep 17 00:00:00 2001 From: Anuken Date: Sun, 12 Jan 2025 20:49:06 -0500 Subject: [PATCH 087/460] Fixed scathe bugs --- core/src/mindustry/content/Blocks.java | 8 +++++--- core/src/mindustry/entities/bullet/BulletType.java | 9 +++++---- core/src/mindustry/entities/comp/BulletComp.java | 3 ++- .../mindustry/world/blocks/defense/turrets/Turret.java | 4 ++-- gradle.properties | 2 +- 5 files changed, 15 insertions(+), 11 deletions(-) diff --git a/core/src/mindustry/content/Blocks.java b/core/src/mindustry/content/Blocks.java index 013497374f..7bc14ddaa6 100644 --- a/core/src/mindustry/content/Blocks.java +++ b/core/src/mindustry/content/Blocks.java @@ -4749,8 +4749,10 @@ public class Blocks{ scathe = new ItemTurret("scathe"){{ requirements(Category.turret, with(Items.silicon, 450, Items.graphite, 400, Items.tungsten, 500, Items.oxide, 100, Items.carbide, 200)); + predictTarget = false; + ammo( - Items.carbide, new BulletType(){{ + Items.carbide, new BulletType(0f, 0f){{ shootEffect = Fx.shootBig; smokeEffect = Fx.shootSmokeMissileColor; hitColor = Pal.redLight; @@ -4837,7 +4839,7 @@ public class Blocks{ }}, //TODO - needs balancing - Items.phaseFabric, new BulletType(){{ + Items.phaseFabric, new BulletType(0f, 0f){{ shootEffect = Fx.shootBig; smokeEffect = Fx.shootSmokeMissileColor; hitColor = Color.valueOf("ffd37f"); @@ -4927,7 +4929,7 @@ public class Blocks{ }}; }}, - Items.surgeAlloy, new BulletType(){{ + Items.surgeAlloy, new BulletType(0f, 0f){{ shootEffect = Fx.shootBig; smokeEffect = Fx.shootSmokeMissileColor; hitColor = Color.valueOf("f7e97e"); diff --git a/core/src/mindustry/entities/bullet/BulletType.java b/core/src/mindustry/entities/bullet/BulletType.java index a4ad4fff13..f5d9b5962c 100644 --- a/core/src/mindustry/entities/bullet/BulletType.java +++ b/core/src/mindustry/entities/bullet/BulletType.java @@ -754,15 +754,15 @@ public class BulletType extends Content implements Cloneable{ } public @Nullable Bullet create(Bullet parent, float x, float y, float angle){ - return create(parent.owner, parent.team, x, y, angle); + return create(parent.owner, parent.shooter, parent.team, x, y, angle, -1, 1f, 1f, null, null, -1f, -1f); } public @Nullable Bullet create(Bullet parent, float x, float y, float angle, float velocityScl, float lifeScale){ - return create(parent.owner, parent.team, x, y, angle, velocityScl, lifeScale); + return create(parent.owner, parent.shooter, parent.team, x, y, angle, -1, velocityScl, lifeScale, null, null, -1f, -1f); } public @Nullable Bullet create(Bullet parent, float x, float y, float angle, float velocityScl){ - return create(parent.owner(), parent.team, x, y, angle, velocityScl); + return create(parent.owner, parent.shooter, parent.team, x, y, angle, -1, velocityScl, 1f, null, null, -1f, -1f); } public @Nullable Bullet create(@Nullable Entityc owner, Team team, float x, float y, float angle, float damage, float velocityScl, float lifetimeScl, Object data){ @@ -819,7 +819,8 @@ public class BulletType extends Content implements Cloneable{ Bullet bullet = Bullet.create(); bullet.type = this; - bullet.owner = shooter == null ? owner : shooter; + bullet.owner = owner; + bullet.shooter = (shooter == null ? owner : shooter); bullet.team = team; bullet.time = 0f; bullet.originX = x; diff --git a/core/src/mindustry/entities/comp/BulletComp.java b/core/src/mindustry/entities/comp/BulletComp.java index d9c3aef000..35916e43f9 100644 --- a/core/src/mindustry/entities/comp/BulletComp.java +++ b/core/src/mindustry/entities/comp/BulletComp.java @@ -39,6 +39,7 @@ abstract class BulletComp implements Timedc, Damagec, Hitboxc, Teamc, Posc, Draw //setting this variable to true prevents lifetime from decreasing for a frame. transient boolean keepAlive; + transient Entityc shooter; transient @Nullable Tile aimTile; transient float aimX, aimY; transient float originX, originY; @@ -248,7 +249,7 @@ abstract class BulletComp implements Timedc, Damagec, Hitboxc, Teamc, Posc, Draw type.draw(self()); type.drawLight(self()); - + Draw.reset(); } diff --git a/core/src/mindustry/world/blocks/defense/turrets/Turret.java b/core/src/mindustry/world/blocks/defense/turrets/Turret.java index 183cf78743..e56be0378a 100644 --- a/core/src/mindustry/world/blocks/defense/turrets/Turret.java +++ b/core/src/mindustry/world/blocks/defense/turrets/Turret.java @@ -359,8 +359,8 @@ public class Turret extends ReloadTurret{ offset.set(h.deltaX(), h.deltaY()).scl(shoot.firstShotDelay / Time.delta); } - if(predictTarget){ - targetPos.set(Predict.intercept(this, pos, offset.x, offset.y, bullet.speed <= 0.01f ? 99999999f : bullet.speed)); + if(predictTarget && bullet.speed >= 0.01f){ + targetPos.set(Predict.intercept(this, pos, offset.x, offset.y, bullet.speed)); }else{ targetPos.set(pos); } diff --git a/gradle.properties b/gradle.properties index c0897d5b42..c5d42ecc57 100644 --- a/gradle.properties +++ b/gradle.properties @@ -26,4 +26,4 @@ org.gradle.caching=true org.gradle.internal.http.socketTimeout=100000 org.gradle.internal.http.connectionTimeout=100000 android.enableR8.fullMode=false -archash=9dd4c1ee65 +archash=4940b68158 From 8a436a44c4876c13dfbcc9d8d175af86bb8a2174 Mon Sep 17 00:00:00 2001 From: TheRadioactiveBanana <89061718+TheRadioactiveBanana@users.noreply.github.com> Date: Tue, 14 Jan 2025 10:16:24 +0530 Subject: [PATCH 088/460] mild oops (#10418) --- servers_v7.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/servers_v7.json b/servers_v7.json index 8fc29b630a..8da07d0128 100644 --- a/servers_v7.json +++ b/servers_v7.json @@ -135,8 +135,8 @@ "address": [ "130.61.22.183:7000", "130.61.22.183:7001", + "144.24.196.119:7000", "144.24.196.119:7001", - "144.24.196.119:7002", "140.238.246.78:7000", "140.238.246.78:7001", "62.30.47.116:7000", From 643506e39b6dfd444b82b0b590f56d212462f78e Mon Sep 17 00:00:00 2001 From: Anuken Date: Mon, 13 Jan 2025 23:46:44 -0500 Subject: [PATCH 089/460] Misc fixes --- core/src/mindustry/ai/Pathfinder.java | 11 +++++++++-- core/src/mindustry/content/Blocks.java | 11 ++++++----- core/src/mindustry/editor/WaveInfoDialog.java | 1 - 3 files changed, 15 insertions(+), 8 deletions(-) diff --git a/core/src/mindustry/ai/Pathfinder.java b/core/src/mindustry/ai/Pathfinder.java index c6a2ed0528..615568aed7 100644 --- a/core/src/mindustry/ai/Pathfinder.java +++ b/core/src/mindustry/ai/Pathfinder.java @@ -39,7 +39,8 @@ public class Pathfinder implements Runnable{ public static final int costGround = 0, costLegs = 1, - costNaval = 2; + costNaval = 2, + costHover = 3; public static final Seq costTypes = Seq.with( //ground @@ -63,7 +64,13 @@ public class Pathfinder implements Runnable{ PathTile.health(tile) * 5 + (PathTile.nearGround(tile) || PathTile.nearSolid(tile) ? 14 : 0) + (PathTile.deep(tile) ? 0 : 1) + - (PathTile.damages(tile) ? 35 : 0) + (PathTile.damages(tile) ? 35 : 0), + + //hover + (team, tile) -> + (((PathTile.team(tile) == team && !PathTile.teamPassable(tile)) || PathTile.team(tile) == 0) && PathTile.solid(tile)) ? impassable : 1 + + PathTile.health(tile) * 5 + + (PathTile.nearSolid(tile) ? 2 : 0) ); /** tile data, see PathTileStruct - kept as a separate array for threading reasons */ diff --git a/core/src/mindustry/content/Blocks.java b/core/src/mindustry/content/Blocks.java index 7bc14ddaa6..6300222ebf 100644 --- a/core/src/mindustry/content/Blocks.java +++ b/core/src/mindustry/content/Blocks.java @@ -4112,7 +4112,7 @@ public class Blocks{ hitEffect = despawnEffect = Fx.hitSquaresColor; buildingDamageMultiplier = 0.2f; }}, - Items.oxide, new BasicBulletType(8f, 95){{ + Items.oxide, new BasicBulletType(8f, 120){{ knockback = 3f; width = 25f; hitSize = 7f; @@ -4456,6 +4456,7 @@ public class Blocks{ reloadMultiplier = 0.85f; speed = 9.5f; width = height = 16; + pierceCap = 2; shrinkY = 0.3f; backSprite = "large-bomb-back"; sprite = "mine-bullet"; @@ -4982,7 +4983,8 @@ public class Blocks{ fragSpread = 37f; fragBullet = new BulletType(){{ shootEffect = Fx.shootBig; - smokeEffect = Fx.shootSmokeMissile; + smokeEffect = Fx.shootSmokeMissileColor; + hitColor = engineColor; ammoMultiplier = 1f; spawnUnit = new MissileUnitType("scathe-missile-surge-split"){{ @@ -4994,9 +4996,8 @@ public class Blocks{ engineLayer = Layer.effect; engineSize = 2.2f; engineOffset = 8f; - rotateSpeed = 1.35f; + rotateSpeed = 1.4f; trailLength = 12; - //missileAccelTime = 20f; lowAltitude = true; loopSound = Sounds.missileTrail; loopSoundVolume = 0.6f; @@ -5016,7 +5017,7 @@ public class Blocks{ shootOnDeath = true; shake = 10f; bullet = new ExplosionBulletType(340f, 35f){{ - lightning = 5; + lightning = 6; lightningDamage = 35f; lightningLength = 8; diff --git a/core/src/mindustry/editor/WaveInfoDialog.java b/core/src/mindustry/editor/WaveInfoDialog.java index e36bada5ae..b4bc26acc2 100644 --- a/core/src/mindustry/editor/WaveInfoDialog.java +++ b/core/src/mindustry/editor/WaveInfoDialog.java @@ -47,7 +47,6 @@ public class WaveInfoDialog extends BaseDialog{ }); hidden(() -> state.rules.spawns = groups); - onResize(this::setup); addCloseButton(); buttons.button("@waves.edit", Icon.edit, () -> { From 3acac7da981f4ccdcd55e37150d4bdac6c265103 Mon Sep 17 00:00:00 2001 From: Anuken Date: Tue, 14 Jan 2025 10:56:49 -0500 Subject: [PATCH 090/460] Fixed #10329 by timing out when UDP snapshots are not received --- core/assets/bundles/bundle.properties | 1 + core/src/mindustry/ai/types/MissileAI.java | 5 +++++ core/src/mindustry/content/Blocks.java | 4 ++-- core/src/mindustry/core/NetClient.java | 19 ++++++++++++++++++- core/src/mindustry/core/NetServer.java | 2 +- .../entities/units/AIController.java | 8 ++++++-- 6 files changed, 33 insertions(+), 6 deletions(-) diff --git a/core/assets/bundles/bundle.properties b/core/assets/bundles/bundle.properties index 885f15e25d..bd8832c3e3 100644 --- a/core/assets/bundles/bundle.properties +++ b/core/assets/bundles/bundle.properties @@ -301,6 +301,7 @@ disconnect.error = Connection error. disconnect.closed = Connection closed. disconnect.timeout = Timed out. disconnect.data = Failed to load world data! +disconnect.snapshottimeout = Timed out while receiving UDP snapshots.\nThis may be caused by an unstable network or connection. cantconnect = Unable to join game ([accent]{0}[]). connecting = [accent]Connecting... reconnecting = [accent]Reconnecting... diff --git a/core/src/mindustry/ai/types/MissileAI.java b/core/src/mindustry/ai/types/MissileAI.java index 50b450afe5..b88ae5c58b 100644 --- a/core/src/mindustry/ai/types/MissileAI.java +++ b/core/src/mindustry/ai/types/MissileAI.java @@ -10,6 +10,11 @@ import mindustry.gen.*; public class MissileAI extends AIController{ public @Nullable Unit shooter; + @Override + protected void resetTimers(){ + timer.reset(timerTarget, Mathf.random(3f)); + } + @Override public void updateMovement(){ unloadPayloads(); diff --git a/core/src/mindustry/content/Blocks.java b/core/src/mindustry/content/Blocks.java index 6300222ebf..5278bbca96 100644 --- a/core/src/mindustry/content/Blocks.java +++ b/core/src/mindustry/content/Blocks.java @@ -4127,7 +4127,7 @@ public class Blocks{ hitEffect = despawnEffect = Fx.hitSquaresColor; buildingDamageMultiplier = 0.2f; }}, - Items.silicon, new BasicBulletType(8f, 34){{ + Items.silicon, new BasicBulletType(8f, 35){{ knockback = 3f; width = 25f; hitSize = 7f; @@ -4980,7 +4980,7 @@ public class Blocks{ fragLifeMin = 0.1f; fragBullets = 5; fragRandomSpread = 0f; - fragSpread = 37f; + fragSpread = 30f; fragBullet = new BulletType(){{ shootEffect = Fx.shootBig; smokeEffect = Fx.shootSmokeMissileColor; diff --git a/core/src/mindustry/core/NetClient.java b/core/src/mindustry/core/NetClient.java index e44926875e..97f2d96160 100644 --- a/core/src/mindustry/core/NetClient.java +++ b/core/src/mindustry/core/NetClient.java @@ -34,6 +34,7 @@ import java.util.zip.*; import static mindustry.Vars.*; public class NetClient implements ApplicationListener{ + private static final long entitySnapshotTimeout = 1000 * 20; private static final float dataTimeout = 60 * 30; /** ticks between syncs, e.g. 5 means 60/5 = 12 syncs/sec*/ private static final float playerSyncTime = 4; @@ -50,6 +51,8 @@ public class NetClient implements ApplicationListener{ private boolean quietReset = false; /** Counter for data timeout. */ private float timeoutTime = 0f; + /** Timestamp for last UDP state snapshot received. */ + private long lastSnapshotTimestamp; /** Last sent client snapshot ID. */ private int lastSent; @@ -478,6 +481,7 @@ public class NetClient implements ApplicationListener{ @Remote(variants = Variant.one, priority = PacketPriority.low, unreliable = true) public static void entitySnapshot(short amount, byte[] data){ try{ + netClient.lastSnapshotTimestamp = Time.millis(); netClient.byteStream.setBytes(data); DataInputStream input = netClient.dataStream; @@ -575,7 +579,18 @@ public class NetClient implements ApplicationListener{ if(!net.client()) return; if(state.isGame()){ - if(!connecting) sync(); + if(!connecting){ + sync(); + + //timeout if UDP snapshot packets are not received for a while + if(lastSnapshotTimestamp > 0 && Time.timeSinceMillis(lastSnapshotTimestamp) > entitySnapshotTimeout){ + Log.err("Timed out after not received UDP snapshots."); + quiet = true; + ui.showErrorMessage("@disconnect.snapshottimeout"); + net.disconnect(); + lastSnapshotTimestamp = 0; + } + } }else if(!connecting){ net.disconnect(); }else{ //...must be connecting @@ -612,6 +627,7 @@ public class NetClient implements ApplicationListener{ Core.app.post(Call::connectConfirm); Time.runTask(40f, platform::updateRPC); Core.app.post(ui.loadfrag::hide); + lastSnapshotTimestamp = Time.millis(); } private void reset(){ @@ -622,6 +638,7 @@ public class NetClient implements ApplicationListener{ quietReset = false; quiet = false; lastSent = 0; + lastSnapshotTimestamp = 0; Groups.clear(); ui.chatfrag.clearMessages(); diff --git a/core/src/mindustry/core/NetServer.java b/core/src/mindustry/core/NetServer.java index 6b1fe2da72..61e088aea8 100644 --- a/core/src/mindustry/core/NetServer.java +++ b/core/src/mindustry/core/NetServer.java @@ -1082,7 +1082,7 @@ public class NetServer implements ApplicationListener{ try{ writeEntitySnapshot(player); }catch(IOException e){ - e.printStackTrace(); + Log.err(e); } }); diff --git a/core/src/mindustry/entities/units/AIController.java b/core/src/mindustry/entities/units/AIController.java index b86b986b13..f91b707699 100644 --- a/core/src/mindustry/entities/units/AIController.java +++ b/core/src/mindustry/entities/units/AIController.java @@ -28,8 +28,12 @@ public class AIController implements UnitController{ protected Teamc target; { - timer.reset(0, Mathf.random(40f)); - timer.reset(1, Mathf.random(60f)); + resetTimers(); + } + + protected void resetTimers(){ + timer.reset(timerTarget, Mathf.random(40f)); + timer.reset(timerTarget2, Mathf.random(60f)); } @Override From c98a539b07ab6c29c30cdb287fd6c9c7901264fe Mon Sep 17 00:00:00 2001 From: Github Actions Date: Tue, 14 Jan 2025 15:57:44 +0000 Subject: [PATCH 091/460] Automatic bundle update --- core/assets/bundles/bundle_be.properties | 1 + core/assets/bundles/bundle_bg.properties | 1 + core/assets/bundles/bundle_ca.properties | 1 + core/assets/bundles/bundle_cs.properties | 1 + core/assets/bundles/bundle_da.properties | 1 + core/assets/bundles/bundle_de.properties | 1 + core/assets/bundles/bundle_es.properties | 1 + core/assets/bundles/bundle_et.properties | 1 + core/assets/bundles/bundle_eu.properties | 1 + core/assets/bundles/bundle_fi.properties | 1 + core/assets/bundles/bundle_fil.properties | 1 + core/assets/bundles/bundle_fr.properties | 1 + core/assets/bundles/bundle_hu.properties | 1 + core/assets/bundles/bundle_id_ID.properties | 1 + core/assets/bundles/bundle_it.properties | 1 + core/assets/bundles/bundle_ja.properties | 1 + core/assets/bundles/bundle_ko.properties | 1 + core/assets/bundles/bundle_lt.properties | 1 + core/assets/bundles/bundle_nl.properties | 1 + core/assets/bundles/bundle_nl_BE.properties | 1 + core/assets/bundles/bundle_pl.properties | 1 + core/assets/bundles/bundle_pt_BR.properties | 1 + core/assets/bundles/bundle_pt_PT.properties | 1 + core/assets/bundles/bundle_ro.properties | 1 + core/assets/bundles/bundle_ru.properties | 1 + core/assets/bundles/bundle_sr.properties | 1 + core/assets/bundles/bundle_sv.properties | 1 + core/assets/bundles/bundle_th.properties | 1 + core/assets/bundles/bundle_tk.properties | 1 + core/assets/bundles/bundle_tr.properties | 1 + core/assets/bundles/bundle_uk_UA.properties | 1 + core/assets/bundles/bundle_vi.properties | 1 + core/assets/bundles/bundle_zh_CN.properties | 1 + core/assets/bundles/bundle_zh_TW.properties | 1 + 34 files changed, 34 insertions(+) diff --git a/core/assets/bundles/bundle_be.properties b/core/assets/bundles/bundle_be.properties index 6de2db79da..0b88c54a4b 100644 --- a/core/assets/bundles/bundle_be.properties +++ b/core/assets/bundles/bundle_be.properties @@ -290,6 +290,7 @@ disconnect.error = Памылка злучэння. disconnect.closed = Злучэнне закрыта. disconnect.timeout = Час чакання скончыўся. disconnect.data = Памылка пры загрузцы дадзеных свету! +disconnect.snapshottimeout = Timed out while receiving UDP snapshots.\nThis may be caused by an unstable network or connection. cantconnect = Не ўдаецца далучыцца да гульні ([accent]{0}[]). connecting = [accent]Падключэнне… reconnecting = [accent]Перападключэнне... diff --git a/core/assets/bundles/bundle_bg.properties b/core/assets/bundles/bundle_bg.properties index 8a8fb3e5ee..b0d0d498ce 100644 --- a/core/assets/bundles/bundle_bg.properties +++ b/core/assets/bundles/bundle_bg.properties @@ -295,6 +295,7 @@ disconnect.error = Проблем със връзката. disconnect.closed = Връзката приключи. disconnect.timeout = Загубена връзка. disconnect.data = Грешка при зареждане на информация за света! +disconnect.snapshottimeout = Timed out while receiving UDP snapshots.\nThis may be caused by an unstable network or connection. cantconnect = Неуспех при свързване към игра ([accent]{0}[]). connecting = [accent]Свързване... reconnecting = [accent]Повторно свързване... diff --git a/core/assets/bundles/bundle_ca.properties b/core/assets/bundles/bundle_ca.properties index 472f13306e..f8964ad29b 100644 --- a/core/assets/bundles/bundle_ca.properties +++ b/core/assets/bundles/bundle_ca.properties @@ -295,6 +295,7 @@ disconnect.error = Error de connexió. disconnect.closed = Connexió tancada. disconnect.timeout = S’ha esgotat el temps d’espera. disconnect.data = No s’han pogut carregar les dades del món! +disconnect.snapshottimeout = Timed out while receiving UDP snapshots.\nThis may be caused by an unstable network or connection. cantconnect = No és possible unir-se a la partida ([accent]{0}[]). connecting = [accent]Es connecta… reconnecting = [accent]Es torna a connectar… diff --git a/core/assets/bundles/bundle_cs.properties b/core/assets/bundles/bundle_cs.properties index 41704a4ad4..7765150968 100644 --- a/core/assets/bundles/bundle_cs.properties +++ b/core/assets/bundles/bundle_cs.properties @@ -295,6 +295,7 @@ disconnect.error = Chyba připojení. disconnect.closed = Připojení bylo uzavřeno. disconnect.timeout = Vypršel čas pro připojení. disconnect.data = Chyba načtení dat ze serveru! +disconnect.snapshottimeout = Timed out while receiving UDP snapshots.\nThis may be caused by an unstable network or connection. cantconnect = Není možno se připojit ke hře ([accent]{0}[]). connecting = [accent]Připojuji se...[] reconnecting = [accent]Znovu se připojuji... diff --git a/core/assets/bundles/bundle_da.properties b/core/assets/bundles/bundle_da.properties index 5c183ae4fd..b114712702 100644 --- a/core/assets/bundles/bundle_da.properties +++ b/core/assets/bundles/bundle_da.properties @@ -291,6 +291,7 @@ disconnect.error = Forbindelsesfejl. disconnect.closed = Forbindelse afbrudt. disconnect.timeout = Maksimal ventetid overskredet. disconnect.data = Kunne ikke indlæse bane-data! +disconnect.snapshottimeout = Timed out while receiving UDP snapshots.\nThis may be caused by an unstable network or connection. cantconnect = Kunne ikke deltage i spil ([accent]{0}[]). connecting = [accent]Forbinder... reconnecting = [accent]Reconnecting... diff --git a/core/assets/bundles/bundle_de.properties b/core/assets/bundles/bundle_de.properties index d878eb1143..93e2ea95ee 100644 --- a/core/assets/bundles/bundle_de.properties +++ b/core/assets/bundles/bundle_de.properties @@ -298,6 +298,7 @@ disconnect.error = Verbindungsfehler. disconnect.closed = Verbindung geschlossen. disconnect.timeout = Zeitüberschreitung. disconnect.data = Fehler beim Laden der Welt! +disconnect.snapshottimeout = Timed out while receiving UDP snapshots.\nThis may be caused by an unstable network or connection. cantconnect = Nicht möglich beizutreten ([accent]{0}[]). connecting = [accent] Verbinde... reconnecting = [accent]Verbindung wird wiederhergestellt... diff --git a/core/assets/bundles/bundle_es.properties b/core/assets/bundles/bundle_es.properties index 927a67c6ef..e5090379a6 100644 --- a/core/assets/bundles/bundle_es.properties +++ b/core/assets/bundles/bundle_es.properties @@ -295,6 +295,7 @@ disconnect.error = Error de conexión. disconnect.closed = Conexión cerrada. disconnect.timeout = Tiempo de espera agotado. disconnect.data = ¡Hubo un fallo al cargar los datos! +disconnect.snapshottimeout = Timed out while receiving UDP snapshots.\nThis may be caused by an unstable network or connection. cantconnect = No es posible unirse a la partida ([accent]{0}[]). connecting = [accent]Conectando... reconnecting = [accent]Reconectado... diff --git a/core/assets/bundles/bundle_et.properties b/core/assets/bundles/bundle_et.properties index d03ad98755..bbf3b905c8 100644 --- a/core/assets/bundles/bundle_et.properties +++ b/core/assets/bundles/bundle_et.properties @@ -291,6 +291,7 @@ disconnect.error = Ühenduse viga. disconnect.closed = Ühendus on suletud. disconnect.timeout = Ühendus aegus. disconnect.data = Maailma andmete allalaadimine ebaõnnestus! +disconnect.snapshottimeout = Timed out while receiving UDP snapshots.\nThis may be caused by an unstable network or connection. cantconnect = Mänguga ei saanud liituda ([accent]{0}[]). connecting = [accent]Ühendamine... reconnecting = [accent]Reconnecting... diff --git a/core/assets/bundles/bundle_eu.properties b/core/assets/bundles/bundle_eu.properties index 0d890cd3ac..b0feaf9914 100644 --- a/core/assets/bundles/bundle_eu.properties +++ b/core/assets/bundles/bundle_eu.properties @@ -293,6 +293,7 @@ disconnect.error = Konexio errorea. disconnect.closed = Konexioa itxita. disconnect.timeout = Denbor-muga agortuta. disconnect.data = Huts egin du munduaren datuak eskuratzean! +disconnect.snapshottimeout = Timed out while receiving UDP snapshots.\nThis may be caused by an unstable network or connection. cantconnect = Ezin izan da partidara elkartu ([accent]{0}[]). connecting = [accent]Konektatzen... reconnecting = [accent]Reconnecting... diff --git a/core/assets/bundles/bundle_fi.properties b/core/assets/bundles/bundle_fi.properties index 84b0acaaf0..2a5e05c5d4 100644 --- a/core/assets/bundles/bundle_fi.properties +++ b/core/assets/bundles/bundle_fi.properties @@ -291,6 +291,7 @@ disconnect.error = Yhteysvirhe. disconnect.closed = Yhteys poistettu. disconnect.timeout = Yhteys aikakatkaistiin. disconnect.data = Maailman tietojen lataaminen epäonnistui! +disconnect.snapshottimeout = Timed out while receiving UDP snapshots.\nThis may be caused by an unstable network or connection. cantconnect = Peliin ei voitu liittyä ([accent]{0}[]). connecting = [accent]Yhdistetään... reconnecting = [accent]Yhdistetään uudelleen... diff --git a/core/assets/bundles/bundle_fil.properties b/core/assets/bundles/bundle_fil.properties index e7e08db132..8a250a8af6 100644 --- a/core/assets/bundles/bundle_fil.properties +++ b/core/assets/bundles/bundle_fil.properties @@ -291,6 +291,7 @@ disconnect.error = Connection error. disconnect.closed = Connection closed. disconnect.timeout = Na-time out. disconnect.data = Pumalya ang pag-load ng world data! +disconnect.snapshottimeout = Timed out while receiving UDP snapshots.\nThis may be caused by an unstable network or connection. cantconnect = Hindi kayant sumali sa larong ([accent]{0}[]). connecting = [accent]Connecting... reconnecting = [accent]Reconnecting... diff --git a/core/assets/bundles/bundle_fr.properties b/core/assets/bundles/bundle_fr.properties index f0088a4831..733a570e31 100644 --- a/core/assets/bundles/bundle_fr.properties +++ b/core/assets/bundles/bundle_fr.properties @@ -301,6 +301,7 @@ disconnect.error = Un problème est survenu lors de la connexion. disconnect.closed = Connexion fermée. disconnect.timeout = Délai de connexion expiré. disconnect.data = Les données du monde n'ont pas pu être chargées ! +disconnect.snapshottimeout = Timed out while receiving UDP snapshots.\nThis may be caused by an unstable network or connection. cantconnect = Impossible de rejoindre ([accent]{0}[]). connecting = [accent]Connexion... reconnecting = [accent]Reconnexion... diff --git a/core/assets/bundles/bundle_hu.properties b/core/assets/bundles/bundle_hu.properties index b765d37661..d730471f4b 100644 --- a/core/assets/bundles/bundle_hu.properties +++ b/core/assets/bundles/bundle_hu.properties @@ -301,6 +301,7 @@ disconnect.error = Kapcsolódási hiba. disconnect.closed = Kapcsolat lezárva. disconnect.timeout = Időtúllépés. disconnect.data = Nem sikerült betölteni a világ adatait! +disconnect.snapshottimeout = Timed out while receiving UDP snapshots.\nThis may be caused by an unstable network or connection. cantconnect = Nem sikerült kapcsolódni a(z) ([accent]{0}[]) játékhoz. connecting = [accent]Kapcsolódás... reconnecting = [accent]Újrakapcsolódás... diff --git a/core/assets/bundles/bundle_id_ID.properties b/core/assets/bundles/bundle_id_ID.properties index ee3203cd2e..15651bba05 100644 --- a/core/assets/bundles/bundle_id_ID.properties +++ b/core/assets/bundles/bundle_id_ID.properties @@ -301,6 +301,7 @@ disconnect.error = Sambungan bermasalah. disconnect.closed = Sambungan ditutup. disconnect.timeout = Waktu koneksi habis. disconnect.data = Gagal memuat data dunia! +disconnect.snapshottimeout = Timed out while receiving UDP snapshots.\nThis may be caused by an unstable network or connection. cantconnect = Gagal tersambung ke permainan ([accent]{0}[]). connecting = [accent]Menghubungkan... reconnecting = [accent]Menghubungkan kembali... diff --git a/core/assets/bundles/bundle_it.properties b/core/assets/bundles/bundle_it.properties index c05f7efa7c..8eaeb013db 100644 --- a/core/assets/bundles/bundle_it.properties +++ b/core/assets/bundles/bundle_it.properties @@ -293,6 +293,7 @@ disconnect.error = Errore di connessione. disconnect.closed = Connessione chiusa. disconnect.timeout = Connessione scaduta. disconnect.data = Errore durante il caricamento del mondo! +disconnect.snapshottimeout = Timed out while receiving UDP snapshots.\nThis may be caused by an unstable network or connection. cantconnect = Impossibile unirsi alla partita ([accent]{0}[]). connecting = [accent]Connessione in corso... reconnecting = [accent]Riconnessione in corso... diff --git a/core/assets/bundles/bundle_ja.properties b/core/assets/bundles/bundle_ja.properties index 62ec1d3277..994f4f10f5 100644 --- a/core/assets/bundles/bundle_ja.properties +++ b/core/assets/bundles/bundle_ja.properties @@ -295,6 +295,7 @@ disconnect.error = 接続にエラーが発生しました。 disconnect.closed = 接続が切断されました。 disconnect.timeout = タイムアウトしました。 disconnect.data = ワールドデータの読み込みに失敗しました! +disconnect.snapshottimeout = Timed out while receiving UDP snapshots.\nThis may be caused by an unstable network or connection. cantconnect = ゲームに参加できませんでした。 ([accent]{0}[]) connecting = [accent]接続中... reconnecting = [accent]再接続中... diff --git a/core/assets/bundles/bundle_ko.properties b/core/assets/bundles/bundle_ko.properties index 0621644f8a..acd35634be 100644 --- a/core/assets/bundles/bundle_ko.properties +++ b/core/assets/bundles/bundle_ko.properties @@ -301,6 +301,7 @@ disconnect.error = 연결 오류 disconnect.closed = 연결이 종료되었습니다. disconnect.timeout = 시간 초과 disconnect.data = 맵 데이터를 로드하지 못했습니다! +disconnect.snapshottimeout = Timed out while receiving UDP snapshots.\nThis may be caused by an unstable network or connection. cantconnect = [accent]{0}[] 게임에 참여할 수 없습니다. connecting = [accent] 연결중... reconnecting = [accent]재접속중... diff --git a/core/assets/bundles/bundle_lt.properties b/core/assets/bundles/bundle_lt.properties index d4a4dd60ee..ac9cf13b60 100644 --- a/core/assets/bundles/bundle_lt.properties +++ b/core/assets/bundles/bundle_lt.properties @@ -291,6 +291,7 @@ disconnect.error = Prisijungimo klaida. disconnect.closed = Prisijungimas uždarytas. disconnect.timeout = Baigėsi laikas. disconnect.data = Nepavyko užkrauti pasaulio informacijos! +disconnect.snapshottimeout = Timed out while receiving UDP snapshots.\nThis may be caused by an unstable network or connection. cantconnect = Negalima prisijungti prie žaidimo ([accent]{0}[]). connecting = [accent]Prisijungiama... reconnecting = [accent]Reconnecting... diff --git a/core/assets/bundles/bundle_nl.properties b/core/assets/bundles/bundle_nl.properties index 4832104d11..148c8e8bd2 100644 --- a/core/assets/bundles/bundle_nl.properties +++ b/core/assets/bundles/bundle_nl.properties @@ -299,6 +299,7 @@ disconnect.error = Verbindingsfout. disconnect.closed = Verbinding gestopt. disconnect.timeout = Verbinding afgekapt. disconnect.data = Kon de wereld niet laden! +disconnect.snapshottimeout = Timed out while receiving UDP snapshots.\nThis may be caused by an unstable network or connection. cantconnect = Geen verbinding mogelijk ([accent]{0}[]). connecting = [accent]Aan het verbinden... reconnecting = [accent]Aan het herverbinden... diff --git a/core/assets/bundles/bundle_nl_BE.properties b/core/assets/bundles/bundle_nl_BE.properties index ee7759a2dd..a9d1b251aa 100644 --- a/core/assets/bundles/bundle_nl_BE.properties +++ b/core/assets/bundles/bundle_nl_BE.properties @@ -291,6 +291,7 @@ disconnect.error = Verbindingsfout. disconnect.closed = Verbinding afgesloten. disconnect.timeout = Het duurde te lang voordat de server antwoordde. disconnect.data = Laden van mapdata mislukt! +disconnect.snapshottimeout = Timed out while receiving UDP snapshots.\nThis may be caused by an unstable network or connection. cantconnect = Kon niet tot het spel toetreden. ([accent]{0}[]). connecting = [accent]Verbinden... reconnecting = [accent]Reconnecting... diff --git a/core/assets/bundles/bundle_pl.properties b/core/assets/bundles/bundle_pl.properties index 54bd7d5445..b868efbc0a 100644 --- a/core/assets/bundles/bundle_pl.properties +++ b/core/assets/bundles/bundle_pl.properties @@ -295,6 +295,7 @@ disconnect.error = Błąd połączenia. disconnect.closed = Połączenie zostało zamknięte. disconnect.timeout = Przekroczono limit czasu. disconnect.data = Nie udało się załadować mapy! +disconnect.snapshottimeout = Timed out while receiving UDP snapshots.\nThis may be caused by an unstable network or connection. cantconnect = Nie można dołączyć do gry ([accent]{0}[]). connecting = [accent]Łączenie... reconnecting = [accent]Ponowne łączenie... diff --git a/core/assets/bundles/bundle_pt_BR.properties b/core/assets/bundles/bundle_pt_BR.properties index 71af5f6b39..1a9a017efd 100644 --- a/core/assets/bundles/bundle_pt_BR.properties +++ b/core/assets/bundles/bundle_pt_BR.properties @@ -295,6 +295,7 @@ disconnect.error = Erro de conexão. disconnect.closed = Conexão fechada. disconnect.timeout = Tempo esgotado. disconnect.data = Falha ao carregar os dados do mundo! +disconnect.snapshottimeout = Timed out while receiving UDP snapshots.\nThis may be caused by an unstable network or connection. cantconnect = Impossível conectar ([accent]{0}[]). connecting = [accent]Conectando... reconnecting = [accent]Reconectando... diff --git a/core/assets/bundles/bundle_pt_PT.properties b/core/assets/bundles/bundle_pt_PT.properties index 7b13154409..f42d9dfaed 100644 --- a/core/assets/bundles/bundle_pt_PT.properties +++ b/core/assets/bundles/bundle_pt_PT.properties @@ -291,6 +291,7 @@ disconnect.error = Erro de conexão. disconnect.closed = Conexão fechada. disconnect.timeout = Tempo esgotado. disconnect.data = Falha ao abrir os dados do mundo! +disconnect.snapshottimeout = Timed out while receiving UDP snapshots.\nThis may be caused by an unstable network or connection. cantconnect = Impossível conectar ([accent]{0}[]). connecting = [accent]Conectando... reconnecting = [accent]Reconnecting... diff --git a/core/assets/bundles/bundle_ro.properties b/core/assets/bundles/bundle_ro.properties index f48d3578a7..50098f2e0b 100644 --- a/core/assets/bundles/bundle_ro.properties +++ b/core/assets/bundles/bundle_ro.properties @@ -295,6 +295,7 @@ disconnect.error = Eroare de conexiune. disconnect.closed = Conexiune închisă. disconnect.timeout = Întârzie să răspundă. disconnect.data = Nu s-au putut încărca datele lumii! +disconnect.snapshottimeout = Timed out while receiving UDP snapshots.\nThis may be caused by an unstable network or connection. cantconnect = Nu te-ai putut alătura jocului ([accent]{0}[]). connecting = [accent]Conectare... reconnecting = [accent]Reconectare... diff --git a/core/assets/bundles/bundle_ru.properties b/core/assets/bundles/bundle_ru.properties index 9e0d94677d..1a40bb7986 100644 --- a/core/assets/bundles/bundle_ru.properties +++ b/core/assets/bundles/bundle_ru.properties @@ -295,6 +295,7 @@ disconnect.error = Ошибка соединения. disconnect.closed = Соединение закрыто. disconnect.timeout = Время ожидания истекло. disconnect.data = Ошибка при загрузке данных мира! +disconnect.snapshottimeout = Timed out while receiving UDP snapshots.\nThis may be caused by an unstable network or connection. cantconnect = Не удаётся присоединиться к игре ([accent]{0}[]). connecting = [accent]Подключение… reconnecting = [accent]Переподключение… diff --git a/core/assets/bundles/bundle_sr.properties b/core/assets/bundles/bundle_sr.properties index 5346942a15..6298ae6012 100644 --- a/core/assets/bundles/bundle_sr.properties +++ b/core/assets/bundles/bundle_sr.properties @@ -295,6 +295,7 @@ disconnect.error = Greška u povezivanju. disconnect.closed = Connection closed. disconnect.timeout = Timed out. disconnect.data = Neuspešno učitavanje podataka! +disconnect.snapshottimeout = Timed out while receiving UDP snapshots.\nThis may be caused by an unstable network or connection. cantconnect = Ne može se pridružiti igri ([accent]{0}[]). connecting = [accent]Povezivanje... reconnecting = [accent]Ponovno povezivanje... diff --git a/core/assets/bundles/bundle_sv.properties b/core/assets/bundles/bundle_sv.properties index 9692a42633..f26cd10739 100644 --- a/core/assets/bundles/bundle_sv.properties +++ b/core/assets/bundles/bundle_sv.properties @@ -291,6 +291,7 @@ disconnect.error = Kopplingsfel. disconnect.closed = Koppling stängd. disconnect.timeout = Timed out. disconnect.data = Failed to load world data! +disconnect.snapshottimeout = Timed out while receiving UDP snapshots.\nThis may be caused by an unstable network or connection. cantconnect = Unable to join game ([accent]{0}[]). connecting = [accent]Ansluter... reconnecting = [accent]Reconnecting... diff --git a/core/assets/bundles/bundle_th.properties b/core/assets/bundles/bundle_th.properties index 1efd96ac21..6fee96457e 100644 --- a/core/assets/bundles/bundle_th.properties +++ b/core/assets/bundles/bundle_th.properties @@ -295,6 +295,7 @@ disconnect.error = การเชื่อมต่อมีปัญหา disconnect.closed = การเชื่อมต่อถูกปิดแล้ว disconnect.timeout = หมดเวลา disconnect.data = การโหลดข้อมูลของโลกผิดพลาด! +disconnect.snapshottimeout = Timed out while receiving UDP snapshots.\nThis may be caused by an unstable network or connection. cantconnect = ไม่สามารถเข้าร่วมเซิร์ฟเวอร์ ([accent]{0}[]) connecting = [accent]กำลังเชื่อมต่อ... reconnecting = [accent]กำลังเชื่อมต่อใหม่... diff --git a/core/assets/bundles/bundle_tk.properties b/core/assets/bundles/bundle_tk.properties index d2526d59fb..6b931386ac 100644 --- a/core/assets/bundles/bundle_tk.properties +++ b/core/assets/bundles/bundle_tk.properties @@ -291,6 +291,7 @@ disconnect.error = Connection error. disconnect.closed = Connection closed. disconnect.timeout = Timed out. disconnect.data = Oyunun geri yuklenemedi! +disconnect.snapshottimeout = Timed out while receiving UDP snapshots.\nThis may be caused by an unstable network or connection. cantconnect = Unable to join game ([accent]{0}[]). connecting = [accent]Baglaniliyor reconnecting = [accent]Reconnecting... diff --git a/core/assets/bundles/bundle_tr.properties b/core/assets/bundles/bundle_tr.properties index 9df37b8121..ed12b152c5 100644 --- a/core/assets/bundles/bundle_tr.properties +++ b/core/assets/bundles/bundle_tr.properties @@ -295,6 +295,7 @@ disconnect.error = Bağlantı hatası. disconnect.closed = Bağlantı kapatıldı. disconnect.timeout = Zaman aşımı. disconnect.data = Dünya verisi yüklenemedi! +disconnect.snapshottimeout = Timed out while receiving UDP snapshots.\nThis may be caused by an unstable network or connection. cantconnect = Oyuna girilemiyor ([accent]{0}[]). connecting = [accent]Bağlanılıyor... reconnecting = [accent]Yeniden Bağlanılıyor... diff --git a/core/assets/bundles/bundle_uk_UA.properties b/core/assets/bundles/bundle_uk_UA.properties index b766d26ea5..3f01330580 100644 --- a/core/assets/bundles/bundle_uk_UA.properties +++ b/core/assets/bundles/bundle_uk_UA.properties @@ -297,6 +297,7 @@ disconnect.error = Помилка з’єднання. disconnect.closed = З’єднання закрито. disconnect.timeout = Час вийшов. disconnect.data = Не вдалося завантажити світові дані! +disconnect.snapshottimeout = Timed out while receiving UDP snapshots.\nThis may be caused by an unstable network or connection. cantconnect = Не вдалося під’єднатися до гри ([accent]{0}[]). connecting = [accent]Приєднання… reconnecting = [accent]Повторне з’єднання… diff --git a/core/assets/bundles/bundle_vi.properties b/core/assets/bundles/bundle_vi.properties index 7499bd3d03..61d04879e6 100644 --- a/core/assets/bundles/bundle_vi.properties +++ b/core/assets/bundles/bundle_vi.properties @@ -301,6 +301,7 @@ disconnect.error = Lỗi kết nối. disconnect.closed = Kết nối đã bị đóng. disconnect.timeout = Hết thời gian chờ. disconnect.data = Không tải được dữ liệu thế giới! +disconnect.snapshottimeout = Timed out while receiving UDP snapshots.\nThis may be caused by an unstable network or connection. cantconnect = Không thể tham gia trò chơi ([accent]{0}[]). connecting = [accent]Đang kết nối... reconnecting = [accent]Đang kết nối lại... diff --git a/core/assets/bundles/bundle_zh_CN.properties b/core/assets/bundles/bundle_zh_CN.properties index 59c7ca859b..87330afaf7 100644 --- a/core/assets/bundles/bundle_zh_CN.properties +++ b/core/assets/bundles/bundle_zh_CN.properties @@ -298,6 +298,7 @@ disconnect.error = 连接错误。 disconnect.closed = 连接关闭。 disconnect.timeout = 连接超时。 disconnect.data = 地图加载失败! +disconnect.snapshottimeout = Timed out while receiving UDP snapshots.\nThis may be caused by an unstable network or connection. cantconnect = 无法加入游戏([accent]{0}[])。 connecting = [accent]连接中… reconnecting = [accent]重新连接中… diff --git a/core/assets/bundles/bundle_zh_TW.properties b/core/assets/bundles/bundle_zh_TW.properties index e75b703044..9f1ee4db85 100644 --- a/core/assets/bundles/bundle_zh_TW.properties +++ b/core/assets/bundles/bundle_zh_TW.properties @@ -295,6 +295,7 @@ disconnect.error = 連線錯誤。 disconnect.closed = 連線關閉。 disconnect.timeout = 連線逾時。 disconnect.data = 無法載入地圖資料! +disconnect.snapshottimeout = Timed out while receiving UDP snapshots.\nThis may be caused by an unstable network or connection. cantconnect = 無法加入遊戲 ([accent]{0}[]). connecting = [accent]連線中…… reconnecting = [accent]重新連接中…… From bd19e39b044db087cbb85e29985b96849df7807e Mon Sep 17 00:00:00 2001 From: Anuken Date: Tue, 14 Jan 2025 16:05:52 -0500 Subject: [PATCH 092/460] Disperse surge ammo --- core/src/mindustry/content/Blocks.java | 47 ++++++++++++++++++- .../entities/bullet/LightningBulletType.java | 10 ++-- 2 files changed, 49 insertions(+), 8 deletions(-) diff --git a/core/src/mindustry/content/Blocks.java b/core/src/mindustry/content/Blocks.java index 5278bbca96..0865cadf56 100644 --- a/core/src/mindustry/content/Blocks.java +++ b/core/src/mindustry/content/Blocks.java @@ -4503,7 +4503,52 @@ public class Blocks{ extraRangeMargin = 32f; hitEffect = despawnEffect = Fx.hitBulletColor; - }}); + }}, + + Items.surgeAlloy, new BasicBulletType(){{ + reloadMultiplier = 0.5f; + damage = 65; + rangeChange = 8f * 3f; + lightning = 3; + lightningLength = 4; + lightningDamage = 18f; + lightningLengthRand = 3; + speed = 7f; + width = height = 16; + shrinkY = 0.3f; + backSprite = "large-bomb-back"; + sprite = "mine-bullet"; + velocityRnd = 0.11f; + collidesGround = false; + collidesTiles = false; + shootEffect = Fx.shootBig2; + smokeEffect = Fx.shootSmokeDisperse; + frontColor = Color.white; + backColor = trailColor = hitColor = Pal.surge; + trailChance = 0.44f; + ammoMultiplier = 3f; + + lifetime = 34f; + rotationOffset = 90f; + trailRotation = true; + trailEffect = Fx.disperseTrail; + + hitEffect = despawnEffect = Fx.hitBulletColor; + + bulletInterval = 4f; + + intervalBullet = new BulletType(){{ + lightningLengthRand = 4; + lightningLength = 2; + lightningCone = 30f; + lightningDamage = 20f; + lightning = 1; + hittable = collides = false; + instantDisappear = true; + hitEffect = despawnEffect = Fx.none; + }}; + }} + ); reload = 9f; shootY = 15f; diff --git a/core/src/mindustry/entities/bullet/LightningBulletType.java b/core/src/mindustry/entities/bullet/LightningBulletType.java index add245a16e..226d188f91 100644 --- a/core/src/mindustry/entities/bullet/LightningBulletType.java +++ b/core/src/mindustry/entities/bullet/LightningBulletType.java @@ -1,6 +1,5 @@ package mindustry.entities.bullet; -import arc.graphics.*; import arc.math.*; import mindustry.content.*; import mindustry.entities.*; @@ -8,8 +7,6 @@ import mindustry.gen.*; import mindustry.graphics.*; public class LightningBulletType extends BulletType{ - public Color lightningColor = Pal.lancerLaser; - public int lightningLength = 25, lightningLengthRand = 0; public LightningBulletType(){ damage = 1f; @@ -21,6 +18,9 @@ public class LightningBulletType extends BulletType{ hittable = false; //for stats status = StatusEffects.shocked; + lightningLength = 25; + lightningLengthRand = 0; + lightningColor = Pal.lancerLaser; } @Override @@ -33,10 +33,6 @@ public class LightningBulletType extends BulletType{ return super.estimateDPS() * Math.max(lightningLength / 10f, 1); } - @Override - public void draw(Bullet b){ - } - @Override public void init(Bullet b){ super.init(b); From d355ea9d0c3721a4475ad520191fb84c61bf438e Mon Sep 17 00:00:00 2001 From: Anuken Date: Wed, 15 Jan 2025 00:03:05 -0500 Subject: [PATCH 093/460] Scathe inconsistency fix --- core/src/mindustry/ai/types/MissileAI.java | 2 +- core/src/mindustry/content/Blocks.java | 8 +++++--- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/core/src/mindustry/ai/types/MissileAI.java b/core/src/mindustry/ai/types/MissileAI.java index b88ae5c58b..082c445048 100644 --- a/core/src/mindustry/ai/types/MissileAI.java +++ b/core/src/mindustry/ai/types/MissileAI.java @@ -12,7 +12,7 @@ public class MissileAI extends AIController{ @Override protected void resetTimers(){ - timer.reset(timerTarget, Mathf.random(3f)); + timer.reset(timerTarget, 5f); } @Override diff --git a/core/src/mindustry/content/Blocks.java b/core/src/mindustry/content/Blocks.java index 0865cadf56..3034423924 100644 --- a/core/src/mindustry/content/Blocks.java +++ b/core/src/mindustry/content/Blocks.java @@ -4513,7 +4513,7 @@ public class Blocks{ lightningLength = 4; lightningDamage = 18f; lightningLengthRand = 3; - speed = 7f; + speed = 6f; width = height = 16; shrinkY = 0.3f; backSprite = "large-bomb-back"; @@ -4538,6 +4538,8 @@ public class Blocks{ bulletInterval = 4f; intervalBullet = new BulletType(){{ + collidesGround = false; + collidesTiles = false; lightningLengthRand = 4; lightningLength = 2; lightningCone = 30f; @@ -5009,7 +5011,8 @@ public class Blocks{ weapons.add(new Weapon(){{ shootCone = 360f; - mirror = false; + rotate = true; + rotationLimit = rotateSpeed = 0f; reload = 1f; deathExplosionEffect = Fx.massiveExplosion; shootOnDeath = true; @@ -5178,7 +5181,6 @@ public class Blocks{ requirements(Category.turret, with(Items.oxide, 200, Items.surgeAlloy, 400, Items.silicon, 800, Items.carbide, 500, Items.phaseFabric, 300)); ammo( - //this is really lazy Items.surgeAlloy, new BasicBulletType(7f, 250){{ sprite = "large-orb"; width = 17f; From 45dfc85d02807060688c7f4025c6eeed7d2680f9 Mon Sep 17 00:00:00 2001 From: Anuken Date: Wed, 15 Jan 2025 15:43:43 -0500 Subject: [PATCH 094/460] Turret bullet tweaks & fixes --- core/src/mindustry/content/Blocks.java | 19 ++++++++++++++++++- core/src/mindustry/content/Bullets.java | 6 +++++- .../mindustry/entities/bullet/BulletType.java | 5 ++++- .../entities/bullet/EmptyBulletType.java | 10 ++++++++++ 4 files changed, 37 insertions(+), 3 deletions(-) create mode 100644 core/src/mindustry/entities/bullet/EmptyBulletType.java diff --git a/core/src/mindustry/content/Blocks.java b/core/src/mindustry/content/Blocks.java index 3034423924..70717287a5 100644 --- a/core/src/mindustry/content/Blocks.java +++ b/core/src/mindustry/content/Blocks.java @@ -4347,7 +4347,7 @@ public class Blocks{ reloadMultiplier = 0.8f; splashDamageRadius = 110f; rangeChange = 8f; - splashDamage = 300f; + splashDamage = 330f; scaledSplashDamage = true; hitColor = backColor = trailColor = Color.valueOf("a0b380"); frontColor = Color.valueOf("e4ffd6"); @@ -4371,6 +4371,23 @@ public class Blocks{ shrinkX = 0.2f; shrinkY = 0.1f; buildingDamageMultiplier = 0.25f; + + fragBullets = 1; + fragBullet = new EmptyBulletType(){{ + lifetime = 60f * 2f; + bulletInterval = 20f; + intervalBullet = new EmptyBulletType(){{ + splashDamage = 30f; + collidesGround = true; + collidesAir = false; + collides = false; + hitEffect = Fx.none; + pierce = true; + instantDisappear = true; + splashDamageRadius = 90f; + buildingDamageMultiplier = 0.2f; + }}; + }}; }} ); diff --git a/core/src/mindustry/content/Bullets.java b/core/src/mindustry/content/Bullets.java index ea10110ae8..4536a3b826 100644 --- a/core/src/mindustry/content/Bullets.java +++ b/core/src/mindustry/content/Bullets.java @@ -10,7 +10,7 @@ import mindustry.entities.bullet.*; public class Bullets{ public static BulletType - placeholder, spaceLiquid, damageLightning, damageLightningGround, fireball; + placeholder, spaceLiquid, damageLightning, damageLightningGround, damageLightningAir, fireball; public static void load(){ @@ -37,6 +37,10 @@ public class Bullets{ damageLightningGround = damageLightning.copy(); damageLightningGround.collidesAir = false; + damageLightningAir = damageLightning.copy(); + damageLightningAir.collidesGround = false; + damageLightningAir.collidesTiles = false; + fireball = new FireBulletType(1f, 4){{ hittable = false; }}; diff --git a/core/src/mindustry/entities/bullet/BulletType.java b/core/src/mindustry/entities/bullet/BulletType.java index f5d9b5962c..cb177512f0 100644 --- a/core/src/mindustry/entities/bullet/BulletType.java +++ b/core/src/mindustry/entities/bullet/BulletType.java @@ -716,7 +716,10 @@ public class BulletType extends Content implements Cloneable{ } if(lightningType == null){ - lightningType = !collidesAir ? Bullets.damageLightningGround : Bullets.damageLightning; + lightningType = + !collidesAir ? Bullets.damageLightningGround : + !collidesGround ? Bullets.damageLightningAir : + Bullets.damageLightning; } if(lightRadius <= -1){ diff --git a/core/src/mindustry/entities/bullet/EmptyBulletType.java b/core/src/mindustry/entities/bullet/EmptyBulletType.java new file mode 100644 index 0000000000..13dfd83ccc --- /dev/null +++ b/core/src/mindustry/entities/bullet/EmptyBulletType.java @@ -0,0 +1,10 @@ +package mindustry.entities.bullet; + +public class EmptyBulletType extends BulletType{ + + public EmptyBulletType(){ + hittable = collidesGround = collidesAir = collidesTiles = false; + speed = 0f; + keepVelocity = false; + } +} From 2c5bd4df6b7a9da5071ad9433b802ab9e6688267 Mon Sep 17 00:00:00 2001 From: Anuken Date: Wed, 15 Jan 2025 17:46:34 -0500 Subject: [PATCH 095/460] Titan oxide ammo tweaks --- core/src/mindustry/content/Blocks.java | 6 +++--- core/src/mindustry/content/Fx.java | 8 ++++++++ 2 files changed, 11 insertions(+), 3 deletions(-) diff --git a/core/src/mindustry/content/Blocks.java b/core/src/mindustry/content/Blocks.java index 70717287a5..5ca105d032 100644 --- a/core/src/mindustry/content/Blocks.java +++ b/core/src/mindustry/content/Blocks.java @@ -4338,7 +4338,7 @@ public class Blocks{ buildingDamageMultiplier = 0.3f; }}, Items.oxide, new ArtilleryBulletType(2.5f, 300, "shell"){{ - hitEffect = new MultiEffect(Fx.titanExplosionLarge, Fx.titanSmokeLarge); + hitEffect = new MultiEffect(Fx.titanExplosionLarge, Fx.titanSmokeLarge, Fx.smokeAoeCloud); despawnEffect = Fx.none; knockback = 2f; lifetime = 190f; @@ -4347,7 +4347,7 @@ public class Blocks{ reloadMultiplier = 0.8f; splashDamageRadius = 110f; rangeChange = 8f; - splashDamage = 330f; + splashDamage = 300f; scaledSplashDamage = true; hitColor = backColor = trailColor = Color.valueOf("a0b380"); frontColor = Color.valueOf("e4ffd6"); @@ -4374,7 +4374,7 @@ public class Blocks{ fragBullets = 1; fragBullet = new EmptyBulletType(){{ - lifetime = 60f * 2f; + lifetime = 60f * 2.5f; bulletInterval = 20f; intervalBullet = new EmptyBulletType(){{ splashDamage = 30f; diff --git a/core/src/mindustry/content/Fx.java b/core/src/mindustry/content/Fx.java index 3709d935f9..16e42a0fbf 100644 --- a/core/src/mindustry/content/Fx.java +++ b/core/src/mindustry/content/Fx.java @@ -499,6 +499,14 @@ public class Fx{ } }), + smokeAoeCloud = new Effect(60f * 3f, 250f, e -> { + color(e.color, 0.65f); + + randLenVectors(e.id, 80, 90f, (x, y) -> { + Fill.circle(e.x + x, e.y + y, 6f * Mathf.clamp(e.fin() / 0.1f) * Mathf.clamp(e.fout() / 0.1f)); + }); + }), + missileTrailSmoke = new Effect(180f, 300f, b -> { float intensity = 2f; From e3ad75f107a66d3e4a48efe4ceeac6ad0adbadc3 Mon Sep 17 00:00:00 2001 From: Anuken Date: Thu, 16 Jan 2025 23:05:53 -0500 Subject: [PATCH 096/460] Carbide breach adjustment --- core/src/mindustry/content/Blocks.java | 40 ++++++++++++++++++++------ 1 file changed, 32 insertions(+), 8 deletions(-) diff --git a/core/src/mindustry/content/Blocks.java b/core/src/mindustry/content/Blocks.java index 5ca105d032..a117fecdca 100644 --- a/core/src/mindustry/content/Blocks.java +++ b/core/src/mindustry/content/Blocks.java @@ -1273,7 +1273,7 @@ public class Blocks{ }}; electricHeater = new HeatProducer("electric-heater"){{ - requirements(Category.crafting, with(Items.tungsten, 30, Items.oxide, 30)); + requirements(Category.crafting, with(Items.tungsten, 30, Items.oxide, 30, Items.beryllium, 30)); researchCostMultiplier = 4f; @@ -4047,14 +4047,14 @@ public class Blocks{ rangeChange = 40f; buildingDamageMultiplier = 0.3f; }}, - Items.carbide, new BasicBulletType(12f, 450f/0.75f){{ + Items.carbide, new BasicBulletType(12f, 325f/0.75f){{ width = 15f; height = 21f; hitSize = 7f; shootEffect = sfe; smokeEffect = Fx.shootBigSmoke; ammoMultiplier = 2; - reloadMultiplier = 0.5f; + reloadMultiplier = 0.2f; hitColor = backColor = trailColor = Color.valueOf("ab8ec5"); frontColor = Color.white; trailWidth = 2.2f; @@ -4062,11 +4062,35 @@ public class Blocks{ trailEffect = Fx.disperseTrail; trailInterval = 2f; hitEffect = despawnEffect = Fx.hitBulletColor; - rangeChange = 20f*8f; + rangeChange = 7f*8f; buildingDamageMultiplier = 0.3f; - targetBlocks = false; - targetMissiles = false; + //targetBlocks = false; + //targetMissiles = false; trailRotation = true; + + fragBullets = 3; + fragRandomSpread = 0f; + fragSpread = 25f; + fragVelocityMin = 1f; + + fragBullet = new BasicBulletType(8.1f, 227f){{ + lifetime = 8f; + width = 11f; + height = 14f; + hitSize = 7f; + shootEffect = sfe; + ammoMultiplier = 1; + reloadMultiplier = 1f; + pierceCap = 2; + pierce = true; + pierceBuilding = true; + hitColor = backColor = trailColor = Color.valueOf("ab8ec5"); + frontColor = Color.white; + trailWidth = 1.8f; + trailLength = 11; + hitEffect = despawnEffect = Fx.hitBulletColor; + buildingDamageMultiplier = 0.2f; + }}; }} ); @@ -4335,7 +4359,7 @@ public class Blocks{ trailInterp = v -> Math.max(Mathf.slope(v), 0.8f); shrinkX = 0.2f; shrinkY = 0.1f; - buildingDamageMultiplier = 0.3f; + buildingDamageMultiplier = 0.2f; }}, Items.oxide, new ArtilleryBulletType(2.5f, 300, "shell"){{ hitEffect = new MultiEffect(Fx.titanExplosionLarge, Fx.titanSmokeLarge, Fx.smokeAoeCloud); @@ -4625,7 +4649,7 @@ public class Blocks{ }}; afflict = new PowerTurret("afflict"){{ - requirements(Category.turret, with(Items.surgeAlloy, 100, Items.silicon, 200, Items.graphite, 250, Items.oxide, 40)); + requirements(Category.turret, with(Items.surgeAlloy, 125, Items.silicon, 200, Items.graphite, 250, Items.oxide, 40)); shootType = new BasicBulletType(){{ shootEffect = new MultiEffect(Fx.shootTitan, new WaveEffect(){{ From 68fecc551a8a724152908ce5deb8543f0ce5d5f2 Mon Sep 17 00:00:00 2001 From: Anuken Date: Sat, 18 Jan 2025 13:01:38 -0500 Subject: [PATCH 097/460] Fixed item display flicker in research dialog --- core/src/mindustry/ui/dialogs/ResearchDialog.java | 1 + 1 file changed, 1 insertion(+) diff --git a/core/src/mindustry/ui/dialogs/ResearchDialog.java b/core/src/mindustry/ui/dialogs/ResearchDialog.java index e9286ab8f6..abc8f66aa0 100644 --- a/core/src/mindustry/ui/dialogs/ResearchDialog.java +++ b/core/src/mindustry/ui/dialogs/ResearchDialog.java @@ -568,6 +568,7 @@ public class ResearchDialog extends BaseDialog{ Core.scene.act(); rebuild(shine); itemDisplay.rebuild(items, usedShine); + checkMargin(); } void unlock(TechNode node){ From 224e74cc5f380a69f0121ee27799acaa315b89d4 Mon Sep 17 00:00:00 2001 From: Anuken Date: Sun, 19 Jan 2025 14:59:27 -0500 Subject: [PATCH 098/460] Closes Anuken/Mindustry-Suggestions/issues/5397 --- .../weapons/scathe-missile-phase-cell.png | Bin 236 -> 230 bytes .../units/weapons/scathe-missile-phase.png | Bin 1157 -> 1256 bytes core/assets/bundles/bundle.properties | 2 +- core/src/mindustry/content/Blocks.java | 38 +++++++++++------- .../entities/abilities/ForceFieldAbility.java | 9 +++++ 5 files changed, 34 insertions(+), 15 deletions(-) diff --git a/core/assets-raw/sprites/units/weapons/scathe-missile-phase-cell.png b/core/assets-raw/sprites/units/weapons/scathe-missile-phase-cell.png index 7854083dfd74dba7e77b2fd1d17ee5880abd5ac5..7f4d7e4c936c32bfcc4d8cf5b8720267904713aa 100644 GIT binary patch delta 189 zcmaFE_>6IaVf_M67srr_Id89=<~?K};(CyKk;p2K|6a2iqRz;*9_gycH{HA~NB-wz z1~hPBe~+Qt(Hq+DrcO>bT3}@)yU>#JWrt6AMjcD3tJ=xM*$YkDYqf1Je&05=XYZmv zug}g$fTydU%Q~loCIFbhPelL# delta 195 zcmaFH_=a(UVf`{s7srr_Id89=_H{NCaJb05NMx1Af3H~$QF7HDP9m9Ytk2iz-VXmK z!hi(+7#}Z`5l)`}(aN&YR?I*)l6zsPeTwp?X-==JE`+6Ay?xDTtMs?KFFNbu^pun5 z8`hP|bI#~nv(&swKSgmdKI;Vst03&8jqyPW_ diff --git a/core/assets-raw/sprites/units/weapons/scathe-missile-phase.png b/core/assets-raw/sprites/units/weapons/scathe-missile-phase.png index fb807978c3043472b0d2d0c3c277f8324fb7b2fc..0065be21abda382f792405e2c592ac77c1ab2028 100644 GIT binary patch delta 1223 zcmZqWe8D-vuzr!Ji(^Q|oVT;~XNNcn95;Vtub`1pe|^ppQNBOiLLMENZ(ELdtz8ow zy>cqso19RQFZu#Z+a8&Eu3zwAeu0_ajoY(l&YiEXd2jnJ`Q4j8SMJVFyLV@*QP!0e zr`Plh|O<0gqeCe46kjKa)38J(A}{dA!=J!^?Dvk(YHgpBAGelbL7; z^90`6Y*~di!e*>j9v6t^SY)&;mfWCeZ8h8XhK!`G|Du8mw*q@FU#kpi4U-QEy<*)Z z5|L6WlC~oJe$a-!ce|T->#cW9i+%0r#0?#TU;XWOeMZ^Tnn#hp1ywHG=YtYajZ{+pnqp_Vn}a`l(;H zZTo&b=iQrknbQR2lP@md@wgDM;VxtUJQ>|?CHX7`N4W@&D*gHL8?!gWGpVd#&u(Oi zOt^jJ$iY=jg5m8|3M)6x@a@!}apfgz^a1XZXAkB?bJc&pd^)Lc+oTWOiZcp|)i0l& zpe`kz@s{C0m4ai!;(ZNq5yl$Z3RqOqPczqNGaY?5+e|6?)RrQb;A0+`m*`MHvPWg$CSgrDI+UZXJNC=hA@u_CcQIPPYV-^ z&{y$bx-F~FIOWdjrBjM5>|-nc|4KR4cl@2Nmu*Dp#=EO{xkPffITt0|4tdlnyQI03iO!E~B`MpB)<&0}# z=dZu(OJcKFEVy9~?^=6>ix=1O9?U*fF*mPn&wpjZ{bt*IBk$Z=I8|`D)%9(BaxuSS zy)>VG+xvPAZ-dRh>g1=NtI~C4yQAJEu|66JEBoEej;~oW%eL&(-&wVzJm2fM*Y(Fs*p7-ly41)rO}hE!wgamiZg2BC zuPDI2sCCMZCQlx&ww(_av~G23;+KjDJ@4`QL^t~`;cq|Aw%sVx^*p~~_u{A%If>cc zWz$%RXn3+54#INx{i^H)UI;}OO0>uq)yPnL~# zj(T@;N?4c6TH`zCw%vC%KkA?q@Op8eE>BqT7ERCE*LD@|4oyl2403bd>&L!5=W!zE zYmMpm9=$~yzOQ-tuU4dc(yS92y)SG}Z2973na26wHbOt8^A|s}McUcIDYd7T9o?s8 zpVd6s?0?#=@b4Z=&qe%RANlQSp!p+*=Zx!h>}Fg#?Rtps*2?cXFD9m+y)d6wS?1Ix r$xYf@lLM{iCKg{=5x7_{=05`ui;~6F@+Dmi3=9mOu6{1-oD!M<#2G&E delta 1123 zcmaFC*~&S=u-@L&#WAE}&fD30^MoA*j*B1RR&aEDZ_-}T;9JF!vBX(^3E#mk{(8=`Ly{h!*)f=b$4lm2gPpjKrZCzaK=QUZ)_g3oN zS1;dOK6(B1pWnNiuiyPsUL4}oRCTbdu*tEh>Oh}cam{_ zk}p_aZuvhtW4_MyZ&CfuJT`sJM|+D`RabrFFj!Q;adPoAhsCRur%TJ8o_*=L z@0*%_-jg{Er)I}Qyt2_=^D-sx-jsLi1S>;p7n$TI9rV`k5(_I8T7EeEc8J{`$@$;@ zo!(Y`F6jD!uJYJi>CG)i{)ve;b6gRgRD8x*%q)XtNs5o}q!|&}v0R+rmy0mGtB=h5 z_w>%@Cp~goPv8Q~B*=6hH z&>d5DH|FQD!h-LsEVo@bdH?t9^Fbb$*L6!~NPeBsI*m8eM&a6}v%Ck>&s5kg-Y@s2 z_)LE9(Mz6Z&9@sF?N2#1y-ZR;M4(?^f0h};raL{KW`U;F>3+c`y;KKQ&@dH@o@eGR&~Q3;_7 zW;pvtoS7yTwkOwnexRxSwGR~+^i*dBp1s;rWvSYGbgSjGO?LfXk4xQ2+nUX((aI9I z;Yy)@#P;JRYm%4O|4lSH!F}zHjJM0oV>f%El6R;s*k!5K+EXL=hB13p&nbp2`ni_R zBfG0brbK<7@z}=UWcI!qow7oW8)0W&o$V-^rT%xt#+@rV4VQ}RtcWrQOrD&6o+J3I zp_tE=h;?W9@BNIFVdQ&MBb@06|n89{>OV diff --git a/core/assets/bundles/bundle.properties b/core/assets/bundles/bundle.properties index bd8832c3e3..e771db3bf0 100644 --- a/core/assets/bundles/bundle.properties +++ b/core/assets/bundles/bundle.properties @@ -751,7 +751,7 @@ error.mapnotfound = Map file not found! error.io = Network I/O error. error.any = Unknown network error. error.bloom = Failed to initialize bloom.\nYour device may not support it. -error.moddex = Mindustry is unable to load this mod.\nYour device is blocking import of Java mods due to recent changes in Android.\nThere is no known workaround for this issue. +error.moddex = Mindustry is unable to load this mod.\nYour device is blocking import of Java mods due to recent changes in Android.\nThis will not be fixed. There is no known workaround for this issue. weather.rain.name = Rain weather.snowing.name = Snow diff --git a/core/src/mindustry/content/Blocks.java b/core/src/mindustry/content/Blocks.java index a117fecdca..8dffc5be6e 100644 --- a/core/src/mindustry/content/Blocks.java +++ b/core/src/mindustry/content/Blocks.java @@ -4927,18 +4927,17 @@ public class Blocks{ }}; }}, - //TODO - needs balancing Items.phaseFabric, new BulletType(0f, 0f){{ shootEffect = Fx.shootBig; smokeEffect = Fx.shootSmokeMissileColor; hitColor = Color.valueOf("ffd37f"); - ammoMultiplier = 1f; + ammoMultiplier = 5f; reloadMultiplier = 0.8f; spawnUnit = new MissileUnitType("scathe-missile-phase"){{ - speed = 4.4f; + speed = 4f; maxRange = 6f; - lifetime = 60f * 5.7f; + lifetime = 60f * 6.1f; outlineColor = Pal.darkOutline; engineColor = trailColor = Color.valueOf("ffd37f"); engineLayer = Layer.effect; @@ -4954,9 +4953,20 @@ public class Blocks{ targetAir = false; targetUnderBlocks = false; + parts.add(new ShapePart(){{ + progress = PartProgress.constant(1f); + color = Pal.accent; + sides = 6; + radius = 3f; + rotateSpeed = 3f; + hollow = true; + layer = Layer.effect; + y = 1.8f; + }}); + fogRadius = 6f; - health = 250; + health = 500; weapons.add(new Weapon(){{ shootCone = 360f; @@ -4965,7 +4975,7 @@ public class Blocks{ deathExplosionEffect = Fx.massiveExplosion; shootOnDeath = true; shake = 10f; - bullet = new ExplosionBulletType(1500f, 50f){{ + bullet = new ExplosionBulletType(400f, 120f){{ hitColor = engineColor; shootEffect = new MultiEffect(Fx.massiveExplosion, Fx.scatheExplosion, Fx.scatheLight, new WaveEffect(){{ lifetime = 10f; @@ -4974,7 +4984,7 @@ public class Blocks{ }}); collidesAir = false; - buildingDamageMultiplier = 0.2f; + buildingDamageMultiplier = 0.1f; ammoMultiplier = 1f; fragLifeMin = 0.1f; @@ -4988,8 +4998,8 @@ public class Blocks{ lifetime = 23f; width = height = 18f; collidesTiles = false; - splashDamageRadius = 40f; - splashDamage = 160f; + splashDamageRadius = 56f; + splashDamage = 164f; backColor = trailColor = hitColor = engineColor; frontColor = Color.white; smokeEffect = Fx.shootBigSmoke2; @@ -5013,7 +5023,7 @@ public class Blocks{ interval = 7f; }}); - abilities.add(new ForceFieldAbility(30f, 0f, 160f, 999999999f)); + abilities.add(new ForceFieldAbility(90f, 0f, 2000f, 999999999f)); }}; }}, @@ -5058,12 +5068,12 @@ public class Blocks{ deathExplosionEffect = Fx.massiveExplosion; shootOnDeath = true; shake = 10f; - bullet = new ExplosionBulletType(400f, 40f){{ + bullet = new ExplosionBulletType(300f, 40f){{ hitColor = engineColor; shootEffect = new MultiEffect(Fx.massiveExplosion, Fx.scatheExplosionSmall); collidesAir = false; - buildingDamageMultiplier = 0.25f; + buildingDamageMultiplier = 0.1f; ammoMultiplier = 1f; fragLifeMin = 0.1f; @@ -5105,7 +5115,7 @@ public class Blocks{ deathExplosionEffect = Fx.massiveExplosion; shootOnDeath = true; shake = 10f; - bullet = new ExplosionBulletType(340f, 35f){{ + bullet = new ExplosionBulletType(360f, 35f){{ lightning = 6; lightningDamage = 35f; lightningLength = 8; @@ -5118,7 +5128,7 @@ public class Blocks{ }}); collidesAir = false; - buildingDamageMultiplier = 0.2f; + buildingDamageMultiplier = 0.1f; }}; }}); diff --git a/core/src/mindustry/entities/abilities/ForceFieldAbility.java b/core/src/mindustry/entities/abilities/ForceFieldAbility.java index 82b5297d88..d4cdac20d4 100644 --- a/core/src/mindustry/entities/abilities/ForceFieldAbility.java +++ b/core/src/mindustry/entities/abilities/ForceFieldAbility.java @@ -105,6 +105,15 @@ public class ForceFieldAbility extends Ability{ } } + @Override + public void death(Unit unit){ + + //self-destructing units can have a shield on death + if(unit.shield > 0f && !wasBroken){ + Fx.shieldBreak.at(unit.x, unit.y, radius, unit.type.shieldColor(unit), this); + } + } + @Override public void draw(Unit unit){ checkRadius(unit); From 34cc625e33292db10e1f373e14dfbc2e9cf671da Mon Sep 17 00:00:00 2001 From: Anuken Date: Sun, 19 Jan 2025 15:07:11 -0500 Subject: [PATCH 099/460] Fixed #10436 --- .../mindustry/world/DirectionalItemBuffer.java | 16 ++++++++++++++++ .../world/blocks/distribution/Junction.java | 7 ++++++- 2 files changed, 22 insertions(+), 1 deletion(-) diff --git a/core/src/mindustry/world/DirectionalItemBuffer.java b/core/src/mindustry/world/DirectionalItemBuffer.java index 0367664826..f71aa74671 100644 --- a/core/src/mindustry/world/DirectionalItemBuffer.java +++ b/core/src/mindustry/world/DirectionalItemBuffer.java @@ -54,11 +54,21 @@ public class DirectionalItemBuffer{ } public void read(Reads read){ + read(read, false); + } + + public void read(Reads read, boolean legacy){ for(int i = 0; i < 4; i++){ indexes[i] = read.b(); byte length = read.b(); for(int j = 0; j < length; j++){ long value = read.l(); + + if(legacy){ + //read value as the old format with 1-byte items, and create a new one with the new 2-byte format + value = BufferItem.get(BufferItemLegacy.item(value), BufferItemLegacy.time(value)); + } + if(j < buffers[i].length){ buffers[i][j] = value; } @@ -71,4 +81,10 @@ public class DirectionalItemBuffer{ short item; float time; } + + @Struct + class BufferItemLegacyStruct{ + byte item; + float time; + } } diff --git a/core/src/mindustry/world/blocks/distribution/Junction.java b/core/src/mindustry/world/blocks/distribution/Junction.java index d02fb84404..ec21de0b16 100644 --- a/core/src/mindustry/world/blocks/distribution/Junction.java +++ b/core/src/mindustry/world/blocks/distribution/Junction.java @@ -79,6 +79,11 @@ public class Junction extends Block{ return to != null && to.team == team; } + @Override + public byte version(){ + return 1; + } + @Override public void write(Writes write){ super.write(write); @@ -88,7 +93,7 @@ public class Junction extends Block{ @Override public void read(Reads read, byte revision){ super.read(read, revision); - buffer.read(read); + buffer.read(read, revision == 0); } } } From 6c42b30309b4887c9162e1877a443e5a5cfed0a7 Mon Sep 17 00:00:00 2001 From: Anuken Date: Sun, 19 Jan 2025 23:06:27 -0500 Subject: [PATCH 100/460] Rotate unit with assemblers / Reduced impact drill water cost to 10/s --- core/src/mindustry/content/Blocks.java | 2 +- core/src/mindustry/world/blocks/units/UnitAssembler.java | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/core/src/mindustry/content/Blocks.java b/core/src/mindustry/content/Blocks.java index 8dffc5be6e..8317a8c7cb 100644 --- a/core/src/mindustry/content/Blocks.java +++ b/core/src/mindustry/content/Blocks.java @@ -2874,7 +2874,7 @@ public class Blocks{ fogRadius = 4; consumePower(160f / 60f); - consumeLiquid(Liquids.water, 0.2f); + consumeLiquid(Liquids.water, 10f/60f); }}; eruptionDrill = new BurstDrill("eruption-drill"){{ diff --git a/core/src/mindustry/world/blocks/units/UnitAssembler.java b/core/src/mindustry/world/blocks/units/UnitAssembler.java index aab15b2b17..2311d4100a 100644 --- a/core/src/mindustry/world/blocks/units/UnitAssembler.java +++ b/core/src/mindustry/world/blocks/units/UnitAssembler.java @@ -452,7 +452,7 @@ public class UnitAssembler extends PayloadBlock{ unit.command().commandPosition(commandPos); } unit.set(spawn.x + Mathf.range(0.001f), spawn.y + Mathf.range(0.001f)); - unit.rotation = 90f; + unit.rotation = rotdeg(); unit.add(); } @@ -507,7 +507,7 @@ public class UnitAssembler extends PayloadBlock{ //margin due to units not taking up whole region Shaders.blockbuild.progress = Mathf.clamp(progress + 0.05f); - Draw.rect(plan.unit.fullIcon, sx, sy); + Draw.rect(plan.unit.fullIcon, sx, sy, rotdeg() - 90f); Draw.flush(); Draw.color(); }); @@ -519,7 +519,7 @@ public class UnitAssembler extends PayloadBlock{ //draw unit silhouette Draw.mixcol(Tmp.c1.set(Pal.accent).lerp(Pal.remove, invalidWarmup), 1f); Draw.alpha(Math.min(powerWarmup, sameTypeWarmup)); - Draw.rect(plan.unit.fullIcon, spawn.x, spawn.y); + Draw.rect(plan.unit.fullIcon, spawn.x, spawn.y, rotdeg() - 90f); //build beams do not draw when invalid Draw.alpha(Math.min(1f - invalidWarmup, warmup)); From 8f5eccaba67ee9b7dd0c8f6ebdd6f02d0ca1ebf1 Mon Sep 17 00:00:00 2001 From: Anuken Date: Thu, 23 Jan 2025 16:17:10 -0500 Subject: [PATCH 101/460] Server packet priority fix --- core/src/mindustry/core/NetClient.java | 2 +- core/src/mindustry/core/NetServer.java | 4 ++-- core/src/mindustry/net/Net.java | 15 +++++++++------ core/src/mindustry/net/Packets.java | 5 +++++ 4 files changed, 17 insertions(+), 9 deletions(-) diff --git a/core/src/mindustry/core/NetClient.java b/core/src/mindustry/core/NetClient.java index 97f2d96160..32c4543043 100644 --- a/core/src/mindustry/core/NetClient.java +++ b/core/src/mindustry/core/NetClient.java @@ -322,7 +322,7 @@ public class NetClient implements ApplicationListener{ ui.join.connect(ip, port); } - @Remote(targets = Loc.client) + @Remote(targets = Loc.client, priority = PacketPriority.high) public static void ping(Player player, long time){ Call.pingResponse(player.con, time); } diff --git a/core/src/mindustry/core/NetServer.java b/core/src/mindustry/core/NetServer.java index 61e088aea8..1222eae1e6 100644 --- a/core/src/mindustry/core/NetServer.java +++ b/core/src/mindustry/core/NetServer.java @@ -632,7 +632,7 @@ public class NetServer implements ApplicationListener{ return Float.isInfinite(f) || Float.isNaN(f); } - @Remote(targets = Loc.client, unreliable = true) + @Remote(targets = Loc.client, unreliable = true, priority = PacketPriority.high) public static void clientSnapshot( Player player, int snapshotID, @@ -830,7 +830,7 @@ public class NetServer implements ApplicationListener{ } } - @Remote(targets = Loc.client) + @Remote(targets = Loc.client, priority = PacketPriority.high) public static void connectConfirm(Player player){ if(player.con.kicked) return; diff --git a/core/src/mindustry/net/Net.java b/core/src/mindustry/net/Net.java index a5c319220e..7271c06aaf 100644 --- a/core/src/mindustry/net/Net.java +++ b/core/src/mindustry/net/Net.java @@ -306,14 +306,17 @@ public class Net{ * Call to handle a packet being received for the server. */ public void handleServerReceived(NetConnection connection, Packet object){ - object.handled(); try{ - //handle object normally - if(serverListeners.get(object.getClass()) != null){ - serverListeners.get(object.getClass()).get(connection, object); - }else{ - object.handleServer(connection); + if(connection.hasConnected || object.getPriority() == Packet.priorityHigh){ + object.handled(); + + //handle object normally + if(serverListeners.get(object.getClass()) != null){ + serverListeners.get(object.getClass()).get(connection, object); + }else{ + object.handleServer(connection); + } } }catch(ValidateException e){ //ignore invalid actions diff --git a/core/src/mindustry/net/Packets.java b/core/src/mindustry/net/Packets.java index c8b2ccfe4e..e766e59434 100644 --- a/core/src/mindustry/net/Packets.java +++ b/core/src/mindustry/net/Packets.java @@ -157,5 +157,10 @@ public class Packets{ mods.add(TypeIO.readString(buffer)); } } + + @Override + public int getPriority(){ + return priorityHigh; + } } } From 22538840a1caede1016823b12972e6196053bf0b Mon Sep 17 00:00:00 2001 From: Anuken Date: Thu, 23 Jan 2025 20:10:20 -0500 Subject: [PATCH 102/460] Interplanetary Accelerator re-added with functionality (WIP) --- core/assets/bundles/bundle.properties | 3 + core/src/mindustry/content/Blocks.java | 3 +- core/src/mindustry/content/Planets.java | 1 + .../mindustry/content/SerpuloTechTree.java | 5 +- core/src/mindustry/core/Renderer.java | 33 +- core/src/mindustry/game/Universe.java | 6 + .../maps/generators/PlanetGenerator.java | 7 +- core/src/mindustry/type/Planet.java | 16 +- .../mindustry/ui/dialogs/PlanetDialog.java | 70 +-- .../world/blocks/LaunchAnimator.java | 22 + .../world/blocks/campaign/Accelerator.java | 405 +++++++++++++++++- .../world/blocks/storage/CoreBlock.java | 229 +++++----- .../world/consumers/ConsumePower.java | 2 +- 13 files changed, 603 insertions(+), 199 deletions(-) create mode 100644 core/src/mindustry/world/blocks/LaunchAnimator.java diff --git a/core/assets/bundles/bundle.properties b/core/assets/bundles/bundle.properties index e771db3bf0..264a3e1f3b 100644 --- a/core/assets/bundles/bundle.properties +++ b/core/assets/bundles/bundle.properties @@ -776,6 +776,7 @@ sectors.stored = Stored: sectors.resume = Resume sectors.launch = Launch sectors.select = Select +sectors.launchselect = Select Launch Destination sectors.nonelaunch = [lightgray]none (sun) sectors.rename = Rename Sector sectors.enemybase = [scarlet]Enemy Base @@ -1090,6 +1091,7 @@ ability.stat.buildtime = [stat]{0} sec[lightgray] build time bar.onlycoredeposit = Only Core Depositing Allowed bar.drilltierreq = Better Drill Required +bar.nobatterypower = Insufficieny Battery Power bar.noresources = Missing Resources bar.corereq = Core Base Required bar.corefloor = Core Zone Tile Required @@ -1098,6 +1100,7 @@ bar.drillspeed = Drill Speed: {0}/s bar.pumpspeed = Pump Speed: {0}/s bar.efficiency = Efficiency: {0}% bar.boost = Boost: +{0}% +bar.powerbuffer = Battery Power: {0}/{1} bar.powerbalance = Power: {0}/s bar.powerstored = Stored: {0}/{1} bar.poweramount = Power: {0} diff --git a/core/src/mindustry/content/Blocks.java b/core/src/mindustry/content/Blocks.java index 8317a8c7cb..4a5de1909e 100644 --- a/core/src/mindustry/content/Blocks.java +++ b/core/src/mindustry/content/Blocks.java @@ -6362,8 +6362,9 @@ public class Blocks{ }}; interplanetaryAccelerator = new Accelerator("interplanetary-accelerator"){{ - requirements(Category.effect, BuildVisibility.hidden, with(Items.copper, 16000, Items.silicon, 11000, Items.thorium, 13000, Items.titanium, 12000, Items.surgeAlloy, 6000, Items.phaseFabric, 5000)); + requirements(Category.effect, BuildVisibility.campaignOnly, with(Items.copper, 16000, Items.silicon, 11000, Items.thorium, 13000, Items.titanium, 12000, Items.surgeAlloy, 6000, Items.phaseFabric, 5000)); researchCostMultiplier = 0.1f; + powerBufferRequirement = 1_000_000f; size = 7; hasPower = true; consumePower(10f); diff --git a/core/src/mindustry/content/Planets.java b/core/src/mindustry/content/Planets.java index 338e25cadc..d23ab25f47 100644 --- a/core/src/mindustry/content/Planets.java +++ b/core/src/mindustry/content/Planets.java @@ -153,6 +153,7 @@ public class Planets{ atmosphereRadOut = 0.3f; startSector = 15; alwaysUnlocked = true; + allowSelfSectorLaunch = true; landCloudColor = Pal.spore.cpy().a(0.5f); }}; diff --git a/core/src/mindustry/content/SerpuloTechTree.java b/core/src/mindustry/content/SerpuloTechTree.java index 6da887240c..f158069c08 100644 --- a/core/src/mindustry/content/SerpuloTechTree.java +++ b/core/src/mindustry/content/SerpuloTechTree.java @@ -20,10 +20,9 @@ public class SerpuloTechTree{ node(junction, () -> { node(router, () -> { node(launchPad, Seq.with(new SectorComplete(extractionOutpost)), () -> { - //no longer necessary to beat the campaign - //node(interplanetaryAccelerator, Seq.with(new SectorComplete(planetaryTerminal)), () -> { + node(interplanetaryAccelerator, Seq.with(new SectorComplete(planetaryTerminal)), () -> { - //}); + }); }); node(distributor); diff --git a/core/src/mindustry/core/Renderer.java b/core/src/mindustry/core/Renderer.java index c544e8bba2..b1f0787749 100644 --- a/core/src/mindustry/core/Renderer.java +++ b/core/src/mindustry/core/Renderer.java @@ -20,8 +20,7 @@ import mindustry.graphics.*; import mindustry.graphics.g3d.*; import mindustry.maps.*; import mindustry.type.*; -import mindustry.world.blocks.storage.*; -import mindustry.world.blocks.storage.CoreBlock.*; +import mindustry.world.blocks.*; import static arc.Core.*; import static mindustry.Vars.*; @@ -51,8 +50,7 @@ public class Renderer implements ApplicationListener{ public TextureRegion[][] fluidFrames; //currently landing core, null if there are no cores or it has finished landing. - private @Nullable CoreBuild landCore; - private @Nullable CoreBlock launchCoreType; + private @Nullable LaunchAnimator landCore; private Color clearColor = new Color(0f, 0f, 0f, 1f); private float //target camera scale that is lerp-ed to @@ -379,7 +377,7 @@ public class Renderer implements ApplicationListener{ if(state.rules.fog) Draw.draw(Layer.fogOfWar, fog::drawFog); Draw.draw(Layer.space, () -> { if(landCore == null || landTime <= 0f) return; - landCore.drawLanding(launching && launchCoreType != null ? launchCoreType : (CoreBlock)landCore.block); + landCore.drawLanding(); }); Events.fire(Trigger.drawOver); @@ -504,10 +502,6 @@ public class Renderer implements ApplicationListener{ return launching; } - public CoreBlock getLaunchCoreType(){ - return launchCoreType; - } - public float getLandTime(){ return landTime; } @@ -527,28 +521,16 @@ public class Renderer implements ApplicationListener{ this.landPTimer = landPTimer; } - @Deprecated - public void showLanding(){ - var core = player.bestCore(); - if(core != null) showLanding(core); - } - - public void showLanding(CoreBuild landCore){ + public void showLanding(LaunchAnimator landCore){ this.landCore = landCore; launching = false; landTime = landCore.landDuration(); - landCore.beginLaunch(null); + landCore.beginLaunch(false); camerascale = landCore.zoomLaunching(); } - @Deprecated - public void showLaunch(CoreBlock coreType){ - var core = player.team().core(); - if(core != null) showLaunch(core, coreType); - } - - public void showLaunch(CoreBuild landCore, CoreBlock coreType){ + public void showLaunch(LaunchAnimator landCore){ control.input.config.hideConfig(); control.input.planConfig.hide(); control.input.inv.hide(); @@ -556,14 +538,13 @@ public class Renderer implements ApplicationListener{ this.landCore = landCore; launching = true; landTime = landCore.landDuration(); - launchCoreType = coreType; Music music = landCore.launchMusic(); music.stop(); music.play(); music.setVolume(settings.getInt("musicvol") / 100f); - landCore.beginLaunch(coreType); + landCore.beginLaunch(true); } public void takeMapScreenshot(){ diff --git a/core/src/mindustry/game/Universe.java b/core/src/mindustry/game/Universe.java index a22d073f9d..5026101451 100644 --- a/core/src/mindustry/game/Universe.java +++ b/core/src/mindustry/game/Universe.java @@ -6,6 +6,7 @@ import arc.struct.*; import arc.util.*; import mindustry.content.*; import mindustry.game.EventType.*; +import mindustry.game.Schematic.*; import mindustry.game.SectorInfo.*; import mindustry.gen.*; import mindustry.maps.*; @@ -115,6 +116,11 @@ public class Universe{ Core.settings.putJson("launch-resources-seq", lastLaunchResources); } + /** Updates selected loadout for future deployment. Creates an empty schematic with a single core block. */ + public void updateLoadout(CoreBlock block){ + updateLoadout(block, new Schematic(Seq.with(new Stile(block, 0, 0, null, (byte)0)), new StringMap(), block.size, block.size)); + } + /** Updates selected loadout for future deployment. */ public void updateLoadout(CoreBlock block, Schematic schem){ Core.settings.put("lastloadout-" + block.name, schem.file == null ? "" : schem.file.nameWithoutExtension()); diff --git a/core/src/mindustry/maps/generators/PlanetGenerator.java b/core/src/mindustry/maps/generators/PlanetGenerator.java index 69524884d7..a093a27df4 100644 --- a/core/src/mindustry/maps/generators/PlanetGenerator.java +++ b/core/src/mindustry/maps/generators/PlanetGenerator.java @@ -39,7 +39,7 @@ public abstract class PlanetGenerator extends BasicGenerator implements HexMeshe if(sector.planet.getSector(other).id == sector.planet.startSector){ return; } - + if(sector.planet.getSector(other).generateEnemyBase){ any = false; break; @@ -57,6 +57,11 @@ public abstract class PlanetGenerator extends BasicGenerator implements HexMeshe return sector.planet.allowLaunchToNumbered && (sector.hasBase() || sector.near().contains(Sector::hasBase)); } + /** @return whether to allow landing on the specified procedural sector */ + public boolean allowAcceleratorLanding(Sector sector){ + return sector.planet.allowLaunchToNumbered; + } + public void addWeather(Sector sector, Rules rules){ //apply weather based on terrain diff --git a/core/src/mindustry/type/Planet.java b/core/src/mindustry/type/Planet.java index f99fba5fe6..7ef88ed9e4 100644 --- a/core/src/mindustry/type/Planet.java +++ b/core/src/mindustry/type/Planet.java @@ -144,8 +144,10 @@ public class Planet extends UnlockableContent{ public Seq children = new Seq<>(); /** Default root node shown when the tech tree is opened here. */ public @Nullable TechNode techTree; - /** TODO remove? Planets that can be launched to from this one. Made mutual in init(). */ + /** Planets that can be launched to from this one. */ public Seq launchCandidates = new Seq<>(); + /** Whether interplanetary accelerators can launch to 'any' procedural sector on this planet's surface. */ + public boolean allowSelfSectorLaunch; /** If true, all content in this planet's tech tree will be assigned this planet in their shownPlanets. */ public boolean autoAssignPlanet = true; /** Content (usually planet-specific) that is unlocked upon landing here. */ @@ -383,18 +385,6 @@ public class Planet extends UnlockableContent{ updateBaseCoverage(); } - //make planet launch candidates mutual. - var candidates = launchCandidates.copy(); - - for(Planet planet : content.planets()){ - if(planet.launchCandidates.contains(this)){ - candidates.addUnique(planet); - } - } - - //TODO currently, mutual launch candidates are simply a nuisance. - //launchCandidates = candidates; - clipRadius = Math.max(clipRadius, radius + atmosphereRadOut + 0.5f); } diff --git a/core/src/mindustry/ui/dialogs/PlanetDialog.java b/core/src/mindustry/ui/dialogs/PlanetDialog.java index 1a040bc00a..e28459c31c 100644 --- a/core/src/mindustry/ui/dialogs/PlanetDialog.java +++ b/core/src/mindustry/ui/dialogs/PlanetDialog.java @@ -54,6 +54,8 @@ public class PlanetDialog extends BaseDialog implements PlanetInterfaceRenderer{ public PlanetParams state = new PlanetParams(); public float zoom = 1f; public @Nullable Sector selected, hovered, launchSector; + /** Must not be null in planet launch mode. */ + public @Nullable Seq launchCandidates; public Mode mode = look; public boolean launching; public Cons listener = s -> {}; @@ -294,7 +296,7 @@ public class PlanetDialog extends BaseDialog implements PlanetInterfaceRenderer{ } void addTech(){ - buttons.button("@techtree", Icon.tree, () -> ui.research.show()).size(200f, 54f).pad(2).bottom(); + buttons.button("@techtree", Icon.tree, () -> ui.research.show()).size(200f, 54f).visible(() -> mode == look).pad(2).bottom(); } public void showOverview(){ @@ -312,16 +314,17 @@ public class PlanetDialog extends BaseDialog implements PlanetInterfaceRenderer{ } //TODO not fully implemented, cutscene needed - public void showPlanetLaunch(Sector sector, Cons listener){ + public void showPlanetLaunch(Sector sector, Seq launchCandidates, Cons listener){ selected = null; hovered = null; launching = false; this.listener = listener; + this.launchCandidates = (launchCandidates == null ? sector.planet.launchCandidates : launchCandidates); launchSector = sector; //automatically select next planets; - if(sector.planet.launchCandidates.size == 1){ - state.planet = sector.planet.launchCandidates.first(); + if(this.launchCandidates.size == 1){ + state.planet = this.launchCandidates.first(); state.otherCamPos = sector.planet.position; state.otherCamAlpha = 0f; @@ -332,8 +335,6 @@ public class PlanetDialog extends BaseDialog implements PlanetInterfaceRenderer{ preset.unlock(); } selected = destSec; - updateSelected(); - rebuildExpand(); } //TODO pan over to correct planet @@ -345,6 +346,13 @@ public class PlanetDialog extends BaseDialog implements PlanetInterfaceRenderer{ mode = planetLaunch; + updateSelected(); + rebuildExpand(); + + if(sectorTop != null){ + sectorTop.color.a = 0f; + } + super.show(); } @@ -382,8 +390,11 @@ public class PlanetDialog extends BaseDialog implements PlanetInterfaceRenderer{ boolean canSelect(Sector sector){ if(mode == select) return sector.hasBase() && launchSector != null && sector.planet == launchSector.planet; - //cannot launch to existing sector w/ accelerator TODO test - if(mode == planetLaunch) return sector.id == sector.planet.startSector; + + if(mode == planetLaunch && sector.hasBase()){ + return false; + } + if(sector.hasBase() || sector.id == sector.planet.startSector) return true; //preset sectors can only be selected once unlocked if(sector.preset != null){ @@ -393,11 +404,15 @@ public class PlanetDialog extends BaseDialog implements PlanetInterfaceRenderer{ return sector.planet.generator != null ? //use planet impl when possible - sector.planet.generator.allowLanding(sector) : - sector.hasBase() || sector.near().contains(Sector::hasBase); //near an occupied sector + (mode == planetLaunch ? sector.planet.generator.allowAcceleratorLanding(sector) : sector.planet.generator.allowLanding(sector)) : + mode == planetLaunch || sector.hasBase() || sector.near().contains(Sector::hasBase); //near an occupied sector } Sector findLauncher(Sector to){ + if(mode == planetLaunch){ + return launchSector; + } + Sector launchSector = this.launchSector != null && this.launchSector.planet == to.planet && this.launchSector.hasBase() ? this.launchSector : null; //directly nearby. if(to.near().contains(launchSector)) return launchSector; @@ -472,6 +487,10 @@ public class PlanetDialog extends BaseDialog implements PlanetInterfaceRenderer{ } } + if(mode == planetLaunch && launchSector != null && selected != null && hovered == null){ + planets.drawArc(planet, launchSector.tile.v, selected.tile.v); + } + if(state.uiAlpha > 0.001f){ for(Sector sec : planet.sectors){ if(sec.hasBase()){ @@ -548,7 +567,7 @@ public class PlanetDialog extends BaseDialog implements PlanetInterfaceRenderer{ //TODO what if any sector is selectable? //TODO launch criteria - which planets can be launched to? Where should this be defined? Should planets even be selectable? if(mode == select) return planet == state.planet; - if(mode == planetLaunch) return launchSector != null && planet != launchSector.planet && launchSector.planet.launchCandidates.contains(planet); + if(mode == planetLaunch) return launchSector != null && (launchCandidates.contains(planet) || (planet == launchSector.planet && planet.allowSelfSectorLaunch)); return (planet.alwaysUnlocked && planet.isLandable()) || planet.sectors.contains(Sector::hasBase) || debugSelect; } @@ -604,7 +623,11 @@ public class PlanetDialog extends BaseDialog implements PlanetInterfaceRenderer{ new Table(t -> { t.touchable = Touchable.disabled; t.top(); - t.label(() -> mode == select ? "@sectors.select" : "").style(Styles.outlineLabel).color(Pal.accent); + t.label(() -> + mode == select ? "@sectors.select" : + mode == planetLaunch ? "@sectors.launchselect" : + "" + ).style(Styles.outlineLabel).color(Pal.accent); }), buttons, @@ -615,7 +638,7 @@ public class PlanetDialog extends BaseDialog implements PlanetInterfaceRenderer{ t.add(pane).colspan(2).row(); t.button("@campaign.difficulty", Icon.bookSmall, () -> { campaignRules.show(state.planet); - }).margin(12f).size(208f, 40f).padTop(12f).visible(() -> state.planet.allowCampaignRules).row(); + }).margin(12f).size(208f, 40f).padTop(12f).visible(() -> state.planet.allowCampaignRules && mode != planetLaunch).row(); t.add().height(64f); //padding for close button Table starsTable = new Table(Styles.black); pane.setWidget(starsTable); @@ -634,7 +657,6 @@ public class PlanetDialog extends BaseDialog implements PlanetInterfaceRenderer{ if(planet.solarSystem == star && selectable(planet)){ Button planetButton = planetTable.button(planet.localizedName, Icon.icons.get(planet.icon + "Small", Icon.icons.get(planet.icon, Icon.commandRallySmall)), Styles.flatTogglet, () -> { selected = null; - launchSector = null; if(state.planet != planet){ newPresets.clear(); state.planet = planet; @@ -660,7 +682,7 @@ public class PlanetDialog extends BaseDialog implements PlanetInterfaceRenderer{ void rebuildExpand(){ Table c = expandTable; c.clear(); - c.visible(() -> !(graphics.isPortrait() && mobile)); + c.visible(() -> !(graphics.isPortrait() && mobile) && mode != planetLaunch); if(state.planet.sectors.contains(Sector::hasBase)){ int attacked = state.planet.sectors.count(Sector::isAttacked); @@ -783,7 +805,7 @@ public class PlanetDialog extends BaseDialog implements PlanetInterfaceRenderer{ if(Mathf.equal(state.otherCamAlpha, 1f, 0.01f)){ //TODO change zoom too - state.camPos.set(Tmp.v31.set(state.otherCamPos).lerp(state.planet.position, state.otherCamAlpha).add(state.camPos).sub(state.planet.position)); + state.camPos.set(Tmp.v31.set(state.otherCamPos).slerp(state.planet.position, state.otherCamAlpha).add(state.camPos).sub(state.planet.position)); state.otherCamPos = null; //announce new sector @@ -792,6 +814,11 @@ public class PlanetDialog extends BaseDialog implements PlanetInterfaceRenderer{ } } + //fade in sector dialog after panning + if(sectorTop != null && state.otherCamPos == null){ + sectorTop.color.a = Mathf.lerpDelta(sectorTop.color.a, 1f, 0.1f); + } + if(hovered != null && !mobile && state.planet.hasGrid()){ addChild(hoverLabel); hoverLabel.toFront(); @@ -1258,7 +1285,7 @@ public class PlanetDialog extends BaseDialog implements PlanetInterfaceRenderer{ //allow planet dialog to finish hiding before actually launching Time.runTask(5f, () -> { Runnable doLaunch = () -> { - renderer.showLaunch(core, schemCore); + renderer.showLaunch(core); //run with less delay, as the loading animation is delayed by several frames Time.runTask(core.landDuration() - 8f, () -> control.playSector(from, sector)); }; @@ -1275,15 +1302,8 @@ public class PlanetDialog extends BaseDialog implements PlanetInterfaceRenderer{ } }); } - }else if(mode == select){ + }else if(mode == select || mode == planetLaunch){ listener.get(sector); - }else if(mode == planetLaunch){ //TODO make sure it doesn't have a base already. - //TODO animation - //schematic selection and cost handled by listener - listener.get(sector); - //unlock right before launch - sector.planet.unlockedOnLand.each(UnlockableContent::unlock); - control.playSector(sector); }else{ //sector should have base here control.playSector(sector); diff --git a/core/src/mindustry/world/blocks/LaunchAnimator.java b/core/src/mindustry/world/blocks/LaunchAnimator.java new file mode 100644 index 0000000000..4bba63a5f4 --- /dev/null +++ b/core/src/mindustry/world/blocks/LaunchAnimator.java @@ -0,0 +1,22 @@ +package mindustry.world.blocks; + +import arc.audio.*; + +public interface LaunchAnimator{ + + void drawLanding(); + + void beginLaunch(boolean launching); + + void endLaunch(); + + void updateLaunching(); + + float landDuration(); + + Music landMusic(); + + Music launchMusic(); + + float zoomLaunching(); +} diff --git a/core/src/mindustry/world/blocks/campaign/Accelerator.java b/core/src/mindustry/world/blocks/campaign/Accelerator.java index e1dde597c7..9968fdc874 100644 --- a/core/src/mindustry/world/blocks/campaign/Accelerator.java +++ b/core/src/mindustry/world/blocks/campaign/Accelerator.java @@ -3,32 +3,56 @@ package mindustry.world.blocks.campaign; import arc.*; import arc.Graphics.*; import arc.Graphics.Cursor.*; +import arc.audio.*; +import arc.graphics.*; import arc.graphics.g2d.*; import arc.math.*; +import arc.math.geom.*; +import arc.scene.actions.*; +import arc.scene.event.*; +import arc.scene.ui.*; import arc.scene.ui.layout.*; +import arc.struct.*; import arc.util.*; +import arc.util.io.*; +import mindustry.*; import mindustry.annotations.Annotations.*; import mindustry.content.*; +import mindustry.core.*; +import mindustry.ctype.*; +import mindustry.entities.*; import mindustry.game.EventType.*; import mindustry.gen.*; import mindustry.graphics.*; import mindustry.type.*; +import mindustry.ui.*; import mindustry.world.*; +import mindustry.world.blocks.*; +import mindustry.world.blocks.storage.*; import static mindustry.Vars.*; public class Accelerator extends Block{ public @Load("launch-arrow") TextureRegion arrowRegion; - //TODO dynamic - public Block launching = Blocks.coreNucleus; - public int[] capacities = {}; + /** Core block that is launched. Should match the starting core of the planet being launched to. */ + public Block launchBlock = Blocks.coreNucleus; + public float powerBufferRequirement; + /** Override for planets that this block can launch to. If null, the planet's launch candidates are used. */ + public @Nullable Seq launchCandidates; + + public Music launchMusic = Musics.coreLaunch; + public float launchDuration = 160f; + public float buildDuration = 120f; + + protected int[] capacities = {}; public Accelerator(String name){ super(name); update = true; solid = true; hasItems = true; + hasPower = true; itemCapacity = 8000; configurable = true; } @@ -37,27 +61,56 @@ public class Accelerator extends Block{ public void init(){ itemCapacity = 0; capacities = new int[content.items().size]; - for(ItemStack stack : launching.requirements){ + for(ItemStack stack : launchBlock.requirements){ capacities[stack.item.id] = stack.amount; itemCapacity += stack.amount; } - consumeItems(launching.requirements); + consumeItems(launchBlock.requirements); super.init(); } + @Override + public void setBars(){ + super.setBars(); + + if(powerBufferRequirement > 0f){ + addBar("powerBufferRequirement", b -> new Bar( + () -> Core.bundle.format("bar.powerbuffer",UI.formatAmount((long)b.power.graph.getBatteryStored()), UI.formatAmount((long)powerBufferRequirement)), + () -> Pal.powerBar, + () -> b.power.graph.getBatteryStored() / powerBufferRequirement + )); + } + } + @Override public boolean outputsItems(){ return false; } - public class AcceleratorBuild extends Building{ + public class AcceleratorBuild extends Building implements LaunchAnimator{ public float heat, statusLerp; + public float progress; + public float time; + + protected float cloudSeed; @Override public void updateTile(){ super.updateTile(); heat = Mathf.lerpDelta(heat, efficiency, 0.05f); statusLerp = Mathf.lerpDelta(statusLerp, power.status, 0.05f); + + time += Time.delta * efficiency; + + if(efficiency >= 0f){ + progress += Time.delta * efficiency / buildDuration; + progress = Math.min(progress, 1f); + } + } + + @Override + public float progress(){ + return progress; } @Override @@ -74,6 +127,32 @@ public class Accelerator extends Block{ } } + { + Drawf.shadow(x, y, launchBlock.size * tilesize * 2f, progress); + Draw.draw(Layer.blockBuilding, () -> { + Draw.color(Pal.accent, heat); + + for(TextureRegion region : launchBlock.getGeneratedIcons()){ + Shaders.blockbuild.region = region; + Shaders.blockbuild.time = time; + Shaders.blockbuild.progress = progress; + + Draw.rect(region, x, y); + Draw.flush(); + } + + Draw.color(); + }); + + //TODO: build line? + //Draw.z(Layer.blockBuilding + 1); + //Draw.color(Pal.accent, heat); + + //Lines.lineAngleCenter(x + Mathf.sin(time, 10f, Vars.tilesize / 2f * recipe.size + 1f), y, 90, recipe.size * Vars.tilesize + 1f); + + Draw.reset(); + } + if(heat < 0.0001f) return; float rad = size * tilesize / 2f * 0.74f; @@ -99,28 +178,52 @@ public class Accelerator extends Block{ Draw.reset(); } + public boolean canLaunch(){ + return isValid() && state.isCampaign() && efficiency > 0f && power.graph.getBatteryStored() >= powerBufferRequirement-0.00001f && progress >= 1f; + } + @Override public Cursor getCursor(){ - return !state.isCampaign() || efficiency <= 0f ? SystemCursor.arrow : super.getCursor(); + return canLaunch() ? SystemCursor.hand : super.getCursor(); + } + + @Override + public void drawSelect(){ + super.drawSelect(); + + if(power.graph.getBatteryStored() < powerBufferRequirement){ + drawPlaceText(Core.bundle.get("bar.nobatterypower"), tile.x, tile.y, false); + } } @Override public void buildConfiguration(Table table){ deselect(); - if(!state.isCampaign() || efficiency <= 0f) return; + if(!canLaunch()) return; - ui.showInfo("This block has been removed from the tech tree as of v7, and no longer has a use.\n\nWill it ever be used for anything? Who knows."); + ui.planet.showPlanetLaunch(state.rules.sector, launchCandidates == null ? state.rules.sector.planet.launchCandidates : launchCandidates, sector -> { + if(canLaunch()){ + //TODO: animation! - if(false) - ui.planet.showPlanetLaunch(state.rules.sector, sector -> { - //TODO cutscene, etc... + consume(); + power.graph.useBatteries(powerBufferRequirement); + progress = 0f; - //TODO should consume resources based on destination schem - consume(); + var core = team.core(); - universe.clearLoadoutInfo(); - universe.updateLoadout(sector.planet.generator.defaultLoadout.findCore(), sector.planet.generator.defaultLoadout); + renderer.showLaunch(this); + + Time.runTask(core.landDuration() - 8f, () -> { + //unlock right before launch + sector.planet.unlockedOnLand.each(UnlockableContent::unlock); + + universe.clearLoadoutInfo(); + universe.updateLoadout((CoreBlock)launchBlock); + + control.playSector(sector); + }); + } }); Events.fire(Trigger.acceleratorUse); @@ -135,5 +238,275 @@ public class Accelerator extends Block{ public boolean acceptItem(Building source, Item item){ return items.get(item) < getMaximumAccepted(item); } + + @Override + public byte version(){ + return 1; + } + + @Override + public void write(Writes write){ + super.write(write); + write.f(progress); + } + + @Override + public void read(Reads read, byte revision){ + super.read(read, revision); + + if(revision >= 1){ + progress = read.f(); + } + } + + //launch animator stuff: + + @Override + public float zoomLaunching(){ + CoreBlock core = (CoreBlock)launchBlock; + Core.camera.position.set(this); + return core.landZoomInterp.apply(Scl.scl(core.landZoomFrom), Scl.scl(core.landZoomTo), renderer.getLandTimeIn()); + } + + @Override + public void updateLaunching(){ + float in = renderer.getLandTimeIn() * landDuration(); + float tsize = Mathf.sample(CoreBlock.thrusterSizes, (in + 35f) / landDuration()); + + renderer.setLandPTimer(renderer.getLandPTimer() + tsize * Time.delta); + if(renderer.getLandTime() >= 1f){ + tile.getLinkedTiles(t -> { + if(Mathf.chance(0.4f)){ + Fx.coreLandDust.at(t.worldx(), t.worldy(), angleTo(t.worldx(), t.worldy()) + Mathf.range(30f), Tmp.c1.set(t.floor().mapColor).mul(1.5f + Mathf.range(0.15f))); + } + }); + + renderer.setLandPTimer(0f); + } + } + + @Override + public float landDuration(){ + return launchDuration; + } + + @Override + public Music landMusic(){ + //unused + return launchMusic; + } + + @Override + public Music launchMusic(){ + return launchMusic; + } + + @Override + public void beginLaunch(boolean launching){ + cloudSeed = Mathf.random(1f); + if(launching){ + Fx.coreLaunchConstruct.at(x, y, launchBlock.size); + } + + if(!headless){ + // Add fade-in and fade-out foreground when landing or launching. + if(renderer.isLaunching()){ + float margin = 30f; + + Image image = new Image(); + image.color.a = 0f; + image.touchable = Touchable.disabled; + image.setFillParent(true); + image.actions(Actions.delay((landDuration() - margin) / 60f), Actions.fadeIn(margin / 60f, Interp.pow2In), Actions.delay(6f / 60f), Actions.remove()); + image.update(() -> { + image.toFront(); + ui.loadfrag.toFront(); + if(state.isMenu()){ + image.remove(); + } + }); + Core.scene.add(image); + }else{ + Image image = new Image(); + image.color.a = 1f; + image.touchable = Touchable.disabled; + image.setFillParent(true); + image.actions(Actions.fadeOut(35f / 60f), Actions.remove()); + image.update(() -> { + image.toFront(); + ui.loadfrag.toFront(); + if(state.isMenu()){ + image.remove(); + } + }); + Core.scene.add(image); + + Time.run(landDuration(), () -> { + CoreBlock core = (CoreBlock)launchBlock; + core.launchEffect.at(this); + Effect.shake(5f, 5f, this); + + if(state.isCampaign() && Vars.showSectorLandInfo && (state.rules.sector.preset == null || state.rules.sector.preset.showSectorLandInfo)){ + ui.announce("[accent]" + state.rules.sector.name() + "\n" + + (state.rules.sector.info.resources.any() ? "[lightgray]" + Core.bundle.get("sectors.resources") + "[white] " + + state.rules.sector.info.resources.toString(" ", UnlockableContent::emoji) : ""), 5); + } + }); + } + } + } + + @Override + public void endLaunch(){} + + @Override + public void drawLanding(){ + var clouds = Core.assets.get("sprites/clouds.png", Texture.class); + + float fin = renderer.getLandTimeIn(); + float cameraScl = renderer.getDisplayScale(); + + float fout = 1f - fin; + float scl = Scl.scl(4f) / cameraScl; + float pfin = Interp.pow3Out.apply(fin), pf = Interp.pow2In.apply(fout); + + //draw particles + Draw.color(Pal.lightTrail); + Angles.randLenVectors(1, pfin, 100, 800f * scl * pfin, (ax, ay, ffin, ffout) -> { + Lines.stroke(scl * ffin * pf * 3f); + Lines.lineAngle(x + ax, y + ay, Mathf.angle(ax, ay), (ffin * 20 + 1f) * scl); + }); + Draw.color(); + + drawLanding(x, y); + + Draw.color(); + Draw.mixcol(Color.white, Interp.pow5In.apply(fout)); + + //accent tint indicating that the core was just constructed + if(renderer.isLaunching()){ + float f = Mathf.clamp(1f - fout * 12f); + if(f > 0.001f){ + Draw.mixcol(Pal.accent, f); + } + } + + //draw clouds + if(state.rules.cloudColor.a > 0.0001f){ + float scaling = CoreBlock.cloudScaling; + float sscl = Math.max(1f + Mathf.clamp(fin + CoreBlock.cfinOffset) * CoreBlock.cfinScl, 0f) * cameraScl; + + Tmp.tr1.set(clouds); + Tmp.tr1.set( + (Core.camera.position.x - Core.camera.width/2f * sscl) / scaling, + (Core.camera.position.y - Core.camera.height/2f * sscl) / scaling, + (Core.camera.position.x + Core.camera.width/2f * sscl) / scaling, + (Core.camera.position.y + Core.camera.height/2f * sscl) / scaling); + + Tmp.tr1.scroll(10f * cloudSeed, 10f * cloudSeed); + + Draw.alpha(Mathf.sample(CoreBlock.cloudAlphas, fin + CoreBlock.calphaFinOffset) * CoreBlock.cloudAlpha); + Draw.mixcol(state.rules.cloudColor, state.rules.cloudColor.a); + Draw.rect(Tmp.tr1, Core.camera.position.x, Core.camera.position.y, Core.camera.width, Core.camera.height); + Draw.reset(); + } + } + + public void drawLanding(float x, float y){ + float fin = renderer.getLandTimeIn(); + float fout = 1f - fin; + + float scl = Scl.scl(4f) / renderer.getDisplayScale(); + float shake = 0f; + float s = launchBlock.region.width * launchBlock.region.scl() * scl * 3.6f * Interp.pow2Out.apply(fout); + float rotation = Interp.pow2In.apply(fout) * 135f; + x += Mathf.range(shake); + y += Mathf.range(shake); + float thrustOpen = 0.25f; + float thrusterFrame = fin >= thrustOpen ? 1f : fin / thrustOpen; + float thrusterSize = Mathf.sample(CoreBlock.thrusterSizes, fin); + + //when launching, thrusters stay out the entire time. + if(renderer.isLaunching()){ + Interp i = Interp.pow2Out; + thrusterFrame = i.apply(Mathf.clamp(fout*13f)); + thrusterSize = i.apply(Mathf.clamp(fout*9f)); + } + + Draw.color(Pal.lightTrail); + //TODO spikier heat + Draw.rect("circle-shadow", x, y, s, s); + + Draw.scl(scl); + + //draw thruster flame + float strength = (1f + (launchBlock.size - 3)/2.5f) * scl * thrusterSize * (0.95f + Mathf.absin(2f, 0.1f)); + float offset = (launchBlock.size - 3) * 3f * scl; + + for(int i = 0; i < 4; i++){ + Tmp.v1.trns(i * 90 + rotation, 1f); + + Tmp.v1.setLength((launchBlock.size * tilesize/2f + 1f)*scl + strength*2f + offset); + Draw.color(team.color); + Fill.circle(Tmp.v1.x + x, Tmp.v1.y + y, 6f * strength); + + Tmp.v1.setLength((launchBlock.size * tilesize/2f + 1f)*scl + strength*0.5f + offset); + Draw.color(Color.white); + Fill.circle(Tmp.v1.x + x, Tmp.v1.y + y, 3.5f * strength); + } + + drawLandingThrusters(x, y, rotation, thrusterFrame); + + Drawf.spinSprite(launchBlock.region, x, y, rotation); + + Draw.alpha(Interp.pow4In.apply(thrusterFrame)); + drawLandingThrusters(x, y, rotation, thrusterFrame); + Draw.alpha(1f); + + if(launchBlock.teamRegions[team.id] == launchBlock.teamRegion) Draw.color(team.color); + + Drawf.spinSprite(launchBlock.teamRegions[team.id], x, y, rotation); + + Draw.color(); + Draw.scl(); + Draw.reset(); + } + + protected void drawLandingThrusters(float x, float y, float rotation, float frame){ + CoreBlock core = (CoreBlock)launchBlock; + float length = core.thrusterLength * (frame - 1f) - 1f/4f; + float alpha = Draw.getColorAlpha(); + + //two passes for consistent lighting + for(int j = 0; j < 2; j++){ + for(int i = 0; i < 4; i++){ + var reg = i >= 2 ? core.thruster2 : core.thruster1; + float rot = (i * 90) + rotation % 90f; + Tmp.v1.trns(rot, length * Draw.xscl); + + //second pass applies extra layer of shading + if(j == 1){ + Tmp.v1.rotate(-90f); + Draw.alpha((rotation % 90f) / 90f * alpha); + rot -= 90f; + Draw.rect(reg, x + Tmp.v1.x, y + Tmp.v1.y, rot); + }else{ + Draw.alpha(alpha); + Draw.rect(reg, x + Tmp.v1.x, y + Tmp.v1.y, rot); + } + } + } + Draw.alpha(1f); + } + + public void drawThrusters(float frame){ + CoreBlock core = (CoreBlock)launchBlock; + float length = core.thrusterLength * (frame - 1f) - 1f/4f; + for(int i = 0; i < 4; i++){ + var reg = i >= 2 ? core.thruster2 : core.thruster1; + float dx = Geometry.d4x[i] * length, dy = Geometry.d4y[i] * length; + Draw.rect(reg, x + dx, y + dy, i * 90); + } + } } } diff --git a/core/src/mindustry/world/blocks/storage/CoreBlock.java b/core/src/mindustry/world/blocks/storage/CoreBlock.java index 11f7b8c893..3dd29fc6b1 100644 --- a/core/src/mindustry/world/blocks/storage/CoreBlock.java +++ b/core/src/mindustry/world/blocks/storage/CoreBlock.java @@ -27,18 +27,19 @@ import mindustry.logic.*; import mindustry.type.*; import mindustry.ui.*; import mindustry.world.*; +import mindustry.world.blocks.*; import mindustry.world.meta.*; import mindustry.world.modules.*; import static mindustry.Vars.*; public class CoreBlock extends StorageBlock{ - protected static final float cloudScaling = 1700f, cfinScl = -2f, cfinOffset = 0.3f, calphaFinOffset = 0.25f, cloudAlpha = 0.81f; - protected static final float[] cloudAlphas = {0, 0.5f, 1f, 0.1f, 0, 0f}; + public static final float cloudScaling = 1700f, cfinScl = -2f, cfinOffset = 0.3f, calphaFinOffset = 0.25f, cloudAlpha = 0.81f; + public static final float[] cloudAlphas = {0, 0.5f, 1f, 0.1f, 0, 0f}; //hacky way to pass item modules between methods private static ItemModule nextItems; - protected static final float[] thrusterSizes = {0f, 0f, 0f, 0f, 0.3f, 1f, 1f, 1f, 1f, 1f, 1f, 1f, 1f, 0f}; + public static final float[] thrusterSizes = {0f, 0f, 0f, 0f, 0.3f, 1f, 1f, 1f, 1f, 1f, 1f, 1f, 1f, 0f}; public @Load(value = "@-thruster1", fallback = "clear-effect") TextureRegion thruster1; //top right public @Load(value = "@-thruster2", fallback = "clear-effect") TextureRegion thruster2; //bot left @@ -230,93 +231,7 @@ public class CoreBlock extends StorageBlock{ } } - public void drawLanding(CoreBuild build, float x, float y){ - float fin = renderer.getLandTimeIn(); - float fout = 1f - fin; - - float scl = Scl.scl(4f) / renderer.getDisplayScale(); - float shake = 0f; - float s = region.width * region.scl() * scl * 3.6f * Interp.pow2Out.apply(fout); - float rotation = Interp.pow2In.apply(fout) * 135f; - x += Mathf.range(shake); - y += Mathf.range(shake); - float thrustOpen = 0.25f; - float thrusterFrame = fin >= thrustOpen ? 1f : fin / thrustOpen; - float thrusterSize = Mathf.sample(thrusterSizes, fin); - - //when launching, thrusters stay out the entire time. - if(renderer.isLaunching()){ - Interp i = Interp.pow2Out; - thrusterFrame = i.apply(Mathf.clamp(fout*13f)); - thrusterSize = i.apply(Mathf.clamp(fout*9f)); - } - - Draw.color(Pal.lightTrail); - //TODO spikier heat - Draw.rect("circle-shadow", x, y, s, s); - - Draw.scl(scl); - - //draw thruster flame - float strength = (1f + (size - 3)/2.5f) * scl * thrusterSize * (0.95f + Mathf.absin(2f, 0.1f)); - float offset = (size - 3) * 3f * scl; - - for(int i = 0; i < 4; i++){ - Tmp.v1.trns(i * 90 + rotation, 1f); - - Tmp.v1.setLength((size * tilesize/2f + 1f)*scl + strength*2f + offset); - Draw.color(build.team.color); - Fill.circle(Tmp.v1.x + x, Tmp.v1.y + y, 6f * strength); - - Tmp.v1.setLength((size * tilesize/2f + 1f)*scl + strength*0.5f + offset); - Draw.color(Color.white); - Fill.circle(Tmp.v1.x + x, Tmp.v1.y + y, 3.5f * strength); - } - - drawLandingThrusters(x, y, rotation, thrusterFrame); - - Drawf.spinSprite(region, x, y, rotation); - - Draw.alpha(Interp.pow4In.apply(thrusterFrame)); - drawLandingThrusters(x, y, rotation, thrusterFrame); - Draw.alpha(1f); - - if(teamRegions[build.team.id] == teamRegion) Draw.color(build.team.color); - - Drawf.spinSprite(teamRegions[build.team.id], x, y, rotation); - - Draw.color(); - Draw.scl(); - Draw.reset(); - } - - protected void drawLandingThrusters(float x, float y, float rotation, float frame){ - float length = thrusterLength * (frame - 1f) - 1f/4f; - float alpha = Draw.getColorAlpha(); - - //two passes for consistent lighting - for(int j = 0; j < 2; j++){ - for(int i = 0; i < 4; i++){ - var reg = i >= 2 ? thruster2 : thruster1; - float rot = (i * 90) + rotation % 90f; - Tmp.v1.trns(rot, length * Draw.xscl); - - //second pass applies extra layer of shading - if(j == 1){ - Tmp.v1.rotate(-90f); - Draw.alpha((rotation % 90f) / 90f * alpha); - rot -= 90f; - Draw.rect(reg, x + Tmp.v1.x, y + Tmp.v1.y, rot); - }else{ - Draw.alpha(alpha); - Draw.rect(reg, x + Tmp.v1.x, y + Tmp.v1.y, rot); - } - } - } - Draw.alpha(1f); - } - - public class CoreBuild extends Building{ + public class CoreBuild extends Building implements LaunchAnimator{ public int storageCapacity; public boolean noEffect = false; public Team lastDamage = Team.derelict; @@ -325,19 +240,6 @@ public class CoreBlock extends StorageBlock{ protected float cloudSeed; - //utility methods for less Block-to-CoreBlock casts. also allows for more customization - public float landDuration(){ - return landDuration; - } - - public Music landMusic(){ - return landMusic; - } - - public Music launchMusic(){ - return launchMusic; - } - @Override public void draw(){ //draw thrusters when just landed @@ -357,11 +259,26 @@ public class CoreBlock extends StorageBlock{ } } - // `launchType` is null if it's landing instead of launching. - public void beginLaunch(@Nullable CoreBlock launchType){ + @Override + public float landDuration(){ + return landDuration; + } + + @Override + public Music landMusic(){ + return landMusic; + } + + @Override + public Music launchMusic(){ + return launchMusic; + } + + @Override + public void beginLaunch(boolean launching){ cloudSeed = Mathf.random(1f); - if(launchType != null){ - Fx.coreLaunchConstruct.at(x, y, launchType.size); + if(launching){ + Fx.coreLaunchConstruct.at(x, y, size); } if(!headless){ @@ -412,9 +329,11 @@ public class CoreBlock extends StorageBlock{ } } + @Override public void endLaunch(){} - public void drawLanding(CoreBlock block){ + @Override + public void drawLanding(){ var clouds = Core.assets.get("sprites/clouds.png", Texture.class); float fin = renderer.getLandTimeIn(); @@ -432,7 +351,7 @@ public class CoreBlock extends StorageBlock{ }); Draw.color(); - block.drawLanding(this, x, y); + drawLanding(x, y); Draw.color(); Draw.mixcol(Color.white, Interp.pow5In.apply(fout)); @@ -466,6 +385,92 @@ public class CoreBlock extends StorageBlock{ } } + public void drawLanding(float x, float y){ + float fin = renderer.getLandTimeIn(); + float fout = 1f - fin; + + float scl = Scl.scl(4f) / renderer.getDisplayScale(); + float shake = 0f; + float s = region.width * region.scl() * scl * 3.6f * Interp.pow2Out.apply(fout); + float rotation = Interp.pow2In.apply(fout) * 135f; + x += Mathf.range(shake); + y += Mathf.range(shake); + float thrustOpen = 0.25f; + float thrusterFrame = fin >= thrustOpen ? 1f : fin / thrustOpen; + float thrusterSize = Mathf.sample(thrusterSizes, fin); + + //when launching, thrusters stay out the entire time. + if(renderer.isLaunching()){ + Interp i = Interp.pow2Out; + thrusterFrame = i.apply(Mathf.clamp(fout*13f)); + thrusterSize = i.apply(Mathf.clamp(fout*9f)); + } + + Draw.color(Pal.lightTrail); + //TODO spikier heat + Draw.rect("circle-shadow", x, y, s, s); + + Draw.scl(scl); + + //draw thruster flame + float strength = (1f + (size - 3)/2.5f) * scl * thrusterSize * (0.95f + Mathf.absin(2f, 0.1f)); + float offset = (size - 3) * 3f * scl; + + for(int i = 0; i < 4; i++){ + Tmp.v1.trns(i * 90 + rotation, 1f); + + Tmp.v1.setLength((size * tilesize/2f + 1f)*scl + strength*2f + offset); + Draw.color(team.color); + Fill.circle(Tmp.v1.x + x, Tmp.v1.y + y, 6f * strength); + + Tmp.v1.setLength((size * tilesize/2f + 1f)*scl + strength*0.5f + offset); + Draw.color(Color.white); + Fill.circle(Tmp.v1.x + x, Tmp.v1.y + y, 3.5f * strength); + } + + drawLandingThrusters(x, y, rotation, thrusterFrame); + + Drawf.spinSprite(region, x, y, rotation); + + Draw.alpha(Interp.pow4In.apply(thrusterFrame)); + drawLandingThrusters(x, y, rotation, thrusterFrame); + Draw.alpha(1f); + + if(teamRegions[team.id] == teamRegion) Draw.color(team.color); + + Drawf.spinSprite(teamRegions[team.id], x, y, rotation); + + Draw.color(); + Draw.scl(); + Draw.reset(); + } + + protected void drawLandingThrusters(float x, float y, float rotation, float frame){ + float length = thrusterLength * (frame - 1f) - 1f/4f; + float alpha = Draw.getColorAlpha(); + + //two passes for consistent lighting + for(int j = 0; j < 2; j++){ + for(int i = 0; i < 4; i++){ + var reg = i >= 2 ? thruster2 : thruster1; + float rot = (i * 90) + rotation % 90f; + Tmp.v1.trns(rot, length * Draw.xscl); + + //second pass applies extra layer of shading + if(j == 1){ + Tmp.v1.rotate(-90f); + Draw.alpha((rotation % 90f) / 90f * alpha); + rot -= 90f; + Draw.rect(reg, x + Tmp.v1.x, y + Tmp.v1.y, rot); + }else{ + Draw.alpha(alpha); + Draw.rect(reg, x + Tmp.v1.x, y + Tmp.v1.y, rot); + } + } + } + Draw.alpha(1f); + } + public void drawThrusters(float frame){ float length = thrusterLength * (frame - 1f) - 1f/4f; for(int i = 0; i < 4; i++){ @@ -545,16 +550,14 @@ public class CoreBlock extends StorageBlock{ } /** @return Camera zoom while landing or launching. May optionally do other things such as setting camera position to itself. */ + @Override public float zoomLaunching(){ Core.camera.position.set(this); return landZoomInterp.apply(Scl.scl(landZoomFrom), Scl.scl(landZoomTo), renderer.getLandTimeIn()); } + @Override public void updateLaunching(){ - updateLandParticles(); - } - - public void updateLandParticles(){ float in = renderer.getLandTimeIn() * landDuration(); float tsize = Mathf.sample(thrusterSizes, (in + 35f) / landDuration()); diff --git a/core/src/mindustry/world/consumers/ConsumePower.java b/core/src/mindustry/world/consumers/ConsumePower.java index 4ceb202d87..74a96b1c5f 100644 --- a/core/src/mindustry/world/consumers/ConsumePower.java +++ b/core/src/mindustry/world/consumers/ConsumePower.java @@ -43,7 +43,7 @@ public class ConsumePower extends Consume{ public void display(Stats stats){ if(buffered){ stats.add(Stat.powerCapacity, capacity, StatUnit.none); - }else{ + }else if(usage > 0f){ stats.add(Stat.powerUse, usage * 60f, StatUnit.powerSecond); } } From aababb4beed762dd128cbb4326ab7e87fd4f0143 Mon Sep 17 00:00:00 2001 From: Github Actions Date: Fri, 24 Jan 2025 01:11:15 +0000 Subject: [PATCH 103/460] Automatic bundle update --- core/assets/bundles/bundle_be.properties | 3 +++ core/assets/bundles/bundle_bg.properties | 3 +++ core/assets/bundles/bundle_ca.properties | 3 +++ core/assets/bundles/bundle_cs.properties | 3 +++ core/assets/bundles/bundle_da.properties | 3 +++ core/assets/bundles/bundle_de.properties | 3 +++ core/assets/bundles/bundle_es.properties | 3 +++ core/assets/bundles/bundle_et.properties | 3 +++ core/assets/bundles/bundle_eu.properties | 3 +++ core/assets/bundles/bundle_fi.properties | 3 +++ core/assets/bundles/bundle_fil.properties | 3 +++ core/assets/bundles/bundle_fr.properties | 3 +++ core/assets/bundles/bundle_hu.properties | 3 +++ core/assets/bundles/bundle_id_ID.properties | 3 +++ core/assets/bundles/bundle_it.properties | 3 +++ core/assets/bundles/bundle_ja.properties | 3 +++ core/assets/bundles/bundle_ko.properties | 3 +++ core/assets/bundles/bundle_lt.properties | 3 +++ core/assets/bundles/bundle_nl.properties | 3 +++ core/assets/bundles/bundle_nl_BE.properties | 3 +++ core/assets/bundles/bundle_pl.properties | 3 +++ core/assets/bundles/bundle_pt_BR.properties | 3 +++ core/assets/bundles/bundle_pt_PT.properties | 3 +++ core/assets/bundles/bundle_ro.properties | 3 +++ core/assets/bundles/bundle_ru.properties | 3 +++ core/assets/bundles/bundle_sr.properties | 3 +++ core/assets/bundles/bundle_sv.properties | 3 +++ core/assets/bundles/bundle_th.properties | 3 +++ core/assets/bundles/bundle_tk.properties | 3 +++ core/assets/bundles/bundle_tr.properties | 3 +++ core/assets/bundles/bundle_uk_UA.properties | 3 +++ core/assets/bundles/bundle_vi.properties | 3 +++ core/assets/bundles/bundle_zh_CN.properties | 3 +++ core/assets/bundles/bundle_zh_TW.properties | 3 +++ 34 files changed, 102 insertions(+) diff --git a/core/assets/bundles/bundle_be.properties b/core/assets/bundles/bundle_be.properties index 0b88c54a4b..c473fdbb3c 100644 --- a/core/assets/bundles/bundle_be.properties +++ b/core/assets/bundles/bundle_be.properties @@ -752,6 +752,7 @@ sectors.stored = Захавана: sectors.resume = Працягнуць sectors.launch = Запусціць sectors.select = Выбраць +sectors.launchselect = Select Launch Destination sectors.nonelaunch = [lightgray]нічога (sun) sectors.rename = Пераназваць Сектар sectors.enemybase = [scarlet]Варожая База @@ -1058,6 +1059,7 @@ ability.stat.buildtime = [stat]{0} sec[lightgray] build time bar.onlycoredeposit = Даступны Толькі Перанос Рэсурсаў У Ядро bar.drilltierreq = Патрабуецца свідар лепей +bar.nobatterypower = Insufficieny Battery Power bar.noresources = Не Хапае Рэсурсаў bar.corereq = Патрабуецца Аснова Ядра bar.corefloor = Патрабуецца Тайлавая Зона Ядра @@ -1066,6 +1068,7 @@ bar.drillspeed = Хуткасць бурэння: {0}/с bar.pumpspeed = Хуткасць выкачванне: {0}/с bar.efficiency = Эфектыўнасць: {0}% bar.boost = Моц Узлёту: +{0}% +bar.powerbuffer = Battery Power: {0}/{1} bar.powerbalance = Энергія: {0}/с bar.powerstored = Назапашана: {0}/{1} bar.poweramount = Энергія: {0} diff --git a/core/assets/bundles/bundle_bg.properties b/core/assets/bundles/bundle_bg.properties index b0d0d498ce..bcc42a6fb2 100644 --- a/core/assets/bundles/bundle_bg.properties +++ b/core/assets/bundles/bundle_bg.properties @@ -759,6 +759,7 @@ sectors.stored = Съхранени: sectors.resume = Продължи sectors.launch = Изстреляй sectors.select = Избери +sectors.launchselect = Select Launch Destination sectors.nonelaunch = [lightgray]няма (Слънцето) sectors.rename = Преименувай Зоната sectors.enemybase = [scarlet]Вражеска база @@ -1069,6 +1070,7 @@ ability.stat.buildtime = [stat]{0} sec[lightgray] build time bar.onlycoredeposit = Only Core Depositing Allowed bar.drilltierreq = Необходимо е по-добро Свредло +bar.nobatterypower = Insufficieny Battery Power bar.noresources = Недостатъчни Ресурси bar.corereq = Необходимо е Ядро за основа bar.corefloor = Core Zone Tile Required @@ -1077,6 +1079,7 @@ bar.drillspeed = Скорост на свредлото: {0}/сек bar.pumpspeed = Скорост на помпата: {0}/сек bar.efficiency = Ефективност: {0}% bar.boost = Усилване: +{0}% +bar.powerbuffer = Battery Power: {0}/{1} bar.powerbalance = Електроенергия: {0}/сек bar.powerstored = Съхранена енергия: {0}/{1} bar.poweramount = Електроенергия: {0} diff --git a/core/assets/bundles/bundle_ca.properties b/core/assets/bundles/bundle_ca.properties index f8964ad29b..3487168154 100644 --- a/core/assets/bundles/bundle_ca.properties +++ b/core/assets/bundles/bundle_ca.properties @@ -763,6 +763,7 @@ sectors.stored = Emmagatzemat: sectors.resume = Continua sectors.launch = Llança sectors.select = Selecciona +sectors.launchselect = Select Launch Destination sectors.nonelaunch = [lightgray]cap (sol) sectors.rename = Reanomena el sector sectors.enemybase = [scarlet]Base enemiga @@ -1072,6 +1073,7 @@ ability.stat.buildtime = [stat]{0} seg[lightgray] de temps de construcció bar.onlycoredeposit = Només es permet depositar al nucli. bar.drilltierreq = Cal una perforadora millor. +bar.nobatterypower = Insufficieny Battery Power bar.noresources = Falten recursos. bar.corereq = Cal un nucli base. bar.corefloor = Cal col·locar-ho en una zona designada per a nuclis. @@ -1080,6 +1082,7 @@ bar.drillspeed = Velocitat de perforació: {0}/s bar.pumpspeed = Velocitat de bombeig: {0}/s bar.efficiency = Eficiència: {0} % bar.boost = Potenciador: +{0} % +bar.powerbuffer = Battery Power: {0}/{1} bar.powerbalance = Potència: {0}/s bar.powerstored = Emmagatzemat: {0}/{1} bar.poweramount = Energia: {0} diff --git a/core/assets/bundles/bundle_cs.properties b/core/assets/bundles/bundle_cs.properties index 7765150968..d480d5c96a 100644 --- a/core/assets/bundles/bundle_cs.properties +++ b/core/assets/bundles/bundle_cs.properties @@ -761,6 +761,7 @@ sectors.stored = Uskladněno: sectors.resume = Pokračovat sectors.launch = Vyslat sectors.select = Vybrat +sectors.launchselect = Select Launch Destination sectors.nonelaunch = [lightgray]bez (slunce)[] sectors.rename = Přejmenovat sektor sectors.enemybase = [scarlet]Nepřátelská základna @@ -1071,6 +1072,7 @@ ability.stat.buildtime = [stat]{0} sec[lightgray] build time bar.onlycoredeposit = Pouze Ukládání do Jádra je povoleno bar.drilltierreq = Je vyžadován lepší vrt +bar.nobatterypower = Insufficieny Battery Power bar.noresources = Chybějí zdroje bar.corereq = Je vyžadováno základní jádro bar.corefloor = Core Zone Tile Required @@ -1079,6 +1081,7 @@ bar.drillspeed = Rychlost vrtu: {0}/s bar.pumpspeed = Rychlost pumpy: {0}/s bar.efficiency = Účinnost: {0}% bar.boost = Posílení: +{0}% +bar.powerbuffer = Battery Power: {0}/{1} bar.powerbalance = Energie: {0} bar.powerstored = Uskladněno: {0}/{1} bar.poweramount = Energie celkem: {0} diff --git a/core/assets/bundles/bundle_da.properties b/core/assets/bundles/bundle_da.properties index b114712702..47e96ad136 100644 --- a/core/assets/bundles/bundle_da.properties +++ b/core/assets/bundles/bundle_da.properties @@ -753,6 +753,7 @@ sectors.stored = Stored: sectors.resume = Genoptag sectors.launch = Affyr sectors.select = Vælg +sectors.launchselect = Select Launch Destination sectors.nonelaunch = [lightgray]ingen (solen) sectors.rename = Omdøb sektor sectors.enemybase = [scarlet]Enemy Base @@ -1060,6 +1061,7 @@ ability.stat.buildtime = [stat]{0} sec[lightgray] build time bar.onlycoredeposit = Only Core Depositing Allowed bar.drilltierreq = Kræver bedre bor +bar.nobatterypower = Insufficieny Battery Power bar.noresources = Mangler resurser bar.corereq = Kerne påkrævet bar.corefloor = Core Zone Tile Required @@ -1068,6 +1070,7 @@ bar.drillspeed = Borehastighed: {0}/s bar.pumpspeed = Pumpehastighed: {0}/s bar.efficiency = Effektivitet: {0}% bar.boost = Boost: +{0}% +bar.powerbuffer = Battery Power: {0}/{1} bar.powerbalance = Strøm: {0}/s bar.powerstored = Gemt: {0}/{1} bar.poweramount = Strøm: {0} diff --git a/core/assets/bundles/bundle_de.properties b/core/assets/bundles/bundle_de.properties index 93e2ea95ee..8edef0b9a4 100644 --- a/core/assets/bundles/bundle_de.properties +++ b/core/assets/bundles/bundle_de.properties @@ -771,6 +771,7 @@ sectors.stored = Gelagert: sectors.resume = Weiterspielen sectors.launch = Start sectors.select = Auswählen +sectors.launchselect = Select Launch Destination sectors.nonelaunch = [lightgray]keiner (Sonne) sectors.rename = Sektor umbenennen sectors.enemybase = [scarlet]Gegnerische Basis @@ -1082,6 +1083,7 @@ ability.stat.buildtime = [stat]{0} sec[lightgray] build time bar.onlycoredeposit = Nur Kernablage möglich bar.drilltierreq = Besserer Bohrer benötigt +bar.nobatterypower = Insufficieny Battery Power bar.noresources = Fehlende Ressourcen bar.corereq = Kern-Basis erforderlich bar.corefloor = Kernzone erforderlich @@ -1090,6 +1092,7 @@ bar.drillspeed = Bohrgeschwindigkeit: {0}/s bar.pumpspeed = Pumpengeschwindigkeit: {0}/s bar.efficiency = Effizienz: {0}% bar.boost = Beschleunigung: +{0}% +bar.powerbuffer = Battery Power: {0}/{1} bar.powerbalance = Strom: {0}/s bar.powerstored = Gespeichert: {0}/{1} bar.poweramount = Strom: {0} diff --git a/core/assets/bundles/bundle_es.properties b/core/assets/bundles/bundle_es.properties index e5090379a6..bf68e0ca8d 100644 --- a/core/assets/bundles/bundle_es.properties +++ b/core/assets/bundles/bundle_es.properties @@ -767,6 +767,7 @@ sectors.stored = Almacenado: sectors.resume = Reanudar sectors.launch = Lanzar sectors.select = Seleccionar +sectors.launchselect = Select Launch Destination sectors.nonelaunch = [lightgray]Ninguno (sol) sectors.rename = Renombrar sector sectors.enemybase = [scarlet]Base enemiga @@ -1078,6 +1079,7 @@ ability.stat.buildtime = [stat]{0} sec[lightgray] build time bar.onlycoredeposit = Sólo se permite depositar en el núcleo bar.drilltierreq = Requiere un taladro mejor +bar.nobatterypower = Insufficieny Battery Power bar.noresources = Recursos insuficientes bar.corereq = Requiere un núcleo base bar.corefloor = Requiere colocarse en una zona designada para ello @@ -1086,6 +1088,7 @@ bar.drillspeed = Velocidad del taladro: {0}/s bar.pumpspeed = Velocidad de bombeado: {0}/s bar.efficiency = Eficiencia: {0}% bar.boost = Aceleración: +{0}% +bar.powerbuffer = Battery Power: {0}/{1} bar.powerbalance = Energía: {0}/s bar.powerstored = Almacenado: {0}/{1} bar.poweramount = Energía: {0} diff --git a/core/assets/bundles/bundle_et.properties b/core/assets/bundles/bundle_et.properties index bbf3b905c8..4bda6f7eeb 100644 --- a/core/assets/bundles/bundle_et.properties +++ b/core/assets/bundles/bundle_et.properties @@ -753,6 +753,7 @@ sectors.stored = Stored: sectors.resume = Resume sectors.launch = Launch sectors.select = Select +sectors.launchselect = Select Launch Destination sectors.nonelaunch = [lightgray]none (sun) sectors.rename = Rename Sector sectors.enemybase = [scarlet]Enemy Base @@ -1060,6 +1061,7 @@ ability.stat.buildtime = [stat]{0} sec[lightgray] build time bar.onlycoredeposit = Only Core Depositing Allowed bar.drilltierreq = Nõuab paremat puuri +bar.nobatterypower = Insufficieny Battery Power bar.noresources = Missing Resources bar.corereq = Core Base Required bar.corefloor = Core Zone Tile Required @@ -1068,6 +1070,7 @@ bar.drillspeed = Puurimise kiirus: {0}/s bar.pumpspeed = Pump Speed: {0}/s bar.efficiency = Kasutegur: {0}% bar.boost = Boost: +{0}% +bar.powerbuffer = Battery Power: {0}/{1} bar.powerbalance = Bilanss: {0}/s bar.powerstored = Puhver: {0}/{1} bar.poweramount = Laeng: {0} diff --git a/core/assets/bundles/bundle_eu.properties b/core/assets/bundles/bundle_eu.properties index b0feaf9914..279d9ccb3a 100644 --- a/core/assets/bundles/bundle_eu.properties +++ b/core/assets/bundles/bundle_eu.properties @@ -755,6 +755,7 @@ sectors.stored = Stored: sectors.resume = Resume sectors.launch = Launch sectors.select = Select +sectors.launchselect = Select Launch Destination sectors.nonelaunch = [lightgray]none (sun) sectors.rename = Rename Sector sectors.enemybase = [scarlet]Enemy Base @@ -1062,6 +1063,7 @@ ability.stat.buildtime = [stat]{0} sec[lightgray] build time bar.onlycoredeposit = Only Core Depositing Allowed bar.drilltierreq = Zulagailu hobea behar da +bar.nobatterypower = Insufficieny Battery Power bar.noresources = Missing Resources bar.corereq = Core Base Required bar.corefloor = Core Zone Tile Required @@ -1070,6 +1072,7 @@ bar.drillspeed = Ustiatze-abiadura: {0}/s bar.pumpspeed = Ponpatze abiadura: {0}/s bar.efficiency = Eraginkortasuna: {0}% bar.boost = Boost: +{0}% +bar.powerbuffer = Battery Power: {0}/{1} bar.powerbalance = Energia: {0}/s bar.powerstored = Bilduta: {0}/{1} bar.poweramount = Energia: {0} diff --git a/core/assets/bundles/bundle_fi.properties b/core/assets/bundles/bundle_fi.properties index 2a5e05c5d4..664bc98267 100644 --- a/core/assets/bundles/bundle_fi.properties +++ b/core/assets/bundles/bundle_fi.properties @@ -753,6 +753,7 @@ sectors.stored = Säilötty: sectors.resume = Jatka sectors.launch = Laukaise sectors.select = Valitse +sectors.launchselect = Select Launch Destination sectors.nonelaunch = [lightgray]ei mitään (sun) sectors.rename = Nimeä sektori sectors.enemybase = [scarlet]Vihollistukikohta @@ -1059,6 +1060,7 @@ ability.stat.buildtime = [stat]{0} sec[lightgray] build time bar.onlycoredeposit = Sijoittaminen sallittua vain ytimeen bar.drilltierreq = Parempi pora vaadittu +bar.nobatterypower = Insufficieny Battery Power bar.noresources = Resursseja Puuttuu bar.corereq = Pohjaydin vaadittu bar.corefloor = 'Ydinpohja'-laatta vaadittu @@ -1067,6 +1069,7 @@ bar.drillspeed = Poran nopeus: {0}/s bar.pumpspeed = Pumpun nopeus: {0}/s bar.efficiency = Tehokkuus: {0}% bar.boost = Tehostus: +{0}% +bar.powerbuffer = Battery Power: {0}/{1} bar.powerbalance = Energia: {0}/s bar.powerstored = Säilöttynä: {0}/{1} bar.poweramount = Energia: {0} diff --git a/core/assets/bundles/bundle_fil.properties b/core/assets/bundles/bundle_fil.properties index 8a250a8af6..4957168bcc 100644 --- a/core/assets/bundles/bundle_fil.properties +++ b/core/assets/bundles/bundle_fil.properties @@ -753,6 +753,7 @@ sectors.stored = Stored: sectors.resume = Resume sectors.launch = Launch sectors.select = Select +sectors.launchselect = Select Launch Destination sectors.nonelaunch = [lightgray]none (sun) sectors.rename = Rename Sector sectors.enemybase = [scarlet]Enemy Base @@ -1059,6 +1060,7 @@ ability.stat.buildtime = [stat]{0} sec[lightgray] build time bar.onlycoredeposit = Only Core Depositing Allowed bar.drilltierreq = Better Drill Required +bar.nobatterypower = Insufficieny Battery Power bar.noresources = Missing Resources bar.corereq = Core Base Required bar.corefloor = Core Zone Tile Required @@ -1067,6 +1069,7 @@ bar.drillspeed = Drill Speed: {0}/s bar.pumpspeed = Pump Speed: {0}/s bar.efficiency = Efficiency: {0}% bar.boost = Boost: +{0}% +bar.powerbuffer = Battery Power: {0}/{1} bar.powerbalance = Power: {0}/s bar.powerstored = Stored: {0}/{1} bar.poweramount = Power: {0} diff --git a/core/assets/bundles/bundle_fr.properties b/core/assets/bundles/bundle_fr.properties index 733a570e31..d8550a4c6e 100644 --- a/core/assets/bundles/bundle_fr.properties +++ b/core/assets/bundles/bundle_fr.properties @@ -774,6 +774,7 @@ sectors.stored = Stockage : sectors.resume = Reprendre sectors.launch = Décoller sectors.select = Sélectionner +sectors.launchselect = Select Launch Destination sectors.nonelaunch = [lightgray]Vide (soleil) sectors.rename = Renommer le secteur sectors.enemybase = [scarlet]Base ennemie @@ -1084,6 +1085,7 @@ ability.stat.buildtime = [stat]{0} sec[lightgray] build time bar.onlycoredeposit = Seul le dépôt de ressources dans le Noyau est autorisé bar.drilltierreq = Meilleure Foreuse Requise +bar.nobatterypower = Insufficieny Battery Power bar.noresources = Ressources manquantes bar.corereq = Noyau de base requis bar.corefloor = Tuiles de Zone de Noyau requis @@ -1092,6 +1094,7 @@ bar.drillspeed = Vitesse de Forage: {0}/s bar.pumpspeed = Vitesse de Pompage: {0}/s bar.efficiency = Efficacité: {0}% bar.boost = Boost: +{0}% +bar.powerbuffer = Battery Power: {0}/{1} bar.powerbalance = Énergie: {0}/s bar.powerstored = Réserves d'Énergie: {0}/{1} bar.poweramount = Énergie: {0} diff --git a/core/assets/bundles/bundle_hu.properties b/core/assets/bundles/bundle_hu.properties index d730471f4b..7e5508d386 100644 --- a/core/assets/bundles/bundle_hu.properties +++ b/core/assets/bundles/bundle_hu.properties @@ -776,6 +776,7 @@ sectors.stored = Tárolt nyersanyagok: sectors.resume = Folytatás sectors.launch = Kilövés sectors.select = Kiválasztás +sectors.launchselect = Select Launch Destination sectors.nonelaunch = [lightgray]semmi (nap) sectors.rename = Szektor átnevezése sectors.enemybase = [scarlet]Ellenséges bázis @@ -1090,6 +1091,7 @@ ability.stat.buildtime = [stat]{0} mp[lightgray] építési idő bar.onlycoredeposit = Nyersanyagtárolás csak a támaszpontban. bar.drilltierreq = Erősebb fúró szükséges +bar.nobatterypower = Insufficieny Battery Power bar.noresources = Hiányzó nyersanyagok bar.corereq = Támaszpont szükséges bar.corefloor = Támaszpont-zónamező szükséges @@ -1098,6 +1100,7 @@ bar.drillspeed = Termelés: {0}/mp bar.pumpspeed = Termelés: {0}/mp bar.efficiency = Hatásfok: {0}% bar.boost = Erősítés: +{0}% +bar.powerbuffer = Battery Power: {0}/{1} bar.powerbalance = Áram: {0}/mp bar.powerstored = Eltárolva: {0}/{1} bar.poweramount = Kapacitás: {0} diff --git a/core/assets/bundles/bundle_id_ID.properties b/core/assets/bundles/bundle_id_ID.properties index 15651bba05..ec05daa035 100644 --- a/core/assets/bundles/bundle_id_ID.properties +++ b/core/assets/bundles/bundle_id_ID.properties @@ -776,6 +776,7 @@ sectors.stored = Terisi: sectors.resume = Lanjutkan sectors.launch = Luncurkan sectors.select = Pilih +sectors.launchselect = Select Launch Destination sectors.nonelaunch = [lightgray]nihil (matahari) sectors.rename = Ganti Nama Sektor sectors.enemybase = [scarlet]Markas Musuh @@ -1087,6 +1088,7 @@ ability.stat.buildtime = [stat]{0} sec[lightgray] waktu membangun bar.onlycoredeposit = Hanya Penyetoran Inti yang Diizinkan bar.drilltierreq = Membutuhkan Bor yang Lebih Baik +bar.nobatterypower = Insufficieny Battery Power bar.noresources = Sumber Daya Tidak Cukup bar.corereq = Membutuhkan Inti Markas bar.corefloor = Ubin Zona Inti Dibutuhkan @@ -1095,6 +1097,7 @@ bar.drillspeed = Kecepatan Bor: {0}/s bar.pumpspeed = Kecepatan Pompa: {0}/s bar.efficiency = Efisiensi: {0}% bar.boost = Pendorongan: +{0}% +bar.powerbuffer = Battery Power: {0}/{1} bar.powerbalance = Tenaga: {0}/s bar.powerstored = Disimpan: {0}/{1} bar.poweramount = Tenaga: {0} diff --git a/core/assets/bundles/bundle_it.properties b/core/assets/bundles/bundle_it.properties index 8eaeb013db..8d47d22701 100644 --- a/core/assets/bundles/bundle_it.properties +++ b/core/assets/bundles/bundle_it.properties @@ -757,6 +757,7 @@ sectors.stored = Immagazzinato: sectors.resume = Riprendi sectors.launch = Lancia sectors.select = Seleziona +sectors.launchselect = Select Launch Destination sectors.nonelaunch = [lightgray]nessuno (sole) sectors.rename = Rinomina Settore sectors.enemybase = [scarlet]Base Nemica @@ -1065,6 +1066,7 @@ ability.stat.buildtime = [stat]{0} sec[lightgray] build time bar.onlycoredeposit = Concesso solo il deposito al nucleo bar.drilltierreq = Miglior Trivella Richiesta +bar.nobatterypower = Insufficieny Battery Power bar.noresources = Risorse Mancanti bar.corereq = Nucleo Richiesto bar.corefloor = Core Zone Tile Required @@ -1073,6 +1075,7 @@ bar.drillspeed = Velocità Scavo: {0}/s bar.pumpspeed = Velocità di Pompaggio: {0}/s bar.efficiency = Efficienza: {0}% bar.boost = Boost: +{0}% +bar.powerbuffer = Battery Power: {0}/{1} bar.powerbalance = Energia: {0}/s bar.powerstored = Immagazzinata: {0}/{1} bar.poweramount = Energia: {0} diff --git a/core/assets/bundles/bundle_ja.properties b/core/assets/bundles/bundle_ja.properties index 994f4f10f5..1bc25d60d5 100644 --- a/core/assets/bundles/bundle_ja.properties +++ b/core/assets/bundles/bundle_ja.properties @@ -761,6 +761,7 @@ sectors.stored = コアの資源: sectors.resume = 再開 sectors.launch = 打ち上げ sectors.select = 選択 +sectors.launchselect = Select Launch Destination sectors.nonelaunch = [lightgray]無し (sun) sectors.rename = セクター名を変更 sectors.enemybase = [scarlet]敵基地 @@ -1071,6 +1072,7 @@ ability.stat.buildtime = [stat]{0} sec[lightgray] build time bar.onlycoredeposit = コアにのみ搬入できます。 bar.drilltierreq = より高性能なドリルを使用してください +bar.nobatterypower = Insufficieny Battery Power bar.noresources = 不足している資源 bar.corereq = コアベースが必要 bar.corefloor = コアゾーンタイルが必要 @@ -1079,6 +1081,7 @@ bar.drillspeed = 採掘速度: {0}/秒 bar.pumpspeed = ポンプの速度: {0}/s bar.efficiency = 効率: {0}% bar.boost = ブースト: +{0}% +bar.powerbuffer = Battery Power: {0}/{1} bar.powerbalance = 電力均衡: {0}/秒 bar.powerstored = 総蓄電量: {0}/{1} bar.poweramount = 蓄電量: {0} diff --git a/core/assets/bundles/bundle_ko.properties b/core/assets/bundles/bundle_ko.properties index acd35634be..e411f182b8 100644 --- a/core/assets/bundles/bundle_ko.properties +++ b/core/assets/bundles/bundle_ko.properties @@ -776,6 +776,7 @@ sectors.stored = 저장량: sectors.resume = 재개 sectors.launch = 출격 sectors.select = 선택 +sectors.launchselect = Select Launch Destination sectors.nonelaunch = [lightgray]없음 (태양)[] sectors.rename = 지역 이름 변경하기 sectors.enemybase = [scarlet]적 기지[] @@ -1089,6 +1090,7 @@ ability.stat.buildtime = [stat]{0} 초[lightgray] 건설 시간 bar.onlycoredeposit = 코어에만 투입할 수 있습니다 bar.drilltierreq = 더 좋은 드릴 필요 +bar.nobatterypower = Insufficieny Battery Power bar.noresources = 자원 부족 bar.corereq = 기본 코어 필요 bar.corefloor = 코어 구역 타일 필요 @@ -1097,6 +1099,7 @@ bar.drillspeed = 드릴 속도: {0}/s bar.pumpspeed = 펌프 속도: {0}/s bar.efficiency = 효율: {0}% bar.boost = 가속: +{0}% +bar.powerbuffer = Battery Power: {0}/{1} bar.powerbalance = 전력: {0}/s bar.powerstored = 저장량: {0}/{1} bar.poweramount = 전력: {0} diff --git a/core/assets/bundles/bundle_lt.properties b/core/assets/bundles/bundle_lt.properties index ac9cf13b60..3b1d27e425 100644 --- a/core/assets/bundles/bundle_lt.properties +++ b/core/assets/bundles/bundle_lt.properties @@ -753,6 +753,7 @@ sectors.stored = Stored: sectors.resume = Resume sectors.launch = Launch sectors.select = Select +sectors.launchselect = Select Launch Destination sectors.nonelaunch = [lightgray]none (sun) sectors.rename = Rename Sector sectors.enemybase = [scarlet]Enemy Base @@ -1060,6 +1061,7 @@ ability.stat.buildtime = [stat]{0} sec[lightgray] build time bar.onlycoredeposit = Only Core Depositing Allowed bar.drilltierreq = Privalomas Geresnis Grąžtas +bar.nobatterypower = Insufficieny Battery Power bar.noresources = Missing Resources bar.corereq = Core Base Required bar.corefloor = Core Zone Tile Required @@ -1068,6 +1070,7 @@ bar.drillspeed = Grąžto Greitis: {0}/s bar.pumpspeed = Pompos Greitis: {0}/s bar.efficiency = Efektyvumas: {0}% bar.boost = Boost: +{0}% +bar.powerbuffer = Battery Power: {0}/{1} bar.powerbalance = Energija: {0}/s bar.powerstored = Sukaupta: {0}/{1} bar.poweramount = Energija: {0} diff --git a/core/assets/bundles/bundle_nl.properties b/core/assets/bundles/bundle_nl.properties index 148c8e8bd2..472aa4fe41 100644 --- a/core/assets/bundles/bundle_nl.properties +++ b/core/assets/bundles/bundle_nl.properties @@ -764,6 +764,7 @@ sectors.stored = Opgeslagen: sectors.resume = Doorgaan sectors.launch = Lanceer sectors.select = Selecteer +sectors.launchselect = Select Launch Destination sectors.nonelaunch = [lightgray]geen (sun) sectors.rename = Hernoem Sector sectors.enemybase = [scarlet]Vijandelijke Basis @@ -1072,6 +1073,7 @@ ability.stat.buildtime = [stat]{0} sec[lightgray] build time bar.onlycoredeposit = Alleen materialen in de Core toegestaan. bar.drilltierreq = Betere boor nodig +bar.nobatterypower = Insufficieny Battery Power bar.noresources = Er ontbreken materialen bar.corereq = Core Basis Vereist bar.corefloor = Core Zone Tegel Vereist @@ -1080,6 +1082,7 @@ bar.drillspeed = Delvingssnelheid: {0}/s bar.pumpspeed = Pompsnelheid: {0}/s bar.efficiency = Rendement: {0}% bar.boost = Boost: +{0}% +bar.powerbuffer = Battery Power: {0}/{1} bar.powerbalance = Stroom: {0} bar.powerstored = Opgeslagen: {0}/{1} bar.poweramount = Stroom: {0} diff --git a/core/assets/bundles/bundle_nl_BE.properties b/core/assets/bundles/bundle_nl_BE.properties index a9d1b251aa..bd82f52dcc 100644 --- a/core/assets/bundles/bundle_nl_BE.properties +++ b/core/assets/bundles/bundle_nl_BE.properties @@ -753,6 +753,7 @@ sectors.stored = Stored: sectors.resume = Resume sectors.launch = Launch sectors.select = Select +sectors.launchselect = Select Launch Destination sectors.nonelaunch = [lightgray]none (sun) sectors.rename = Rename Sector sectors.enemybase = [scarlet]Enemy Base @@ -1060,6 +1061,7 @@ ability.stat.buildtime = [stat]{0} sec[lightgray] build time bar.onlycoredeposit = Only Core Depositing Allowed bar.drilltierreq = Better Drill Required +bar.nobatterypower = Insufficieny Battery Power bar.noresources = Missing Resources bar.corereq = Core Base Required bar.corefloor = Core Zone Tile Required @@ -1068,6 +1070,7 @@ bar.drillspeed = Drill Speed: {0}/s bar.pumpspeed = Pump Speed: {0}/s bar.efficiency = Efficiency: {0}% bar.boost = Boost: +{0}% +bar.powerbuffer = Battery Power: {0}/{1} bar.powerbalance = Power: {0}/s bar.powerstored = Stored: {0}/{1} bar.poweramount = Power: {0} diff --git a/core/assets/bundles/bundle_pl.properties b/core/assets/bundles/bundle_pl.properties index b868efbc0a..5a1dcee809 100644 --- a/core/assets/bundles/bundle_pl.properties +++ b/core/assets/bundles/bundle_pl.properties @@ -759,6 +759,7 @@ sectors.stored = Zmagazynowane: sectors.resume = Kontynuuj sectors.launch = Wystrzel sectors.select = Wybierz +sectors.launchselect = Select Launch Destination sectors.nonelaunch = [lightgray]Żaden (Słońce) sectors.rename = Zmień Nazwę Sektora sectors.enemybase = [scarlet]Baza Wroga @@ -1069,6 +1070,7 @@ ability.stat.buildtime = [stat]{0} sec[lightgray] build time bar.onlycoredeposit = Dozwolone jest tylko przeniesienie z rdzenia bar.drilltierreq = Wymagane Lepsze Wiertło +bar.nobatterypower = Insufficieny Battery Power bar.noresources = Brak Zasobów bar.corereq = Wymagany Rdzeń bar.corefloor = Wymagana strefa dla rdzenia @@ -1077,6 +1079,7 @@ bar.drillspeed = Prędkość wiertła: {0}/s bar.pumpspeed = Prędkość pompy: {0}/s bar.efficiency = Efektywność: {0}% bar.boost = Przyspieszenie: +{0}% +bar.powerbuffer = Battery Power: {0}/{1} bar.powerbalance = Moc: {0} bar.powerstored = Zmagazynowano: {0}/{1} bar.poweramount = Moc: {0} diff --git a/core/assets/bundles/bundle_pt_BR.properties b/core/assets/bundles/bundle_pt_BR.properties index 1a9a017efd..ac4bb5d662 100644 --- a/core/assets/bundles/bundle_pt_BR.properties +++ b/core/assets/bundles/bundle_pt_BR.properties @@ -767,6 +767,7 @@ sectors.stored = Armazenado: sectors.resume = Continuar sectors.launch = Lançar sectors.select = Selecionar +sectors.launchselect = Select Launch Destination sectors.nonelaunch = [lightgray]nenhum (sun) sectors.rename = Renomear Setor sectors.enemybase = [scarlet]Base Inimiga @@ -1079,6 +1080,7 @@ ability.stat.buildtime = [stat]{0} sec[lightgray] build time bar.onlycoredeposit = Somente depósito no núcleo permitido bar.drilltierreq = Broca melhor necessária. +bar.nobatterypower = Insufficieny Battery Power bar.noresources = Recursos Insuficientes bar.corereq = Base do Núcleo Necessária bar.corefloor = Zona do Núcleo Necessária @@ -1087,6 +1089,7 @@ bar.drillspeed = Velocidade da Broca: {0}/s bar.pumpspeed = Velocidade da Bomba: {0}/s bar.efficiency = Eficiência: {0}% bar.boost = Impulso: +{0}% +bar.powerbuffer = Battery Power: {0}/{1} bar.powerbalance = Energia: {0} bar.powerstored = Armazenada: {0}/{1} bar.poweramount = Energia: {0} diff --git a/core/assets/bundles/bundle_pt_PT.properties b/core/assets/bundles/bundle_pt_PT.properties index f42d9dfaed..d706d20b41 100644 --- a/core/assets/bundles/bundle_pt_PT.properties +++ b/core/assets/bundles/bundle_pt_PT.properties @@ -753,6 +753,7 @@ sectors.stored = Stored: sectors.resume = Resume sectors.launch = Launch sectors.select = Select +sectors.launchselect = Select Launch Destination sectors.nonelaunch = [lightgray]none (sun) sectors.rename = Rename Sector sectors.enemybase = [scarlet]Enemy Base @@ -1060,6 +1061,7 @@ ability.stat.buildtime = [stat]{0} sec[lightgray] build time bar.onlycoredeposit = Only Core Depositing Allowed bar.drilltierreq = Broca melhor necessária. +bar.nobatterypower = Insufficieny Battery Power bar.noresources = Missing Resources bar.corereq = Core Base Required bar.corefloor = Core Zone Tile Required @@ -1068,6 +1070,7 @@ bar.drillspeed = Velocidade da broca: {0}/s bar.pumpspeed = Pump Speed: {0}/s bar.efficiency = Eficiência: {0}% bar.boost = Boost: +{0}% +bar.powerbuffer = Battery Power: {0}/{1} bar.powerbalance = Energia: {0} bar.powerstored = Armazenada: {0}/{1} bar.poweramount = Energia: {0} diff --git a/core/assets/bundles/bundle_ro.properties b/core/assets/bundles/bundle_ro.properties index 50098f2e0b..72c3069526 100644 --- a/core/assets/bundles/bundle_ro.properties +++ b/core/assets/bundles/bundle_ro.properties @@ -761,6 +761,7 @@ sectors.stored = Stocat: sectors.resume = Revino sectors.launch = Lansare sectors.select = Selectează +sectors.launchselect = Select Launch Destination sectors.nonelaunch = [lightgray]nimic (soarele) sectors.rename = Redenumește Sectorul sectors.enemybase = [scarlet]Bază Inamică @@ -1071,6 +1072,7 @@ ability.stat.buildtime = [stat]{0} sec[lightgray] build time bar.onlycoredeposit = Only Core Depositing Allowed bar.drilltierreq = Burghiu Mai Bun Necesar +bar.nobatterypower = Insufficieny Battery Power bar.noresources = Resurse lipsă bar.corereq = Plasare pe Nucleu Necesară bar.corefloor = Core Zone Tile Required @@ -1079,6 +1081,7 @@ bar.drillspeed = Viteză Minare: {0}/s bar.pumpspeed = Viteză Pompare: {0}/s bar.efficiency = Eficiență: {0}% bar.boost = Efect Grăbire: +{0}% +bar.powerbuffer = Battery Power: {0}/{1} bar.powerbalance = Electricitate: {0}/s bar.powerstored = Stocată: {0}/{1} bar.poweramount = Electricitate: {0} diff --git a/core/assets/bundles/bundle_ru.properties b/core/assets/bundles/bundle_ru.properties index 1a40bb7986..6d84a3a7c4 100644 --- a/core/assets/bundles/bundle_ru.properties +++ b/core/assets/bundles/bundle_ru.properties @@ -762,6 +762,7 @@ sectors.stored = Накоплено: sectors.resume = Продолжить sectors.launch = Высадка sectors.select = Выбор +sectors.launchselect = Select Launch Destination sectors.nonelaunch = [lightgray]нет (солнце) sectors.rename = Переименовать сектор sectors.enemybase = [scarlet]Вражеская база @@ -1071,6 +1072,7 @@ ability.stat.buildtime = [stat]{0} sec[lightgray] build time bar.onlycoredeposit = Доступен перенос только в ядро bar.drilltierreq = Требуется бур получше +bar.nobatterypower = Insufficieny Battery Power bar.noresources = Недостаточно ресурсов bar.corereq = Требуется основа ядра bar.corefloor = Требуется зона ядра @@ -1079,6 +1081,7 @@ bar.drillspeed = Скорость бурения: {0}/с bar.pumpspeed = Скорость выкачивания: {0}/с bar.efficiency = Эффективность: {0}% bar.boost = Ускорение: +{0}% +bar.powerbuffer = Battery Power: {0}/{1} bar.powerbalance = Энергия: {0}/с bar.powerstored = Накоплено: {0}/{1} bar.poweramount = Энергия: {0} diff --git a/core/assets/bundles/bundle_sr.properties b/core/assets/bundles/bundle_sr.properties index 6298ae6012..ae8d2c4b1d 100644 --- a/core/assets/bundles/bundle_sr.properties +++ b/core/assets/bundles/bundle_sr.properties @@ -762,6 +762,7 @@ sectors.stored = Skladišćeno: sectors.resume = Nastavi sectors.launch = Lansiraj sectors.select = Izaberi +sectors.launchselect = Select Launch Destination sectors.nonelaunch = [lightgray]nema (sunce) sectors.rename = Preimenuj Sektor sectors.enemybase = [scarlet]Neprijateljska Baza @@ -1073,6 +1074,7 @@ ability.stat.buildtime = [stat]{0} sec[lightgray] build time bar.onlycoredeposit = Dozvoljeno Dostavljanje Samo Unutar Jezgra bar.drilltierreq = Bolja Bušilica Potrebna +bar.nobatterypower = Insufficieny Battery Power bar.noresources = Nedostaju Resursi bar.corereq = Potrebno Jezgro kao Osnova bar.corefloor = Zahteva Zonu Jezgra @@ -1081,6 +1083,7 @@ bar.drillspeed = Brzina Bušenja: {0}/s bar.pumpspeed = Brzina Pumpanja: {0}/s bar.efficiency = Efikasnost: {0}% bar.boost = Pojačanje: +{0}% +bar.powerbuffer = Battery Power: {0}/{1} bar.powerbalance = Energija: {0}/s bar.powerstored = Skladišćeno: {0}/{1} bar.poweramount = Količina: {0} diff --git a/core/assets/bundles/bundle_sv.properties b/core/assets/bundles/bundle_sv.properties index f26cd10739..74d631f20a 100644 --- a/core/assets/bundles/bundle_sv.properties +++ b/core/assets/bundles/bundle_sv.properties @@ -753,6 +753,7 @@ sectors.stored = Lagrade: sectors.resume = Återuppta sectors.launch = Skjuta upp sectors.select = Select +sectors.launchselect = Select Launch Destination sectors.nonelaunch = [lightgray]none (sun) sectors.rename = Byt namn på sektor sectors.enemybase = [scarlet]Enemy Base @@ -1060,6 +1061,7 @@ ability.stat.buildtime = [stat]{0} sec[lightgray] build time bar.onlycoredeposit = Only Core Depositing Allowed bar.drilltierreq = Bättre Borr Krävs +bar.nobatterypower = Insufficieny Battery Power bar.noresources = Missing Resources bar.corereq = Core Base Required bar.corefloor = Core Zone Tile Required @@ -1068,6 +1070,7 @@ bar.drillspeed = Drill Speed: {0}/s bar.pumpspeed = Pump Speed: {0}/s bar.efficiency = Effektivitet: {0}% bar.boost = Boost: +{0}% +bar.powerbuffer = Battery Power: {0}/{1} bar.powerbalance = Power: {0}/s bar.powerstored = Stored: {0}/{1} bar.poweramount = Power: {0} diff --git a/core/assets/bundles/bundle_th.properties b/core/assets/bundles/bundle_th.properties index 6fee96457e..52d53ba417 100644 --- a/core/assets/bundles/bundle_th.properties +++ b/core/assets/bundles/bundle_th.properties @@ -763,6 +763,7 @@ sectors.stored = คลังไอเท็ม: sectors.resume = ไปต่อ sectors.launch = ลงจอด sectors.select = เลือก +sectors.launchselect = Select Launch Destination sectors.nonelaunch = [lightgray]ไม่มี (ดวงอาทิตย์) sectors.rename = เปลี่ยนชื่อเซ็กเตอร์ sectors.enemybase = [scarlet]ฐานทัพศัตรู @@ -1074,6 +1075,7 @@ ability.stat.buildtime = [stat]{0} วิ[lightgray] ความในการ bar.onlycoredeposit = ขนย้ายทรัพยากรลงแกนกลางได้เท่านั้น bar.drilltierreq = ต้องมีเครื่องขุดที่ดีกว่านี้ +bar.nobatterypower = Insufficieny Battery Power bar.noresources = ขาดทรัพยากร bar.corereq = ต้องวางบนแกนกลาง bar.corefloor = ต้องวางบนช่องโซนแกนกลาง @@ -1082,6 +1084,7 @@ bar.drillspeed = ความเร็วการขุด: {0}/วิ bar.pumpspeed = ความเร็วการปั้ม: {0}/วิ bar.efficiency = ประสิทธิภาพ: {0}% bar.boost = การเร่ง: +{0}% +bar.powerbuffer = Battery Power: {0}/{1} bar.powerbalance = พลังงาน: {0}/วิ bar.powerstored = สะสมไว้: {0}/{1} bar.poweramount = พลังงาน: {0} diff --git a/core/assets/bundles/bundle_tk.properties b/core/assets/bundles/bundle_tk.properties index 6b931386ac..ea2cec636e 100644 --- a/core/assets/bundles/bundle_tk.properties +++ b/core/assets/bundles/bundle_tk.properties @@ -753,6 +753,7 @@ sectors.stored = Stored: sectors.resume = Resume sectors.launch = Launch sectors.select = Select +sectors.launchselect = Select Launch Destination sectors.nonelaunch = [lightgray]none (sun) sectors.rename = Rename Sector sectors.enemybase = [scarlet]Enemy Base @@ -1060,6 +1061,7 @@ ability.stat.buildtime = [stat]{0} sec[lightgray] build time bar.onlycoredeposit = Only Core Depositing Allowed bar.drilltierreq = Better Drill Required +bar.nobatterypower = Insufficieny Battery Power bar.noresources = Missing Resources bar.corereq = Core Base Required bar.corefloor = Core Zone Tile Required @@ -1068,6 +1070,7 @@ bar.drillspeed = Drill Speed: {0}/s bar.pumpspeed = Pump Speed: {0}/s bar.efficiency = Efficiency: {0}% bar.boost = Boost: +{0}% +bar.powerbuffer = Battery Power: {0}/{1} bar.powerbalance = Power: {0} bar.powerstored = Stored: {0}/{1} bar.poweramount = Power: {0} diff --git a/core/assets/bundles/bundle_tr.properties b/core/assets/bundles/bundle_tr.properties index ed12b152c5..5f41c6e7f6 100644 --- a/core/assets/bundles/bundle_tr.properties +++ b/core/assets/bundles/bundle_tr.properties @@ -761,6 +761,7 @@ sectors.stored = Depolanan: sectors.resume = Devam Et sectors.launch = Fırlat sectors.select = Seç +sectors.launchselect = Select Launch Destination sectors.nonelaunch = [lightgray]yok (güneş) sectors.rename = Sektörü Yeniden Adlandır sectors.enemybase = [scarlet]Düşman Üs @@ -1069,6 +1070,7 @@ ability.stat.buildtime = [stat]{0} sn[lightgray] inşa süresi bar.onlycoredeposit = Sadece Merkeze Aktarım Mümkün bar.drilltierreq = Daha Güçlü Matkap Gerekli +bar.nobatterypower = Insufficieny Battery Power bar.noresources = Kaynak Yetersiz bar.corereq = Merkez Tabanı Gerekli bar.corefloor = Merkez Alan Zemini Gerekli @@ -1077,6 +1079,7 @@ bar.drillspeed = Matkap Hızı: {0}/s bar.pumpspeed = Pompa Hızı: {0}/s bar.efficiency = Verim: {0}% bar.boost = Hızlanış: +{0}% +bar.powerbuffer = Battery Power: {0}/{1} bar.powerbalance = Enerji: {0}/sn bar.powerstored = Depolanan: {0}/{1} bar.poweramount = Enerji: {0} diff --git a/core/assets/bundles/bundle_uk_UA.properties b/core/assets/bundles/bundle_uk_UA.properties index 3f01330580..97c813a2cf 100644 --- a/core/assets/bundles/bundle_uk_UA.properties +++ b/core/assets/bundles/bundle_uk_UA.properties @@ -770,6 +770,7 @@ sectors.stored = Зберігає: sectors.resume = Продовжити sectors.launch = Запустити sectors.select = Вибрати +sectors.launchselect = Select Launch Destination sectors.nonelaunch = [lightgray]нічого (сонце) sectors.rename = Перейменування сектору sectors.enemybase = [scarlet]Ворожа база @@ -1080,6 +1081,7 @@ ability.stat.buildtime = [lightgray]Час побудови: [stat]{0} за се bar.onlycoredeposit = Передача предметів дозволена лише до ядра bar.drilltierreq = Потрібен ліпший бур +bar.nobatterypower = Insufficieny Battery Power bar.noresources = Бракує ресурсів bar.corereq = Необхідне основне ядро bar.corefloor = Необхідні плитки зони ядра @@ -1088,6 +1090,7 @@ bar.drillspeed = Швидкість буріння: {0} за сек. bar.pumpspeed = Швидкість викачування: {0} за сек. bar.efficiency = Ефективність: {0}% bar.boost = Підсилення: +{0}% +bar.powerbuffer = Battery Power: {0}/{1} bar.powerbalance = Енергія: {0} за сек. bar.powerstored = Зберігає: {0}/{1} bar.poweramount = Енергія: {0} diff --git a/core/assets/bundles/bundle_vi.properties b/core/assets/bundles/bundle_vi.properties index 61d04879e6..09ab6cbb4c 100644 --- a/core/assets/bundles/bundle_vi.properties +++ b/core/assets/bundles/bundle_vi.properties @@ -776,6 +776,7 @@ sectors.stored = Lưu trữ: sectors.resume = Tiếp tục sectors.launch = Phóng sectors.select = Chọn +sectors.launchselect = Select Launch Destination sectors.nonelaunch = [lightgray]không có (mặt trời) sectors.rename = Đổi tên khu vực sectors.enemybase = [scarlet]Căn cứ địch @@ -1090,6 +1091,7 @@ ability.stat.buildtime = thời gian xây [stat]{0} giây[lightgray] bar.onlycoredeposit = Chỉ được phép đưa vào lõi bar.drilltierreq = Cần máy khoan tốt hơn +bar.nobatterypower = Insufficieny Battery Power bar.noresources = Thiếu tài nguyên bar.corereq = Yêu cầu lõi cơ bản bar.corefloor = Yêu cầu ô nền lõi @@ -1098,6 +1100,7 @@ bar.drillspeed = Tốc độ khoan: {0}/giây bar.pumpspeed = Tốc độ bơm: {0}/giây bar.efficiency = Hiệu suất: {0}% bar.boost = Tăng tốc: +{0}% +bar.powerbuffer = Battery Power: {0}/{1} bar.powerbalance = Năng lượng: {0}/giây bar.powerstored = Lưu trữ: {0}/{1} bar.poweramount = Năng lượng: {0} diff --git a/core/assets/bundles/bundle_zh_CN.properties b/core/assets/bundles/bundle_zh_CN.properties index 87330afaf7..6858fbc7e3 100644 --- a/core/assets/bundles/bundle_zh_CN.properties +++ b/core/assets/bundles/bundle_zh_CN.properties @@ -771,6 +771,7 @@ sectors.stored = 贮存: sectors.resume = 继续 sectors.launch = 发射 sectors.select = 选择 +sectors.launchselect = Select Launch Destination sectors.nonelaunch = [lightgray]无(自动销毁) sectors.rename = 重命名区块 sectors.enemybase = [scarlet]敌方基地 @@ -1082,6 +1083,7 @@ ability.stat.buildtime = [stat]{0} 秒[lightgray] 建造时间 bar.onlycoredeposit = 仅核心可丢入资源 bar.drilltierreq = 需要更高级的钻头 +bar.nobatterypower = Insufficieny Battery Power bar.noresources = 资源不足 bar.corereq = 需要核心基座 bar.corefloor = 需要核心地板 @@ -1090,6 +1092,7 @@ bar.drillspeed = 挖掘速度:{0}/秒 bar.pumpspeed = 泵送速度:{0}/秒 bar.efficiency = 效率:{0}% bar.boost = 超速:+{0}% +bar.powerbuffer = Battery Power: {0}/{1} bar.powerbalance = 电力:{0}/秒 bar.powerstored = 电力储存:{0}/{1} bar.poweramount = 电力:{0} diff --git a/core/assets/bundles/bundle_zh_TW.properties b/core/assets/bundles/bundle_zh_TW.properties index 9f1ee4db85..7a2fdd19d9 100644 --- a/core/assets/bundles/bundle_zh_TW.properties +++ b/core/assets/bundles/bundle_zh_TW.properties @@ -767,6 +767,7 @@ sectors.stored = 儲存: sectors.resume = 繼續 sectors.launch = 發射 sectors.select = 選取 +sectors.launchselect = Select Launch Destination sectors.nonelaunch = [lightgray]無(太陽) sectors.rename = 重新命名區域 sectors.enemybase = [scarlet]敵方基地 @@ -1077,6 +1078,7 @@ ability.stat.buildtime = [stat]{0} sec[lightgray] build time bar.onlycoredeposit = 僅允許向核心放置物品 bar.drilltierreq = 需要更好的鑽頭 +bar.nobatterypower = Insufficieny Battery Power bar.noresources = 缺少資源 bar.corereq = 需由核心升級 bar.corefloor = 需要核心地塊 @@ -1085,6 +1087,7 @@ bar.drillspeed = 鑽頭速度:{0}/秒 bar.pumpspeed = 液體泵送速度:{0}/秒 bar.efficiency = 效率:{0}% bar.boost = 速度加成:+{0}% +bar.powerbuffer = Battery Power: {0}/{1} bar.powerbalance = 能量變化:{0} bar.powerstored = 能量存量:{0}/{1} bar.poweramount = 能量:{0} From 65aae06f013d0821964b96ae8d02b4de6b6e19d1 Mon Sep 17 00:00:00 2001 From: PolarStar <107398572+PoIarStar@users.noreply.github.com> Date: Tue, 28 Jan 2025 19:32:11 +0300 Subject: [PATCH 104/460] FH host replacement (#10443) --- servers_v7.json | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/servers_v7.json b/servers_v7.json index 8da07d0128..553bb16515 100644 --- a/servers_v7.json +++ b/servers_v7.json @@ -284,7 +284,15 @@ "frost-heaven.ru", "frost-heaven.ru:6568", "91.200.150.116", - "frost-heaven.ru:6570" + "frost-heaven.ru:6570", + "mindustry.frost-heaven.ru:6567", + "mindustry.frost-heaven.ru:6568", + "mindustry.frost-heaven.ru:6569", + "mindustry.frost-heaven.ru:6570", + "mindustry.frost-heaven.ru:6571", + "mindustry.frost-heaven.ru:6597", + "mindustry.frost-heaven.ru:6598", + "mindustry.frost-heaven.ru:6599" ] }, { From 6c31853c11a8de962028b96d8f347f3e8101d5e9 Mon Sep 17 00:00:00 2001 From: Anuken Date: Tue, 28 Jan 2025 21:30:38 -0500 Subject: [PATCH 105/460] WIP Interplanetary Accelerator animation --- .../sprites/effects/select-arrow-small.png | Bin 0 -> 193 bytes core/assets/bundles/bundle.properties | 4 +- core/assets/shaders/blockbuild.frag | 8 +- core/src/mindustry/content/Fx.java | 6 + core/src/mindustry/core/Control.java | 4 +- core/src/mindustry/core/Logic.java | 4 +- core/src/mindustry/core/Renderer.java | 47 ++- .../mindustry/ui/dialogs/PlanetDialog.java | 2 +- .../world/blocks/LaunchAnimator.java | 19 +- .../world/blocks/campaign/Accelerator.java | 347 ++++++++++++------ .../world/blocks/storage/CoreBlock.java | 24 +- 11 files changed, 292 insertions(+), 173 deletions(-) create mode 100644 core/assets-raw/sprites/effects/select-arrow-small.png diff --git a/core/assets-raw/sprites/effects/select-arrow-small.png b/core/assets-raw/sprites/effects/select-arrow-small.png new file mode 100644 index 0000000000000000000000000000000000000000..6d021c0ddb05e0a1e6ae75b124f13415226340f2 GIT binary patch literal 193 zcmeAS@N?(olHy`uVBq!ia0y~yV6X;Z4rT@hhEKnl8W|WE7>k44ofy`glX=O&z`z;c z6XMFi!0`Y7e+CAI;$zK)3=9m+B|(0{|Nk>wKgH|Fz`zjh>EamT(fRhYq7Z`u5A%kp z|Lvt(8{fXr5{P*$>@2 (1.0-u_progress) * (center.x)){ gl_FragColor = color; }else if((dst + 2.0 > (1.0-u_progress) * (center.x)) && color.a > 0.1){ - gl_FragColor = v_color; + gl_FragColor = blend(color, v_color); }else{ gl_FragColor = vec4(0.0); } diff --git a/core/src/mindustry/content/Fx.java b/core/src/mindustry/content/Fx.java index 16e42a0fbf..c8a44b0e12 100644 --- a/core/src/mindustry/content/Fx.java +++ b/core/src/mindustry/content/Fx.java @@ -2464,6 +2464,12 @@ public class Fx{ }); }), + launchAccelerator = new Effect(22, e -> { + color(Pal.accent); + stroke(e.fout() * 2f); + Lines.circle(e.x, e.y, 4f + e.finpow() * 160f); + }), + launch = new Effect(28, e -> { color(Pal.command); stroke(e.fout() * 2f); diff --git a/core/src/mindustry/core/Control.java b/core/src/mindustry/core/Control.java index da36e8009a..58f7fa65e3 100644 --- a/core/src/mindustry/core/Control.java +++ b/core/src/mindustry/core/Control.java @@ -199,9 +199,9 @@ public class Control implements ApplicationListener, Loadable{ float coreDelay = 0f; if(!settings.getBool("skipcoreanimation") && !state.rules.pvp){ - coreDelay = core.landDuration(); + coreDelay = core.launchDuration(); //delay player respawn so animation can play. - player.deathTimer = Player.deathDelay - core.landDuration(); + player.deathTimer = Player.deathDelay - core.launchDuration(); //TODO this sounds pretty bad due to conflict if(settings.getInt("musicvol") > 0){ //TODO what to do if another core with different music is already playing? diff --git a/core/src/mindustry/core/Logic.java b/core/src/mindustry/core/Logic.java index 4b4f0be7d3..ed9271e519 100644 --- a/core/src/mindustry/core/Logic.java +++ b/core/src/mindustry/core/Logic.java @@ -405,7 +405,9 @@ public class Logic implements ApplicationListener{ @Override public void dispose(){ //save the settings before quitting - netServer.admins.forceSave(); + if(netServer != null){ + netServer.admins.forceSave(); + } Core.settings.manualSave(); } diff --git a/core/src/mindustry/core/Renderer.java b/core/src/mindustry/core/Renderer.java index b1f0787749..47acb4c454 100644 --- a/core/src/mindustry/core/Renderer.java +++ b/core/src/mindustry/core/Renderer.java @@ -50,7 +50,7 @@ public class Renderer implements ApplicationListener{ public TextureRegion[][] fluidFrames; //currently landing core, null if there are no cores or it has finished landing. - private @Nullable LaunchAnimator landCore; + private @Nullable LaunchAnimator launchAnimator; private Color clearColor = new Color(0f, 0f, 0f, 1f); private float //target camera scale that is lerp-ed to @@ -59,8 +59,6 @@ public class Renderer implements ApplicationListener{ camerascale = targetscale, //starts at coreLandDuration, ends at 0. if positive, core is landing. landTime, - //timer for core landing particles - landPTimer, //intensity for screen shake shakeIntensity, //reduction rate of screen shake @@ -170,21 +168,21 @@ public class Renderer implements ApplicationListener{ pixelate = settings.getBool("pixelate"); //don't bother drawing landing animation if core is null - if(landCore == null) landTime = 0f; + if(launchAnimator == null) landTime = 0f; if(landTime > 0){ - if(!state.isPaused()) landCore.updateLaunching(); + if(!state.isPaused()) launchAnimator.updateLaunch(); weatherAlpha = 0f; - camerascale = landCore.zoomLaunching(); + camerascale = launchAnimator.zoomLaunch(); if(!state.isPaused()) landTime -= Time.delta; }else{ weatherAlpha = Mathf.lerpDelta(weatherAlpha, 1f, 0.08f); } - if(landCore != null && landTime <= 0f){ - landCore.endLaunch(); - landCore = null; + if(launchAnimator != null && landTime <= 0f){ + launchAnimator.endLaunch(); + launchAnimator = null; } camera.width = graphics.getWidth() / camerascale; @@ -376,9 +374,14 @@ public class Renderer implements ApplicationListener{ Draw.draw(Layer.overlayUI, overlays::drawTop); if(state.rules.fog) Draw.draw(Layer.fogOfWar, fog::drawFog); Draw.draw(Layer.space, () -> { - if(landCore == null || landTime <= 0f) return; - landCore.drawLanding(); + if(launchAnimator == null || landTime <= 0f) return; + launchAnimator.drawLaunch(); }); + if(launchAnimator != null){ + Draw.z(Layer.space); + launchAnimator.drawLaunchGlobalZ(); + Draw.reset(); + } Events.fire(Trigger.drawOver); blocks.drawBlocks(); @@ -507,27 +510,19 @@ public class Renderer implements ApplicationListener{ } public float getLandTimeIn(){ - if(landCore == null) return 0f; - float fin = landTime / landCore.landDuration(); + if(launchAnimator == null) return 0f; + float fin = landTime / launchAnimator.launchDuration(); if(!launching) fin = 1f - fin; return fin; } - public float getLandPTimer(){ - return landPTimer; - } - - public void setLandPTimer(float landPTimer){ - this.landPTimer = landPTimer; - } - public void showLanding(LaunchAnimator landCore){ - this.landCore = landCore; + this.launchAnimator = landCore; launching = false; - landTime = landCore.landDuration(); + landTime = landCore.launchDuration(); landCore.beginLaunch(false); - camerascale = landCore.zoomLaunching(); + camerascale = landCore.zoomLaunch(); } public void showLaunch(LaunchAnimator landCore){ @@ -535,9 +530,9 @@ public class Renderer implements ApplicationListener{ control.input.planConfig.hide(); control.input.inv.hide(); - this.landCore = landCore; + this.launchAnimator = landCore; launching = true; - landTime = landCore.landDuration(); + landTime = landCore.launchDuration(); Music music = landCore.launchMusic(); music.stop(); diff --git a/core/src/mindustry/ui/dialogs/PlanetDialog.java b/core/src/mindustry/ui/dialogs/PlanetDialog.java index e28459c31c..a7ec975735 100644 --- a/core/src/mindustry/ui/dialogs/PlanetDialog.java +++ b/core/src/mindustry/ui/dialogs/PlanetDialog.java @@ -1287,7 +1287,7 @@ public class PlanetDialog extends BaseDialog implements PlanetInterfaceRenderer{ Runnable doLaunch = () -> { renderer.showLaunch(core); //run with less delay, as the loading animation is delayed by several frames - Time.runTask(core.landDuration() - 8f, () -> control.playSector(from, sector)); + Time.runTask(core.launchDuration() - 8f, () -> control.playSector(from, sector)); }; //load launchFrom sector right before launching so animation is correct diff --git a/core/src/mindustry/world/blocks/LaunchAnimator.java b/core/src/mindustry/world/blocks/LaunchAnimator.java index 4bba63a5f4..62a3366ff3 100644 --- a/core/src/mindustry/world/blocks/LaunchAnimator.java +++ b/core/src/mindustry/world/blocks/LaunchAnimator.java @@ -1,22 +1,29 @@ package mindustry.world.blocks; import arc.audio.*; +import mindustry.gen.*; public interface LaunchAnimator{ - void drawLanding(); + void drawLaunch(); + + default void drawLaunchGlobalZ(){} void beginLaunch(boolean launching); void endLaunch(); - void updateLaunching(); + void updateLaunch(); - float landDuration(); + float launchDuration(); - Music landMusic(); + default Music landMusic(){ + return Musics.land; + } - Music launchMusic(); + default Music launchMusic(){ + return Musics.launch; + } - float zoomLaunching(); + float zoomLaunch(); } diff --git a/core/src/mindustry/world/blocks/campaign/Accelerator.java b/core/src/mindustry/world/blocks/campaign/Accelerator.java index 9968fdc874..74292dc526 100644 --- a/core/src/mindustry/world/blocks/campaign/Accelerator.java +++ b/core/src/mindustry/world/blocks/campaign/Accelerator.java @@ -7,7 +7,6 @@ import arc.audio.*; import arc.graphics.*; import arc.graphics.g2d.*; import arc.math.*; -import arc.math.geom.*; import arc.scene.actions.*; import arc.scene.event.*; import arc.scene.ui.*; @@ -15,7 +14,6 @@ import arc.scene.ui.layout.*; import arc.struct.*; import arc.util.*; import arc.util.io.*; -import mindustry.*; import mindustry.annotations.Annotations.*; import mindustry.content.*; import mindustry.core.*; @@ -33,7 +31,8 @@ import mindustry.world.blocks.storage.*; import static mindustry.Vars.*; public class Accelerator extends Block{ - public @Load("launch-arrow") TextureRegion arrowRegion; + public @Load(value = "@-launch-arrow", fallback = "launch-arrow") TextureRegion arrowRegion; + public @Load("select-arrow-small") TextureRegion selectArrowRegion; /** Core block that is launched. Should match the starting core of the planet being launched to. */ public Block launchBlock = Blocks.coreNucleus; @@ -41,9 +40,26 @@ public class Accelerator extends Block{ /** Override for planets that this block can launch to. If null, the planet's launch candidates are used. */ public @Nullable Seq launchCandidates; + //TODO: launching needs audio! + public Music launchMusic = Musics.coreLaunch; - public float launchDuration = 160f; + public float launchDuration = 120f; + public float chargeDuration = 220f; public float buildDuration = 120f; + public Interp landZoomInterp = Interp.pow4In, chargeZoomInterp = Interp.pow4In; + public float landZoomFrom = 0.02f, landZoomTo = 4f, chargeZoomTo = 5f; + + public int chargeRings = 4; + public float ringRadBase = 60f, ringRadSpacing = 25f, ringRadPow = 1.6f, ringStroke = 3f, ringSpeedup = 1.4f, chargeRingMerge = 2f, ringArrowRad = 3f; + public float ringHandleTilt = 0.8f, ringHandleLen = 30f; + public Color ringColor = Pal.accent; + + public int launchLightning = 20; + public Color lightningColor = Pal.accent; + public float lightningDamage = 40; + public float lightningOffset = 24f; + public int lightningLengthMin = 5, lightningLengthMax = 25; + public double lightningLaunchChance = 0.8; protected int[] capacities = {}; @@ -55,6 +71,9 @@ public class Accelerator extends Block{ hasPower = true; itemCapacity = 8000; configurable = true; + emitLight = true; + lightRadius = 70f; + lightColor = Pal.accent; } @Override @@ -90,7 +109,8 @@ public class Accelerator extends Block{ public class AcceleratorBuild extends Building implements LaunchAnimator{ public float heat, statusLerp; public float progress; - public float time; + public float time, launchHeat; + public boolean launching; protected float cloudSeed; @@ -100,7 +120,13 @@ public class Accelerator extends Block{ heat = Mathf.lerpDelta(heat, efficiency, 0.05f); statusLerp = Mathf.lerpDelta(statusLerp, power.status, 0.05f); - time += Time.delta * efficiency; + if(!launching){ + time += Time.delta * efficiency; + }else{ + time = Mathf.slerpDelta(time, 0f, 0.4f); + } + + launchHeat = Mathf.lerpDelta(launchHeat, launching ? 1f : 0f, 0.1f); if(efficiency >= 0f){ progress += Time.delta * efficiency / buildDuration; @@ -128,56 +154,63 @@ public class Accelerator extends Block{ } { - Drawf.shadow(x, y, launchBlock.size * tilesize * 2f, progress); - Draw.draw(Layer.blockBuilding, () -> { - Draw.color(Pal.accent, heat); + if(launching){ + Draw.reset(); + Draw.rect(launchBlock.fullIcon, x, y); + }else{ + Drawf.shadow(x, y, launchBlock.size * tilesize * 2f, progress); + Draw.draw(Layer.blockBuilding, () -> { + Draw.color(Pal.accent, heat); - for(TextureRegion region : launchBlock.getGeneratedIcons()){ - Shaders.blockbuild.region = region; - Shaders.blockbuild.time = time; - Shaders.blockbuild.progress = progress; + for(TextureRegion region : launchBlock.getGeneratedIcons()){ + Shaders.blockbuild.region = region; + Shaders.blockbuild.time = time; + Shaders.blockbuild.progress = progress; - Draw.rect(region, x, y); - Draw.flush(); - } + Draw.rect(region, x, y); + Draw.flush(); + } - Draw.color(); - }); + Draw.color(); + }); + } - //TODO: build line? - //Draw.z(Layer.blockBuilding + 1); - //Draw.color(Pal.accent, heat); - - //Lines.lineAngleCenter(x + Mathf.sin(time, 10f, Vars.tilesize / 2f * recipe.size + 1f), y, 90, recipe.size * Vars.tilesize + 1f); Draw.reset(); } if(heat < 0.0001f) return; - float rad = size * tilesize / 2f * 0.74f; + float rad = size * tilesize / 2f * 0.74f * Mathf.lerp(1f, 1.3f, launchHeat); float scl = 2f; Draw.z(Layer.bullet - 0.0001f); Lines.stroke(1.75f * heat, Pal.accent); - Lines.square(x, y, rad * 1.22f, 45f); + Lines.square(x, y, rad * 1.22f, Mathf.lerp(45f, 0f, launchHeat)); + + //TODO: lock time when launching Lines.stroke(3f * heat, Pal.accent); - Lines.square(x, y, rad, Time.time / scl); - Lines.square(x, y, rad, -Time.time / scl); + Lines.square(x, y, rad * Mathf.lerp(1f, 1.3f, launchHeat), 45f + time / scl); + Lines.square(x, y, rad * Mathf.lerp(1f, 1.8f, launchHeat), Mathf.lerp(45f, 0f, launchHeat) - time / scl); Draw.color(team.color); Draw.alpha(Mathf.clamp(heat * 3f)); for(int i = 0; i < 4; i++){ - float rot = i*90f + 45f + (-Time.time /3f)%360f; - float length = 26f * heat; + float rot = i*90f + 45f + (-time/3f)%360f; + float length = 26f * heat * Mathf.lerp(1f, 1.5f, launchHeat); Draw.rect(arrowRegion, x + Angles.trnsx(rot, length), y + Angles.trnsy(rot, length), rot + 180f); } Draw.reset(); } + @Override + public void drawLight(){ + Drawf.light(x, y, lightRadius, lightColor, launchHeat); + } + public boolean canLaunch(){ return isValid() && state.isCampaign() && efficiency > 0f && power.graph.getBatteryStored() >= powerBufferRequirement-0.00001f && progress >= 1f; } @@ -204,8 +237,6 @@ public class Accelerator extends Block{ ui.planet.showPlanetLaunch(state.rules.sector, launchCandidates == null ? state.rules.sector.planet.launchCandidates : launchCandidates, sector -> { if(canLaunch()){ - //TODO: animation! - consume(); power.graph.useBatteries(powerBufferRequirement); progress = 0f; @@ -214,7 +245,7 @@ public class Accelerator extends Block{ renderer.showLaunch(this); - Time.runTask(core.landDuration() - 8f, () -> { + Time.runTask(core.launchDuration() - 8f, () -> { //unlock right before launch sector.planet.unlockedOnLand.each(UnlockableContent::unlock); @@ -260,34 +291,9 @@ public class Accelerator extends Block{ } //launch animator stuff: - @Override - public float zoomLaunching(){ - CoreBlock core = (CoreBlock)launchBlock; - Core.camera.position.set(this); - return core.landZoomInterp.apply(Scl.scl(core.landZoomFrom), Scl.scl(core.landZoomTo), renderer.getLandTimeIn()); - } - - @Override - public void updateLaunching(){ - float in = renderer.getLandTimeIn() * landDuration(); - float tsize = Mathf.sample(CoreBlock.thrusterSizes, (in + 35f) / landDuration()); - - renderer.setLandPTimer(renderer.getLandPTimer() + tsize * Time.delta); - if(renderer.getLandTime() >= 1f){ - tile.getLinkedTiles(t -> { - if(Mathf.chance(0.4f)){ - Fx.coreLandDust.at(t.worldx(), t.worldy(), angleTo(t.worldx(), t.worldy()) + Mathf.range(30f), Tmp.c1.set(t.floor().mapColor).mul(1.5f + Mathf.range(0.15f))); - } - }); - - renderer.setLandPTimer(0f); - } - } - - @Override - public float landDuration(){ - return launchDuration; + public float launchDuration(){ + return launchDuration + chargeDuration; } @Override @@ -303,67 +309,112 @@ public class Accelerator extends Block{ @Override public void beginLaunch(boolean launching){ + if(!launching) return; + + this.launching = true; + Fx.coreLaunchConstruct.at(x, y, launchBlock.size); + cloudSeed = Mathf.random(1f); - if(launching){ + float margin = 30f; + + Image image = new Image(); + image.color.a = 0f; + image.touchable = Touchable.disabled; + image.setFillParent(true); + image.actions(Actions.delay((launchDuration() - margin) / 60f), Actions.fadeIn(margin / 60f, Interp.pow2In), Actions.delay(6f / 60f), Actions.remove()); + image.update(() -> { + image.toFront(); + ui.loadfrag.toFront(); + if(state.isMenu()){ + image.remove(); + } + }); + Core.scene.add(image); + + Time.run(chargeDuration, () -> { Fx.coreLaunchConstruct.at(x, y, launchBlock.size); + Fx.launchAccelerator.at(x, y); + Effect.shake(10f, 14f, this); + + for(int i = 0; i < launchLightning; i++){ + float a = Mathf.random(360f); + Lightning.create(team, lightningColor, lightningDamage, x + Angles.trnsx(a, lightningOffset), y + Angles.trnsy(a, lightningOffset), a, Mathf.random(lightningLengthMin, lightningLengthMax)); + } + + float spacing = 12f; + for(int i = 0; i < 13; i++){ + int fi = i; + Time.run(i * 1.1f, () -> { + float radius = block.size/2f + 1 + spacing * fi; + int rays = Mathf.ceil(radius * Mathf.PI * 2f / 6f); + for(int r = 0; r < rays; r++){ + if(Mathf.chance(0.7f - fi * 0.02f)){ + float angle = r * 360f / (float)rays; + float ox = Angles.trnsx(angle, radius), oy = Angles.trnsy(angle, radius); + Tile t = world.tileWorld(x + ox, y + oy); + if(t != null){ + Fx.coreLandDust.at(t.worldx(), t.worldy(), angle + Mathf.range(30f), Tmp.c1.set(t.floor().mapColor).mul(1.7f + Mathf.range(0.15f))); + } + } + } + }); + } + + + }); + } + + @Override + public void endLaunch(){ + launching = false; + } + + @Override + public float zoomLaunch(){ + float rawTime = launchDuration() - renderer.getLandTime(); + + Core.camera.position.set(this); + + if(rawTime < chargeDuration){ + float fin = rawTime / chargeDuration; + + return chargeZoomInterp.apply(Scl.scl(landZoomTo), Scl.scl(chargeZoomTo), fin); + }else{ + float rawFin = renderer.getLandTimeIn(); + float fin = 1f - Mathf.clamp((1f - rawFin) - (chargeDuration / (launchDuration + chargeDuration))) / (1f - (chargeDuration / (launchDuration + chargeDuration))); + + return landZoomInterp.apply(Scl.scl(landZoomFrom), Scl.scl(landZoomTo), fin); } + } - if(!headless){ - // Add fade-in and fade-out foreground when landing or launching. - if(renderer.isLaunching()){ - float margin = 30f; + @Override + public void updateLaunch(){ + float in = renderer.getLandTimeIn() * launchDuration(); + float tsize = Mathf.sample(CoreBlock.thrusterSizes, (in + 35f) / launchDuration()); - Image image = new Image(); - image.color.a = 0f; - image.touchable = Touchable.disabled; - image.setFillParent(true); - image.actions(Actions.delay((landDuration() - margin) / 60f), Actions.fadeIn(margin / 60f, Interp.pow2In), Actions.delay(6f / 60f), Actions.remove()); - image.update(() -> { - image.toFront(); - ui.loadfrag.toFront(); - if(state.isMenu()){ - image.remove(); - } - }); - Core.scene.add(image); - }else{ - Image image = new Image(); - image.color.a = 1f; - image.touchable = Touchable.disabled; - image.setFillParent(true); - image.actions(Actions.fadeOut(35f / 60f), Actions.remove()); - image.update(() -> { - image.toFront(); - ui.loadfrag.toFront(); - if(state.isMenu()){ - image.remove(); - } - }); - Core.scene.add(image); + float rawFin = renderer.getLandTimeIn(); + float chargeFin = 1f - Mathf.clamp((1f - rawFin) / (chargeDuration / (launchDuration + chargeDuration))); + float chargeFout = 1f - chargeFin; - Time.run(landDuration(), () -> { - CoreBlock core = (CoreBlock)launchBlock; - core.launchEffect.at(this); - Effect.shake(5f, 5f, this); - - if(state.isCampaign() && Vars.showSectorLandInfo && (state.rules.sector.preset == null || state.rules.sector.preset.showSectorLandInfo)){ - ui.announce("[accent]" + state.rules.sector.name() + "\n" + - (state.rules.sector.info.resources.any() ? "[lightgray]" + Core.bundle.get("sectors.resources") + "[white] " + - state.rules.sector.info.resources.toString(" ", UnlockableContent::emoji) : ""), 5); - } - }); + if(in > launchDuration){ + if(Mathf.chanceDelta(lightningLaunchChance * Interp.pow3In.apply(chargeFout))){ + float a = Mathf.random(360f); + Lightning.create(team, lightningColor, lightningDamage, x + Angles.trnsx(a, lightningOffset), y + Angles.trnsy(a, lightningOffset), a, Mathf.random(lightningLengthMin, lightningLengthMax)); } } } @Override - public void endLaunch(){} - - @Override - public void drawLanding(){ + public void drawLaunch(){ var clouds = Core.assets.get("sprites/clouds.png", Texture.class); - float fin = renderer.getLandTimeIn(); + float rawFin = renderer.getLandTimeIn(); + float rawTime = launchDuration() - renderer.getLandTime(); + float fin = 1f - Mathf.clamp((1f - rawFin) - (chargeDuration / (launchDuration + chargeDuration))) / (1f - (chargeDuration / (launchDuration + chargeDuration))); + + float chargeFin = 1f - Mathf.clamp((1f - rawFin) / (chargeDuration / (launchDuration + chargeDuration))); + float chargeFout = 1f - chargeFin; + float cameraScl = renderer.getDisplayScale(); float fout = 1f - fin; @@ -378,7 +429,9 @@ public class Accelerator extends Block{ }); Draw.color(); - drawLanding(x, y); + if(rawTime >= chargeDuration){ + drawLanding(fin, x, y); + } Draw.color(); Draw.mixcol(Color.white, Interp.pow5In.apply(fout)); @@ -412,11 +465,73 @@ public class Accelerator extends Block{ } } - public void drawLanding(float x, float y){ - float fin = renderer.getLandTimeIn(); + @Override + public void drawLaunchGlobalZ(){ + float rawFin = renderer.getLandTimeIn(); + + float chargeFin = 1f - Mathf.clamp((1f - rawFin) / (chargeDuration / (launchDuration + chargeDuration))); + float fin = 1f - Mathf.clamp((1f - rawFin) - (chargeDuration / (launchDuration + chargeDuration))) / (1f - (chargeDuration / (launchDuration + chargeDuration))); + float fout = 1f - fin; + float chargeFout = 1f - chargeFin; + + //fade out rings during launch. + chargeFout = Mathf.clamp(chargeFout - fout * 2f); + + float + spacing = 1f / (chargeRings + chargeRingMerge); + + for(int i = 0; i < chargeRings; i++){ + float cfin = Mathf.clamp((chargeFout*ringSpeedup - spacing * i) / (spacing * (1f + chargeRingMerge))); + if(cfin > 0){ + drawRing(ringRadBase + ringRadSpacing * Mathf.pow(i, ringRadPow), cfin); + } + } + } + + protected void drawRing(float radius, float fin){ + Draw.z(Layer.effect); + + float fout = 1f - fin; + float rotate = Interp.pow4In.apply(fout) * 90f; + float rad = radius + 20f * Interp.pow4In.apply(fout); + + Lines.stroke(ringStroke * fin, ringColor); + + Draw.color(Pal.command, ringColor, fin); + + //handles + for(int i = 0; i < 4; i++){ + float angle = i * 90f + 45f + rotate; + Lines.beginLine(); + Lines.linePoint(Tmp.v1.trns(angle - ringHandleLen, rad * ringHandleTilt).add(x, y)); + Lines.linePoint(Tmp.v2.trns(angle, rad).add(x, y)); + Lines.linePoint(Tmp.v3.trns(angle + ringHandleLen, rad * ringHandleTilt).add(x, y)); + Lines.endLine(false); + + } + + Draw.scl(fin); + + //selection triangles + for(int i = 0; i < 4; i++){ + float angle = i * 90f + rotate; + + + Draw.rect(selectArrowRegion, x + Angles.trnsx(angle, rad), y + Angles.trnsy(angle, rad), angle + 180f + 45f); + + //shape variant: + //Lines.poly(x + Angles.trnsx(angle, rad), y + Angles.trnsy(angle, rad), 3, ringArrowRad * fin, angle + 180f); + } + + Draw.scl(); + + } + + protected void drawLanding(float fin, float x, float y){ + float rawTime = launchDuration() - renderer.getLandTime(); float fout = 1f - fin; - float scl = Scl.scl(4f) / renderer.getDisplayScale(); + float scl = rawTime < chargeDuration ? 1f : Scl.scl(4f) / renderer.getDisplayScale(); float shake = 0f; float s = launchBlock.region.width * launchBlock.region.scl() * scl * 3.6f * Interp.pow2Out.apply(fout); float rotation = Interp.pow2In.apply(fout) * 135f; @@ -498,15 +613,5 @@ public class Accelerator extends Block{ } Draw.alpha(1f); } - - public void drawThrusters(float frame){ - CoreBlock core = (CoreBlock)launchBlock; - float length = core.thrusterLength * (frame - 1f) - 1f/4f; - for(int i = 0; i < 4; i++){ - var reg = i >= 2 ? core.thruster2 : core.thruster1; - float dx = Geometry.d4x[i] * length, dy = Geometry.d4y[i] * length; - Draw.rect(reg, x + dx, y + dy, i * 90); - } - } } } diff --git a/core/src/mindustry/world/blocks/storage/CoreBlock.java b/core/src/mindustry/world/blocks/storage/CoreBlock.java index 3dd29fc6b1..5aff273ddc 100644 --- a/core/src/mindustry/world/blocks/storage/CoreBlock.java +++ b/core/src/mindustry/world/blocks/storage/CoreBlock.java @@ -238,7 +238,7 @@ public class CoreBlock extends StorageBlock{ public float iframes = -1f; public float thrusterTime = 0f; - protected float cloudSeed; + protected float cloudSeed, landParticleTimer; @Override public void draw(){ @@ -260,7 +260,7 @@ public class CoreBlock extends StorageBlock{ } @Override - public float landDuration(){ + public float launchDuration(){ return landDuration; } @@ -290,7 +290,7 @@ public class CoreBlock extends StorageBlock{ image.color.a = 0f; image.touchable = Touchable.disabled; image.setFillParent(true); - image.actions(Actions.delay((landDuration() - margin) / 60f), Actions.fadeIn(margin / 60f, Interp.pow2In), Actions.delay(6f / 60f), Actions.remove()); + image.actions(Actions.delay((launchDuration() - margin) / 60f), Actions.fadeIn(margin / 60f, Interp.pow2In), Actions.delay(6f / 60f), Actions.remove()); image.update(() -> { image.toFront(); ui.loadfrag.toFront(); @@ -314,7 +314,7 @@ public class CoreBlock extends StorageBlock{ }); Core.scene.add(image); - Time.run(landDuration(), () -> { + Time.run(launchDuration(), () -> { launchEffect.at(this); Effect.shake(5f, 5f, this); thrusterTime = 1f; @@ -333,7 +333,7 @@ public class CoreBlock extends StorageBlock{ public void endLaunch(){} @Override - public void drawLanding(){ + public void drawLaunch(){ var clouds = Core.assets.get("sprites/clouds.png", Texture.class); float fin = renderer.getLandTimeIn(); @@ -551,25 +551,25 @@ public class CoreBlock extends StorageBlock{ /** @return Camera zoom while landing or launching. May optionally do other things such as setting camera position to itself. */ @Override - public float zoomLaunching(){ + public float zoomLaunch(){ Core.camera.position.set(this); return landZoomInterp.apply(Scl.scl(landZoomFrom), Scl.scl(landZoomTo), renderer.getLandTimeIn()); } @Override - public void updateLaunching(){ - float in = renderer.getLandTimeIn() * landDuration(); - float tsize = Mathf.sample(thrusterSizes, (in + 35f) / landDuration()); + public void updateLaunch(){ + float in = renderer.getLandTimeIn() * launchDuration(); + float tsize = Mathf.sample(thrusterSizes, (in + 35f) / launchDuration()); - renderer.setLandPTimer(renderer.getLandPTimer() + tsize * Time.delta); - if(renderer.getLandTime() >= 1f){ + landParticleTimer += tsize * Time.delta; + if(landParticleTimer >= 1f){ tile.getLinkedTiles(t -> { if(Mathf.chance(0.4f)){ Fx.coreLandDust.at(t.worldx(), t.worldy(), angleTo(t.worldx(), t.worldy()) + Mathf.range(30f), Tmp.c1.set(t.floor().mapColor).mul(1.5f + Mathf.range(0.15f))); } }); - renderer.setLandPTimer(0f); + landParticleTimer = 0f; } } From 4cf9d54c3dd06d79a478b672343f479645d42b8a Mon Sep 17 00:00:00 2001 From: Anuken Date: Tue, 28 Jan 2025 21:59:40 -0500 Subject: [PATCH 106/460] Re-added old ingame editor UI, hid new UI behind a toggle --- .../mindustry/ui/fragments/HudFragment.java | 69 +++++-------------- .../ui/fragments/PlacementFragment.java | 17 ++--- 2 files changed, 20 insertions(+), 66 deletions(-) diff --git a/core/src/mindustry/ui/fragments/HudFragment.java b/core/src/mindustry/ui/fragments/HudFragment.java index 23c6d1a742..87733e627c 100644 --- a/core/src/mindustry/ui/fragments/HudFragment.java +++ b/core/src/mindustry/ui/fragments/HudFragment.java @@ -326,71 +326,32 @@ public class HudFragment{ editorMain.name = "editor"; editorMain.table(Tex.buttonEdge4, t -> { t.name = "teams"; + + t.top().table(teams -> { teams.left(); - int i = 0; for(Team team : Team.baseTeams){ - ImageButton button = teams.button(Tex.whiteui, Styles.clearNoneTogglei, 38f, () -> Call.setPlayerTeamEditor(player, team)) - .size(50f).margin(6f).get(); + ImageButton button = teams.button(Tex.whiteui, Styles.clearNoneTogglei, 33f, () -> Call.setPlayerTeamEditor(player, team)) + .size(45f).margin(6f).get(); button.getImageCell().grow(); button.getStyle().imageUpColor = team.color; button.update(() -> button.setChecked(player.team() == team)); - - if(++i % 6 == 0){ - teams.row(); - } } - }).top().left(); - t.row(); + teams.button(Icon.downOpen, Styles.emptyi, () -> Core.settings.put("editor-blocks-shown", !Core.settings.getBool("editor-blocks-shown"))) + .size(45f).update(m -> m.getStyle().imageUp = (Core.settings.getBool("editor-blocks-shown") ? Icon.upOpen : Icon.downOpen)); + }).top().left().row(); - t.table(control.input::buildPlacementUI).growX().left().with(in -> in.left()).row(); - - //hovering item display - t.table(h -> { - Runnable rebuild = () -> { - h.clear(); - h.left(); - - Displayable hover = blockfrag.hovered(); - UnlockableContent toDisplay = control.input.block; - - if(toDisplay == null && hover != null){ - if(hover instanceof Building b){ - toDisplay = b.block; - }else if(hover instanceof Tile tile){ - toDisplay = - tile.block().itemDrop != null ? tile.block() : - tile.overlay().itemDrop != null || tile.wallDrop() != null ? tile.overlay() : - tile.floor(); - }else if(hover instanceof Unit u){ - toDisplay = u.type; - } - } - - if(toDisplay != null){ - h.image(toDisplay.uiIcon).scaling(Scaling.fit).size(8 * 4); - h.add(toDisplay.localizedName).ellipsis(true).left().growX().padLeft(5); - } - }; - - Object[] hovering = {null}; - h.update(() -> { - Object nextHover = control.input.block != null ? control.input.block : blockfrag.hovered(); - if(nextHover != hovering[0]){ - hovering[0] = nextHover; - rebuild.run(); - } - }); - }).growX().left().minHeight(36f).row(); - - t.table(blocks -> { + t.collapser(blocks -> { addBlockSelection(blocks); - }).fillX().left(); - }).width(dsize * 5 + 4f); + }, () -> Core.settings.getBool("editor-blocks-shown")); + + + + }).width(dsize * 5 + 4f).top(); if(mobile){ editorMain.row().spacerY(() -> { - if(control.input instanceof MobileInput mob){ + if(control.input instanceof MobileInput mob && Core.settings.getBool("editor-blocks-shown")){ if(Core.graphics.isPortrait()) return Core.graphics.getHeight() / 2f / Scl.scl(1f); if(mob.hasSchematic()) return 156f; if(mob.showCancel()) return 50f; @@ -398,6 +359,8 @@ public class HudFragment{ return 0f; }); } + + editorMain.row().add().growY(); editorMain.visible(() -> shown && state.isEditor()); //fps display diff --git a/core/src/mindustry/ui/fragments/PlacementFragment.java b/core/src/mindustry/ui/fragments/PlacementFragment.java index 6b42c3c3fc..228d60289f 100644 --- a/core/src/mindustry/ui/fragments/PlacementFragment.java +++ b/core/src/mindustry/ui/fragments/PlacementFragment.java @@ -265,14 +265,7 @@ public class PlacementFragment{ public void build(Group parent){ parent.fill(full -> { toggler = full; - full.bottom().right().visible(() -> { - if(state.rules.editor){ - //force update the mouse picking, since it otherwise would not happen - updatePick(control.input); - } - - return ui.hudfrag.shown && !state.rules.editor; - }); + full.bottom().right().visible(() -> ui.hudfrag.shown); full.table(frame -> { @@ -750,12 +743,10 @@ public class PlacementFragment{ /** @return the thing being hovered over. */ public @Nullable Displayable hovered(){ - if(!state.rules.editor){ - Vec2 v = topTable.stageToLocalCoordinates(Core.input.mouse()); + Vec2 v = topTable.stageToLocalCoordinates(Core.input.mouse()); - //if the mouse intersects the table or the UI has the mouse, no hovering can occur - if(Core.scene.hasMouse() || topTable.hit(v.x, v.y, false) != null) return null; - } + //if the mouse intersects the table or the UI has the mouse, no hovering can occur + if(Core.scene.hasMouse() || topTable.hit(v.x, v.y, false) != null) return null; //check for a unit Unit unit = Units.closestOverlap(player.team(), Core.input.mouseWorldX(), Core.input.mouseWorldY(), 5f, u -> !u.isLocal() && u.displayable()); From a7f38ac2a66c8e9c785b2c9959a094f0d5711fad Mon Sep 17 00:00:00 2001 From: Anuken Date: Tue, 28 Jan 2025 22:34:07 -0500 Subject: [PATCH 107/460] Make patrol stance pursue targets --- core/src/mindustry/ai/types/CommandAI.java | 9 +++++++++ core/src/mindustry/input/DesktopInput.java | 2 +- core/src/mindustry/input/InputHandler.java | 12 ++++++++---- core/src/mindustry/input/MobileInput.java | 2 +- 4 files changed, 19 insertions(+), 6 deletions(-) diff --git a/core/src/mindustry/ai/types/CommandAI.java b/core/src/mindustry/ai/types/CommandAI.java index 9446e72aa3..097c464884 100644 --- a/core/src/mindustry/ai/types/CommandAI.java +++ b/core/src/mindustry/ai/types/CommandAI.java @@ -82,6 +82,15 @@ public class CommandAI extends AIController{ commandTarget(target, false); } + //pursue the target for patrol, keeping the current position + if(stance == UnitStance.patrol && target != null && attackTarget == null){ + //commanding a target overwrites targetPos, so add it to the queue + if(targetPos != null){ + commandQueue.add(targetPos.cpy()); + } + commandTarget(target, false); + } + //remove invalid targets if(commandQueue.any()){ commandQueue.removeAll(e -> e instanceof Healthc h && !h.isValid()); diff --git a/core/src/mindustry/input/DesktopInput.java b/core/src/mindustry/input/DesktopInput.java index 78ac0604a7..0ec79e1ab6 100644 --- a/core/src/mindustry/input/DesktopInput.java +++ b/core/src/mindustry/input/DesktopInput.java @@ -288,7 +288,7 @@ public class DesktopInput extends InputHandler{ } //validate commanding units - selectedUnits.removeAll(u -> !u.isCommandable() || !u.isValid()); + selectedUnits.removeAll(u -> !u.isCommandable() || !u.isValid() || u.team != player.team()); if(commandMode && !scene.hasField() && !scene.hasDialog()){ if(input.keyTap(Binding.select_all_units)){ diff --git a/core/src/mindustry/input/InputHandler.java b/core/src/mindustry/input/InputHandler.java index 0ec6712921..36c55360cd 100644 --- a/core/src/mindustry/input/InputHandler.java +++ b/core/src/mindustry/input/InputHandler.java @@ -1096,10 +1096,16 @@ public abstract class InputHandler implements InputProcessor, GestureListener{ //draw command overlay UI for(Unit unit : selectedUnits){ - if(unit.isFlying() != flying) continue; + CommandAI ai = unit.command(); Position lastPos = ai.attackTarget != null ? ai.attackTarget : ai.targetPos; + if(flying && ai.attackTarget != null && ai.currentCommand().drawTarget){ + Drawf.target(ai.attackTarget.getX(), ai.attackTarget.getY(), 6f, Pal.remove); + } + + if(unit.isFlying() != flying) continue; + //draw target line if(ai.targetPos != null && ai.currentCommand().drawTarget){ Position lineDest = ai.attackTarget != null ? ai.attackTarget : ai.targetPos; @@ -1135,9 +1141,7 @@ public abstract class InputHandler implements InputProcessor, GestureListener{ //Lines.poly(unit.x, unit.y, sides, rad + 1.5f); Draw.reset(); - if(ai.attackTarget != null && ai.currentCommand().drawTarget){ - Drawf.target(ai.attackTarget.getX(), ai.attackTarget.getY(), 6f, Pal.remove); - } + if(lastPos == null){ lastPos = unit; diff --git a/core/src/mindustry/input/MobileInput.java b/core/src/mindustry/input/MobileInput.java index 20490ccd5c..d67ed72d33 100644 --- a/core/src/mindustry/input/MobileInput.java +++ b/core/src/mindustry/input/MobileInput.java @@ -762,7 +762,7 @@ public class MobileInput extends InputHandler implements GestureListener{ } //validate commanding units - selectedUnits.removeAll(u -> !u.isCommandable() || !u.isValid()); + selectedUnits.removeAll(u -> !u.isCommandable() || !u.isValid() || u.team != player.team()); if(!commandMode){ commandBuildings.clear(); From e308afb2a01585bd7eeaa2f41246cca8f6e434b6 Mon Sep 17 00:00:00 2001 From: Anuken Date: Tue, 28 Jan 2025 23:28:36 -0500 Subject: [PATCH 108/460] Fixed accelerator timing --- .../mindustry/world/blocks/campaign/Accelerator.java | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/core/src/mindustry/world/blocks/campaign/Accelerator.java b/core/src/mindustry/world/blocks/campaign/Accelerator.java index 74292dc526..254985bf3f 100644 --- a/core/src/mindustry/world/blocks/campaign/Accelerator.java +++ b/core/src/mindustry/world/blocks/campaign/Accelerator.java @@ -117,7 +117,7 @@ public class Accelerator extends Block{ @Override public void updateTile(){ super.updateTile(); - heat = Mathf.lerpDelta(heat, efficiency, 0.05f); + heat = Mathf.lerpDelta(heat, launching ? 1f : efficiency, 0.05f); statusLerp = Mathf.lerpDelta(statusLerp, power.status, 0.05f); if(!launching){ @@ -212,7 +212,7 @@ public class Accelerator extends Block{ } public boolean canLaunch(){ - return isValid() && state.isCampaign() && efficiency > 0f && power.graph.getBatteryStored() >= powerBufferRequirement-0.00001f && progress >= 1f; + return isValid() && state.isCampaign() && efficiency > 0f && power.graph.getBatteryStored() >= powerBufferRequirement-0.00001f && progress >= 1f && !launching; } @Override @@ -224,7 +224,7 @@ public class Accelerator extends Block{ public void drawSelect(){ super.drawSelect(); - if(power.graph.getBatteryStored() < powerBufferRequirement){ + if(power.graph.getBatteryStored() < powerBufferRequirement && !launching){ drawPlaceText(Core.bundle.get("bar.nobatterypower"), tile.x, tile.y, false); } } @@ -241,12 +241,11 @@ public class Accelerator extends Block{ power.graph.useBatteries(powerBufferRequirement); progress = 0f; - var core = team.core(); - renderer.showLaunch(this); - Time.runTask(core.launchDuration() - 8f, () -> { + Time.runTask(launchDuration() - 6f, () -> { //unlock right before launch + launching = false; sector.planet.unlockedOnLand.each(UnlockableContent::unlock); universe.clearLoadoutInfo(); From d75a5a8f405db8015867d752c2c05c43be70c872 Mon Sep 17 00:00:00 2001 From: Anuken Date: Tue, 28 Jan 2025 23:41:24 -0500 Subject: [PATCH 109/460] Fixed #10444 --- core/src/mindustry/ai/types/CommandAI.java | 21 +++++++++------------ 1 file changed, 9 insertions(+), 12 deletions(-) diff --git a/core/src/mindustry/ai/types/CommandAI.java b/core/src/mindustry/ai/types/CommandAI.java index 097c464884..f8fd593794 100644 --- a/core/src/mindustry/ai/types/CommandAI.java +++ b/core/src/mindustry/ai/types/CommandAI.java @@ -132,6 +132,14 @@ public class CommandAI extends AIController{ } } + @Override + public Teamc findMainTarget(float x, float y, float range, boolean air, boolean ground){ + if(!unit.type.autoFindTarget && !(targetPos == null || nearAttackTarget(unit.x, unit.y, unit.range()))){ + return null; + } + return super.findMainTarget(x, y, range, air, ground); + } + public void defaultBehavior(){ if(!net.client() && unit instanceof Payloadc pay){ @@ -183,18 +191,7 @@ public class CommandAI extends AIController{ } updateVisuals(); - //only autotarget if the unit supports it - if((targetPos == null || nearAttackTarget(unit.x, unit.y, unit.range())) || unit.type.autoFindTarget){ - updateTargeting(); - }else if(attackTarget == null){ - //if the unit does not have an attack target, is currently moving, and does not have autotargeting, stop attacking stuff - target = null; - for(var mount : unit.mounts){ - if(mount.weapon.controllable){ - mount.target = null; - } - } - } + updateTargeting(); if(attackTarget != null && invalid(attackTarget)){ attackTarget = null; From 5cd97f6ff11fcea6c387349c43ead6960d379efd Mon Sep 17 00:00:00 2001 From: Anuken Date: Tue, 28 Jan 2025 23:49:55 -0500 Subject: [PATCH 110/460] Fixed #10439 --- core/src/mindustry/ui/fragments/PlacementFragment.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/src/mindustry/ui/fragments/PlacementFragment.java b/core/src/mindustry/ui/fragments/PlacementFragment.java index 228d60289f..d798d69f96 100644 --- a/core/src/mindustry/ui/fragments/PlacementFragment.java +++ b/core/src/mindustry/ui/fragments/PlacementFragment.java @@ -746,7 +746,7 @@ public class PlacementFragment{ Vec2 v = topTable.stageToLocalCoordinates(Core.input.mouse()); //if the mouse intersects the table or the UI has the mouse, no hovering can occur - if(Core.scene.hasMouse() || topTable.hit(v.x, v.y, false) != null) return null; + if(Core.scene.hasMouse(Core.input.mouseX(), Core.input.mouseY()) || topTable.hit(v.x, v.y, false) != null) return null; //check for a unit Unit unit = Units.closestOverlap(player.team(), Core.input.mouseWorldX(), Core.input.mouseWorldY(), 5f, u -> !u.isLocal() && u.displayable()); From 84dcd07b20857e082c26130a176fa715629f0973 Mon Sep 17 00:00:00 2001 From: emi <112279985+yfwemi@users.noreply.github.com> Date: Wed, 29 Jan 2025 04:50:18 +0000 Subject: [PATCH 111/460] Update servers_v7.json (#10447) --- servers_v7.json | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/servers_v7.json b/servers_v7.json index 553bb16515..3117b6c247 100644 --- a/servers_v7.json +++ b/servers_v7.json @@ -236,11 +236,12 @@ { "name": "Exdustry", "address": [ - "exd.noxia.cloud:6001", - "exd.noxia.cloud:6002", - "exd.noxia.cloud:6003", - "exd.noxia.cloud:6004", - "exd.noxia.cloud:6006" + "play.exdustry.xyz:6001", + "play.exdustry.xyz:6002", + "play.exdustry.xyz:6003", + "play.exdustry.xyz:6004", + "play.exdustry.xyz:6005", + "play.exdustry.xyz:6006" ] }, { From cbeac8e995a40b10d2dcb2c1a28b27152a3d32b0 Mon Sep 17 00:00:00 2001 From: Anuken Date: Wed, 29 Jan 2025 15:08:54 -0500 Subject: [PATCH 112/460] Fixed mobile menu layout issues --- .../mindustry/ui/fragments/HudFragment.java | 21 ++++++++++++------- 1 file changed, 14 insertions(+), 7 deletions(-) diff --git a/core/src/mindustry/ui/fragments/HudFragment.java b/core/src/mindustry/ui/fragments/HudFragment.java index 87733e627c..0b414e59d4 100644 --- a/core/src/mindustry/ui/fragments/HudFragment.java +++ b/core/src/mindustry/ui/fragments/HudFragment.java @@ -290,8 +290,19 @@ public class HudFragment{ Table wavesMain, editorMain; - cont.stack(wavesMain = new Table(), editorMain = new Table()).height(wavesMain.getPrefHeight()) - .name("waves/editor"); + cont.stack(wavesMain = new Table(), editorMain = new Table(), new Element(){ + //this may seem insane, but adding an empty element of a specific height to this stack fixes layout issues on mobile. + + { + visible = false; + touchable = Touchable.disabled; + } + + @Override + public float getPrefHeight(){ + return Scl.scl(120f); + } + }).name("waves/editor"); wavesMain.visible(() -> shown && !state.isEditor()); wavesMain.top().left().name = "waves"; @@ -342,11 +353,7 @@ public class HudFragment{ .size(45f).update(m -> m.getStyle().imageUp = (Core.settings.getBool("editor-blocks-shown") ? Icon.upOpen : Icon.downOpen)); }).top().left().row(); - t.collapser(blocks -> { - addBlockSelection(blocks); - }, () -> Core.settings.getBool("editor-blocks-shown")); - - + t.collapser(this::addBlockSelection, () -> Core.settings.getBool("editor-blocks-shown")); }).width(dsize * 5 + 4f).top(); if(mobile){ From bcb7cdae73352ad3c65ee88b783ba4c62e943ddb Mon Sep 17 00:00:00 2001 From: Anuken Date: Wed, 29 Jan 2025 18:43:20 -0500 Subject: [PATCH 113/460] Allowed naval RTS AI --- core/src/mindustry/ai/types/CommandAI.java | 9 --------- 1 file changed, 9 deletions(-) diff --git a/core/src/mindustry/ai/types/CommandAI.java b/core/src/mindustry/ai/types/CommandAI.java index f8fd593794..48a465ceb9 100644 --- a/core/src/mindustry/ai/types/CommandAI.java +++ b/core/src/mindustry/ai/types/CommandAI.java @@ -181,15 +181,6 @@ public class CommandAI extends AIController{ } } - //acquiring naval targets isn't supported yet, so use the fallback dumb AI - if(unit.team.isAI() && unit.team.rules().rtsAi && unit.type.naval){ - if(fallback == null) fallback = new GroundAI(); - - if(fallback.unit() != unit) fallback.unit(unit); - fallback.updateUnit(); - return; - } - updateVisuals(); updateTargeting(); From ab65c9d29ac9f3019f5a47aad2c7321df354fbea Mon Sep 17 00:00:00 2001 From: Anuken Date: Fri, 31 Jan 2025 17:58:35 -0500 Subject: [PATCH 114/460] WIP launch pad rework --- core/assets/bundles/bundle.properties | 2 +- core/src/mindustry/content/Blocks.java | 27 ++++++- .../mindustry/content/SerpuloTechTree.java | 4 +- .../mindustry/entities/comp/BuildingComp.java | 27 ++++--- core/src/mindustry/game/SectorInfo.java | 2 - core/src/mindustry/game/Universe.java | 30 ++------ .../world/blocks/campaign/LandingPad.java | 70 +++++++++++++++++++ .../world/blocks/campaign/LaunchPad.java | 8 ++- .../world/consumers/ConsumeLiquid.java | 13 ++++ 9 files changed, 136 insertions(+), 47 deletions(-) create mode 100644 core/src/mindustry/world/blocks/campaign/LandingPad.java diff --git a/core/assets/bundles/bundle.properties b/core/assets/bundles/bundle.properties index 5047010b9c..b3e8fcd35f 100644 --- a/core/assets/bundles/bundle.properties +++ b/core/assets/bundles/bundle.properties @@ -1748,7 +1748,7 @@ block.spectre.name = Spectre block.meltdown.name = Meltdown block.foreshadow.name = Foreshadow block.container.name = Container -block.launch-pad.name = Launch Pad +block.launch-pad.name = Launch Pad (Legacy) block.segment.name = Segment block.ground-factory.name = Ground Factory block.air-factory.name = Air Factory diff --git a/core/src/mindustry/content/Blocks.java b/core/src/mindustry/content/Blocks.java index 4a5de1909e..0fca202a3b 100644 --- a/core/src/mindustry/content/Blocks.java +++ b/core/src/mindustry/content/Blocks.java @@ -163,7 +163,8 @@ public class Blocks{ worldProcessor, worldCell, worldMessage, worldSwitch, //campaign - launchPad, interplanetaryAccelerator + launchPad, advancedLaunchPad, landingPad, + interplanetaryAccelerator ; @@ -6353,14 +6354,36 @@ public class Blocks{ //region campaign launchPad = new LaunchPad("launch-pad"){{ - requirements(Category.effect, BuildVisibility.campaignOnly, with(Items.copper, 350, Items.silicon, 140, Items.lead, 200, Items.titanium, 150)); + requirements(Category.effect, BuildVisibility.debugOnly, with(Items.copper, 350, Items.silicon, 140, Items.lead, 200, Items.titanium, 150)); size = 3; itemCapacity = 100; launchTime = 60f * 20; hasPower = true; + acceptMultipleItems = true; consumePower(4f); }}; + advancedLaunchPad = new LaunchPad("advanced-launch-pad"){{ + requirements(Category.effect, BuildVisibility.campaignOnly, with(Items.copper, 350, Items.silicon, 140, Items.lead, 200, Items.titanium, 150)); + size = 4; + itemCapacity = 100; + launchTime = 60f * 30; + hasPower = true; + consumeLiquid(Liquids.oil, 9f/60f); + consumePower(8f); + }}; + + landingPad = new LandingPad("landing-pad"){{ + requirements(Category.effect, BuildVisibility.campaignOnly, with(Items.copper, 350, Items.silicon, 140, Items.lead, 200, Items.titanium, 150)); + size = 4; + + itemCapacity = 100; + + liquidCapacity = 2000; + addLiquidBar(Liquids.water); + consumeLiquid(Liquids.water, liquidCapacity).trigger(true).update(false); + }}; + interplanetaryAccelerator = new Accelerator("interplanetary-accelerator"){{ requirements(Category.effect, BuildVisibility.campaignOnly, with(Items.copper, 16000, Items.silicon, 11000, Items.thorium, 13000, Items.titanium, 12000, Items.surgeAlloy, 6000, Items.phaseFabric, 5000)); researchCostMultiplier = 0.1f; diff --git a/core/src/mindustry/content/SerpuloTechTree.java b/core/src/mindustry/content/SerpuloTechTree.java index f158069c08..989c3b043f 100644 --- a/core/src/mindustry/content/SerpuloTechTree.java +++ b/core/src/mindustry/content/SerpuloTechTree.java @@ -19,7 +19,7 @@ public class SerpuloTechTree{ node(junction, () -> { node(router, () -> { - node(launchPad, Seq.with(new SectorComplete(extractionOutpost)), () -> { + node(advancedLaunchPad, Seq.with(new SectorComplete(extractionOutpost)), () -> { node(interplanetaryAccelerator, Seq.with(new SectorComplete(planetaryTerminal)), () -> { }); @@ -522,7 +522,7 @@ public class SerpuloTechTree{ new Research(sei), new Research(omura), new Research(spectre), - new Research(launchPad), + new Research(advancedLaunchPad), new Research(massDriver), new Research(impactReactor), new Research(additiveReconstructor), diff --git a/core/src/mindustry/entities/comp/BuildingComp.java b/core/src/mindustry/entities/comp/BuildingComp.java index b5611ca178..722fad3542 100644 --- a/core/src/mindustry/entities/comp/BuildingComp.java +++ b/core/src/mindustry/entities/comp/BuildingComp.java @@ -56,7 +56,7 @@ abstract class BuildingComp implements Posc, Teamc, Healthc, Buildingc, Timerc, static final BuildTeamChangeEvent teamChangeEvent = new BuildTeamChangeEvent(); static final BuildDamageEvent bulletDamageEvent = new BuildDamageEvent(); static int sleepingEntities = 0; - + @Import float x, y, health, maxHealth; @Import Team team; @Import boolean dead; @@ -1029,10 +1029,9 @@ abstract class BuildingComp implements Posc, Teamc, Healthc, Buildingc, Timerc, int itemSize = allItems.size; Object[] itemArray = allItems.items; - for(int i = 0; i < proximity.size; i++){ - Building other = proximity.get((i + dump) % proximity.size); - - if(todump == null){ + if(todump == null){ + for(int i = 0; i < proximity.size; i++){ + Building other = proximity.get((i + dump) % proximity.size); for(int ii = 0; ii < itemSize; ii++){ if(!items.has(ii)) continue; @@ -1045,16 +1044,22 @@ abstract class BuildingComp implements Posc, Teamc, Healthc, Buildingc, Timerc, return true; } } - }else{ + + incrementDump(proximity.size); + } + }else{ + for(int i = 0; i < proximity.size; i++){ + Building other = proximity.get((i + dump) % proximity.size); + if(other.acceptItem(self(), todump) && canDump(other, todump)){ other.handleItem(self(), todump); items.remove(todump, 1); incrementDump(proximity.size); return true; } - } - incrementDump(proximity.size); + incrementDump(proximity.size); + } } return false; @@ -1118,7 +1123,7 @@ abstract class BuildingComp implements Posc, Teamc, Healthc, Buildingc, Timerc, } power.links.clear(); } - + public boolean conductsTo(Building other){ return !block.insulated; } @@ -1320,7 +1325,7 @@ abstract class BuildingComp implements Posc, Teamc, Healthc, Buildingc, Timerc, if(value instanceof Block) type = Block.class; if(value instanceof Liquid) type = Liquid.class; if(value instanceof UnitType) type = UnitType.class; - + if(builder != null && builder.isPlayer()){ updateLastAccess(builder.getPlayer()); } @@ -1727,7 +1732,7 @@ abstract class BuildingComp implements Posc, Teamc, Healthc, Buildingc, Timerc, public void updateProximity(){ tmpTiles.clear(); proximity.clear(); - + Point2[] nearby = Edges.getEdges(block.size); for(Point2 point : nearby){ Building other = world.build(tile.x + point.x, tile.y + point.y); diff --git a/core/src/mindustry/game/SectorInfo.java b/core/src/mindustry/game/SectorInfo.java index 00ff253867..85084e8ea1 100644 --- a/core/src/mindustry/game/SectorInfo.java +++ b/core/src/mindustry/game/SectorInfo.java @@ -80,8 +80,6 @@ public class SectorInfo{ public int waveVersion = -1; /** Whether this sector was indicated to the player or not. */ public boolean shown = false; - /** Temporary seq for last imported items. Do not use. */ - public transient ItemSeq lastImported = new ItemSeq(); /** Special variables for simulation. */ public float sumHealth, sumRps, sumDps, bossHealth, bossDps, curEnemyHealth, curEnemyDps; diff --git a/core/src/mindustry/game/Universe.java b/core/src/mindustry/game/Universe.java index 5026101451..b159ca4991 100644 --- a/core/src/mindustry/game/Universe.java +++ b/core/src/mindustry/game/Universe.java @@ -163,31 +163,6 @@ public class Universe{ continue; } - //first pass: clear import stats - for(Sector sector : planet.sectors){ - if(sector.hasBase() && !sector.isBeingPlayed()){ - sector.info.lastImported.clear(); - } - } - - //second pass: update export & import statistics - for(Sector sector : planet.sectors){ - if(sector.hasBase() && !sector.isBeingPlayed()){ - - //export to another sector - if(sector.info.destination != null){ - Sector to = sector.info.destination; - if(to.hasBase() && to.planet == planet){ - ItemSeq items = new ItemSeq(); - //calculated exported items to this sector - sector.info.export.each((item, stat) -> items.add(item, (int)(stat.mean * newSecondsPassed * sector.getProductionScale()))); - to.addItems(items); - to.info.lastImported.add(items); - } - } - } - } - //third pass: everything else for(Sector sector : planet.sectors){ if(sector.hasBase()){ @@ -202,6 +177,8 @@ public class Universe{ //increment seconds passed for this sector by the time that just passed with this turn if(!sector.isBeingPlayed()){ + //TODO: if a planet has sectors under attack and simulation is OFF, just don't simulate it + //increment time if attacked if(sector.isAttacked()){ sector.info.secondsPassed += turnDuration/60f; @@ -247,7 +224,8 @@ public class Universe{ sector.info.export.each((item, stat) -> { if(sector.info.items.get(item) <= 0 && sector.info.production.get(item, ExportStat::new).mean < 0 && stat.mean > 0){ //cap export by import when production is negative. - stat.mean = Math.min(sector.info.lastImported.get(item) / (float)newSecondsPassed, stat.mean); + //TODO remove + stat.mean = Math.min(0f, stat.mean); } }); diff --git a/core/src/mindustry/world/blocks/campaign/LandingPad.java b/core/src/mindustry/world/blocks/campaign/LandingPad.java new file mode 100644 index 0000000000..bb95caee6b --- /dev/null +++ b/core/src/mindustry/world/blocks/campaign/LandingPad.java @@ -0,0 +1,70 @@ +package mindustry.world.blocks.campaign; + +import arc.util.*; +import arc.util.io.*; +import mindustry.gen.*; +import mindustry.io.*; +import mindustry.type.*; +import mindustry.world.*; + +public class LandingPad extends Block{ + + public LandingPad(String name){ + super(name); + + hasItems = true; + solid = true; + update = true; + configurable = true; + acceptsItems = false; + + config(Item.class, (LandingPadBuild build, Item item) -> build.config = item); + configClear((LandingPadBuild build) -> build.config = null); + } + + @Override + public boolean outputsItems(){ + return true; + } + + public class LandingPadBuild extends Building{ + public @Nullable Item config; + + @Override + public void updateTile(){ + if(items.total() > 0){ + dumpAccumulate(config == null || items.get(config) != items.total() ? null : config); + } + } + + @Override + public boolean canDump(Building to, Item item){ + //hack: canDump is only ever called right before item offload, so count the item as "produced" before that. + //TODO: is this necessary? + produced(item); + return true; + } + + @Override + public boolean acceptItem(Building source, Item item){ + return false; + } + + @Override + public @Nullable Object config(){ + return config; + } + + @Override + public void read(Reads read, byte revision){ + super.read(read, revision); + config = TypeIO.readItem(read); + } + + @Override + public void write(Writes write){ + super.write(write); + TypeIO.writeItem(write, config); + } + } +} diff --git a/core/src/mindustry/world/blocks/campaign/LaunchPad.java b/core/src/mindustry/world/blocks/campaign/LaunchPad.java index 440029ebf4..517df73e2f 100644 --- a/core/src/mindustry/world/blocks/campaign/LaunchPad.java +++ b/core/src/mindustry/world/blocks/campaign/LaunchPad.java @@ -27,13 +27,14 @@ import mindustry.world.meta.*; import static mindustry.Vars.*; public class LaunchPad extends Block{ - /** Time inbetween launches. */ + /** Time between launches. */ public float launchTime = 1f; public Sound launchSound = Sounds.none; public @Load("@-light") TextureRegion lightRegion; public @Load(value = "@-pod", fallback = "launchpod") TextureRegion podRegion; public Color lightColor = Color.valueOf("eab678"); + public boolean acceptMultipleItems = false; public LaunchPad(String name){ super(name); @@ -116,7 +117,7 @@ public class LaunchPad extends Block{ @Override public boolean acceptItem(Building source, Item item){ - return items.total() < itemCapacity; + return items.total() < itemCapacity && (acceptMultipleItems || items.total() == 0 || items.first() == item); } @Override @@ -159,7 +160,8 @@ public class LaunchPad extends Block{ @Override public void buildConfiguration(Table table){ - if(!state.isCampaign() || net.client()){ + //TODO: this UI should be on landing pads + if(!state.isCampaign() || net.client() || true){ deselect(); return; } diff --git a/core/src/mindustry/world/consumers/ConsumeLiquid.java b/core/src/mindustry/world/consumers/ConsumeLiquid.java index a4a3ebc460..b1258f67d4 100644 --- a/core/src/mindustry/world/consumers/ConsumeLiquid.java +++ b/core/src/mindustry/world/consumers/ConsumeLiquid.java @@ -12,6 +12,7 @@ import static mindustry.Vars.*; //TODO replace with ConsumeLiquids? public class ConsumeLiquid extends ConsumeLiquidBase{ public final Liquid liquid; + public boolean trigger; public ConsumeLiquid(Liquid liquid, float amount){ super(amount); @@ -22,6 +23,11 @@ public class ConsumeLiquid extends ConsumeLiquidBase{ this(null, 0f); } + public ConsumeLiquid trigger(boolean trigger){ + this.trigger = trigger; + return this; + } + @Override public void apply(Block block){ super.apply(block); @@ -38,6 +44,13 @@ public class ConsumeLiquid extends ConsumeLiquidBase{ build.liquids.remove(liquid, amount * build.edelta() * multiplier.get(build)); } + @Override + public void trigger(Building build){ + if(trigger){ + build.liquids.remove(liquid, amount); + } + } + @Override public float efficiency(Building build){ float ed = build.edelta() * build.efficiencyScale(); From cd9614f913cdf2012a40bd9c422ac046819aaf3f Mon Sep 17 00:00:00 2001 From: Anuken Date: Fri, 31 Jan 2025 23:48:16 -0500 Subject: [PATCH 115/460] Fixed #10452 --- core/src/mindustry/content/Blocks.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/src/mindustry/content/Blocks.java b/core/src/mindustry/content/Blocks.java index 4a5de1909e..8c71a74b18 100644 --- a/core/src/mindustry/content/Blocks.java +++ b/core/src/mindustry/content/Blocks.java @@ -5213,7 +5213,7 @@ public class Blocks{ shake = 6f; ammoPerShot = 15; - maxAmmo = 30; + maxAmmo = 45; shootY = -1; outlineColor = Pal.darkOutline; size = 4; From 18b78f4bf685150f7bcf24c940302585cbce9127 Mon Sep 17 00:00:00 2001 From: Anuken Date: Sat, 1 Feb 2025 20:46:08 -0500 Subject: [PATCH 116/460] Launch pad rework progress, base mechanics done --- core/src/mindustry/content/Blocks.java | 5 +- core/src/mindustry/core/Control.java | 4 + core/src/mindustry/core/Logic.java | 4 + core/src/mindustry/game/EventType.java | 2 + core/src/mindustry/game/SectorInfo.java | 34 +++- core/src/mindustry/game/Universe.java | 8 + .../mindustry/ui/dialogs/PlanetDialog.java | 38 ++--- .../world/blocks/campaign/LandingPad.java | 145 ++++++++++++++++++ .../world/blocks/campaign/LaunchPad.java | 30 ++-- .../world/blocks/sandbox/ItemSource.java | 1 + .../world/consumers/ConsumeLiquid.java | 12 -- gradle.properties | 2 +- 12 files changed, 226 insertions(+), 59 deletions(-) diff --git a/core/src/mindustry/content/Blocks.java b/core/src/mindustry/content/Blocks.java index 0fca202a3b..810dfc8e12 100644 --- a/core/src/mindustry/content/Blocks.java +++ b/core/src/mindustry/content/Blocks.java @@ -6379,9 +6379,8 @@ public class Blocks{ itemCapacity = 100; - liquidCapacity = 2000; - addLiquidBar(Liquids.water); - consumeLiquid(Liquids.water, liquidCapacity).trigger(true).update(false); + liquidCapacity = 4000f; + consumeLiquidAmount = 2000f; }}; interplanetaryAccelerator = new Accelerator("interplanetary-accelerator"){{ diff --git a/core/src/mindustry/core/Control.java b/core/src/mindustry/core/Control.java index 58f7fa65e3..dd49e90f88 100644 --- a/core/src/mindustry/core/Control.java +++ b/core/src/mindustry/core/Control.java @@ -215,6 +215,10 @@ public class Control implements ApplicationListener, Loadable{ } if(state.isCampaign()){ + if(state.rules.sector.info.importRateCache != null){ + state.rules.sector.info.refreshImportRates(state.rules.sector.planet); + } + //don't run when hosting, that doesn't really work. if(state.rules.sector.planet.prebuildBase){ toBePlaced.clear(); diff --git a/core/src/mindustry/core/Logic.java b/core/src/mindustry/core/Logic.java index ed9271e519..328d838c4c 100644 --- a/core/src/mindustry/core/Logic.java +++ b/core/src/mindustry/core/Logic.java @@ -429,6 +429,8 @@ public class Logic implements ApplicationListener{ } if(!state.isPaused()){ + Events.fire(Trigger.beforeGameUpdate); + float delta = Core.graphics.getDeltaTime(); state.tick += Float.isNaN(delta) || Float.isInfinite(delta) ? 0f : delta * 60f; state.updateId ++; @@ -488,6 +490,8 @@ public class Logic implements ApplicationListener{ Groups.weather.each(w -> state.envAttrs.add(w.weather.attrs, w.opacity)); Groups.update(); + + Events.fire(Trigger.afterGameUpdate); } if(runStateCheck){ diff --git a/core/src/mindustry/game/EventType.java b/core/src/mindustry/game/EventType.java index 39333fdf96..ec3bac3628 100644 --- a/core/src/mindustry/game/EventType.java +++ b/core/src/mindustry/game/EventType.java @@ -38,6 +38,8 @@ public class EventType{ teamCoreDamage, socketConfigChanged, update, + beforeGameUpdate, + afterGameUpdate, unitCommandChange, unitCommandPosition, unitCommandAttack, diff --git a/core/src/mindustry/game/SectorInfo.java b/core/src/mindustry/game/SectorInfo.java index 85084e8ea1..2ccb9cd3f2 100644 --- a/core/src/mindustry/game/SectorInfo.java +++ b/core/src/mindustry/game/SectorInfo.java @@ -86,6 +86,9 @@ public class SectorInfo{ /** Wave where first boss shows up. */ public int bossWave = -1; + public ObjectFloatMap importCooldownTimers = new ObjectFloatMap<>(); + public @Nullable transient float[] importRateCache; + /** Counter refresh state. */ private transient Interval time = new Interval(); /** Core item storage input/output deltas. */ @@ -105,12 +108,6 @@ public class SectorInfo{ productionDeltas[item.id] += amount; } - /** @return the real location items go when launched on this sector */ - public Sector getRealDestination(){ - //on multiplayer the destination is, by default, the first captured sector (basically random) - return !net.client() || destination != null ? destination : state.rules.sector.planet.sectors.find(Sector::hasBase); - } - /** Updates export statistics. */ public void handleItemExport(ItemStack stack){ handleItemExport(stack.item, stack.amount); @@ -125,6 +122,29 @@ public class SectorInfo{ return export.get(item, ExportStat::new).mean; } + public void refreshImportRates(Planet planet){ + if(importRateCache == null || importRateCache.length != content.items().size){ + importRateCache = new float[content.items().size]; + }else{ + Arrays.fill(importRateCache, 0f); + } + eachImport(planet, sector -> sector.info.export.each((item, stat) -> { + importRateCache[item.id] += stat.mean; + })); + } + + public float[] getImportRates(Planet planet){ + if(importRateCache == null){ + refreshImportRates(planet); + } + return importRateCache; + } + + /** @return the import rate of an item as item/second. */ + public float getImportRate(Planet planet, Item item){ + return getImportRates(planet)[item.id]; + } + /** Write contents of meta into main storage. */ public void write(){ //enable attack mode when there's a core. @@ -291,7 +311,7 @@ public class SectorInfo{ /** Iterates through every sector this one imports from. */ public void eachImport(Planet planet, Cons cons){ for(Sector sector : planet.sectors){ - Sector dest = sector.info.getRealDestination(); + Sector dest = sector.info.destination; if(sector.hasBase() && sector.info != this && dest != null && dest.info == this && sector.info.anyExports()){ cons.get(sector); } diff --git a/core/src/mindustry/game/Universe.java b/core/src/mindustry/game/Universe.java index b159ca4991..94945eae55 100644 --- a/core/src/mindustry/game/Universe.java +++ b/core/src/mindustry/game/Universe.java @@ -163,9 +163,17 @@ public class Universe{ continue; } + //don't simulate the planet if there is an in-progress mission on that planet + if(!planet.allowWaveSimulation && planet.sectors.contains(s -> s.hasBase() && !s.isBeingPlayed() && s.isAttacked())){ + continue; + } + //third pass: everything else for(Sector sector : planet.sectors){ if(sector.hasBase()){ + if(sector.info.importRateCache != null){ + sector.info.refreshImportRates(planet); + } //if it is being attacked, capture time is 0; otherwise, increment the timer if(sector.isAttacked()){ diff --git a/core/src/mindustry/ui/dialogs/PlanetDialog.java b/core/src/mindustry/ui/dialogs/PlanetDialog.java index a7ec975735..55b564047f 100644 --- a/core/src/mindustry/ui/dialogs/PlanetDialog.java +++ b/core/src/mindustry/ui/dialogs/PlanetDialog.java @@ -504,11 +504,11 @@ public class PlanetDialog extends BaseDialog implements PlanetInterfaceRenderer{ if(selected != null && selected != sec && selected.hasBase()){ //imports - if(sec.info.getRealDestination() == selected && sec.info.anyExports()){ + if(sec.info.destination == selected && sec.info.anyExports()){ planets.drawArc(planet, sec.tile.v, selected.tile.v, Color.gray.write(Tmp.c2).a(state.uiAlpha), Pal.accent.write(Tmp.c3).a(state.uiAlpha), 0.4f, 90f, 25); } //exports - if(selected.info.getRealDestination() == sec && selected.info.anyExports()){ + if(selected.info.destination == sec && selected.info.anyExports()){ planets.drawArc(planet, selected.tile.v, sec.tile.v, Pal.place.write(Tmp.c2).a(state.uiAlpha), Pal.accent.write(Tmp.c3).a(state.uiAlpha), 0.4f, 90f, 25); } } @@ -1219,24 +1219,24 @@ public class PlanetDialog extends BaseDialog implements PlanetInterfaceRenderer{ return; } - //make sure there are no under-attack sectors (other than this one) - for(Planet planet : content.planets()){ - if(!planet.allowWaveSimulation && !debugSelect && planet.allowWaveSimulation == sector.planet.allowWaveSimulation){ - //if there are two or more attacked sectors... something went wrong, don't show the dialog to prevent softlock - Sector attacked = planet.sectors.find(s -> s.isAttacked() && s != sector); - if(attacked != null && planet.sectors.count(s -> s.isAttacked()) < 2){ - BaseDialog dialog = new BaseDialog("@sector.noswitch.title"); - dialog.cont.add(bundle.format("sector.noswitch", attacked.name(), attacked.planet.localizedName)).width(400f).labelAlign(Align.center).center().wrap(); - dialog.addCloseButton(); - dialog.buttons.button("@sector.view", Icon.eyeSmall, () -> { - dialog.hide(); - lookAt(attacked); - selectSector(attacked); - }); - dialog.show(); + Planet planet = sector.planet; - return; - } + //make sure there are no under-attack sectors (other than this one) + if(!planet.allowWaveSimulation && !debugSelect){ + //if there are two or more attacked sectors... something went wrong, don't show the dialog to prevent softlock + Sector attacked = planet.sectors.find(s -> s.isAttacked() && s != sector); + if(attacked != null && planet.sectors.count(s -> s.isAttacked()) < 2){ + BaseDialog dialog = new BaseDialog("@sector.noswitch.title"); + dialog.cont.add(bundle.format("sector.noswitch", attacked.name(), attacked.planet.localizedName)).width(400f).labelAlign(Align.center).center().wrap(); + dialog.addCloseButton(); + dialog.buttons.button("@sector.view", Icon.eyeSmall, () -> { + dialog.hide(); + lookAt(attacked); + selectSector(attacked); + }); + dialog.show(); + + return; } } diff --git a/core/src/mindustry/world/blocks/campaign/LandingPad.java b/core/src/mindustry/world/blocks/campaign/LandingPad.java index bb95caee6b..676c204916 100644 --- a/core/src/mindustry/world/blocks/campaign/LandingPad.java +++ b/core/src/mindustry/world/blocks/campaign/LandingPad.java @@ -1,18 +1,46 @@ package mindustry.world.blocks.campaign; +import arc.*; +import arc.math.*; +import arc.scene.ui.layout.*; +import arc.struct.*; import arc.util.*; import arc.util.io.*; +import mindustry.annotations.Annotations.*; +import mindustry.content.*; +import mindustry.game.EventType.*; import mindustry.gen.*; +import mindustry.graphics.*; import mindustry.io.*; import mindustry.type.*; +import mindustry.ui.*; import mindustry.world.*; +import mindustry.world.blocks.*; +import mindustry.world.consumers.*; +import mindustry.world.meta.*; + +import static mindustry.Vars.*; public class LandingPad extends Block{ + static ObjectMap> waiting = new ObjectMap<>(); + static long lastUpdateId = -1; + + static{ + Events.on(ResetEvent.class, e -> { + waiting.clear(); + lastUpdateId = -1; + }); + } + + public float cooldownTime = 12f; + public float consumeLiquidAmount = 100f; + public Liquid consumeLiquid = Liquids.water; public LandingPad(String name){ super(name); hasItems = true; + hasLiquids = true; solid = true; update = true; configurable = true; @@ -22,19 +50,127 @@ public class LandingPad extends Block{ configClear((LandingPadBuild build) -> build.config = null); } + @Override + public void init(){ + consume(new ConsumeLiquid(consumeLiquid, consumeLiquidAmount){ + + @Override + public void build(Building build, Table table){ + table.add(new ReqImage(liquid.uiIcon, () -> build.liquids.get(liquid) >= amount)).size(iconMed).top().left(); + } + + @Override + public float efficiency(Building build){ + return build.liquids.get(consumeLiquid) >= amount ? 1f : 0f; + } + + @Override + public void display(Stats stats){ + stats.add(Stat.input, liquid, amount, false); + } + }).update(false); + + super.init(); + } + + @Override + public void setBars(){ + super.setBars(); + + addLiquidBar(consumeLiquid); + //TODO: does cooldown even need to exist? + addBar("heat", (LandingPadBuild entity) -> new Bar("bar.heat", Pal.lightOrange, () -> entity.cooldown)); + } + @Override public boolean outputsItems(){ return true; } + @Remote(called = Loc.server) + public static void landingPadLanded(Tile tile){ + if(tile == null || !(tile.build instanceof LandingPadBuild build)) return; + build.handleLanding(); + } + public class LandingPadBuild extends Building{ public @Nullable Item config; + //priority collisions are possible, but should be extremely rare + public int priority = Mathf.rand.nextInt(); + public float cooldown = 0f; + + + public void handleLanding(){ + if(!state.isCampaign() || config == null) return; + //TODO animation, etc + + cooldown = 1f; + items.set(config, itemCapacity); + liquids.remove(consumeLiquid, consumeLiquidAmount); + for(int i = 0; i < 10; i++){ + Fx.steam.at(this); + } + //TODO this is a temporary effect + Fx.shockwave.at(this); + + state.rules.sector.info.importCooldownTimers.put(config, 0f); + } + + public void updateTimers(){ + if(state.isCampaign() && lastUpdateId != state.updateId){ + lastUpdateId = state.updateId; + + float[] imports = state.rules.sector.info.getImportRates(state.getPlanet()); + + for(Item item : content.items()){ + float importedPerFrame = imports[item.id]/60f; + if(importedPerFrame > 0f){ + float framesBetweenArrival = itemCapacity / importedPerFrame; + + state.rules.sector.info.importCooldownTimers.increment(item, 0f, 1f / framesBetweenArrival * Time.delta); + } + } + + waiting.each((item, pads) -> { + if(pads.size > 0){ + pads.sort(p -> p.priority); + + var first = pads.first(); + var head = pads.peek(); + + Call.landingPadLanded(first.tile); + + + //swap priorities, moving this block to the end of the list (if there is only one block waiting, this does nothing) + var tmp = first.priority; + first.priority = head.priority; + head.priority = tmp; + + + pads.clear(); + } + }); + } + } @Override public void updateTile(){ + updateTimers(); + if(items.total() > 0){ dumpAccumulate(config == null || items.get(config) != items.total() ? null : config); } + + if(config != null && state.isCampaign()){ + + cooldown -= delta() / cooldownTime; + + if(cooldown <= 0f && efficiency > 0f && items.total() == 0 && state.rules.sector.info.importCooldownTimers.get(config, 0f) >= 1f){ + + //queue landing for next frame + waiting.get(config, Seq::new).add(this); + } + } } @Override @@ -45,6 +181,11 @@ public class LandingPad extends Block{ return true; } + @Override + public void buildConfiguration(Table table){ + ItemSelection.buildTable(LandingPad.this, table, content.items(), () -> config, this::configure, selectionRows, selectionColumns); + } + @Override public boolean acceptItem(Building source, Item item){ return false; @@ -59,12 +200,16 @@ public class LandingPad extends Block{ public void read(Reads read, byte revision){ super.read(read, revision); config = TypeIO.readItem(read); + priority = read.i(); + cooldown = read.f(); } @Override public void write(Writes write){ super.write(write); TypeIO.writeItem(write, config); + write.i(priority); + write.f(cooldown); } } } diff --git a/core/src/mindustry/world/blocks/campaign/LaunchPad.java b/core/src/mindustry/world/blocks/campaign/LaunchPad.java index 517df73e2f..1f63f5a17a 100644 --- a/core/src/mindustry/world/blocks/campaign/LaunchPad.java +++ b/core/src/mindustry/world/blocks/campaign/LaunchPad.java @@ -150,7 +150,7 @@ public class LaunchPad extends Block{ table.row(); table.label(() -> { - Sector dest = state.rules.sector == null ? null : state.rules.sector.info.getRealDestination(); + Sector dest = state.rules.sector == null ? null : state.rules.sector.info.destination; return Core.bundle.format("launch.destination", dest == null || !dest.hasBase() ? Core.bundle.get("sectors.nonelaunch") : @@ -161,7 +161,7 @@ public class LaunchPad extends Block{ @Override public void buildConfiguration(Table table){ //TODO: this UI should be on landing pads - if(!state.isCampaign() || net.client() || true){ + if(!state.isCampaign() || net.client()){ deselect(); return; } @@ -262,27 +262,23 @@ public class LaunchPad extends Block{ @Override public void remove(){ - if(!state.isCampaign()) return; + if(!state.isCampaign() || net.client()) return; - Sector destsec = state.rules.sector.info.getRealDestination(); + Sector destsec = state.rules.sector.info.destination; //actually launch the items upon removal - if(team() == state.rules.defaultTeam){ - if(destsec != null && (destsec != state.rules.sector || net.client())){ - ItemSeq dest = new ItemSeq(); + if(team() == state.rules.defaultTeam && destsec != null && destsec != state.rules.sector){ + ItemSeq dest = new ItemSeq(); - for(ItemStack stack : stacks){ - dest.add(stack); + for(ItemStack stack : stacks){ + dest.add(stack); - //update export - state.rules.sector.info.handleItemExport(stack); - Events.fire(new LaunchItemEvent(stack)); - } - - if(!net.client()){ - destsec.addItems(dest); - } + //update export statistics + state.rules.sector.info.handleItemExport(stack); + Events.fire(new LaunchItemEvent(stack)); } + + destsec.addItems(dest); } } } diff --git a/core/src/mindustry/world/blocks/sandbox/ItemSource.java b/core/src/mindustry/world/blocks/sandbox/ItemSource.java index 0a7461a7ec..28d42f86ec 100644 --- a/core/src/mindustry/world/blocks/sandbox/ItemSource.java +++ b/core/src/mindustry/world/blocks/sandbox/ItemSource.java @@ -88,6 +88,7 @@ public class ItemSource extends Block{ while(counter >= limit){ items.set(outputItem, 1); dump(outputItem); + produced(outputItem); items.set(outputItem, 0); counter -= limit; } diff --git a/core/src/mindustry/world/consumers/ConsumeLiquid.java b/core/src/mindustry/world/consumers/ConsumeLiquid.java index b1258f67d4..8d756cdbdc 100644 --- a/core/src/mindustry/world/consumers/ConsumeLiquid.java +++ b/core/src/mindustry/world/consumers/ConsumeLiquid.java @@ -12,7 +12,6 @@ import static mindustry.Vars.*; //TODO replace with ConsumeLiquids? public class ConsumeLiquid extends ConsumeLiquidBase{ public final Liquid liquid; - public boolean trigger; public ConsumeLiquid(Liquid liquid, float amount){ super(amount); @@ -23,10 +22,6 @@ public class ConsumeLiquid extends ConsumeLiquidBase{ this(null, 0f); } - public ConsumeLiquid trigger(boolean trigger){ - this.trigger = trigger; - return this; - } @Override public void apply(Block block){ @@ -44,13 +39,6 @@ public class ConsumeLiquid extends ConsumeLiquidBase{ build.liquids.remove(liquid, amount * build.edelta() * multiplier.get(build)); } - @Override - public void trigger(Building build){ - if(trigger){ - build.liquids.remove(liquid, amount); - } - } - @Override public float efficiency(Building build){ float ed = build.edelta() * build.efficiencyScale(); diff --git a/gradle.properties b/gradle.properties index c5d42ecc57..a6c6ea3647 100644 --- a/gradle.properties +++ b/gradle.properties @@ -26,4 +26,4 @@ org.gradle.caching=true org.gradle.internal.http.socketTimeout=100000 org.gradle.internal.http.connectionTimeout=100000 android.enableR8.fullMode=false -archash=4940b68158 +archash=99a42db331 From c6d82bec66f116fb6402e535057379e436462ff4 Mon Sep 17 00:00:00 2001 From: Anuken Date: Sun, 2 Feb 2025 10:54:51 -0500 Subject: [PATCH 117/460] Allowed drills to output multiple items per frame --- core/src/mindustry/world/blocks/production/Drill.java | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/core/src/mindustry/world/blocks/production/Drill.java b/core/src/mindustry/world/blocks/production/Drill.java index 0068ed4d65..64929d08fe 100644 --- a/core/src/mindustry/world/blocks/production/Drill.java +++ b/core/src/mindustry/world/blocks/production/Drill.java @@ -315,7 +315,10 @@ public class Drill extends Block{ } if(dominantItems > 0 && progress >= delay && items.total() < itemCapacity){ - offload(dominantItem); + int amount = (int)(progress / delay); + for(int i = 0; i < amount; i++){ + offload(dominantItem); + } progress %= delay; From 7aee34bafa6bae5a6c066613329dd7107418ab61 Mon Sep 17 00:00:00 2001 From: Anuken Date: Sun, 2 Feb 2025 18:10:15 -0500 Subject: [PATCH 118/460] Finalized launch pad mechanics --- .../campaign/advanced-launch-pad-light.png | Bin 0 -> 187 bytes .../campaign/advanced-launch-pad-pod.png | Bin 0 -> 1259 bytes .../blocks/campaign/advanced-launch-pad.png | Bin 0 -> 2782 bytes .../sprites/blocks/campaign/landing-pad.png | Bin 0 -> 2829 bytes core/assets/bundles/bundle.properties | 12 +- core/assets/icons/icons.properties | 2 + core/assets/logicids.dat | Bin 4694 -> 4728 bytes core/src/mindustry/content/Blocks.java | 11 +- core/src/mindustry/content/Fx.java | 22 ++ .../mindustry/content/SerpuloTechTree.java | 4 +- .../entities/effect/RadialEffect.java | 11 +- core/src/mindustry/game/SectorInfo.java | 49 ++-- core/src/mindustry/graphics/Pal.java | 3 +- .../mindustry/ui/dialogs/PlanetDialog.java | 2 +- .../world/blocks/campaign/LandingPad.java | 210 ++++++++++++++++-- .../world/blocks/campaign/LaunchPad.java | 28 ++- core/src/mindustry/world/meta/StatValues.java | 2 +- gradle.properties | 2 +- settings.gradle | 4 - 19 files changed, 310 insertions(+), 52 deletions(-) create mode 100644 core/assets-raw/sprites/blocks/campaign/advanced-launch-pad-light.png create mode 100644 core/assets-raw/sprites/blocks/campaign/advanced-launch-pad-pod.png create mode 100644 core/assets-raw/sprites/blocks/campaign/advanced-launch-pad.png create mode 100644 core/assets-raw/sprites/blocks/campaign/landing-pad.png diff --git a/core/assets-raw/sprites/blocks/campaign/advanced-launch-pad-light.png b/core/assets-raw/sprites/blocks/campaign/advanced-launch-pad-light.png new file mode 100644 index 0000000000000000000000000000000000000000..039c97f90992da673772cf57a10c55305d6daa0e GIT binary patch literal 187 zcmeAS@N?(olHy`uVBq!ia0y~yU`POA4mJh`hDS5XEf^RW7>k44ofy`glX=O&z))X##U|c*G3} z0ihiRJ5TP~Y`oce^YoepC-3du{{C(G=d$l<=FBfnoa{GOUs7>y`FwxR%!8k+<2^DD zK6rSpLBx5dTOI$?$M>$UnImQMdeRFejYW=oRa&{bay3l~ww%;hH=99pfyOudm!6Q7?39+60bEb*nZXP7YdSf2_z?``tBfb1!9$ z+zKgI>BEMa2U|TJEn^iB@LV_5bG{PSqeV=rON#`igb1;mn{-F(QrnNm_47SXp4qQ0I`7EB+$GzWaI^Ybeu;Q%0Ev1gyxKAo>5iav;K=~vTL55 zyynXk6N&eGgr3&?*n3HZT}yq^(u~g&RL(wf+`Z~!)n9#0-Hs{BdzaUS?6lglGCuIa zT=(tI>@V-}-6C_=aOf7%oMGJ15x)PiBB$qV1X)aodZFtiv(Rpj+?Zbm@lLa~IAx#h z)L*UYx%=|gW%(brPTH~Jl8;~?-?F0_Cr>tBQl2*ZdBf!uX+OD|`e(cEKXTVvoqdU& z#?+Ll%BmM_Hq^0t-VT_=JS&h#b*X5!^bM_*rqT>E-Gy%}on(A#^WyD2-=HV~T}>yx zMR!kK*L@mgwVy5b_#9{L@_9u^4~0%_xju2)3aWz?`L7& zr;dt~jPJKrzU_TFZAymxvPdDT+}&H{s!a0EWm6}3 zP2A%DDD7;_{6)5QUVJX^`MdTMs{E3AD7`{S`od%87n=_2EK;<6;&5KKVjk}+Rd$94 aBIiwid48RADusc8fx*+&&t;ucLK6V~Yd}!| literal 0 HcmV?d00001 diff --git a/core/assets-raw/sprites/blocks/campaign/advanced-launch-pad.png b/core/assets-raw/sprites/blocks/campaign/advanced-launch-pad.png new file mode 100644 index 0000000000000000000000000000000000000000..de14b807f84cb8b2209d94847f9234008cab2031 GIT binary patch literal 2782 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 { + color(Pal.accent); + stroke(e.fout() * 2f + 0.2f); + Lines.circle(e.x, e.y, e.fin() * 26f); + }), + explosion = new Effect(30, e -> { e.scaled(7, i -> { stroke(3f * i.fout()); @@ -1624,6 +1630,15 @@ public class Fx{ }); }), + steamCoolSmoke = new Effect(35f, e -> { + color(Pal.water, Color.lightGray, e.fin(Interp.pow2Out)); + alpha(e.fout(Interp.pow3Out)); + + randLenVectors(e.id, 4, e.finpow() * 7f, e.rotation, 30f, (x, y) -> { + Fill.circle(e.x + x, e.y + y, Math.max(e.fout(), Math.min(1f, e.fin() * 8f)) * 2.8f); + }); + }), + smokePuff = new Effect(30, e -> { color(e.color); @@ -2574,6 +2589,13 @@ public class Fx{ Fill.circle(e.x + Tmp.v1.x, e.y + Tmp.v1.y, 8f * rand.random(0.6f, 1f) * e.fout(0.2f)); }).layer(Layer.groundUnit + 1f), + podLandDust = new Effect(70f, e -> { + color(e.color, e.fout(0.1f)); + rand.setSeed(e.id); + Tmp.v1.trns(e.rotation, e.finpow() * 35f * rand.random(0.2f, 1f)); + Fill.circle(e.x + Tmp.v1.x, e.y + Tmp.v1.y, 5f * rand.random(0.6f, 1f) * e.fout(0.2f)); + }).layer(Layer.groundUnit + 1f), + unitShieldBreak = new Effect(35, e -> { if(!(e.data instanceof Unit unit)) return; diff --git a/core/src/mindustry/content/SerpuloTechTree.java b/core/src/mindustry/content/SerpuloTechTree.java index 989c3b043f..e791f67680 100644 --- a/core/src/mindustry/content/SerpuloTechTree.java +++ b/core/src/mindustry/content/SerpuloTechTree.java @@ -20,8 +20,10 @@ public class SerpuloTechTree{ node(junction, () -> { node(router, () -> { node(advancedLaunchPad, Seq.with(new SectorComplete(extractionOutpost)), () -> { - node(interplanetaryAccelerator, Seq.with(new SectorComplete(planetaryTerminal)), () -> { + node(landingPad, () -> { + node(interplanetaryAccelerator, Seq.with(new SectorComplete(planetaryTerminal)), () -> { + }); }); }); diff --git a/core/src/mindustry/entities/effect/RadialEffect.java b/core/src/mindustry/entities/effect/RadialEffect.java index 1ac37f172f..e6495c4b0f 100644 --- a/core/src/mindustry/entities/effect/RadialEffect.java +++ b/core/src/mindustry/entities/effect/RadialEffect.java @@ -8,7 +8,7 @@ import mindustry.entities.*; /** Renders one particle effect repeatedly at specified angle intervals. */ public class RadialEffect extends Effect{ public Effect effect = Fx.none; - public float rotationSpacing = 90f, rotationOffset = 0f; + public float rotationSpacing = 90f, rotationOffset = 0f, effectRotationOffset = 0f; public float lengthOffset = 0f; public int amount = 4; @@ -16,14 +16,19 @@ public class RadialEffect extends Effect{ clip = 100f; } - public RadialEffect(Effect effect, int amount, float spacing, float lengthOffset){ + public RadialEffect(Effect effect, int amount, float spacing, float lengthOffset, float effectRotationOffset){ this(); this.amount = amount; this.effect = effect; + this.effectRotationOffset = effectRotationOffset; this.rotationSpacing = spacing; this.lengthOffset = lengthOffset; } + public RadialEffect(Effect effect, int amount, float spacing, float lengthOffset){ + this(effect, amount, spacing, lengthOffset, 0f); + } + @Override public void create(float x, float y, float rotation, Color color, Object data){ if(!shouldCreate()) return; @@ -31,7 +36,7 @@ public class RadialEffect extends Effect{ rotation += rotationOffset; for(int i = 0; i < amount; i++){ - effect.create(x + Angles.trnsx(rotation, lengthOffset), y + Angles.trnsy(rotation, lengthOffset), rotation, color, data); + effect.create(x + Angles.trnsx(rotation, lengthOffset), y + Angles.trnsy(rotation, lengthOffset), rotation + effectRotationOffset, color, data); rotation += rotationSpacing; } } diff --git a/core/src/mindustry/game/SectorInfo.java b/core/src/mindustry/game/SectorInfo.java index 2ccb9cd3f2..8673e8206d 100644 --- a/core/src/mindustry/game/SectorInfo.java +++ b/core/src/mindustry/game/SectorInfo.java @@ -30,6 +30,9 @@ public class SectorInfo{ public ObjectMap rawProduction = new ObjectMap<>(); /** Export statistics. */ public ObjectMap export = new ObjectMap<>(); + //TODO: there is an obvious exploit with launch pad redirection here; pads can be redirected after leaving a sector, which doesn't update calculations. + /** Import statistics, based on what launch pads are actually receiving. TODO: this is not actually used or displayed anywhere (yet) */ + public ObjectMap imports = new ObjectMap<>(); /** Items stored in all cores. */ public ItemSeq items = new ItemSeq(); /** The best available core type. */ @@ -118,10 +121,20 @@ public class SectorInfo{ export.get(item, ExportStat::new).counter += amount; } + /** Updates import statistics. */ + public void handleItemImport(Item item, int amount){ + imports.get(item, ExportStat::new).counter += amount; + } + public float getExport(Item item){ return export.get(item, ExportStat::new).mean; } + public boolean hasExport(Item item){ + var exp = export.get(item); + return exp != null && exp.mean > 0f; + } + public void refreshImportRates(Planet planet){ if(importRateCache == null || importRateCache.length != content.items().size){ importRateCache = new float[content.items().size]; @@ -140,7 +153,7 @@ public class SectorInfo{ return importRateCache; } - /** @return the import rate of an item as item/second. */ + /** @return the import rate of an item as item/second. This is the *raw* max import rate, not what landing pads are actually using. */ public float getImportRate(Planet planet, Item item){ return getImportRates(planet)[item.id]; } @@ -239,19 +252,8 @@ public class SectorInfo{ //refresh throughput if(time.get(refreshPeriod)){ - //refresh export - export.each((item, stat) -> { - //initialize stat after loading - if(!stat.loaded){ - stat.means.fill(stat.mean); - stat.loaded = true; - } - - //add counter, subtract how many items were taken from the core during this time - stat.means.add(Math.max(stat.counter, 0)); - stat.counter = 0; - stat.mean = stat.means.rawMean(); - }); + updateStats(export); + updateStats(imports); if(coreDeltas == null) coreDeltas = new int[content.items().size]; if(productionDeltas == null) productionDeltas = new int[content.items().size]; @@ -268,6 +270,11 @@ public class SectorInfo{ //export can, at most, be the raw items being produced from factories + the items being taken from the core export.get(item).mean = Math.min(export.get(item).mean, rawProduction.get(item).mean + Math.max(-production.get(item).mean, 0)); } + + if(imports.containsKey(item)){ + //import can't exceed max import rate + imports.get(item).mean = Math.min(imports.get(item).mean, getImportRate(state.getPlanet(), item)); + } } Arrays.fill(coreDeltas, 0); @@ -275,6 +282,20 @@ public class SectorInfo{ } } + void updateStats(ObjectMap map){ + map.each((item, stat) -> { + //initialize stat after loading + if(!stat.loaded){ + stat.means.fill(stat.mean); + stat.loaded = true; + } + + stat.means.add(Math.max(stat.counter, 0)); + stat.counter = 0; + stat.mean = stat.means.rawMean(); + }); + } + void updateDelta(Item item, ObjectMap map, int[] deltas){ ExportStat stat = map.get(item, ExportStat::new); if(!stat.loaded){ diff --git a/core/src/mindustry/graphics/Pal.java b/core/src/mindustry/graphics/Pal.java index 9b56be524b..ba63dcdb68 100644 --- a/core/src/mindustry/graphics/Pal.java +++ b/core/src/mindustry/graphics/Pal.java @@ -5,6 +5,7 @@ import arc.graphics.*; public class Pal{ public static Color + water = Color.valueOf("596ab8"), darkOutline = Color.valueOf("2d2f39"), thoriumPink = Color.valueOf("f9a3c7"), coalBlack = Color.valueOf("272727"), @@ -107,7 +108,7 @@ public class Pal{ redderDust = Color.valueOf("ff7b69"), plasticSmoke = Color.valueOf("f1e479"), - + adminChat = Color.valueOf("ff4000"), neoplasmOutline = Color.valueOf("2e191d"), diff --git a/core/src/mindustry/ui/dialogs/PlanetDialog.java b/core/src/mindustry/ui/dialogs/PlanetDialog.java index 55b564047f..c078fc36ac 100644 --- a/core/src/mindustry/ui/dialogs/PlanetDialog.java +++ b/core/src/mindustry/ui/dialogs/PlanetDialog.java @@ -962,7 +962,7 @@ public class PlanetDialog extends BaseDialog implements PlanetInterfaceRenderer{ //import if(sector.hasBase()){ - displayItems(c, 1f, sector.info.importStats(sector.planet), "@sectors.import", t -> { + displayItems(c, 1f, sector.info.imports, "@sectors.import", t -> { sector.info.eachImport(sector.planet, other -> { String ic = other.iconChar(); t.add(Iconc.rightOpen + " " + (ic == null || ic.isEmpty() ? "" : ic + " ") + other.name()).padLeft(10f).row(); diff --git a/core/src/mindustry/world/blocks/campaign/LandingPad.java b/core/src/mindustry/world/blocks/campaign/LandingPad.java index 676c204916..9b7cd5dfbd 100644 --- a/core/src/mindustry/world/blocks/campaign/LandingPad.java +++ b/core/src/mindustry/world/blocks/campaign/LandingPad.java @@ -1,6 +1,8 @@ package mindustry.world.blocks.campaign; import arc.*; +import arc.graphics.*; +import arc.graphics.g2d.*; import arc.math.*; import arc.scene.ui.layout.*; import arc.struct.*; @@ -8,6 +10,7 @@ import arc.util.*; import arc.util.io.*; import mindustry.annotations.Annotations.*; import mindustry.content.*; +import mindustry.entities.*; import mindustry.game.EventType.*; import mindustry.gen.*; import mindustry.graphics.*; @@ -16,6 +19,7 @@ import mindustry.type.*; import mindustry.ui.*; import mindustry.world.*; import mindustry.world.blocks.*; +import mindustry.world.blocks.liquid.*; import mindustry.world.consumers.*; import mindustry.world.meta.*; @@ -32,10 +36,19 @@ public class LandingPad extends Block{ }); } - public float cooldownTime = 12f; + public @Load(value = "@-pod", fallback = "advanced-launch-pad-pod") TextureRegion podRegion; + public float arrivalDuration = 150f; + public float cooldownTime = 180f; public float consumeLiquidAmount = 100f; public Liquid consumeLiquid = Liquids.water; + public Effect landEffect = Fx.podLandShockwave; + public Effect coolingEffect = Fx.none; + public float coolingEffectChance = 0.2f; + + public float liquidPad = 2f; + public Color bottomColor = Pal.darkerMetal; + public LandingPad(String name){ super(name); @@ -45,6 +58,8 @@ public class LandingPad extends Block{ update = true; configurable = true; acceptsItems = false; + emitLight = true; + lightRadius = 90f; config(Item.class, (LandingPadBuild build, Item item) -> build.config = item); configClear((LandingPadBuild build) -> build.config = null); @@ -97,21 +112,19 @@ public class LandingPad extends Block{ public @Nullable Item config; //priority collisions are possible, but should be extremely rare public int priority = Mathf.rand.nextInt(); - public float cooldown = 0f; + public float cooldown = 0f, landParticleTimer; + public float arrivingTimer = 0f; + public @Nullable Item arriving; + public float liquidRemoved; public void handleLanding(){ if(!state.isCampaign() || config == null) return; - //TODO animation, etc cooldown = 1f; - items.set(config, itemCapacity); - liquids.remove(consumeLiquid, consumeLiquidAmount); - for(int i = 0; i < 10; i++){ - Fx.steam.at(this); - } - //TODO this is a temporary effect - Fx.shockwave.at(this); + arriving = config; + arrivingTimer = 0f; + liquidRemoved = 0f; state.rules.sector.info.importCooldownTimers.put(config, 0f); } @@ -128,6 +141,9 @@ public class LandingPad extends Block{ float framesBetweenArrival = itemCapacity / importedPerFrame; state.rules.sector.info.importCooldownTimers.increment(item, 0f, 1f / framesBetweenArrival * Time.delta); + }else{ + //nothing is being imported, so reset the timer + state.rules.sector.info.importCooldownTimers.put(item, 0f); } } @@ -140,32 +156,144 @@ public class LandingPad extends Block{ Call.landingPadLanded(first.tile); - //swap priorities, moving this block to the end of the list (if there is only one block waiting, this does nothing) var tmp = first.priority; first.priority = head.priority; head.priority = tmp; - pads.clear(); } }); } } + @Override + public void draw(){ + if(consumeLiquid != null){ + Draw.color(bottomColor); + Fill.square(x, y, size * tilesize/2f - liquidPad); + Draw.color(); + LiquidBlock.drawTiledFrames(block.size, x, y, liquidPad, liquidPad, liquidPad, liquidPad, consumeLiquid, liquids.get(consumeLiquid) / liquidCapacity); + } + + super.draw(); + + if(arriving != null){ + float fin = Mathf.clamp(arrivingTimer), fout = 1f - fin; + float alpha = Interp.pow5Out.apply(fin); + float scale = (1f - alpha) * 1.3f + 1f; + float + cx = x, + cy = y + Interp.pow4In.apply(fout) * (100f + Mathf.randomSeedRange(id() + 2, 30f)); + + float rotation = fout * (90f + Mathf.randomSeedRange(id(), 50f)); + + Draw.z(Layer.effect + 0.001f); + + Draw.color(Pal.engine); + + float rad = 0.15f + Interp.pow5Out.apply(Mathf.slope(fin)); + + Fill.light(cx, cy, 10, 25f * (rad + scale-1f), Tmp.c2.set(Pal.engine).a(alpha), Tmp.c1.set(Pal.engine).a(0f)); + + Draw.alpha(alpha); + for(int i = 0; i < 4; i++){ + Drawf.tri(cx, cy, 6f, 40f * (rad + scale-1f), i * 90f + rotation); + } + + Draw.color(); + + Draw.z(Layer.weather - 1); + + scale *= podRegion.scl(); + float rw = podRegion.width * scale, rh = podRegion.height * scale; + + Draw.alpha(alpha); + Drawf.shadow(cx, cy, size * tilesize, fin); + Draw.rect(podRegion, cx, cy, rw, rh, rotation); + + Tmp.v1.trns(225f, Interp.pow3In.apply(fout) * 250f); + + Draw.z(Layer.flyingUnit + 1); + Draw.color(0, 0, 0, 0.22f * alpha); + + Draw.rect(podRegion, cx + Tmp.v1.x, cy + Tmp.v1.y, rw, rh, rotation); + + }else if(cooldown > 0f){ + + Drawf.shadow(x, y, size * tilesize, cooldown); + Draw.alpha(cooldown); + Draw.mixcol(Pal.accent, 1f - cooldown); + Draw.rect(podRegion, x, y); + } + + Draw.reset(); + } + + @Override + public void drawLight(){ + Drawf.light(x, y, lightRadius, Pal.accent, Mathf.clamp(Math.max(cooldown, arrivingTimer * 1.5f))); + } + @Override public void updateTile(){ updateTimers(); + if(arriving != null){ + if(!headless){ //pod particles + float fin = arrivingTimer; + float tsize = Interp.pow5Out.apply(fin); + + landParticleTimer += tsize * Time.delta / 2f; + if(landParticleTimer >= 1f){ + tile.getLinkedTiles(t -> { + if(Mathf.chance(0.1f)){ + Fx.podLandDust.at(t.worldx(), t.worldy(), angleTo(t.worldx(), t.worldy()) + Mathf.range(30f), Tmp.c1.set(t.floor().mapColor).mul(1.5f + Mathf.range(0.15f))); + } + }); + + landParticleTimer = 0f; + } + } + + arrivingTimer += Time.delta / arrivalDuration; + + float toRemove = Math.min(consumeLiquidAmount / arrivalDuration * Time.delta, consumeLiquidAmount - liquidRemoved); + liquidRemoved += toRemove; + + liquids.remove(consumeLiquid, toRemove); + + if(Mathf.chanceDelta(coolingEffectChance * Interp.pow5Out.apply(arrivingTimer))){ + coolingEffect.at(this); + } + + if(arrivingTimer >= 1f){ + //remove any leftovers to make sure it's precise + liquids.remove(consumeLiquid, consumeLiquidAmount - liquidRemoved); + + landEffect.at(this); + Effect.shake(3f, 3f, this); + + items.set(arriving, itemCapacity); + state.getSector().info.handleItemImport(arriving, itemCapacity); + + arriving = null; + arrivingTimer = 0f; + } + } + if(items.total() > 0){ dumpAccumulate(config == null || items.get(config) != items.total() ? null : config); } + if(arriving == null){ + cooldown -= delta() / cooldownTime; + cooldown = Mathf.clamp(cooldown); + } + if(config != null && state.isCampaign()){ - cooldown -= delta() / cooldownTime; - - if(cooldown <= 0f && efficiency > 0f && items.total() == 0 && state.rules.sector.info.importCooldownTimers.get(config, 0f) >= 1f){ + if(cooldown <= 0f && efficiency > 0f && items.total() == 0 && state.rules.sector.info.getImportRate(state.getPlanet(), config) > 0f && state.rules.sector.info.importCooldownTimers.get(config, 0f) >= 1f){ //queue landing for next frame waiting.get(config, Seq::new).add(this); @@ -184,6 +312,58 @@ public class LandingPad extends Block{ @Override public void buildConfiguration(Table table){ ItemSelection.buildTable(LandingPad.this, table, content.items(), () -> config, this::configure, selectionRows, selectionColumns); + + if(!net.client()){ + table.row(); + + table.table(t -> { + t.background(Styles.black6); + + t.button(Icon.downOpen, Styles.clearNonei, 40f, () -> { + if(config != null && state.isCampaign()){ + for(Sector sector : state.getPlanet().sectors){ + if(sector.hasBase() && sector != state.getSector() && sector.info.destination != state.getSector() && sector.info.hasExport(config)){ + sector.info.destination = state.getSector(); + sector.saveInfo(); + } + } + state.getSector().info.refreshImportRates(state.getPlanet()); + } + }).disabled(b -> config == null || !state.isCampaign() || (!state.getPlanet().sectors.contains(s -> s.hasBase() && s.info.hasExport(config) && s.info.destination != state.getSector()))) + .tooltip("@sectors.redirect").get(); + }).fillX().left(); + } + } + + @Override + public void display(Table table){ + super.display(table); + + if(!state.isCampaign() || net.client() || team != player.team()) return; + + table.row(); + table.label(() -> { + if(config == null || !state.isCampaign()){ + return ""; + } + int sources = 0; + float perSecond = 0f; + for(var s : state.getPlanet().sectors){ + if(s != state.getSector() && s.hasBase() && s.info.destination == state.getSector()){ + float amount = s.info.getExport(config); + if(amount > 0){ + sources ++; + perSecond += s.info.getExport(config); + } + } + } + + String str = Core.bundle.format("landing.sources", sources == 0 ? Core.bundle.get("none") : sources); + if(perSecond > 0){ + str += "\n" + Core.bundle.format("landing.import", config.emoji(), (int)(perSecond * 60f)); + } + return str; + }).pad(4).wrap().width(200f).left(); } @Override diff --git a/core/src/mindustry/world/blocks/campaign/LaunchPad.java b/core/src/mindustry/world/blocks/campaign/LaunchPad.java index 1f63f5a17a..cb2014ee98 100644 --- a/core/src/mindustry/world/blocks/campaign/LaunchPad.java +++ b/core/src/mindustry/world/blocks/campaign/LaunchPad.java @@ -22,6 +22,7 @@ import mindustry.logic.*; import mindustry.type.*; import mindustry.ui.*; import mindustry.world.*; +import mindustry.world.blocks.liquid.*; import mindustry.world.meta.*; import static mindustry.Vars.*; @@ -36,6 +37,13 @@ public class LaunchPad extends Block{ public Color lightColor = Color.valueOf("eab678"); public boolean acceptMultipleItems = false; + public float lightStep = 1f; + public int lightSteps = 3; + + public float liquidPad = 2f; + public @Nullable Liquid drawLiquid; + public Color bottomColor = Pal.darkerMetal; + public LaunchPad(String name){ super(name); hasItems = true; @@ -87,6 +95,13 @@ public class LaunchPad extends Block{ @Override public void draw(){ + if(hasLiquids && drawLiquid != null){ + Draw.color(bottomColor); + Fill.square(x, y, size * tilesize/2f - liquidPad); + Draw.color(); + LiquidBlock.drawTiledFrames(block.size, x, y, liquidPad, liquidPad, liquidPad, liquidPad, drawLiquid, liquids.get(drawLiquid) / liquidCapacity); + } + super.draw(); if(!state.isCampaign()) return; @@ -94,13 +109,11 @@ public class LaunchPad extends Block{ if(lightRegion.found()){ Draw.color(lightColor); float progress = Math.min((float)items.total() / itemCapacity, launchCounter / launchTime); - int steps = 3; - float step = 1f; for(int i = 0; i < 4; i++){ - for(int j = 0; j < steps; j++){ - float alpha = Mathf.curve(progress, (float)j / steps, (j+1f) / steps); - float offset = -(j - 1f) * step; + for(int j = 0; j < lightSteps; j++){ + float alpha = Mathf.curve(progress, (float)j / lightSteps, (j+1f) / lightSteps); + float offset = -(j - 1f) * lightStep; Draw.color(Pal.metalGrayDark, lightColor, alpha); Draw.rect(lightRegion, x + Geometry.d8edge(i).x * offset, y + Geometry.d8edge(i).y * offset, i * 90); @@ -110,6 +123,7 @@ public class LaunchPad extends Block{ Draw.reset(); } + Drawf.shadow(x, y, size * tilesize); Draw.rect(podRegion, x, y); Draw.reset(); @@ -169,7 +183,11 @@ public class LaunchPad extends Block{ table.button(Icon.upOpen, Styles.cleari, () -> { ui.planet.showSelect(state.rules.sector, other -> { if(state.isCampaign() && other.planet == state.rules.sector.planet){ + var prev = state.rules.sector.info.destination; state.rules.sector.info.destination = other; + if(prev != null){ + prev.info.refreshImportRates(state.getPlanet()); + } } }); deselect(); diff --git a/core/src/mindustry/world/meta/StatValues.java b/core/src/mindustry/world/meta/StatValues.java index d0be047ebc..8547834614 100644 --- a/core/src/mindustry/world/meta/StatValues.java +++ b/core/src/mindustry/world/meta/StatValues.java @@ -150,7 +150,7 @@ public class StatValues{ t.add(Strings.autoFixed(amount, 2)).style(Styles.outlineLabel); add(t); } - }}).size(iconMed).padRight(3 + (amount != 0 && Strings.autoFixed(amount, 2).length() > 2 ? 8 : 0)).with(s -> withTooltip(s, liquid, false)); + }}).size(iconMed).padRight(3 + (amount != 0 ? (Strings.autoFixed(amount, 2).length() - 1) * 10 : 0)).with(s -> withTooltip(s, liquid, false)); if(perSecond && amount != 0){ t.add(StatUnit.perSecond.localized()).padLeft(2).padRight(5).color(Color.lightGray).style(Styles.outlineLabel); diff --git a/gradle.properties b/gradle.properties index a6c6ea3647..04720cf292 100644 --- a/gradle.properties +++ b/gradle.properties @@ -26,4 +26,4 @@ org.gradle.caching=true org.gradle.internal.http.socketTimeout=100000 org.gradle.internal.http.connectionTimeout=100000 android.enableR8.fullMode=false -archash=99a42db331 +archash=c8004178c4 diff --git a/settings.gradle b/settings.gradle index dafd6bdf99..b18346f652 100644 --- a/settings.gradle +++ b/settings.gradle @@ -15,10 +15,6 @@ if(new File(settingsDir, 'local.properties').exists()){ if(System.getenv("JITPACK") == "true") hasSdk = false if(hasSdk){ - //hack: pretend the Android module doesn't exist when imported through IntelliJ - //why? because IntelliJ chokes on the new version of the Android plugin - - //UPDATE: it no longer chokes on AGP with the latest version, but instead gives a completely different error. brilliant. include 'android' }else{ println("No Android SDK found. Skipping Android module.") From bb9baa650e255ffe1aa9f7f74c5130f1e8f88043 Mon Sep 17 00:00:00 2001 From: Github Actions Date: Sun, 2 Feb 2025 23:12:00 +0000 Subject: [PATCH 119/460] Automatic bundle update --- core/assets/bundles/bundle_be.properties | 9 ++++++++- core/assets/bundles/bundle_bg.properties | 9 ++++++++- core/assets/bundles/bundle_ca.properties | 9 ++++++++- core/assets/bundles/bundle_cs.properties | 9 ++++++++- core/assets/bundles/bundle_da.properties | 9 ++++++++- core/assets/bundles/bundle_de.properties | 9 ++++++++- core/assets/bundles/bundle_es.properties | 9 ++++++++- core/assets/bundles/bundle_et.properties | 9 ++++++++- core/assets/bundles/bundle_eu.properties | 9 ++++++++- core/assets/bundles/bundle_fi.properties | 9 ++++++++- core/assets/bundles/bundle_fil.properties | 9 ++++++++- core/assets/bundles/bundle_fr.properties | 9 ++++++++- core/assets/bundles/bundle_hu.properties | 9 ++++++++- core/assets/bundles/bundle_id_ID.properties | 9 ++++++++- core/assets/bundles/bundle_it.properties | 9 ++++++++- core/assets/bundles/bundle_ja.properties | 9 ++++++++- core/assets/bundles/bundle_ko.properties | 9 ++++++++- core/assets/bundles/bundle_lt.properties | 9 ++++++++- core/assets/bundles/bundle_nl.properties | 9 ++++++++- core/assets/bundles/bundle_nl_BE.properties | 9 ++++++++- core/assets/bundles/bundle_pl.properties | 9 ++++++++- core/assets/bundles/bundle_pt_BR.properties | 9 ++++++++- core/assets/bundles/bundle_pt_PT.properties | 9 ++++++++- core/assets/bundles/bundle_ro.properties | 9 ++++++++- core/assets/bundles/bundle_ru.properties | 9 ++++++++- core/assets/bundles/bundle_sr.properties | 9 ++++++++- core/assets/bundles/bundle_sv.properties | 9 ++++++++- core/assets/bundles/bundle_th.properties | 9 ++++++++- core/assets/bundles/bundle_tk.properties | 9 ++++++++- core/assets/bundles/bundle_tr.properties | 9 ++++++++- core/assets/bundles/bundle_uk_UA.properties | 9 ++++++++- core/assets/bundles/bundle_vi.properties | 9 ++++++++- core/assets/bundles/bundle_zh_CN.properties | 9 ++++++++- core/assets/bundles/bundle_zh_TW.properties | 9 ++++++++- 34 files changed, 272 insertions(+), 34 deletions(-) diff --git a/core/assets/bundles/bundle_be.properties b/core/assets/bundles/bundle_be.properties index c473fdbb3c..6310fc1e39 100644 --- a/core/assets/bundles/bundle_be.properties +++ b/core/assets/bundles/bundle_be.properties @@ -714,6 +714,8 @@ addall = Дадаць всё launch.from = Запуск Ад: [accent]{0} launch.capacity = Ёмістасць Прадметаў Да Запуску: [accent]{0} launch.destination = Кропка Прызначэння: {0} +landing.sources = Source Sectors: [accent]{0}[] +landing.import = Max Total Import: {0}[accent]{1}[lightgray]/min configure.invalid = Колькасць павінна быць лікам паміж 0 і {0}. add = Дадаць... guardian = Вартаўнік @@ -754,6 +756,7 @@ sectors.launch = Запусціць sectors.select = Выбраць sectors.launchselect = Select Launch Destination sectors.nonelaunch = [lightgray]нічога (sun) +sectors.redirect = Redirect Launch Pads sectors.rename = Пераназваць Сектар sectors.enemybase = [scarlet]Варожая База sectors.vulnerable = [scarlet]Уразлівы @@ -1709,6 +1712,8 @@ block.meltdown.name = Іспепяліцель block.foreshadow.name = Прадвесце block.container.name = Кантэйнер block.launch-pad.name = Пускавая пляцоўка +block.advanced-launch-pad.name = Launch Pad +block.landing-pad.name = Landing Pad block.segment.name = Сегмент block.ground-factory.name = Завод наземных адзінак block.air-factory.name = Завод паветраных адзінак @@ -2147,7 +2152,9 @@ block.vault.description = Захоўвае вялікая колькасць п block.container.description = Захоўвае невялікая колькасць прадметаў кожнага тыпу. Блок разгрузчка можа быць выкарыстаны для здабывання прадметаў з кантэйнера. block.unloader.description = Выгружае прадметы з любога нетранспортного блока. Тып прадмета, які неабходна выгрузіць, можна змяніць націскам. block.launch-pad.description = Запускае партыі прадметаў без неабходнасці запуску ядра. -block.launch-pad.details = Sub-orbital system for point-to-point transportation of resources. Payload pods are fragile and incapable of surviving re-entry. +block.advanced-launch-pad.description = Launches batches of items to selected sectors. Only accepts one item type at a time. +block.advanced-launch-pad.details = Sub-orbital system for point-to-point transportation of resources. +block.landing-pad.description = Receives items from launch pads in other sectors. Requires large amounts of water to protect against impacts of landings. block.duo.description = Маленькая, танная турэль. Карысная супраць наземных юнітаў. block.scatter.description = Асноўная супрацьпаветраная турэль. Распыляе кавалкі свінцу або металалому на варожыя падраздзялення. block.scorch.description = Спальваеце любых наземных ворагаў побач з ім. Высокаэфектыўны на блізкай адлегласці. diff --git a/core/assets/bundles/bundle_bg.properties b/core/assets/bundles/bundle_bg.properties index bcc42a6fb2..7fdd12a0ee 100644 --- a/core/assets/bundles/bundle_bg.properties +++ b/core/assets/bundles/bundle_bg.properties @@ -721,6 +721,8 @@ addall = Добави Всички launch.from = Изстреляй от: [accent]{0} launch.capacity = Launching Item Capacity: [accent]{0} launch.destination = Цел: {0} +landing.sources = Source Sectors: [accent]{0}[] +landing.import = Max Total Import: {0}[accent]{1}[lightgray]/min configure.invalid = Количеството трябва да е между 0 и {0}. add = Добави... guardian = Guardian @@ -761,6 +763,7 @@ sectors.launch = Изстреляй sectors.select = Избери sectors.launchselect = Select Launch Destination sectors.nonelaunch = [lightgray]няма (Слънцето) +sectors.redirect = Redirect Launch Pads sectors.rename = Преименувай Зоната sectors.enemybase = [scarlet]Вражеска база sectors.vulnerable = [scarlet]Уязвима @@ -1720,6 +1723,8 @@ block.meltdown.name = Разтопител block.foreshadow.name = Предвестител block.container.name = Контейнер block.launch-pad.name = Изстрелваща Площадка +block.advanced-launch-pad.name = Launch Pad +block.landing-pad.name = Landing Pad block.segment.name = Сегмент block.ground-factory.name = Наземна Фабрика block.air-factory.name = Въздушна Фабрика @@ -2159,7 +2164,9 @@ block.vault.description = Съхранява голямо количество block.container.description = Съхранява малко количество материали от всеки тип. Съдържанието може да бъде достъпено чрез разтоварач. block.unloader.description = Разтоварва избран материал от близки блокове. block.launch-pad.description = Изстрелва патриди от елементи в избраните сектори. -block.launch-pad.details = Sub-orbital system for point-to-point transportation of resources. Payload pods are fragile and incapable of surviving re-entry. +block.advanced-launch-pad.description = Launches batches of items to selected sectors. Only accepts one item type at a time. +block.advanced-launch-pad.details = Sub-orbital system for point-to-point transportation of resources. +block.landing-pad.description = Receives items from launch pads in other sectors. Requires large amounts of water to protect against impacts of landings. block.duo.description = Изстрелва редуващи се куршуми по враговете. block.scatter.description = Изстрелва топки олово, скрап или метастъкло на съчми срещу вражески въздушни единици. block.scorch.description = Изгаря всички наземни врагове в близост. Висока ефективност от близко разстояние. diff --git a/core/assets/bundles/bundle_ca.properties b/core/assets/bundles/bundle_ca.properties index 3487168154..f7e67e49e7 100644 --- a/core/assets/bundles/bundle_ca.properties +++ b/core/assets/bundles/bundle_ca.properties @@ -725,6 +725,8 @@ addall = Afegeix-ho tot launch.from = Llançant des de [accent]{0}. launch.capacity = Capacitat de càrrega per llançament: [accent]{0} launch.destination = Destinació: {0} +landing.sources = Source Sectors: [accent]{0}[] +landing.import = Max Total Import: {0}[accent]{1}[lightgray]/min configure.invalid = La quantitat ha de ser un nombre entre 0 i {0}. add = Afegeix guardian = Guardià @@ -765,6 +767,7 @@ sectors.launch = Llança sectors.select = Selecciona sectors.launchselect = Select Launch Destination sectors.nonelaunch = [lightgray]cap (sol) +sectors.redirect = Redirect Launch Pads sectors.rename = Reanomena el sector sectors.enemybase = [scarlet]Base enemiga sectors.vulnerable = [scarlet]Vulnerable @@ -1727,6 +1730,8 @@ block.meltdown.name = Meltdown block.foreshadow.name = Foreshadow block.container.name = Contenidor block.launch-pad.name = Plataforma de llançament +block.advanced-launch-pad.name = Launch Pad +block.landing-pad.name = Landing Pad block.segment.name = Segment block.ground-factory.name = Fàbrica d’unitats terrestres block.air-factory.name = Fàbrica d’unitats aèries @@ -2169,7 +2174,9 @@ block.vault.description = Emmagatzema una quantitat gran d’elements de cada ti block.container.description = Emmagatzema una quantitat petita d’elements de cada tipus. Millora la capacitat d’emmagatzemament al sector si es situa al costat d’un nucli. Es poden recuperar els continguts amb un descarregador. block.unloader.description = Descarrega els elements seleccionats dels blocs adjacents. block.launch-pad.description = Llança lots d’elements al sector seleccionat. -block.launch-pad.details = Sistema suborbital de transport de recursos punt a punt. Les càpsules de càrrega només sobreviuen una sola reentrada i no es poden reutilitzar. +block.advanced-launch-pad.description = Launches batches of items to selected sectors. Only accepts one item type at a time. +block.advanced-launch-pad.details = Sub-orbital system for point-to-point transportation of resources. +block.landing-pad.description = Receives items from launch pads in other sectors. Requires large amounts of water to protect against impacts of landings. block.duo.description = Dispara munició als enemics. block.scatter.description = Dispara projectils antiaeris de plom, ferralla o metavidre a les aeronaus enemigues. block.scorch.description = Crema els enemics terrestres que tingui a prop. La torreta és molt efectiva a distàncies curtes. diff --git a/core/assets/bundles/bundle_cs.properties b/core/assets/bundles/bundle_cs.properties index d480d5c96a..63e5a32443 100644 --- a/core/assets/bundles/bundle_cs.properties +++ b/core/assets/bundles/bundle_cs.properties @@ -723,6 +723,8 @@ addall = Přidat vše launch.from = Vysláno z: [accent]{0} launch.capacity = Odpalovací kapacita: [accent]{0} launch.destination = Cíl: {0} +landing.sources = Source Sectors: [accent]{0}[] +landing.import = Max Total Import: {0}[accent]{1}[lightgray]/min configure.invalid = Hodnota musí být číslo mezi 0 a {0}. add = Přidat... guardian = Strážce @@ -763,6 +765,7 @@ sectors.launch = Vyslat sectors.select = Vybrat sectors.launchselect = Select Launch Destination sectors.nonelaunch = [lightgray]bez (slunce)[] +sectors.redirect = Redirect Launch Pads sectors.rename = Přejmenovat sektor sectors.enemybase = [scarlet]Nepřátelská základna sectors.vulnerable = [scarlet]Zranitelný @@ -1724,6 +1727,8 @@ block.meltdown.name = Rozpékač block.foreshadow.name = Znamení osudu block.container.name = Kontejnér block.launch-pad.name = Vysílací plošina +block.advanced-launch-pad.name = Launch Pad +block.landing-pad.name = Landing Pad block.segment.name = Úsek block.ground-factory.name = Pozemní továrna block.air-factory.name = Letecká továrna @@ -2164,7 +2169,9 @@ block.vault.description = Ukládá velké množství předmětů od každého ty block.container.description = Ukládá menší množství předmětů od každého typu. K vyskladnění věcí z kontejneru je možné použít odbavovač. block.unloader.description = Vyskladňuje vybrané položky z okolních bloků. block.launch-pad.description = Vysílá dávky předmětů do přilehlých sektorů. -block.launch-pad.details = Sub-orbital system for point-to-point transportation of resources. Payload pods are fragile and incapable of surviving re-entry. +block.advanced-launch-pad.description = Launches batches of items to selected sectors. Only accepts one item type at a time. +block.advanced-launch-pad.details = Sub-orbital system for point-to-point transportation of resources. +block.landing-pad.description = Receives items from launch pads in other sectors. Requires large amounts of water to protect against impacts of landings. block.duo.description = Střílí střídavé dávky kulek na nepřátele. block.scatter.description = Střílí kusy olova, pláty šrotu nebo střepy metaskla na nepřátelské letectvo. block.scorch.description = Sežehne pozemní jednotky blízkosti. Velmi efektivní na malé vzdálenosti. diff --git a/core/assets/bundles/bundle_da.properties b/core/assets/bundles/bundle_da.properties index 47e96ad136..bc36d38ecb 100644 --- a/core/assets/bundles/bundle_da.properties +++ b/core/assets/bundles/bundle_da.properties @@ -715,6 +715,8 @@ addall = Tilføj alle launch.from = Launching From: [accent]{0} launch.capacity = Launching Item Capacity: [accent]{0} launch.destination = Destination: {0} +landing.sources = Source Sectors: [accent]{0}[] +landing.import = Max Total Import: {0}[accent]{1}[lightgray]/min configure.invalid = Mængde skal være mellem 0 og {0}. add = Tilføj... guardian = Guardian @@ -755,6 +757,7 @@ sectors.launch = Affyr sectors.select = Vælg sectors.launchselect = Select Launch Destination sectors.nonelaunch = [lightgray]ingen (solen) +sectors.redirect = Redirect Launch Pads sectors.rename = Omdøb sektor sectors.enemybase = [scarlet]Enemy Base sectors.vulnerable = [scarlet]Vulnerable @@ -1711,6 +1714,8 @@ block.meltdown.name = Meltdown block.foreshadow.name = Foreshadow block.container.name = Beholder block.launch-pad.name = Affyringsrampe +block.advanced-launch-pad.name = Launch Pad +block.landing-pad.name = Landing Pad block.segment.name = Segment block.ground-factory.name = Fodgænger-fabrik block.air-factory.name = Flyver-fabrik @@ -2147,7 +2152,9 @@ block.vault.description = Opbevarer en masse genstande. En aflæsser-blok kan br block.container.description = Opbevarer en lille mængde genstande. En aflæsser-blok kan bruges til at hive ting ud af en container. block.unloader.description = Aflæsser genstande fra sidestående blokke. Typen af blok, der skal aflæsses kan justeres. block.launch-pad.description = Affyrer samlinger af genstande løbende. Kræver ikke affyring af kernen. -block.launch-pad.details = Sub-orbital system for point-to-point transportation of resources. Payload pods are fragile and incapable of surviving re-entry. +block.advanced-launch-pad.description = Launches batches of items to selected sectors. Only accepts one item type at a time. +block.advanced-launch-pad.details = Sub-orbital system for point-to-point transportation of resources. +block.landing-pad.description = Receives items from launch pads in other sectors. Requires large amounts of water to protect against impacts of landings. block.duo.description = En bette, billig kanon. Effektiv mod fodgængere. block.scatter.description = Et vigtigt luftangreb. Skyder klumper af skud mod flyvere. block.scorch.description = Brænder alle forbipasserende fodgængere. Meget god til hvad den gør. diff --git a/core/assets/bundles/bundle_de.properties b/core/assets/bundles/bundle_de.properties index 8edef0b9a4..79a4797026 100644 --- a/core/assets/bundles/bundle_de.properties +++ b/core/assets/bundles/bundle_de.properties @@ -732,6 +732,8 @@ addall = Alle hinzufügen launch.from = Materialen werden von [accent]{0} []gestartet launch.capacity = Ressourcenkapazität: [accent]{0} launch.destination = Ziel: {0} +landing.sources = Source Sectors: [accent]{0}[] +landing.import = Max Total Import: {0}[accent]{1}[lightgray]/min configure.invalid = Anzahl muss eine Zahl zwischen 0 und {0} sein. add = Hinzufügen... guardian = Boss @@ -773,6 +775,7 @@ sectors.launch = Start sectors.select = Auswählen sectors.launchselect = Select Launch Destination sectors.nonelaunch = [lightgray]keiner (Sonne) +sectors.redirect = Redirect Launch Pads sectors.rename = Sektor umbenennen sectors.enemybase = [scarlet]Gegnerische Basis sectors.vulnerable = [scarlet]Angriffsgefährdet @@ -1737,6 +1740,8 @@ block.meltdown.name = Kernschmelze block.foreshadow.name = Vorschatten block.container.name = Behälter block.launch-pad.name = Launchpad +block.advanced-launch-pad.name = Launch Pad +block.landing-pad.name = Landing Pad block.segment.name = Segment block.ground-factory.name = Bodenfabrik block.air-factory.name = Luftfabrik @@ -2190,7 +2195,9 @@ block.vault.description = Speichert eine große Menge an Materialien pro Typ. Ei block.container.description = Speichert eine kleine Menge an Materialien pro Typ. Ein[lightgray] Entlader[] kann verwendet werden, um Materialien auszuladen. block.unloader.description = Entlädt Materialien aus einem Block. block.launch-pad.description = Startet Materialien in andere Sektoren. -block.launch-pad.details = Planetnahes Transportsystem für Ressourcen. Frachtpods sind zu instabil, um heil durch eine Atmosphäre zu fallen. +block.advanced-launch-pad.description = Launches batches of items to selected sectors. Only accepts one item type at a time. +block.advanced-launch-pad.details = Sub-orbital system for point-to-point transportation of resources. +block.landing-pad.description = Receives items from launch pads in other sectors. Requires large amounts of water to protect against impacts of landings. block.duo.description = Schießt auf Gegner. block.scatter.description = Ein mittelgroßer Anti-Luft-Turm. Sprüht Blei- oder Schrottklumpen auf feindliche Lufteinheiten. block.scorch.description = Verbrennt alle Bodenfeinde in der Nähe. Hochwirksam im Nahbereich. diff --git a/core/assets/bundles/bundle_es.properties b/core/assets/bundles/bundle_es.properties index bf68e0ca8d..6a074dec46 100644 --- a/core/assets/bundles/bundle_es.properties +++ b/core/assets/bundles/bundle_es.properties @@ -729,6 +729,8 @@ addall = Añadir todo launch.from = Lanzando desde: [accent]{0} launch.capacity = Capacidad de objetos por envío: [accent]{0} launch.destination = Destino: {0} +landing.sources = Source Sectors: [accent]{0}[] +landing.import = Max Total Import: {0}[accent]{1}[lightgray]/min configure.invalid = La cantidad debe ser un número entre 0 y {0}. add = Añadir... guardian = Guardián @@ -769,6 +771,7 @@ sectors.launch = Lanzar sectors.select = Seleccionar sectors.launchselect = Select Launch Destination sectors.nonelaunch = [lightgray]Ninguno (sol) +sectors.redirect = Redirect Launch Pads sectors.rename = Renombrar sector sectors.enemybase = [scarlet]Base enemiga sectors.vulnerable = [scarlet]Vulnerable @@ -1733,6 +1736,8 @@ block.meltdown.name = Meltdown block.foreshadow.name = Foreshadow block.container.name = Contenedor block.launch-pad.name = Plataforma de lanzamiento +block.advanced-launch-pad.name = Launch Pad +block.landing-pad.name = Landing Pad block.segment.name = Segment block.ground-factory.name = Fábrica terrestre block.air-factory.name = Fábrica aérea @@ -2182,7 +2187,9 @@ block.vault.description = Almacena una gran cantidad de objetos de cada tipo. Su block.container.description = Almacena una pequeña cantidad de objetos de cada tipo. Su contenido se puede recuperar con un descargador. block.unloader.description = Descarga el objeto seleccionado de bloques cercanos. block.launch-pad.description = Lanza lotes de recursos a los sectores seleccionados. -block.launch-pad.details = Sistema suborbital para transportar recursos. Las cápsulas de carga son frágiles e incapaces de sobrevivir al aterrizaje. +block.advanced-launch-pad.description = Launches batches of items to selected sectors. Only accepts one item type at a time. +block.advanced-launch-pad.details = Sub-orbital system for point-to-point transportation of resources. +block.landing-pad.description = Receives items from launch pads in other sectors. Requires large amounts of water to protect against impacts of landings. block.duo.description = Dispara balas sencillas a los enemigos. block.scatter.description = Dispara proyectiles de plomo, chatarra o metacristal a las unidades aéreas enemigas. block.scorch.description = Quema a cualquier enemigo terrestre cercano a él. Altamente efectivo a corto alcance. diff --git a/core/assets/bundles/bundle_et.properties b/core/assets/bundles/bundle_et.properties index 4bda6f7eeb..a6e54999b2 100644 --- a/core/assets/bundles/bundle_et.properties +++ b/core/assets/bundles/bundle_et.properties @@ -715,6 +715,8 @@ addall = Add All launch.from = Launching From: [accent]{0} launch.capacity = Launching Item Capacity: [accent]{0} launch.destination = Destination: {0} +landing.sources = Source Sectors: [accent]{0}[] +landing.import = Max Total Import: {0}[accent]{1}[lightgray]/min configure.invalid = Arv peab olema 0 ja {0} vahel. add = Lisa... guardian = Guardian @@ -755,6 +757,7 @@ sectors.launch = Launch sectors.select = Select sectors.launchselect = Select Launch Destination sectors.nonelaunch = [lightgray]none (sun) +sectors.redirect = Redirect Launch Pads sectors.rename = Rename Sector sectors.enemybase = [scarlet]Enemy Base sectors.vulnerable = [scarlet]Vulnerable @@ -1711,6 +1714,8 @@ block.meltdown.name = Valguskiir block.foreshadow.name = Foreshadow block.container.name = Hoidla block.launch-pad.name = Stardiplatvorm +block.advanced-launch-pad.name = Launch Pad +block.landing-pad.name = Landing Pad block.segment.name = Segment block.ground-factory.name = Ground Factory block.air-factory.name = Air Factory @@ -2149,7 +2154,9 @@ block.vault.description = Hoiustab suurt hulka igat tüüpi ressursse. Hoidlast block.container.description = Hoiustab väikest hulka igat tüüpi ressursse. Hoidlast ressursside kättesaamiseks kasutatakse mahalaadijat. block.unloader.description = Transpordib ressursse tuumikust ja hoidlatest konveieritele või külgnevatesse ehitistesse. Mahalaetava ressursi tüüpi saab valida mahalaadijale vajutades. block.launch-pad.description = Saadab ressursse tagasi emalaeva, ilma et oleks vaja tuumikuga lendu tõusta. -block.launch-pad.details = Sub-orbital system for point-to-point transportation of resources. Payload pods are fragile and incapable of surviving re-entry. +block.advanced-launch-pad.description = Launches batches of items to selected sectors. Only accepts one item type at a time. +block.advanced-launch-pad.details = Sub-orbital system for point-to-point transportation of resources. +block.landing-pad.description = Receives items from launch pads in other sectors. Requires large amounts of water to protect against impacts of landings. block.duo.description = Väike ja odav kahur, mis on kasulik maapealsete väeüksuste tõrjumiseks. block.scatter.description = Õhutõrjekahur, mis tulistab pliid või vanametalli lendavate väeüksuste pihta. block.scorch.description = Heidab tuld maapealsetele väeüksustele. Eriti efektiivne lähedal asuvate väeüksuste tõrjumiseks. diff --git a/core/assets/bundles/bundle_eu.properties b/core/assets/bundles/bundle_eu.properties index 279d9ccb3a..cc29cc99c1 100644 --- a/core/assets/bundles/bundle_eu.properties +++ b/core/assets/bundles/bundle_eu.properties @@ -717,6 +717,8 @@ addall = Gehitu denak launch.from = Launching From: [accent]{0} launch.capacity = Launching Item Capacity: [accent]{0} launch.destination = Destination: {0} +landing.sources = Source Sectors: [accent]{0}[] +landing.import = Max Total Import: {0}[accent]{1}[lightgray]/min configure.invalid = Kopurua 0 eta {0} bitarteko zenbaki bat izan behar da. add = Gehitu guardian = Guardian @@ -757,6 +759,7 @@ sectors.launch = Launch sectors.select = Select sectors.launchselect = Select Launch Destination sectors.nonelaunch = [lightgray]none (sun) +sectors.redirect = Redirect Launch Pads sectors.rename = Rename Sector sectors.enemybase = [scarlet]Enemy Base sectors.vulnerable = [scarlet]Vulnerable @@ -1713,6 +1716,8 @@ block.meltdown.name = Nukleofusio block.foreshadow.name = Foreshadow block.container.name = Edukiontzia block.launch-pad.name = Egozketa-plataforma +block.advanced-launch-pad.name = Launch Pad +block.landing-pad.name = Landing Pad block.segment.name = Segment block.ground-factory.name = Ground Factory block.air-factory.name = Air Factory @@ -2151,7 +2156,9 @@ block.vault.description = Mota bakoitzeko elementuen kopuru handiak biltegiratze block.container.description = Mota bakoitzeko elementuen kopuru txiki bat gordetzen du. Bloke deskargagailu bat erabili daiteke elementuak edukiontzitik ateratzeko. block.unloader.description = Edukiontzi, kripta edo muin batetik elementuak deskargatzen ditu garraiagailu batera edo zuzenean ondoan dagoen bloke batera. Deskargatu beharreko elementu mota sakatuz aldatu daiteke. block.launch-pad.description = Baliabide multzoak egotzi ditzake muina egotzi gabe. -block.launch-pad.details = Sub-orbital system for point-to-point transportation of resources. Payload pods are fragile and incapable of surviving re-entry. +block.advanced-launch-pad.description = Launches batches of items to selected sectors. Only accepts one item type at a time. +block.advanced-launch-pad.details = Sub-orbital system for point-to-point transportation of resources. +block.landing-pad.description = Receives items from launch pads in other sectors. Requires large amounts of water to protect against impacts of landings. block.duo.description = Dorre txiki eta merke bat. Lurreko unitateen aurka erabilgarria. block.scatter.description = Aire defentsarako ezinbesteko dorrea. Berun edo txatarrezko koskorrekin ihinztatzen ditu unitate etsaiak. block.scorch.description = Inguruko lurreko etsaiak kiskaltzen ditu. Oso eraginkorra distantzia hurbilera. diff --git a/core/assets/bundles/bundle_fi.properties b/core/assets/bundles/bundle_fi.properties index 664bc98267..2dd291059a 100644 --- a/core/assets/bundles/bundle_fi.properties +++ b/core/assets/bundles/bundle_fi.properties @@ -715,6 +715,8 @@ addall = Lisää kaikki launch.from = Laukaistaan kohteesta: [accent]{0} launch.capacity = Tavaratila laukaistaessa: [accent]{0} launch.destination = Määränpää: {0} +landing.sources = Source Sectors: [accent]{0}[] +landing.import = Max Total Import: {0}[accent]{1}[lightgray]/min configure.invalid = Lukumäärän täytyy olla numero väliltä 0 ja {0}. add = Lisää... guardian = Vartija @@ -755,6 +757,7 @@ sectors.launch = Laukaise sectors.select = Valitse sectors.launchselect = Select Launch Destination sectors.nonelaunch = [lightgray]ei mitään (sun) +sectors.redirect = Redirect Launch Pads sectors.rename = Nimeä sektori sectors.enemybase = [scarlet]Vihollistukikohta sectors.vulnerable = [scarlet]Haavoittuvainen @@ -1712,6 +1715,8 @@ block.meltdown.name = Sulamispiste block.foreshadow.name = Foreshadow block.container.name = Säiliö block.launch-pad.name = Laukaisualusta +block.advanced-launch-pad.name = Launch Pad +block.landing-pad.name = Landing Pad block.segment.name = Segmentti block.ground-factory.name = Maatehdas block.air-factory.name = Ilmatehdas @@ -2151,7 +2156,9 @@ block.vault.description = Varastoi suuren määrän jokaista tavaratyyppiä. Pur block.container.description = Varastoi pienen määrän jokaista tavaratyyppiä. Purkajapalikkaa voi tavaroiden palauttamiseen säiliöstä. block.unloader.description = Purkaa tavaroita säiliöstä, holvista tai ytimestä liukuhihnalle tai suoraan viereiseen palikkaan. Purettavan tavaran tyyppi voidaan vaihtaa painamalla. block.launch-pad.description = Laukaisee tavarajoukkoja ilman tarvetta ytimen laukaisulle. -block.launch-pad.details = Kiertoradan alapuolinen järjestelmä resurssien pisteestä pisteeseen -kuljetukselle . Lastikapselit ovat herkästi särkyviä ja kykenemättömiä selviytymään uudelleensaapumista. +block.advanced-launch-pad.description = Launches batches of items to selected sectors. Only accepts one item type at a time. +block.advanced-launch-pad.details = Sub-orbital system for point-to-point transportation of resources. +block.landing-pad.description = Receives items from launch pads in other sectors. Requires large amounts of water to protect against impacts of landings. block.duo.description = Pieni ja halpa tykki, hyvä maavihollisia vastaan. block.scatter.description = Olennainen tykki ilma-aluksia vastaan. Ampuu lyijy- tai romusirpalerykelmiä vihollisjoukkoihin. diff --git a/core/assets/bundles/bundle_fil.properties b/core/assets/bundles/bundle_fil.properties index 4957168bcc..4a40279051 100644 --- a/core/assets/bundles/bundle_fil.properties +++ b/core/assets/bundles/bundle_fil.properties @@ -715,6 +715,8 @@ addall = Add All launch.from = Launching From: [accent]{0} launch.capacity = Launching Item Capacity: [accent]{0} launch.destination = Destination: {0} +landing.sources = Source Sectors: [accent]{0}[] +landing.import = Max Total Import: {0}[accent]{1}[lightgray]/min configure.invalid = Ang halaga ay dapat na isang numero sa pagitan ng 0 at {0}. add = Add... guardian = Guardian @@ -755,6 +757,7 @@ sectors.launch = Launch sectors.select = Select sectors.launchselect = Select Launch Destination sectors.nonelaunch = [lightgray]none (sun) +sectors.redirect = Redirect Launch Pads sectors.rename = Rename Sector sectors.enemybase = [scarlet]Enemy Base sectors.vulnerable = [scarlet]Vulnerable @@ -1710,6 +1713,8 @@ block.meltdown.name = Meltdown block.foreshadow.name = Foreshadow block.container.name = Container block.launch-pad.name = Launch Pad +block.advanced-launch-pad.name = Launch Pad +block.landing-pad.name = Landing Pad block.segment.name = Segment block.ground-factory.name = Ground Factory block.air-factory.name = Air Factory @@ -2148,7 +2153,9 @@ block.vault.description = Stores a large amount of items of each type. An unload block.container.description = Stores a small amount of items of each type. An unloader block can be used to retrieve items from the container. block.unloader.description = Unloads items from any nearby non-transportation block. The type of item to be unloaded can be changed by tapping. block.launch-pad.description = Launches batches of items without any need for a core launch. -block.launch-pad.details = Sub-orbital system for point-to-point transportation of resources. Payload pods are fragile and incapable of surviving re-entry. +block.advanced-launch-pad.description = Launches batches of items to selected sectors. Only accepts one item type at a time. +block.advanced-launch-pad.details = Sub-orbital system for point-to-point transportation of resources. +block.landing-pad.description = Receives items from launch pads in other sectors. Requires large amounts of water to protect against impacts of landings. block.duo.description = A small, cheap turret. Useful against ground units. block.scatter.description = An essential anti-air turret. Sprays clumps of lead, scrap or metaglass flak at enemy units. block.scorch.description = Burns any ground enemies close to it. Highly effective at close range. diff --git a/core/assets/bundles/bundle_fr.properties b/core/assets/bundles/bundle_fr.properties index d8550a4c6e..c041519d6d 100644 --- a/core/assets/bundles/bundle_fr.properties +++ b/core/assets/bundles/bundle_fr.properties @@ -735,6 +735,8 @@ addall = Ajouter TOUT launch.from = Décollage depuis : [accent]{0} launch.capacity = Capacité de Lancement d'Objets : [accent]{0} launch.destination = Destination : {0} +landing.sources = Source Sectors: [accent]{0}[] +landing.import = Max Total Import: {0}[accent]{1}[lightgray]/min configure.invalid = La quantité doit être un nombre compris entre 0 et {0}. add = Ajouter guardian = Gardien @@ -776,6 +778,7 @@ sectors.launch = Décoller sectors.select = Sélectionner sectors.launchselect = Select Launch Destination sectors.nonelaunch = [lightgray]Vide (soleil) +sectors.redirect = Redirect Launch Pads sectors.rename = Renommer le secteur sectors.enemybase = [scarlet]Base ennemie sectors.vulnerable = [scarlet]Vulnérable @@ -1741,6 +1744,8 @@ block.meltdown.name = Fusion block.foreshadow.name = Présage block.container.name = Conteneur block.launch-pad.name = Rampe de lancement +block.advanced-launch-pad.name = Launch Pad +block.landing-pad.name = Landing Pad block.segment.name = Diviseur block.ground-factory.name = Usine d'Unités Terrestres block.air-factory.name = Usine d'Unités Aériennes @@ -2190,7 +2195,9 @@ block.vault.description = Stocke un grand nombre d'objets de chaque type. Utilis block.container.description = Stocke un petit nombre d'objets de chaque type. Utilisez un déchargeur pour les récupérer.\nUtile pour réguler le flux d'objets quand la demande de matériaux est inconstante. block.unloader.description = Permet de décharger l'objet choisi, depuis les blocs adjacents. block.launch-pad.description = Permet de transférer des ressources vers les secteurs sélectionnés. -block.launch-pad.details = Système suborbital pour le transport point à point de ressources. Les Charges utiles sont fragiles et incapables de survivre à la rentrée atmosphérique. +block.advanced-launch-pad.description = Launches batches of items to selected sectors. Only accepts one item type at a time. +block.advanced-launch-pad.details = Sub-orbital system for point-to-point transportation of resources. +block.landing-pad.description = Receives items from launch pads in other sectors. Requires large amounts of water to protect against impacts of landings. block.duo.description = Une petite tourelle à faible coût. Fonctionne bien contre les ennemis terrestres. block.scatter.description = Une tourelle anti-aérienne essentielle. Mitraille les ennemis de débris de plomb, de ferraille ou de verre trempé. block.scorch.description = Brûle les ennemis terrestres près de lui. Très efficace à courte portée. diff --git a/core/assets/bundles/bundle_hu.properties b/core/assets/bundles/bundle_hu.properties index 7e5508d386..2931920375 100644 --- a/core/assets/bundles/bundle_hu.properties +++ b/core/assets/bundles/bundle_hu.properties @@ -737,6 +737,8 @@ addall = Összes hozzáadása launch.from = Kilövés a(z) [accent]{0} szektorból launch.capacity = Nyersanyag-kapacitás a kilövéskor: [accent]{0} launch.destination = Úti cél: {0} +landing.sources = Source Sectors: [accent]{0}[] +landing.import = Max Total Import: {0}[accent]{1}[lightgray]/min configure.invalid = A mennyiségnek 0 és {0} között kell lennie. add = Hozzáadás... guardian = Őrző @@ -778,6 +780,7 @@ sectors.launch = Kilövés sectors.select = Kiválasztás sectors.launchselect = Select Launch Destination sectors.nonelaunch = [lightgray]semmi (nap) +sectors.redirect = Redirect Launch Pads sectors.rename = Szektor átnevezése sectors.enemybase = [scarlet]Ellenséges bázis sectors.vulnerable = [scarlet]Sebezhető @@ -1749,6 +1752,8 @@ block.meltdown.name = Meltdown block.foreshadow.name = Foreshadow block.container.name = Konténer block.launch-pad.name = Kilövőállás +block.advanced-launch-pad.name = Launch Pad +block.landing-pad.name = Landing Pad block.segment.name = Segment block.ground-factory.name = Földiegységgyár block.air-factory.name = Repülőgépgyár @@ -2198,7 +2203,9 @@ block.vault.description = Nagy mennyiséget tárol minden nyersanyagtípusból. block.container.description = Kis mennyiséget tárol minden nyersanyagtípusból. Növeli a támaszpont tárolókapacitását, ha egy támaszpont mellé van helyezve. A tartalma kirakodó segítségével nyerhető ki. block.unloader.description = Kirakodja a szomszédos épületekből a kiválasztott nyersanyagot. block.launch-pad.description = Nyersanyagokat juttat el más szektorokba. -block.launch-pad.details = Szuborbitális rendszer a nyersanyagok szektorok között történő szállítására. A teherkapszulák törékenyek, ezért nem képesek túlélni a légkörbe való visszatérést. +block.advanced-launch-pad.description = Launches batches of items to selected sectors. Only accepts one item type at a time. +block.advanced-launch-pad.details = Sub-orbital system for point-to-point transportation of resources. +block.landing-pad.description = Receives items from launch pads in other sectors. Requires large amounts of water to protect against impacts of landings. block.duo.description = Változatos lövedékekkel lő az ellenségre. block.scatter.description = Ólom-, törmelék- vagy ólomüvegdarabokat lő az ellenséges légi egységekre. block.scorch.description = Megégeti az ellenség közeli földi egységeit. Kis távolságra nagyon hatékony. diff --git a/core/assets/bundles/bundle_id_ID.properties b/core/assets/bundles/bundle_id_ID.properties index ec05daa035..d19baae4e8 100644 --- a/core/assets/bundles/bundle_id_ID.properties +++ b/core/assets/bundles/bundle_id_ID.properties @@ -737,6 +737,8 @@ addall = Tambah Semua launch.from = Meluncurkan Dari: [accent]{0} launch.capacity = Kapasitas Barang yang Diluncurkan: [accent]{0} launch.destination = Destinasi: {0} +landing.sources = Source Sectors: [accent]{0}[] +landing.import = Max Total Import: {0}[accent]{1}[lightgray]/min configure.invalid = Jumlah harus berupa angka di antara 0 dan {0}. add = Tambahkan... guardian = Penjaga @@ -778,6 +780,7 @@ sectors.launch = Luncurkan sectors.select = Pilih sectors.launchselect = Select Launch Destination sectors.nonelaunch = [lightgray]nihil (matahari) +sectors.redirect = Redirect Launch Pads sectors.rename = Ganti Nama Sektor sectors.enemybase = [scarlet]Markas Musuh sectors.vulnerable = [scarlet]Rawan diserang @@ -1745,6 +1748,8 @@ block.meltdown.name = Meltdown block.foreshadow.name = Foreshadow block.container.name = Kontainer block.launch-pad.name = Alas Peluncur +block.advanced-launch-pad.name = Launch Pad +block.landing-pad.name = Landing Pad block.segment.name = Segment block.ground-factory.name = Pabrik Unit Darat block.air-factory.name = Pabrik Unit Udara @@ -2194,7 +2199,9 @@ block.vault.description = Menyimpan semua tipe bahan dalam jumlah besar. Bahan d block.container.description = Menyimpan semua tipe bahan dalam jumlah kecil. Bahan dapat dikeluarkan dengan pembongkar muatan. block.unloader.description = Mengeluarkan bahan yang ditentukan dari bangunan. block.launch-pad.description = Meluncurkan muatan bahan ke sektor yang dipilih. -block.launch-pad.details = Sistem sub-orbital untuk transportasi sumber daya point-to-point. Pod muatan mudah rapuh dan tidak dapat bertahan bila masuk ke tujuan. +block.advanced-launch-pad.description = Launches batches of items to selected sectors. Only accepts one item type at a time. +block.advanced-launch-pad.details = Sub-orbital system for point-to-point transportation of resources. +block.landing-pad.description = Receives items from launch pads in other sectors. Requires large amounts of water to protect against impacts of landings. block.duo.description = Menembakkan peluru bergantian ke musuh. block.scatter.description = Menembakkan gumpalan timah, rongsokan atau metaglass ke target udara. block.scorch.description = Membakar musuh darat yang dekat dengannya. Sangat efektif dalam jarak dekat. diff --git a/core/assets/bundles/bundle_it.properties b/core/assets/bundles/bundle_it.properties index 8d47d22701..bfc53dc95c 100644 --- a/core/assets/bundles/bundle_it.properties +++ b/core/assets/bundles/bundle_it.properties @@ -719,6 +719,8 @@ addall = Aggiungi Tutti launch.from = Partenza da: [accent]{0} launch.capacity = Capacità di lancio oggetti: [accent]{0} launch.destination = Destinazione: {0} +landing.sources = Source Sectors: [accent]{0}[] +landing.import = Max Total Import: {0}[accent]{1}[lightgray]/min configure.invalid = Il valore deve essere un numero compresto tra 0 e {0}. add = Aggiungi... guardian = Guardiano @@ -759,6 +761,7 @@ sectors.launch = Lancia sectors.select = Seleziona sectors.launchselect = Select Launch Destination sectors.nonelaunch = [lightgray]nessuno (sole) +sectors.redirect = Redirect Launch Pads sectors.rename = Rinomina Settore sectors.enemybase = [scarlet]Base Nemica sectors.vulnerable = [scarlet]Vulnerabile @@ -1721,6 +1724,8 @@ block.meltdown.name = Fusione block.foreshadow.name = Tenebra block.container.name = Contenitore block.launch-pad.name = Ascensore Spaziale +block.advanced-launch-pad.name = Launch Pad +block.landing-pad.name = Landing Pad block.segment.name = Segmentatore block.ground-factory.name = Fabbrica Terrestre block.air-factory.name = Fabbrica Aerea @@ -2160,7 +2165,9 @@ block.vault.description = Immagazzina grandi quantità di oggetti di ogni tipo. block.container.description = Imagazzina piccole quantità di oggetti di ogni tipo. Può essere svuotato con uno scaricatore. block.unloader.description = Scarica l'oggetto selezionato dai blocchi adiacenti. block.launch-pad.description = Lancia lotti di oggetti ai settori selezionati. -block.launch-pad.details = Sub-orbital system for point-to-point transportation of resources. Payload pods are fragile and incapable of surviving re-entry. +block.advanced-launch-pad.description = Launches batches of items to selected sectors. Only accepts one item type at a time. +block.advanced-launch-pad.details = Sub-orbital system for point-to-point transportation of resources. +block.landing-pad.description = Receives items from launch pads in other sectors. Requires large amounts of water to protect against impacts of landings. block.duo.description = Spara proiettili ai nemici. block.scatter.description = Spara agglomerati di piombo, rottami o vetro metallico ai nemici aerei. block.scorch.description = Incenerisce qualsiasi unità terrena nelle vicinanze. Altamente efficace a distanza ravvicinata. diff --git a/core/assets/bundles/bundle_ja.properties b/core/assets/bundles/bundle_ja.properties index 1bc25d60d5..39fa76b3c6 100644 --- a/core/assets/bundles/bundle_ja.properties +++ b/core/assets/bundles/bundle_ja.properties @@ -723,6 +723,8 @@ addall = すべて追加 launch.from = [accent]{0}[] からの発射 launch.capacity = 発射アイテム容量: [accent]{0} launch.destination = 目的地: {0} +landing.sources = Source Sectors: [accent]{0}[] +landing.import = Max Total Import: {0}[accent]{1}[lightgray]/min configure.invalid = 値は 0 から {0} の間でなければなりません。 add = 追加... guardian = ガーディアン @@ -763,6 +765,7 @@ sectors.launch = 打ち上げ sectors.select = 選択 sectors.launchselect = Select Launch Destination sectors.nonelaunch = [lightgray]無し (sun) +sectors.redirect = Redirect Launch Pads sectors.rename = セクター名を変更 sectors.enemybase = [scarlet]敵基地 sectors.vulnerable = [scarlet]脆弱 @@ -1724,6 +1727,8 @@ block.meltdown.name = メルトダウン block.foreshadow.name = フォーシャドウ block.container.name = コンテナー block.launch-pad.name = 発射台 +block.advanced-launch-pad.name = Launch Pad +block.landing-pad.name = Landing Pad block.segment.name = セグメント block.ground-factory.name = 陸軍工場 block.air-factory.name = 空軍工場 @@ -2164,7 +2169,9 @@ block.vault.description = 各種類のアイテムを大量に保管します。 block.container.description = 各種類のアイテムを少量ずつ保管します。隣接するコンテナーやボール卜、コアは一つのストレージユニットとして扱われます。 [lightgray]搬出機[]を使って、コンテナーからアイテムを搬出できます。 block.unloader.description = コンテナやボールト、コアからアイテムをコンベアーか隣接するブロックに搬出します。搬出機をタップして搬出するアイテムを変更することができます。 block.launch-pad.description = 離脱することなく、アイテムを回収することができます。 -block.launch-pad.details = 資源を地点間で輸送するための軌道上システムです。ペイロードポッドは壊れやすく、再突入に耐えることができません。 +block.advanced-launch-pad.description = Launches batches of items to selected sectors. Only accepts one item type at a time. +block.advanced-launch-pad.details = Sub-orbital system for point-to-point transportation of resources. +block.landing-pad.description = Receives items from launch pads in other sectors. Requires large amounts of water to protect against impacts of landings. block.duo.description = 小さく安価なタレットです。 block.scatter.description = 中規模の対空型タレットです。敵に鉛やスクラップの塊、メタガラスを分散するように発射します。 block.scorch.description = 近くの地上の敵を燃やします。近距離だと非常に効果的です。 diff --git a/core/assets/bundles/bundle_ko.properties b/core/assets/bundles/bundle_ko.properties index e411f182b8..bdfe38eba0 100644 --- a/core/assets/bundles/bundle_ko.properties +++ b/core/assets/bundles/bundle_ko.properties @@ -737,6 +737,8 @@ addall = 모두 추가 launch.from = 출격 출발지: [accent]{0}[] launch.capacity = 출격 자원 용량: [accent]{0} launch.destination = 목적지: {0} +landing.sources = Source Sectors: [accent]{0}[] +landing.import = Max Total Import: {0}[accent]{1}[lightgray]/min configure.invalid = 해당 값은 0에서 {0} 사이의 숫자여야 합니다. add = 추가... guardian = 수호자 @@ -778,6 +780,7 @@ sectors.launch = 출격 sectors.select = 선택 sectors.launchselect = Select Launch Destination sectors.nonelaunch = [lightgray]없음 (태양)[] +sectors.redirect = Redirect Launch Pads sectors.rename = 지역 이름 변경하기 sectors.enemybase = [scarlet]적 기지[] sectors.vulnerable = [scarlet]취약함[] @@ -1748,6 +1751,8 @@ block.meltdown.name = 멜트다운 block.foreshadow.name = 포어쉐도우 block.container.name = 컨테이너 block.launch-pad.name = 지역 자원 수송기 +block.advanced-launch-pad.name = Launch Pad +block.landing-pad.name = Landing Pad block.segment.name = 세그먼트 block.ground-factory.name = 지상 공장 block.air-factory.name = 항공 공장 @@ -2197,7 +2202,9 @@ block.vault.description = 각 종류별로 많은 양의 자원을 저장합니 block.container.description = 각 종류별로 적은 양의 자원을 저장합니다. 코어 옆에 배치하면 저장 용량을 확장합니다. 언로더를 사용하여 내용물을 빼낼 수 있습니다. block.unloader.description = 선택한 자원을 근처의 블록에서 빼냅니다. 수송 블록 및 포탑을 대상으로 작동하지 않습니다. block.launch-pad.description = 선택한 지역으로 자원을 출격합니다. -block.launch-pad.details = 지역간 자원 운송을 위한 보조 궤도 시스템. 화물 추진체는 부서지기 쉽고 재진입이 불가능합니다. +block.advanced-launch-pad.description = Launches batches of items to selected sectors. Only accepts one item type at a time. +block.advanced-launch-pad.details = Sub-orbital system for point-to-point transportation of resources. +block.landing-pad.description = Receives items from launch pads in other sectors. Requires large amounts of water to protect against impacts of landings. block.duo.description = 적을 향해 번갈아 탄환을 발사합니다. block.scatter.description = 공중 목표물을 향해 납, 고철, 또는 강화유리 조각 덩어리를 발사합니다. block.scorch.description = 주변의 모든 지상 적을 불태웁니다. 근거리에서 매우 효과적입니다. diff --git a/core/assets/bundles/bundle_lt.properties b/core/assets/bundles/bundle_lt.properties index 3b1d27e425..0ea1629f7f 100644 --- a/core/assets/bundles/bundle_lt.properties +++ b/core/assets/bundles/bundle_lt.properties @@ -715,6 +715,8 @@ addall = Pridėti visus launch.from = Launching From: [accent]{0} launch.capacity = Launching Item Capacity: [accent]{0} launch.destination = Destination: {0} +landing.sources = Source Sectors: [accent]{0}[] +landing.import = Max Total Import: {0}[accent]{1}[lightgray]/min configure.invalid = Kiekis turi būti numeris tarp 0 ir {0}. add = Pridėti... guardian = Guardian @@ -755,6 +757,7 @@ sectors.launch = Launch sectors.select = Select sectors.launchselect = Select Launch Destination sectors.nonelaunch = [lightgray]none (sun) +sectors.redirect = Redirect Launch Pads sectors.rename = Rename Sector sectors.enemybase = [scarlet]Enemy Base sectors.vulnerable = [scarlet]Vulnerable @@ -1711,6 +1714,8 @@ block.meltdown.name = Meltdown block.foreshadow.name = Foreshadow block.container.name = Talpykla block.launch-pad.name = Paleidimo Aikštelė +block.advanced-launch-pad.name = Launch Pad +block.landing-pad.name = Landing Pad block.segment.name = Segment block.ground-factory.name = Ground Factory block.air-factory.name = Air Factory @@ -2149,7 +2154,9 @@ block.vault.description = Laiko didelį kiekį skirtingų rūšių medžiagų. G block.container.description = Laiko nedidelį kiekį skirtingų rūšių medžiagų. Gali būti naudojamas iškroviklis daiktų paėmimui iš talpyklos. block.unloader.description = Paima resursus iš gretimų ne gabenimui skirtų pastatų. Paimamos medžiagos rūšis gali būti pakeista paspaudus ant iškroviklio. block.launch-pad.description = Paleidžia daiktų paketus be branduolio paleidimo. -block.launch-pad.details = Sub-orbital system for point-to-point transportation of resources. Payload pods are fragile and incapable of surviving re-entry. +block.advanced-launch-pad.description = Launches batches of items to selected sectors. Only accepts one item type at a time. +block.advanced-launch-pad.details = Sub-orbital system for point-to-point transportation of resources. +block.landing-pad.description = Receives items from launch pads in other sectors. Requires large amounts of water to protect against impacts of landings. block.duo.description = Mažas ir pigus bokštas. Naudingas prieš antžeminius vienetus. block.scatter.description = Pagrindinis bokštas skirtas kovai su oro pajėgomis. Šaudo švino arba metalo laužo gabalais į priešus. block.scorch.description = Degina visus netoliese esančius priešus. Itin efektyvus artimame nuotolyje. diff --git a/core/assets/bundles/bundle_nl.properties b/core/assets/bundles/bundle_nl.properties index 472aa4fe41..eae62546c8 100644 --- a/core/assets/bundles/bundle_nl.properties +++ b/core/assets/bundles/bundle_nl.properties @@ -726,6 +726,8 @@ addall = Voeg Alles Toe launch.from = Lanceren van: [accent]{0} launch.capacity = Lanceercapaciteit: [accent]{0} launch.destination = Bestemming: {0} +landing.sources = Source Sectors: [accent]{0}[] +landing.import = Max Total Import: {0}[accent]{1}[lightgray]/min configure.invalid = Hoeveelheid moet een getal zijn tussen 0 en {0}. add = Voeg toe... guardian = Bewaker @@ -766,6 +768,7 @@ sectors.launch = Lanceer sectors.select = Selecteer sectors.launchselect = Select Launch Destination sectors.nonelaunch = [lightgray]geen (sun) +sectors.redirect = Redirect Launch Pads sectors.rename = Hernoem Sector sectors.enemybase = [scarlet]Vijandelijke Basis sectors.vulnerable = [scarlet]Kwetsbaar @@ -1723,6 +1726,8 @@ block.meltdown.name = Meltdown block.foreshadow.name = Foreshadow block.container.name = Doos block.launch-pad.name = Lanceerplatform +block.advanced-launch-pad.name = Launch Pad +block.landing-pad.name = Landing Pad block.segment.name = Segment block.ground-factory.name = Grondfabriek block.air-factory.name = Luchtfabriek @@ -2162,7 +2167,9 @@ block.vault.description = Stores a large amount of items of each type. Adjacent block.container.description = Stores a small amount of items of each type. Adjacent containers, vaults and cores will be treated as a single storage unit. An[lightgray] unloader[] can be used to retrieve items from the container. block.unloader.description = Unloads items from a container, vault or core onto a conveyor or directly into an adjacent block. The type of item to be unloaded can be changed by tapping on the unloader. block.launch-pad.description = Launches batches of items without any need for a core launch. Unfinished. -block.launch-pad.details = Sub-orbital system for point-to-point transportation of resources. Payload pods are fragile and incapable of surviving re-entry. +block.advanced-launch-pad.description = Launches batches of items to selected sectors. Only accepts one item type at a time. +block.advanced-launch-pad.details = Sub-orbital system for point-to-point transportation of resources. +block.landing-pad.description = Receives items from launch pads in other sectors. Requires large amounts of water to protect against impacts of landings. block.duo.description = A small, cheap turret. block.scatter.description = A medium-sized anti-air turret. Sprays clumps of lead or scrap flak at enemy units. block.scorch.description = Burns any ground enemies close to it. Highly effective at close range. diff --git a/core/assets/bundles/bundle_nl_BE.properties b/core/assets/bundles/bundle_nl_BE.properties index bd82f52dcc..abcfc47247 100644 --- a/core/assets/bundles/bundle_nl_BE.properties +++ b/core/assets/bundles/bundle_nl_BE.properties @@ -715,6 +715,8 @@ addall = Add All launch.from = Launching From: [accent]{0} launch.capacity = Launching Item Capacity: [accent]{0} launch.destination = Destination: {0} +landing.sources = Source Sectors: [accent]{0}[] +landing.import = Max Total Import: {0}[accent]{1}[lightgray]/min configure.invalid = Amount must be a number between 0 and {0}. add = Add... guardian = Guardian @@ -755,6 +757,7 @@ sectors.launch = Launch sectors.select = Select sectors.launchselect = Select Launch Destination sectors.nonelaunch = [lightgray]none (sun) +sectors.redirect = Redirect Launch Pads sectors.rename = Rename Sector sectors.enemybase = [scarlet]Enemy Base sectors.vulnerable = [scarlet]Vulnerable @@ -1711,6 +1714,8 @@ block.meltdown.name = Meltdown block.foreshadow.name = Foreshadow block.container.name = Container block.launch-pad.name = Launch Pad +block.advanced-launch-pad.name = Launch Pad +block.landing-pad.name = Landing Pad block.segment.name = Segment block.ground-factory.name = Ground Factory block.air-factory.name = Air Factory @@ -2149,7 +2154,9 @@ block.vault.description = Stores a large amount of items of each type. An[lightg block.container.description = Stores a small amount of items of each type. An[lightgray] unloader[] can be used to retrieve items from the container. block.unloader.description = Unloads items from a container, vault or core onto a conveyor or directly into an adjacent block. The type of item to be unloaded can be changed by tapping on the unloader. block.launch-pad.description = Launches batches of items without any need for a core launch. Unfinished. -block.launch-pad.details = Sub-orbital system for point-to-point transportation of resources. Payload pods are fragile and incapable of surviving re-entry. +block.advanced-launch-pad.description = Launches batches of items to selected sectors. Only accepts one item type at a time. +block.advanced-launch-pad.details = Sub-orbital system for point-to-point transportation of resources. +block.landing-pad.description = Receives items from launch pads in other sectors. Requires large amounts of water to protect against impacts of landings. block.duo.description = A small, cheap turret. Useful against ground units. block.scatter.description = A medium-sized anti-air turret. Sprays clumps of lead or scrap flak at enemy units. block.scorch.description = Burns any ground enemies close to it. Highly effective at close range. diff --git a/core/assets/bundles/bundle_pl.properties b/core/assets/bundles/bundle_pl.properties index 5a1dcee809..40f933f2bd 100644 --- a/core/assets/bundles/bundle_pl.properties +++ b/core/assets/bundles/bundle_pl.properties @@ -721,6 +721,8 @@ addall = Dodaj wszystkie launch.from = Wystrzelony z: [accent]{0} launch.capacity = Wystrzelona Ilość Przedmiotów: [accent]{0} launch.destination = Cel: {0} +landing.sources = Source Sectors: [accent]{0}[] +landing.import = Max Total Import: {0}[accent]{1}[lightgray]/min configure.invalid = Ilość musi być liczbą pomiędzy 0 a {0}. add = Dodaj... guardian = Zdrowie Strażnika @@ -761,6 +763,7 @@ sectors.launch = Wystrzel sectors.select = Wybierz sectors.launchselect = Select Launch Destination sectors.nonelaunch = [lightgray]Żaden (Słońce) +sectors.redirect = Redirect Launch Pads sectors.rename = Zmień Nazwę Sektora sectors.enemybase = [scarlet]Baza Wroga sectors.vulnerable = [scarlet]Wrażliwy @@ -1730,6 +1733,8 @@ block.meltdown.name = Roztapiacz block.foreshadow.name = Zeus block.container.name = Kontener block.launch-pad.name = Wyrzutnia +block.advanced-launch-pad.name = Launch Pad +block.landing-pad.name = Landing Pad block.segment.name = Segment block.ground-factory.name = Fabryka Naziemna block.air-factory.name = Fabryka Powietrzna @@ -2170,7 +2175,9 @@ block.vault.description = Przechowuje duże ilości przedmiotów każdego rodzaj block.container.description = Przechowuje małe ilości przedmiotów każdego rodzaju. Zawartość kontenera można wyciągnąć za pomocą ekstraktorów. block.unloader.description = Wyciąga przedmioty z przyległych bloków. Typ przedmiotu jaki zostanie wyciągniety może zostać zmieniony poprzez kliknięcie. block.launch-pad.description = Wysyła pakiety przedmiotów bez potrzeby wystrzeliwania rdzenia. -block.launch-pad.details = System sub-orbitalny do transportu zasobów z punktu do punktu. Ładunki są kruche i nie są w stanie przetrwać ponownego wejścia. +block.advanced-launch-pad.description = Launches batches of items to selected sectors. Only accepts one item type at a time. +block.advanced-launch-pad.details = Sub-orbital system for point-to-point transportation of resources. +block.landing-pad.description = Receives items from launch pads in other sectors. Requires large amounts of water to protect against impacts of landings. block.duo.description = Standardowa wieżyczka obronna, strzelająca naprzemian pociskami w jednostki wroga. block.scatter.description = Rażąca wieża przeciwlotnicza, rozsiewająca śrut z ołowiu, złomu lub metaszkła w powietrzne jednostki wroga. block.scorch.description = Podpalająca wieżyczka obronna, szczególnie efektywna wobec grupek wrogów naziemnych. diff --git a/core/assets/bundles/bundle_pt_BR.properties b/core/assets/bundles/bundle_pt_BR.properties index ac4bb5d662..6aa08a3265 100644 --- a/core/assets/bundles/bundle_pt_BR.properties +++ b/core/assets/bundles/bundle_pt_BR.properties @@ -729,6 +729,8 @@ addall = Adicionar Todos launch.from = Lançando de: [accent]{0} launch.capacity = Capacidade para Lançamento de Itens: [accent]{0} launch.destination = Destino: {0} +landing.sources = Source Sectors: [accent]{0}[] +landing.import = Max Total Import: {0}[accent]{1}[lightgray]/min configure.invalid = A quantidade deve ser um número entre 0 e {0}. add = Adicionar... guardian = Guardião @@ -769,6 +771,7 @@ sectors.launch = Lançar sectors.select = Selecionar sectors.launchselect = Select Launch Destination sectors.nonelaunch = [lightgray]nenhum (sun) +sectors.redirect = Redirect Launch Pads sectors.rename = Renomear Setor sectors.enemybase = [scarlet]Base Inimiga sectors.vulnerable = [scarlet]Vulnerável @@ -1730,6 +1733,8 @@ block.meltdown.name = Meltdown block.foreshadow.name = Foreshadow block.container.name = Contêiner block.launch-pad.name = Plataforma de Lançamento +block.advanced-launch-pad.name = Launch Pad +block.landing-pad.name = Landing Pad block.segment.name = Segment block.ground-factory.name = Fábrica de Unidades Terrestres block.air-factory.name = Fábrica de Unidades Aéreas @@ -2178,7 +2183,9 @@ block.vault.description = Armazena uma grande quantidade de itens de cada tipo. block.container.description = Armazena uma pequena quantidade de itens de cada tipo. Expande o armazenamento quando colocado próximo a um núcleo. O conteúdo pode ser recuperado com um descarregador. block.unloader.description = Descarrega o item selecionado dos blocos próximos. block.launch-pad.description = Lança lotes de itens para setores selecionados. -block.launch-pad.details = Sistema sub-orbital para transporte ponto-a-ponto de recursos. As cápsulas de carga são frágeis e incapazes de sobreviver à reentrada. +block.advanced-launch-pad.description = Launches batches of items to selected sectors. Only accepts one item type at a time. +block.advanced-launch-pad.details = Sub-orbital system for point-to-point transportation of resources. +block.landing-pad.description = Receives items from launch pads in other sectors. Requires large amounts of water to protect against impacts of landings. block.duo.description = Dispara balas alternadas em inimigos. block.scatter.description = Dispara tiros aglomerados de chumbo, sucata ou metavidro em unidades aéreas. block.scorch.description = Queima qualquer unidade que estiver próxima. Altamente efetivo se for de perto. diff --git a/core/assets/bundles/bundle_pt_PT.properties b/core/assets/bundles/bundle_pt_PT.properties index d706d20b41..a1880961a3 100644 --- a/core/assets/bundles/bundle_pt_PT.properties +++ b/core/assets/bundles/bundle_pt_PT.properties @@ -715,6 +715,8 @@ addall = Adiciona tudo launch.from = Launching From: [accent]{0} launch.capacity = Launching Item Capacity: [accent]{0} launch.destination = Destination: {0} +landing.sources = Source Sectors: [accent]{0}[] +landing.import = Max Total Import: {0}[accent]{1}[lightgray]/min configure.invalid = A quantidade deve ser um número entre 0 e {0}. add = Adicionar... guardian = Guardian @@ -755,6 +757,7 @@ sectors.launch = Launch sectors.select = Select sectors.launchselect = Select Launch Destination sectors.nonelaunch = [lightgray]none (sun) +sectors.redirect = Redirect Launch Pads sectors.rename = Rename Sector sectors.enemybase = [scarlet]Enemy Base sectors.vulnerable = [scarlet]Vulnerable @@ -1711,6 +1714,8 @@ block.meltdown.name = Fusão block.foreshadow.name = Foreshadow block.container.name = Contâiner block.launch-pad.name = Plataforma de lançamento +block.advanced-launch-pad.name = Launch Pad +block.landing-pad.name = Landing Pad block.segment.name = Segment block.ground-factory.name = Ground Factory block.air-factory.name = Air Factory @@ -2149,7 +2154,9 @@ block.vault.description = Carrega uma alta quantidade de itens. Usado para criar block.container.description = Carrega uma baixa quantidade de itens. Usado para criar fontes Quando não tem uma necessidade constante de materiais. Um[lightgray] Descarregador[] pode ser usado para recuperar esses itens do container. block.unloader.description = Descarrega itens de um container, Descarrega em uma esteira ou diretamente em um bloco adjacente. O tipo de item que pode ser descarregado pode ser mudado clicando no descarregador. block.launch-pad.description = Lança montes de itens sem qualquer necessidade de um lançamento de núcleo. -block.launch-pad.details = Sub-orbital system for point-to-point transportation of resources. Payload pods are fragile and incapable of surviving re-entry. +block.advanced-launch-pad.description = Launches batches of items to selected sectors. Only accepts one item type at a time. +block.advanced-launch-pad.details = Sub-orbital system for point-to-point transportation of resources. +block.landing-pad.description = Receives items from launch pads in other sectors. Requires large amounts of water to protect against impacts of landings. block.duo.description = Uma torre pequena e barata. block.scatter.description = Uma torre anti aerea media. Joga montes de cobre ou sucata aos inimigos. block.scorch.description = Queima qualquer inimigo terrestre próximo. Altamente efetivo a curta distncia. diff --git a/core/assets/bundles/bundle_ro.properties b/core/assets/bundles/bundle_ro.properties index 72c3069526..782fc17d94 100644 --- a/core/assets/bundles/bundle_ro.properties +++ b/core/assets/bundles/bundle_ro.properties @@ -723,6 +723,8 @@ addall = Adaugă-le pe toate launch.from = Lansează Din: [accent]{0} launch.capacity = Launching Item Capacity: [accent]{0} launch.destination = Destinație: {0} +landing.sources = Source Sectors: [accent]{0}[] +landing.import = Max Total Import: {0}[accent]{1}[lightgray]/min configure.invalid = Cantitatea trebuie să fie un număr între 0 și {0}. add = Adaugă... guardian = Gardian @@ -763,6 +765,7 @@ sectors.launch = Lansare sectors.select = Selectează sectors.launchselect = Select Launch Destination sectors.nonelaunch = [lightgray]nimic (soarele) +sectors.redirect = Redirect Launch Pads sectors.rename = Redenumește Sectorul sectors.enemybase = [scarlet]Bază Inamică sectors.vulnerable = [scarlet]Vulnerabil @@ -1724,6 +1727,8 @@ block.meltdown.name = Meltdown block.foreshadow.name = Foreshadow block.container.name = Container block.launch-pad.name = Platformă de Lansare +block.advanced-launch-pad.name = Launch Pad +block.landing-pad.name = Landing Pad block.segment.name = Segment block.ground-factory.name = Fabrică Unități Artilerie block.air-factory.name = Fabrică Unități Aeriene @@ -2164,7 +2169,9 @@ block.vault.description = Stochează o mare cantitate de materiale de orice tip. block.container.description = Stochează o mică cantitate de materiale de orice tip. Conținutul poate fi recuperat folosind un descărcător. block.unloader.description = Descarcă materialele din orice bloc din apropiere, mai puțin cele de transport. block.launch-pad.description = Lansează grămezi de materiale către sectoarele selectate. -block.launch-pad.details = Sub-orbital system for point-to-point transportation of resources. Payload pods are fragile and incapable of surviving re-entry. +block.advanced-launch-pad.description = Launches batches of items to selected sectors. Only accepts one item type at a time. +block.advanced-launch-pad.details = Sub-orbital system for point-to-point transportation of resources. +block.landing-pad.description = Receives items from launch pads in other sectors. Requires large amounts of water to protect against impacts of landings. block.duo.description = Trage cu gloanțe alternante către inamici. block.scatter.description = Trage cu bucățele de plumb, fier vechi sau metasticlă către aeronavele inamice. block.scorch.description = Arde orice artilerie inamică din apropiere. Foarte eficient la distanță mică. diff --git a/core/assets/bundles/bundle_ru.properties b/core/assets/bundles/bundle_ru.properties index 6d84a3a7c4..e0b6e3e0cb 100644 --- a/core/assets/bundles/bundle_ru.properties +++ b/core/assets/bundles/bundle_ru.properties @@ -723,6 +723,8 @@ addall = Добавить всё launch.from = Запуск из: [accent]{0} launch.capacity = Вместимость запускаемого предмета: [accent]{0} launch.destination = Место назначения: {0} +landing.sources = Source Sectors: [accent]{0}[] +landing.import = Max Total Import: {0}[accent]{1}[lightgray]/min configure.invalid = Количество должно быть числом между 0 и {0}. add = Добавить... guardian = Страж @@ -764,6 +766,7 @@ sectors.launch = Высадка sectors.select = Выбор sectors.launchselect = Select Launch Destination sectors.nonelaunch = [lightgray]нет (солнце) +sectors.redirect = Redirect Launch Pads sectors.rename = Переименовать сектор sectors.enemybase = [scarlet]Вражеская база sectors.vulnerable = [scarlet]Уязвим @@ -1724,6 +1727,8 @@ block.meltdown.name = Испепелитель block.foreshadow.name = Знамение block.container.name = Контейнер block.launch-pad.name = Пусковая площадка +block.advanced-launch-pad.name = Launch Pad +block.landing-pad.name = Landing Pad block.segment.name = Сегмент block.ground-factory.name = Наземная фабрика block.air-factory.name = Воздушная фабрика @@ -2166,7 +2171,9 @@ block.vault.description = Хранит большое количество пр block.container.description = Хранит небольшое количество предметов каждого типа. Предметы можно извлечь при помощи разгрузчика. block.unloader.description = Выгружает выбранный предмет из соседних блоков. block.launch-pad.description = Запускает партии предметов в выбранные секторы. -block.launch-pad.details = Суборбитальная система транспортировки ресурсов методом «point-to-point». Разгрузочные капсулы хрупки и не способны выжить при повторном входе. +block.advanced-launch-pad.description = Launches batches of items to selected sectors. Only accepts one item type at a time. +block.advanced-launch-pad.details = Sub-orbital system for point-to-point transportation of resources. +block.landing-pad.description = Receives items from launch pads in other sectors. Requires large amounts of water to protect against impacts of landings. block.duo.description = Стреляет по врагам чередующимися пулями. block.scatter.description = Стреляет кусками свинца, металлолома или метастекла по вражеским воздушным единицам. block.scorch.description = Сжигает любых наземных врагов рядом с ним. Высокоэффективен на близком расстоянии. diff --git a/core/assets/bundles/bundle_sr.properties b/core/assets/bundles/bundle_sr.properties index ae8d2c4b1d..85015a32be 100644 --- a/core/assets/bundles/bundle_sr.properties +++ b/core/assets/bundles/bundle_sr.properties @@ -724,6 +724,8 @@ addall = Dodaj Sve launch.from = Lansirati Od: [accent]{0} launch.capacity = Lansirni Kapacitet Materijala: [accent]{0} launch.destination = Destinacija: {0} +landing.sources = Source Sectors: [accent]{0}[] +landing.import = Max Total Import: {0}[accent]{1}[lightgray]/min configure.invalid = Količina mora biti između 0 i {0}. add = Dodaj... guardian = Čuvar @@ -764,6 +766,7 @@ sectors.launch = Lansiraj sectors.select = Izaberi sectors.launchselect = Select Launch Destination sectors.nonelaunch = [lightgray]nema (sunce) +sectors.redirect = Redirect Launch Pads sectors.rename = Preimenuj Sektor sectors.enemybase = [scarlet]Neprijateljska Baza sectors.vulnerable = [scarlet]Vulnerable @@ -1726,6 +1729,8 @@ block.meltdown.name = Istopitelj block.foreshadow.name = Predznak block.container.name = Kontejner block.launch-pad.name = Launch Pad +block.advanced-launch-pad.name = Launch Pad +block.landing-pad.name = Landing Pad block.segment.name = Segment block.ground-factory.name = Zemna Fabrika block.air-factory.name = Vazdušna Fabrika @@ -2167,7 +2172,9 @@ block.vault.description = Skladišti veliku količinu od svake vrste materijala. block.container.description = Skladišti malu količinu od svake vrste materijala. Contents can be retrieved with an unloader. block.unloader.description = Istovaruje određeni materijal iz obližnih blokova. block.launch-pad.description = Lansira bačve resursa u izabrani sektor. -block.launch-pad.details = Sub-orbital system for point-to-point transportation of resources. Payload pods are fragile and incapable of surviving re-entry. +block.advanced-launch-pad.description = Launches batches of items to selected sectors. Only accepts one item type at a time. +block.advanced-launch-pad.details = Sub-orbital system for point-to-point transportation of resources. +block.landing-pad.description = Receives items from launch pads in other sectors. Requires large amounts of water to protect against impacts of landings. block.duo.description = Ispaljuje metke naizmenično na neprijatelje. block.scatter.description = Fires clumps of lead, scrap or metaglass flak at enemy aircraft. block.scorch.description = Burns any ground enemies close to it. Highly effective at close range. diff --git a/core/assets/bundles/bundle_sv.properties b/core/assets/bundles/bundle_sv.properties index 74d631f20a..ef78987e67 100644 --- a/core/assets/bundles/bundle_sv.properties +++ b/core/assets/bundles/bundle_sv.properties @@ -715,6 +715,8 @@ addall = Add All launch.from = Launching From: [accent]{0} launch.capacity = Launching Item Capacity: [accent]{0} launch.destination = Destination: {0} +landing.sources = Source Sectors: [accent]{0}[] +landing.import = Max Total Import: {0}[accent]{1}[lightgray]/min configure.invalid = Amount must be a number between 0 and {0}. add = Lägg till... guardian = Guardian @@ -755,6 +757,7 @@ sectors.launch = Skjuta upp sectors.select = Select sectors.launchselect = Select Launch Destination sectors.nonelaunch = [lightgray]none (sun) +sectors.redirect = Redirect Launch Pads sectors.rename = Byt namn på sektor sectors.enemybase = [scarlet]Enemy Base sectors.vulnerable = [scarlet]Vulnerable @@ -1711,6 +1714,8 @@ block.meltdown.name = Meltdown block.foreshadow.name = Foreshadow block.container.name = Container block.launch-pad.name = Launch Pad +block.advanced-launch-pad.name = Launch Pad +block.landing-pad.name = Landing Pad block.segment.name = Segment block.ground-factory.name = Ground Factory block.air-factory.name = Air Factory @@ -2149,7 +2154,9 @@ block.vault.description = Stores a large amount of items of each type. An unload block.container.description = Stores a small amount of items of each type. An unloader block can be used to retrieve items from the container. block.unloader.description = Unloads items from a container, vault or core onto a conveyor or directly into an adjacent block. The type of item to be unloaded can be changed by tapping. block.launch-pad.description = Launches batches of items without any need for a core launch. -block.launch-pad.details = Sub-orbital system for point-to-point transportation of resources. Payload pods are fragile and incapable of surviving re-entry. +block.advanced-launch-pad.description = Launches batches of items to selected sectors. Only accepts one item type at a time. +block.advanced-launch-pad.details = Sub-orbital system for point-to-point transportation of resources. +block.landing-pad.description = Receives items from launch pads in other sectors. Requires large amounts of water to protect against impacts of landings. block.duo.description = A small, cheap turret. Useful against ground units. block.scatter.description = An essential anti-air turret. Sprays clumps of lead or scrap flak at enemy units. block.scorch.description = Burns any ground enemies close to it. Highly effective at close range. diff --git a/core/assets/bundles/bundle_th.properties b/core/assets/bundles/bundle_th.properties index 52d53ba417..9d36a0dc45 100644 --- a/core/assets/bundles/bundle_th.properties +++ b/core/assets/bundles/bundle_th.properties @@ -724,6 +724,8 @@ addall = เพิ่มทั้งหมด launch.from = ลงจอดจากเซ็กเตอร์: [accent]{0} launch.capacity = ความจุไอเท็มลงจอด: [accent]{0} launch.destination = จุดหมายปลายทาง: {0} +landing.sources = Source Sectors: [accent]{0}[] +landing.import = Max Total Import: {0}[accent]{1}[lightgray]/min configure.invalid = จำนวนต้องอยู่ระหว่าง 0 ถึง {0} add = เพิ่ม... guardian = ผู้พิทักษ์ @@ -765,6 +767,7 @@ sectors.launch = ลงจอด sectors.select = เลือก sectors.launchselect = Select Launch Destination sectors.nonelaunch = [lightgray]ไม่มี (ดวงอาทิตย์) +sectors.redirect = Redirect Launch Pads sectors.rename = เปลี่ยนชื่อเซ็กเตอร์ sectors.enemybase = [scarlet]ฐานทัพศัตรู sectors.vulnerable = [scarlet]เสี่ยงภัย @@ -1728,6 +1731,8 @@ block.meltdown.name = เมลท์ดาวน์ block.foreshadow.name = ฟอร์ชาโดว์ block.container.name = ตู้เก็บของ block.launch-pad.name = ฐานส่งทรัพยากร +block.advanced-launch-pad.name = Launch Pad +block.landing-pad.name = Landing Pad block.segment.name = เซ็กเมนต์ block.ground-factory.name = โรงงานยูนิตพื้นดิน block.air-factory.name = โรงงานยูนิตอากาศ @@ -2177,7 +2182,9 @@ block.vault.description = เก็บไอเท็มแต่ละชนิ block.container.description = เก็บไอเท็มแต่ละชนิดได้นิดหน่อย สามารถใช้ตัวถ่ายไอเท็มในการดึงไอเท็มออกมาได้ block.unloader.description = ดึงไอเท็มที่กำหนดไว้ออกมาจากบล็อกใกล้เคียง block.launch-pad.description = ส่งไอเท็มเป็นชุดๆ ไปยังเซ็กเตอร์ที่กำหนดไว้ -block.launch-pad.details = ระบบขนส่งทรัพยากรวงโคจรย่อยจากจุดหนึ่งไปอีกจุดหนึ่ง แคปซูลบรรทุกทรัพยากรนั้นเปราะบางและไม่สามารถทนความร้อนจากชั้นบรรยากาศได้ +block.advanced-launch-pad.description = Launches batches of items to selected sectors. Only accepts one item type at a time. +block.advanced-launch-pad.details = Sub-orbital system for point-to-point transportation of resources. +block.landing-pad.description = Receives items from launch pads in other sectors. Requires large amounts of water to protect against impacts of landings. block.duo.description = ป้อมปืนขนาดเล็ก ยิงกระสุนที่อยู่ในตัวมันใส่เป้าหมายศัตรู block.scatter.description = ยิงก้อนตะกั่ว เศษเหล็กหรือกระจกเมต้าใส่ยานบินศัตรูที่อยู่ใกล้เคียง block.scorch.description = เผาศัตรูพื้นดินที่อยู่ใกล้ๆ มีประสิทธิภาพสูงสุดเมื่อใช้ในระยะใกล้ diff --git a/core/assets/bundles/bundle_tk.properties b/core/assets/bundles/bundle_tk.properties index ea2cec636e..f8d4fbec26 100644 --- a/core/assets/bundles/bundle_tk.properties +++ b/core/assets/bundles/bundle_tk.properties @@ -715,6 +715,8 @@ addall = Add All launch.from = Launching From: [accent]{0} launch.capacity = Launching Item Capacity: [accent]{0} launch.destination = Destination: {0} +landing.sources = Source Sectors: [accent]{0}[] +landing.import = Max Total Import: {0}[accent]{1}[lightgray]/min configure.invalid = Amount must be a number between 0 and {0}. add = Add... guardian = Guardian @@ -755,6 +757,7 @@ sectors.launch = Launch sectors.select = Select sectors.launchselect = Select Launch Destination sectors.nonelaunch = [lightgray]none (sun) +sectors.redirect = Redirect Launch Pads sectors.rename = Rename Sector sectors.enemybase = [scarlet]Enemy Base sectors.vulnerable = [scarlet]Vulnerable @@ -1711,6 +1714,8 @@ block.meltdown.name = Meltdown block.foreshadow.name = Foreshadow block.container.name = Container block.launch-pad.name = Launch Pad +block.advanced-launch-pad.name = Launch Pad +block.landing-pad.name = Landing Pad block.segment.name = Segment block.ground-factory.name = Ground Factory block.air-factory.name = Air Factory @@ -2149,7 +2154,9 @@ block.vault.description = Stores a large amount of items. Use it for creating bu block.container.description = Stores a small amount of items. Use it for creating buffers when there is a non-constant demand of materials. An[lightgray] unloader[] can be used to retrieve items from the container. block.unloader.description = Unloads items from a container, vault or core onto a conveyor or directly into an adjacent block. The type of item to be unloaded can be changed by tapping on the unloader. block.launch-pad.description = Launches batches of items without any need for a core launch. Unfinished. -block.launch-pad.details = Sub-orbital system for point-to-point transportation of resources. Payload pods are fragile and incapable of surviving re-entry. +block.advanced-launch-pad.description = Launches batches of items to selected sectors. Only accepts one item type at a time. +block.advanced-launch-pad.details = Sub-orbital system for point-to-point transportation of resources. +block.landing-pad.description = Receives items from launch pads in other sectors. Requires large amounts of water to protect against impacts of landings. block.duo.description = A small, cheap turret. block.scatter.description = A medium-sized anti-air turret. Sprays clumps of lead or scrap flak at enemy units. block.scorch.description = Burns any ground enemies close to it. Highly effective at close range. diff --git a/core/assets/bundles/bundle_tr.properties b/core/assets/bundles/bundle_tr.properties index 5f41c6e7f6..29ad395959 100644 --- a/core/assets/bundles/bundle_tr.properties +++ b/core/assets/bundles/bundle_tr.properties @@ -723,6 +723,8 @@ addall = Hepsini Ekle launch.from = [accent]{0} dan fırlatılıyor. launch.capacity = Fırlatılan Malzeme Kapasitesi: [accent]{0} launch.destination = Varış Yeri: {0} +landing.sources = Source Sectors: [accent]{0}[] +landing.import = Max Total Import: {0}[accent]{1}[lightgray]/min configure.invalid = Miktar 0 ve {0} arasında bir sayı olmalı. add = Ekle... guardian = Gardiyan @@ -763,6 +765,7 @@ sectors.launch = Fırlat sectors.select = Seç sectors.launchselect = Select Launch Destination sectors.nonelaunch = [lightgray]yok (güneş) +sectors.redirect = Redirect Launch Pads sectors.rename = Sektörü Yeniden Adlandır sectors.enemybase = [scarlet]Düşman Üs sectors.vulnerable = [scarlet]Dayanıksız @@ -1722,6 +1725,8 @@ block.meltdown.name = Meltdown block.foreshadow.name = Foreshadow block.container.name = Konteyner block.launch-pad.name = Fıralatış Rampası +block.advanced-launch-pad.name = Launch Pad +block.landing-pad.name = Landing Pad block.segment.name = Segment block.ground-factory.name = Yer Birimi Fabrikası block.air-factory.name = Hava Birimi Fabrikası @@ -2164,7 +2169,9 @@ block.vault.description = Her materyalden az miktarda saklar. Materyalleri kasad block.container.description = Her materyalden az miktarda saklar. Materyalleri konteynerden almak için bir boşaltıcı bloğu kullanılabilir. block.unloader.description = Materyalleri bir konteyner, depo veya merkezden çıkarıp; bir konveyöre veya dibindeki bir bloğa koyar. Çıkardığı materyal türü dokunularak değiştirilebilir. block.launch-pad.description = Başka Bir Sektöre item gönderir. -block.launch-pad.details = Yörüngesel Nokta-dan-Nokta ya malzeme aktarım sistemi. Kargo Kapsülleri dayanıksızdır ve yörüngeye girerken parçalanırlar. +block.advanced-launch-pad.description = Launches batches of items to selected sectors. Only accepts one item type at a time. +block.advanced-launch-pad.details = Sub-orbital system for point-to-point transportation of resources. +block.landing-pad.description = Receives items from launch pads in other sectors. Requires large amounts of water to protect against impacts of landings. block.duo.description = Küçük, ucuz bir taret. Yer birimlerine karşı etkilidir. block.scatter.description = Önemli bir uçaksavar tareti. Düşman birimlerine hurda ya da kurşun uçaksavar mermileri atar. block.scorch.description = Etrafındaki düşmanları ateşe verir. Yakın mesafede çok etkilidir. diff --git a/core/assets/bundles/bundle_uk_UA.properties b/core/assets/bundles/bundle_uk_UA.properties index 97c813a2cf..18cdac3ac7 100644 --- a/core/assets/bundles/bundle_uk_UA.properties +++ b/core/assets/bundles/bundle_uk_UA.properties @@ -731,6 +731,8 @@ addall = Додати все launch.from = Запуск з [accent]{0} launch.capacity = Місткість предметів, що запускаються: [accent]{0} launch.destination = Пункт призначення: {0} +landing.sources = Source Sectors: [accent]{0}[] +landing.import = Max Total Import: {0}[accent]{1}[lightgray]/min configure.invalid = Кількість має бути числом між 0 та {0}. add = Додати… guardian = Вартовий @@ -772,6 +774,7 @@ sectors.launch = Запустити sectors.select = Вибрати sectors.launchselect = Select Launch Destination sectors.nonelaunch = [lightgray]нічого (сонце) +sectors.redirect = Redirect Launch Pads sectors.rename = Перейменування сектору sectors.enemybase = [scarlet]Ворожа база sectors.vulnerable = [scarlet]Уразливий @@ -1735,6 +1738,8 @@ block.meltdown.name = Розплавлювач block.foreshadow.name = Передвісник block.container.name = Сховище block.launch-pad.name = Пусковий майданчик +block.advanced-launch-pad.name = Launch Pad +block.landing-pad.name = Landing Pad block.segment.name = Сегмент block.ground-factory.name = Наземний завод block.air-factory.name = Повітряний завод @@ -2187,7 +2192,9 @@ block.vault.description = Англійська назва: Vault\nЗберіга block.container.description = Англійська назва: Container\nЗберігає малу кількість предметів кожного типу. Блок розвантажувача може використовуватися для отримання предметів зі сховища. block.unloader.description = Англійська назва: Unloader\nВивантажує предмети з найближчих блоків block.launch-pad.description = Англійська назва: Launch Pad\nЗапускає партії предметів без необхідності запуску ядра. -block.launch-pad.details = Суборбітальна система для транспортування ресурсів від точки А до точки Б. Корпуси вантажу крихкі й не здатні вижити при повторному вході. +block.advanced-launch-pad.description = Launches batches of items to selected sectors. Only accepts one item type at a time. +block.advanced-launch-pad.details = Sub-orbital system for point-to-point transportation of resources. +block.landing-pad.description = Receives items from launch pads in other sectors. Requires large amounts of water to protect against impacts of landings. block.duo.description = Англійська назва: Duo\nВистрілює чергами куль у ворогів. block.scatter.description = Англійська назва: Scatter\nВистрілює скупченням свинцю, брухту чи метаскла в повітряних противників. block.scorch.description = Англійська назва: Scorch\nПідпалює будь-яких наземних противників поблизу. Високоефективна на близькій відстані. diff --git a/core/assets/bundles/bundle_vi.properties b/core/assets/bundles/bundle_vi.properties index 09ab6cbb4c..89d71f1417 100644 --- a/core/assets/bundles/bundle_vi.properties +++ b/core/assets/bundles/bundle_vi.properties @@ -737,6 +737,8 @@ addall = Thêm tất cả launch.from = Đang phóng từ: [accent]{0} launch.capacity = Sức chứa vật phẩm khi phóng: [accent]{0} launch.destination = Đích đến: {0} +landing.sources = Source Sectors: [accent]{0}[] +landing.import = Max Total Import: {0}[accent]{1}[lightgray]/min configure.invalid = Số lượng phải là số trong khoảng 0 đến {0}. add = Thêm... guardian = Trùm @@ -778,6 +780,7 @@ sectors.launch = Phóng sectors.select = Chọn sectors.launchselect = Select Launch Destination sectors.nonelaunch = [lightgray]không có (mặt trời) +sectors.redirect = Redirect Launch Pads sectors.rename = Đổi tên khu vực sectors.enemybase = [scarlet]Căn cứ địch sectors.vulnerable = [scarlet]Dễ bị tổn thất @@ -1749,6 +1752,8 @@ block.meltdown.name = Meltdown block.foreshadow.name = Foreshadow block.container.name = Thùng chứa block.launch-pad.name = Bệ phóng +block.advanced-launch-pad.name = Launch Pad +block.landing-pad.name = Landing Pad block.segment.name = Segment block.ground-factory.name = Nhà máy Bộ binh block.air-factory.name = Nhà máy Không quân @@ -2198,7 +2203,9 @@ block.vault.description = Lưu trữ lượng lớn vật phẩm mỗi loại. M block.container.description = Lưu trữ lượng nhỏ vật phẩm mỗi loại. Mở rộng kho lưu trữ khi đặt kế bên một lõi. Nội dung có thể được lấy ra với điểm dỡ hàng. block.unloader.description = Lấy các vật phẩm được chọn từ các khối gần đó. block.launch-pad.description = Phóng lô vật phẩm vào khu vực được chọn. -block.launch-pad.details = Hệ thống quỹ đạo phụ để vận chuyển tài nguyên từ điểm này sang điểm khác. Các nhóm khối hàng rất dễ vỡ và không có khả năng tồn tại khi tái nhập. +block.advanced-launch-pad.description = Launches batches of items to selected sectors. Only accepts one item type at a time. +block.advanced-launch-pad.details = Sub-orbital system for point-to-point transportation of resources. +block.landing-pad.description = Receives items from launch pads in other sectors. Requires large amounts of water to protect against impacts of landings. block.duo.description = Bắn xen kẽ đạn vào kẻ địch. block.scatter.description = Bắn khối chì, phế liệu hoặc thuỷ tinh vào kẻ địch trên không. block.scorch.description = Đốt mọi kẻ địch trên mặt đất ở gần. Hiệu quả cao ở tầm gần. diff --git a/core/assets/bundles/bundle_zh_CN.properties b/core/assets/bundles/bundle_zh_CN.properties index 6858fbc7e3..c9e7979951 100644 --- a/core/assets/bundles/bundle_zh_CN.properties +++ b/core/assets/bundles/bundle_zh_CN.properties @@ -732,6 +732,8 @@ addall = 全部装运 launch.from = 发射自:[accent]{0} launch.capacity = 装运物品: [accent]{0} launch.destination = 目的地:{0} +landing.sources = Source Sectors: [accent]{0}[] +landing.import = Max Total Import: {0}[accent]{1}[lightgray]/min configure.invalid = 数量必须在0到{0}之间。 add = 添加… guardian = Boss @@ -773,6 +775,7 @@ sectors.launch = 发射 sectors.select = 选择 sectors.launchselect = Select Launch Destination sectors.nonelaunch = [lightgray]无(自动销毁) +sectors.redirect = Redirect Launch Pads sectors.rename = 重命名区块 sectors.enemybase = [scarlet]敌方基地 sectors.vulnerable = [scarlet]易受攻击 @@ -1737,6 +1740,8 @@ block.meltdown.name = 熔毁 block.foreshadow.name = 厄兆 block.container.name = 容器 block.launch-pad.name = 发射台 +block.advanced-launch-pad.name = Launch Pad +block.landing-pad.name = Landing Pad block.segment.name = 裂解 block.ground-factory.name = 陆军工厂 block.air-factory.name = 空军工厂 @@ -2187,7 +2192,9 @@ block.vault.description = 大量存储各种类型的物品。 可使用装卸 block.container.description = 少量存储各种类型的物品。 可使用装卸器卸载物品。 block.unloader.description = 从周围的建筑卸载指定物品。 block.launch-pad.description = 将货物发射至指定区块。 -block.launch-pad.details = 用于资源点对点运输的亚轨道系统。 载荷仓很脆弱,再入大气时无法保留。 +block.advanced-launch-pad.description = Launches batches of items to selected sectors. Only accepts one item type at a time. +block.advanced-launch-pad.details = Sub-orbital system for point-to-point transportation of resources. +block.landing-pad.description = Receives items from launch pads in other sectors. Requires large amounts of water to protect against impacts of landings. block.duo.description = 交替向敌人发射子弹。 block.scatter.description = 向敌方战机发射铅、 废料或钢化玻璃高射炮弹。 block.scorch.description = 焚烧任何靠近它的地面敌人。 近距离内十分有效。 diff --git a/core/assets/bundles/bundle_zh_TW.properties b/core/assets/bundles/bundle_zh_TW.properties index 7a2fdd19d9..24ab1fc1d5 100644 --- a/core/assets/bundles/bundle_zh_TW.properties +++ b/core/assets/bundles/bundle_zh_TW.properties @@ -729,6 +729,8 @@ addall = 全部加入 launch.from = 發射來源:[accent]{0} launch.capacity = 發射物品容量:[accent]{0} launch.destination = 目的地:{0} +landing.sources = Source Sectors: [accent]{0}[] +landing.import = Max Total Import: {0}[accent]{1}[lightgray]/min configure.invalid = 數值必須介於 0 到 {0}。 add = 新增…… guardian = 頭目 @@ -769,6 +771,7 @@ sectors.launch = 發射 sectors.select = 選取 sectors.launchselect = Select Launch Destination sectors.nonelaunch = [lightgray]無(太陽) +sectors.redirect = Redirect Launch Pads sectors.rename = 重新命名區域 sectors.enemybase = [scarlet]敵方基地 sectors.vulnerable = [scarlet]易受攻擊 @@ -1732,6 +1735,8 @@ block.meltdown.name = 熔毀砲 block.foreshadow.name = 狙擊砲 block.container.name = 容器 block.launch-pad.name = 小型發射台 +block.advanced-launch-pad.name = Launch Pad +block.landing-pad.name = Landing Pad block.segment.name = 片段 block.ground-factory.name = 地面工廠 block.air-factory.name = 航空工廠 @@ -2176,7 +2181,9 @@ block.vault.description = 儲存大量的每一種物品。當物品需求非恆 block.container.description = 儲存少量的每一種物品。當物品需求非恆定時,使用它來創建緩衝。使用[lightgray]裝卸器[]以從容器提取物品。 block.unloader.description = 將物品從容器、倉庫或核心卸載到傳輸帶上或直接卸貨到相鄰的方塊中。透過點擊卸貨器來更改要卸貨的物品類型。 block.launch-pad.description = 無需發射核心即可直接發射物品。 -block.launch-pad.details = 用於點對點運輸的亞軌道系統。載荷艙很脆弱,進入大氣層時會損毁。 +block.advanced-launch-pad.description = Launches batches of items to selected sectors. Only accepts one item type at a time. +block.advanced-launch-pad.details = Sub-orbital system for point-to-point transportation of resources. +block.landing-pad.description = Receives items from launch pads in other sectors. Requires large amounts of water to protect against impacts of landings. block.duo.description = 一種小而便宜的砲塔。 block.scatter.description = 不可或缺的中型防空砲塔。向敵方單位噴射鉛塊、廢料或是鋼化玻璃彈片。 block.scorch.description = 燃燒所有靠近它的地面敵人。在近距離非常有效。 From e4d56d8ce83e88f3a86fd951ceb4ca80a9f14414 Mon Sep 17 00:00:00 2001 From: Anuken Date: Sun, 2 Feb 2025 18:15:34 -0500 Subject: [PATCH 120/460] Fixed #10455 --- core/src/mindustry/ui/dialogs/DatabaseDialog.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/src/mindustry/ui/dialogs/DatabaseDialog.java b/core/src/mindustry/ui/dialogs/DatabaseDialog.java index 10e2ab9ddb..81fbbf9895 100644 --- a/core/src/mindustry/ui/dialogs/DatabaseDialog.java +++ b/core/src/mindustry/ui/dialogs/DatabaseDialog.java @@ -86,7 +86,7 @@ public class DatabaseDialog extends BaseDialog{ all.table(t -> { int i = 0; for(var content : allTabs){ - t.button(content == Planets.sun ? Icon.eyeSmall : content instanceof Planet ? Icon.planet : new TextureRegionDrawable(content.uiIcon), Styles.clearNoneTogglei, iconMed, () -> { + t.button(content == Planets.sun ? Icon.eyeSmall : content instanceof Planet p ? Icon.icons.get(p.icon, Icon.commandRally) : new TextureRegionDrawable(content.uiIcon), Styles.clearNoneTogglei, iconMed, () -> { tab = content; rebuild(); }).size(50f).checked(b -> tab == content).tooltip(content == Planets.sun ? "@all" : content.localizedName).with(but -> { From 24c1bbb870454a313dad66967ea1b562c255d581 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=92=D0=BE=D0=BB=D1=88=D0=B5=D0=B1=D0=BD=D0=B8=D0=BA?= <127457914+VikoMin@users.noreply.github.com> Date: Mon, 3 Feb 2025 06:15:51 +0700 Subject: [PATCH 121/460] Update servers_v7.json (#10448) --- servers_v7.json | 22 ++++++++++------------ 1 file changed, 10 insertions(+), 12 deletions(-) diff --git a/servers_v7.json b/servers_v7.json index 3117b6c247..92e4d11479 100644 --- a/servers_v7.json +++ b/servers_v7.json @@ -282,18 +282,16 @@ { "name": "FrostHeaven", "address": [ - "frost-heaven.ru", - "frost-heaven.ru:6568", - "91.200.150.116", - "frost-heaven.ru:6570", - "mindustry.frost-heaven.ru:6567", - "mindustry.frost-heaven.ru:6568", - "mindustry.frost-heaven.ru:6569", - "mindustry.frost-heaven.ru:6570", - "mindustry.frost-heaven.ru:6571", - "mindustry.frost-heaven.ru:6597", - "mindustry.frost-heaven.ru:6598", - "mindustry.frost-heaven.ru:6599" + "194.164.245.218:6567", + "194.164.245.218:6568", + "194.164.245.218:6569", + "194.164.245.218:6570", + "194.164.245.218:6571", + "194.164.245.218:6597", + "194.164.245.218:6598", + "194.164.245.218:6599", + "194.164.245.218:6600", + "194.164.245.218:6601" ] }, { From a7dda7612c66b4c92a20e1644a104b9acd8afd94 Mon Sep 17 00:00:00 2001 From: grely <182034229+grelylrz@users.noreply.github.com> Date: Mon, 3 Feb 2025 04:15:58 +0500 Subject: [PATCH 122/460] Update servers_v7.json (#10453) --- servers_v7.json | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/servers_v7.json b/servers_v7.json index 92e4d11479..e3d65239f0 100644 --- a/servers_v7.json +++ b/servers_v7.json @@ -6,7 +6,12 @@ "121.127.37.17:6568", "121.127.37.17:6569", "121.127.37.17:6570", - "121.127.37.17:6571" + "121.127.37.17:6571", + "121.127.37.17:6572", + "194.164.245.218:6570", + "194.164.245.218:6571", + "194.164.245.218:6572", + "194.164.245.218:6573" ] }, { From ccda69bda041ad015f83827711d0687b09bf74f3 Mon Sep 17 00:00:00 2001 From: Anuken Date: Sun, 2 Feb 2025 20:33:12 -0500 Subject: [PATCH 123/460] Minor launch/landing pad tweaks/fixes --- core/assets/bundles/bundle.properties | 4 ++-- core/src/mindustry/content/Blocks.java | 4 ++-- core/src/mindustry/game/SectorInfo.java | 2 +- core/src/mindustry/world/blocks/campaign/LandingPad.java | 1 + 4 files changed, 6 insertions(+), 5 deletions(-) diff --git a/core/assets/bundles/bundle.properties b/core/assets/bundles/bundle.properties index 6e8e431831..59a147aff1 100644 --- a/core/assets/bundles/bundle.properties +++ b/core/assets/bundles/bundle.properties @@ -2142,7 +2142,7 @@ block.door.description = A wall that can be opened and closed. block.door-large.description = A wall that can be opened and closed. block.mender.description = Periodically repairs blocks in its vicinity.\nOptionally uses silicon to boost range and efficiency. block.mend-projector.description = Repairs blocks in its vicinity.\nOptionally uses phase fabric to boost range and efficiency. -block.overdrive-projector.description = Increases the speed of nearby buildings.\nOptionally uses phase fabric to boost range and efficiency. +block.overdrive-projector.description = Increases the speed of nearby buildings.\nOptionally uses phase fabric to boost range and efficiency. Does not stack. block.force-projector.description = Creates a hexagonal force field around itself, protecting buildings and units inside from damage.\nOverheats if too much damage is sustained. Optionally uses coolant to prevent overheating. Phase fabric increases shield size. block.shock-mine.description = Releases electric arcs upon enemy unit contact. block.conveyor.description = Transports items forward. @@ -2228,7 +2228,7 @@ block.parallax.description = Fires a tractor beam that pulls in air targets, dam block.tsunami.description = Fires powerful streams of liquid at enemies. Automatically extinguishes fires when supplied with water. block.silicon-crucible.description = Refines silicon from sand and coal, using pyratite as an additional heat source. More efficient in hot locations. block.disassembler.description = Separates slag into trace amounts of exotic mineral components at low efficiency. Can produce thorium. -block.overdrive-dome.description = Increases the speed of nearby buildings. Requires phase fabric and silicon to operate. +block.overdrive-dome.description = Increases the speed of nearby buildings. Requires phase fabric and silicon to operate. Does not stack. block.payload-conveyor.description = Moves large payloads, such as units from factories. Magnetic. Usable in zero-G environments. block.payload-router.description = Splits input payloads into 3 output directions. Functions as a sorter when a filter is set. Magnetic. Usable in zero-G environments. block.ground-factory.description = Produces ground units. Output units can be used directly, or moved into reconstructors for upgrading. diff --git a/core/src/mindustry/content/Blocks.java b/core/src/mindustry/content/Blocks.java index db75996353..3455a893a9 100644 --- a/core/src/mindustry/content/Blocks.java +++ b/core/src/mindustry/content/Blocks.java @@ -6382,8 +6382,8 @@ public class Blocks{ itemCapacity = 100; coolingEffect = new RadialEffect(Fx.steamCoolSmoke, 4, 90f, 9.5f, 180f); - liquidCapacity = 5000f; - consumeLiquidAmount = 2500f; + liquidCapacity = 4000f; + consumeLiquidAmount = 2000f; }}; interplanetaryAccelerator = new Accelerator("interplanetary-accelerator"){{ diff --git a/core/src/mindustry/game/SectorInfo.java b/core/src/mindustry/game/SectorInfo.java index 8673e8206d..d7a3bf367d 100644 --- a/core/src/mindustry/game/SectorInfo.java +++ b/core/src/mindustry/game/SectorInfo.java @@ -31,7 +31,7 @@ public class SectorInfo{ /** Export statistics. */ public ObjectMap export = new ObjectMap<>(); //TODO: there is an obvious exploit with launch pad redirection here; pads can be redirected after leaving a sector, which doesn't update calculations. - /** Import statistics, based on what launch pads are actually receiving. TODO: this is not actually used or displayed anywhere (yet) */ + /** Import statistics, based on what launch pads are actually receiving. */ public ObjectMap imports = new ObjectMap<>(); /** Items stored in all cores. */ public ItemSeq items = new ItemSeq(); diff --git a/core/src/mindustry/world/blocks/campaign/LandingPad.java b/core/src/mindustry/world/blocks/campaign/LandingPad.java index 9b7cd5dfbd..8ff6367c0e 100644 --- a/core/src/mindustry/world/blocks/campaign/LandingPad.java +++ b/core/src/mindustry/world/blocks/campaign/LandingPad.java @@ -58,6 +58,7 @@ public class LandingPad extends Block{ update = true; configurable = true; acceptsItems = false; + canOverdrive = false; //overdriving can't do anything meaningful besides decrease cooldown, which is very small anyway, so don't bother emitLight = true; lightRadius = 90f; From 55e32f9580873ae3160a3b28254f38dc5c5cdd1d Mon Sep 17 00:00:00 2001 From: Anuken Date: Sun, 2 Feb 2025 23:19:43 -0500 Subject: [PATCH 124/460] Fixed some landing pad state not saving / Renamed pad 'heat' to 'cooldown' --- core/assets/bundles/bundle.properties | 1 + core/src/mindustry/content/Blocks.java | 2 +- .../world/blocks/campaign/LandingPad.java | 19 +++++++++++++++++-- 3 files changed, 19 insertions(+), 3 deletions(-) diff --git a/core/assets/bundles/bundle.properties b/core/assets/bundles/bundle.properties index 59a147aff1..a5e15cc7e3 100644 --- a/core/assets/bundles/bundle.properties +++ b/core/assets/bundles/bundle.properties @@ -1114,6 +1114,7 @@ bar.capacity = Capacity: {0} bar.unitcap = {0} {1}/{2} bar.liquid = Liquid bar.heat = Heat +bar.cooldown = Cooldown bar.instability = Instability bar.heatamount = Heat: {0} bar.heatpercent = Heat: {0} ({1}%) diff --git a/core/src/mindustry/content/Blocks.java b/core/src/mindustry/content/Blocks.java index 3455a893a9..fc95d69164 100644 --- a/core/src/mindustry/content/Blocks.java +++ b/core/src/mindustry/content/Blocks.java @@ -6376,7 +6376,7 @@ public class Blocks{ }}; landingPad = new LandingPad("landing-pad"){{ - requirements(Category.effect, BuildVisibility.campaignOnly, with(Items.copper, 300, Items.graphite, 200, Items.titanium, 150)); + requirements(Category.effect, BuildVisibility.campaignOnly, with(Items.copper, 200, Items.graphite, 100, Items.titanium, 100)); size = 4; itemCapacity = 100; diff --git a/core/src/mindustry/world/blocks/campaign/LandingPad.java b/core/src/mindustry/world/blocks/campaign/LandingPad.java index 8ff6367c0e..ab8a621352 100644 --- a/core/src/mindustry/world/blocks/campaign/LandingPad.java +++ b/core/src/mindustry/world/blocks/campaign/LandingPad.java @@ -38,7 +38,7 @@ public class LandingPad extends Block{ public @Load(value = "@-pod", fallback = "advanced-launch-pad-pod") TextureRegion podRegion; public float arrivalDuration = 150f; - public float cooldownTime = 180f; + public float cooldownTime = 150f; public float consumeLiquidAmount = 100f; public Liquid consumeLiquid = Liquids.water; @@ -95,7 +95,7 @@ public class LandingPad extends Block{ addLiquidBar(consumeLiquid); //TODO: does cooldown even need to exist? - addBar("heat", (LandingPadBuild entity) -> new Bar("bar.heat", Pal.lightOrange, () -> entity.cooldown)); + addBar("cooldown", (LandingPadBuild entity) -> new Bar("bar.cooldown", Pal.lightOrange, () -> entity.cooldown)); } @Override @@ -377,12 +377,23 @@ public class LandingPad extends Block{ return config; } + @Override + public byte version(){ + return 1; + } + @Override public void read(Reads read, byte revision){ super.read(read, revision); config = TypeIO.readItem(read); priority = read.i(); cooldown = read.f(); + + if(revision >= 1){ + arriving = TypeIO.readItem(read); + arrivingTimer = read.f(); + liquidRemoved = read.f(); + } } @Override @@ -391,6 +402,10 @@ public class LandingPad extends Block{ TypeIO.writeItem(write, config); write.i(priority); write.f(cooldown); + + TypeIO.writeItem(write, arriving); + write.f(arrivingTimer); + write.f(liquidRemoved); } } } From 611d866d68747d55e0f4309f3640ac0db880e8a5 Mon Sep 17 00:00:00 2001 From: Github Actions Date: Mon, 3 Feb 2025 04:20:46 +0000 Subject: [PATCH 125/460] Automatic bundle update --- core/assets/bundles/bundle_be.properties | 1 + core/assets/bundles/bundle_bg.properties | 1 + core/assets/bundles/bundle_ca.properties | 1 + core/assets/bundles/bundle_cs.properties | 1 + core/assets/bundles/bundle_da.properties | 1 + core/assets/bundles/bundle_de.properties | 1 + core/assets/bundles/bundle_es.properties | 1 + core/assets/bundles/bundle_et.properties | 1 + core/assets/bundles/bundle_eu.properties | 1 + core/assets/bundles/bundle_fi.properties | 1 + core/assets/bundles/bundle_fil.properties | 1 + core/assets/bundles/bundle_fr.properties | 1 + core/assets/bundles/bundle_hu.properties | 1 + core/assets/bundles/bundle_id_ID.properties | 1 + core/assets/bundles/bundle_it.properties | 1 + core/assets/bundles/bundle_ja.properties | 1 + core/assets/bundles/bundle_ko.properties | 1 + core/assets/bundles/bundle_lt.properties | 1 + core/assets/bundles/bundle_nl.properties | 1 + core/assets/bundles/bundle_nl_BE.properties | 1 + core/assets/bundles/bundle_pl.properties | 1 + core/assets/bundles/bundle_pt_BR.properties | 1 + core/assets/bundles/bundle_pt_PT.properties | 1 + core/assets/bundles/bundle_ro.properties | 1 + core/assets/bundles/bundle_ru.properties | 1 + core/assets/bundles/bundle_sr.properties | 1 + core/assets/bundles/bundle_sv.properties | 1 + core/assets/bundles/bundle_th.properties | 1 + core/assets/bundles/bundle_tk.properties | 1 + core/assets/bundles/bundle_tr.properties | 1 + core/assets/bundles/bundle_uk_UA.properties | 1 + core/assets/bundles/bundle_vi.properties | 1 + core/assets/bundles/bundle_zh_CN.properties | 1 + core/assets/bundles/bundle_zh_TW.properties | 1 + 34 files changed, 34 insertions(+) diff --git a/core/assets/bundles/bundle_be.properties b/core/assets/bundles/bundle_be.properties index 6310fc1e39..3688ddcf62 100644 --- a/core/assets/bundles/bundle_be.properties +++ b/core/assets/bundles/bundle_be.properties @@ -1082,6 +1082,7 @@ bar.capacity = Умяшчальнасць: {0} bar.unitcap = {0} {1}/{2} bar.liquid = Вадкасці bar.heat = Нагрэў +bar.cooldown = Cooldown bar.instability = Нестабільнасць bar.heatamount = Нагрэў: {0} bar.heatpercent = Нагрэў: {0} ({1}%) diff --git a/core/assets/bundles/bundle_bg.properties b/core/assets/bundles/bundle_bg.properties index 7fdd12a0ee..8e792e0f62 100644 --- a/core/assets/bundles/bundle_bg.properties +++ b/core/assets/bundles/bundle_bg.properties @@ -1093,6 +1093,7 @@ bar.capacity = Капацитет: {0} bar.unitcap = {0} {1}/{2} bar.liquid = Течност bar.heat = Топлина +bar.cooldown = Cooldown bar.instability = Instability bar.heatamount = Heat: {0} bar.heatpercent = Heat: {0} ({1}%) diff --git a/core/assets/bundles/bundle_ca.properties b/core/assets/bundles/bundle_ca.properties index f7e67e49e7..a8b0e0b938 100644 --- a/core/assets/bundles/bundle_ca.properties +++ b/core/assets/bundles/bundle_ca.properties @@ -1096,6 +1096,7 @@ bar.capacity = Capacitat: {0} bar.unitcap = {0} {1}/{2} bar.liquid = Líquid bar.heat = Calor +bar.cooldown = Cooldown bar.instability = Inestabilitat bar.heatamount = Calor: {0} bar.heatpercent = Calor: {0} ({1} %) diff --git a/core/assets/bundles/bundle_cs.properties b/core/assets/bundles/bundle_cs.properties index 63e5a32443..dbf1e2a80f 100644 --- a/core/assets/bundles/bundle_cs.properties +++ b/core/assets/bundles/bundle_cs.properties @@ -1095,6 +1095,7 @@ bar.capacity = Kapacita: {0} bar.unitcap = {0} {1}/{2} bar.liquid = Chlazení bar.heat = Teplo +bar.cooldown = Cooldown bar.instability = Nestabilita bar.heatamount = Teplo: {0} bar.heatpercent = Teplo: {0} ({1}%) diff --git a/core/assets/bundles/bundle_da.properties b/core/assets/bundles/bundle_da.properties index bc36d38ecb..81afaadea4 100644 --- a/core/assets/bundles/bundle_da.properties +++ b/core/assets/bundles/bundle_da.properties @@ -1084,6 +1084,7 @@ bar.capacity = Kapacitet: {0} bar.unitcap = {0} {1}/{2} bar.liquid = Væske bar.heat = Varme +bar.cooldown = Cooldown bar.instability = Instability bar.heatamount = Heat: {0} bar.heatpercent = Heat: {0} ({1}%) diff --git a/core/assets/bundles/bundle_de.properties b/core/assets/bundles/bundle_de.properties index 79a4797026..b792aba5ac 100644 --- a/core/assets/bundles/bundle_de.properties +++ b/core/assets/bundles/bundle_de.properties @@ -1106,6 +1106,7 @@ bar.capacity = Kapazität: {0} bar.unitcap = {0} {1}/{2} bar.liquid = Flüssigkeit bar.heat = Hitze +bar.cooldown = Cooldown bar.instability = Instabilität bar.heatamount = Hitze: {0} bar.heatpercent = Hitze: {0} ({1}%) diff --git a/core/assets/bundles/bundle_es.properties b/core/assets/bundles/bundle_es.properties index 6a074dec46..20a54101b8 100644 --- a/core/assets/bundles/bundle_es.properties +++ b/core/assets/bundles/bundle_es.properties @@ -1102,6 +1102,7 @@ bar.capacity = Capacidad: {0} bar.unitcap = {0} {1}/{2} bar.liquid = Líquido bar.heat = Calor +bar.cooldown = Cooldown bar.instability = Inestabilidad bar.heatamount = Calor: {0} bar.heatpercent = Calor: {0} ({1}%) diff --git a/core/assets/bundles/bundle_et.properties b/core/assets/bundles/bundle_et.properties index a6e54999b2..eed737a07e 100644 --- a/core/assets/bundles/bundle_et.properties +++ b/core/assets/bundles/bundle_et.properties @@ -1084,6 +1084,7 @@ bar.capacity = Mahutavus: {0} bar.unitcap = {0} {1}/{2} bar.liquid = Vedelik bar.heat = Kuumus +bar.cooldown = Cooldown bar.instability = Instability bar.heatamount = Heat: {0} bar.heatpercent = Heat: {0} ({1}%) diff --git a/core/assets/bundles/bundle_eu.properties b/core/assets/bundles/bundle_eu.properties index cc29cc99c1..57d1309e7b 100644 --- a/core/assets/bundles/bundle_eu.properties +++ b/core/assets/bundles/bundle_eu.properties @@ -1086,6 +1086,7 @@ bar.capacity = Edukiera: {0} bar.unitcap = {0} {1}/{2} bar.liquid = Likidoa bar.heat = Beroa +bar.cooldown = Cooldown bar.instability = Instability bar.heatamount = Heat: {0} bar.heatpercent = Heat: {0} ({1}%) diff --git a/core/assets/bundles/bundle_fi.properties b/core/assets/bundles/bundle_fi.properties index 2dd291059a..b0fd5630ab 100644 --- a/core/assets/bundles/bundle_fi.properties +++ b/core/assets/bundles/bundle_fi.properties @@ -1083,6 +1083,7 @@ bar.capacity = Kapasiteetti: {0} bar.unitcap = {0} {1}/{2} bar.liquid = Neste bar.heat = Lämpö +bar.cooldown = Cooldown bar.instability = Epävakaus bar.heatamount = Lämpö: {0} bar.heatpercent = Lämpö: {0} ({1}%) diff --git a/core/assets/bundles/bundle_fil.properties b/core/assets/bundles/bundle_fil.properties index 4a40279051..245130b38a 100644 --- a/core/assets/bundles/bundle_fil.properties +++ b/core/assets/bundles/bundle_fil.properties @@ -1083,6 +1083,7 @@ bar.capacity = Capacity: {0} bar.unitcap = {0} {1}/{2} bar.liquid = Liquid bar.heat = Heat +bar.cooldown = Cooldown bar.instability = Instability bar.heatamount = Heat: {0} bar.heatpercent = Heat: {0} ({1}%) diff --git a/core/assets/bundles/bundle_fr.properties b/core/assets/bundles/bundle_fr.properties index c041519d6d..a1350d6bf7 100644 --- a/core/assets/bundles/bundle_fr.properties +++ b/core/assets/bundles/bundle_fr.properties @@ -1108,6 +1108,7 @@ bar.capacity = Capacité: {0} bar.unitcap = {0} {1}/{2} bar.liquid = Liquides bar.heat = Chaleur +bar.cooldown = Cooldown bar.instability = Instabilité bar.heatamount = Chaleur: {0} bar.heatpercent = Chaleur: {0} ({1}%) diff --git a/core/assets/bundles/bundle_hu.properties b/core/assets/bundles/bundle_hu.properties index 2931920375..033c760b35 100644 --- a/core/assets/bundles/bundle_hu.properties +++ b/core/assets/bundles/bundle_hu.properties @@ -1114,6 +1114,7 @@ bar.capacity = Tárhely: {0} bar.unitcap = {0} {1}/{2} bar.liquid = Folyadék bar.heat = Hő +bar.cooldown = Cooldown bar.instability = Instabilitás bar.heatamount = Hő: {0} bar.heatpercent = Hő: {0} ({1}%) diff --git a/core/assets/bundles/bundle_id_ID.properties b/core/assets/bundles/bundle_id_ID.properties index d19baae4e8..39f2be18ec 100644 --- a/core/assets/bundles/bundle_id_ID.properties +++ b/core/assets/bundles/bundle_id_ID.properties @@ -1111,6 +1111,7 @@ bar.capacity = Kapasitas: {0} bar.unitcap = {0} {1}/{2} bar.liquid = Zat Cair bar.heat = Panas +bar.cooldown = Cooldown bar.instability = Instabilitas bar.heatamount = Panas: {0} bar.heatpercent = Panas: {0} ({1}%) diff --git a/core/assets/bundles/bundle_it.properties b/core/assets/bundles/bundle_it.properties index bfc53dc95c..d1f859e999 100644 --- a/core/assets/bundles/bundle_it.properties +++ b/core/assets/bundles/bundle_it.properties @@ -1089,6 +1089,7 @@ bar.capacity = Capacità: {0} bar.unitcap = {0} {1}/{2} bar.liquid = Liquido bar.heat = Calore +bar.cooldown = Cooldown bar.instability = Instabilità bar.heatamount = Calore: {0} bar.heatpercent = Calore: {0} ({1}%) diff --git a/core/assets/bundles/bundle_ja.properties b/core/assets/bundles/bundle_ja.properties index 39fa76b3c6..10cb04c305 100644 --- a/core/assets/bundles/bundle_ja.properties +++ b/core/assets/bundles/bundle_ja.properties @@ -1095,6 +1095,7 @@ bar.capacity = 容量: {0} bar.unitcap = {0} {1}/{2} bar.liquid = 液体 bar.heat = 熱 +bar.cooldown = Cooldown bar.instability = 不安定度 bar.heatamount = 熱: {0} bar.heatpercent = 熱: {0} ({1}%) diff --git a/core/assets/bundles/bundle_ko.properties b/core/assets/bundles/bundle_ko.properties index bdfe38eba0..e8f3e27623 100644 --- a/core/assets/bundles/bundle_ko.properties +++ b/core/assets/bundles/bundle_ko.properties @@ -1113,6 +1113,7 @@ bar.capacity = 용량: {0} bar.unitcap = {0} {1}/{2} bar.liquid = 액체 bar.heat = 발열 +bar.cooldown = Cooldown bar.instability = 불안정 bar.heatamount = 열: {0} bar.heatpercent = 열: {0} ({1}%) diff --git a/core/assets/bundles/bundle_lt.properties b/core/assets/bundles/bundle_lt.properties index 0ea1629f7f..2accf92543 100644 --- a/core/assets/bundles/bundle_lt.properties +++ b/core/assets/bundles/bundle_lt.properties @@ -1084,6 +1084,7 @@ bar.capacity = Talpumas: {0} bar.unitcap = {0} {1}/{2} bar.liquid = Skystis bar.heat = Karščiai +bar.cooldown = Cooldown bar.instability = Instability bar.heatamount = Heat: {0} bar.heatpercent = Heat: {0} ({1}%) diff --git a/core/assets/bundles/bundle_nl.properties b/core/assets/bundles/bundle_nl.properties index eae62546c8..418133003a 100644 --- a/core/assets/bundles/bundle_nl.properties +++ b/core/assets/bundles/bundle_nl.properties @@ -1096,6 +1096,7 @@ bar.capacity = Capaciteit: {0} bar.unitcap = {0} {1}/{2} bar.liquid = Vloeistof bar.heat = Warmte +bar.cooldown = Cooldown bar.instability = Instabiliteit bar.heatamount = Warmte: {0} bar.heatpercent = Warmte: {0} ({1}%) diff --git a/core/assets/bundles/bundle_nl_BE.properties b/core/assets/bundles/bundle_nl_BE.properties index abcfc47247..6350e68df9 100644 --- a/core/assets/bundles/bundle_nl_BE.properties +++ b/core/assets/bundles/bundle_nl_BE.properties @@ -1084,6 +1084,7 @@ bar.capacity = Capacity: {0} bar.unitcap = {0} {1}/{2} bar.liquid = Liquid bar.heat = Heat +bar.cooldown = Cooldown bar.instability = Instability bar.heatamount = Heat: {0} bar.heatpercent = Heat: {0} ({1}%) diff --git a/core/assets/bundles/bundle_pl.properties b/core/assets/bundles/bundle_pl.properties index 40f933f2bd..e459a7cd29 100644 --- a/core/assets/bundles/bundle_pl.properties +++ b/core/assets/bundles/bundle_pl.properties @@ -1093,6 +1093,7 @@ bar.capacity = Pojemność: {0} bar.unitcap = {0} {1}/{2} bar.liquid = Płyn bar.heat = Ciepło +bar.cooldown = Cooldown bar.instability = Niestabilność bar.heatamount = Ciepło: {0} bar.heatpercent = Ciepło: {0} ({1}%) diff --git a/core/assets/bundles/bundle_pt_BR.properties b/core/assets/bundles/bundle_pt_BR.properties index 6aa08a3265..2190055f55 100644 --- a/core/assets/bundles/bundle_pt_BR.properties +++ b/core/assets/bundles/bundle_pt_BR.properties @@ -1103,6 +1103,7 @@ bar.capacity = Capacidade: {0} bar.unitcap = {0} {1}/{2} bar.liquid = Líquido bar.heat = Calor +bar.cooldown = Cooldown bar.instability = Instabilidade bar.heatamount = Calor: {0} bar.heatpercent = Calor: {0} ({1}%) diff --git a/core/assets/bundles/bundle_pt_PT.properties b/core/assets/bundles/bundle_pt_PT.properties index a1880961a3..bad8364fe6 100644 --- a/core/assets/bundles/bundle_pt_PT.properties +++ b/core/assets/bundles/bundle_pt_PT.properties @@ -1084,6 +1084,7 @@ bar.capacity = Capacidade: {0} bar.unitcap = {0} {1}/{2} bar.liquid = Liquido bar.heat = Aquecimento +bar.cooldown = Cooldown bar.instability = Instability bar.heatamount = Heat: {0} bar.heatpercent = Heat: {0} ({1}%) diff --git a/core/assets/bundles/bundle_ro.properties b/core/assets/bundles/bundle_ro.properties index 782fc17d94..f1800a2dcf 100644 --- a/core/assets/bundles/bundle_ro.properties +++ b/core/assets/bundles/bundle_ro.properties @@ -1095,6 +1095,7 @@ bar.capacity = Capacitate: {0} bar.unitcap = {0} {1}/{2} bar.liquid = Lichid bar.heat = Căldură +bar.cooldown = Cooldown bar.instability = Instability bar.heatamount = Heat: {0} bar.heatpercent = Heat: {0} ({1}%) diff --git a/core/assets/bundles/bundle_ru.properties b/core/assets/bundles/bundle_ru.properties index e0b6e3e0cb..885fcfc0e0 100644 --- a/core/assets/bundles/bundle_ru.properties +++ b/core/assets/bundles/bundle_ru.properties @@ -1095,6 +1095,7 @@ bar.capacity = Вместимость: {0} bar.unitcap = {0} {1}/{2} bar.liquid = Жидкости bar.heat = Нагрев +bar.cooldown = Cooldown bar.instability = Нестабильность bar.heatamount = Нагрев: {0} bar.heatpercent = Нагрев: {0} ({1}%) diff --git a/core/assets/bundles/bundle_sr.properties b/core/assets/bundles/bundle_sr.properties index 85015a32be..f780847378 100644 --- a/core/assets/bundles/bundle_sr.properties +++ b/core/assets/bundles/bundle_sr.properties @@ -1097,6 +1097,7 @@ bar.capacity = Kapacitet: {0} bar.unitcap = {0} {1}/{2} bar.liquid = Tečnost bar.heat = Toplota +bar.cooldown = Cooldown bar.instability = Nestabilnost bar.heatamount = Količina Toplote: {0} bar.heatpercent = Količina Toplote: {0} ({1}%) diff --git a/core/assets/bundles/bundle_sv.properties b/core/assets/bundles/bundle_sv.properties index ef78987e67..cef3a8e710 100644 --- a/core/assets/bundles/bundle_sv.properties +++ b/core/assets/bundles/bundle_sv.properties @@ -1084,6 +1084,7 @@ bar.capacity = Capacity: {0} bar.unitcap = {0} {1}/{2} bar.liquid = Vätska bar.heat = Hetta +bar.cooldown = Cooldown bar.instability = Instability bar.heatamount = Heat: {0} bar.heatpercent = Heat: {0} ({1}%) diff --git a/core/assets/bundles/bundle_th.properties b/core/assets/bundles/bundle_th.properties index 9d36a0dc45..dd89b0046c 100644 --- a/core/assets/bundles/bundle_th.properties +++ b/core/assets/bundles/bundle_th.properties @@ -1098,6 +1098,7 @@ bar.capacity = ความจุ: {0} bar.unitcap = {0} {1}/{2} bar.liquid = ของเหลว bar.heat = ความร้อน +bar.cooldown = Cooldown bar.instability = ความไม่เสถียร bar.heatamount = ความร้อน: {0} bar.heatpercent = ความร้อน: {0} ({1}%) diff --git a/core/assets/bundles/bundle_tk.properties b/core/assets/bundles/bundle_tk.properties index f8d4fbec26..2dc3da2f3d 100644 --- a/core/assets/bundles/bundle_tk.properties +++ b/core/assets/bundles/bundle_tk.properties @@ -1084,6 +1084,7 @@ bar.capacity = Capacity: {0} bar.unitcap = {0} {1}/{2} bar.liquid = Liquid bar.heat = Heat +bar.cooldown = Cooldown bar.instability = Instability bar.heatamount = Heat: {0} bar.heatpercent = Heat: {0} ({1}%) diff --git a/core/assets/bundles/bundle_tr.properties b/core/assets/bundles/bundle_tr.properties index 29ad395959..35d39455ff 100644 --- a/core/assets/bundles/bundle_tr.properties +++ b/core/assets/bundles/bundle_tr.properties @@ -1093,6 +1093,7 @@ bar.capacity = Kapasite: {0} bar.unitcap = {0} {1}/{2} bar.liquid = Sıvı bar.heat = Isı +bar.cooldown = Cooldown bar.instability = Dengesizlik bar.heatamount = Isı: {0} bar.heatpercent = Isı: {0} ({1}%) diff --git a/core/assets/bundles/bundle_uk_UA.properties b/core/assets/bundles/bundle_uk_UA.properties index 18cdac3ac7..cc0243b3ed 100644 --- a/core/assets/bundles/bundle_uk_UA.properties +++ b/core/assets/bundles/bundle_uk_UA.properties @@ -1104,6 +1104,7 @@ bar.capacity = Місткість: {0} bar.unitcap = {0} {1}/{2} bar.liquid = Рідина bar.heat = Нагрівання +bar.cooldown = Cooldown bar.instability = Нестабільність bar.heatamount = Нагрівання: {0} bar.heatpercent = Нагрівання: {0} ({1}%) diff --git a/core/assets/bundles/bundle_vi.properties b/core/assets/bundles/bundle_vi.properties index 89d71f1417..7aa6ff6a3b 100644 --- a/core/assets/bundles/bundle_vi.properties +++ b/core/assets/bundles/bundle_vi.properties @@ -1114,6 +1114,7 @@ bar.capacity = Sức chứa: {0} bar.unitcap = {0} {1}/{2} bar.liquid = Chất lỏng bar.heat = Nhiệt lượng +bar.cooldown = Cooldown bar.instability = Bất ổn định bar.heatamount = Nhiệt lượng: {0} bar.heatpercent = Nhiệt lượng: {0} ({1}%) diff --git a/core/assets/bundles/bundle_zh_CN.properties b/core/assets/bundles/bundle_zh_CN.properties index c9e7979951..6e8ae176d9 100644 --- a/core/assets/bundles/bundle_zh_CN.properties +++ b/core/assets/bundles/bundle_zh_CN.properties @@ -1106,6 +1106,7 @@ bar.capacity = 容量:{0} bar.unitcap = {0} {1}/{2} bar.liquid = 液体 bar.heat = 热量 +bar.cooldown = Cooldown bar.instability = 不稳定性 bar.heatamount = 热量: {0} bar.heatpercent = 热量: {0} ({1}%) diff --git a/core/assets/bundles/bundle_zh_TW.properties b/core/assets/bundles/bundle_zh_TW.properties index 24ab1fc1d5..d41dd8aaeb 100644 --- a/core/assets/bundles/bundle_zh_TW.properties +++ b/core/assets/bundles/bundle_zh_TW.properties @@ -1101,6 +1101,7 @@ bar.capacity = 容量:{0} bar.unitcap = {0} {1}/{2} bar.liquid = 液體 bar.heat = 熱 +bar.cooldown = Cooldown bar.instability = 不穩定度 bar.heatamount = 熱: {0} bar.heatpercent = 熱: {0} ({1}%) From 4e225f91909b87f29c3ae67b3c5e9d5e8f677a29 Mon Sep 17 00:00:00 2001 From: Anuken Date: Mon, 3 Feb 2025 19:27:08 -0500 Subject: [PATCH 126/460] Internal support for legacy launch pads (hidden) --- core/assets/bundles/bundle.properties | 3 ++ core/src/mindustry/content/Blocks.java | 10 ++--- core/src/mindustry/content/Planets.java | 1 + core/src/mindustry/game/CampaignRules.java | 1 + core/src/mindustry/game/SectorInfo.java | 3 ++ core/src/mindustry/game/Universe.java | 43 ++++++++++++++++--- core/src/mindustry/type/Planet.java | 2 + .../ui/dialogs/CampaignRulesDialog.java | 5 +++ .../world/blocks/campaign/LandingPad.java | 11 +++-- .../world/blocks/campaign/LaunchPad.java | 4 +- .../mindustry/world/meta/BuildVisibility.java | 2 + 11 files changed, 69 insertions(+), 16 deletions(-) diff --git a/core/assets/bundles/bundle.properties b/core/assets/bundles/bundle.properties index a5e15cc7e3..6bd6affbf8 100644 --- a/core/assets/bundles/bundle.properties +++ b/core/assets/bundles/bundle.properties @@ -1432,6 +1432,9 @@ rules.title.planet = Planet rules.lighting = Lighting rules.fog = Fog of War rules.invasions = Enemy Sector Invasions +rules.legacylaunchpads = Legacy Launch Pad Mechanics +rules.legacylaunchpads.info = Allows using launch pads without landing pads, as in 7.0. +landingpad.legacy.disabled = [scarlet]\ue815 Disabled[lightgray] (Legacy Launch Pads enabled) rules.showspawns = Show Enemy Spawns rules.randomwaveai = Unpredictable Wave AI rules.fire = Fire diff --git a/core/src/mindustry/content/Blocks.java b/core/src/mindustry/content/Blocks.java index fc95d69164..a3029ec77b 100644 --- a/core/src/mindustry/content/Blocks.java +++ b/core/src/mindustry/content/Blocks.java @@ -6354,7 +6354,7 @@ public class Blocks{ //region campaign launchPad = new LaunchPad("launch-pad"){{ - requirements(Category.effect, BuildVisibility.debugOnly, with(Items.copper, 350, Items.silicon, 140, Items.lead, 200, Items.titanium, 150)); + requirements(Category.effect, BuildVisibility.legacyLaunchPadOnly, with(Items.copper, 350, Items.silicon, 140, Items.lead, 200, Items.titanium, 150)); size = 3; itemCapacity = 100; launchTime = 60f * 20; @@ -6364,7 +6364,7 @@ public class Blocks{ }}; advancedLaunchPad = new LaunchPad("advanced-launch-pad"){{ - requirements(Category.effect, BuildVisibility.campaignOnly, with(Items.copper, 350, Items.silicon, 250, Items.lead, 300, Items.titanium, 200)); + requirements(Category.effect, BuildVisibility.notLegacyLaunchPadOnly, with(Items.copper, 350, Items.silicon, 250, Items.lead, 300, Items.titanium, 200)); size = 4; itemCapacity = 100; launchTime = 60f * 30; @@ -6376,14 +6376,14 @@ public class Blocks{ }}; landingPad = new LandingPad("landing-pad"){{ - requirements(Category.effect, BuildVisibility.campaignOnly, with(Items.copper, 200, Items.graphite, 100, Items.titanium, 100)); + requirements(Category.effect, BuildVisibility.notLegacyLaunchPadOnly, with(Items.copper, 200, Items.graphite, 100, Items.titanium, 100)); size = 4; itemCapacity = 100; coolingEffect = new RadialEffect(Fx.steamCoolSmoke, 4, 90f, 9.5f, 180f); - liquidCapacity = 4000f; - consumeLiquidAmount = 2000f; + liquidCapacity = 3000f; + consumeLiquidAmount = 1500f; }}; interplanetaryAccelerator = new Accelerator("interplanetary-accelerator"){{ diff --git a/core/src/mindustry/content/Planets.java b/core/src/mindustry/content/Planets.java index d23ab25f47..f44c617291 100644 --- a/core/src/mindustry/content/Planets.java +++ b/core/src/mindustry/content/Planets.java @@ -134,6 +134,7 @@ public class Planets{ launchCapacityMultiplier = 0.5f; sectorSeed = 2; allowWaves = true; + allowLegacyLaunchPads = true; allowWaveSimulation = true; allowSectorInvasion = true; allowLaunchSchematics = true; diff --git a/core/src/mindustry/game/CampaignRules.java b/core/src/mindustry/game/CampaignRules.java index 7ed813cab7..0ff9a7122c 100644 --- a/core/src/mindustry/game/CampaignRules.java +++ b/core/src/mindustry/game/CampaignRules.java @@ -8,6 +8,7 @@ public class CampaignRules{ public boolean showSpawns; public boolean sectorInvasion; public boolean randomWaveAI; + public boolean legacyLaunchPads; public void apply(Planet planet, Rules rules){ rules.staticFog = rules.fog = fog; diff --git a/core/src/mindustry/game/SectorInfo.java b/core/src/mindustry/game/SectorInfo.java index d7a3bf367d..0d8e8e1f06 100644 --- a/core/src/mindustry/game/SectorInfo.java +++ b/core/src/mindustry/game/SectorInfo.java @@ -92,6 +92,9 @@ public class SectorInfo{ public ObjectFloatMap importCooldownTimers = new ObjectFloatMap<>(); public @Nullable transient float[] importRateCache; + /** Temporary seq for last imported items. Do not use. */ + public transient ItemSeq lastImported = new ItemSeq(); + /** Counter refresh state. */ private transient Interval time = new Interval(); /** Core item storage input/output deltas. */ diff --git a/core/src/mindustry/game/Universe.java b/core/src/mindustry/game/Universe.java index 94945eae55..33fcc893c1 100644 --- a/core/src/mindustry/game/Universe.java +++ b/core/src/mindustry/game/Universe.java @@ -168,6 +168,33 @@ public class Universe{ continue; } + if(planet.campaignRules.legacyLaunchPads){ + //first pass: clear import stats + for(Sector sector : planet.sectors){ + if(sector.hasBase() && !sector.isBeingPlayed()){ + sector.info.lastImported.clear(); + } + } + + //second pass: update export & import statistics + for(Sector sector : planet.sectors){ + if(sector.hasBase() && !sector.isBeingPlayed()){ + + //export to another sector + if(sector.info.destination != null){ + Sector to = sector.info.destination; + if(to.hasBase() && to.planet == planet){ + ItemSeq items = new ItemSeq(); + //calculated exported items to this sector + sector.info.export.each((item, stat) -> items.add(item, (int)(stat.mean * newSecondsPassed * sector.getProductionScale()))); + to.addItems(items); + to.info.lastImported.add(items); + } + } + } + } + } + //third pass: everything else for(Sector sector : planet.sectors){ if(sector.hasBase()){ @@ -229,13 +256,15 @@ public class Universe{ //add production, making sure that it's capped sector.info.production.each((item, stat) -> sector.info.items.add(item, Math.min((int)(stat.mean * newSecondsPassed * scl), sector.info.storageCapacity - sector.info.items.get(item)))); - sector.info.export.each((item, stat) -> { - if(sector.info.items.get(item) <= 0 && sector.info.production.get(item, ExportStat::new).mean < 0 && stat.mean > 0){ - //cap export by import when production is negative. - //TODO remove - stat.mean = Math.min(0f, stat.mean); - } - }); + if(planet.campaignRules.legacyLaunchPads){ + sector.info.export.each((item, stat) -> { + if(sector.info.items.get(item) <= 0 && sector.info.production.get(item, ExportStat::new).mean < 0 && stat.mean > 0){ + //cap export by import when production is negative. + //TODO remove + stat.mean = Math.min(sector.info.lastImported.get(item) / (float)newSecondsPassed, stat.mean); + } + }); + } //prevent negative values with unloaders sector.info.items.checkNegative(); diff --git a/core/src/mindustry/type/Planet.java b/core/src/mindustry/type/Planet.java index 7ef88ed9e4..abf3897168 100644 --- a/core/src/mindustry/type/Planet.java +++ b/core/src/mindustry/type/Planet.java @@ -116,6 +116,8 @@ public class Planet extends UnlockableContent{ public boolean allowWaveSimulation = false; /** Whether to simulate sector invasions from enemy bases. */ public boolean allowSectorInvasion = false; + /** If true, legacy launch pads can be enabled. */ + public boolean allowLegacyLaunchPads = false; /** If true, sectors saves are cleared when lost. */ public boolean clearSectorOnLose = false; /** Multiplier for enemy rebuild speeds; only applied in campaign (not standard rules) */ diff --git a/core/src/mindustry/ui/dialogs/CampaignRulesDialog.java b/core/src/mindustry/ui/dialogs/CampaignRulesDialog.java index 55e6fda0e7..cebe4c72b3 100644 --- a/core/src/mindustry/ui/dialogs/CampaignRulesDialog.java +++ b/core/src/mindustry/ui/dialogs/CampaignRulesDialog.java @@ -68,6 +68,11 @@ public class CampaignRulesDialog extends BaseDialog{ check("@rules.fog", b -> rules.fog = b, () -> rules.fog); check("@rules.showspawns", b -> rules.showSpawns = b, () -> rules.showSpawns); check("@rules.randomwaveai", b -> rules.randomWaveAI = b, () -> rules.randomWaveAI); + + //TODO: this is intentionally hidden until the new mechanics have been well-tested. I don't want people immediately switching to the old mechanics + if(planet.allowLegacyLaunchPads){ + // check("@rules.legacylaunchpads", b -> rules.legacyLaunchPads = b, () -> rules.legacyLaunchPads); + } }).growY(); } diff --git a/core/src/mindustry/world/blocks/campaign/LandingPad.java b/core/src/mindustry/world/blocks/campaign/LandingPad.java index ab8a621352..d8b491d345 100644 --- a/core/src/mindustry/world/blocks/campaign/LandingPad.java +++ b/core/src/mindustry/world/blocks/campaign/LandingPad.java @@ -292,7 +292,7 @@ public class LandingPad extends Block{ cooldown = Mathf.clamp(cooldown); } - if(config != null && state.isCampaign()){ + if(config != null && state.isCampaign() && !state.getPlanet().campaignRules.legacyLaunchPads){ if(cooldown <= 0f && efficiency > 0f && items.total() == 0 && state.rules.sector.info.getImportRate(state.getPlanet(), config) > 0f && state.rules.sector.info.importCooldownTimers.get(config, 0f) >= 1f){ @@ -344,9 +344,14 @@ public class LandingPad extends Block{ table.row(); table.label(() -> { - if(config == null || !state.isCampaign()){ - return ""; + if(!state.isCampaign()) return ""; + + if(state.getPlanet().campaignRules.legacyLaunchPads){ + return Core.bundle.get("landingpad.legacy.disabled"); } + + if(config == null) return ""; + int sources = 0; float perSecond = 0f; for(var s : state.getPlanet().sectors){ diff --git a/core/src/mindustry/world/blocks/campaign/LaunchPad.java b/core/src/mindustry/world/blocks/campaign/LaunchPad.java index cb2014ee98..80fb16c353 100644 --- a/core/src/mindustry/world/blocks/campaign/LaunchPad.java +++ b/core/src/mindustry/world/blocks/campaign/LaunchPad.java @@ -296,7 +296,9 @@ public class LaunchPad extends Block{ Events.fire(new LaunchItemEvent(stack)); } - destsec.addItems(dest); + if(state.getPlanet().campaignRules.legacyLaunchPads){ + destsec.addItems(dest); + } } } } diff --git a/core/src/mindustry/world/meta/BuildVisibility.java b/core/src/mindustry/world/meta/BuildVisibility.java index 5572b3cdf2..06d08323f2 100644 --- a/core/src/mindustry/world/meta/BuildVisibility.java +++ b/core/src/mindustry/world/meta/BuildVisibility.java @@ -15,6 +15,8 @@ public class BuildVisibility{ worldProcessorOnly = new BuildVisibility(() -> Vars.state.rules.editor || Vars.state.rules.allowEditWorldProcessors), sandboxOnly = new BuildVisibility(() -> Vars.state == null || Vars.state.rules.infiniteResources), campaignOnly = new BuildVisibility(() -> Vars.state == null || Vars.state.isCampaign()), + legacyLaunchPadOnly = new BuildVisibility(() -> (Vars.state == null || Vars.state.isCampaign() && Vars.state.getPlanet().campaignRules.legacyLaunchPads) && Blocks.advancedLaunchPad != null && Blocks.advancedLaunchPad.unlocked()), + notLegacyLaunchPadOnly = new BuildVisibility(() -> (Vars.state == null || Vars.state.isCampaign() && !Vars.state.getPlanet().campaignRules.legacyLaunchPads)), lightingOnly = new BuildVisibility(() -> Vars.state == null || Vars.state.rules.lighting || Vars.state.isCampaign()), ammoOnly = new BuildVisibility(() -> Vars.state == null || Vars.state.rules.unitAmmo), fogOnly = new BuildVisibility(() -> Vars.state == null || Vars.state.rules.fog || Vars.state.rules.editor); From 7bd8b9beaaea1699d5b90286dd693df38ed2d1cf Mon Sep 17 00:00:00 2001 From: Github Actions Date: Tue, 4 Feb 2025 00:28:10 +0000 Subject: [PATCH 127/460] Automatic bundle update --- core/assets/bundles/bundle_be.properties | 3 +++ core/assets/bundles/bundle_bg.properties | 3 +++ core/assets/bundles/bundle_ca.properties | 3 +++ core/assets/bundles/bundle_cs.properties | 3 +++ core/assets/bundles/bundle_da.properties | 3 +++ core/assets/bundles/bundle_de.properties | 3 +++ core/assets/bundles/bundle_es.properties | 3 +++ core/assets/bundles/bundle_et.properties | 3 +++ core/assets/bundles/bundle_eu.properties | 3 +++ core/assets/bundles/bundle_fi.properties | 3 +++ core/assets/bundles/bundle_fil.properties | 3 +++ core/assets/bundles/bundle_fr.properties | 3 +++ core/assets/bundles/bundle_hu.properties | 3 +++ core/assets/bundles/bundle_id_ID.properties | 3 +++ core/assets/bundles/bundle_it.properties | 3 +++ core/assets/bundles/bundle_ja.properties | 3 +++ core/assets/bundles/bundle_ko.properties | 3 +++ core/assets/bundles/bundle_lt.properties | 3 +++ core/assets/bundles/bundle_nl.properties | 3 +++ core/assets/bundles/bundle_nl_BE.properties | 3 +++ core/assets/bundles/bundle_pl.properties | 3 +++ core/assets/bundles/bundle_pt_BR.properties | 3 +++ core/assets/bundles/bundle_pt_PT.properties | 3 +++ core/assets/bundles/bundle_ro.properties | 3 +++ core/assets/bundles/bundle_ru.properties | 3 +++ core/assets/bundles/bundle_sr.properties | 3 +++ core/assets/bundles/bundle_sv.properties | 3 +++ core/assets/bundles/bundle_th.properties | 3 +++ core/assets/bundles/bundle_tk.properties | 3 +++ core/assets/bundles/bundle_tr.properties | 3 +++ core/assets/bundles/bundle_uk_UA.properties | 3 +++ core/assets/bundles/bundle_vi.properties | 3 +++ core/assets/bundles/bundle_zh_CN.properties | 3 +++ core/assets/bundles/bundle_zh_TW.properties | 3 +++ 34 files changed, 102 insertions(+) diff --git a/core/assets/bundles/bundle_be.properties b/core/assets/bundles/bundle_be.properties index 3688ddcf62..0ecd6514b6 100644 --- a/core/assets/bundles/bundle_be.properties +++ b/core/assets/bundles/bundle_be.properties @@ -1397,6 +1397,9 @@ rules.title.planet = Планета rules.lighting = Асвятленне rules.fog = Туман Вайны rules.invasions = Enemy Sector Invasions +rules.legacylaunchpads = Legacy Launch Pad Mechanics +rules.legacylaunchpads.info = Allows using launch pads without landing pads, as in 7.0. +landingpad.legacy.disabled = [scarlet]\ue815 Disabled[lightgray] (Legacy Launch Pads enabled) rules.showspawns = Show Enemy Spawns rules.randomwaveai = Unpredictable Wave AI rules.fire = Агонь diff --git a/core/assets/bundles/bundle_bg.properties b/core/assets/bundles/bundle_bg.properties index 8e792e0f62..9848be868e 100644 --- a/core/assets/bundles/bundle_bg.properties +++ b/core/assets/bundles/bundle_bg.properties @@ -1408,6 +1408,9 @@ rules.title.planet = Planet rules.lighting = Светкавици rules.fog = Fog of War rules.invasions = Enemy Sector Invasions +rules.legacylaunchpads = Legacy Launch Pad Mechanics +rules.legacylaunchpads.info = Allows using launch pads without landing pads, as in 7.0. +landingpad.legacy.disabled = [scarlet]\ue815 Disabled[lightgray] (Legacy Launch Pads enabled) rules.showspawns = Show Enemy Spawns rules.randomwaveai = Unpredictable Wave AI rules.fire = Огън diff --git a/core/assets/bundles/bundle_ca.properties b/core/assets/bundles/bundle_ca.properties index a8b0e0b938..11f4a2afb0 100644 --- a/core/assets/bundles/bundle_ca.properties +++ b/core/assets/bundles/bundle_ca.properties @@ -1411,6 +1411,9 @@ rules.title.planet = Planeta rules.lighting = Il·luminació rules.fog = Amaga el terreny inexplorat rules.invasions = Enemy Sector Invasions +rules.legacylaunchpads = Legacy Launch Pad Mechanics +rules.legacylaunchpads.info = Allows using launch pads without landing pads, as in 7.0. +landingpad.legacy.disabled = [scarlet]\ue815 Disabled[lightgray] (Legacy Launch Pads enabled) rules.showspawns = Show Enemy Spawns rules.randomwaveai = Unpredictable Wave AI rules.fire = Foc diff --git a/core/assets/bundles/bundle_cs.properties b/core/assets/bundles/bundle_cs.properties index dbf1e2a80f..6f72df9c9c 100644 --- a/core/assets/bundles/bundle_cs.properties +++ b/core/assets/bundles/bundle_cs.properties @@ -1410,6 +1410,9 @@ rules.title.planet = Planeta rules.lighting = Osvětlení rules.fog = Fog of War rules.invasions = Enemy Sector Invasions +rules.legacylaunchpads = Legacy Launch Pad Mechanics +rules.legacylaunchpads.info = Allows using launch pads without landing pads, as in 7.0. +landingpad.legacy.disabled = [scarlet]\ue815 Disabled[lightgray] (Legacy Launch Pads enabled) rules.showspawns = Show Enemy Spawns rules.randomwaveai = Unpredictable Wave AI rules.fire = Výstřel diff --git a/core/assets/bundles/bundle_da.properties b/core/assets/bundles/bundle_da.properties index 81afaadea4..a9c6ea54fd 100644 --- a/core/assets/bundles/bundle_da.properties +++ b/core/assets/bundles/bundle_da.properties @@ -1399,6 +1399,9 @@ rules.title.planet = Planet rules.lighting = Lys rules.fog = Fog of War rules.invasions = Enemy Sector Invasions +rules.legacylaunchpads = Legacy Launch Pad Mechanics +rules.legacylaunchpads.info = Allows using launch pads without landing pads, as in 7.0. +landingpad.legacy.disabled = [scarlet]\ue815 Disabled[lightgray] (Legacy Launch Pads enabled) rules.showspawns = Show Enemy Spawns rules.randomwaveai = Unpredictable Wave AI rules.fire = Ild diff --git a/core/assets/bundles/bundle_de.properties b/core/assets/bundles/bundle_de.properties index b792aba5ac..081c3d193f 100644 --- a/core/assets/bundles/bundle_de.properties +++ b/core/assets/bundles/bundle_de.properties @@ -1421,6 +1421,9 @@ rules.title.planet = Planet rules.lighting = Blitze rules.fog = Kriegsnebel rules.invasions = Enemy Sector Invasions +rules.legacylaunchpads = Legacy Launch Pad Mechanics +rules.legacylaunchpads.info = Allows using launch pads without landing pads, as in 7.0. +landingpad.legacy.disabled = [scarlet]\ue815 Disabled[lightgray] (Legacy Launch Pads enabled) rules.showspawns = Show Enemy Spawns rules.randomwaveai = Unpredictable Wave AI rules.fire = Feuer diff --git a/core/assets/bundles/bundle_es.properties b/core/assets/bundles/bundle_es.properties index 20a54101b8..f2626f0a79 100644 --- a/core/assets/bundles/bundle_es.properties +++ b/core/assets/bundles/bundle_es.properties @@ -1417,6 +1417,9 @@ rules.title.planet = Planeta rules.lighting = Iluminación rules.fog = Ocultar terreno inexplorado (Fog of War) rules.invasions = Enemy Sector Invasions +rules.legacylaunchpads = Legacy Launch Pad Mechanics +rules.legacylaunchpads.info = Allows using launch pads without landing pads, as in 7.0. +landingpad.legacy.disabled = [scarlet]\ue815 Disabled[lightgray] (Legacy Launch Pads enabled) rules.showspawns = Show Enemy Spawns rules.randomwaveai = Unpredictable Wave AI rules.fire = Fuego diff --git a/core/assets/bundles/bundle_et.properties b/core/assets/bundles/bundle_et.properties index eed737a07e..92fdbb6ee0 100644 --- a/core/assets/bundles/bundle_et.properties +++ b/core/assets/bundles/bundle_et.properties @@ -1399,6 +1399,9 @@ rules.title.planet = Planet rules.lighting = Lighting rules.fog = Fog of War rules.invasions = Enemy Sector Invasions +rules.legacylaunchpads = Legacy Launch Pad Mechanics +rules.legacylaunchpads.info = Allows using launch pads without landing pads, as in 7.0. +landingpad.legacy.disabled = [scarlet]\ue815 Disabled[lightgray] (Legacy Launch Pads enabled) rules.showspawns = Show Enemy Spawns rules.randomwaveai = Unpredictable Wave AI rules.fire = Fire diff --git a/core/assets/bundles/bundle_eu.properties b/core/assets/bundles/bundle_eu.properties index 57d1309e7b..59b4b22259 100644 --- a/core/assets/bundles/bundle_eu.properties +++ b/core/assets/bundles/bundle_eu.properties @@ -1401,6 +1401,9 @@ rules.title.planet = Planet rules.lighting = Lighting rules.fog = Fog of War rules.invasions = Enemy Sector Invasions +rules.legacylaunchpads = Legacy Launch Pad Mechanics +rules.legacylaunchpads.info = Allows using launch pads without landing pads, as in 7.0. +landingpad.legacy.disabled = [scarlet]\ue815 Disabled[lightgray] (Legacy Launch Pads enabled) rules.showspawns = Show Enemy Spawns rules.randomwaveai = Unpredictable Wave AI rules.fire = Fire diff --git a/core/assets/bundles/bundle_fi.properties b/core/assets/bundles/bundle_fi.properties index b0fd5630ab..583c8e2e2f 100644 --- a/core/assets/bundles/bundle_fi.properties +++ b/core/assets/bundles/bundle_fi.properties @@ -1398,6 +1398,9 @@ rules.title.planet = Planeetta rules.lighting = Salamointi rules.fog = Sodan sumu (Fog of War) rules.invasions = Enemy Sector Invasions +rules.legacylaunchpads = Legacy Launch Pad Mechanics +rules.legacylaunchpads.info = Allows using launch pads without landing pads, as in 7.0. +landingpad.legacy.disabled = [scarlet]\ue815 Disabled[lightgray] (Legacy Launch Pads enabled) rules.showspawns = Show Enemy Spawns rules.randomwaveai = Unpredictable Wave AI rules.fire = Tuli diff --git a/core/assets/bundles/bundle_fil.properties b/core/assets/bundles/bundle_fil.properties index 245130b38a..4b1f6ea9cb 100644 --- a/core/assets/bundles/bundle_fil.properties +++ b/core/assets/bundles/bundle_fil.properties @@ -1398,6 +1398,9 @@ rules.title.planet = Planet rules.lighting = Lighting rules.fog = Fog of War rules.invasions = Enemy Sector Invasions +rules.legacylaunchpads = Legacy Launch Pad Mechanics +rules.legacylaunchpads.info = Allows using launch pads without landing pads, as in 7.0. +landingpad.legacy.disabled = [scarlet]\ue815 Disabled[lightgray] (Legacy Launch Pads enabled) rules.showspawns = Show Enemy Spawns rules.randomwaveai = Unpredictable Wave AI rules.fire = Fire diff --git a/core/assets/bundles/bundle_fr.properties b/core/assets/bundles/bundle_fr.properties index a1350d6bf7..8fba5b6a65 100644 --- a/core/assets/bundles/bundle_fr.properties +++ b/core/assets/bundles/bundle_fr.properties @@ -1425,6 +1425,9 @@ rules.title.planet = Planète rules.lighting = Éclairage rules.fog = Brouillard de Guerre rules.invasions = Enemy Sector Invasions +rules.legacylaunchpads = Legacy Launch Pad Mechanics +rules.legacylaunchpads.info = Allows using launch pads without landing pads, as in 7.0. +landingpad.legacy.disabled = [scarlet]\ue815 Disabled[lightgray] (Legacy Launch Pads enabled) rules.showspawns = Show Enemy Spawns rules.randomwaveai = Unpredictable Wave AI rules.fire = Feu diff --git a/core/assets/bundles/bundle_hu.properties b/core/assets/bundles/bundle_hu.properties index 033c760b35..bafa116ee8 100644 --- a/core/assets/bundles/bundle_hu.properties +++ b/core/assets/bundles/bundle_hu.properties @@ -1432,6 +1432,9 @@ rules.title.planet = Bolygó rules.lighting = Világítás rules.fog = A háború köde rules.invasions = Ellenséges szektorokból érkező inváziók +rules.legacylaunchpads = Legacy Launch Pad Mechanics +rules.legacylaunchpads.info = Allows using launch pads without landing pads, as in 7.0. +landingpad.legacy.disabled = [scarlet]\ue815 Disabled[lightgray] (Legacy Launch Pads enabled) rules.showspawns = Ellenséges kezdőpontok megjelenítése a minitérképen rules.randomwaveai = Kiszámíthatatlan ellenséges támadások (MI) rules.fire = Tűz diff --git a/core/assets/bundles/bundle_id_ID.properties b/core/assets/bundles/bundle_id_ID.properties index 39f2be18ec..cfcc41cf04 100644 --- a/core/assets/bundles/bundle_id_ID.properties +++ b/core/assets/bundles/bundle_id_ID.properties @@ -1428,6 +1428,9 @@ rules.title.planet = Planet rules.lighting = Penerangan rules.fog = Kabut Perang rules.invasions = Enemy Sector Invasions +rules.legacylaunchpads = Legacy Launch Pad Mechanics +rules.legacylaunchpads.info = Allows using launch pads without landing pads, as in 7.0. +landingpad.legacy.disabled = [scarlet]\ue815 Disabled[lightgray] (Legacy Launch Pads enabled) rules.showspawns = Show Enemy Spawns rules.randomwaveai = Unpredictable Wave AI rules.fire = Api diff --git a/core/assets/bundles/bundle_it.properties b/core/assets/bundles/bundle_it.properties index d1f859e999..8eb5058287 100644 --- a/core/assets/bundles/bundle_it.properties +++ b/core/assets/bundles/bundle_it.properties @@ -1404,6 +1404,9 @@ rules.title.planet = pianeta rules.lighting = Illuminazione rules.fog = Nebbia di guerra rules.invasions = Enemy Sector Invasions +rules.legacylaunchpads = Legacy Launch Pad Mechanics +rules.legacylaunchpads.info = Allows using launch pads without landing pads, as in 7.0. +landingpad.legacy.disabled = [scarlet]\ue815 Disabled[lightgray] (Legacy Launch Pads enabled) rules.showspawns = Show Enemy Spawns rules.randomwaveai = Unpredictable Wave AI rules.fire = Fuoco diff --git a/core/assets/bundles/bundle_ja.properties b/core/assets/bundles/bundle_ja.properties index 10cb04c305..9f31c83a8a 100644 --- a/core/assets/bundles/bundle_ja.properties +++ b/core/assets/bundles/bundle_ja.properties @@ -1410,6 +1410,9 @@ rules.title.planet = 惑星 rules.lighting = 霧 rules.fog = 戦場の霧 rules.invasions = Enemy Sector Invasions +rules.legacylaunchpads = Legacy Launch Pad Mechanics +rules.legacylaunchpads.info = Allows using launch pads without landing pads, as in 7.0. +landingpad.legacy.disabled = [scarlet]\ue815 Disabled[lightgray] (Legacy Launch Pads enabled) rules.showspawns = Show Enemy Spawns rules.randomwaveai = Unpredictable Wave AI rules.fire = 火災 diff --git a/core/assets/bundles/bundle_ko.properties b/core/assets/bundles/bundle_ko.properties index e8f3e27623..e13fa0799f 100644 --- a/core/assets/bundles/bundle_ko.properties +++ b/core/assets/bundles/bundle_ko.properties @@ -1431,6 +1431,9 @@ rules.title.planet = 행성 rules.lighting = 조명 표시 rules.fog = 전장의 안개 rules.invasions = 적 지역 침공 +rules.legacylaunchpads = Legacy Launch Pad Mechanics +rules.legacylaunchpads.info = Allows using launch pads without landing pads, as in 7.0. +landingpad.legacy.disabled = [scarlet]\ue815 Disabled[lightgray] (Legacy Launch Pads enabled) rules.showspawns = 적 스폰 표시 rules.randomwaveai = 무작위 단계 AI rules.fire = 방화 허용 diff --git a/core/assets/bundles/bundle_lt.properties b/core/assets/bundles/bundle_lt.properties index 2accf92543..513d61f59a 100644 --- a/core/assets/bundles/bundle_lt.properties +++ b/core/assets/bundles/bundle_lt.properties @@ -1399,6 +1399,9 @@ rules.title.planet = Planet rules.lighting = Apšvietimas rules.fog = Fog of War rules.invasions = Enemy Sector Invasions +rules.legacylaunchpads = Legacy Launch Pad Mechanics +rules.legacylaunchpads.info = Allows using launch pads without landing pads, as in 7.0. +landingpad.legacy.disabled = [scarlet]\ue815 Disabled[lightgray] (Legacy Launch Pads enabled) rules.showspawns = Show Enemy Spawns rules.randomwaveai = Unpredictable Wave AI rules.fire = Fire diff --git a/core/assets/bundles/bundle_nl.properties b/core/assets/bundles/bundle_nl.properties index 418133003a..39d61aba22 100644 --- a/core/assets/bundles/bundle_nl.properties +++ b/core/assets/bundles/bundle_nl.properties @@ -1411,6 +1411,9 @@ rules.title.planet = Planeet rules.lighting = Belichting rules.fog = Mist van de Oorlog rules.invasions = Enemy Sector Invasions +rules.legacylaunchpads = Legacy Launch Pad Mechanics +rules.legacylaunchpads.info = Allows using launch pads without landing pads, as in 7.0. +landingpad.legacy.disabled = [scarlet]\ue815 Disabled[lightgray] (Legacy Launch Pads enabled) rules.showspawns = Show Enemy Spawns rules.randomwaveai = Unpredictable Wave AI rules.fire = Vuur diff --git a/core/assets/bundles/bundle_nl_BE.properties b/core/assets/bundles/bundle_nl_BE.properties index 6350e68df9..dc2204a38b 100644 --- a/core/assets/bundles/bundle_nl_BE.properties +++ b/core/assets/bundles/bundle_nl_BE.properties @@ -1399,6 +1399,9 @@ rules.title.planet = Planet rules.lighting = Lighting rules.fog = Fog of War rules.invasions = Enemy Sector Invasions +rules.legacylaunchpads = Legacy Launch Pad Mechanics +rules.legacylaunchpads.info = Allows using launch pads without landing pads, as in 7.0. +landingpad.legacy.disabled = [scarlet]\ue815 Disabled[lightgray] (Legacy Launch Pads enabled) rules.showspawns = Show Enemy Spawns rules.randomwaveai = Unpredictable Wave AI rules.fire = Fire diff --git a/core/assets/bundles/bundle_pl.properties b/core/assets/bundles/bundle_pl.properties index e459a7cd29..932d1ce433 100644 --- a/core/assets/bundles/bundle_pl.properties +++ b/core/assets/bundles/bundle_pl.properties @@ -1408,6 +1408,9 @@ rules.title.planet = Planet rules.lighting = Oświetlenie rules.fog = Mgła Wojny rules.invasions = Enemy Sector Invasions +rules.legacylaunchpads = Legacy Launch Pad Mechanics +rules.legacylaunchpads.info = Allows using launch pads without landing pads, as in 7.0. +landingpad.legacy.disabled = [scarlet]\ue815 Disabled[lightgray] (Legacy Launch Pads enabled) rules.showspawns = Show Enemy Spawns rules.randomwaveai = Unpredictable Wave AI rules.fire = Ogień diff --git a/core/assets/bundles/bundle_pt_BR.properties b/core/assets/bundles/bundle_pt_BR.properties index 2190055f55..a20a704b37 100644 --- a/core/assets/bundles/bundle_pt_BR.properties +++ b/core/assets/bundles/bundle_pt_BR.properties @@ -1418,6 +1418,9 @@ rules.title.planet = Planeta rules.lighting = Iluminação rules.fog = Névoa de Guerra rules.invasions = Enemy Sector Invasions +rules.legacylaunchpads = Legacy Launch Pad Mechanics +rules.legacylaunchpads.info = Allows using launch pads without landing pads, as in 7.0. +landingpad.legacy.disabled = [scarlet]\ue815 Disabled[lightgray] (Legacy Launch Pads enabled) rules.showspawns = Show Enemy Spawns rules.randomwaveai = Unpredictable Wave AI rules.fire = Fogo diff --git a/core/assets/bundles/bundle_pt_PT.properties b/core/assets/bundles/bundle_pt_PT.properties index bad8364fe6..3fef2bcb84 100644 --- a/core/assets/bundles/bundle_pt_PT.properties +++ b/core/assets/bundles/bundle_pt_PT.properties @@ -1399,6 +1399,9 @@ rules.title.planet = Planet rules.lighting = Lighting rules.fog = Fog of War rules.invasions = Enemy Sector Invasions +rules.legacylaunchpads = Legacy Launch Pad Mechanics +rules.legacylaunchpads.info = Allows using launch pads without landing pads, as in 7.0. +landingpad.legacy.disabled = [scarlet]\ue815 Disabled[lightgray] (Legacy Launch Pads enabled) rules.showspawns = Show Enemy Spawns rules.randomwaveai = Unpredictable Wave AI rules.fire = Fire diff --git a/core/assets/bundles/bundle_ro.properties b/core/assets/bundles/bundle_ro.properties index f1800a2dcf..3e8201dffb 100644 --- a/core/assets/bundles/bundle_ro.properties +++ b/core/assets/bundles/bundle_ro.properties @@ -1410,6 +1410,9 @@ rules.title.planet = Planet rules.lighting = Luminozitate Ambientală rules.fog = Fog of War rules.invasions = Enemy Sector Invasions +rules.legacylaunchpads = Legacy Launch Pad Mechanics +rules.legacylaunchpads.info = Allows using launch pads without landing pads, as in 7.0. +landingpad.legacy.disabled = [scarlet]\ue815 Disabled[lightgray] (Legacy Launch Pads enabled) rules.showspawns = Show Enemy Spawns rules.randomwaveai = Unpredictable Wave AI rules.fire = Foc diff --git a/core/assets/bundles/bundle_ru.properties b/core/assets/bundles/bundle_ru.properties index 885fcfc0e0..eaab89ae0e 100644 --- a/core/assets/bundles/bundle_ru.properties +++ b/core/assets/bundles/bundle_ru.properties @@ -1410,6 +1410,9 @@ rules.title.planet = Планета rules.lighting = Освещение rules.fog = Туман войны rules.invasions = Enemy Sector Invasions +rules.legacylaunchpads = Legacy Launch Pad Mechanics +rules.legacylaunchpads.info = Allows using launch pads without landing pads, as in 7.0. +landingpad.legacy.disabled = [scarlet]\ue815 Disabled[lightgray] (Legacy Launch Pads enabled) rules.showspawns = Show Enemy Spawns rules.randomwaveai = Unpredictable Wave AI rules.fire = Огонь diff --git a/core/assets/bundles/bundle_sr.properties b/core/assets/bundles/bundle_sr.properties index f780847378..c925b9af3a 100644 --- a/core/assets/bundles/bundle_sr.properties +++ b/core/assets/bundles/bundle_sr.properties @@ -1412,6 +1412,9 @@ rules.title.planet = Planeta rules.lighting = Osvetljenje rules.fog = Magla Rata rules.invasions = Enemy Sector Invasions +rules.legacylaunchpads = Legacy Launch Pad Mechanics +rules.legacylaunchpads.info = Allows using launch pads without landing pads, as in 7.0. +landingpad.legacy.disabled = [scarlet]\ue815 Disabled[lightgray] (Legacy Launch Pads enabled) rules.showspawns = Show Enemy Spawns rules.randomwaveai = Unpredictable Wave AI rules.fire = Plamen diff --git a/core/assets/bundles/bundle_sv.properties b/core/assets/bundles/bundle_sv.properties index cef3a8e710..1afdc82be6 100644 --- a/core/assets/bundles/bundle_sv.properties +++ b/core/assets/bundles/bundle_sv.properties @@ -1399,6 +1399,9 @@ rules.title.planet = Planet rules.lighting = Lighting rules.fog = Fog of War rules.invasions = Enemy Sector Invasions +rules.legacylaunchpads = Legacy Launch Pad Mechanics +rules.legacylaunchpads.info = Allows using launch pads without landing pads, as in 7.0. +landingpad.legacy.disabled = [scarlet]\ue815 Disabled[lightgray] (Legacy Launch Pads enabled) rules.showspawns = Show Enemy Spawns rules.randomwaveai = Unpredictable Wave AI rules.fire = Fire diff --git a/core/assets/bundles/bundle_th.properties b/core/assets/bundles/bundle_th.properties index dd89b0046c..3eda7e72e9 100644 --- a/core/assets/bundles/bundle_th.properties +++ b/core/assets/bundles/bundle_th.properties @@ -1413,6 +1413,9 @@ rules.title.planet = ดาว rules.lighting = แสง rules.fog = หมอกแห่งสงคราม rules.invasions = การรุกรานของฐานทัพศัตรู +rules.legacylaunchpads = Legacy Launch Pad Mechanics +rules.legacylaunchpads.info = Allows using launch pads without landing pads, as in 7.0. +landingpad.legacy.disabled = [scarlet]\ue815 Disabled[lightgray] (Legacy Launch Pads enabled) rules.showspawns = แสดงจุดเกิดศัตรู rules.randomwaveai = AI คลื่นแบบคาดเดาไม่ได้ rules.fire = ไฟ diff --git a/core/assets/bundles/bundle_tk.properties b/core/assets/bundles/bundle_tk.properties index 2dc3da2f3d..f03cb0534b 100644 --- a/core/assets/bundles/bundle_tk.properties +++ b/core/assets/bundles/bundle_tk.properties @@ -1399,6 +1399,9 @@ rules.title.planet = Planet rules.lighting = Lighting rules.fog = Fog of War rules.invasions = Enemy Sector Invasions +rules.legacylaunchpads = Legacy Launch Pad Mechanics +rules.legacylaunchpads.info = Allows using launch pads without landing pads, as in 7.0. +landingpad.legacy.disabled = [scarlet]\ue815 Disabled[lightgray] (Legacy Launch Pads enabled) rules.showspawns = Show Enemy Spawns rules.randomwaveai = Unpredictable Wave AI rules.fire = Fire diff --git a/core/assets/bundles/bundle_tr.properties b/core/assets/bundles/bundle_tr.properties index 35d39455ff..feed3ded11 100644 --- a/core/assets/bundles/bundle_tr.properties +++ b/core/assets/bundles/bundle_tr.properties @@ -1408,6 +1408,9 @@ rules.title.planet = Gezegen rules.lighting = Işıklandırma rules.fog = Savaş Sisi rules.invasions = Enemy Sector Invasions +rules.legacylaunchpads = Legacy Launch Pad Mechanics +rules.legacylaunchpads.info = Allows using launch pads without landing pads, as in 7.0. +landingpad.legacy.disabled = [scarlet]\ue815 Disabled[lightgray] (Legacy Launch Pads enabled) rules.showspawns = Show Enemy Spawns rules.randomwaveai = Unpredictable Wave AI rules.fire = Ateş diff --git a/core/assets/bundles/bundle_uk_UA.properties b/core/assets/bundles/bundle_uk_UA.properties index cc0243b3ed..c6046c3cee 100644 --- a/core/assets/bundles/bundle_uk_UA.properties +++ b/core/assets/bundles/bundle_uk_UA.properties @@ -1419,6 +1419,9 @@ rules.title.planet = Планета rules.lighting = Світлотінь rules.fog = Туман війни rules.invasions = Enemy Sector Invasions +rules.legacylaunchpads = Legacy Launch Pad Mechanics +rules.legacylaunchpads.info = Allows using launch pads without landing pads, as in 7.0. +landingpad.legacy.disabled = [scarlet]\ue815 Disabled[lightgray] (Legacy Launch Pads enabled) rules.showspawns = Show Enemy Spawns rules.randomwaveai = Unpredictable Wave AI rules.fire = Вогонь diff --git a/core/assets/bundles/bundle_vi.properties b/core/assets/bundles/bundle_vi.properties index 7aa6ff6a3b..97bc940327 100644 --- a/core/assets/bundles/bundle_vi.properties +++ b/core/assets/bundles/bundle_vi.properties @@ -1432,6 +1432,9 @@ rules.title.planet = Hành Tinh rules.lighting = Ánh Sáng rules.fog = Sương Mù Chiến Tranh rules.invasions = Kẻ Địch Xâm Lược Khu Vực +rules.legacylaunchpads = Legacy Launch Pad Mechanics +rules.legacylaunchpads.info = Allows using launch pads without landing pads, as in 7.0. +landingpad.legacy.disabled = [scarlet]\ue815 Disabled[lightgray] (Legacy Launch Pads enabled) rules.showspawns = Hiện Khu Kẻ Địch Xuất Hiện rules.randomwaveai = Đợt Tấn Công AI Không Đoán Trước rules.fire = Lửa diff --git a/core/assets/bundles/bundle_zh_CN.properties b/core/assets/bundles/bundle_zh_CN.properties index 6e8ae176d9..2cc46aa133 100644 --- a/core/assets/bundles/bundle_zh_CN.properties +++ b/core/assets/bundles/bundle_zh_CN.properties @@ -1421,6 +1421,9 @@ rules.title.planet = 星球 rules.lighting = 环境光 rules.fog = 战争迷雾 rules.invasions = Enemy Sector Invasions +rules.legacylaunchpads = Legacy Launch Pad Mechanics +rules.legacylaunchpads.info = Allows using launch pads without landing pads, as in 7.0. +landingpad.legacy.disabled = [scarlet]\ue815 Disabled[lightgray] (Legacy Launch Pads enabled) rules.showspawns = Show Enemy Spawns rules.randomwaveai = Unpredictable Wave AI rules.fire = 允许火焰产生并蔓延 diff --git a/core/assets/bundles/bundle_zh_TW.properties b/core/assets/bundles/bundle_zh_TW.properties index d41dd8aaeb..96b922583d 100644 --- a/core/assets/bundles/bundle_zh_TW.properties +++ b/core/assets/bundles/bundle_zh_TW.properties @@ -1416,6 +1416,9 @@ rules.title.planet = 星球 rules.lighting = 光照 rules.fog = 戰爭迷霧 rules.invasions = Enemy Sector Invasions +rules.legacylaunchpads = Legacy Launch Pad Mechanics +rules.legacylaunchpads.info = Allows using launch pads without landing pads, as in 7.0. +landingpad.legacy.disabled = [scarlet]\ue815 Disabled[lightgray] (Legacy Launch Pads enabled) rules.showspawns = Show Enemy Spawns rules.randomwaveai = Unpredictable Wave AI rules.fire = 火 From 024a084a7a5907afce39b9f0dbf49ea60a22ec57 Mon Sep 17 00:00:00 2001 From: Anuken Date: Mon, 3 Feb 2025 20:14:59 -0500 Subject: [PATCH 128/460] Fixed #10461 --- core/src/mindustry/world/blocks/defense/turrets/Turret.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/core/src/mindustry/world/blocks/defense/turrets/Turret.java b/core/src/mindustry/world/blocks/defense/turrets/Turret.java index e56be0378a..617a9c3752 100644 --- a/core/src/mindustry/world/blocks/defense/turrets/Turret.java +++ b/core/src/mindustry/world/blocks/defense/turrets/Turret.java @@ -559,14 +559,14 @@ public class Turret extends ReloadTurret{ /** @return whether the turret has ammo. */ public boolean hasAmmo(){ - //used for "side-ammo" like gas in some turrets - if(!canConsume()) return false; - //skip first entry if it has less than the required amount of ammo if(ammo.size >= 2 && ammo.peek().amount < ammoPerShot && ammo.get(ammo.size - 2).amount >= ammoPerShot){ ammo.swap(ammo.size - 1, ammo.size - 2); } + //used for "side-ammo" like gas in some turrets + if(!canConsume()) return false; + return ammo.size > 0 && (ammo.peek().amount >= ammoPerShot || cheating()); } From 9f03050d04e7784843da4740cbce1e829ea23df4 Mon Sep 17 00:00:00 2001 From: Anuken Date: Mon, 3 Feb 2025 21:55:33 -0500 Subject: [PATCH 129/460] Allow launch/landing pads outside of campaign as voids/sources --- .../world/blocks/campaign/LandingPad.java | 85 ++++++++++++++++--- .../world/blocks/campaign/LaunchPad.java | 9 +- 2 files changed, 77 insertions(+), 17 deletions(-) diff --git a/core/src/mindustry/world/blocks/campaign/LandingPad.java b/core/src/mindustry/world/blocks/campaign/LandingPad.java index d8b491d345..7435f6ebd5 100644 --- a/core/src/mindustry/world/blocks/campaign/LandingPad.java +++ b/core/src/mindustry/world/blocks/campaign/LandingPad.java @@ -1,6 +1,8 @@ package mindustry.world.blocks.campaign; import arc.*; +import arc.Graphics.*; +import arc.Graphics.Cursor.*; import arc.graphics.*; import arc.graphics.g2d.*; import arc.math.*; @@ -62,8 +64,16 @@ public class LandingPad extends Block{ emitLight = true; lightRadius = 90f; - config(Item.class, (LandingPadBuild build, Item item) -> build.config = item); - configClear((LandingPadBuild build) -> build.config = null); + config(Item.class, (LandingPadBuild build, Item item) -> { + if(!accessible()) return; + + build.config = item; + }); + configClear((LandingPadBuild build) -> { + if(!accessible()) return; + + build.config = null; + }); } @Override @@ -109,6 +119,10 @@ public class LandingPad extends Block{ build.handleLanding(); } + public boolean accessible(){ + return state.rules.editor || state.rules.allowEditWorldProcessors || state.isCampaign(); + } + public class LandingPadBuild extends Building{ public @Nullable Item config; //priority collisions are possible, but should be extremely rare @@ -120,14 +134,16 @@ public class LandingPad extends Block{ public float liquidRemoved; public void handleLanding(){ - if(!state.isCampaign() || config == null) return; + if(config == null) return; cooldown = 1f; arriving = config; arrivingTimer = 0f; liquidRemoved = 0f; - state.rules.sector.info.importCooldownTimers.put(config, 0f); + if(state.isCampaign() && !isFake()){ + state.rules.sector.info.importCooldownTimers.put(config, 0f); + } } public void updateTimers(){ @@ -276,7 +292,9 @@ public class LandingPad extends Block{ Effect.shake(3f, 3f, this); items.set(arriving, itemCapacity); - state.getSector().info.handleItemImport(arriving, itemCapacity); + if(!isFake()){ + state.getSector().info.handleItemImport(arriving, itemCapacity); + } arriving = null; arrivingTimer = 0f; @@ -292,29 +310,70 @@ public class LandingPad extends Block{ cooldown = Mathf.clamp(cooldown); } - if(config != null && state.isCampaign() && !state.getPlanet().campaignRules.legacyLaunchPads){ + if(config != null && (isFake() || (state.isCampaign() && !state.getPlanet().campaignRules.legacyLaunchPads))){ - if(cooldown <= 0f && efficiency > 0f && items.total() == 0 && state.rules.sector.info.getImportRate(state.getPlanet(), config) > 0f && state.rules.sector.info.importCooldownTimers.get(config, 0f) >= 1f){ + if(cooldown <= 0f && efficiency > 0f && items.total() == 0 && (isFake() || (state.rules.sector.info.getImportRate(state.getPlanet(), config) > 0f && state.rules.sector.info.importCooldownTimers.get(config, 0f) >= 1f))){ - //queue landing for next frame - waiting.get(config, Seq::new).add(this); + if(isFake()){ + //there is no queue for enemy team blocks, it's all fake + Call.landingPadLanded(tile); + }else{ + //queue landing for next frame + waiting.get(config, Seq::new).add(this); + } } } } + /** @return whether this pad should receive items forever, essentially acting as an item source for maps. */ + public boolean isFake(){ + return team != state.rules.defaultTeam || !state.isCampaign(); + } + @Override public boolean canDump(Building to, Item item){ //hack: canDump is only ever called right before item offload, so count the item as "produced" before that. - //TODO: is this necessary? produced(item); return true; } + @Override + public void drawSelect(){ + if(config != null){ + float dx = x - size * tilesize/2f, dy = y + size * tilesize/2f, s = iconSmall / 4f; + Draw.mixcol(Color.darkGray, 1f); + Draw.rect(config.fullIcon, dx, dy - 1, s, s); + Draw.reset(); + Draw.rect(config.fullIcon, dx, dy, s, s); + } + } + + @Override + public Cursor getCursor(){ + return !accessible() ? SystemCursor.arrow : super.getCursor(); + } + + @Override + public boolean shouldShowConfigure(Player player){ + return accessible(); + } + + @Override + public boolean onConfigureBuildTapped(Building other){ + if(this == other || !accessible()){ + deselect(); + return false; + } + + return super.onConfigureBuildTapped(other); + } + @Override public void buildConfiguration(Table table){ + ItemSelection.buildTable(LandingPad.this, table, content.items(), () -> config, this::configure, selectionRows, selectionColumns); - if(!net.client()){ + if(!net.client() && !isFake()){ table.row(); table.table(t -> { @@ -340,11 +399,11 @@ public class LandingPad extends Block{ public void display(Table table){ super.display(table); - if(!state.isCampaign() || net.client() || team != player.team()) return; + if(!state.isCampaign() || net.client() || team != player.team() || isFake()) return; table.row(); table.label(() -> { - if(!state.isCampaign()) return ""; + if(!state.isCampaign() || isFake()) return ""; if(state.getPlanet().campaignRules.legacyLaunchPads){ return Core.bundle.get("landingpad.legacy.disabled"); diff --git a/core/src/mindustry/world/blocks/campaign/LaunchPad.java b/core/src/mindustry/world/blocks/campaign/LaunchPad.java index 80fb16c353..1063b45460 100644 --- a/core/src/mindustry/world/blocks/campaign/LaunchPad.java +++ b/core/src/mindustry/world/blocks/campaign/LaunchPad.java @@ -104,8 +104,6 @@ public class LaunchPad extends Block{ super.draw(); - if(!state.isCampaign()) return; - if(lightRegion.found()){ Draw.color(lightColor); float progress = Math.min((float)items.total() / itemCapacity, launchCounter / launchTime); @@ -136,7 +134,6 @@ public class LaunchPad extends Block{ @Override public void updateTile(){ - if(!state.isCampaign()) return; //increment launchCounter then launch when full and base conditions are met if((launchCounter += edelta()) >= launchTime && items.total() >= itemCapacity){ @@ -172,9 +169,13 @@ public class LaunchPad extends Block{ }).pad(4).wrap().width(200f).left(); } + @Override + public boolean shouldShowConfigure(Player player){ + return state.isCampaign(); + } + @Override public void buildConfiguration(Table table){ - //TODO: this UI should be on landing pads if(!state.isCampaign() || net.client()){ deselect(); return; From fb5945f1e810ebf1584f03d2797c2ac005350223 Mon Sep 17 00:00:00 2001 From: Anuken Date: Tue, 4 Feb 2025 12:18:04 -0500 Subject: [PATCH 130/460] Place base battery schematics with full charge / Exclude fallback sprites from assetsJar --- build.gradle | 2 +- core/src/mindustry/maps/generators/BaseGenerator.java | 10 +++++++--- 2 files changed, 8 insertions(+), 4 deletions(-) diff --git a/build.gradle b/build.gradle index 6a49b0ce6e..90e98a89dc 100644 --- a/build.gradle +++ b/build.gradle @@ -309,7 +309,7 @@ project(":core"){ task assetsJar(type: Jar, dependsOn: ":tools:pack"){ archiveClassifier = 'assets' from files("assets"){ - exclude "config", "cache", "music", "sounds" + exclude "config", "cache", "music", "sounds", "sprites/fallback" } } diff --git a/core/src/mindustry/maps/generators/BaseGenerator.java b/core/src/mindustry/maps/generators/BaseGenerator.java index 27623957be..c39db91b6f 100644 --- a/core/src/mindustry/maps/generators/BaseGenerator.java +++ b/core/src/mindustry/maps/generators/BaseGenerator.java @@ -175,9 +175,13 @@ public class BaseGenerator{ if(tiles == null) return; for(Tile tile : tiles){ - if(tile.isCenter() && tile.block() instanceof PowerNode && tile.team() == state.rules.waveTeam){ - tile.build.configureAny(new Point2[0]); - tile.build.placed(); + if(tile.isCenter() && tile.team() == state.rules.waveTeam){ + if(tile.block() instanceof PowerNode){ + tile.build.configureAny(new Point2[0]); + tile.build.placed(); + }else if(tile.block() instanceof Battery){ + tile.build.power.status = 1f; + } } } } From 0b4a7b3b161a0084f76c14d27839d9ef8939f85d Mon Sep 17 00:00:00 2001 From: SomeonesShade Date: Wed, 5 Feb 2025 02:24:47 +0800 Subject: [PATCH 131/460] Added scaleLifetimeOffset and Centered Ripple Projectiles (#10292) * Added scaleLifetimeOffset Changed ripple to have its shot centered, calculated by: (1 - velocityRnd/2)^-1 * unneccessary parenthesis * Update Turret.java one last adjustement, hopefully --- core/src/mindustry/content/Blocks.java | 1 + core/src/mindustry/world/blocks/defense/turrets/Turret.java | 4 +++- 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/core/src/mindustry/content/Blocks.java b/core/src/mindustry/content/Blocks.java index a3029ec77b..f5770b55e7 100644 --- a/core/src/mindustry/content/Blocks.java +++ b/core/src/mindustry/content/Blocks.java @@ -3754,6 +3754,7 @@ public class Blocks{ ammoUseEffect = Fx.casing3Double; ammoPerShot = 2; velocityRnd = 0.2f; + scaleLifetimeOffset = 1f / 9f; recoil = 6f; shake = 2f; range = 290f; diff --git a/core/src/mindustry/world/blocks/defense/turrets/Turret.java b/core/src/mindustry/world/blocks/defense/turrets/Turret.java index 617a9c3752..e08c0b5420 100644 --- a/core/src/mindustry/world/blocks/defense/turrets/Turret.java +++ b/core/src/mindustry/world/blocks/defense/turrets/Turret.java @@ -54,6 +54,8 @@ public class Turret extends ReloadTurret{ public float inaccuracy = 0f; /** Fraction of bullet velocity that is random. */ public float velocityRnd = 0f; + /** Fraction of lifetime that is added to bullets with lifeScale. */ + public float scaleLifetimeOffset = 0f; /** Maximum angle difference in degrees at which turret will still try to shoot. */ public float shootCone = 8f; /** Turret shoot point. */ @@ -640,7 +642,7 @@ public class Turret extends ReloadTurret{ bulletY = y + Angles.trnsy(rotation - 90, shootX + xOffset + xSpread, shootY + yOffset), shootAngle = rotation + angleOffset + Mathf.range(inaccuracy + type.inaccuracy); - float lifeScl = type.scaleLife ? Mathf.clamp(Mathf.dst(bulletX, bulletY, targetPos.x, targetPos.y) / type.range, minRange / type.range, range() / type.range) : 1f; + float lifeScl = type.scaleLife ? Mathf.clamp((1 + scaleLifetimeOffset) * Mathf.dst(bulletX, bulletY, targetPos.x, targetPos.y) / type.range, minRange / type.range, range() / type.range) : 1f; //TODO aimX / aimY for multi shot turrets? handleBullet(type.create(this, team, bulletX, bulletY, shootAngle, -1f, (1f - velocityRnd) + Mathf.random(velocityRnd), lifeScl, null, mover, targetPos.x, targetPos.y), xOffset, yOffset, shootAngle - rotation); From 5a92bac127d10af341d3f14f6c4aa70945fa47d6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=92=D0=BE=D0=BB=D1=88=D0=B5=D0=B1=D0=BD=D0=B8=D0=BA?= <127457914+VikoMin@users.noreply.github.com> Date: Wed, 5 Feb 2025 01:25:11 +0700 Subject: [PATCH 132/460] Update servers_v7.json (#10460) --- servers_v7.json | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/servers_v7.json b/servers_v7.json index e3d65239f0..8db503ce9a 100644 --- a/servers_v7.json +++ b/servers_v7.json @@ -8,10 +8,16 @@ "121.127.37.17:6570", "121.127.37.17:6571", "121.127.37.17:6572", + "194.164.245.218:6567", + "194.164.245.218:6568", + "194.164.245.218:6569", "194.164.245.218:6570", "194.164.245.218:6571", "194.164.245.218:6572", - "194.164.245.218:6573" + "194.164.245.218:6573", + "194.164.245.218:6574", + "194.164.245.218:6575", + "194.164.245.218:6576" ] }, { From 5f48ba8858457644edfd71a1101716338ac2ec42 Mon Sep 17 00:00:00 2001 From: 315923876 <115673942+315923876@users.noreply.github.com> Date: Wed, 5 Feb 2025 02:25:35 +0800 Subject: [PATCH 133/460] Update servers address (#10457) Update servers address, approved by server admin --- servers_v7.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/servers_v7.json b/servers_v7.json index 8db503ce9a..90fec0e040 100644 --- a/servers_v7.json +++ b/servers_v7.json @@ -221,7 +221,8 @@ "name": "Realm of Serene Lime", "address": [ "mindustry.icu", - "sx.mindustry.icu" + "sx.mindustry.icu", + "9k38.igla.pics" ] }, { From aa8e3b4a37949c48061677ea37df1406f8e27d96 Mon Sep 17 00:00:00 2001 From: Maxiron794 <56217284+Maxiron794@users.noreply.github.com> Date: Tue, 4 Feb 2025 19:32:52 +0100 Subject: [PATCH 134/460] fix of diode's strange behavior (#10454) --- .../world/blocks/power/PowerDiode.java | 29 ++++++++++--------- 1 file changed, 16 insertions(+), 13 deletions(-) diff --git a/core/src/mindustry/world/blocks/power/PowerDiode.java b/core/src/mindustry/world/blocks/power/PowerDiode.java index 5fa2e1ba50..1dc0f016c3 100644 --- a/core/src/mindustry/world/blocks/power/PowerDiode.java +++ b/core/src/mindustry/world/blocks/power/PowerDiode.java @@ -62,20 +62,23 @@ public class PowerDiode extends Block{ PowerGraph frontGraph = front().power.graph; if(backGraph == frontGraph) return; - // 0f - 1f of battery capacity in use - float backStored = backGraph.getBatteryStored() / backGraph.getTotalBatteryCapacity(); - float frontStored = frontGraph.getBatteryStored() / frontGraph.getTotalBatteryCapacity(); + float backStored = backGraph.getBatteryStored(); + float backCapacity = backGraph.getTotalBatteryCapacity(); + float frontStored = frontGraph.getBatteryStored(); + float frontCapacity = frontGraph.getTotalBatteryCapacity(); - // try to send if the back side has more % capacity stored than the front side - if(backStored > frontStored){ - // send half of the difference - float amount = backGraph.getBatteryStored() * (backStored - frontStored) / 2; - // prevent sending more than the front can handle - amount = Mathf.clamp(amount, 0, frontGraph.getTotalBatteryCapacity() * (1 - frontStored)); + if(backStored/backCapacity <= frontStored/frontCapacity) return; - backGraph.transferPower(-amount); - frontGraph.transferPower(amount); - } + float targetPercentage = (frontStored + backStored) / (frontCapacity + backCapacity); + + // send half of the difference + float amount = (targetPercentage * frontCapacity - frontStored) / 2; + + // prevent sending more than the front can handle + amount = Mathf.clamp(amount, 0, frontCapacity - frontStored); + + backGraph.transferPower(-amount); + frontGraph.transferPower(amount); } } -} +} \ No newline at end of file From 88388fffebcdec435c1b08116aab82437f7ce970 Mon Sep 17 00:00:00 2001 From: Buj <42136194+5GameMaker@users.noreply.github.com> Date: Wed, 5 Feb 2025 01:44:58 +0700 Subject: [PATCH 135/460] Bring back language in trace, except it actually works now (#10420) * Re-added 'language' in trace info (it actually works now) * Updated c locale --------- Co-authored-by: buj --- core/assets/bundles/bundle_ru.properties | 2 +- core/src/mindustry/core/NetServer.java | 2 +- core/src/mindustry/io/TypeIO.java | 3 ++- core/src/mindustry/net/Administration.java | 5 +++-- core/src/mindustry/ui/dialogs/TraceDialog.java | 2 ++ 5 files changed, 9 insertions(+), 5 deletions(-) diff --git a/core/assets/bundles/bundle_ru.properties b/core/assets/bundles/bundle_ru.properties index eaab89ae0e..beeb1ac206 100644 --- a/core/assets/bundles/bundle_ru.properties +++ b/core/assets/bundles/bundle_ru.properties @@ -257,7 +257,7 @@ trace = Отслеживать игрока trace.playername = Имя игрока: [accent]{0} trace.ip = IP: [accent]{0} trace.id = ID: [accent]{0} -trace.language = Language: [accent]{0} +trace.language = Язык: [accent]{0} trace.mobile = Мобильный клиент: [accent]{0} trace.modclient = Пользовательский клиент: [accent]{0} trace.times.joined = Присоединялся раз: [accent]{0} diff --git a/core/src/mindustry/core/NetServer.java b/core/src/mindustry/core/NetServer.java index 1222eae1e6..b882706e83 100644 --- a/core/src/mindustry/core/NetServer.java +++ b/core/src/mindustry/core/NetServer.java @@ -815,7 +815,7 @@ public class NetServer implements ApplicationListener{ } case trace -> { PlayerInfo stats = netServer.admins.getInfo(other.uuid()); - TraceInfo info = new TraceInfo(other.con.address, other.uuid(), other.con.modclient, other.con.mobile, stats.timesJoined, stats.timesKicked, stats.ips.toArray(String.class), stats.names.toArray(String.class)); + TraceInfo info = new TraceInfo(other.con.address, other.uuid(), other.locale, other.con.modclient, other.con.mobile, stats.timesJoined, stats.timesKicked, stats.ips.toArray(String.class), stats.names.toArray(String.class)); if(player.con != null){ Call.traceInfo(player.con, other, info); }else{ diff --git a/core/src/mindustry/io/TypeIO.java b/core/src/mindustry/io/TypeIO.java index 5be1d54403..70f28cae9d 100644 --- a/core/src/mindustry/io/TypeIO.java +++ b/core/src/mindustry/io/TypeIO.java @@ -955,6 +955,7 @@ public class TypeIO{ public static void writeTraceInfo(Writes write, TraceInfo trace){ writeString(write, trace.ip); writeString(write, trace.uuid); + writeString(write, trace.locale); write.b(trace.modded ? (byte)1 : 0); write.b(trace.mobile ? (byte)1 : 0); write.i(trace.timesJoined); @@ -965,7 +966,7 @@ public class TypeIO{ } public static TraceInfo readTraceInfo(Reads read){ - return new TraceInfo(readString(read), readString(read), read.b() == 1, read.b() == 1, read.i(), read.i(), readStrings(read), readStrings(read)); + return new TraceInfo(readString(read), readString(read), readString(read), read.b() == 1, read.b() == 1, read.i(), read.i(), readStrings(read), readStrings(read)); } public static void writeStrings(Writes write, String[] strings, int maxLen){ diff --git a/core/src/mindustry/net/Administration.java b/core/src/mindustry/net/Administration.java index da453afaa5..0f64b9850a 100644 --- a/core/src/mindustry/net/Administration.java +++ b/core/src/mindustry/net/Administration.java @@ -628,14 +628,15 @@ public class Administration{ } public static class TraceInfo{ - public String ip, uuid; + public String ip, uuid, locale; public boolean modded, mobile; public int timesJoined, timesKicked; public String[] ips, names; - public TraceInfo(String ip, String uuid, boolean modded, boolean mobile, int timesJoined, int timesKicked, String[] ips, String[] names){ + public TraceInfo(String ip, String uuid, String locale, boolean modded, boolean mobile, int timesJoined, int timesKicked, String[] ips, String[] names){ this.ip = ip; this.uuid = uuid; + this.locale = locale; this.modded = modded; this.mobile = mobile; this.timesJoined = timesJoined; diff --git a/core/src/mindustry/ui/dialogs/TraceDialog.java b/core/src/mindustry/ui/dialogs/TraceDialog.java index a758e22fb3..402df45189 100644 --- a/core/src/mindustry/ui/dialogs/TraceDialog.java +++ b/core/src/mindustry/ui/dialogs/TraceDialog.java @@ -34,6 +34,8 @@ public class TraceDialog extends BaseDialog{ c.add(Core.bundle.format("trace.playername", player.name)).row(); c.button(Icon.copySmall, style, () -> copy(info.ip)).size(s).padRight(4f); c.add(Core.bundle.format("trace.ip", info.ip)).row(); + c.button(Icon.copySmall, style, () -> copy(info.locale)).size(s).padRight(4f); + c.add(Core.bundle.format("trace.language", info.locale)).row(); c.button(Icon.copySmall, style, () -> copy(info.uuid)).size(s).padRight(4f); c.add(Core.bundle.format("trace.id", info.uuid)).row(); }).row(); From 49221a1db47c3cde8fd8b50a11c42306b0f4ddc9 Mon Sep 17 00:00:00 2001 From: Elixias <61173114+LixieWulf@users.noreply.github.com> Date: Tue, 4 Feb 2025 11:45:20 -0700 Subject: [PATCH 136/460] Customizable death shake (#10375) --- core/src/mindustry/entities/comp/UnitComp.java | 2 +- core/src/mindustry/type/UnitType.java | 2 ++ 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/core/src/mindustry/entities/comp/UnitComp.java b/core/src/mindustry/entities/comp/UnitComp.java index ef479e2956..bfbb28c18e 100644 --- a/core/src/mindustry/entities/comp/UnitComp.java +++ b/core/src/mindustry/entities/comp/UnitComp.java @@ -695,7 +695,7 @@ abstract class UnitComp implements Healthc, Physicsc, Hitboxc, Statusc, Teamc, I type.deathExplosionEffect.at(x, y, bounds() / 2f / 8f); } - float shake = hitSize / 3f; + float shake = type.deathShake < 0 ? hitSize / 3f : type.deathShake; if(type.createScorch){ Effect.scorch(x, y, (int)(hitSize / 5)); diff --git a/core/src/mindustry/type/UnitType.java b/core/src/mindustry/type/UnitType.java index 5ddbbe7763..f70e3c807e 100644 --- a/core/src/mindustry/type/UnitType.java +++ b/core/src/mindustry/type/UnitType.java @@ -66,6 +66,8 @@ public class UnitType extends UnlockableContent implements Senseable{ accel = 0.5f, /** size of one side of the hitbox square */ hitSize = 6f, + /** shake on unit death */ + deathShake = -1f, /** shake on each step for leg/mech units */ stepShake = -1f, /** ripple / dust size for legged units */ From 9643643d68e29eb3f7a144a3a9fbc95903d7cbaf Mon Sep 17 00:00:00 2001 From: coal deficit <159595900+coaldeficit@users.noreply.github.com> Date: Tue, 4 Feb 2025 19:46:02 +0100 Subject: [PATCH 137/460] why are noisemesh seeds planet id dependent? (#10374) * NoiseMesh and HexSkyMesh seed no longer based on planet id * asteroid seed fix --- core/src/mindustry/content/Planets.java | 12 ++++++------ core/src/mindustry/graphics/g3d/HexSkyMesh.java | 2 +- core/src/mindustry/graphics/g3d/NoiseMesh.java | 6 +++--- 3 files changed, 10 insertions(+), 10 deletions(-) diff --git a/core/src/mindustry/content/Planets.java b/core/src/mindustry/content/Planets.java index f44c617291..def60e56d6 100644 --- a/core/src/mindustry/content/Planets.java +++ b/core/src/mindustry/content/Planets.java @@ -92,7 +92,7 @@ public class Planets{ }}; //TODO names - gier = makeAsteroid("gier", erekir, Blocks.ferricStoneWall, Blocks.carbonWall, 0.4f, 7, 1f, gen -> { + gier = makeAsteroid("gier", erekir, Blocks.ferricStoneWall, Blocks.carbonWall, -5, 0.4f, 7, 1f, gen -> { gen.min = 25; gen.max = 35; gen.carbonChance = 0.6f; @@ -100,7 +100,7 @@ public class Planets{ gen.berylChance = 0.1f; }); - notva = makeAsteroid("notva", sun, Blocks.ferricStoneWall, Blocks.beryllicStoneWall, 0.55f, 9, 1.3f, gen -> { + notva = makeAsteroid("notva", sun, Blocks.ferricStoneWall, Blocks.beryllicStoneWall, -4, 0.55f, 9, 1.3f, gen -> { gen.berylChance = 0.8f; gen.iceChance = 0f; gen.carbonChance = 0.01f; @@ -158,7 +158,7 @@ public class Planets{ landCloudColor = Pal.spore.cpy().a(0.5f); }}; - verilus = makeAsteroid("verlius", sun, Blocks.stoneWall, Blocks.iceWall, 0.5f, 12, 2f, gen -> { + verilus = makeAsteroid("verlius", sun, Blocks.stoneWall, Blocks.iceWall, -1, 0.5f, 12, 2f, gen -> { gen.berylChance = 0f; gen.iceChance = 0.6f; gen.carbonChance = 0.1f; @@ -166,7 +166,7 @@ public class Planets{ }); } - private static Planet makeAsteroid(String name, Planet parent, Block base, Block tint, float tintThresh, int pieces, float scale, Cons cgen){ + private static Planet makeAsteroid(String name, Planet parent, Block base, Block tint, int seed, float tintThresh, int pieces, float scale, Cons cgen){ return new Planet(name, parent, 0.12f){{ hasAtmosphere = false; updateLighting = false; @@ -189,13 +189,13 @@ public class Planets{ Rand rand = new Rand(id + 2); meshes.add(new NoiseMesh( - this, 0, 2, radius, 2, 0.55f, 0.45f, 14f, + this, seed, 2, radius, 2, 0.55f, 0.45f, 14f, color, tinted, 3, 0.6f, 0.38f, tintThresh )); for(int j = 0; j < pieces; j++){ meshes.add(new MatMesh( - new NoiseMesh(this, j + 1, 1, 0.022f + rand.random(0.039f) * scale, 2, 0.6f, 0.38f, 20f, + new NoiseMesh(this, seed + j + 1, 1, 0.022f + rand.random(0.039f) * scale, 2, 0.6f, 0.38f, 20f, color, tinted, 3, 0.6f, 0.38f, tintThresh), new Mat3D().setToTranslation(Tmp.v31.setToRandomDirection(rand).setLength(rand.random(0.44f, 1.4f) * scale))) ); diff --git a/core/src/mindustry/graphics/g3d/HexSkyMesh.java b/core/src/mindustry/graphics/g3d/HexSkyMesh.java index a3cec1f170..434e22818f 100644 --- a/core/src/mindustry/graphics/g3d/HexSkyMesh.java +++ b/core/src/mindustry/graphics/g3d/HexSkyMesh.java @@ -27,7 +27,7 @@ public class HexSkyMesh extends PlanetMesh{ @Override public boolean skip(Vec3 position){ - return Simplex.noise3d(planet.id + seed, octaves, persistence, scl, position.x, position.y * 3f, position.z) >= thresh; + return Simplex.noise3d(7 + seed, octaves, persistence, scl, position.x, position.y * 3f, position.z) >= thresh; } }, divisions, false, planet.radius, radius), Shaders.clouds); diff --git a/core/src/mindustry/graphics/g3d/NoiseMesh.java b/core/src/mindustry/graphics/g3d/NoiseMesh.java index f6b8b7328e..88709c4021 100644 --- a/core/src/mindustry/graphics/g3d/NoiseMesh.java +++ b/core/src/mindustry/graphics/g3d/NoiseMesh.java @@ -14,7 +14,7 @@ public class NoiseMesh extends HexMesh{ this.mesh = MeshBuilder.buildHex(new HexMesher(){ @Override public float getHeight(Vec3 position){ - return Simplex.noise3d(planet.id + seed, octaves, persistence, scale, 5f + position.x, 5f + position.y, 5f + position.z) * mag; + return Simplex.noise3d(7 + seed, octaves, persistence, scale, 5f + position.x, 5f + position.y, 5f + position.z) * mag; } @Override @@ -31,12 +31,12 @@ public class NoiseMesh extends HexMesh{ this.mesh = MeshBuilder.buildHex(new HexMesher(){ @Override public float getHeight(Vec3 position){ - return Simplex.noise3d(planet.id + seed, octaves, persistence, scale, 5f + position.x, 5f + position.y, 5f + position.z) * mag; + return Simplex.noise3d(7 + seed, octaves, persistence, scale, 5f + position.x, 5f + position.y, 5f + position.z) * mag; } @Override public Color getColor(Vec3 position){ - return Simplex.noise3d(planet.id + seed + 1, coct, cper, cscl, 5f + position.x, 5f + position.y, 5f + position.z) > cthresh ? color2 : color1; + return Simplex.noise3d(8 + seed, coct, cper, cscl, 5f + position.x, 5f + position.y, 5f + position.z) > cthresh ? color2 : color1; } }, divisions, false, radius, 0.2f); } From a2f196a50e0bd0692da57b4ba7d53b76ec2302c4 Mon Sep 17 00:00:00 2001 From: SomeonesShade Date: Wed, 5 Feb 2025 02:52:25 +0800 Subject: [PATCH 138/460] Unit Mine Speed Game Rule Implementation and World Processor Set Rule for Unit Mine Speed (#10318) * unitMineSpeedMultiplier Creation added unitMineSpeedMultiplier added unitMineSpeed(Team team) * World Proccesor: SetRuleI unitMineSpeed Implemented * World Processor: SetRuleI unitCrashDamage Implemented * Revert "World Processor: SetRuleI unitCrashDamage Implemented" This reverts commit 1b7187b046a02a20feeeaf09244b92adf50b45f9. * Forgor to add, unitMineSpeedMultiplier is now editable per team --- core/assets/bundles/bundle.properties | 1 + core/src/mindustry/entities/comp/MinerComp.java | 4 ++-- core/src/mindustry/game/Rules.java | 8 ++++++++ core/src/mindustry/logic/LExecutor.java | 3 ++- core/src/mindustry/logic/LStatements.java | 2 +- core/src/mindustry/logic/LogicRule.java | 1 + core/src/mindustry/ui/dialogs/CustomRulesDialog.java | 2 ++ 7 files changed, 17 insertions(+), 4 deletions(-) diff --git a/core/assets/bundles/bundle.properties b/core/assets/bundles/bundle.properties index 6bd6affbf8..36eb663c0d 100644 --- a/core/assets/bundles/bundle.properties +++ b/core/assets/bundles/bundle.properties @@ -1404,6 +1404,7 @@ rules.unitcostmultiplier = Unit Cost Multiplier rules.unithealthmultiplier = Unit Health Multiplier rules.unitdamagemultiplier = Unit Damage Multiplier rules.unitcrashdamagemultiplier = Unit Crash Damage Multiplier +rules.unitminespeedmultiplier = Unit Mine Speed Multiplier rules.solarmultiplier = Solar Power Multiplier rules.unitcapvariable = Cores Contribute To Unit Cap rules.unitpayloadsexplode = Carried Payloads Explode With The Unit diff --git a/core/src/mindustry/entities/comp/MinerComp.java b/core/src/mindustry/entities/comp/MinerComp.java index a58a0503c3..4e9c28bc3d 100644 --- a/core/src/mindustry/entities/comp/MinerComp.java +++ b/core/src/mindustry/entities/comp/MinerComp.java @@ -65,7 +65,7 @@ abstract class MinerComp implements Itemsc, Posc, Teamc, Rotc, Drawc{ } public boolean canMine(){ - return type.mineSpeed > 0 && type.mineTier >= 0; + return type.mineSpeed * state.rules.unitMineSpeed(team()) > 0 && type.mineTier >= 0; } @Override @@ -89,7 +89,7 @@ abstract class MinerComp implements Itemsc, Posc, Teamc, Rotc, Drawc{ mineTile = null; mineTimer = 0f; }else if(mining() && item != null){ - mineTimer += Time.delta * type.mineSpeed; + mineTimer += Time.delta * type.mineSpeed * state.rules.unitMineSpeed(team()); if(Mathf.chance(0.06 * Time.delta)){ Fx.pulverizeSmall.at(mineTile.worldx() + Mathf.range(tilesize / 2f), mineTile.worldy() + Mathf.range(tilesize / 2f), 0f, item.color); diff --git a/core/src/mindustry/game/Rules.java b/core/src/mindustry/game/Rules.java index f2b940154c..1afebb99e9 100644 --- a/core/src/mindustry/game/Rules.java +++ b/core/src/mindustry/game/Rules.java @@ -84,6 +84,8 @@ public class Rules{ public float unitHealthMultiplier = 1f; /** How much damage unit crash damage deals. (Compounds with unitDamageMultiplier) */ public float unitCrashDamageMultiplier = 1f; + /** How fast units can mine. */ + public float unitMineSpeedMultiplier = 1f; /** If true, ghost blocks will appear upon destruction, letting builder blocks/units rebuild them. */ public boolean ghostBlocks = true; /** Whether to allow units to build with logic. */ @@ -262,6 +264,10 @@ public class Rules{ return unitDamage(team) * unitCrashDamageMultiplier * teams.get(team).unitCrashDamageMultiplier; } + public float unitMineSpeed(Team team){ + return unitMineSpeedMultiplier * teams.get(team).unitMineSpeedMultiplier; + } + public float blockHealth(Team team){ return blockHealthMultiplier * teams.get(team).blockHealthMultiplier; } @@ -312,6 +318,8 @@ public class Rules{ public float unitDamageMultiplier = 1f; /** How much damage unit crash damage deals. (Compounds with unitDamageMultiplier) */ public float unitCrashDamageMultiplier = 1f; + /** How fast units can mine. */ + public float unitMineSpeedMultiplier = 1f; /** Multiplier of resources that units take to build. */ public float unitCostMultiplier = 1f; /** How much health units start with. */ diff --git a/core/src/mindustry/logic/LExecutor.java b/core/src/mindustry/logic/LExecutor.java index 2333fdc344..d1e0d95b5a 100644 --- a/core/src/mindustry/logic/LExecutor.java +++ b/core/src/mindustry/logic/LExecutor.java @@ -1515,7 +1515,7 @@ public class LExecutor{ state.rules.bannedUnits.remove(u); } } - case unitHealth, unitBuildSpeed, unitCost, unitDamage, blockHealth, blockDamage, buildSpeed, rtsMinSquad, rtsMinWeight -> { + case unitHealth, unitBuildSpeed, unitMineSpeed, unitCost, unitDamage, blockHealth, blockDamage, buildSpeed, rtsMinSquad, rtsMinWeight -> { Team team = p1.team(); if(team != null){ float num = value.numf(); @@ -1523,6 +1523,7 @@ public class LExecutor{ case buildSpeed -> team.rules().buildSpeedMultiplier = Mathf.clamp(num, 0.001f, 50f); case unitHealth -> team.rules().unitHealthMultiplier = Math.max(num, 0.001f); case unitBuildSpeed -> team.rules().unitBuildSpeedMultiplier = Mathf.clamp(num, 0f, 50f); + case unitMineSpeed -> team.rules().unitMineSpeedMultiplier = Math.max(num, 0f); case unitCost -> team.rules().unitCostMultiplier = Math.max(num, 0f); case unitDamage -> team.rules().unitDamageMultiplier = Math.max(num, 0f); case blockHealth -> team.rules().blockHealthMultiplier = Math.max(num, 0.001f); diff --git a/core/src/mindustry/logic/LStatements.java b/core/src/mindustry/logic/LStatements.java index 11477feb1f..bae410c9a6 100644 --- a/core/src/mindustry/logic/LStatements.java +++ b/core/src/mindustry/logic/LStatements.java @@ -1547,7 +1547,7 @@ public class LStatements{ fields(table, "w", p3, s -> p3 = s); fields(table, "h", p4, s -> p4 = s); } - case buildSpeed, unitHealth, unitBuildSpeed, unitCost, unitDamage, blockHealth, blockDamage, rtsMinSquad, rtsMinWeight -> { + case buildSpeed, unitHealth, unitBuildSpeed, unitMineSpeed, unitCost, unitDamage, blockHealth, blockDamage, rtsMinSquad, rtsMinWeight -> { if(p1.equals("0")){ p1 = "@sharded"; } diff --git a/core/src/mindustry/logic/LogicRule.java b/core/src/mindustry/logic/LogicRule.java index 6ce8de4b35..211064e271 100644 --- a/core/src/mindustry/logic/LogicRule.java +++ b/core/src/mindustry/logic/LogicRule.java @@ -23,6 +23,7 @@ public enum LogicRule{ buildSpeed, unitHealth, unitBuildSpeed, + unitMineSpeed, unitCost, unitDamage, blockHealth, diff --git a/core/src/mindustry/ui/dialogs/CustomRulesDialog.java b/core/src/mindustry/ui/dialogs/CustomRulesDialog.java index 9c2dd94759..2eb0b17cde 100644 --- a/core/src/mindustry/ui/dialogs/CustomRulesDialog.java +++ b/core/src/mindustry/ui/dialogs/CustomRulesDialog.java @@ -265,6 +265,7 @@ public class CustomRulesDialog extends BaseDialog{ numberi("@rules.unitcap", f -> rules.unitCap = f, () -> rules.unitCap, -999, 999); number("@rules.unitdamagemultiplier", f -> rules.unitDamageMultiplier = f, () -> rules.unitDamageMultiplier); number("@rules.unitcrashdamagemultiplier", f -> rules.unitCrashDamageMultiplier = f, () -> rules.unitCrashDamageMultiplier); + number("@rules.unitminespeedmultiplier", f -> rules.unitMineSpeedMultiplier = f, () -> rules.unitMineSpeedMultiplier); number("@rules.unitbuildspeedmultiplier", f -> rules.unitBuildSpeedMultiplier = f, () -> rules.unitBuildSpeedMultiplier, 0f, 50f); number("@rules.unitcostmultiplier", f -> rules.unitCostMultiplier = f, () -> rules.unitCostMultiplier); number("@rules.unithealthmultiplier", f -> rules.unitHealthMultiplier = f, () -> rules.unitHealthMultiplier); @@ -383,6 +384,7 @@ public class CustomRulesDialog extends BaseDialog{ number("@rules.unitdamagemultiplier", f -> teams.unitDamageMultiplier = f, () -> teams.unitDamageMultiplier); number("@rules.unitcrashdamagemultiplier", f -> teams.unitCrashDamageMultiplier = f, () -> teams.unitCrashDamageMultiplier); + number("@rules.unitminespeedmultiplier", f -> teams.unitMineSpeedMultiplier = f, () -> teams.unitMineSpeedMultiplier); number("@rules.unitbuildspeedmultiplier", f -> teams.unitBuildSpeedMultiplier = f, () -> teams.unitBuildSpeedMultiplier, 0.001f, 50f); number("@rules.unitcostmultiplier", f -> teams.unitCostMultiplier = f, () -> teams.unitCostMultiplier); number("@rules.unithealthmultiplier", f -> teams.unitHealthMultiplier = f, () -> teams.unitHealthMultiplier); From 7f3134f0fcaff1d00b0cbbf3e78334cd5249d942 Mon Sep 17 00:00:00 2001 From: Mythril382 <77225817+Mythril382@users.noreply.github.com> Date: Wed, 5 Feb 2025 02:52:59 +0800 Subject: [PATCH 139/460] chain effect (#10310) MAN do i want to change "openfx" and "closefx" to "openEffect" and "closeEffect" --- core/src/mindustry/world/blocks/defense/Door.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/core/src/mindustry/world/blocks/defense/Door.java b/core/src/mindustry/world/blocks/defense/Door.java index 3fa4732ebe..3cad24224f 100644 --- a/core/src/mindustry/world/blocks/defense/Door.java +++ b/core/src/mindustry/world/blocks/defense/Door.java @@ -26,6 +26,7 @@ public class Door extends Wall{ public Effect openfx = Fx.dooropen; public Effect closefx = Fx.doorclose; public Sound doorSound = Sounds.door; + public boolean chainEffect = false; public @Load("@-open") TextureRegion openRegion; public Door(String name){ @@ -44,6 +45,7 @@ public class Door extends Wall{ continue; } + if(chainEffect) entity.effect(); entity.open = open; pathfinder.updateTile(entity.tile()); } From a5efcb6c23052fd6d800630b6acc6e32b9c440af Mon Sep 17 00:00:00 2001 From: Github Actions Date: Tue, 4 Feb 2025 18:53:51 +0000 Subject: [PATCH 140/460] Automatic bundle update --- core/assets/bundles/bundle_be.properties | 1 + core/assets/bundles/bundle_bg.properties | 1 + core/assets/bundles/bundle_ca.properties | 1 + core/assets/bundles/bundle_cs.properties | 1 + core/assets/bundles/bundle_da.properties | 1 + core/assets/bundles/bundle_de.properties | 1 + core/assets/bundles/bundle_es.properties | 1 + core/assets/bundles/bundle_et.properties | 1 + core/assets/bundles/bundle_eu.properties | 1 + core/assets/bundles/bundle_fi.properties | 1 + core/assets/bundles/bundle_fil.properties | 1 + core/assets/bundles/bundle_fr.properties | 1 + core/assets/bundles/bundle_hu.properties | 1 + core/assets/bundles/bundle_id_ID.properties | 1 + core/assets/bundles/bundle_it.properties | 1 + core/assets/bundles/bundle_ja.properties | 1 + core/assets/bundles/bundle_ko.properties | 1 + core/assets/bundles/bundle_lt.properties | 1 + core/assets/bundles/bundle_nl.properties | 1 + core/assets/bundles/bundle_nl_BE.properties | 1 + core/assets/bundles/bundle_pl.properties | 1 + core/assets/bundles/bundle_pt_BR.properties | 1 + core/assets/bundles/bundle_pt_PT.properties | 1 + core/assets/bundles/bundle_ro.properties | 1 + core/assets/bundles/bundle_ru.properties | 1 + core/assets/bundles/bundle_sr.properties | 1 + core/assets/bundles/bundle_sv.properties | 1 + core/assets/bundles/bundle_th.properties | 1 + core/assets/bundles/bundle_tk.properties | 1 + core/assets/bundles/bundle_tr.properties | 1 + core/assets/bundles/bundle_uk_UA.properties | 1 + core/assets/bundles/bundle_vi.properties | 1 + core/assets/bundles/bundle_zh_CN.properties | 1 + core/assets/bundles/bundle_zh_TW.properties | 1 + 34 files changed, 34 insertions(+) diff --git a/core/assets/bundles/bundle_be.properties b/core/assets/bundles/bundle_be.properties index 0ecd6514b6..8d4e69f8bc 100644 --- a/core/assets/bundles/bundle_be.properties +++ b/core/assets/bundles/bundle_be.properties @@ -1369,6 +1369,7 @@ rules.unitcostmultiplier = Множыцель Кошту Адзінак rules.unithealthmultiplier = Множнік здароўя баяв. адз. rules.unitdamagemultiplier = Множнік страт баяв. адз. rules.unitcrashdamagemultiplier = Множнік Падрыўнога Пашкоджання Юніта +rules.unitminespeedmultiplier = Unit Mine Speed Multiplier rules.solarmultiplier = Множнік Сонечнай Энергіі rules.unitcapvariable = Ядра Спрыяюць Колькасці Юнітаў rules.unitpayloadsexplode = Carried Payloads Explode With The Unit diff --git a/core/assets/bundles/bundle_bg.properties b/core/assets/bundles/bundle_bg.properties index 9848be868e..d9e25fe57e 100644 --- a/core/assets/bundles/bundle_bg.properties +++ b/core/assets/bundles/bundle_bg.properties @@ -1380,6 +1380,7 @@ rules.unitcostmultiplier = Unit Cost Multiplier rules.unithealthmultiplier = Множител на Точките Живот на Единици rules.unitdamagemultiplier = Множител на Щетите на Единици rules.unitcrashdamagemultiplier = Unit Crash Damage Multiplier +rules.unitminespeedmultiplier = Unit Mine Speed Multiplier rules.solarmultiplier = Solar Power Multiplier rules.unitcapvariable = Ядрата Увеличават Максималния Брой Единици rules.unitpayloadsexplode = Carried Payloads Explode With The Unit diff --git a/core/assets/bundles/bundle_ca.properties b/core/assets/bundles/bundle_ca.properties index 11f4a2afb0..e4530ef33d 100644 --- a/core/assets/bundles/bundle_ca.properties +++ b/core/assets/bundles/bundle_ca.properties @@ -1383,6 +1383,7 @@ rules.unitcostmultiplier = Multiplicador del cost de les unitats rules.unithealthmultiplier = Multiplicador de la salut de les unitats rules.unitdamagemultiplier = Multiplicador del dany de les unitats rules.unitcrashdamagemultiplier = Multiplicador del dany de xoc de les unitats +rules.unitminespeedmultiplier = Unit Mine Speed Multiplier rules.solarmultiplier = Multiplicador de l’energia solar rules.unitcapvariable = Els nuclis contribueixen al límit d’unitats rules.unitpayloadsexplode = Els blocs carregats exploten juntament amb la unitat diff --git a/core/assets/bundles/bundle_cs.properties b/core/assets/bundles/bundle_cs.properties index 6f72df9c9c..415f376050 100644 --- a/core/assets/bundles/bundle_cs.properties +++ b/core/assets/bundles/bundle_cs.properties @@ -1382,6 +1382,7 @@ rules.unitcostmultiplier = Násobek ceny jednotek rules.unithealthmultiplier = Násobek zdraví jednotek rules.unitdamagemultiplier = Násobek poškození jednotkami rules.unitcrashdamagemultiplier = Násobek poškození při nárazu jednotky +rules.unitminespeedmultiplier = Unit Mine Speed Multiplier rules.solarmultiplier = Násobek Solární Energie rules.unitcapvariable = Jádra Zvýšujou Maximum Počtu Jednotek rules.unitpayloadsexplode = Carried Payloads Explode With The Unit diff --git a/core/assets/bundles/bundle_da.properties b/core/assets/bundles/bundle_da.properties index a9c6ea54fd..e5c09de346 100644 --- a/core/assets/bundles/bundle_da.properties +++ b/core/assets/bundles/bundle_da.properties @@ -1371,6 +1371,7 @@ rules.unitcostmultiplier = Unit Cost Multiplier rules.unithealthmultiplier = Enheds-helbreds-forstærker rules.unitdamagemultiplier = Enheds-skade-forstærker rules.unitcrashdamagemultiplier = Unit Crash Damage Multiplier +rules.unitminespeedmultiplier = Unit Mine Speed Multiplier rules.solarmultiplier = Solar Power Multiplier rules.unitcapvariable = Cores Contribute To Unit Cap rules.unitpayloadsexplode = Carried Payloads Explode With The Unit diff --git a/core/assets/bundles/bundle_de.properties b/core/assets/bundles/bundle_de.properties index 081c3d193f..b88000700b 100644 --- a/core/assets/bundles/bundle_de.properties +++ b/core/assets/bundles/bundle_de.properties @@ -1393,6 +1393,7 @@ rules.unitcostmultiplier = Einheit-Baukosten Multiplikator rules.unithealthmultiplier = Einheit-Lebenspunkte-Multiplikator rules.unitdamagemultiplier = Einheit-Schaden-Multiplikator rules.unitcrashdamagemultiplier = Einheiten-Absturzschaden-Multiplikator +rules.unitminespeedmultiplier = Unit Mine Speed Multiplier rules.solarmultiplier = Solarstrom-Multiplikator rules.unitcapvariable = Kerne zählen zum Einheiten-Limit dazu rules.unitpayloadsexplode = Carried Payloads Explode With The Unit diff --git a/core/assets/bundles/bundle_es.properties b/core/assets/bundles/bundle_es.properties index f2626f0a79..c868d38cb7 100644 --- a/core/assets/bundles/bundle_es.properties +++ b/core/assets/bundles/bundle_es.properties @@ -1389,6 +1389,7 @@ rules.unitcostmultiplier = Unit Cost Multiplier rules.unithealthmultiplier = Multiplicador de vida de unidades rules.unitdamagemultiplier = Multiplicador de daño de unidades rules.unitcrashdamagemultiplier = Unit Crash Damage Multiplier +rules.unitminespeedmultiplier = Unit Mine Speed Multiplier rules.solarmultiplier = Multiplicador de energía solar rules.unitcapvariable = Las categorías del núcleo alteran el límite máximo de unidades rules.unitpayloadsexplode = Carried Payloads Explode With The Unit diff --git a/core/assets/bundles/bundle_et.properties b/core/assets/bundles/bundle_et.properties index 92fdbb6ee0..820411aba5 100644 --- a/core/assets/bundles/bundle_et.properties +++ b/core/assets/bundles/bundle_et.properties @@ -1371,6 +1371,7 @@ rules.unitcostmultiplier = Unit Cost Multiplier rules.unithealthmultiplier = Väeüksuste elude kordaja rules.unitdamagemultiplier = Väeüksuste hävitusvõime kordaja rules.unitcrashdamagemultiplier = Unit Crash Damage Multiplier +rules.unitminespeedmultiplier = Unit Mine Speed Multiplier rules.solarmultiplier = Solar Power Multiplier rules.unitcapvariable = Cores Contribute To Unit Cap rules.unitpayloadsexplode = Carried Payloads Explode With The Unit diff --git a/core/assets/bundles/bundle_eu.properties b/core/assets/bundles/bundle_eu.properties index 59b4b22259..ad734c5881 100644 --- a/core/assets/bundles/bundle_eu.properties +++ b/core/assets/bundles/bundle_eu.properties @@ -1373,6 +1373,7 @@ rules.unitcostmultiplier = Unit Cost Multiplier rules.unithealthmultiplier = Unitateen osasun-biderkatzailea rules.unitdamagemultiplier = Unitateen kalte-biderkatzailea rules.unitcrashdamagemultiplier = Unit Crash Damage Multiplier +rules.unitminespeedmultiplier = Unit Mine Speed Multiplier rules.solarmultiplier = Solar Power Multiplier rules.unitcapvariable = Cores Contribute To Unit Cap rules.unitpayloadsexplode = Carried Payloads Explode With The Unit diff --git a/core/assets/bundles/bundle_fi.properties b/core/assets/bundles/bundle_fi.properties index 583c8e2e2f..5e9c6c21d1 100644 --- a/core/assets/bundles/bundle_fi.properties +++ b/core/assets/bundles/bundle_fi.properties @@ -1370,6 +1370,7 @@ rules.unitcostmultiplier = Unit Cost Multiplier rules.unithealthmultiplier = Yksikköjen elämäpistekerroin rules.unitdamagemultiplier = Yksikköjen vahinkokerroin rules.unitcrashdamagemultiplier = Unit Crash Damage Multiplier +rules.unitminespeedmultiplier = Unit Mine Speed Multiplier rules.solarmultiplier = Aurinkovoimakerroin rules.unitcapvariable = Ytimet vaikuttavat yksikkörajaan rules.unitpayloadsexplode = Carried Payloads Explode With The Unit diff --git a/core/assets/bundles/bundle_fil.properties b/core/assets/bundles/bundle_fil.properties index 4b1f6ea9cb..1b2f8dffd6 100644 --- a/core/assets/bundles/bundle_fil.properties +++ b/core/assets/bundles/bundle_fil.properties @@ -1370,6 +1370,7 @@ rules.unitcostmultiplier = Unit Cost Multiplier rules.unithealthmultiplier = Unit Health Multiplier rules.unitdamagemultiplier = Unit Damage Multiplier rules.unitcrashdamagemultiplier = Unit Crash Damage Multiplier +rules.unitminespeedmultiplier = Unit Mine Speed Multiplier rules.solarmultiplier = Solar Power Multiplier rules.unitcapvariable = Cores Contribute To Unit Cap rules.unitpayloadsexplode = Carried Payloads Explode With The Unit diff --git a/core/assets/bundles/bundle_fr.properties b/core/assets/bundles/bundle_fr.properties index 8fba5b6a65..b8fec6548c 100644 --- a/core/assets/bundles/bundle_fr.properties +++ b/core/assets/bundles/bundle_fr.properties @@ -1397,6 +1397,7 @@ rules.unitcostmultiplier = Multiplicateur du coût de fabrication des Unités rules.unithealthmultiplier = Multiplicateur de Santé des Unités rules.unitdamagemultiplier = Multiplicateur de Dégât des Unités rules.unitcrashdamagemultiplier = Multiplicateur de Dégât de chute des Unités +rules.unitminespeedmultiplier = Unit Mine Speed Multiplier rules.solarmultiplier = Multiplicateur de l'Efficacité des Panneaux Solaires rules.unitcapvariable = Les Noyaux contribuent à la limite d'Unités actives rules.unitpayloadsexplode = Carried Payloads Explode With The Unit diff --git a/core/assets/bundles/bundle_hu.properties b/core/assets/bundles/bundle_hu.properties index bafa116ee8..3302684c27 100644 --- a/core/assets/bundles/bundle_hu.properties +++ b/core/assets/bundles/bundle_hu.properties @@ -1404,6 +1404,7 @@ rules.unitcostmultiplier = Egység költségszorzója rules.unithealthmultiplier = Egység életpontszorzója rules.unitdamagemultiplier = Egység sebzésszorzója rules.unitcrashdamagemultiplier = Egység ütközési sebzésszorzója +rules.unitminespeedmultiplier = Unit Mine Speed Multiplier rules.solarmultiplier = Napenergia szorzója rules.unitcapvariable = A támaszpontok befolyásolják a gyártható egységek darabszámát rules.unitpayloadsexplode = A szállított rakományok az egységgel együtt felrobbannak diff --git a/core/assets/bundles/bundle_id_ID.properties b/core/assets/bundles/bundle_id_ID.properties index cfcc41cf04..5040e63205 100644 --- a/core/assets/bundles/bundle_id_ID.properties +++ b/core/assets/bundles/bundle_id_ID.properties @@ -1400,6 +1400,7 @@ rules.unitcostmultiplier = Penggandaan Bahan Pembuatan Unit rules.unithealthmultiplier = Penggandaan Darah Unit rules.unitdamagemultiplier = Penggandaan Kekuatan Unit rules.unitcrashdamagemultiplier = Penggandaan Kerusakan Jatuhnya Unit +rules.unitminespeedmultiplier = Unit Mine Speed Multiplier rules.solarmultiplier = Penggandaan Tenaga Surya rules.unitcapvariable = Inti Memengaruhi Batas Unit rules.unitpayloadsexplode = Muatan yang Dibawa Meledak Bersama Unit diff --git a/core/assets/bundles/bundle_it.properties b/core/assets/bundles/bundle_it.properties index 8eb5058287..bb20fd2019 100644 --- a/core/assets/bundles/bundle_it.properties +++ b/core/assets/bundles/bundle_it.properties @@ -1376,6 +1376,7 @@ rules.unitcostmultiplier = Unit Cost Multiplier rules.unithealthmultiplier = Moltiplicatore Vita Unità rules.unitdamagemultiplier = Moltiplicatore Danno Unità rules.unitcrashdamagemultiplier = Unit Crash Damage Multiplier +rules.unitminespeedmultiplier = Unit Mine Speed Multiplier rules.solarmultiplier = Moltiplicatore energia solare rules.unitcapvariable = Cores Contribute To Unit Cap rules.unitpayloadsexplode = Carried Payloads Explode With The Unit diff --git a/core/assets/bundles/bundle_ja.properties b/core/assets/bundles/bundle_ja.properties index 9f31c83a8a..cdfb9cd8c3 100644 --- a/core/assets/bundles/bundle_ja.properties +++ b/core/assets/bundles/bundle_ja.properties @@ -1382,6 +1382,7 @@ rules.unitcostmultiplier = ユニットの製造コスト倍率 rules.unithealthmultiplier = ユニットの体力倍率 rules.unitdamagemultiplier = ユニットのダメージ倍率 rules.unitcrashdamagemultiplier = ユニットの衝突ダメージ倍率 +rules.unitminespeedmultiplier = Unit Mine Speed Multiplier rules.solarmultiplier = 太陽光の倍率 rules.unitcapvariable = コア数によってユニット上限を変動 rules.unitpayloadsexplode = Carried Payloads Explode With The Unit diff --git a/core/assets/bundles/bundle_ko.properties b/core/assets/bundles/bundle_ko.properties index e13fa0799f..688b4b1e93 100644 --- a/core/assets/bundles/bundle_ko.properties +++ b/core/assets/bundles/bundle_ko.properties @@ -1403,6 +1403,7 @@ rules.unitcostmultiplier = 유닛 비용 배수 rules.unithealthmultiplier = 유닛 체력 배수 rules.unitdamagemultiplier = 유닛 피해량 배수 rules.unitcrashdamagemultiplier = 유닛 파손 피해량 배수 +rules.unitminespeedmultiplier = Unit Mine Speed Multiplier rules.solarmultiplier = 태양광 전력 배수 rules.unitcapvariable = 코어 유닛 수 제한 추가 rules.unitpayloadsexplode = 들어올린 화물 유닛과 함께 폭발 diff --git a/core/assets/bundles/bundle_lt.properties b/core/assets/bundles/bundle_lt.properties index 513d61f59a..42d94038c3 100644 --- a/core/assets/bundles/bundle_lt.properties +++ b/core/assets/bundles/bundle_lt.properties @@ -1371,6 +1371,7 @@ rules.unitcostmultiplier = Unit Cost Multiplier rules.unithealthmultiplier = Vienetų Gyvybių Daugiklis rules.unitdamagemultiplier = Vienetų Žalos Daugiklis rules.unitcrashdamagemultiplier = Unit Crash Damage Multiplier +rules.unitminespeedmultiplier = Unit Mine Speed Multiplier rules.solarmultiplier = Solar Power Multiplier rules.unitcapvariable = Cores Contribute To Unit Cap rules.unitpayloadsexplode = Carried Payloads Explode With The Unit diff --git a/core/assets/bundles/bundle_nl.properties b/core/assets/bundles/bundle_nl.properties index 39d61aba22..5bc5d727bb 100644 --- a/core/assets/bundles/bundle_nl.properties +++ b/core/assets/bundles/bundle_nl.properties @@ -1383,6 +1383,7 @@ rules.unitcostmultiplier = Eenheidskosten Vermenigvuldiger rules.unithealthmultiplier = Eenheid Levenspunten Vermenigvuldiger rules.unitdamagemultiplier = Eenheid Schade Vermenigvuldiger rules.unitcrashdamagemultiplier = Unit Crash Damage Multiplier +rules.unitminespeedmultiplier = Unit Mine Speed Multiplier rules.solarmultiplier = Zonne-Energie Vermenigvuldiger rules.unitcapvariable = Cores Dragen Bij Aan Eenheidslimiet rules.unitpayloadsexplode = Carried Payloads Explode With The Unit diff --git a/core/assets/bundles/bundle_nl_BE.properties b/core/assets/bundles/bundle_nl_BE.properties index dc2204a38b..443cc72f40 100644 --- a/core/assets/bundles/bundle_nl_BE.properties +++ b/core/assets/bundles/bundle_nl_BE.properties @@ -1371,6 +1371,7 @@ rules.unitcostmultiplier = Unit Cost Multiplier rules.unithealthmultiplier = Unit Health Multiplier rules.unitdamagemultiplier = Unit Damage Multiplier rules.unitcrashdamagemultiplier = Unit Crash Damage Multiplier +rules.unitminespeedmultiplier = Unit Mine Speed Multiplier rules.solarmultiplier = Solar Power Multiplier rules.unitcapvariable = Cores Contribute To Unit Cap rules.unitpayloadsexplode = Carried Payloads Explode With The Unit diff --git a/core/assets/bundles/bundle_pl.properties b/core/assets/bundles/bundle_pl.properties index 932d1ce433..90f61758f1 100644 --- a/core/assets/bundles/bundle_pl.properties +++ b/core/assets/bundles/bundle_pl.properties @@ -1380,6 +1380,7 @@ rules.unitcostmultiplier = Mnożnik Kosztu Jednostek rules.unithealthmultiplier = Mnożnik Życia Jednostek rules.unitdamagemultiplier = Mnożnik Obrażeń jednostek rules.unitcrashdamagemultiplier = Obrażenia Zadawane Po Zniszczeniu +rules.unitminespeedmultiplier = Unit Mine Speed Multiplier rules.solarmultiplier = Mnożnik Mocy Paneli Słonecznych rules.unitcapvariable = Rdzenie mają wpływ na limit jednostek rules.unitpayloadsexplode = Carried Payloads Explode With The Unit diff --git a/core/assets/bundles/bundle_pt_BR.properties b/core/assets/bundles/bundle_pt_BR.properties index a20a704b37..cbdc432a75 100644 --- a/core/assets/bundles/bundle_pt_BR.properties +++ b/core/assets/bundles/bundle_pt_BR.properties @@ -1390,6 +1390,7 @@ rules.unitcostmultiplier = Unit Cost Multiplier rules.unithealthmultiplier = Multiplicador de vida de unidade rules.unitdamagemultiplier = Multiplicador de dano de Unidade rules.unitcrashdamagemultiplier = Unit Crash Damage Multiplier +rules.unitminespeedmultiplier = Unit Mine Speed Multiplier rules.solarmultiplier = Multiplicador de Energia Solar rules.unitcapvariable = Núcleos contribuem para a capacidade da unidade rules.unitpayloadsexplode = Carried Payloads Explode With The Unit diff --git a/core/assets/bundles/bundle_pt_PT.properties b/core/assets/bundles/bundle_pt_PT.properties index 3fef2bcb84..89ab883ce0 100644 --- a/core/assets/bundles/bundle_pt_PT.properties +++ b/core/assets/bundles/bundle_pt_PT.properties @@ -1371,6 +1371,7 @@ rules.unitcostmultiplier = Unit Cost Multiplier rules.unithealthmultiplier = Multiplicador de vida de unidade rules.unitdamagemultiplier = Multiplicador de dano de Unidade rules.unitcrashdamagemultiplier = Unit Crash Damage Multiplier +rules.unitminespeedmultiplier = Unit Mine Speed Multiplier rules.solarmultiplier = Solar Power Multiplier rules.unitcapvariable = Cores Contribute To Unit Cap rules.unitpayloadsexplode = Carried Payloads Explode With The Unit diff --git a/core/assets/bundles/bundle_ro.properties b/core/assets/bundles/bundle_ro.properties index 3e8201dffb..1de39c41ab 100644 --- a/core/assets/bundles/bundle_ro.properties +++ b/core/assets/bundles/bundle_ro.properties @@ -1382,6 +1382,7 @@ rules.unitcostmultiplier = Unit Cost Multiplier rules.unithealthmultiplier = Multiplicatorul Vieții Unităților rules.unitdamagemultiplier = Multiplicatorul Deteriorării Unităților rules.unitcrashdamagemultiplier = Unit Crash Damage Multiplier +rules.unitminespeedmultiplier = Unit Mine Speed Multiplier rules.solarmultiplier = Solar Power Multiplier rules.unitcapvariable = Nucleele Contribuie la Limita Unităților rules.unitpayloadsexplode = Carried Payloads Explode With The Unit diff --git a/core/assets/bundles/bundle_ru.properties b/core/assets/bundles/bundle_ru.properties index beeb1ac206..c637a99b31 100644 --- a/core/assets/bundles/bundle_ru.properties +++ b/core/assets/bundles/bundle_ru.properties @@ -1382,6 +1382,7 @@ rules.unitcostmultiplier = Множитель стоимости боев. ед. rules.unithealthmultiplier = Множитель прочности боев. ед. rules.unitdamagemultiplier = Множитель урона боев. ед. rules.unitcrashdamagemultiplier = Множитель урона от падения боев. ед. +rules.unitminespeedmultiplier = Unit Mine Speed Multiplier rules.solarmultiplier = Множитель солнечной энергии rules.unitcapvariable = Ядра увеличивают лимит единиц rules.unitpayloadsexplode = Carried Payloads Explode With The Unit diff --git a/core/assets/bundles/bundle_sr.properties b/core/assets/bundles/bundle_sr.properties index c925b9af3a..eadd3ae926 100644 --- a/core/assets/bundles/bundle_sr.properties +++ b/core/assets/bundles/bundle_sr.properties @@ -1384,6 +1384,7 @@ rules.unitcostmultiplier = Unit Cost Multiplier rules.unithealthmultiplier = Unit Health Multiplier rules.unitdamagemultiplier = Unit Damage Multiplier rules.unitcrashdamagemultiplier = Unit Crash Damage Multiplier +rules.unitminespeedmultiplier = Unit Mine Speed Multiplier rules.solarmultiplier = Solar Power Multiplier rules.unitcapvariable = Jezgara Povećavaju Maksimalni Broj Jedinica rules.unitpayloadsexplode = Carried Payloads Explode With The Unit diff --git a/core/assets/bundles/bundle_sv.properties b/core/assets/bundles/bundle_sv.properties index 1afdc82be6..aeac077792 100644 --- a/core/assets/bundles/bundle_sv.properties +++ b/core/assets/bundles/bundle_sv.properties @@ -1371,6 +1371,7 @@ rules.unitcostmultiplier = Unit Cost Multiplier rules.unithealthmultiplier = Unit Health Multiplier rules.unitdamagemultiplier = Unit Damage Multiplier rules.unitcrashdamagemultiplier = Unit Crash Damage Multiplier +rules.unitminespeedmultiplier = Unit Mine Speed Multiplier rules.solarmultiplier = Solar Power Multiplier rules.unitcapvariable = Cores Contribute To Unit Cap rules.unitpayloadsexplode = Carried Payloads Explode With The Unit diff --git a/core/assets/bundles/bundle_th.properties b/core/assets/bundles/bundle_th.properties index 3eda7e72e9..c30b59ff9e 100644 --- a/core/assets/bundles/bundle_th.properties +++ b/core/assets/bundles/bundle_th.properties @@ -1385,6 +1385,7 @@ rules.unitcostmultiplier = พหูคุณราคาทรัพยาก rules.unithealthmultiplier = พหุคูณพลังชีวิตของยูนิต rules.unitdamagemultiplier = พหุคูณพลังโจมตีของยูนิต rules.unitcrashdamagemultiplier = พหูคูณดาเมจการตกของยานยูนิต +rules.unitminespeedmultiplier = Unit Mine Speed Multiplier rules.solarmultiplier = พหูคุณพลังงานแสงอาทิตย์ rules.unitcapvariable = เพิ่มจำนวนยูนิตสูงสุดต่อแกนกลาง rules.unitpayloadsexplode = สิ่งบรรทุกระเบิดไปพร้อมกับยูนิต diff --git a/core/assets/bundles/bundle_tk.properties b/core/assets/bundles/bundle_tk.properties index f03cb0534b..eac53c4890 100644 --- a/core/assets/bundles/bundle_tk.properties +++ b/core/assets/bundles/bundle_tk.properties @@ -1371,6 +1371,7 @@ rules.unitcostmultiplier = Unit Cost Multiplier rules.unithealthmultiplier = Unit Health Multiplier rules.unitdamagemultiplier = Unit Damage Multiplier rules.unitcrashdamagemultiplier = Unit Crash Damage Multiplier +rules.unitminespeedmultiplier = Unit Mine Speed Multiplier rules.solarmultiplier = Solar Power Multiplier rules.unitcapvariable = Cores Contribute To Unit Cap rules.unitpayloadsexplode = Carried Payloads Explode With The Unit diff --git a/core/assets/bundles/bundle_tr.properties b/core/assets/bundles/bundle_tr.properties index feed3ded11..ff314d8c61 100644 --- a/core/assets/bundles/bundle_tr.properties +++ b/core/assets/bundles/bundle_tr.properties @@ -1380,6 +1380,7 @@ rules.unitcostmultiplier = Birim Fiyat Çarpanı rules.unithealthmultiplier = Birim Can Çarpanı rules.unitdamagemultiplier = Birim Hasar Çapanı rules.unitcrashdamagemultiplier = Birim Çakılma Hasar Çarpanı +rules.unitminespeedmultiplier = Unit Mine Speed Multiplier rules.solarmultiplier = Güneş Paneli Üretim Çarpanı rules.unitcapvariable = Merkezler Birim Sınırını Etkiler rules.unitpayloadsexplode = Carried Payloads Explode With The Unit diff --git a/core/assets/bundles/bundle_uk_UA.properties b/core/assets/bundles/bundle_uk_UA.properties index c6046c3cee..50a19637ef 100644 --- a/core/assets/bundles/bundle_uk_UA.properties +++ b/core/assets/bundles/bundle_uk_UA.properties @@ -1391,6 +1391,7 @@ rules.unitcostmultiplier = Множник вартості одиниць rules.unithealthmultiplier = Множник здоров’я бойових одиниць rules.unitdamagemultiplier = Множник шкоди бойових одиниць rules.unitcrashdamagemultiplier = Множник шкоди одиниці при зіткненні одиниць +rules.unitminespeedmultiplier = Unit Mine Speed Multiplier rules.solarmultiplier = Множник сонячної енергії rules.unitcapvariable = Ядра збільшують обмеження на кількість одиниць rules.unitpayloadsexplode = Carried Payloads Explode With The Unit diff --git a/core/assets/bundles/bundle_vi.properties b/core/assets/bundles/bundle_vi.properties index 97bc940327..8355d3f9cf 100644 --- a/core/assets/bundles/bundle_vi.properties +++ b/core/assets/bundles/bundle_vi.properties @@ -1404,6 +1404,7 @@ rules.unitcostmultiplier = Hệ Số Chi Phí Sản Xuất Đơn Vị rules.unithealthmultiplier = Hệ Số Độ Bền Của Đơn Vị rules.unitdamagemultiplier = Hệ Số Sát Thương Của Đơn Vị rules.unitcrashdamagemultiplier = Hệ Số Sát Thương Của Đơn Vị Khi Bị Bắn Rơi +rules.unitminespeedmultiplier = Unit Mine Speed Multiplier rules.solarmultiplier = Hệ Số Năng Lượng Mặt Trời rules.unitcapvariable = Lõi Tăng Giới Hạn Đơn Vị rules.unitpayloadsexplode = Khối Hàng Mang Theo Phát Nổ Cùng Đơn Vị diff --git a/core/assets/bundles/bundle_zh_CN.properties b/core/assets/bundles/bundle_zh_CN.properties index 2cc46aa133..d3d3cc224e 100644 --- a/core/assets/bundles/bundle_zh_CN.properties +++ b/core/assets/bundles/bundle_zh_CN.properties @@ -1393,6 +1393,7 @@ rules.unitcostmultiplier = 单位生产花费倍率 rules.unithealthmultiplier = 单位生命倍率 rules.unitdamagemultiplier = 单位伤害倍率 rules.unitcrashdamagemultiplier = 单位坠毁伤害倍率 +rules.unitminespeedmultiplier = Unit Mine Speed Multiplier rules.solarmultiplier = 太阳能发电倍率 rules.unitcapvariable = 核心可增加单位上限 rules.unitpayloadsexplode = 单位携带载荷与单位一起爆炸 diff --git a/core/assets/bundles/bundle_zh_TW.properties b/core/assets/bundles/bundle_zh_TW.properties index 96b922583d..237628eb46 100644 --- a/core/assets/bundles/bundle_zh_TW.properties +++ b/core/assets/bundles/bundle_zh_TW.properties @@ -1388,6 +1388,7 @@ rules.unitcostmultiplier = Unit Cost Multiplier rules.unithealthmultiplier = 單位血量加成 rules.unitdamagemultiplier = 單位傷害加成 rules.unitcrashdamagemultiplier = Unit Crash Damage Multiplier +rules.unitminespeedmultiplier = Unit Mine Speed Multiplier rules.solarmultiplier = 太陽能電加成 rules.unitcapvariable = 核心限制單位上限 rules.unitpayloadsexplode = Carried Payloads Explode With The Unit From 17b470bacbaef130f41f2dc794e8fc0b4830d323 Mon Sep 17 00:00:00 2001 From: MEEPofFaith <54301439+MEEPofFaith@users.noreply.github.com> Date: Tue, 4 Feb 2025 10:58:24 -0800 Subject: [PATCH 141/460] Percentage modifier stat for status effects (#10306) * Percentage modifier stat for status effects * Merge true by default Make percentage symbol inherit the color as well * Multipliers instead of percentages --- core/assets/bundles/bundle.properties | 1 + core/src/mindustry/type/StatusEffect.java | 10 ++-- core/src/mindustry/world/meta/StatUnit.java | 1 + core/src/mindustry/world/meta/StatValues.java | 46 +++++++++++++++++++ core/src/mindustry/world/meta/Stats.java | 10 ++++ 5 files changed, 63 insertions(+), 5 deletions(-) diff --git a/core/assets/bundles/bundle.properties b/core/assets/bundles/bundle.properties index 36eb663c0d..87d18617d1 100644 --- a/core/assets/bundles/bundle.properties +++ b/core/assets/bundles/bundle.properties @@ -1165,6 +1165,7 @@ unit.minutes = mins unit.persecond = /sec unit.perminute = /min unit.timesspeed = x speed +unit.multiplier = x unit.percent = % unit.shieldhealth = shield health unit.items = items diff --git a/core/src/mindustry/type/StatusEffect.java b/core/src/mindustry/type/StatusEffect.java index e344f652f0..05dc34595d 100644 --- a/core/src/mindustry/type/StatusEffect.java +++ b/core/src/mindustry/type/StatusEffect.java @@ -90,11 +90,11 @@ public class StatusEffect extends UnlockableContent{ @Override public void setStats(){ - if(damageMultiplier != 1) stats.addPercent(Stat.damageMultiplier, damageMultiplier); - if(healthMultiplier != 1) stats.addPercent(Stat.healthMultiplier, healthMultiplier); - if(speedMultiplier != 1) stats.addPercent(Stat.speedMultiplier, speedMultiplier); - if(reloadMultiplier != 1) stats.addPercent(Stat.reloadMultiplier, reloadMultiplier); - if(buildSpeedMultiplier != 1) stats.addPercent(Stat.buildSpeedMultiplier, buildSpeedMultiplier); + if(damageMultiplier != 1) stats.addMultModifier(Stat.damageMultiplier, damageMultiplier); + if(healthMultiplier != 1) stats.addMultModifier(Stat.healthMultiplier, healthMultiplier); + if(speedMultiplier != 1) stats.addMultModifier(Stat.speedMultiplier, speedMultiplier); + if(reloadMultiplier != 1) stats.addMultModifier(Stat.reloadMultiplier, reloadMultiplier); + if(buildSpeedMultiplier != 1) stats.addMultModifier(Stat.buildSpeedMultiplier, buildSpeedMultiplier); if(damage > 0) stats.add(Stat.damage, damage * 60f, StatUnit.perSecond); if(damage < 0) stats.add(Stat.healing, -damage * 60f, StatUnit.perSecond); diff --git a/core/src/mindustry/world/meta/StatUnit.java b/core/src/mindustry/world/meta/StatUnit.java index 4362c6ecdd..917b88937d 100644 --- a/core/src/mindustry/world/meta/StatUnit.java +++ b/core/src/mindustry/world/meta/StatUnit.java @@ -29,6 +29,7 @@ public class StatUnit{ perMinute = new StatUnit("perMinute", false), perShot = new StatUnit("perShot", false), timesSpeed = new StatUnit("timesSpeed", false), + multiplier = new StatUnit("multiplier", false), percent = new StatUnit("percent", false), shieldHealth = new StatUnit("shieldHealth"), none = new StatUnit("none"), diff --git a/core/src/mindustry/world/meta/StatValues.java b/core/src/mindustry/world/meta/StatValues.java index 8547834614..e896dd5966 100644 --- a/core/src/mindustry/world/meta/StatValues.java +++ b/core/src/mindustry/world/meta/StatValues.java @@ -69,6 +69,48 @@ public class StatValues{ return number(value, unit, false); } + public static StatValue multiplierModifier(float value, StatUnit unit, boolean merge){ + return table -> { + String l1 = (unit.icon == null ? "" : unit.icon + " ") + multStat(value), l2 = (unit.space ? " " : "") + unit.localized(); + + if(merge){ + table.add(l1 + l2).left(); + }else{ + table.add(l1).left(); + table.add(l2).left(); + } + }; + } + + public static StatValue multiplierModifier(float value, StatUnit unit){ + return multiplierModifier(value, unit, true); + } + + public static StatValue multiplierModifier(float value){ + return multiplierModifier(value, StatUnit.multiplier); + } + + public static StatValue percentModifier(float value, StatUnit unit, boolean merge){ + return table -> { + String l1 = (unit.icon == null ? "" : unit.icon + " ") + ammoStat((value - 1) * 100), l2 = (unit.space ? " " : "") + unit.localized(); + + if(merge){ + table.add(l1 + l2).left(); + }else{ + table.add(l1).left(); + table.add(l2).left(); + } + }; + } + + public static StatValue percentModifier(float value, StatUnit unit){ + return percentModifier(value, unit, true); + } + + public static StatValue percentModifier(float value){ + return percentModifier(value, StatUnit.percent); + } + public static StatValue liquid(Liquid liquid, float amount, boolean perSecond){ return table -> table.add(displayLiquid(liquid, amount, perSecond)); } @@ -691,6 +733,10 @@ public class StatValues{ return (val > 0 ? "[stat]+" : "[negstat]") + Strings.autoFixed(val, 1); } + private static String multStat(float val){ + return (val >= 1 ? "[stat]" : "[negstat]") + Strings.autoFixed(val, 2); + } + private static TextureRegion icon(UnlockableContent t){ return t.uiIcon; } diff --git a/core/src/mindustry/world/meta/Stats.java b/core/src/mindustry/world/meta/Stats.java index b776994228..e59bae797c 100644 --- a/core/src/mindustry/world/meta/Stats.java +++ b/core/src/mindustry/world/meta/Stats.java @@ -32,6 +32,16 @@ public class Stats{ add(stat, StatValues.number((int)(value * 100), StatUnit.percent)); } + /** Adds a multiplicative modifier stat value. Value is assumed to be in the 0-1 range. */ + public void addMultModifier(Stat stat, float value){ + add(stat, StatValues.multiplierModifier(value)); + } + + /** Adds an percent modifier stat value. Value is assumed to be in the 0-1 range. */ + public void addPercentModifier(Stat stat, float value){ + add(stat, StatValues.percentModifier(value)); + } + /** Adds a single y/n boolean value. */ public void add(Stat stat, boolean value){ add(stat, StatValues.bool(value)); From 66b4c79f3826122c9a75837471d841c32d29c2cb Mon Sep 17 00:00:00 2001 From: JeanJPNM <61994401+JeanJPNM@users.noreply.github.com> Date: Tue, 4 Feb 2025 15:58:44 -0300 Subject: [PATCH 142/460] fix spawnwave ui when natural is a variable (#10307) Previously you couldn't set the x and y parameters of the spawnwave instruction if the value for the "natural" parameter was not exactly "false", now you can set them with "false" and any other variable name, except "true". --- core/src/mindustry/logic/LStatements.java | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/core/src/mindustry/logic/LStatements.java b/core/src/mindustry/logic/LStatements.java index bae410c9a6..1daafcdb45 100644 --- a/core/src/mindustry/logic/LStatements.java +++ b/core/src/mindustry/logic/LStatements.java @@ -1493,11 +1493,11 @@ public class LStatements{ table.add("natural "); fields(table, natural, str -> natural = str); - table.add("x ").visible(() -> natural.equals("false")); - fields(table, x, str -> x = str).visible(() -> natural.equals("false")); + table.add("x ").visible(() -> !natural.equals("true")); + fields(table, x, str -> x = str).visible(() -> !natural.equals("true")); - table.add(" y ").visible(() -> natural.equals("false")); - fields(table, y, str -> y = str).visible(() -> natural.equals("false")); + table.add(" y ").visible(() -> !natural.equals("true")); + fields(table, y, str -> y = str).visible(() -> !natural.equals("true")); } @Override From 0a315984bb53d2145b11292e14de6e6c3d7de4fd Mon Sep 17 00:00:00 2001 From: Github Actions Date: Tue, 4 Feb 2025 18:59:32 +0000 Subject: [PATCH 143/460] Automatic bundle update --- core/assets/bundles/bundle_be.properties | 1 + core/assets/bundles/bundle_bg.properties | 1 + core/assets/bundles/bundle_ca.properties | 1 + core/assets/bundles/bundle_cs.properties | 1 + core/assets/bundles/bundle_da.properties | 1 + core/assets/bundles/bundle_de.properties | 1 + core/assets/bundles/bundle_es.properties | 1 + core/assets/bundles/bundle_et.properties | 1 + core/assets/bundles/bundle_eu.properties | 1 + core/assets/bundles/bundle_fi.properties | 1 + core/assets/bundles/bundle_fil.properties | 1 + core/assets/bundles/bundle_fr.properties | 1 + core/assets/bundles/bundle_hu.properties | 1 + core/assets/bundles/bundle_id_ID.properties | 1 + core/assets/bundles/bundle_it.properties | 1 + core/assets/bundles/bundle_ja.properties | 1 + core/assets/bundles/bundle_ko.properties | 1 + core/assets/bundles/bundle_lt.properties | 1 + core/assets/bundles/bundle_nl.properties | 1 + core/assets/bundles/bundle_nl_BE.properties | 1 + core/assets/bundles/bundle_pl.properties | 1 + core/assets/bundles/bundle_pt_BR.properties | 1 + core/assets/bundles/bundle_pt_PT.properties | 1 + core/assets/bundles/bundle_ro.properties | 1 + core/assets/bundles/bundle_ru.properties | 1 + core/assets/bundles/bundle_sr.properties | 1 + core/assets/bundles/bundle_sv.properties | 1 + core/assets/bundles/bundle_th.properties | 1 + core/assets/bundles/bundle_tk.properties | 1 + core/assets/bundles/bundle_tr.properties | 1 + core/assets/bundles/bundle_uk_UA.properties | 1 + core/assets/bundles/bundle_vi.properties | 1 + core/assets/bundles/bundle_zh_CN.properties | 1 + core/assets/bundles/bundle_zh_TW.properties | 1 + 34 files changed, 34 insertions(+) diff --git a/core/assets/bundles/bundle_be.properties b/core/assets/bundles/bundle_be.properties index 8d4e69f8bc..1a13c842bf 100644 --- a/core/assets/bundles/bundle_be.properties +++ b/core/assets/bundles/bundle_be.properties @@ -1133,6 +1133,7 @@ unit.minutes = хв. unit.persecond = /сек unit.perminute = /хв unit.timesspeed = x хуткасць +unit.multiplier = x unit.percent = % unit.shieldhealth = моц шчыта unit.items = прадметаў diff --git a/core/assets/bundles/bundle_bg.properties b/core/assets/bundles/bundle_bg.properties index d9e25fe57e..10e4f418a9 100644 --- a/core/assets/bundles/bundle_bg.properties +++ b/core/assets/bundles/bundle_bg.properties @@ -1144,6 +1144,7 @@ unit.minutes = минути unit.persecond = /сек unit.perminute = /мин unit.timesspeed = x скорост +unit.multiplier = x unit.percent = % unit.shieldhealth = здравина на щита unit.items = предмети diff --git a/core/assets/bundles/bundle_ca.properties b/core/assets/bundles/bundle_ca.properties index e4530ef33d..71040808d4 100644 --- a/core/assets/bundles/bundle_ca.properties +++ b/core/assets/bundles/bundle_ca.properties @@ -1147,6 +1147,7 @@ unit.minutes = min unit.persecond = /s unit.perminute = /min unit.timesspeed = × velocitat +unit.multiplier = x unit.percent = % unit.shieldhealth = salut d’escut unit.items = elements diff --git a/core/assets/bundles/bundle_cs.properties b/core/assets/bundles/bundle_cs.properties index 415f376050..2cc371751c 100644 --- a/core/assets/bundles/bundle_cs.properties +++ b/core/assets/bundles/bundle_cs.properties @@ -1146,6 +1146,7 @@ unit.minutes = minuty unit.persecond = /s unit.perminute = /min unit.timesspeed = x větší rychlost +unit.multiplier = x unit.percent = % unit.shieldhealth = zdraví štítu unit.items = předměty diff --git a/core/assets/bundles/bundle_da.properties b/core/assets/bundles/bundle_da.properties index e5c09de346..c18db4f5f4 100644 --- a/core/assets/bundles/bundle_da.properties +++ b/core/assets/bundles/bundle_da.properties @@ -1135,6 +1135,7 @@ unit.minutes = minutter unit.persecond = /sek unit.perminute = /min unit.timesspeed = x hastighed +unit.multiplier = x unit.percent = % unit.shieldhealth = skjoldhelbred unit.items = genstande diff --git a/core/assets/bundles/bundle_de.properties b/core/assets/bundles/bundle_de.properties index b88000700b..129434a67a 100644 --- a/core/assets/bundles/bundle_de.properties +++ b/core/assets/bundles/bundle_de.properties @@ -1157,6 +1157,7 @@ unit.minutes = mins unit.persecond = /sek unit.perminute = /min unit.timesspeed = x Geschwindigkeit +unit.multiplier = x unit.percent = % unit.shieldhealth = Schildlebenspunkte unit.items = Materialeinheiten diff --git a/core/assets/bundles/bundle_es.properties b/core/assets/bundles/bundle_es.properties index c868d38cb7..b072d11402 100644 --- a/core/assets/bundles/bundle_es.properties +++ b/core/assets/bundles/bundle_es.properties @@ -1153,6 +1153,7 @@ unit.minutes = mins unit.persecond = /seg unit.perminute = /min unit.timesspeed = x velocidad +unit.multiplier = x unit.percent = % unit.shieldhealth = Escudo unit.items = objetos diff --git a/core/assets/bundles/bundle_et.properties b/core/assets/bundles/bundle_et.properties index 820411aba5..5e82463e00 100644 --- a/core/assets/bundles/bundle_et.properties +++ b/core/assets/bundles/bundle_et.properties @@ -1135,6 +1135,7 @@ unit.minutes = mins unit.persecond = /s unit.perminute = /min unit.timesspeed = x kiirus +unit.multiplier = x unit.percent = % unit.shieldhealth = shield health unit.items = ressursiühikut diff --git a/core/assets/bundles/bundle_eu.properties b/core/assets/bundles/bundle_eu.properties index ad734c5881..fa188eb495 100644 --- a/core/assets/bundles/bundle_eu.properties +++ b/core/assets/bundles/bundle_eu.properties @@ -1137,6 +1137,7 @@ unit.minutes = mins unit.persecond = /seg unit.perminute = /min unit.timesspeed = x abiadura +unit.multiplier = x unit.percent = % unit.shieldhealth = shield health unit.items = elementu diff --git a/core/assets/bundles/bundle_fi.properties b/core/assets/bundles/bundle_fi.properties index 5e9c6c21d1..6e3397fc48 100644 --- a/core/assets/bundles/bundle_fi.properties +++ b/core/assets/bundles/bundle_fi.properties @@ -1134,6 +1134,7 @@ unit.minutes = minuuttia unit.persecond = /s unit.perminute = /min unit.timesspeed = x nopeus +unit.multiplier = x unit.percent = % unit.shieldhealth = suojan elinpisteet unit.items = esinettä diff --git a/core/assets/bundles/bundle_fil.properties b/core/assets/bundles/bundle_fil.properties index 1b2f8dffd6..86c31d6f6a 100644 --- a/core/assets/bundles/bundle_fil.properties +++ b/core/assets/bundles/bundle_fil.properties @@ -1134,6 +1134,7 @@ unit.minutes = mins unit.persecond = /sec unit.perminute = /min unit.timesspeed = x speed +unit.multiplier = x unit.percent = % unit.shieldhealth = shield health unit.items = items diff --git a/core/assets/bundles/bundle_fr.properties b/core/assets/bundles/bundle_fr.properties index b8fec6548c..902cd31f27 100644 --- a/core/assets/bundles/bundle_fr.properties +++ b/core/assets/bundles/bundle_fr.properties @@ -1159,6 +1159,7 @@ unit.minutes = min unit.persecond = /sec unit.perminute = /min unit.timesspeed = x vitesse +unit.multiplier = x unit.percent = % unit.shieldhealth = santé du bouclier unit.items = objets diff --git a/core/assets/bundles/bundle_hu.properties b/core/assets/bundles/bundle_hu.properties index 3302684c27..2eb6fa855e 100644 --- a/core/assets/bundles/bundle_hu.properties +++ b/core/assets/bundles/bundle_hu.properties @@ -1165,6 +1165,7 @@ unit.minutes = perc unit.persecond = /mp unit.perminute = /perc unit.timesspeed = x sebesség +unit.multiplier = x unit.percent = % unit.shieldhealth = erőpajzs életereje unit.items = nyersanyag diff --git a/core/assets/bundles/bundle_id_ID.properties b/core/assets/bundles/bundle_id_ID.properties index 5040e63205..03c181afe7 100644 --- a/core/assets/bundles/bundle_id_ID.properties +++ b/core/assets/bundles/bundle_id_ID.properties @@ -1162,6 +1162,7 @@ unit.minutes = menit unit.persecond = /detik unit.perminute = /menit unit.timesspeed = x kecepatan +unit.multiplier = x unit.percent = % unit.shieldhealth = darah perisai unit.items = bahan diff --git a/core/assets/bundles/bundle_it.properties b/core/assets/bundles/bundle_it.properties index bb20fd2019..4602605a3d 100644 --- a/core/assets/bundles/bundle_it.properties +++ b/core/assets/bundles/bundle_it.properties @@ -1140,6 +1140,7 @@ unit.minutes = minuti unit.persecond = /s unit.perminute = /min unit.timesspeed = x velocità +unit.multiplier = x unit.percent = % unit.shieldhealth = salute scudo unit.items = oggetti diff --git a/core/assets/bundles/bundle_ja.properties b/core/assets/bundles/bundle_ja.properties index cdfb9cd8c3..d9bdfbf97e 100644 --- a/core/assets/bundles/bundle_ja.properties +++ b/core/assets/bundles/bundle_ja.properties @@ -1146,6 +1146,7 @@ unit.minutes = 分 unit.persecond = /秒 unit.perminute = /分 unit.timesspeed = 倍の速度 +unit.multiplier = x unit.percent = % unit.shieldhealth = シールド unit.items = アイテム diff --git a/core/assets/bundles/bundle_ko.properties b/core/assets/bundles/bundle_ko.properties index 688b4b1e93..b199b936dd 100644 --- a/core/assets/bundles/bundle_ko.properties +++ b/core/assets/bundles/bundle_ko.properties @@ -1164,6 +1164,7 @@ unit.minutes = 분 unit.persecond = /초 unit.perminute = /분 unit.timesspeed = x 배 +unit.multiplier = x unit.percent = % unit.shieldhealth = 보호막 체력 unit.items = 자원 diff --git a/core/assets/bundles/bundle_lt.properties b/core/assets/bundles/bundle_lt.properties index 42d94038c3..c722e448c4 100644 --- a/core/assets/bundles/bundle_lt.properties +++ b/core/assets/bundles/bundle_lt.properties @@ -1135,6 +1135,7 @@ unit.minutes = mins unit.persecond = /sek. unit.perminute = /min unit.timesspeed = x greičio +unit.multiplier = x unit.percent = % unit.shieldhealth = shield health unit.items = daiktai diff --git a/core/assets/bundles/bundle_nl.properties b/core/assets/bundles/bundle_nl.properties index 5bc5d727bb..47700e6f9e 100644 --- a/core/assets/bundles/bundle_nl.properties +++ b/core/assets/bundles/bundle_nl.properties @@ -1147,6 +1147,7 @@ unit.minutes = minuten unit.persecond = /sec unit.perminute = /min unit.timesspeed = x snelheid +unit.multiplier = x unit.percent = % unit.shieldhealth = levenspunten schild unit.items = materialen diff --git a/core/assets/bundles/bundle_nl_BE.properties b/core/assets/bundles/bundle_nl_BE.properties index 443cc72f40..e79cc2aeaf 100644 --- a/core/assets/bundles/bundle_nl_BE.properties +++ b/core/assets/bundles/bundle_nl_BE.properties @@ -1135,6 +1135,7 @@ unit.minutes = mins unit.persecond = /sec unit.perminute = /min unit.timesspeed = x speed +unit.multiplier = x unit.percent = % unit.shieldhealth = shield health unit.items = items diff --git a/core/assets/bundles/bundle_pl.properties b/core/assets/bundles/bundle_pl.properties index 90f61758f1..4cd0539a82 100644 --- a/core/assets/bundles/bundle_pl.properties +++ b/core/assets/bundles/bundle_pl.properties @@ -1144,6 +1144,7 @@ unit.minutes = mins unit.persecond = /sekundę unit.perminute = /min unit.timesspeed = x prędkość +unit.multiplier = x unit.percent = % unit.shieldhealth = życie tarczy unit.items = przedmioty diff --git a/core/assets/bundles/bundle_pt_BR.properties b/core/assets/bundles/bundle_pt_BR.properties index cbdc432a75..c21c1669d8 100644 --- a/core/assets/bundles/bundle_pt_BR.properties +++ b/core/assets/bundles/bundle_pt_BR.properties @@ -1154,6 +1154,7 @@ unit.minutes = mins unit.persecond = /segundo unit.perminute = /min unit.timesspeed = x Velocidade +unit.multiplier = x unit.percent = % unit.shieldhealth = Saúde do escudo unit.items = itens diff --git a/core/assets/bundles/bundle_pt_PT.properties b/core/assets/bundles/bundle_pt_PT.properties index 89ab883ce0..302abd555d 100644 --- a/core/assets/bundles/bundle_pt_PT.properties +++ b/core/assets/bundles/bundle_pt_PT.properties @@ -1135,6 +1135,7 @@ unit.minutes = mins unit.persecond = por segundo unit.perminute = /min unit.timesspeed = x Velocidade +unit.multiplier = x unit.percent = % unit.shieldhealth = shield health unit.items = itens diff --git a/core/assets/bundles/bundle_ro.properties b/core/assets/bundles/bundle_ro.properties index 1de39c41ab..582e758981 100644 --- a/core/assets/bundles/bundle_ro.properties +++ b/core/assets/bundles/bundle_ro.properties @@ -1146,6 +1146,7 @@ unit.minutes = min unit.persecond = /sec unit.perminute = /min unit.timesspeed = x viteză +unit.multiplier = x unit.percent = % unit.shieldhealth = viață scut unit.items = materiale diff --git a/core/assets/bundles/bundle_ru.properties b/core/assets/bundles/bundle_ru.properties index c637a99b31..99034b9fd6 100644 --- a/core/assets/bundles/bundle_ru.properties +++ b/core/assets/bundles/bundle_ru.properties @@ -1146,6 +1146,7 @@ unit.minutes = мин unit.persecond = /сек unit.perminute = /мин unit.timesspeed = x скорость +unit.multiplier = x unit.percent = % unit.shieldhealth = прочность щита unit.items = предметов diff --git a/core/assets/bundles/bundle_sr.properties b/core/assets/bundles/bundle_sr.properties index eadd3ae926..36830b2681 100644 --- a/core/assets/bundles/bundle_sr.properties +++ b/core/assets/bundles/bundle_sr.properties @@ -1148,6 +1148,7 @@ unit.minutes = minuti unit.persecond = /sekundi unit.perminute = /minuti unit.timesspeed = x brzina +unit.multiplier = x unit.percent = % unit.shieldhealth = snaga štita unit.items = materijali diff --git a/core/assets/bundles/bundle_sv.properties b/core/assets/bundles/bundle_sv.properties index aeac077792..323cbea214 100644 --- a/core/assets/bundles/bundle_sv.properties +++ b/core/assets/bundles/bundle_sv.properties @@ -1135,6 +1135,7 @@ unit.minutes = mins unit.persecond = /sek unit.perminute = /min unit.timesspeed = x hastighet +unit.multiplier = x unit.percent = % unit.shieldhealth = shield health unit.items = föremål diff --git a/core/assets/bundles/bundle_th.properties b/core/assets/bundles/bundle_th.properties index c30b59ff9e..e1f1a82e0e 100644 --- a/core/assets/bundles/bundle_th.properties +++ b/core/assets/bundles/bundle_th.properties @@ -1149,6 +1149,7 @@ unit.minutes = นาที unit.persecond = /วิ unit.perminute = /นาที unit.timesspeed = x เร็วขึ้น +unit.multiplier = x unit.percent = % unit.shieldhealth = พลังชีวิตโล่ unit.items = ไอเท็ม diff --git a/core/assets/bundles/bundle_tk.properties b/core/assets/bundles/bundle_tk.properties index eac53c4890..9871a4d2b0 100644 --- a/core/assets/bundles/bundle_tk.properties +++ b/core/assets/bundles/bundle_tk.properties @@ -1135,6 +1135,7 @@ unit.minutes = mins unit.persecond = /sec unit.perminute = /min unit.timesspeed = x speed +unit.multiplier = x unit.percent = % unit.shieldhealth = shield health unit.items = esya diff --git a/core/assets/bundles/bundle_tr.properties b/core/assets/bundles/bundle_tr.properties index ff314d8c61..6c5f8942a2 100644 --- a/core/assets/bundles/bundle_tr.properties +++ b/core/assets/bundles/bundle_tr.properties @@ -1144,6 +1144,7 @@ unit.minutes = dakika unit.persecond = /sn unit.perminute = /dk unit.timesspeed = x hız +unit.multiplier = x unit.percent = % unit.shieldhealth = kalkan canı unit.items = eşya diff --git a/core/assets/bundles/bundle_uk_UA.properties b/core/assets/bundles/bundle_uk_UA.properties index 50a19637ef..5827f32b0e 100644 --- a/core/assets/bundles/bundle_uk_UA.properties +++ b/core/assets/bundles/bundle_uk_UA.properties @@ -1155,6 +1155,7 @@ unit.minutes = хв. unit.persecond = за сек. unit.perminute = за хв. unit.timesspeed = x швидкість +unit.multiplier = x unit.percent = % unit.shieldhealth = міцність щита unit.items = предм. diff --git a/core/assets/bundles/bundle_vi.properties b/core/assets/bundles/bundle_vi.properties index 8355d3f9cf..36fd068564 100644 --- a/core/assets/bundles/bundle_vi.properties +++ b/core/assets/bundles/bundle_vi.properties @@ -1165,6 +1165,7 @@ unit.minutes = phút unit.persecond = /giây unit.perminute = /phút unit.timesspeed = x tốc độ +unit.multiplier = x unit.percent = % unit.shieldhealth = độ bền khiên unit.items = vật phẩm diff --git a/core/assets/bundles/bundle_zh_CN.properties b/core/assets/bundles/bundle_zh_CN.properties index d3d3cc224e..6d5eb61361 100644 --- a/core/assets/bundles/bundle_zh_CN.properties +++ b/core/assets/bundles/bundle_zh_CN.properties @@ -1157,6 +1157,7 @@ unit.minutes = 分 unit.persecond = /秒 unit.perminute = /分 unit.timesspeed = x速度 +unit.multiplier = x unit.percent = % unit.shieldhealth = 护盾容量 unit.items = 物品 diff --git a/core/assets/bundles/bundle_zh_TW.properties b/core/assets/bundles/bundle_zh_TW.properties index 237628eb46..3ec280bb26 100644 --- a/core/assets/bundles/bundle_zh_TW.properties +++ b/core/assets/bundles/bundle_zh_TW.properties @@ -1152,6 +1152,7 @@ unit.minutes = 分 unit.persecond = /秒 unit.perminute = /分 unit.timesspeed = ×速度 +unit.multiplier = x unit.percent = % unit.shieldhealth = 護盾生命值 unit.items = 物品 From ede036a91888572b2767cc96753760dbd26a195d Mon Sep 17 00:00:00 2001 From: a-big-fish-fish <111189982+a-big-fish-fish@users.noreply.github.com> Date: Wed, 5 Feb 2025 03:06:23 +0800 Subject: [PATCH 144/460] Update servers_v7.json (#10417) --- servers_v7.json | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/servers_v7.json b/servers_v7.json index 90fec0e040..5b25ee9cee 100644 --- a/servers_v7.json +++ b/servers_v7.json @@ -326,5 +326,14 @@ "address": [ "mindustry.kr" ] + }, + { + "name": "Extra Utilities", + "address": [ + "yuyu.mindustry.ink", + "cn.mindustry.ink", + "203.135.99.51:15142", + "203.135.99.51:15143" + ] } ] From 1ecdcb14f208c29fd3b990925d6c3c8e8c8b2b99 Mon Sep 17 00:00:00 2001 From: sasha0552 Date: Tue, 4 Feb 2025 22:09:27 +0300 Subject: [PATCH 145/460] Ability to disable fetching a list of community servers (#10283) * Ability to disable fetching a list of community servers * Addressing review comments --- core/assets/bundles/bundle.properties | 1 + core/assets/contributors | 1 + core/src/mindustry/ui/dialogs/JoinDialog.java | 22 ++++++++++++++----- .../ui/dialogs/SettingsMenuDialog.java | 7 ++++++ 4 files changed, 25 insertions(+), 6 deletions(-) diff --git a/core/assets/bundles/bundle.properties b/core/assets/bundles/bundle.properties index 87d18617d1..d3b0ad6d3d 100644 --- a/core/assets/bundles/bundle.properties +++ b/core/assets/bundles/bundle.properties @@ -1242,6 +1242,7 @@ setting.mutemusic.name = Mute Music setting.sfxvol.name = SFX Volume setting.mutesound.name = Mute Sound setting.crashreport.name = Send Anonymous Crash Reports +setting.communityservers.name = Fetch Community Server List setting.savecreate.name = Auto-Create Saves setting.steampublichost.name = Public Game Visibility setting.playerlimit.name = Player Limit diff --git a/core/assets/contributors b/core/assets/contributors index 8bcc1913ab..f939b3c30f 100644 --- a/core/assets/contributors +++ b/core/assets/contributors @@ -170,3 +170,4 @@ Mythril hexagon-recursion JasonP01 BlueTheCube +sasha0552 diff --git a/core/src/mindustry/ui/dialogs/JoinDialog.java b/core/src/mindustry/ui/dialogs/JoinDialog.java index f6e4191c7b..e4db478179 100644 --- a/core/src/mindustry/ui/dialogs/JoinDialog.java +++ b/core/src/mindustry/ui/dialogs/JoinDialog.java @@ -138,7 +138,9 @@ public class JoinDialog extends BaseDialog{ refreshLocal(); refreshRemote(); - refreshCommunity(); + if(Core.settings.getBool("communityservers", true)){ + refreshCommunity(); + } } void setupRemote(){ @@ -317,7 +319,9 @@ public class JoinDialog extends BaseDialog{ section(steam ? "@servers.local.steam" : "@servers.local", local, false); section("@servers.remote", remote, false); - section("@servers.global", global, true); + if(Core.settings.getBool("communityservers", true)){ + section("@servers.global", global, true); + } ScrollPane pane = new ScrollPane(hosts); pane.setFadeScrollBars(false); @@ -631,12 +635,18 @@ public class JoinDialog extends BaseDialog{ Core.settings.remove("server-list"); } - var urls = Version.type.equals("bleeding-edge") || Vars.forceBeServers ? serverJsonBeURLs : serverJsonURLs; - - fetchServers(urls, 0); + fetchServers(); } - private void fetchServers(String[] urls, int index){ + public static void fetchServers(){ + var urls = Version.type.equals("bleeding-edge") || Vars.forceBeServers ? serverJsonBeURLs : serverJsonURLs; + + if(Core.settings.getBool("communityservers", true)){ + fetchServers(urls, 0); + } + } + + private static void fetchServers(String[] urls, int index){ if(index >= urls.length) return; //get servers diff --git a/core/src/mindustry/ui/dialogs/SettingsMenuDialog.java b/core/src/mindustry/ui/dialogs/SettingsMenuDialog.java index 01f7c05a53..9f5b8e2813 100644 --- a/core/src/mindustry/ui/dialogs/SettingsMenuDialog.java +++ b/core/src/mindustry/ui/dialogs/SettingsMenuDialog.java @@ -333,6 +333,13 @@ public class SettingsMenuDialog extends BaseDialog{ game.checkPref("crashreport", true); } + game.checkPref("communityservers", true, val -> { + defaultServers.clear(); + if(val){ + JoinDialog.fetchServers(); + } + }); + game.checkPref("savecreate", true); game.checkPref("blockreplace", true); game.checkPref("conveyorpathfinding", true); From 042bd6c186bd7fafe8b92d648f78dbf2c9bf882f Mon Sep 17 00:00:00 2001 From: Github Actions Date: Tue, 4 Feb 2025 19:10:17 +0000 Subject: [PATCH 146/460] Automatic bundle update --- core/assets/bundles/bundle_be.properties | 1 + core/assets/bundles/bundle_bg.properties | 1 + core/assets/bundles/bundle_ca.properties | 1 + core/assets/bundles/bundle_cs.properties | 1 + core/assets/bundles/bundle_da.properties | 1 + core/assets/bundles/bundle_de.properties | 1 + core/assets/bundles/bundle_es.properties | 1 + core/assets/bundles/bundle_et.properties | 1 + core/assets/bundles/bundle_eu.properties | 1 + core/assets/bundles/bundle_fi.properties | 1 + core/assets/bundles/bundle_fil.properties | 1 + core/assets/bundles/bundle_fr.properties | 1 + core/assets/bundles/bundle_hu.properties | 1 + core/assets/bundles/bundle_id_ID.properties | 1 + core/assets/bundles/bundle_it.properties | 1 + core/assets/bundles/bundle_ja.properties | 1 + core/assets/bundles/bundle_ko.properties | 1 + core/assets/bundles/bundle_lt.properties | 1 + core/assets/bundles/bundle_nl.properties | 1 + core/assets/bundles/bundle_nl_BE.properties | 1 + core/assets/bundles/bundle_pl.properties | 1 + core/assets/bundles/bundle_pt_BR.properties | 1 + core/assets/bundles/bundle_pt_PT.properties | 1 + core/assets/bundles/bundle_ro.properties | 1 + core/assets/bundles/bundle_ru.properties | 1 + core/assets/bundles/bundle_sr.properties | 1 + core/assets/bundles/bundle_sv.properties | 1 + core/assets/bundles/bundle_th.properties | 1 + core/assets/bundles/bundle_tk.properties | 1 + core/assets/bundles/bundle_tr.properties | 1 + core/assets/bundles/bundle_uk_UA.properties | 1 + core/assets/bundles/bundle_vi.properties | 1 + core/assets/bundles/bundle_zh_CN.properties | 1 + core/assets/bundles/bundle_zh_TW.properties | 1 + 34 files changed, 34 insertions(+) diff --git a/core/assets/bundles/bundle_be.properties b/core/assets/bundles/bundle_be.properties index 1a13c842bf..39947d3a81 100644 --- a/core/assets/bundles/bundle_be.properties +++ b/core/assets/bundles/bundle_be.properties @@ -1210,6 +1210,7 @@ setting.mutemusic.name = Заглушыць музыку setting.sfxvol.name = Гучнасць эфектаў setting.mutesound.name = Заглушыць гук setting.crashreport.name = Адпраўляць ананімныя справаздачы аб вылетах +setting.communityservers.name = Fetch Community Server List setting.savecreate.name = Аўтаматычнае стварэнне захаванняў setting.steampublichost.name = Public Game Visibility setting.playerlimit.name = Абмежаванне гульцоў diff --git a/core/assets/bundles/bundle_bg.properties b/core/assets/bundles/bundle_bg.properties index 10e4f418a9..9b50a945c7 100644 --- a/core/assets/bundles/bundle_bg.properties +++ b/core/assets/bundles/bundle_bg.properties @@ -1221,6 +1221,7 @@ setting.mutemusic.name = Заглуши Музиката setting.sfxvol.name = Сила на Звуковите Ефекти setting.mutesound.name = Заглуши Звука setting.crashreport.name = ИЗпращай Анонимни Отчети за Сривове +setting.communityservers.name = Fetch Community Server List setting.savecreate.name = Автоматични Записи setting.steampublichost.name = Public Game Visibility setting.playerlimit.name = Лимит на Играчи diff --git a/core/assets/bundles/bundle_ca.properties b/core/assets/bundles/bundle_ca.properties index 71040808d4..5edfea4674 100644 --- a/core/assets/bundles/bundle_ca.properties +++ b/core/assets/bundles/bundle_ca.properties @@ -1224,6 +1224,7 @@ setting.mutemusic.name = Silencia la música setting.sfxvol.name = Volums dels efectes de so setting.mutesound.name = Silencia el so setting.crashreport.name = Envia informes d’error anònims +setting.communityservers.name = Fetch Community Server List setting.savecreate.name = Desa automàticament la partida setting.steampublichost.name = Visibilitat de la partida pública setting.playerlimit.name = Límit de jugadors diff --git a/core/assets/bundles/bundle_cs.properties b/core/assets/bundles/bundle_cs.properties index 2cc371751c..0afb11cde3 100644 --- a/core/assets/bundles/bundle_cs.properties +++ b/core/assets/bundles/bundle_cs.properties @@ -1223,6 +1223,7 @@ setting.mutemusic.name = Ztišit hudbu setting.sfxvol.name = Hlasitost efektů setting.mutesound.name = Ztišit zvuk setting.crashreport.name = Poslat anonymní hlášení o spadnutí Mindustry +setting.communityservers.name = Fetch Community Server List setting.savecreate.name = Automaticky ukládat hru setting.steampublichost.name = Public Game Visibility setting.playerlimit.name = Nejvyšší počet hráčů diff --git a/core/assets/bundles/bundle_da.properties b/core/assets/bundles/bundle_da.properties index c18db4f5f4..44198c2d57 100644 --- a/core/assets/bundles/bundle_da.properties +++ b/core/assets/bundles/bundle_da.properties @@ -1212,6 +1212,7 @@ setting.mutemusic.name = Forstum musik setting.sfxvol.name = SFX-volumen setting.mutesound.name = Forstum lyde setting.crashreport.name = Send anonyme fejlrapporter +setting.communityservers.name = Fetch Community Server List setting.savecreate.name = Gem automatisk setting.steampublichost.name = Public Game Visibility setting.playerlimit.name = Spiller-grænse diff --git a/core/assets/bundles/bundle_de.properties b/core/assets/bundles/bundle_de.properties index 129434a67a..45bfdc2470 100644 --- a/core/assets/bundles/bundle_de.properties +++ b/core/assets/bundles/bundle_de.properties @@ -1234,6 +1234,7 @@ setting.mutemusic.name = Musik stummschalten setting.sfxvol.name = Audioeffekt-Lautstärke setting.mutesound.name = Audioeffekte stummschalten setting.crashreport.name = Anonyme Absturzberichte senden +setting.communityservers.name = Fetch Community Server List setting.savecreate.name = Automatisch speichern setting.steampublichost.name = Public Game Visibility setting.playerlimit.name = Spielerbegrenzung diff --git a/core/assets/bundles/bundle_es.properties b/core/assets/bundles/bundle_es.properties index b072d11402..bde17ade87 100644 --- a/core/assets/bundles/bundle_es.properties +++ b/core/assets/bundles/bundle_es.properties @@ -1230,6 +1230,7 @@ setting.mutemusic.name = Silenciar música setting.sfxvol.name = Volumen del sonido setting.mutesound.name = Silenciar sonido setting.crashreport.name = Enviar registros de errores anónimos +setting.communityservers.name = Fetch Community Server List setting.savecreate.name = Guardado automático setting.steampublichost.name = Public Game Visibility setting.playerlimit.name = Limite de jugadores diff --git a/core/assets/bundles/bundle_et.properties b/core/assets/bundles/bundle_et.properties index 5e82463e00..9d00068faa 100644 --- a/core/assets/bundles/bundle_et.properties +++ b/core/assets/bundles/bundle_et.properties @@ -1212,6 +1212,7 @@ setting.mutemusic.name = Vaigista muusika setting.sfxvol.name = Heliefektide tugevus setting.mutesound.name = Vaigista heli setting.crashreport.name = Saada automaatseid veateateid +setting.communityservers.name = Fetch Community Server List setting.savecreate.name = Loo automaatseid salvestisi setting.steampublichost.name = Public Game Visibility setting.playerlimit.name = Player Limit diff --git a/core/assets/bundles/bundle_eu.properties b/core/assets/bundles/bundle_eu.properties index fa188eb495..3d1e427a1b 100644 --- a/core/assets/bundles/bundle_eu.properties +++ b/core/assets/bundles/bundle_eu.properties @@ -1214,6 +1214,7 @@ setting.mutemusic.name = Isilarazi musika setting.sfxvol.name = Efektuen bolumena setting.mutesound.name = Isilarazi soinua setting.crashreport.name = Bidali kraskatze txosten automatikoak +setting.communityservers.name = Fetch Community Server List setting.savecreate.name = Gorde automatikoki setting.steampublichost.name = Public Game Visibility setting.playerlimit.name = Player Limit diff --git a/core/assets/bundles/bundle_fi.properties b/core/assets/bundles/bundle_fi.properties index 6e3397fc48..065e745a04 100644 --- a/core/assets/bundles/bundle_fi.properties +++ b/core/assets/bundles/bundle_fi.properties @@ -1211,6 +1211,7 @@ setting.mutemusic.name = Mykistä musiikki setting.sfxvol.name = SFX-voimakkuus setting.mutesound.name = Mykistä äänet setting.crashreport.name = Lähetä anonyymejä kaatumisilmoituksia +setting.communityservers.name = Fetch Community Server List setting.savecreate.name = Luo tallenuksia automaattisesti setting.steampublichost.name = Public Game Visibility setting.playerlimit.name = Pelaajaraja diff --git a/core/assets/bundles/bundle_fil.properties b/core/assets/bundles/bundle_fil.properties index 86c31d6f6a..ed42b0de67 100644 --- a/core/assets/bundles/bundle_fil.properties +++ b/core/assets/bundles/bundle_fil.properties @@ -1211,6 +1211,7 @@ setting.mutemusic.name = Mute Music setting.sfxvol.name = SFX Volume setting.mutesound.name = Mute Sound setting.crashreport.name = Mag-send ng Anonymous Crash Reports +setting.communityservers.name = Fetch Community Server List setting.savecreate.name = Auto-Create Saves setting.steampublichost.name = Public Game Visibility setting.playerlimit.name = Player Limit diff --git a/core/assets/bundles/bundle_fr.properties b/core/assets/bundles/bundle_fr.properties index 902cd31f27..9ef61069b8 100644 --- a/core/assets/bundles/bundle_fr.properties +++ b/core/assets/bundles/bundle_fr.properties @@ -1236,6 +1236,7 @@ setting.mutemusic.name = Couper la Musique setting.sfxvol.name = Volume des Sons et Effets setting.mutesound.name = Couper les Sons et Effets setting.crashreport.name = Envoyer des Rapports de crash anonymes +setting.communityservers.name = Fetch Community Server List setting.savecreate.name = Sauvegardes Automatiques setting.steampublichost.name = Public Game Visibility setting.playerlimit.name = Limite de Joueurs diff --git a/core/assets/bundles/bundle_hu.properties b/core/assets/bundles/bundle_hu.properties index 2eb6fa855e..b19c6fd4cf 100644 --- a/core/assets/bundles/bundle_hu.properties +++ b/core/assets/bundles/bundle_hu.properties @@ -1242,6 +1242,7 @@ setting.mutemusic.name = Zene némítása setting.sfxvol.name = Hanghatások hangereje setting.mutesound.name = Hang némítása setting.crashreport.name = Névtelen összeomlási jelentések +setting.communityservers.name = Fetch Community Server List setting.savecreate.name = Automatikus mentés setting.steampublichost.name = Nyilvános játék láthatósága setting.playerlimit.name = Játékoskorlát diff --git a/core/assets/bundles/bundle_id_ID.properties b/core/assets/bundles/bundle_id_ID.properties index 03c181afe7..56db81e1ea 100644 --- a/core/assets/bundles/bundle_id_ID.properties +++ b/core/assets/bundles/bundle_id_ID.properties @@ -1239,6 +1239,7 @@ setting.mutemusic.name = Bisukan Musik setting.sfxvol.name = Volume Suara Efek setting.mutesound.name = Bisukan Suara setting.crashreport.name = Laporkan Masalah Secara Anonim +setting.communityservers.name = Fetch Community Server List setting.savecreate.name = Otomatis Menyimpan setting.steampublichost.name = Visibilitas Game Publik setting.playerlimit.name = Batas pemain diff --git a/core/assets/bundles/bundle_it.properties b/core/assets/bundles/bundle_it.properties index 4602605a3d..a3bf343b1c 100644 --- a/core/assets/bundles/bundle_it.properties +++ b/core/assets/bundles/bundle_it.properties @@ -1217,6 +1217,7 @@ setting.mutemusic.name = Silenzia Musica setting.sfxvol.name = Volume Effetti setting.mutesound.name = Silenzia Suoni setting.crashreport.name = Invia rapporti anonimi sugli arresti anomali +setting.communityservers.name = Fetch Community Server List setting.savecreate.name = Salvataggi Automatici setting.steampublichost.name = Public Game Visibility setting.playerlimit.name = Limite Giocatori diff --git a/core/assets/bundles/bundle_ja.properties b/core/assets/bundles/bundle_ja.properties index d9bdfbf97e..17dad5f90c 100644 --- a/core/assets/bundles/bundle_ja.properties +++ b/core/assets/bundles/bundle_ja.properties @@ -1223,6 +1223,7 @@ setting.mutemusic.name = 音楽をミュート setting.sfxvol.name = 効果音 音量 setting.mutesound.name = 効果音をミュート setting.crashreport.name = 匿名でクラッシュレポートを送信する +setting.communityservers.name = Fetch Community Server List setting.savecreate.name = 自動保存 setting.steampublichost.name = Public Game Visibility setting.playerlimit.name = プレイヤー数制限 diff --git a/core/assets/bundles/bundle_ko.properties b/core/assets/bundles/bundle_ko.properties index b199b936dd..453c81528d 100644 --- a/core/assets/bundles/bundle_ko.properties +++ b/core/assets/bundles/bundle_ko.properties @@ -1241,6 +1241,7 @@ setting.mutemusic.name = 음소거 setting.sfxvol.name = 효과음 크기 setting.mutesound.name = 소리 끄기 setting.crashreport.name = 익명으로 오류 보고서 자동 전송 +setting.communityservers.name = Fetch Community Server List setting.savecreate.name = 자동 저장 활성화 setting.steampublichost.name = 공개 게임 가시성 setting.playerlimit.name = 플레이어 제한 diff --git a/core/assets/bundles/bundle_lt.properties b/core/assets/bundles/bundle_lt.properties index c722e448c4..f26b409714 100644 --- a/core/assets/bundles/bundle_lt.properties +++ b/core/assets/bundles/bundle_lt.properties @@ -1212,6 +1212,7 @@ setting.mutemusic.name = Nutildyti Muziką setting.sfxvol.name = SFX Garsumas setting.mutesound.name = Nutildyti Garsus setting.crashreport.name = Siųsti Anoniminius Strigties Pranešimus +setting.communityservers.name = Fetch Community Server List setting.savecreate.name = Automatiškai Kurti Išsaugojimus setting.steampublichost.name = Public Game Visibility setting.playerlimit.name = Žaidėjų Limitas diff --git a/core/assets/bundles/bundle_nl.properties b/core/assets/bundles/bundle_nl.properties index 47700e6f9e..0876b596a2 100644 --- a/core/assets/bundles/bundle_nl.properties +++ b/core/assets/bundles/bundle_nl.properties @@ -1224,6 +1224,7 @@ setting.mutemusic.name = Demp Muziek setting.sfxvol.name = SFX Volume setting.mutesound.name = Demp Geluid setting.crashreport.name = Stuur Anonieme Crashmeldingen +setting.communityservers.name = Fetch Community Server List setting.savecreate.name = Bewaar Saves Automatisch setting.steampublichost.name = Public Game Visibility setting.playerlimit.name = Spelerslijst diff --git a/core/assets/bundles/bundle_nl_BE.properties b/core/assets/bundles/bundle_nl_BE.properties index e79cc2aeaf..d65183febe 100644 --- a/core/assets/bundles/bundle_nl_BE.properties +++ b/core/assets/bundles/bundle_nl_BE.properties @@ -1212,6 +1212,7 @@ setting.mutemusic.name = Mute Music setting.sfxvol.name = SFX Volume setting.mutesound.name = Mute Sound setting.crashreport.name = Send Anonymous Crash Reports +setting.communityservers.name = Fetch Community Server List setting.savecreate.name = Auto-Create Saves setting.steampublichost.name = Public Game Visibility setting.playerlimit.name = Player Limit diff --git a/core/assets/bundles/bundle_pl.properties b/core/assets/bundles/bundle_pl.properties index 4cd0539a82..ada07add20 100644 --- a/core/assets/bundles/bundle_pl.properties +++ b/core/assets/bundles/bundle_pl.properties @@ -1221,6 +1221,7 @@ setting.mutemusic.name = Wycisz muzykę setting.sfxvol.name = Głośność dźwięków setting.mutesound.name = Wycisz dźwięki setting.crashreport.name = Wysyłaj anonimowo dane o crashu gry +setting.communityservers.name = Fetch Community Server List setting.savecreate.name = Automatyczne tworzenie zapisów setting.steampublichost.name = Public Game Visibility setting.playerlimit.name = Limit graczy diff --git a/core/assets/bundles/bundle_pt_BR.properties b/core/assets/bundles/bundle_pt_BR.properties index c21c1669d8..bf02f277ba 100644 --- a/core/assets/bundles/bundle_pt_BR.properties +++ b/core/assets/bundles/bundle_pt_BR.properties @@ -1231,6 +1231,7 @@ setting.mutemusic.name = Desligar Música setting.sfxvol.name = Volume de Efeitos setting.mutesound.name = Desligar Som setting.crashreport.name = Enviar denúncias anônimas de erros +setting.communityservers.name = Fetch Community Server List setting.savecreate.name = Criar salvamentos automaticamente setting.steampublichost.name = Public Game Visibility setting.playerlimit.name = Limites de Player diff --git a/core/assets/bundles/bundle_pt_PT.properties b/core/assets/bundles/bundle_pt_PT.properties index 302abd555d..ce02a779df 100644 --- a/core/assets/bundles/bundle_pt_PT.properties +++ b/core/assets/bundles/bundle_pt_PT.properties @@ -1212,6 +1212,7 @@ setting.mutemusic.name = Desligar Música setting.sfxvol.name = Volume de Efeitos setting.mutesound.name = Desligar Som setting.crashreport.name = Enviar denuncias de crash anonimas +setting.communityservers.name = Fetch Community Server List setting.savecreate.name = Criar gravamentos automaticamente setting.steampublichost.name = Public Game Visibility setting.playerlimit.name = Limite de Jogadores diff --git a/core/assets/bundles/bundle_ro.properties b/core/assets/bundles/bundle_ro.properties index 582e758981..371fb015ab 100644 --- a/core/assets/bundles/bundle_ro.properties +++ b/core/assets/bundles/bundle_ro.properties @@ -1223,6 +1223,7 @@ setting.mutemusic.name = Muzica pe Mut setting.sfxvol.name = Volum Efecte Sonore setting.mutesound.name = Sunetul pe Mut setting.crashreport.name = Trimite Rapoarte de Crash anonime +setting.communityservers.name = Fetch Community Server List setting.savecreate.name = Auto-Creează Salvări setting.steampublichost.name = Public Game Visibility setting.playerlimit.name = Limita Jucătorilor diff --git a/core/assets/bundles/bundle_ru.properties b/core/assets/bundles/bundle_ru.properties index 99034b9fd6..e803850b40 100644 --- a/core/assets/bundles/bundle_ru.properties +++ b/core/assets/bundles/bundle_ru.properties @@ -1223,6 +1223,7 @@ setting.mutemusic.name = Заглушить музыку setting.sfxvol.name = Громкость эффектов setting.mutesound.name = Заглушить звук setting.crashreport.name = Отправлять анонимные отчёты о вылетах +setting.communityservers.name = Fetch Community Server List setting.savecreate.name = Автоматическое создание сохранений setting.steampublichost.name = Public Game Visibility setting.playerlimit.name = Ограничение игроков diff --git a/core/assets/bundles/bundle_sr.properties b/core/assets/bundles/bundle_sr.properties index 36830b2681..f342cb801a 100644 --- a/core/assets/bundles/bundle_sr.properties +++ b/core/assets/bundles/bundle_sr.properties @@ -1225,6 +1225,7 @@ setting.mutemusic.name = Nema Muzike setting.sfxvol.name = Jačina Zvučnih Efekata setting.mutesound.name = Nema Zvuka setting.crashreport.name = Send Anonymous Crash Reports +setting.communityservers.name = Fetch Community Server List setting.savecreate.name = Automatski Snimaj Igru setting.steampublichost.name = Public Game Visibility setting.playerlimit.name = Limit Igrača diff --git a/core/assets/bundles/bundle_sv.properties b/core/assets/bundles/bundle_sv.properties index 323cbea214..68a8c23fbc 100644 --- a/core/assets/bundles/bundle_sv.properties +++ b/core/assets/bundles/bundle_sv.properties @@ -1212,6 +1212,7 @@ setting.mutemusic.name = Stäng Av Musik setting.sfxvol.name = Ljudeffektvolym setting.mutesound.name = Stäng Av Ljudeffekter setting.crashreport.name = Skicka Anonyma Krashrapporter +setting.communityservers.name = Fetch Community Server List setting.savecreate.name = Auto-Create Saves setting.steampublichost.name = Public Game Visibility setting.playerlimit.name = Player Limit diff --git a/core/assets/bundles/bundle_th.properties b/core/assets/bundles/bundle_th.properties index e1f1a82e0e..ddc0d232ff 100644 --- a/core/assets/bundles/bundle_th.properties +++ b/core/assets/bundles/bundle_th.properties @@ -1226,6 +1226,7 @@ setting.mutemusic.name = ปิดเสียงเพลง setting.sfxvol.name = ระดับเสียง SFX setting.mutesound.name = ปิดเสียง setting.crashreport.name = ส่งรายงานข้อขัดข้องแบบไม่ระบุตัวตน +setting.communityservers.name = Fetch Community Server List setting.savecreate.name = สร้างเซฟโดยอัตโนมัติ setting.steampublichost.name = การมองเห็นเกมสาธารณะ setting.playerlimit.name = จำกัดผู้เล่น diff --git a/core/assets/bundles/bundle_tk.properties b/core/assets/bundles/bundle_tk.properties index 9871a4d2b0..7076eacb11 100644 --- a/core/assets/bundles/bundle_tk.properties +++ b/core/assets/bundles/bundle_tk.properties @@ -1212,6 +1212,7 @@ setting.mutemusic.name = Sesi kapat setting.sfxvol.name = Ses seviyesi setting.mutesound.name = Sesi kapat setting.crashreport.name = Send Anonymous Crash Reports +setting.communityservers.name = Fetch Community Server List setting.savecreate.name = Auto-Create Saves setting.steampublichost.name = Public Game Visibility setting.playerlimit.name = Player Limit diff --git a/core/assets/bundles/bundle_tr.properties b/core/assets/bundles/bundle_tr.properties index 6c5f8942a2..5080bf4235 100644 --- a/core/assets/bundles/bundle_tr.properties +++ b/core/assets/bundles/bundle_tr.properties @@ -1221,6 +1221,7 @@ setting.mutemusic.name = Müziği Kapat setting.sfxvol.name = Oyun Sesi setting.mutesound.name = Sesi Kapat setting.crashreport.name = Anonim Çökme Raporları Gönder +setting.communityservers.name = Fetch Community Server List setting.savecreate.name = Otomatik Kayıt Oluştur setting.steampublichost.name = Herkese Açık Oyun Görünürlüğü setting.playerlimit.name = Oyuncu Limiti diff --git a/core/assets/bundles/bundle_uk_UA.properties b/core/assets/bundles/bundle_uk_UA.properties index 5827f32b0e..fab28810eb 100644 --- a/core/assets/bundles/bundle_uk_UA.properties +++ b/core/assets/bundles/bundle_uk_UA.properties @@ -1232,6 +1232,7 @@ setting.mutemusic.name = Заглушити музику setting.sfxvol.name = Гучність звукових ефектів setting.mutesound.name = Заглушити звук setting.crashreport.name = Відсилати анонімні звіти про аварійне завершення гри +setting.communityservers.name = Fetch Community Server List setting.savecreate.name = Автоматичне створення збережень setting.steampublichost.name = Загальнодоступність гри setting.playerlimit.name = Обмеження гравців diff --git a/core/assets/bundles/bundle_vi.properties b/core/assets/bundles/bundle_vi.properties index 36fd068564..ed8d789fd6 100644 --- a/core/assets/bundles/bundle_vi.properties +++ b/core/assets/bundles/bundle_vi.properties @@ -1242,6 +1242,7 @@ setting.mutemusic.name = Tắt nhạc setting.sfxvol.name = Âm lượng hiệu ứng âm thanh (SFX) setting.mutesound.name = Tắt âm setting.crashreport.name = Gửi báo cáo sự cố ẩn danh +setting.communityservers.name = Fetch Community Server List setting.savecreate.name = Tự động tạo bản lưu setting.steampublichost.name = Hiển thị trò chơi công khai setting.playerlimit.name = Giới hạn người chơi diff --git a/core/assets/bundles/bundle_zh_CN.properties b/core/assets/bundles/bundle_zh_CN.properties index 6d5eb61361..00bc3d601a 100644 --- a/core/assets/bundles/bundle_zh_CN.properties +++ b/core/assets/bundles/bundle_zh_CN.properties @@ -1234,6 +1234,7 @@ setting.mutemusic.name = 禁用音乐 setting.sfxvol.name = 音效音量 setting.mutesound.name = 禁用音效 setting.crashreport.name = 发送匿名的崩溃报告 +setting.communityservers.name = Fetch Community Server List setting.savecreate.name = 自动创建存档 setting.steampublichost.name = 公共游戏可见性 setting.playerlimit.name = 玩家数量限制 diff --git a/core/assets/bundles/bundle_zh_TW.properties b/core/assets/bundles/bundle_zh_TW.properties index 3ec280bb26..7999cc78a5 100644 --- a/core/assets/bundles/bundle_zh_TW.properties +++ b/core/assets/bundles/bundle_zh_TW.properties @@ -1229,6 +1229,7 @@ setting.mutemusic.name = 靜音 setting.sfxvol.name = 音效音量 setting.mutesound.name = 靜音 setting.crashreport.name = 傳送匿名當機回報 +setting.communityservers.name = Fetch Community Server List setting.savecreate.name = 自動建立存檔 setting.steampublichost.name = Public Game Visibility setting.playerlimit.name = 玩家數限制 From 0e725a844c4e651653fd0c149e49436b37775c2e Mon Sep 17 00:00:00 2001 From: Leo <86385005+Leo-MathGuy@users.noreply.github.com> Date: Wed, 5 Feb 2025 00:12:10 +0500 Subject: [PATCH 147/460] Updated core launch/land sound effects (#10330) --- core/assets/music/coreLaunch.ogg | Bin 187349 -> 213896 bytes core/assets/music/land.ogg | Bin 343048 -> 343172 bytes 2 files changed, 0 insertions(+), 0 deletions(-) diff --git a/core/assets/music/coreLaunch.ogg b/core/assets/music/coreLaunch.ogg index b4a1b55a68864f4b96bfe015ac1709b14552b91c..4dd82b35b8481c1f49b646ed843988a7f2020f35 100644 GIT binary patch literal 213896 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

B({r5!s`spWDK0N5Ty&&$x)U-dH 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 bmVeQ__o*pQ9=@G@HU&xFD04If1~vo$`?M1` delta 184766 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

(AS_ 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

SV$c1KS;{eUsHGiZ-_ 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 JCzNK!3;=XHaI*ja diff --git a/core/assets/music/land.ogg b/core/assets/music/land.ogg index ef81ccc90ace4e528713e651dcacde780ffcc422..d9ea5aa88c6ce4aca3797cf9aea0f527c954ae19 100644 GIT binary patch delta 289283 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∨y)i3%_)7e&$vqc>)paj-!EtQ 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

9+FTk4fp%Le8JR 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

slyHoG@ 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

NHEsW-eod`j60Y*%_{Uoor>E8K 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 z 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­ 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

Q!d_9qs%kkA_k{jl+#5Vg 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 Yqj?WrzI-|OXnl1x^Y@kD%Ti()0l&f%-T(jq delta 289081 zcmZqqDbn#nM9M!sJ(z)s0SazQr`!cGdFTKBF;Pm72gGM&U|`reQLTJq$Q=H92N94o z0|Q6`r0c*oEpy44Tb8fe(3!MyY4(b38~^|R@c+N}|Nl1s|9i-=eYbbCk(6L=z8$|H zn#slh_%nBHX|!_s=DV+te!1BH(nRT6 zmEPX%j~;A|T5EorkzHU)ykB`+eTvGKcSr2cW@~J+Yj?4C{O3RC&W4ddyPv!l-OT1?p=UC0ZH)F&1 zIU8Pt#QkF|Ta}vg=jY-2pReNAZ~kQR+I~&sPuseRd#6v!SMRZ%|9g4!^M6G$d*x&6 z{hYtdmRK&Dy>{!hw`I}ym%T2WZ6~+=cvSXU(LM6}@4x^4`|r1Wen!#h3g6BoZ2SG3 z-|1=dqwnV)FaCNg{`;BfebSZRq?12BJoagusJ)HJ_3z1_udnI|?=9fh_;c^=g(v_1 zt6k1NP%2$pH$Tm^=h;ezOqbZhZr}T^p84memZ-hA zt!s|lUeO=AruOOMx2He9Uil7DiGo~D-7e7n2<-rjHWzihvqi0+G-b~|P3 z3s?UB@AE&_?LU6?)@RE#9es&)>l~9W&0C?ASXT1&RZyf^jk@TZ(2tEa9&=yMI5v68 zyD44wLg%dti)sw{P+zi7kn{fKxxXvajyY*gsjRwjX6fv%??TBZ%T-P7zfZLNdc5@S zf95So@$V+Qe4HDxCu;sZ-ya!lhdAZK*Wasp^J}O5|GCc}KaE&FyYBR_R~0|juJ8I& zW3|`r{?})fyM2w5{_c6RUA=$fG4JB@Rq4id*Dd^_=ASQ2egDsS&FRmNn(G%D-})l! z8@^Fa$p4{h{nhky$#t%~oFZob{3x3Bc*C7af&Y(hycEqb{1dk1^4qTTb>i}Kx$m4x zXIsARb~O8`*L%N39KH7{SFE`w>(AR+?cY8aZ@1gSuq5ied_%wI48OI{xj)#hx0wB( zaew^(muBB?{QdWHd)-sIRKL6&{SJf|;%ewT1#p!cNIKHb*n7;O8oz2|L=MoY{rCLvmZa)pa?!GQq zYoCBjAItsArw^T<`0%80RD>_z^ycKNc1DxS4GU9~XM8pMuq%G5l2>P%ie&gMz4q1a z9e-*q>SF?Ht8x{XmxO({b$dF_3YL1LnRe_b z6uI>0kcy3Pk9gd30X2ZDba=YiH08SnYr~dvUwjhGp?G}t4;hyXe=e|1GWicdtS0AxGJb{rN(-f2TaV)8t|M`PWl5 z{XXU;LEq&Mye}?X9`x#8J@1@W{VOZVzI)Gq`sdQepC9l3`1@(`zpr~|KdSlne1~{d z?Vr-hGexp@rvJV3_vfU)wa<;8=JfyGcmMmw@6(^n^nDjt_wMhF*r`m;oAg|7_LMCA z(VteCU%cUg))DoTldEOyrCzL?yz*fk@3Ltsej4dJ)qniXzjkECZ0)s=w@&f8@S=Wk zZT#EotA5n^99;HDz-?{hmv2w&t&TaR{y8Wi@sw#!();{|y=pznZ=AMXF?*iD)%|ns z-RYZ?ADvuPUCaHyYERj__4A)s%>Aa+UHEoJU;ppT`@hQXHOXHaH@&oTquTdt=dbNG z?Rxji>UibfjJHYKjb!F`D;~N#)9k|Dod;Xh+QaLM?|L)mX~^H4xv-$`!6nJKtxs=C z9!XoM?z*6Un|0mmPDjZV(&>Jl&s}f%R9GthnE%1rb=O|+T5WyT{`2o$|HA%u$j_IWvp#P7{^ixRAGhrL zzVtBf_1E3Y#kse{$;Z##8NWBVdMmyNsjSIznUbmm5@=Gt9Vv$ghw&HtvbF6+jcuzYi?&rc3* ze0{n0+mhY6-*#+YX>#r3J*rz@|Ne6R_x|tm>w1d&`q%&doHOHDMOMM-e;$T$ zyN>VA+b&pH`KIvI;-}GlsXlWqNo~+-s62P*yj1qJU&r^zoeqy?I#eNIk#W!F;)A1s zS+l%EyVa&xo|fF&;`~BW+Wwtw$Fo$>&=OzfY*BX6OmKuCFjJX~xGbzc#I!y;Hem?Q8w#-)m2o{`>cO zSKZ9H^XJ`)i|+qh*|+}i&C_LnpCA92(cPTAX78qX&wt!6{ySfkKTgkW)4Bfe+N`%5 z_1*N2zUr$A4?OA=a+|-*>)-KhCp#DK=9+!pu4=8@=Kp5(dGk!K1sg5nJoEO`kHtHp z`KPhxo<8ODZ?$J-=GvDrb0%#2ZCMr`XeJsUvdh-V`qn?6*nQi| zHfhi287bc?U4-|3Hx)?SyXooA#|z_k#;v&+?0;6HWG; z#0RdX+minyl{PJ@f8u@plEAMYTjD=8=jjROI_sNRui=nxop!BlrNz~=CFxO9&lG-? zzBFh1rYnrM>-W!}e?OG#>A%0{b;?c~-TSv(MSGXvrt6WXUmdL8v)^TNYyMluS5ZF- z#Y@eqgr=7V9drDbe0o9sYwm?JJ=boyd487Om8YA2oL-oA=0QsBET4rASI+A`o%!Y8 z)#WwkpNB-H&9#1&7a?JC{aC}Vo9p(?Esok&x2>*U_Sp8d=C`#U@2+3-?~}XH zaa#z|dN8l??d6BM z7waEB)nFF*kvxUJ!JDy*O+mDQLxJf-f=7^7=t>?2hJ=C(e@k_~&Dxlv{nSMF{mUug zYnbJZtT?1+7{vQZYtEm7nrF$9FE(%b`fJ;@0~Zx1Rz7tK`?Xg>YD=Bv{7Yu3|F`?S zZm$T~mV4Ul;chGa^11RR>F4f7t}xBuL_3ke>}wVo!{ocO|K@#@(q1q7=g-7{hDy1>&><0HM7I7wCe4i_2c*3-1K^{%Bi6Y^SopaYUk=QGpxTb*Y5H!7Pbfd z8&BAOzgoR|f6CjlxhAu&vhJL3lF)12Q}aNoN8VrO@yiWy-x;RQF@Ma)+-%^mfQ^~K zfPvNE2ZKTnKZ6FtPUaGZ^32$%%t@yh7#38{NuAoh<6lOh#)(;Po?kjU`C4+){mnT> zcO^Q1)QexyV?CIzX4AtrZSnm*` zV@oyfaQMILW(wc&{`C0jn+LK#&AzkuXztV#ZCCG@UtId)`MbY)>#M6R_}#fWeLfcS zy8SFa^JS~-YHu^|Q2X=C%&UzrP2b7h!^P*Mzntyc8k6$O`iDI^md|@xd%HgCt}gRW z)^s|OE3|P5r{VIe-?k=txplt%{@=v9*^{qz3YW9J?l1nc3w)<`F!DGh+jho_Om$+P z>Jc%&<^21{^X@<9``*7Tbx-`0>0v+bB>K(!^yc8w`zQU+ckDk=V^X@Gzx?+ui^cU9 z7Qf$rH>OYhwSUPkU&%l9tju5KE>|ph*tnpn_pRpS%|CsAe4O@vehjZ(+_p8~$+d_1a+OQwT%OE+U;eXQNpCpg zUCVD*e>KfqP;Q%3Kl}YB zcjd!+GRI}DTg-|q{-p&~ZM?VVWn`s;$?C$>St_w|3?vP5t$ zW}4uo%la*6r`L?5YHr6~J9GRCg%;!kRVsK#8 zV3^CqX2+27TJxOV+NjeE3*1t39LHc>0g6w0J##%^a6c z+bh4wAC-Dur+#OBxtFS|S;_5n_rF(^SgV|Pz2nitHD~1Cn?Juhzv7I61%&Tr=Pbre5SznCVZ9K-YXBMMl4t&9xK)^o$Sqb-@1IxF78t{ z?Z3DBO?t3k+LX)+DKqJAL21WrQ~TE`UplwO(13%@wc_Hm34QbC7ZrY=s#m~WSzR>6 z>2K`f-;aEQu1yJ^FSPbf8^f#lq4qD*^DA^cLf>q9(wwlb{&c#2+`NGP^#|VZ_U~I4 zy}qvSPF4G-o$>cfGTWw<`Tw^PePys!l*8|uf5D%*RNc8yHJipAu>orX7$M~vDbmX4w{VuKUp{i|# z+~Z>#SfZ{v5%ZZ)Pl2%{+TzO7Nra@3t0(&)T}-`=zXVy*B*y#U9DB z9~0c(9b)VknIHrnJYsOrM~n$EGcYiGogwg4^8bIo|NjI3|9AfX|371Va(e3aZU6uO z`Tsvcj@$OA@fRkBwE5zneb%!%oSANXeyja-!EdYg-Iy4C?%ap!v;(&!{+2Ac*ueJ9 zXUogH_1p)7%+h{eOX$D5pq^{jgP>f-J=ZR|=5a7HOyJhzVQ^r4!8+k?RX};@N+t$| zmP;9n9{-(Gb|I;)P)*Hhr^m0WM-l?^&I&Az5880!-x>+0^`6IGHGO?_NZ9;do6uHO zv2F3q|5>(Ol}fp~Cv@|gQ!f8*o&LL)f4ksa>#tkCiC?qx+W*Tf_2XaFlk)w`>)$)R zTAUH1(7Eku#bUpA)^eRU=DNP(IW7J$x8R*lkF(l$ZyEasE_ZeR9{m!0{ie^{Zx_zo zZ~d`d<4mcbuAS+U@9*a9O%L4sB<6Wg&yu2~)YeHqB(EfGX_jLwEf&B3=!(^Iq(fNIG}VYmJ)YreHSTzJXc`bX8DcjoVSv!eg}>lpjGZ|7>}IlpWE z9Psaa;N*Rhf2Ta3RaEqM+t%oRmi@(bqUIuV^ybIP&j0w?EVt^){1^4b>h)!})@oh1 zSR4QC)}mSO{=N-K{<}VFZI$M~zBvEl_xra`*N95plTsR!AOE-R^zNGPto0j84}D&) zfA{Jk^PQ^B_0Ha>^5;E#{aJ;1(=A`> z{ycxVYU1zq({=C9)`b`w@3-2>_O`sP`n`(jX3;8No5MAmrTLVUy*fGS7Sxt=-_Ny6 zie!3ZUH9a5?WNr_&F`mo-i)YSuDaz~$;CC!9Eok2_d3t{l-!W3|HSHWkGplzv^{&L zoHcBU6IPVp~`85{D~9PjuQwRnB$F6XlEIcpq`98TKw<_7QI zEs6I{=XSVxU(FS%Q@Jt2Fs7!)!)(S=x5q{dTv-wg+!728j0_qK%}fp#8Lb?)$vW)v zeyPRE$#5XLqJ}@NbVkOL9raxjd+#mhw(og<@L{^rU6a)%@~%fpj_Mg#?<@T6)%)d? z?#()-FaEpk*6#F)zo&lqbpH9zeWhydpG}0fhUHbylaPP)EbAIiRSBj2{+W53eceBk@Fdwi z6?=1KDp$+I_dGursK4}0O6>P?rNwKvUGn@E{c!!_or?Nt_cMJHS*}=H>e_K%=<@t< z-l9i(f6>G4d6)bd4j4E*KCnGFUE&=3b_d&fnV7kA?Ik{b^8fUE|MQRXax-4Me=_g) z<3!f`Rei;?KPRWhb{N*G{mQZZv}lI?jDn*H4bkK5Swps|L;BjoeHA=<|G#VP*V&;UI`_UXbB?}6RHoIf)6?~IDi?3KEY$z0Pcb!EsZi#RcJAE@ zZM8{Hru4nbSAVgl_~)!mamEwA-<#mMua$%EI9qFbiV7vVC1^auaSk{}^e$PCbvNpHm?DlJI z#~Dty`6nDR?B4tEN7M1?_0~4lFIW>a73WQ7n;Tg3;H8$xgUi_m0vH@v0vN0uzOfx> z-nwcPsEIW*D)3>?+ij|h|AY=_{k`vdJo5fKr}l*_q*;8=6m1b)WEOo=A$GA-#)D6% zPp=BwaqyYU%(d=`_d5R8A9{4fuQ=5IZXjbw=eKX`h3_p>Qn7jbdxnJA=fD>w-}m;# zcw6kd#kJ&VWMjg*1J7o^^gng%mHQucU-z7*lnav06782{Q=UvrKKNrMWAd|!XASk; zHf0^pHN2$r*+b9XlGSp-loWfd?`&U!b8;4!*9lL)E!A=|MQY#f%L$)?+#c6IE)7&S zd3Lto&rao;w|`ss*Su0+K3A7{`ZoP_#XrCI)Y+}Ndgb>;`G2;**R6k*nbXL=ySgF9 zX4d-4PyKhV)vxpV_1FCJU&q&H>z21~co*~f$6_n>*x7$mZw1#Jia)sh`KOxgRl%)4 zihl2&Q6Iak!1n0VX8HBO_URL>O1AgUHI}bGfAgQWOZMEO@=RWl|MvV{`$hHtRco#H zojvN+`9JNRzgk@R+(*Fqz3IEif8VwEUT#*3JYNvDrDsp|OBRLSKYN3pNp86DInH)c zQD2$$iW~{4M0m|98v3|2NK^YyAIpgl*d9`;Uxm z_xDQMe!e$5^~ut!RnK16O0sVf-`J=3&3eu0$Mbh?o3o=w#JWDr{oHcl$Axxh&wjG= zvcJsxc~Ae}t8;F=KP|C#hVj~tiNB<(b0h`r{Nmr9s5Y4OPf|I&+GWzi{)d~+RXxAA zbItV=rz2{gERCQ4_?y)A1L^CJ?dmy`SNZm}3}?=oy*$%*RI{FK{B`Db)VFupadAdX zckhNzKO7Z(-tELgqkc6rE}nXZKO5$MR+EVP9C5KwpG}WT!%9AbK}s)!L8^gI!8SmZ zk-_87EseHgcO7ki9ldvU`?{dx?fcSKweGz2neVOlE%rS}{U+U)7yrL@alz%-sYUzv zvTM~A{C_KC^jGK3l~$RIgonO$^6R5-%axh#Hq_sA`DwD^_8lwioNl}CIr@KnLjBVA z>f?W3|0uD&YLNEkOlj>b|1Q&g!QN$8U7`ZF7w%*YdN}XMneApv=3ZVG9X#iH-}mD1 zWKYA}HgmtV(`eXJMRwp6wC(KqRrAJuzXbhzh9OHcm% z|DD|JlOIeg9z<^x=f5ex;pQD9J-+n$Rx{UsH2nFy@~Ekp;-_WdTLXS4Ja1dV@b1IY zkA`W>%OC5%o4ZN1$b{+7PUWZs8EyVPZOhn-{H=!b=S+|ikKPUgH z+4ahL&nxAxwGXGSPfzCCU$u9;%=$k)>GQ0sCW+SQznhWyXmNafPH6D_MD_hgQci9; zUw(Q+{2jY>s?u{8SUbZ;$6NnZ8d_2f52W-q`6kpc=cIiWHuzqZFi~^r z{uv?ViKjMd*O^GOi9Kd)WuC*5aiMw=PiFa+T-~#uzh3Auk@~&&OXeI7tf!}8KU;g_fe$L|c^$Sl&-}?V|%Zj(R@2*YCdd-~Ub(5{-4EyOz89zK{ z)U0j&cH`>yUsH~9=qE-yJa0?>(6Yj-ZSSU4LaSFzdvCw+na|ZJAAic`eH4kgws-J9>9h{{2qX_1&iKn9Dt;DQ0))ZFx6s{Tewn zk@~E8E9P$b=ehb(g=z9}jvq`XZSKj&a9y-$d%T$KdqeHikIN;aqq^Da&)<2%YE`i3 z;Cbnc`~N(c7ssU*XT?1Iaqr%A+tdHzLX!@+e<}XkyYH<>-oA^^e|_(@DQBGGc9nI- z8Q#-DD}Qp{dDQ=Mhv@Iq-VEaW4u*#eujo`?-1hkW*ZM1mcWvL3!`6H(<%s)Lhix@` z=Eca(D7(Ktv~~8e-?p96tJS~VU+*AxulzI5cA5S6FQ%U9zjr(9-TQ0lbrltNHia-O z37W6xQ0{B-MYHt(nZ5Bd=Px+=+5T*;tbXB+_@j0f`?sCn|NYwIZPERkV(jhZ=O_Q) zbL!gj8FTNQ`cwGy<+S>pvm*C=*|+>-Y4DraAFp2j*!AkW-P^kU9pA6oXYbXS-CAZC9q2aHiGO^{Yh~oS|KFd$^<^8@zNkLG*(Cne7R&1fns>Fkzn-%< z`kqn$D>1w9tHaU?*2~9bXD<;h|9D`NX%@@O;2Ce&wD+IC#p@ z>>Kx8YblNWf9*^&K$8_-#X%#Y*KrdzFx;``qu0B z4mSrV+Or2MzjRz2axzvVTx!+UA4k09Px{xdzI!-Crb+!O|w|~Fzt9`4Gei>^T zzu403z`Tyew*c%=_I={eyS0hH?;86yK3YG`=7?wnEFfh2Bs(+~1x@pHei@Q_z+D=QZ z61AOo!+ocVeaMYX)(@voQoX%K zL00Skx*PUQ$GCOp-JCL^?oZua*C!vv*4?l-Pxu?BQfCoyckP6oAM95oZ>`@FeCGb~ z`gPhLe;lY-UD$uPaOSmyxuFd=k~f!ku8(uBkvo;zKyq&o4@_h zhug|EjR}itcmt+xee*Qy>-*jIB~zDQul%`W&yowj--%2x5`TZ^-pg65nB&sD`sVF_ z|9bU|`*-=R`#(n>{C+>={)4)6U*CPweciWLo%{ZSGuK_tOqjL%BL8Dm_ZM@+lDp*DO%sJz(4zl-#g9tHg=?&&|C zp~kbEllOa`pjFa;nX}C98xEWk_dTy~C0T2r$7=9{(SiAb<5>ogdI!0NL#+!L8u$!$ zFz6}nC~cm)>XZrt!<8=&exBQBmnk2A@~+s-vs|~&@4Yok+h_aY(*617Z?|7N&vbu% z`h%F_nRa{2XC18jlNdg+c8%aB^);*X*fpbnYzmvc;r+VG+$@QYy8q)>zuEt9(x3c- zXHHY@`M!C5*@S6g^%_e}OAg=7^^e!+{5jBfM`%35j z3bSQWKD802y{hcHXa2Z;^=8qk9*1MyPnevZu3Trxe=>4S`@+3C25LX2#?DLoeOvJU z*(bK4cB{{YZa9i&dRe@b6nkN1yE&%VCC?wq^L$>ToTQ`Y}YHhpUHZ<6%8)9)&t zD971fF88h$dG|Q|<^HSj=fby_y-)x9rrmORo!Y*limg|L9^ZFxIM(u|DkSGLkDzV( zH}|{$vTvs=Z+;N?<=VFkUcqOd*)G3VsrB#diOoj!$M%#xIjBA9qu>8^eZQw#{QCW} z=}E{8&gY?5KW6bU^;Ohfe|GgZ)7*RU>(9 z%V%cojQG6ziB5i9^`BHN!%uvd-;~0@$p9IBYH(rz1JH^j76t|eRny;AQvd(|XG={> zOG(+VX?bd9+S=6{{{MfqYSoJ5ZPT>&9;ptBUcg|tbn}kmYgjoSn9eyGQC(B@KjrJ} z8Q)*}|NnRUz5d1f|38(t_T<~&d9$@T{_w6hSGS+s+*l`5@0UE~zJBkYf7_HS?oE5P zxB9~G-`3{?7kgGOTA0~${%P19*w&XDH{HK=+LE8&{qsHL^6f>( zZNL7Dyq-LHeZ=>j-)q-Z)qj1xZPW1|Ew*m&YyU*px))zoGhKCYw_#k^u|b2*q-tTL>a7~|iPCcW6!`siiJ)d^)Go(v0Z2i5E^~Sv2m1%5GE-Xx7&@e4& zkST05Nm=Q|#PFb@Huk3Et)CHZZ-`Z|Hkp)G_1tj6wWAleOP{~>E$&<2J%pBw6);{~6=XJEc?3{d@bzse9FJo2J)hS{{A7$Nctn z8-)|szst9kYn`{Re^QptJ((@F`QH-z_($%AZ)$hnc@kvQ@3VGgOPk*F=67o~k7Qfq z_-p0;-#y{FSwV#yU&KF)C;!vfdM7^oQgC}>z3fl3{q~L3`qHcSh#Oi=ID33I-{PG| zIwf`bY(9OD*d}$YhC|=4{lEKk-DR%#?sPW4U4G-oa`DsJirZcN!}nc{xgoVhq3!K< z`}IjH?vzfB*zuH|@#UjtznG#O{=dI}|HdII{k1RTz?8>gKE>rmtdmz59u5Ay_GV{X zwL+g?bM(J@{dB|6qIa!+G?&PE`2Rh5{r;KTx6SXG*Rovw?pZo%;=&7OYc2R)erRUS zeR6wRj;n&O)t%2ZNk6pf&+rlJMPI#jPcusa&srd_Ml4L(lPPdlt&y z+n>a@#y#f7gS4k#&IvA2oyvG-yUvZxp|dXq?ftF3wr26Izs-x{&rQ5``F)|c^4_^N zEO*YXlGHBSWWu;2L7ZVr((TES7vA<4-8rwef1{et--O^T;eS3yFtc(SG)i+ZPc=)r zwYXy1&R=rpRdnO_zb$ok{ePok@nut?J!#9^r4v88AIn{Fc`nzEv;5BO%VzxB`EM8Rl&I|u zf>I4NTR-g7JN@!(%8ApjG%CWCqVwAxy?p=a zfBX8k{=UI>&$`(Ey}w>|;pv6%`&KT?KRfgBpKyjHLG_n;IYQ$t&Mup3V|=aj|Kl9( zx>?^3^Bf9h5br5yP!49*EqGt+d+Piju7l5_)?D81Z#Q@L`QFLq*8Ta@b~Jnpe|-1o zzt!jWFMpf&T`>O4wbgf2b$|BO?%(xO=)P*c?&mdo=d!QKIy~ER@2^9O&PyxxRSQFc z{DNc7rfUkz%W3QouXhS&DB-#+YRPe;ruh4fcRSrp&Fy`*nD2cV9JNtX?*Bwf(ZpXC z|GsShcm1l}{a<{ajr3=(VLRT~<- z_DKmp-zV3fc|_v<#O73S_JQ`7kph+-nh`Bmi4VQ>&u>5GvX%cTi2K_&HtMG z&0$%{f~&=MA{N`{%;?=@|C0Ob1ZmsHm1|c&;os(SJ5_y|>dqn`?R#8{r`>+^wWa>M z%Nw4en8%Ors#=@5h?mb}wDEczxAE7M`jcM{EsM*af8hNhgV6tXUZq#dEc*4{(=Yi| zPyN5DH&?sPZ<09v@5lG`|H~vdAK(1$PhFJVw%huV-!G=PNgm&uHs88_-tPPN=0E*1 ze?8xP@07%)Tjh6uT*%~PnUmd+V_L1H`RKqkmf6zM{xgkLFDZXWXD*&@+bE-aU#?pu zsqpl|`XK+!zkEG=-sYdw+S!>T)ya17*`cFT&KJc>{|fthHhrVn*XQE?t9RZ1_s%-t zNLaqSpB=aSoJx%^f0!TT@jQ;VKU-^eUvKMU)${Ulk$dW_?$%3Pms^}0du)5P$nhOD zb@S$bzg+q4&HU4n*+u`29%a@(D!sjVuiJkAYm<2Y|Hxsi=lT10ZR-K4U)SrK{ylqH zZ7|_pJ-2tbu2UFG^{>Nv-b?kCPVqft8Euq$VYlbOgBe;TIXd5puI0pTy8Y$BRrT|s z-{tQ#J^M9(|GKBT`Okm-Eeugz#Z;pAb8<*QVf)!cuZ7RlJBn=s7HZ`kd;a}~K}mc6 zadr(pfvj_C+ijmId|*|NQUCcWfp8-#ZWczSaoUoA+zw&lg`7#?($^ zTD~QA|7Y{sRYxsesCnxif3eK{|JC!B40GJh&b_7jod5fU`C-MAUre!Iqy6t#ZA)9x z$C!qfPM1v>_nw>a=@i52r8{bzU&eZb7X=?_cjer@cI$uBqW^tg(>wR=%Z{v%o0Dq# z!TaCRv%Bl>N8WFDxw$h^GyD7NdGU9T{}Y=kzIWDA28JnCS6i2H>RI?`n%!;Kc!vFX z_{Y_v>1q3pGVNL@%5&c;{g>?5B!A0S=>-=0!YkM07)acE)}8u#-_h>%&(81j`yH7h zZ)@Lma5B64zwhThmkRy0t-Jq0{*l}K>3a1=kF+-~wZCHA_*%Bb@A!1Rdz&RJl3suP z#`9{Pcwe0OzJBwb>goOKU;Xy4uXfq8>|>4Y-w%@gr++^Gd}r3ae{$Jnd(wN(pWlA> z$;N(Dx%J6vzh#zZu9H6&{?|_M`&RDnY)hC9zvE9^Z`Jrb|7ri({roTMS3kMC^qH|( zcj~OWXXn&kyq~-K^36Sd&yQ{idQ~kd_df83@1`pgxp~fbW#5&PG_6uTY~uLaIsf1^ zp?jUB%A79)^zRhvzujuz6O_NdAwJe3`1RL9#!s$Eu~#3>-_3B&rQD-?0=e_pBg`>taeMET|xc3>2KQfUOcXQ`Mpp( z;o)XSv#4KLQ8|A3pAz1M2=dK69m{V0+FC&Ot=I#PhyUKPtc}r^%X=ZNnZ0@Af*DC4 z1+*`|+{J4n8?@$(vC^IWkEVYNno*heYevymrSw0qp9)0U+1O2B5b}xo&HkcVZid_X z>9z^q5AFI_SnGRyhpqMB-}M%HuW#@8Kcjwk-1m-;+hv~1U$3q?TUBh?|M&gPiM9LA zr9C(QWM^%*{MV0vlip+>wdlX7pUASeR{DDJ_qu_7EM}D@(+W zJ-y6$*%{siy!A8X z{<`YTeirt2#lf=pzkBaVZZfy%EN3v{ioI*Qh85JP{Nqu@#2K8m$3DL7==(w|`&0E* zwdb$?`*D2B?}z{5yZbL%J-??e|WHe_Q-n zJuvuZW_-4G@22A3-%;z{D{VZ-HcM7mP5o~D(}>2Yk2i#0i21ekyWHJ^GZ%LqPk6J{ zc+bd%*2P>e|K!paF0c1x>h(Hbx1Q^#UZ>_H&wc+yYV*;p{I*}_B-h65KA6Sx z;cBb)%qQAh>$*R8E!;TWRzh+~t9J1P_CNMq2Brq!$-wYu zzhj(7Y(%|%$^7z{rv7uh4D-*%pPzs5;-OSiIZI=SA68n=?6q@>>K-@tPSM|1yYfxQ zjIWRESIkkk-yId?BDmMJ=&SOF<{7o>{~b5IU;8+kaeuGn&40FXODkvn%vX$G_GNvO z!TeTZ=N;=GhPhw+DfQZ0J~g^nw$kZa29J6jZF{Z{z3_J7>V=QEC$?cXOH zeJ$QA)Ffs5l~<20-k7&}``_Z;ok6SCExT#9qtkWm=6lutQs>&Hcup}r+3fD8{K;{_ zq+M@3wA~*oUo~2xadnAj-m31icZ~P#b=i=)|K9$mGyWgzy;>7{*jVoI$FCvGzw7hw zcNcH&*ndxY1xG~xjO_icZ+@LT#=428aPPeQ|8Fv-r{7dY<0pSk zwJ=kjI{kF{XPNkzqkG>Uzy4b2$n)}Nf9@IZm|S@LIcCX;>b)U}>+SR32K{c7J85Ej z_^PpaMX~8o3qSF-e3zB`?B~B^dDh=9{a|{OUVX^Cf2<5s(!S4MFfae&vfx)w7hZh7 z(%vef{`t}RuOE|FoATK$>o4E>I`&HVvG!&0#eZea{@GEwbIYllbry18WwWd7=bwLm z&-Ag0-_O&fDv$qt{-gi>cZS}od;9+X`+a+Dxk%pn1M8gD=W+|~wcLMW&#B^|V{bBd zE!6QcxVGo(61(~{&vKpi+t>28KYRLrSM_q`N7B8|zZ^PusBKSH{f&34{@(37^*w1} z*-ihnG#Oc0S;ii({{0W41bx=u=s(MGde(+NzZm9R&nc7FDr7-`6u0f*H?HYCI8&y^ODMIH-9!Tv3*hhTw+B?0?V3q zA*1=Tm|FiVKT}ux>qnJ&xt-7QI*VP=D!b>r`yRJ@?b@B21E%m*NBcjRKaqXmwjCvZ zQ&#@}nVoOE^SS(aqcQ`Ln9KH$3$7h0)G7VB>;J5$@*E5dId;$YFVHVa?Acp)NA*!h z4IzjU3xE*EPp(b{oH5Hw%=)XWqfNd?^2mJWu3$NqZ><|Om~`3VOV)jd7*9h z?8`sTDyVM!8nx#5mmB{ceDyfveegp0hnMPl7fZhxoj!W}u+=Y8C-ea`eWhBmu3QejQc`+C8yj< z>t3_lHha@-?k5Uqm-!dHuak;jdRPDJ<_Aaru7CVKo8|fE=Q^=b^J*_0DU=Ua^?A0_ z{+a8%-_{K~XK!Jsamqi>Q+JO2@P;W>_Z;^H^%Yp%U;{@8y!TIO^A>A*jB)BbIk{n`8R+Iin^?o0oF{AK&Ao$0^x?q0i;^85Y1 z9ml@j`Fm+!hJZoPU4F|yD+7P6cl=@TX7BTL=ANgX1c}DJo9YvF*k{)n_O~;SyJWGh zy>)nkBaq`^U$*X>D9Nls1Kyk~XNk|=xs z3Gb2;=DnQrFXNGoGUwy}zg}&g@Amcj-;F(gga7`Vx9{Jq{|0r{HTAV(k=C!D8=m_0 zJL3HIqUzc?_0r!j7k~M8Vr#Lj{PU_i%Z(rJ{I=;jU)a0vb)VT8kGD-+q@wg`p2H-! zZ}-F3Xn)OE`10;!iqf=x z&Db4(qom7cET)Df~-xqIwytF?03isRBjB~u?_g9LgZ!w(e*KfbT?ry;0|F@s7 zlzA@xePzt|^7(6Px1IX4#$WFF`sUZ-^Y7hbpFaJa&33= z7_L7qUYc3=vZi@%%B^XW{!UWb&Gpl6rA`0tkgfv7B|?A7?_aug&6|DsWi6@qf?w6w zDumaUe+&L~@cPNOr~ZCFXuWY?-k+D5=RfWDl-$F(#wz}v!yC)QLax1gy`Suso6)CT zXFq4&u`jySf$tXmJYE&}Ci~-k`#E{f*YEiM@w&HtU+n$G-|znV^`UzIz3AUFp7QVB z`abgC*E>H=XV>0M|Gn>X-Fg3?-}B}E? zR~S3ZNZ$Bo?89|`7w^4rt+PGs(Y#N>;vLDOiMdGhme)lHMLQPbo7>-XRLp8waPw<7o5<1epo?>LiwW%=HE+4tGCeb-W7Z^|pI z`}^=l@=4j0-#@GUC-e)OAFHV?d)<@>)^-9BGhLcD95iD2r&cdmMe9IX1z{q?HeyK?Q`@89Eh)L(s7 zt1#`P=$xSU^NUu6a|OTon#`Cc`m`+J)!)-EU2jzXugQ(-dz-!fxcuh_9|NCf|IM|@ zTO9Z1d9-2K&z~08%q=6oZ8+zjfB5`9slC$EA4({0*5AM7_}emL9*+&N2cFL}_h?w6 z-~4G^((^E{=I5-N_>x*1Yc1U;*S8nE56=*(-;=7jf?f9P`^CFWR=VF`n73hr!^eB? zr+1~^o^CZGt?AdL8DBC!99pzPTPT}9cmBaoh1+H_9`Tw#f6u0So-Dfl>!;5)`76MA z`q#pp%dWouD|w}}rT*vtU+;_cW`-;|k= zAus+ctzz*v&#KHTXAekz&+&}?Qol?#=Z5CR#m6qpw=$n_?E8G(`l+&;cl~gX&H0}; zTXgpy79Fq8@n%o?n+ipLe_^WmKILr0{~3iH1;zWXZCC<;BVGuHW8T%wz8L=j!paWA=X6 z|J7%)$m{Cu<9lhnj8$y;l=;!Wye(=zY!1kn{amj0bg75H)|gv&%q;BlRUXtmk-E0` z{0%R+RaZ*=Ufg;8x8=R+YwoV~z0M3zgE7yPsHVYcJJ>Gjt8b)`E>b=z{_{x~+XR=ls8&yZRe*Dh#f59@U&-cUf76b;)G*S9|LIw0Pz#-CbsI!DX4(7R zj|@k$;_XVR%My=VtA76HZylu428TQvdaZ%Qw%r0S^{E{J!|)lzppK%=~(?eM-G!&3>hi z2`4{9`zlL+-dp?e&#cn(|F1X2KP%jKu3!ekp1An9Ghy?2rfG`quD@tmZD(-Rzsxr8 zS497>@a*$?*~J^re=pR0eqLYXulE0%J8AZNqu)Kfo&5Cr>&xv$Yuc|rjyly7F7y8J zvZ=N*-y{4Un;6*C2h3b^zU%dont+G1{OS#iDwCgPIR?({OsSNpufN;P8}ird{#}ux zCpXhSTE&^9N54BdagNBNkJn#J$aypUZ^SZpdGGaCxApV;{=ISI>HMdK-*$ibJN>+N z6x)`#eEtCOyvT_CN%gV~+T53m^X<>Bb6x+x#OnI@`Nw{BMT<>dpS@9k^5x~%9-lY7 z=Qn@(-}-Micg6V4Uw-;>|KlRb`P=u{=q0Dzm%F{(u=4Nc^Xc|+6F+txUw>UuDUR=~ z+krK20!@A?rv235waj{z^lIXR_;uftBl7kno!R~5RPSGbJy*H|e{3;Rjdi{vZH2)%l=>bSkblqZK_4}8o#2oI^SkHzgRRcZ&!3(WIf}WsQG!jRdjhT}tyZ{I=px%k;-P1ft8OFS;HLV!AK7e){a~rt`L~J@;Tk zZT-t>DeEmgmIURO2Z)z$)Cu3JpYO0H*x>KK`t$YEf8X8p<|Oz0qYqc^@W1}>?^gT% z_4PLI|MuIPU3;3l=kKrAx1WBywEgtUJ8M1dzTd01eP8SPy`v+0VX4KJf8RG>{#RqB zUH&=l+02GT1y{|)Zrfh<&h?r1b448EQsL>^^)oBPw_DbvOf`0P^q=i+UZt`1>uqsu z_qh6_M^{Y0%Q&n4isqTG%bxTmX1{;BMU!DlRDXKb>zm?y z`>JZ|HU-T&+O>J(n~H+0u$#o4zxfuIpyTCI@t??&D0>j+jpMc z?{2GCf4%Zg;7GxHLvbu-_@$Ljo;pcthxT?_Sx5c z=J9&`fByWjdUUVd`~Aa9FE*$)sD3TDJTJ-r)W6riUcZ^F)46l%^vFZvK_%StPi8v` z?bkK25p{eorkq;5V^@B7;PTV8r=A=CJG%eF&D*}St{7!9eKtL|%sHob@lC6X>hGAp zXg?E}USEInc-=hjj7$Z_C3bJSQ?D%&nyF_l#aq6WLtcK)vii(l>(`4MGuGJ~ePEFS zml2!Zm2`^}Q}cscwg-K@-FZ=@WTWw3_MPc>guAu-^Sgii?W+Fr;QIRQpSR|?&NF|% z`~J>9GH1{DFEd^jcy{~zFAKUhGHwa`&1)epzx(HuUF|ku^&bv>?Yb_W{eGj#r78wK z`B+D`4OP3D8@2cUzS7^lXEnd(zBvyy^WN#5J|}!V^pVI%lS%nC=QQN@|9X7I?)=BL z&(hCs3x|FG*uGz$<6Xn=<h=8p z{rP(=x`yd~S(J^+>tCABR=-}YcwzGW`7$RiXICwYTU6T9@X%|+k$i559u zqxLsElX`QMxxmqawL!Mx`y}2;K_-01jZZ}0xy?~qwqE_^d*;JgA@7{O-OQETE52CP zK1=T3y!XeK%Y3u?b^ZCBVw*o--k14*dc3^6KAq>d9mAZU^Z66vjS{t{#=XnxE*9Y{ z{T*K8w|Og{ef_PE)qD5M7Cs#&&PRL7`qh{OQ zK5?CEztyMuqvzh}2wFwGNLuiePh2?p@V)JBKX;T=Z>?5|wQ}67_t4$ped)vPcQe#> z&WvmR^|QeCW^w+5pAKxCOZ>iz3$$xYGn;YlMG0eZ>EXmz$M;rVkFZ{TZ?0VZ>0ck) zzDu6< z{+CtP+@m-0HWW2_rr)hId6{zf-zzEiy~??E;dRef-8nFiZ+ZNii*fYD?R_~@wL;>Z?Ai~_C%?8rQG_*GtTB!ean;8uYGf8{hy2f4C_AJ-;{htf^FK# zWlw@@y;ga%dRoumG1 z;Y+i-arc#V)^4A1U2K=vy(I#RCj@=D_rG*q?cQ7LduLB!h>1FB+_BoAdfw%%ibvPh zM_O!O`Q!a=WBmjhhGpEYi9dF24CKC1RCHBs_TBDyvvxBvbAweFd7{aN)P^Xzu65`~O1FvKE88Q2&Y7>b@h z4vyJPkG)vGqFS+jLhYSP+`TeoGVrDUdTShsS+nW)e0(Q#JwJ7Qjj>=k~=_MhW; z{GZ%?Z^8A)*K?ZAgh8~TPW6)|kdi@)c%*X!UGt-ZF5J1?{( z|8-w_?cnhj+V^MexwU@c^v#cA-u#?DpYQiuquKwzYUeG#_BW>g>$Y#NH>xkc{bKL? z&->S0`@a3#&-OYqy3~EsAsf{d90tJF>{y7 ztHT~~;U|3LHzk+%=y|X2+c<5ZRq@}V);-q?)NOBV%>TA0ZkDzf_jKuA<>!khw8!&L z*?c{4iu^PA$s9(EdxGNMDU=y*h)CHs+win?+v7i9@9v!U{#`tK+vUHj{@s4R{oSd$ zx1T26eRcVG<@tXPKi7xIZ@&I<#q)m)zrN`IYr3rP*7s|(w$)7af4pU%(W5Ienoi8< zm$P|x&XSIEa|<^)u6yU}ReDL^ZlS!P`o7lB*>QW$*(lDz-4~Pe zDY(tKr0D(okh<=imfqRd{xCkX6uQ62$l>DtO?Lk(_U8SPkFU40x!&LZTt55Puh;qO zkBdI9wfSE6?$_~WHSdn=?W*g$H#_eU=WcnFnf!gn z_qrF_pQeldt#_Q}nez4h-^#jWch^~~%`XpM!!jr6zP>|@<&0G?M1JpJE_6u@the%1 zOzQcW9(T_^{@2f{HS*`HW2BEBul=`2e(m+`_tPGG*Thz>t2i!o`Si!)?^}Pr><{~{ z{#$JNsrvJ$tIKwX|Gjc^&yre$13!*$w%1dx@%eu?Z?(zmdh-go(2y9P#WR1sTlGSZ z{o~4M-%o`7tLJWORjS@Izb|~=)%G{K{%nuKFJ1du`uI-Z_m6!m&F&^YP5$;yuW;St z(^C(Z9eCU9yeBQ*&N2S5L2uCW`89vHnX111a`pd*t$)LO@7Jd-7H!Y|^X-KD?c@B{ z{qvX0-m9znRr4~u*355rp3U<0+oP3#*MBW2T!nn?@yO*txvk-;#f3qr|@h0gN`p9e<@mixPL4tN7K4P zyoygQ)-LMTGlTmQdMl3otN$9iUaw^4j(^)Wt#7D0Gvg*`EdG2#-m6D_o3HnaPu+2< zW#hlH7k{t3`~GkJc8hrHyR-g&v9haQAA2^n{_j)!sPCcu7r*oGxBdRY@bAaTFO+9@ zTz;%OEB4!)%5tlpy{4KDq`uq9~zJB9gIuLQ46%g?WQmTzrv&HwuM*&CnN&E98M-xnEp{^4t`-)sG! z8{gX=_RntL-x=B4AAOv2<@(>6eRKC8`m*!-sroOOOSW%3UXjCV{i6Nr_V(`Y%*{I; zq+4z!>fL|*{8~=2eNla_@?zh1tIY)xNrI-Ar(Zj9@=Dfu3C&%v*Is(A7agF(^wf## z@$0$IeDB`3x2TLY-g86t<;~kSLO#w``ogc6vG1tG{M#ij5|>{-E?VNYoxNkXo=*7k z-~KOl|2|amy8hL-+pm8li>%Fj9bs3SUHi4}-`_p)r@tEVSJ~~#_-pt|>HE=_FZX`0 zS!27;=$=x&_3P}P*Lr@uxoMnNdHe5q`>`F@yL7D=G0bt2Ki{xi<J*YQ|?*5k}E$AS+ZC0}~7)tKq~E6iVf z(ZduZLIjr|&I|FO1t- z|GMVZ?=N3pSnDhgy?5;0`On|wcDmX0T|D2H{9Pii)^+o-^LM8mbo!uiYo@Ba$klD7 zyq8R$&b|5f;=Rd^YyQSf`F}xXFL z1EXhhxAB}Yd)aNNu93%UKBsS$_8F=3?>|h)31OI1pC+&GV3T_2hE?sZ%aP)@gu=dl z|ETi(*R=D$o<`2A|MB(H+J83t*Jl2g**|ajSAM&`;@8K&YJB=^^!DSnufHtA=3TGb z?Jj@rSKg_Uh1o~XdYy>tlm9!2+ANVdCoOy>G)u+r?)RhjVjJIovbxJF_fD>M`pOlj zyWGy6_VsUkW?kp=k+a3>u-e0teU}PMxk}}2UWRs?Y}38=-}cSwtrm;L#J5WD9#&2l zi)EiY>&MU9&kqdaT(;Th*=*kPWyRg!&2?qp+OI#2dr|+Z?1R4Wd-1dNdvZ(un58xT zJ=}IFKbz;a+{?Z{%KZN)%dfG!&Do-Czr=fa^xkde8{WyRIQi<|leD(2FXlfy$iC2o z>+pqFkIt`ruMrqfBXEZ zjh~PIIC^K6-8Ah@rStyg{@m5?Xgzf zwawaZ>RDF5-MwsC=F30>VUgXv-`{bcIum|t(Ks+s?x;Y|Pbt20-xVwe(l zUONAd@=WJCyYuP+^Lgg1{&)CgQ2nNFr|13cuj@R%{&LUsKR-m{-~GKjzi zXN%6O`SN-9R!=;#{rbCo59-^wL!@M+7pSM$Wh9@r-0FVg9jBz+)?U^UU9*_K>sMdv zF_+|-8fCic!seeL@25t8dh*d$x_z_BKjTyO*JiOEiHbK<5Dz@{Y)Vyq!@e(#$$u{2 z|3Cfj-TRL|oj(`9`)$p>b^q$a<=%h)r?`CW)_Z?9Zr_)-zW?jD8|k$v{l84|cK*Kq z?%u!iJFjKiecqGQb36M^@Ui3l-HShMdgs0Q0EfRz)`AK3+}EE~Wn2)yIQ@BMx%&;9 zI(t5m&5Ek(Z|_KE#HJl=^I9Lk{{DLLgO`66&M^P^Y{8SaK9e7OR?D0haO>U1)rP0) zZ^VB-68NRVeD1}n9Wzh=pCHHJV|KpPQSZ<}o!M8OpPud%x0gd^+P;5({pDW&wf=eZ z=Z)XT>Z{Gpe~Nv5%dXDm>hZ1H=f5^ev)}tRU1#l&l0A3J-0aME&p)zk^7FS-j`ys; z>$16iP0!YCx9{DEFz`Bce#Y;!6|9$S*NE(YaO>$y<@!&vzOO&Hf8vapbDrF^TrtV5 z;<|e3c?HJn_osfD)O0Dn?Ny2Gr1h=Z72d5=9{-(u-y-hD*=re7*5^IY%3iK{SZ&dU zh5OTgrS1B`P-69#bB@6D%uvgt_D`p^?#QtHz4k}%>m1z$-*z0>8IWPxW-z~BA$k3j zBU1B@cZ!&~XXR`T`dL49A=_SQ-kJYH#cg>4@BEXM|Nk*?_5A(wVx;!`cDQi!-j6%o zLN7Pk`;@-g`~K(pdDr}HxsL?>=22PL9$T08mfQ5-#@68QKd(yP%?p{=y7Wp#z~KU} z!wu4J7XIE_=2-IW{^S1s`R2dR?5>`F{6X=%7hAsHP!4*1CiVLIus@o8_8;qyH|_ne znt#uG{&Ug2?{&+g=2gZ2?69>9Kh8D9>h3`SpE)P={1(1s&^yk*P4wq&lLg22Ua)jc zelhXiac}!`TK4w>_t)!%MbE8QO1rILvj10Vy??g8-EWaKb~9>wHu7EL`*|m&WZ%(+ z=Xd{{UAU=c%Z&x9y7G||@9*_{sb#jGA*bH!ciin$?@t)yPd!^RNxyaFFMh?T+aIy7 z^$j{uBG%6QTp-}!EPj(=JF`ib*a z+nfx3ZKkJRJ11)T={L?#GoRdA{-kzmP=jMdY}bkQ@0Sm~{Ar|csqaZQD;?e9O8dtMhUTXgOW!;<=>^YL~+<8~J=KmX#BOIP+~;quboqMPl1RoXm$zrS{? zUCICIy|cc)Q|o?R`RBXqpPx4K^`2krzo~!x`rTFbVP8IOJ^o_(!skEjlx7vG{W^Lg zP{!TBO4Q&*+P~6N-OA4GFV`J5+;(QewA%NX5qb05Q@+~wcvNw$Rhz7LCd}^a#QpVK ztLO699DIEC%QxX~v#!n&@-c5e^WAsNQ-P-&)`iU1tJ(JbrS29+Eq%TPMLUY4a-#bE zC-m#AxVXHeT0QvRjF!dM{}+_sdh`0Mg~9p$`nvxXPp7ZHse3MKe)g8S`n~nlRlDX! z|2@3(`cirM<9}0)F7_|(FYLJ+`)-ePPvH{&KfU$07w|F{3-9+kWBU01AzmHnEWJJR zMe+|QWko~=$;VkmEqWtrvn1-$2Zwj@2UpZC;!X~H8F%IU)1AMP-ZUH$`1vNvKC9=I zsHiZ<{iWxB>|Z_iPDSVBSSAm%C2{ic3+6iq%ne%p+xA2{NBdv>f4~2Tt?##q`)@V< z_0psL!GD*3`cVIRuluv_f80NR+kN%d!^&zN%j&&rKi?}{lKSRx$FB{WZP&fO`tRee z|EvD*Is5%0Px@nUH^>+8rFP zUKrGO>@SS}ZKKr^mz~)wr`1t=r8DoPzSZHFZ`x~$_fCHi-cwZ<-&!wwxiFH~itWC;DP2aI|-TKvA(&E1f zed=g=s{QpR_4|Q_-D+{`aA6B&!6r;{Wb8;`{(CPwdJSRAHV#0U;Lso z=WpjnZvQ_0<YUUE~xB z*Q%}`&+Wcx@7*+=b*1%IyGdJ4{MSv+D_+?ynJV@2$-1TQxto96+^^PrHGlu#`Fn3{ zlk+n7yqvfsw;=9X!J_s5HoNO4?w^`){@i`Z@2SjFqWZa4+}2tqsaF5(*O!9M&A%HH zW54lle^c>WvAgJf^K`ZI*X+0KU7Md>bM)Z%?LPaDJuj}EcJaL7HJ{Dm_D7z_U0fXZ z|4s4tNB6pm_g`FG9e+F7dgqtcqlfNyZLXBK`?a+ucf09K-hJxs@4J_~bmmDkg==JK zW*U6C++4q8$@_P8Ic(ovZ;q-}U0u)3KgV^wtHwWBlc>uK%|_J$j#Ce(kpz zU!Pn3sJNEifAjIR$E(ZM8y(x_ZkKlS{0;5=SKm$Zc3#;We}4V4@3X({t^fa9yE)q~ zzy5jL_0L~hTMj?tcyHx@cHcqm$0uB8mC2oq&7AVDy`C#-rq_P%sEN(~)k#*)#h33- zme{{@_pS@6TDQ_{s_uPZJ?i6r)L`FN=IsWrPZ<9y_!nhz>(J&XwH^I;HgPI4_W0$; z_pB^Wo?*9k`((){q26&<`}=42%q`5R{`=$G&Hk?z^|6o3(`)bBt>3xl_VfEiX3=M( z3#H%toiFYy?B-wjzV=S_7ys4&#P*inc_Dsrd7ep1`FpqaL)Pvo`wcGKI;qZ2LS*Zp5eazLY7xYLuV3dHsr8p_Yn8PmkKkavR<`HtU0&$?-RTwA{Zs z*nL%*DO}roX@Ob2T~+kGxZA-$!lG4gm8X?6Es2va-!QE-v7&OWU20|DOoMCnf6tul z6Rdgh;QG(Xeg7(}Ju59<$Nzm@YV$s~|JS@{C4Vhyf1f!Y@jCF!WtFgXTiTb;^ZoVh z%b!1gznrf)D`%?kU}xs-X0@{$GS?p4VQ&3G$ogyg^<93oPux}Q zH2?Wq3*Xyc7x}|_rEtsZ1=W3GtLNr#Dh=ZiNm^Za$7_xGoUEro`*xJP`M2t^*3AoQ zj8nqqe~Y>?{msJ}>#seR7AW_h(qaAN|I6R?Uta#nn7i!j@uxF?U%#HcHvahDA7xel z&E)FO?4ABE>i2D_$0m1<{rL9gcyj#t`j_q3cWm+7JUwRb{P_OtvcoU_1iae&+hu=? zVZ@Hp-P5`fk~uandT{X2eYLL^ZJIBm6mP!#C*b79d^pGUQvCVycIQzTISD7&TqbVt?`=6O9{l2r0H(^J3m0A>+<*PYIcUOOy zcks6L&viTxUpjA^FyCCRLM<*fK4Ri6?$9Y*?@vbsRsX6th_+7*w$Q1md^^Q1En;_d zwUA@*uKZ#V36{M5$Jgb)51KK}l4VYu{Co$S-5Y!tUjEFMv}jS;i(lD2_xNY}U5E$*oM*g8@cK^F3H{-EQ% z>1E3&UkuA@Ie)_LpNOa5t>qzWB{W}6{(LsfeS28mxBu2Z&m1z`eC#;Gp1Aq`ZijvB`u<0S{fqh^ZI-(%-!=W({rYR^^Y1LW znqRo?<;wbX56fOpKc4yN85UbB)f#w55J6DD<-zW|I*&phs({C>%PRMADVT1 ziig~{qLqySrK`$akIp*sb>9(}-#1Fn*Jfx|Y-qkD&KhJlf9DIfcE3WW+={B#eUn!6 zYo8V?ZJks%e{E7|#eBc%*9w36+f7pUtj}XuV>e&U5rG$9ecAUfBQ>| z`OhyuU-iDW|MJ@JvQO-6uE+oE;8)&LrFZm#gwj3j*}MMVJ#%z>bFk*37IpfUZ^K0gGy{zUGou_A!;9`(*-Z=l;I^o-! z<8y!Q7fjV(-G4Y|DSPPOU2`SR%x6FLTZ;RR{r}(f`{%pH->yHrUn=p`(cP1-d@|iz z@mscd|D#ybs{N0Cf4SDj-Q)F`JNxm=wzHbWDw)%F?D_Ha%Kty#qwW2IVw{+}Z*6^G zrC`$L@Z`XRofqZ^+nVGZ|E_;KC1ra2sjO=!`_D*xS}XHU@5qi@^ZcSeycECk<6q^c zZ|{?NZGTH2-*f+CSJ+o>+n@EVrx+((KiA^))_Sq{RQ;C~ORs)mxu)ck(X3nd@Ah>~ zwcQU-HlIJfu)yIV!@~BY4W&Ans%87O>|3d0a`%hFojLPc66zJQW&Q6jo%^@#%EAo` zwiYgzd;Y!j`$q+%U2&KkmlgIn?x3>htxtHv0Vj&*zta zd7l~h|5IGzq>mqd8lStAR{rz%->Pf2d^_q_el5+a+pWPc$Lca0%X7C|a+|N*vdh?! z_g>iSXye23^NF`UK3HTS?v}yxbivN7z&Ro3o3Ad7**rJT;4s$zQVfq_vWirKK|?D{|nUqshWAW+*Z#1-=C-JuiyT0MkfBTf!g#v zd#-=EQ$ADp@`Urjf4=_ORh}-lr#JI`T9M8D!kg9hYj2n_9diGFY*)RYS=)?-A3mGg zhQ^&&^*X=HX5pIiTc;lVYOh|@p!(M9?}y8}jjWaD{dJiq9nt?A`gF(Lh1);Jzuu)7 zn7b~+v?F%4V%(cod-R??`~Hk;O_KclguRDk9>4fn!(J!Kc{%)Z&CfNZKYmGM$E-X1 z=(GH<=j;5Vmshc1cT_i^;Td;0b9A1k7t?~&=>Uoz)+>fG;3<>yw(*S;>ixb@DR z>TDkMhJ&F||C>C`KF4JV9Qj=#@Z`wUur;rmg)SOJu4_NBZ*y9AaYP!I+zFA>*Zag@ z9pAO$z?GE(_K$waI6wY%`u>Tq$3-Uu;>wlT^&hQX|6JKUO@(1jTK@dBGqR- zTiIje=JU5LGU$2z?#B}Dx9v8Exe6aVv;6(##y9bD&!-lvo(5e0yz}{=x_uSpe3#P~ zVK>4+J8$}-AyZg{x{Xm&wnpVeO~%wQGes| zvXH`QPZyjQdGj~i^48W`V)ffwpNqD{_iz67{Cx48dHv?+Pp9m+?cOYYbHCbOi?S_#db{VB z_|AQNp}zgbuK#cL-}&vIZZ)^X{Y-C$_PU>U>ptqTduyEy{9pYf!t7j+$?)|MsOuD)-0An)z@$m82K z?~E6p{dM`CTEEzDJ@fy5|MM^AvjOv#r1$&}^ewN5^<01Xxt{S)9!ucQp&rTE`1MQhfNP$s&e~btk384 ze@DJuePcL9bF19Sf`TbK|J3(Koqc!q!mL@ri!L1~?oa(H+T&-or}ojYvh#nc+!n^m zTG!0v@3ULeUwLWH48}Qe`SJ;G16h36UYox6%4;L8_Fun5`ehzaN+6&@laTaQ@HZw+_WApROwVww-A{&$ly6mcA(R3q53W^mq8o=YG=l|-Qzx(#> zmb~@1+m~hghOa5j`F8Jbjotk7&)@tke{K_fx<2Cl;p(-m3xllQbAL+-PS0kW*fF!y zF*ncSv@GX-y-+jx8R3)N9voM=DX``APsSi2QTOSWma6=zydPa<`9Fs%&+zVD$1Rgw z|Azgxihl6*dHw$<-S+kQnt@;c{flEflV?A#;ht?`)ls{ude+wr~dZZ^yfAEcK=?u|JwZ5HJ^9g@tc0R;`0fMb=T|c<<-|) zzgO;^xV&Wk(gPQ+Wc^f*^A{Lz5V6W?|&1%f9J3L`{(n{ z(;L&jf1DbB_S)mM^1mKlkY6vFefQV%zhWome!o^+^Yq-~>9u>dEDF zMaQ$+QPTO)^6TO&r*h9NK3{Wuoq+H5d)JQsO1Nbmqo?=LSKB)M@1B<__f6~fm>*Kw zs>Gstv+w(ob8F6A+1M&nxoGpew%)+BlT++oS$}(Y`B#VI%pReiOif=N{91ge;Q8Bv z-`o$kJdBV3xHE0{a^|i=2Lld{f6k8&n-@;D7610{%}cjQ+aGP~zaS@j^Z)OkH#h2^ z+J4(^>ksWZt&&sR|3ANcZpK$#`QEPo?cVtM4Kp9!{yY1*>|d|44UZOc`FK5S&Rq4o z`^2-)Qt!2XYI2>uAeuk@xwM{*h`gSubGF2mYu%ex{CoVnW3GPWyuJHgt^SsL>-O{y z+D{gIc8wSQ`|fm+QU9%Y>Ac4#wNKWs`~UQ$!Sm#QKYyQd%dZGz{jvGcMgHIO0_CSz zeO|&4u_0q_yo zPxZ6>r0LWAel05ztDb)EQr914PD$N&*Z%hxK7L;)mv{Z+(citwpTqM_)$3==-@FyZ zy2a^slh)HePFG`=E}P#}x8tF~!+G{Uwiy{5WNkiUC{zCY=9J9()n-dH5XY;on zirL4!CTPCAgShF#8B4GIWxir76utD9{Ihv~3-z>=>TY~IeCq$V9rNXXW^9#v8h!qD zzWbjoefCH9?nvz^%sv`l_wSc@{nOv=6}|tg_TIn#d19ru|KdM)lJ7QOt(U30^Ci@EH$!W8QW{yJyQ-F1%M{ zp1DUp^c>skA2PG|hs61+AB|lvn)x$S{Qcg~*_9geyWW5KuEH=SY-$%a_aK>(^sPHb5CWi zEbhK7{@AtPa_~3#`;Yn4ofDSqVBxsCergA#XfQ_NdC^gZ(6_2#bo}+XPGxF z$Y?tjuzH!id)4$K@8|wuRW>+n-y-$1E25)*)A>KszTTXDGft#A|NHg5pHw>PtM~6L ztMU*1xgql%&-?n)<%KVv*ng}FQsiRT6E=Nj4%2h@oxU$j@0xz;Xek!o|L1!s&yqur zgW~6LYd9ryaJ>){FW!=|J9g>gp52oI7su_JJ$K>y`M>nbUkdM0pQEsQ_v{(>?B0J5 zo&CAsmudbl;W@vewbkoCUp}+HaoaYJeMRo^3{$-NtzUHK=(O7%y;nc4(c=0+`>X!< zzss(#+PpvZ+x6?VcJu#7WcL)A`8};$cX|8zu-CzMv#)2?*Y=j)`JUQyW=`Kn)05GE zYWD4Nf3ttD-1pzLnrBS-w|&o5Qk?s7%Hm+%yuV9!or}wyc=lex?0`6v$5ZbdzA{xh zX7#=IhVL?&GOORMI6eRL8(*tuN2b;E|V_KExI$(xQVpWkkK@6+>TPp53Z{P&BkyrtVt|6{q`u`WKl zl7)j8)i2^Yz#I5qSK{aolc~jyw`X5gk(R8MdMDB!R8i^Ve(_7^gfj_6rx$MjUOW9> zt$f-keZ%a~yCRz}q>J^Qv^_TE^$P=~NlTtGuUh$R(ycEiw|=U*!?otm`fWWd;@=hv zTZ=Ac+Vt|xBgxJB5;GJzHd1Dt$NM(Q+Iw=?wgl=_e)Ru9N9Oi`>)-rUb?LR-*l}H1z-DjTD@qsH0*;ctb`i*4=?jx5~0^WJ_QecSda#qx*O?5#@W z^Y4~leDvFdmwVb8l)74CKsC{i;I;$>ed{rk@@wM&m3 z_pMmnS|6+P^6bAa^{kur%2q7rG@Fyw_B+K$UgT|a^m_JYLG2GQR~)tSg8FBk@O^b* z9{;_!eye?XFS>v1dAN96?6jEht0x|;6v+AXbwl;5;O+A*GhV;l|M~61X}4dW{^7m4 z=X<%vZ{hpz8bzgF{aYb<;A}qg%c7TOWulZjPT!kZe&_4^|5l%WuCDpFzkdFe6#I?K zKjl}y|99i?2NiAMkf%@cxA#{BJbtWOtmRfSr6y^s8(a2MZ~K$KHrMUuK3*MK{-$)j zvkmLKC*OAdi27^QoZ>t0@V348D{cx@uU)Hudiz4PP5pc+*IIvQKV4(w_CDr!ck0X! zCz)p*UhOEAanwmGhan|tx%$L)hvo7_>*t2W$2r(deiQP4XOHaii}BYV2kx1B`uy>m z`So{g+>1Nk?9KVBQ$Fo{k=f}p6Q^I>J=L<>uP8k#|Mj))Tc>SII#MNn?|t+6-vtql z#}&4n|IH+pGNbmH|I1|>ET1#K`)qviQ^rhq?ej`m8qvFE8sxt&_=?nkfRR^Fe#?0-S-`cGw*J>IvA&GxO8pY1JEv!;FH`)Np~CT-PZ2){pRNCcKz{zfR|j` zZuYM4O3Iub>LNP(c|Xt77sWqsn(huY6S{Y=&-Ah1Zj<{bF9=WnXe#CR^t*<`;y$nT z*Va$!YxBadPAW3qU%zAaOs*wS_tTdB)KtIBWSjkW4`a2Mo4fV3`nvx=Yjop2J-%^W zuWr`9dHMPGfB(G8)%&-6lDKU(Z~wH~ zUuOzrmcQ9py=HgttG_?CUH5SNVH;}mPP~3z$g%IYZmij~XqWoe?K{dn*2wv6Tu`&^ zxAIZ>Y5%*{wLX5m+etj;xDC_x?h`3q+5T-iu4Ha$IsJ3$y1&ooJ#X&%a$^15dVQJO zYrU%OPui++Hea24OI-Xng)qYn5lipQcii9Am~8X^czU7S^RJ~g`*v(9{rUE@WUXG^ z>!0z_Pc3TStpA)HSa19O|DE?Y>q_qbD>yQ3{^F}r^KBl#n793M=JQv7w|7#=uR_d z(Ae>{RuS8%_3+ z3HtT%L}Bf}wY6)rXDR%=V4a`O)BPzT=$&75#tR+o^M4a|{WNg!{IacO;uWu|ysT}P zjc&4=zFipqB>bZV%f(}dO>MP%H!wf`r2hMpdB&rc6PL3vY)Ol^t9P)yW3V>vzTSa% zfhji6{(rUq7qeQ0^pS5GZ*N5B-o>U~V-_rE2*e@^nsEs>{J5`ycwq;FIs|a{~ z`(^FlTK-=;%=^-f8MnCIw{x_wJ~SgTcAmq&Q%AO}sNb5W9RB|G>!SL)dtK@B`~Lq? zy`G=(n9l<+_|_iNVX?OJ|ozlWS|{nXXA_}0OFr)w%Eh9yk9T&!@#p{XHLTkDBxT>B?9oxoG~-mnZ9$+N@5LsxwUSi|5O{X)9DN`)ZDU zg6C)c<13FZ-1&0*-*{{G&-VGVYyPdNUt06Kruue$vAdZJBc+6XPj;uJe(#Beo3zOGx=3dqJ@4|$e|Jtn5?3Y+CQ8PQ6KPgVc=QvaA zw)oA=PbQq$yqTfLP2c=NxbB+pwZ~bXY!<6$e^&ng?)$)fZYlP)((C8{-BhW&Z}Thm z?{5vtzyA68_}i??Rr9~+tarcj`*HoYU&Y;%YvcNZ>%WO8m-nBa`n~7t&aLi$#oi^m z-p|-Dzs$H!S4^m~yRT!NtO&o*yuGoX-yGFA+jDIGtjo6*ek>63u59OC_+ozLl-pta z$9Bga{&b3c#UaM#a}Rd$v|oSsz&7JDd-}Wh^);{7v|c&vmATw>X?orD`1PsjyMh_E z_|@BgKatsg)UxVz>3^ncO`AeLW!}F1{-?J7o^Phvd-vPUwtlBpKW}c@B&Zz!bR@DKHLw5!9 z^v@rCGF|HK%K72N)45+Ia9?Mz7Pi$1TDPyA(|Jd@dcDeHmuEYcUs;>leE*0fGFYy0+xGB{x*6x|vp2!kX>@|eJs3a(ADj#f3{DIZ zT~eDs;~fk;wr^RNnwqwC)2{8iwy#S~PFlBa;S#U;dOG{oXlqa1B)of{;5XaZN#!4Y zZT?#&Y6D||8yVe?&H~C|EI$0eYp0lKfCU%P4jsd`*(B1 zT>sZgFYY?O?VZJMub=;(?{$mef1jGIppd<}&RB1D>fX3THQBG~Z1XC4c9+yJ=Jg%* z_1m84Cfm2fIQq5DgGH=~n@V=P`C6t_{;P69=#N(|L4WGa&c?ECQi)xd*7kNGqx|8w z53g`eE~#Jl{r@YDEkW}BG0)U*-(+rc>Yp5DA2Wk5`1_}OpMR^lTb>QvXZLT_*Q#6J z*RP*Hukzo~#s6RbG_=l~{p@j#(XoB!e;FqCY?WWHUHw}2{L8p+PtO%f)JjdfsQ#e_klGm zlces>a!<)GVVjij`Q}mWHJoa0AMVR;ySv`q@Bi0b|4(iG6>nqy|DOKOZ`Ji?%Rla& z|J3Z?%NsN0zS|ZZQklMNiC-)~tqfA6N(pD(Q0 zckHA4`&lo}-cEg*VRXK0Yu%;qJGOt84ZH6CU$893?Sk0*dFv*|$E^Re_2{khrai{r zcGS%}v0d)3{@%!&hsE@L->*KpPgXuG=H>Oh^}Sn{1^jS$y5_tbZ$z#AQcLLz2`d8Q z8xCfFV0fRs;fj0!4=cmF2h5;r>0U70W4LjJA;OV~VL`#0a+lf3hy53woffkCzu)TI zE2SUincv^#sp9|VWuVyGbyHp~tf)P$F_*-*Wu0mD+;eC$$X!A z?tN76;w-=Vl9%ybynl}*fBx+o_WgWLQrXS)xF6rACVxEK`D&Ti`)H=;`+x7tDVtcn z_-lK%s(n{xwTm5oe(#^W-`bCF1r9|AhiUJdlIJ)-zWBoQ zxM%vm+3%&8bGH`>|Ns5rZO;E)=gWmeZb!@WKeOV#vm%#UYc7BNdEaVPxqtcJPCu%Z zl;X<1bS3}w!~+u67mLGFzwbyaJ6%@qDtC3kr%gT9zox|SIcMDA-=qXD@Wm9f`@?P~q-Nh;C>U;U({B{@W=z|2a6iMGp!t4FPsE2kvUsNb z_3@%0aixb5|1Z~D#9F_9`TEVRojJC@w%5zBzpnqgtMI4Q`cGeW)aB~?*Z#d`pT6w; z)?<(N6xF{=ev&cE;@-Y9%l_`udwfIv{Oy;Ly0ag?DCzmyWoU57cAJN-J9B={U0}F%We8(dvQrzJYRtP@`pFpUS7^U!Chp#*VW(O zPMcke*e<{Q`0am2-RI}*b*=nx-EjBc9rk^HAK%{o{eM;5{B=h1(?1*iI`y~X`O}H# zORMMi8oqn|xo*DOOl^0|V{4z+{jRQ$|CZE}G9@hM{>-1VWw@^eKKQbw-hfm7XVcQl zGTRhR%}j1T=32J%``asCdzXLRBfCd8PubqA$(F73%<_|u-XAKM@G@oQ&Ig?nqSTJh zzy8?CPDp8~SlN-<vy{R_P393Z@#_u(d#4``J3_|xAt7um~NMMT%Y6i zZCDe&#-{pL_B7FReW44wv#_r}^-I>p3U+D<-ip`U9{chhR zmH2zVY|M4H6VIM|^?uQC5bt7IF!{vXYby-%4EKHgqHWOjJFot-@2;~KrnB$zUwC}| zEB2FrGag-E9i=J$wzU51b|dA#!bN#!Kkesz?qj|oppKKZ$L+CP%1r*l&rEKaiz)u* z|9;`GfBnXH+vgrjHQtc1sG#+bLfY}WR}b(noiTac{y(=4zkUDbiqw6(+yAOQ-aO}j z>igrz@6S%ZT5yYEucFPR&=%k@iQr~m$NcD{%;bB*0qxlEz@pHr8n zt}@%d`BA`6_X~wuc6T>17tB3)G}3251dnmhdiiS~u5MGw^Dft(cz=7z{P#EiiQIj? z|NXA#$HU7xC+5t`{WiZTX8z0R5!TsTf6CrIYi&D5 zPp0ZJdrNlJi#;**Kdks__pe_9JHPHX+JEkH{r1P(*C*XCll-4*RW1Ge(d!xi3%jqM zzp1=<-u&N}4c+eTd-XkS%cJct>$Vu}>w13soW;7mDfv(5pZ_d&z2;qpLc_G2`qtA= zS4zxyzoPYM{YUXzucbm>ETaJ&R(uzx7w8rS9k4ih)7Aa zKKtKz-QS~CTjp()e}4Su-Ori&ey`g<{i~{s$*z6zv+VVjy0h0K|4n!`|J?6q5#LwL zKekck_-)N=htHYVz5cZ4>xt}=-|ohFb>9lxTP2*6PED`od(Qm3`fmMHpNk1DzWp5A zCO@-E@{)|#%JrW4f2r~EiJzXo=bA0=Bc3U(Htq8kb!E=_h)Waa&Ga?qRlhV}Q$ED! z?oW<+$){_|_pbh-Jc&h#^P|9zkMXZ_!w?_Sq`{grvgF8RwFdu6}=@1I`Re6g@SR%@Sn=hbr0 zXJvg7=jY%27c;Bwm2Z2f=m(92Z1$s}7Q!iZSFT^VzT=-qpYDBsm(nxWu0LNLWFe8c zYDJ>oSM7yQelM`2BKN zi~s67bW*rxiThanc3vnyvEaq!S4B;~G&Qe(zy0rb{r9hi|L1+3?qjcSyX^Jrwcc-T zCjScF_jktruN6}s7yc{1XSe^|_O1ONl~1pjzyF@yl<%K&&+f7NZoF%c&9CtNy>lxc zeU5BT{w;NXe+;{_iG9khtB($^-QRok$pVvoGIDo$7G4pom;Rmd{iyid7gD=-hX}Z+ zhsSB3jXgPU<-X77^Zo?ys_3ena`DLVuDY#P8z*|6j9l`}wINT5M{@J^$=8doELNEl zB(LvsrFhP){HmpPZ!=%4Ydic$UVr}Cy}tR|>wbJRN#Fjju&Qp`z2mR*@5^0GUwb?7 ze38%NpKlCLt+_70_GZ_d`n$=!H#b&1ss4TDdEwsP$CbL@-z8g^Ex%a*<@Jl&6%Qv& zduCm{-&wl&PAIY41 zdjGFXsh#oBzVfSgJl#L_(Y9TM_ioD1|9Eck#oh_uJ(;<8$v>A{f7?)R<%c=0%W|#+ z)?_`2PxSd#SavlnOzv`s@w~j3H&jCk#qBNXcmLhTAJ(&UZR(e|GuvI{k8Q&PW6}6ZSlX~KEJ&)^VswL;`ynUucuD4waZ`q z{bK6TzjbQe^@ksq-E98%&-mN@x9mbDhH;U}eEVN39Nuy2!H3Alzpk3>Flt=4>x+eC ziO)6B8_k>4OLrfee73$TebfB4S#xiD{44E0uu))go1Ww(_UD#-UR;40mrMUk?7LUz zSSu~pO!L6=z<>?36`fV;c#{^{VU=ECVcKDXD{HguaO+tcJ_<^k4^n|>uX}i&-e9e?x$s*?=OCP{|Mv9nE3zOBQ^Ky{@e96;#=MB4_rmH z>VB2`+KUsE{OCdX1&-EeE7rt z>Gzd4X}p~C|NifoNAqSc_g-{4`}lgX@bbU!wydwPTL1s|oy+!F`#xW``#ODgX
zx5&S;XYwgBXa4dgXff1y-Jh2;sg!YgWVjXU+I;;U)rCcG1c*k>aN9# zcQe0x$9%VcS!WvNr+LMWHCEZ=SKz@umG!FrL8}wO?yqhQ;-4x!U;p}=mbCBlH$0!k zo2*&7)47g+bw}PS`O2hz!`@%dZ>L^)ZZmV=zAsBRub(cHpZ~N@ciHx`{dJjh`MXb_ zpZ=$!}ZQbkJV)9AnyL-Oh ztaUPbf2!xT*4d-$?>x^uKQDjh z-}#qky!)V-_x1etU$t+ie_#Lj{`d8N|J}ZIJi5Q<_H_3(k3{}{-r;s9&Gz>CXZQat zt+)HvXB$?Y&G6>>%d<}{cdzN?)9*j#<^N`T`hvHuyjFj;Vq&{P%Pej!uW34c?Lk%g zEF*n^oR(K#KhE6x=c4oEdH22MEK@sK&t0{wLQ!Us;lu7@>dF2LkX0QGGZ2FtTnr2h zl51Q|q}T7;_5c5W^~B7K#LV=ht!sC0OHJOsYwz|Ao3_shdf(oo@4~z&JlAUF^m4s- zuCg=!-Twc2e|7Nx`pjUnr-gMjdUE?~W9#hGe_Go8e)+ogm-h4L{@d&8d!Jbp%{^Bi z>!&FY*r4}-tH*&{rG?5zju#>@!WD*_x>JhndGa_$G0iUiA$9kKhqYvleUIve}5MK|7Ej2^8M!0x;pEB1-Fl9YRyyLckS2q(kii?%a6ybuiW+B zf4Bds7nQGmFX|6r*34MwV}AXL`zM#pb^DpR|G92hdw%BX-FrM4G!H(Mj(fQ_>YCKG zs6H;r|r}`nPI+7;iJvVK*c@%(Z9~xa2?|*4E`3qm`ihMbo0kGH?{|FQI?9o z6KDPUV9(?|j4^i4tv?j&oy+uFy4|+BLdseCo7Ow~GwZK?TrMy7`|ZEiZ?DNe-yc_5 zVE^dt%haQvU;PLWtQEN!z1G|Q-?rnk-h8|!Q*XWQ_Knr@_1ph`m0DbC<@fK)-@l5< zn{MT8t$Xuh^Cp>HYZ-o7Ucd6zsxwSzO~6Un1*g0C{GLV5UA>(Bwb`>dHTu0~j{?%A zbebPz7b$(b-@TgDuM!hMWoW+9zI`Dz507*y-k{? zuU+}K)Ow5Lo9k~^)u$f2 z^ED>y%XO*iYrT&<*YD(Cef;aL@a4}>tjn)Hnro+gZW zlDl!sU;nfquK?{0?fEC_vwUlBu1YNJ{B++m_`}hx#`p~lf5LvZihnPWx)T1!AnsFW zpN_xS{5ogTuipEneVO)Y*R@}l-LJ0x`uW#BCxNx6*KUusdNI#=#c@q7FUyaq*|KZ1 zK5Y29jAyfZ{oCTNTSNB$^9$Mio3n6g>D_|1JO6(g6k8N^WarL2_^v&0-NYwcjOtMf z-iN5%`5IYn9eex9+~D@;+H?P=%%~MMwDPR9zsb$?#K)A~TYCM8@BKBbcfZ?bOR%l4 z?th@a`ut?YDcgSi|9IPepTpjpnQtxr-uFNBs_36eQ5{$02R8Hi>}zNH6(4FI-}b%k z|9|JpGrc_y=l`6)t-|qT-1hQ9BaaW!nl6P))*bCXHfQ7hm8V%gr!5o7|E6)!|Iy)I zGe1tHjsppk_otnG8|T^?ePWSe$F}{C52%N-MDMr0@MZOC-^VIJ(>M8YuKjc@FVks( zyt4Og=IIK%RC@CY?3-;XFMg<>ppqHSyPEx(=5cl2pif&bx2sp`nO*uH=j$i`X4|ZH z_vf8?Y@Zo*@7K+DlP}u8|9vFs+gF{*zdPQSx7YqDdS9(~SNyh7Z58*DJvFN956}5* z@^k(DbX(i=>Ce6^{(WPl^4t53>oxW`tFOidv$k#bPrvtT3;*|2qg7w)^yi)^&P}ZU zeD(Xp>{Xf9qQ3n)vh6T;%)H83YcsX`ruFDD%*p#bcf+ll8EudE`7IYMdiCi&)AUJN z|2DrWeDbK7`H&{pfzFkD8dfh4Dq7EuFq>h&Y{D0*u1gO!Y`;&9IXUrj0{6Beu}>jo zH)}(0-6*|YIJc~Xw?z1?etrDqYuDNym2@(%@q1m*Go?d*eZQ5M^}NQ}&z8>Fol#%a zS?KuwzRmmdDL+UIoK@BPbF3m;|Z@jBa^arIGiact6IZp%37 znN!5hyn4Q7xla8r?WIQ-Gqig@lyOej`?c=Yy$3d0Vb$ik`!}2axbn5(-i*3P-tN{d zNfW+bmh;+uCVS`MGMnA5J^uQ+|C+kWy>ePdxfyuE4*FKE`aM^0 z+rk@f`*H=Iw)qEZI>a2kwuD=3!@>f-4=(MV95=VuKIIUc*>91*>)hU%nxCbcpZ$Dp zD|-KJ!;6sncC1;pnu`wmb#IsZUjIJx>mir$b&NIj=eMUVJ%7KuK4wv8#QyW?mMlx0 z4!dsio@yV_u6OvocKm6!XlLnh}a#s1B%SVD@Ka}~ZiQk`RDEHHH z{#w4$t>5EsudUq@eLXR*aKn$P{q>Xmmw&H)8~J;>aQwTPz4zmOhne`rs~?-!@&03K zebHH_62G^+y80|Pb2UutS0~5qXubQei{GkzU+>XYb`c+eF6Irk+cjr$*SLo@=R9It z{({XsyDs|2xnt6MHTQSxoIHPfbqrtqyTf|m z;$xT-CNKWL+gzq<%dbkq2i_YE{syPo_ubt2?{@v!kL_`V|9{%O`?)Rs@$qdpU+Nyu zUwiYV?(^fC$92=Q_ofSeUsiE4{K)I#>%5!U-`WlFKbO_ir$0M4=QfLR7>E6-6*u^5 zoH7mlyS}ckH>>~3+kP!m_4%i}#uxRKe_5O{-5np~^{lS;yYX3up0s{(r#NnZp2HC@ zA2a@%D9#u8-*Dcy+57gM`}EVluR3l@^`2>e3~ry7|8_(CZ2$GJKR1pp?XP>a{#XC& zk3ULnmo1N|?NQEK{>ZRadzyDTi@ns_YelR)=l2|((BT-*cBXXcton7|=amYaee_}S zAGJ&2V%z(_a^F(h^XcE>_48Yo-|niHZ!+VqZAKE>@j`-|mz--?!AdTy(Id187of92l4=cli^w&M8T*Y|$? z2>$o|5(@nX#3)iiVoupZ-f7!@2s7B0GW=B>mVOYqXYrS{VKQ%Dm|Gxl1QaYiTh5l4P=7T(UG{X1?E1p~AG|0?F%N z*8hF^Z~x2XOeIPB=Iqt$xPxDP`JN;3Hbbc(^nb*>xvtyy?|r}j%bnLB5AMIW{Ce$& zi=QK{zh(db{<+Yl_FJgV`qyRq?8DB4)tu{_eEDw0n`p`DH~+r9^m)^!R8eR9-g%2B zZ74V{YtG-|ku0F3i*;LjQ#&yF~^OQlSdUf*L885HD_i8!sTXu?@Nr+*I+hw+p z7u=?Qv*zB5N%_$H``yRw;*0%vbZ%`I;XiQUgv7q>%U&l)om{WaJo9z&FSaW??V`f% z-s`B>hrfPw_35Fby=tZs zx7WUzyWD4*-MEsqpWy)Sa?QB9-1+^pxw-9PpNp_*nSbB*sPoCE(}};|p1Jw0AW6A* z-@K;fm+!yaIQ!-PI{k&t=alPe%@>}o>)Oegpl(%PRJnS;Ro{x=(f8ieKPsNjmHp@} ztBKn0vwfC%H>Uc@i$9ocwP9E3@3p!AXPrHG-t^P<<2&qbe@*&-!RFQ9%DC5G*9UL> zv~}m&yIsd`*Vb3giTeKaTKd|r65oHneerao{WIh? zT^UR3b!*FCscF`o+22*sZJ+n7XktQkedC|S=W5?L)O~)He)dwRYvKD7Nrjf3b@%q4 zk8^$cPvz|VZ@a%riNCjA{IJN2GrZ@_?Y(Xzvkq|M9crk+_37;Io+a{nVaSJ+Uh!Y zCl=58CuCEo8&$ULt=Ddo_cJ7`KAPV9F#qTA+27wX&++>%UjJe5>z2=TTJq&)B@5*` zWS(bFZ=Sz@e*Nn2_I|IIhaP!-cgF1bYfryUu9CUDQGRXlPt(1BzJ0epdu7l5Yrgqk zFI(*wwSN4`w6lNhFA2S)|Dqnh-eR;(eckqFQ9k!}nsaM6oOiw8Iw5#M*~3%S2bVul zKl^mq&HbkqKUt#x;aK(UrGE7vHd}5xyzcdZHw8Opm^?rCu=>Ggp3f_`TfIA>Dt|Ip zH-|5u-PI#4Zq=dx|CT>DHu%Tik@2&ZdHI#qtV{gzt1swJopLzM>w9^Cy4bU?{?BLM zJ|SBDu6*KkL|wt zm}9pJ|INDBYs1@}e53!S)bDKvoum%G`}bu>M|Q%E>$5L?xw_Qb*T7al=Izzx-=1#_ zxV5bI^1pox9_qWw>wMK>Z_a#k_b%)8#_ifw^|oxP7xd!-7wb(hFk1N_@tpY2MXyeM z{Qfmrr~1^xcZpxlY~NM6ieX8def$iS{jG^zYwPstugqwb4%`3Z^8K>6hWq|LGRgki zUib6k_nX(>TzK`g_-|#@`u{fjpYEG8d*()e>)*ELlcT>{82RnJTH9YInf&4J`RIS2 zYVYN5uakaPyW{R}2^|%Yx!0wt_VM(4Z#mEL<=}j$>z?}j^ZC5Ltli^%?p;v6LGjcW z@$T=_T0Wkf#rZn7p3^eUxJ2WvSd5O?p)S9pCB?ndJC`4s7nA>JfAe?w9}+AE+KgM0 z?!R|fZ|A|kJmAG=))xyo+tYRR95=To)i;*UOEe?KXGXWjjek^8^idNuuT z<*C}BeA#%Z{QtM5*4od%R`qVjoa1#fzeXQhI={?q^Xvuu`|Zzd)z@RGKlAnLt8Oli zj&GmeF5BhaGAs7j%S&78t{B+-``fBt|D{l3{;v6ZuIukxwM>5NedcEZ?W^l=2{*DH zGw|(w`}NTl>vuBk9=-ej@11S;{JgpCr~MO~miU`WfsP_x&UiQN^0oC>zo&0MnSNjD z^8X|C@pi}ZU9+#h`&DIYr`LDxn=fC{@P#LHR@hpJeq8lw|V>a zo0(J2URr!!zVAoZ534o%uiL-DODGKh<;{~H#0wz@o9nC&abW;r`R4T zK6l}3ZvDpmf@eG2UOVzV`f~q$eFjPzp;*j6DDP_UdHR&0d zTXtgzJ%!zwFk-_%y$`?co8@Ac=8SNWa) z9avSpZr^gQ?IxD%{)O%HYhLp_blWP${bfr&pD{kB?^vceT~>F(`C@(%`_0;hN4Fk$ z|6Y6JqR5($CATZS*)J{Bj(xpqo`gp3YR8xRmM%Se*ZS6l^}DuDo#gfF+#Ox-KSq+- z`}03oBz^h&vOYbDS(+gyuHV14&dtE5bl+RS(k-%=6JN$FU`1oxJrY$)Up<7$GOJm#BEgKx3)<2y8Y5JS5{!h(kGZ;^2oD=qz z{eyZ-cB;}zPN(PV4B!9%f3-}fxmI}L!zOkGr{oJo?cLk=9L|kgwLSdvy>GjZ8$PV{-3mU=aF0M_e#xV zjY&H0FK}Gs-b&G`|Cvhfix%j;-v7D8=I6ezald}tD*ss%bL{Phzv=P+AAb21_Q&S^ z_FtPN?T}SQi?u~pi>yFroU#E`>|FV-Vy&f08`A13Q zSNYHFhO@t=Puc$H{I!ky|JI%P^7z%vuk!id*Y_N^u&a*_?D><}Z#uK~XTTSu$7W>( zXMVih0HV&s>FOziMsXeCL0g zgz>_nv&G9x(s|y8>_rNNldr()zIe^b6sWR-WAdcl-Lo`HQcwtLt80U3%X>zcB9g{=4O0)<55U z{kPt;ML( zdGV8VewROqm0Cw_oVVd82dCk~VE_NK^ZY~hUt-#mbXmCI^nand&%R`Si{Xe{KXbR% zzvtgS?J)|x94nwKapJm*o$H2u&Dpz~pK&a_v4+FXyuPlg_Q%9)W##_47MoXEU;mw&`oI1~M_ksq>(*OVGW1xTWnJ*gJ2EwEqIkrw zY@;2A!v0*ZKBL0w&lq#Xjm7zhXxyE5B_HkIt(<@M_yf7qZ|^s*?g^g0P5)SWmI+%> z_T|Qv8~(nE4`zMOcEj%0lW^O~xBq@CdbU#RcFod@@unM3=WqV9{6hr89IwN&i%Xt( zTYP^x`EGsdn>+cHk)rj#t{9<4urKXbyj+~4=*f9#7oRhVw`FTAR*SBU3~|BdYW^E^5`AG0bl z&k5@{zxM5|(3h60R(I_g{|Bsi8~^|Dr(4(df65lK{}Q}$-qrf!Pj76i|9xx!*;CiI zU*20&`|kN?%WB&nxAdQ1u6pk=;jR6dAj!9<17^+hiRBPmw1*>a`??3h({4>Q zGw!;tUTAf=u=HY%{jMu%J7*lIum8pI_UX^Y`m=d1=k|gr#O?XsjlW+_X>aGA zd(QlTw@BaL`>+09oc8s9N^DVK|{>|D2DaM;!dq4ct>(_kQHD$_kSKE*^b%s4wO}C5R z?%P)GeymmQ`0<33T=jfQ!fvyAME*Zh={7ybKRWeUW9r6#^Ea9AG~MCzK_h0y0n4`A zUTbPqR8LxMYTTe$qMg6-pQx4iZ!zt^CsUMG+`CuoQqRtLBIfV8bieJKaht1eS9ppZ zpPu;d-NI`{eev!qzhArGK8GR2?qi(Ss%zgjaP9qME&p><%I+RI@)X(6u-({}wF7~UYY`xj} z_TR2y1@m7wCv0w?_kK!O^v`qacbM+~vYMeq?J8r-hi;SmEsOk9eo5^2INjyH`n)+q zKevnlUja}3W7#juUaYqZJRUE#`|%{7`q|r_OpEzx_amf9TI#XmlU>5!H-}E$mh&ht zuBPKt#kQ}T?9zXC{j-)k?=aQyqm=OfZ2!`_-}U0VXR@yGyUM)7yY2^{^{*-ZJaaqv zzklfd|H<;~Wit&O@m&Q66JE{qQ7tbX zy7Sj=Ge4elrNT~Re#b(Cmj5Y1i!V*tV)^@WwY_PKyPW@oU?KhU=dC}_`8##R(vS0; zx@`Kx_q`2{-}m)p{(5ow_x_dVFV$9i-`~4=^N!AfrMEt7GH*#cpMPL)c-XRIORAN< zk9OMbSTgmK-D0WQxoo?F z+dclW#ak@=@Z)V!c!|@Ff=y!Eb=~$%Ey_91-M-ISeuGS1r;YQiEmPjD;)woJ|0>>a z%kGaMoe#1_{?^Q1>;CO?PHx#mUxqDl+tp`$HxZw<_|jL_j((4bYwwd??>&?H9`^a? zcH8f3kauU*+$Ix8Htux4iaLci#7xUw(wnpI7g9t;Nt!|Ln~6_5GJCYCYed zsCl_krgrz+y^Fqwy}tH)+m(dm&2F3b*;+-I)#t?h=*(TMA9A%e`RIXnmZA1Fi>{s2 zJ#4!7zFpAC)Q}Z#4odCPey`5HZtt=BX9BXpFN z9+wE~sohz+D(=1W`vaXfCj4%`IP<}-{-w7g7SE8Z{4OT*rduu1Pv>Ku&iTDFm$$k{ z2fQ{~H{tgDyPqz3Wd?notdW}T8ucNLFWS6c#pwLxY0ajffY;d_5Sdw=Y+`H^?}ji29KJ%9b?`F8iio<07v&rbHM z{o|Wexp(9BkKc@#*?;}j@=}?vcaEPfoc4Fln%hOuwJ!4O7i;!S|9nCJ?-y~t2XB>1 zx34~PviPmjrROylR$KqE5&y4OzqtNSt?-rw4^o}NXZ;il`MFu#$grSSAVq9_(bKe@ zx}mJ6a~x*OHd%iD)PooQV;*Ln-<##Y65Q0k-tGUxIUf}tTlAlqwv%B>*ww=_bC2sg zSm&+2V%tz$xY_r{zW5+#?<@XSSEhW)|NqM8^<^;$x4SU&m;O9RCn8vE7Z$VwL&nlEMvNms!rf zHNE!#oX!1?yX*S2|JlAgb~z&QrI+64!$+*neGZ>LuioCI_q%)c&5O-Hz29kezIj^z zI8&_s>0gE|ao?psOpnn}6@4}5UqjtFX49&_AM5%3qMtu5eb)8$-|K5{K7aif{NG0I zf5kq#b#vv;2mZSyf4J(pea*|s%a!*P-G5|KRxI;w{pa_!Hs2%WAM>-GKi~e|w|~ET z%*{CCv?F=HZ}htTqTY6$P3RoH*TFw`C99~*mF6a|^>LeXXaWcOw%t{)3qNh|>-}lr z5%OAlmha82Q?E%%xTV?D@K&zLJE(lLIy?X4ihRD$@n81KZebK{aa+!QVSjJI_SKi3 z$4lib6PT&@Kl|LPuQ%K8e|moHvEl3gRWtQpC;RiyvVNK)HU0UbdC%kT*YE4w{!Dvu zz17{dw$k&{mbWioQ~CFI&A$`-uHE{-PyYYy^IvbAKYnZe*MBu)Du14>=JzwHtet|%ge%pS3edgOIn|sdxP0oIr`EC1;+u`=_u4S6tJGDJ{Pu}Z@FLlC?*G_$0 z`R(_|8~cCN`SolR$>BC3=4#3J#oJjb%EjDF+CIC{lCAcJo$Nd^|g0@&PkhZT-$b^ zUt7~s)rY*PdV1NJpKOmjeQC|NA&2|6?nZav1bh3l{Tr&koaxwW`XFm+ca*re^|Y9| zAEoAV2bl1(&EQYl`8|@kD{!^_2bmj!i@x{OX5KJ5z`(%6|AT>zVF5D_E2{$|$4*8M zEeVE(^{cm)O)}yMc)6Lq^z(stcPr;kzn9*fw%Ye* zw%w*EvxK|lGbTkB+PT&5tv$ZE>HayH|Gu?+dy2nzWQ%-SdOYx*z(3oHZQEBIyL{vi z6oKeW{IkV)Jy3Ibl{j$K5*7M=(c%=jH>xP`E=U+7a z*u94s;O7d^yvrTwpM>8Y*vW!Pd9Q|IlUwzqt%#7*zR=Yx0M-=ALR8z0X7i6^XE zOMBnn%Vj&}WsBaw9Fgp4U+sEVyC_`wp7y-V4PS~1YyMoybIn{FYf}2T{$A17>$X12 zekr~?X_z);cSh>o6}jG(JD=T)eZBhO$D{Y__gS~U6LvOR8D(1@`CazxmE(r5nfzD3 z{IKB1X>a~d*RS3Fb7MzTC2!4^<73jnz}0`f6K@ z+TOEk;$)Vxcyg~uO-ggKFOP?-~A~){rvZ9R~h><=e@bml6*^Fd-?v% z$jPs!&lSI0AKvxIPtJP9nVBBGd#49`2U;atxLmt`*&%PU`Mv11l$XYsPmwOe&$_d25{{>iHQU*?FrUS0lRUH5giUq@3E_TH<#bK|x}g;4pM z+xge-pRj*k{q^PYIqCBK6=`$MJbwB2gpKd|8|r(Rd@ftCAB+E7|Lw^0^D)bd14`uF z?W5fOosY>Be({+@ruZNGH-i@(kLpZhq;%b)3A! z7;OAHyY<CQh7-SO|_#5u1 zDBQllup;Dj6PFMJgI8MAwcKmEiBT2ND_+if{@-!ylHIzd)faqr)o-cT$YsR*`n}#7 z!QH2_cku5%7#kS+pzQJ031tgkXnp%=bA8ilo~wDqGN!&Y4PRas&Q`EJ@;6EMRKtuZ zyWdLQD(HJ}`~SE^zn33>tjh{zcK5zpC%@X+&lB7F{_~Bv-x8`jcF0U^`F;A->5a@+ zCw=O<@NbT%{F^pr%XR+)TaH|qUO#DH!jzLoO?Jz7cZSZqId}g|uFBXqJo_`;gJZtD zdcR#|d3#0CHxHltopbcpZ1^9*t{(lb;ryhHmz#1t%75v6JNM?EOU$!>PxY?l=uGvT zeEWy|Ka*6C&CiMw=QQigUwX|?edz>)MTOjP@4NTb?|*)joqs;lyW3mjws`mNe-xke zvHt6~q~96Mmv6k#d?72cXV*`Y{pqv)FYV#~e{a)sQU3Y0X5W6AeEIQ(Wwmkd&U7Z< zzj^QWGpox!jy)??c7LvJHg}$=$?fh-Pe1>?nJoYNs%7oHhbCe*UcY@dZ>$pfGwIHp zkAEtRE<47*-~Gk$s%W)A_MKm=RW>De?CPK16z*TMyngbVqe8ifEmjrA^THIXHm1p5 z)8J8E(<7^S{r>M9UY)Ja&z<=??fa(J)4n~D{C0Bp{q-?|J16Dr4WF;K#>r+%Nq>1{ z|Gix|=NN0fG7e3Bo~QE7Y4bDv>g7{}804g5j~MULXZUbx&KKp9^Z8D;Rn77)oL!7#c1xq)6{BeW}ID$#CFVXVTw|ubZsID!#b}9-q5~ z`NyAGvu5|KZ1p?4UCZoKtMN`fk1hGHrMu>S{cLZ0bjP_FVtS!c%g_C-e=ptiJ7RTb z>AZK_<0M@kiI%jA7z$6nt9SL_<%4=xSo131A7ATgtNyLNzqfDIo-;23s`R^#|2Nv6 ze>JFMg6)m!>3nkUPX5Z3%`)F9QL0hJ9(gG*fA`Vox(#Y4Zj=jK-rK`)-s0+Qez)xK z5BdwQFltV?Wl*b>EM3sb<<&XE@=N_XN5QYE2U=_;Ire_G6uW7ycW%k8IYQQU?^+YD zZrHr+%O8W;!6$MTYhRgae&?Rr;SaTI>Qr<)-)4VOJXify^LtjcRf=rSfm$iI!dnO8 z_SHx0bNV)`8WyeEeLJt%Ie(k>TVuDY^Ll;#;}34J*lC~RZvQz^ZomBr?)Nswzclbo ztM`vyVVB=E|J05Np;>x+EOz}elX#!WUAwA(`kY#|det+`LT2-OzwA_hH1ADw-MVLT zIzOk)U#@4TZ_uJnInZK60$^4#M{Z@Ux!nv@-rt4?Fyt*#D zdb_^&3W=JNr}kyeey=UHLT%Hsc*8EAXIv|{9sND=a(&LnBel<*|70eeZ>uv*XIXNF z>!EGM<;63f+$nzj<<|X^pG#ww2pc3#dn+DuCi|>;(dug)Mja{r;;-jE^WE1xe=o6 z<+0y9ZtOgFUfyJlOuhBlKmYE{xI1H`R?dT+CTkcOrmssgU=T6TV+ddfl4EFKWZ>X! zIKz72s&jxN6T<^5an?!x+~xVH2SaPV*!x|3%$hd!Ms>7Q+k}|ddiUMaj|%kNJa@BZ z%k@PQ_B#4|+E(kYIh(XTxhBZ;(c#A5&vy3x^?v;QZU3wG%3rai;VzN&aTd9$OLtsm zXxb1Wj7U=Z@m@~`8xl{ z!*3Jb9-SrRcJI%1+Xn*GXERcFSM}{ZKKJalNo;$6E$LfzLF7VaHTT}5H5L*Tg@J2% z`c~(CR$-pGDM`PEz4(@M!_oG6W%63}U20Oxs|?PB{;h5MvisJ;YjaI<{J)w_d@)x* z;9|?JrDE+j=2!K6U%c?|RD&I>fA*jJ8&xxT{r63AaSO!7-EG{B>{jkyyFIbC`1RF) zX?&lqKNa4xsjlf==KlV#e?M&XHNM}MTJzk_-gbJ&-cz%VpMU=|UME}V_sc_PpMB2m z-T%2iWFZFlaeR$<}@zMY9z8h9o%BQn=*6n<}JaS`r?6$voN51f7c+NVu@n;FY z!RqJJt(P55SCYJUm^V~DGSWDP%8ddTuR$Mb~&=$^8bFGI=`(COPT5FSQrxPi|mbDVhxeRtFg58<+$bmrPl*IyCek1H%K07vHwn>3Z(@us>1C zs`RR^YO%oI4?ix>x)8Ko^L6#bsGw`B`>XY2BUs~%;mQB~BHUUe#LYsYFT*^QJ)}2U zZt9J?S(8c}=DgiJ@$2>w**_er(jPs0UYfYN*KE0IsbHTRxpH&g_2d8Ed|Al9b6>H| z&)3cT^}o;TeyiuNZnw}{F0t^9T7d=s?vbCms$&$dM> z_xCf|hubzhRG+!{-kF(m-rw7P-{5)h!h4*D-rm_X-}PViycD}ncYj=;cvyG#udP?- zt^9fSrgii4-ZoPRVc#er-;RV6?!!sEUJl%NX<^Anhb@lIm?f?IGT7AronduK_ zi)O$0U$EzWb6S;R=|rQs-)8$3{S#pQ{db>j`#SEk5+8Hk-?1*9zP6<<^1kfh3vM6w zK72f{@P~0p?ca)AHgoIm=e|g_2p^NudAC|}=lko2H%sq5DZBf8Vc6?ir#AjdfB(X8 z(QDh{_-`Ha+Sr>T@_dsM`s))Z|Kf?IcLV1*88(J)_-wW z*t%~i|G^Ji!#1_<)_s-s`qcf53sRPuw^mJe*=_&+^oM(1I%e@VFYNt$(N^Amli9b{ zXD?n)W2zIX_S|85lWJd}dUZ3c8|JARi-5lDdY}@MO-KV&&_TLIu+rMts`78ZiclPe@-|9nmoKwE@;+96^8wh~3xjti4_+os4pHGc46x9?3W8H*2767%Q& zh%>2tYPsh1zNBAf`farrcTBYmeShrH0o6#~r#n6T+#PG<<{dtg^D)+9tE^sLya?yx zqqmO#6^W7UzFI$}X3pw)B@TJ<`)rO`wM8y@G-;BkWRBjUdvlj3GoDoVTcFWgJbmu- z1^eSS94-IDbUe)Irpc8KzDM`mcfF{cRd!dibNh>f3Rktbi)H7S%X6m2Je6V%`n^@@ zTmAd%`Z58@3ompfJey~>xAN+?OWzm#-SAKKVb8~pd)Ig77gy}LR#!j&_rKjw9xl>Kx?Fwz zVd2E}wjTH2)jhiWv9bEk_kGEA>$jFa_*c04^8Ni2&KK``{`c?GBRlWwy4Oyh^Yc$! z(UV^S#jkAEi+0;3x*z(u<}1%}whuA&MGOu63^i6)yOwRTX}<0vsm*K7J^ktFXwk3l z|19QTe>LaBf&+})>jd{aBkapt$}cYQD0K6rCgI_8Ccdt44rdeN!;Pqkw9 zCCz)!L|b3^{j2p>r&Im6mD~B7kNsO){kQqDheC7vzb|k27}mJmb(Y!w#eL05fAwmn zh28b?<*_#Z!#1jliQ6!^8Zs#FC<|r{Vo$619AL|z_I;lC@2dqLl_MReYrc2hyWL)V z`TlrId%b>D?N#qBH(z{x<#Ni`t82V2-=A{s^UaSPzV+X0R-a)@F?x8|ft9`Q?$0Os zTwenepX_|}@$;Mf?+@6IyBcmum>{0q@BUM0m#jhSy80(`SG{^#;r`{@?)~du-Dtfo zcK`kNeDjO@+avaUzPJ7B+G}S2{7*Ii3<-ZyelPH-x!kGG$9+ZbOIT$y&N16=J0s-Z z%)@J<-rqm)Jx8KGe&hPRalgX<*3Fxn9)CXm)91}|X8xW2u5#bAzt8n;_txIayZlmX z*->wM`~3a3_m1Vhti4~q`}w)zZQnodd>{Y4Zohv~b)|rPgh8tM@tWS3l_~eM*Z%l& z=?;Htp67a*mrvH@@7(fZ?(tAZJr2)#{%g0#Pbj*;#an&u?>YtNvI~(MA#ZflT{!+aD?0w(+wWnE^cs=LtP(Jc@YHh2X?dSSM&v!-e z{d^o>Z$E!o-P-z^?e~1=|GnwIS!4O*!e7<@tLy9M?4AEJ`t|nHwW&Q-ujkA?|0iqj zws&XyKJTApV}5hqFqoW3QT5@?8B;zft|u{4KsB_STDD?speowIk%v649HQ zs~>-zbuH%EL0f^i=3ss0%?HvguIy5-_sR8o$GRu!d-a9uRwc5lLSDXQTz7m{i}T+< z`>)qo#danC{dd_)=UY|Tt~p+hKOYb7yQyiv?>hhU;=fQ!m zPd@(s_V@L7_5CMv`}e#}TYq)+_v-h8?cO<^Tow~fPIG*BIC|d8nI-f3++vIGwWen^ z$w*AtFSqi@A}xtB*=L@|HQ$R%+*d5#5mgpn=9krGac`%;a_}#!>CXP&i*H@r-!JM} zzpC)U~(unW8xow=+Upg{(G;vN=+im)8!c%>Nz3#ygLIVDrZc(cVc@%0{^no_lu*IeC|t! zZ?`xp{G@JI-XG^prn6Qj=)9|+c-TJ1w|?i=|NsAU zuZg-Jcg0c8mNWUym#5|(Te(h$tiPV_=JtQh`LwU6SN`k&9y+h?Yu&dM^>gjiZ0qiy z{~lcUJG@rpe2#5+&ido;4==rS>*ns;UHdkgO21FdG-24k@3rM}^HYX(8;&2EWpi++ z66;O=SWDAqmo?wdR9~uorjw%JOCEm8C5InI@kl-d?m|GnPf-%*3OK%e+ek3U}Q-c&Q^_w%p6P5$i? zz27_c`ROnF|GxZl-Q@Sjw^x3d`hR)8W&ZOCKNsGu+kX7xllT4e>~?Sb{CV}pYk7S2 zdlefSQn#sZyudOuV*jp7S<2fz<{v)CpK`hB>ZUi9_oJ<FK*r2q{Ms2mfAgk0d+iD<;&0yc?2lL;|1NKP-iijLnQHa_>dFszpa)_GVJlX|IT6F?@N9cv-Z|RY2H5?u#A7-*3^y5 z*H6Eu`|9!A?dLCFpOZH6Xkkcwie2pfH+HXne!QO_KmYNb>%TviR@Z&|bwmBD_jil^ zZ%wsN9j`6QKl1I@_iAQ`2HAyts}I_rS3aD7xub0Br_Fc2GT40I@As|6PwkBH$8V7jXLh3NPz_>^i&D91nU&b@;EV?qBwM?lJlQG1b36RehLs^m|(U z`SeSPFP#{BtiEgC?T(z})~>a5ojljqj@F0vBLAOPWYyY6#UH;~wfAYi`P;9C;*Y~@ zqAyox|1GQj`y;&X^8eB|^M9_2{+_(EfAgC9sI~W(%g9yq6vw^$zWr}$l>9uKs^iH= zXRRrXd4E2xdh?ChUrf(RM!i{gzUNHa6yGR=P}zERxzerkCts4iGr6rPGxPDMXIsKo zTzFEr_?@5V#XI_WdL93*J%92my>iS?wvbIcw%h*RkNiu0+RJCoyrBKU?Cs`x@ABU5 z{>9i6)X&{{-_`!@m5ody%rrCWYHPoHS>s(1h4yYbWO95u~?J8E=O|4%&Vc7Msy*LOqTccsO$ z`~RNgQtQ4cX5aMLD=++-F+XJSk?V)cwd$2`|M~v&?eV{VTL1OhYBR2>k2OuD@vY^0-y%1doPXpryt&PeOLIFj&GkH*K~ed z#wysnW#>KNXa4-B>f6fq@2<`Zoi+8|+U{ABPW#<#YgRD$IQ@1#{AZTabhQ#I`-TsE z^*i$ZKGiv1bN{r>`_s3sR%}`KH>CE@wqF(2_I&rcPe=d#nf>=)^7`r9i|yV$|5Eqz z@1hguf7O4!UiZgWe)aQP$#?x+JC(2Bzsr=8Sw080TyX>}^D`f3;zuvs@ zyrOT@tsRFhZt1Z|DQjAG?Wt#WW?te}$*}Dp;jXvW-W>n_SLE_9{iyT#uZ`+HudkmkcRb?w^FMw2(!cNcapA@D+nV*i zKkSf+{~m4MWv3SyZo7Buv5)U{@7K@ruD9F!EhC3xLdo_=$B%5OdATZAHPfy?x$x^9 z>94ujGGAGr8=p_iwG;ZV?QVTr&c53>?{D9qyj<)S|9`e}H_!EkS1qjAUwS(3_&fV= z_Dbom>ofX)?E58lSAW%FmN{|f^Dq5qw>xL?YmbfhmzV9<>-Vp1nz#Muuh9J7_33{m zeU{gszqdvx|GHf7`t5%=*StHu^@q%Q<^G-T`g_iM-u)p}`9`u%JL${ZzZIAKlUV9s z7oER-!C2wI#x2}`>!-!DNq0|s{bz~Nj_<*ijJLiN>3#WqvLLU1%Yw_DFTTI5%USK8 zxi0ybDN)+(&~HXe*fRQH0-*@eW!l?zuEKIb{0mhE83Iv zz1-JtE zzxRLT&;MQeB)hL)`|-5xiCe1ne0{mx^z7ByqJcIdZr8sr-CdABXYsI|^shnJk z6u#t3x-U6*iW%MRI{EfNc6(RT7S>-*>kfBkKc8%RGIDlOUjDDG^UqnE>&>{mRy8F) zXP?0Pm#Yo`na0%HPCNZ|Uh%L07xqTzxW+BgKjZd^f49s`ccvv#+ihnoZmoM2{_?i$ zk(KLTT&uF>yFbhD*FUY0@6Ug}HoTP=|N2hNUzw-gcE9c9XJ)U-`PKjY+QXOaau0Wg z-G9ILTdvK#KR>RW{x|b{aF5*u>o;?D{eFJG=XqYhk2#)~PJZ2&74O_z|NNBL^DTeF zm$`2*Pcqs3wovgScktiOkCGmi+hwT9voHK#J5lg=h<}U8;=J{{&-;6=-u(GYOULd1 zx79drX5U@Io4acLbB@~H!$0_6U*0djBy|6WKeN&8*4?(RLS@FY)THZX zzI?o8bH6-ye*E#*^(E;xYrdy0Y!3X8Tt8>k@me0!mz;({XaLXg4O`A~%+Ipk zDO@{q`d{79yuUWCirfCKj9Yu;nCtYj;Zp@Rr=Na#rfmP|IPG7)cgH?@tx1i_rGUwF|;^sHy6mZHOSd}&)#9*DX+6%>g#`&%gMjb+x#o%Tl8wV z^S^h-ukQCh|6Tsy+L~|A_8%{ii8q@4cSE#w-u$E6FTb`;k5~S^%Xj(doTgA=@zZb&Y1gm@9BM?Ece8n z=l+mwe%o$)m93n@zS9q`rM;a#+qCF?@!kE)mIuzOTw}lN+ZqJ^py(ukX)|_4D(WU;O>^&i8jWx5-_Oetq!P|AV{u#6F>g)Oj z9rs^-He179^=?#43wSbnk?oIVKW=`iteL*#`z7Z~Q5W*|`(0kn)qiho*oPNK0)DS( znxU<$U??s&|0(Nf7p+ZlfBG}*<(&RRpIP31qsivlkr|IFzXa}Hb*Y~HNZ5S2O<&Xf zcRXG7^%KLMl!Z}OKc?*Z`t!@5yC0*kyg#lzPhP)%yG?!F-K_NKH-Eg`tFM1|f4}_i zzsax9Uav~q^Ta4R&i~%EAe)$kn?FKGPI$Wt_ME z6yuUv{JN`q>Gu=$q5W*%+Ui~R#y-pb9JFxnrtrzUOM>RlJF(22hw0h;%RgnW92QU9 z`eXmUxFfr^uATAk?`PBgzn1?^-TrP*s+pJc>vqBEU$3*5cgODkUU;egBiRM}Y_tktY?y{o2ZgMaS7+m9V`zwTJ{&@HpuX8OF;=M(c5ODeyX+R-9+?6SS> ztE^oSXH+izKg&GDtH1n1-X}#~>-ER2h1|~zq_3K9UmH_yH+TJ+ioc)b+tXi9sqe{t zu5s5qG|ug=}vP}(S{UzzI^?3k?;J|&bwQlyIlD9&-%w-W7cPU`+ffJ?cFx>bj3VUR@hqy}o|xPu1&}v-e+r{`ueWV@?0AYu`G$?>P7GPZs-RUBvCge%`5` z`R%jZ@~fTg3n%@2y8C;6_|YIQG55Dg7nmQOGbugUpK^dl`n%ENFH5c5o{FvV@K65H zS(Yn!W^=jS=2z?IFRadD-1XDvi{xf0AAygOvS+n_MqXg3`}271?Jy<{dY_AbsQ7r)BQKzn|UgIaVRfJnQzg z1DV%y7fAk(nYOX|e_?ZNWxra{+Vr*3yALlgw|8qXJ@(Gl%|!0FwAzIwsej%qHoyC; z=WF=+i!Se`sZBq|_pR2r?6TzA%F6Xxn?mbXifov_vhz!pNw3{jrhsM3Y`>=lL!4gHJ^9em&6;sjltgSGb_PD=it`?D=(?|j8AcW+fEKl-8_ zd;jbGddK}=9~zxGHviy?d*Rv5u2bfkR4Tg7y#IXH*T!`pGk^K7%f8WM6sam&XaDu> ztH(DUoj!4RUX_2$MyDM=v&6bu#iQ^2-DaS$B<#_uKOahd)qP6LyT=jt=V|=v*vXe` zL=NA7Tzohu`{Q=rs+5wixjP>uo&Ms)HU0OUH_@ic?Tu_=>)))Ekx6d;+kHDA!hEss z-q$Pb{;Sp4XT;P=7flZr^Lu{a#rHitr|j?k{y+0nVCUlLDLajv?rUed7R|c3QT}6G zXQsEU?U_}d9(V88YV|v-v+MExZ#DOfL$9Tmmt0P6bQNA+C(c*T9enuxyz_>0_CA~@ zl)2~LwW~SJKfB!$5C3tipPh2PNTcLxoK>zL`)2XFUpvpuH2i$T#DB7dN{qz%6Vv8h zzVe;t_d3JdU!)RKH@lwOvs=qjxpKdX*R%C+d|DUXSd(=qPGfGJo|913q(HNGKFAaFF_)GWp?b)LJUP}6Z(B!^zKeG4Uml40+lwLinX3e~s*{?R&cYhW6 zzk8PB)3jgza@S2gzxn?k{nL{zUj5zn(ssk0mo>9qHmf|ZD~()R^ML(Snu)~pnx?;g7Y;cvofh`_%gDg|gKNQj))NbvOB&b|m^A8R0vK$V z3btR;nwY@Aup)NptkuPqqP(TGQHy-eJaiW;o_gBY{o?D*de)m$TUWl^zr88z%H#0T zs$BU!m;b-sG$XPj;qYP2!tB(|eCJ<>*2XQ{Fr6b>`1h{$Q||~pSnKj3^w)vnzOPje zUf&L?s-DoCcJs$kVHNvc{%yC}w(f2%V6NBS-05}Ay!+V2>l=1%nVh_AWy{|Ad+hYw zP84q49{w`eY)a|5gvk=WziSFd@#=P-{N5&P>^Z0B<=x2M7oWS|J)16>q$(S!CKZ3n z(Y26m!917HziA!PfovWVB~w^hduM+Y)7(=P;$V94uIiqC^QdbTCjI_Tt}fV_vgFD7 zO1a0g>yI{nIr-@FTp8gq{-1U6AAisKo3{74^4InLPoCPQU1j<9=F-P4>+yMG>hW8VJn;`B(){CmeAF8%)Sy>so(Qx>Z?9nku_dHV9YbJv$|+hhLS znmzj&OU{9F%pdOC9sly8-A3tmdHVP1L5q~*)_Sg4TWAxOu3Im3^Zj?N&&M;q7+3!d zuq`q#FRxqblyq1Bz3Q5!A;O0Dua!UB+|I&zN-@bu?f$H@m45X*yPs`(`Hu73-i>Cg zrSjtMuidHiV0qnk_l0lD|0;*c)iuu_WSG`PDu4cebH{|u*IwTKec|^T^*MDf&)LtL z@BHoDy_!@%x9~Ev@GnpN{?-@8ytCbP>P+}S_J6PD98sOa((rPt<>u@NPKGrzpFe*8 ze12iB>BqnJ-%s5&h^U^V|Mp;H|NQ8_-?=Y)PCt%LXm`DDdz+v4h4Y5l*DuXjznFnF zi%T!WrZsQcdABcV0nE(H*cg_4T*)Z^{`d7|!fGrz3g&M!nno zeKv~g&j+dgKJ?w`c+%uj-+Y$Er!R<4>zaFh_U3(S?A(9r%iY^#xpj%z*?Cowp7W-+ zdsUzMXRZE@|Ng2zwzmDgn;D2|)cH4WFpU*uKY8_|Dm}^rFy*h*W3*OW`5~qpC?6SC`&B{#?+kt|sn=3&WK5<-b{u|Mb42es}#nv%5CGg6?x||9iUr za=J*_<@)(M>i=2m#jU=wX_LRi-ZB%n$%V;&$FKP}mCpNF`up+5H-D%6{x?^!=+8Ty z+RD5)o4)VyU!Tf(ZqfSPCf9pqr=_%7AHVPM+gTGvo?{McePe8Yj)GC+~WAC zqxo&>ZzkHF%|Cbg)Y`(>p!$Bhc@`bmvj?k=`2+i;ID`_#iD`QLXR?!WdTWJ|xR|F_Rg72CUxUyR)K zj(fMh{@#sHOe&}6z^WyH?amQbr=XCbCczoNfZ;y9N&aYb@ z&!=5J`LV}(#TniF49xScm>Mu#+2O{>z^2C##D0R=ftRg8%OkIOb@Ws(PX>k}r#m}3 z7l=7)PpjS}eKB#SDdWYDE^gr~b)_QX)MI0BB>&ydVD>+y%5R6>TU)QlP5XcAR-LTh zv_MUTb%&B&Ug7UUsj+Q;7yq8uSnV1ezo%9uGDhOIZ@A#&SCJiFeZMw6*`!mud*kwkgC;xI82IITG{%Py~FJA9u#{6-&YI?q!lHAQR zyU$Ng>-^JN@3ouf@c*(IJIa^lE|QGf|8(l{H@CyL8LayGHZsU>h4-x^|OeL3pauV+)`wx7w&{i}A}=;+!rYvT<(_Rk6|ar^O}?^ffp%lwD@qj$wL z`rns}n|~@~)8nr8Rk1(6YcuRS6>~uK3kyTi^v(NPpE4NOe|sR(Z&0>*bNY+yfnkqzTm09#QptK@Khvs$BmULfl-Q>wK}pF2JGZ#w^l zngkZTNj2XE_+2=8PY7&$H?69iQFZbRrNWA5CFkl(6MoMQv-K=o?WRBXl)CEHH8rmm zPcbhIKK5+(JeDKZumt5D7WHBt~d-?XRy5-8N%k>^DJ^nj?&-ydfpNg-q^_hL% z_Uz{!8OJ|+f9L9buQs{QXKl(ORx~H6J+l`2_Lk+f@aDq$ik+*JSO0vv zB`0%Hm94;L4g$!yTYYE zXer-6ReN%0Y5jR``?Kff`{%t;uiSY=V4k>O_36{Lh8y#R%NCpW9_lxhvye3vKPT|` z<{O1y5|TG}n@;QLeJyw3Xsk@id*z97C(kc=d5zU0`6D-o(P-FwtkH>Bfn6cY5WI-zxs(uJpXC?Wfo2u;3TL^ES@^ zR{VU|>1#h?4Q{xsI(W&^@FKr&Uxxp}uRm;giwqae$$xY3wI_cUb7tMT!*wt3y(+0J zn(R<`H~e+xUjx?Lt8c$c&vm{2`ul_bZa+>P;`g!NRb8)p>Cm@Rm%p^z8U1C6>EC*d zDgEu-(`h*zlKs2xMM)$U8tGj1j-4)`v;X1$bzAN3<(&K1RDB^v_Doa#yDjl~QQQ7( zN{wAxd*j>w?&)VAR8O5ZU9>#BHTKWst*jx@IW^Pv9aCOXFMdxteQ`?C)6?%RZwjB4 z8Flte&CwknHfMd@zo*`2hHLeX+U4)>->-T9BxL9Jr(5eXYUYM5pCchJZFeKyc3+H7 zW4*`ht9cRsd++G7|BOGlIq~I>q&>T@uZ3{hBmX31sUJ>Wv1Up|)N6B>%`SiDoZCJ>`-|+8iJkS&wp`!s)Qfj5#ImvE;$hPmv`|RWH zZe!d0dPYR~()WG!uOFD~`YXHq%!)3#&pW^WKl^Xn_m$7C*GWg)e$B1!-@#^duXakY z?Sk(w|GfCAI^$YVQNj9}^b8-n*Jlzh{uHm@`LCbxL7GO$-COTl--uiO4YH34e_sCW z`_1B-HEGA=_FC`nnvyUxV{AqY;k^WF&_szNM@4vrj zKf6&Nu0D6ZQCs>y1Lbv}c$(J#JXHUF=IX@zJ^Lji{#?_4G55d!I!(qsR<9SSg&&>U z*rOHss%LYX;G?cR&Y{2Wt~cxT&#^V{=2z=FB+B%yc-Lw9N6-HM-LLm2Udnc@-0c&O z#08$~?+f6oI?w<1*2kOk_$#m7tDJNH_Tf+E#{0Hh4{rTnQ*V|k&!;E;U7WY*r(G|j z8AFcVLtn)!J30_F58tbLfjj@~dg**T)#k3**JuHDB@9hVNlZpWCEve34Lk<=NW5 z-23;-?-z{y#l(;k^wd?Ze$%V?mdkB=XW2r;#53dmPXBr^V~30U>|@Lu8kn7uKkT^q zh(~z7OgQWQM}MBzA36GO<&2IkcCRMy=5K!)ymQ8mbAcZnJ-&b8p6gWp|CWaQ`xEa! zpWC5svA^ouYI)vgx`F%5vePdx?D6}}({*}JK=kZ@iok-<_(Q2({C~bBKXEu%&-{Tw zq|e78>fucvzP_wmulg4k8`Ma@`Dk`2rNu+meYgA(g&V~ctGC>nUDWvTmGZUC=Y9Vl zTwEY%ncHXj|K7FF(YJLitE){{p9)rHXmPshHZ9@Lqq(cDXqtz`JZN(L@qdqfZLiu( zz6>P^zh92~zYEVwtKNPze@^MC`};QA&;L|k`t?rzzm`8vJIdy0Y|&0U#ht$=T>i)= z`ES9Ae)UIBS%*LW827&Cce(vs?@wRn&0W9u7E_Md%~&D%)7?*FR$tiSd09|=P51p< zdCC3jmQ^t5aj3FL^t;SFaOv~i_kZNRmp|;RKXNd%AiXhqswA(_+dCDPsy@C;_WXYQ z`|J9r;pgk~UvHj%Z>RsyC-?uUXVyRZ_T!oB`PKEC#g$ALrnsFipZiOMx&1`TIsF6c z7u^Z{n>gRrw%}H`&gr7sy1G9FR&IXp>i1u}mHn%#K6hR3MD~37Q?`Ap|8LRDK6B0L zeRBVe-96{`^mBZ#=`sBCw&LH9i@S7%qJG6DM6Fc3HE+qXy|MM3LGzPiHa>5OuXw3B zYwJ3>b+h)}cPp;Eb@}PCGo|*DVT;`S&u<%f^DmI@7}R% z>yE8^_pe>HWzzQgJ#)OKTYq@3^sdlq_U$-l@yLQ5r*FQ0f7)*EoyUg1ALjlosIU3a zFTebI%@zO0+rL`={#y3i>fhe~Wk3I{tXZ=>-?shpQu+IPQfj_E-+q4mU&;9CFE{qw zINV!UVs-ESBfDvLBN(4#MeoV_*6}~^Rr5h5LtksIB_&~7PkjCn`1IZD`XfJ=lpW`h z{v5G=wbb#l<+YIxOY3J%U|aI+(*a=>37bysFZtqPR#%Su%b)y}HMK(Rw9ewtJu@bL zeE(|aPd%2MJA~H+`%y+wu#`?>oe;p7HYM>$NxiD=X(DZ{v@*zxQr&m1V5j z{=L2R>+fHC{WJ69wdLu@zb^cpBXP6vWPRG9Q?Kt&wf}Z?^@;#zrUx?){#5%D=)WoQ z_%u~nQ^B`YWhY1cj*HL5zj57Fcz=<0WToj^=bxLc(rmXjv(?`ens#GXU%}K(PwE8D z_8$Muu_j2r+~7Fp^S^W6$qS`FW`9;%zd!Grz}NNq|83TNvA3*DSzS8Y?_b$Ji>TjU z9&i6;>7OtE>z7uToqqrEk21A$qIP!wy8Lo!;ij4gzu(XP`rxV9@%0rc+fJAN>7D+% z`0wpCTd!W&z`kFwx3MVm$+G&qAUS)R`=@7b^PMW6zAx`=sA171k??k_)ziMry!1nP zY3*yPmoM+cKe+qv=%NIPyDN8i?RV&}{k%)x=KK1<;kkdd z#oV0JwlC$<17-1RZ;na%WtBRYkgUqmy>RsAyve48Q!HlW@#L)zR#I8c z^=Wc~^|k%4Ppenc>%KD}-K^!Rx2n!tS9_#(|Y=Vspj{^D%?3jV!Udq1mw zyS9G6{P)?*r0-hPzx?~4vgh;C?-w1NZWz5WeldH|$6NM2drS{ISkM<(4z|rsVz7yMFuf z_Ox~W=j)#=y_x^|^PkuAQr|^?{1$25duQ|e_`U1Diml%H=Fa4gT~|NX-M2oPyY}f1 z^TY}A+&|)!L~g8`xp8iyfJu#k{nh_DuiSp#b$fe6OYOMRndZD-E4$wn%g*86{lz}x zw29-b`ezo&Qd2H#&u2UTYNE;gyJc3tJ)Unq7yhVuOmL9+VDtG(oJNu7c*za!qx5Dn-^ZxyE-9N5By|w$_x178E@yB!K?z^`$ zX4%)rWzpHUrW^LH|9<+-zgxv7zb`&6lMK8*{i4iozuiACey*Pv%UY6O(%Q6j#XhN{ zTK`;rzSR5ia{Jk*JE|SO^S?8ascHf)x{Q8`^`=f5oKK)|i-o8ucZ070b|6Z5+l|^L2&J8Q=r0=o>u4XH@*Q?mF z(`n!ABRR1pOAj*cHMNr|^_ROBb7aN0)vZdp@i}E-w?8b{=kB-T)ohpS5Gym|Ut8)o)K3H!YTAm=gBfdPTOMkM4z)SKdZWsSZ?c_#U*i z{>|SFRZljq>3{V4u65eixHq3S*R8JqZB-Z7BfrV6Pw;iNy#3;@*~fI>eal^+_Oy1t z-17Bd|2M|JOE&7cn!Nn>slD^xzm}5{>Uz#4`n#n5Kx&l1H%+;Ff|6ffsuXrLFnVX- zE`IDRc-HK=R@bgqY`do&DR%P86A}2T<1^>Zz0O}(KQ2CKa0 zZr|7U_{X1LZ~xT)`d2u+ZeHDL`S)w>)8zAd)#NVo`@VmET4#QB{JGUT)Mdcc;=s^7WQ!-=Eu=)vi4r_4*C}{&&SQ{N#T9v$E^2l==JIns4vc zShjGnId>kZdUcnrT=FyL)g!^p*$eBJ3;fTwdm4M;dV|&C9}a6=;!g)YzG!NzlKthH zhj*&Zn@1T3ca+-xnDxD~yCG6yU$2+LqLte+uT1m)ckihG&K=*s>mGQb%&^8wU;faS z#rkLBS087760WrJ(%;wiHGfu}eU|;}+qbVd|Mu-)FMs{>p6vA1SC>D2zW()InZ5V* zK1QFZS6kD+eQ%wCo^8y#z1#iz|5mKK+dFwzU{A4e)WyZWR*3N~+j~zW^Zftc^%srL zmbxaFa(0z1T`uUj`E=d62`3}oVQF1GSd?X%BY`#*L( z+IMf?w9lQ_W_<}iA^&(!{TzM&b@p=dk6+Kb8U1paEU(ZKrS#mJwLe>(RBu^1^V#by z^S>O_9HTXTvz*UjW$WMde!ljnPp8kyn{cfm^}yG^)2rQGE+1a<)4BQ5^(pl!Q!W+1 z|8m`#bL;j3!~cyMuCW{AzwW4PW8D(=Uj4&rpE*HhtFNB!-TP(5+KT?#z?!XD$M=7G zzP6_L=kGVBbr$F3))#6nU;niJZ`Jo)Guimdn?#@Id@XrF~5GA zzB_vE_~lu5f4$CnI`2dG?d-Mn{HN?cyNWW*lhNCu^SSSYw2A)ZS(Ou4N*TR8?%0_g zR+1gcVkl##BKCRuiHNQ5{-?QLo$)l03^`(frqA1$XGY3p-Zn9Q6O%x`h`WiyVJ0G%4q&&QsOX3gVmm z*&6qMf3!=!{-^WJ?Fx6y`NWrtxA|E+h_1Y6RlR44p340%uhqna+`pX9;8Q$FZEpGSwt@CZZ*KfM+`yulE-hYv| ze;?-fb=RtH=OqcIsW&$W$M~Oe&Ab(AtM5LqW>t3Hhd2HIv%Ww6b0l-t^Z7nJzgO;E z@>j-4jepryKDSLJ*X-8w9$A_9*S@ysX}6ip8R7VykN+NA6!mLfy@b@Bxcl=M%HwAQ zZQY)J;kv|`ZrPb};^D0Xa7e@)=6w+dSE z^$nluE^YnvgiX>^^&(eY+RF5J-}-O6Jm23tw|k=K#3NsRU(5=5TWVkREk8`m^hxRM z(0cXy&G+i(*T(G=64?^=-u~{7%iNDwl3jY9?l|>jai7DpU=dei=C-3I^S>#J)1f0=Plukh`ILf1cs*V(?USzEuiU^apFsycZ^2)IFd-RhlC%$dCwn_r_9waSk(Tet*CmxbAQpsZ8o|0c1Xw>mDt7ZiCdsn_>uk9hcJc^ zuiMN|V$a^4V)ng$$CrNfp8wB3zmK|q^Zl>$)mGst+y4F1sk^cL{B)b{_|x@vd$<4X zc>Z^D#_8i3U-w0Ce|`Sr>tC<7Ppp0O%J2mi+oFO=$&VM@9F$Y zBK@bs%U}QA7kf@A{4`hM<(p}@9sQrbTqeoeD(Le_VVf1?ekpsn%4c!dRvk5^6QuP_hNgzOz)y&wu*2 z@#?Rlf<3z|ta6|Gc6qwZaf?q*TDyMrg$4s(zpC=^U-=PN>R8R|zs5aPSy(*pbj`<; zI@c$&T))M`v~@YoW~dV)@TDzl3h4f3*4fadZ8w`o6mTE@9{F zZ@oMIWMh7H>YeE85dsD8^Z9$kYXAPZCOyCYO}u{2hnnk0kMXRXbK>*D$^HkYN#=7% zb1iol=N9>Q{cQj9x!SRFmVR5}U8Z(AbMfxuT2G&?+ugq4*@e>O_Dj$C&azTsNlPsJ zX?~yO*H4+Fw%hb?ux{YY{UQmPc|BkMU+#SH{~ve%fBWtKdjIUZukQa}E7$(}__Nz3 zR^3;RfByA%!>qk>Vaq%JEPcQ4_Uk8i&OUwq+G^>+CGFc6AA0nN_TdR)fDy`qSU)Zv3Uv&-N`qMk_u3`PO z;rm0;i}j1Mk39O@Sw6e}`p&85cjj-1xV>rm-t~(+<*EfQ#=d7@UKh=9_$%|V`9DAW ze8Bj7=Jl=0J&EkRSrYOM+{_J3%nU!+7!-IJ98T~y>^5RxIB2f4S&%PPZ|8Qa?XI_) z1LG{8yq|varopvmUsuX`xk;+7db3g6Rp0%;?u~HsmL%KH^?jv#^7 z9~SeyX5M#`H+MF+M7^FLmVDfAdcXbq&F$+-esC?U|8nVbuW0i1v>RW}XYRB+9_oE> z<>zzTLo(v$ZLVr<=FpudwKG)Z=ug}C_K&^lVz;bU_`6}!y4ml#{#S0*JO1_6iwD_B z{*QhfE&qIBz4v^VJ$@gx>ieEw=h^PF?o;W@>-%5Kp4z{1L*e$G%qwnc^+z=9x@YHy zUHD#ZzpcF4^@O9J;qB{ByuR@tmyXKd%3f;v)}!!7ppoP8FubxopAV?NgCdJ99I1~clFe~ z4{^dX)$88X*gsieeOT?3*6;049|~`{u3m7Z?)$%O@3+^U`1N{c6hBY-sqR$XRu~xC{nfw1Uvux2 z%?(qRW;2G3^=De|9`a#$us&j!g=~6l()-79-wI9IVhWC5N_cDiK`{GG-NxhZR!fU< zW%2CeZV=O}C`~)NEKzO+qk%YsfgTqFs~%eee-HPLD-sM2o(tI?$R5brmN$121H+GR z{R(|c-+HY--tal6;!$DGLh~!1_OiU*nfOAtE6K3kfbjGogvHrs!FHdw*UOz+~L{gHK`ANdzEVLIlQoZ ziQ&CFw=CEGpR#hAq4>(K;`7s*?wwhi5p%`Q#8$PGTfF>x6Mtm!d(Nfrp2RBe-TgAm z{(EXJ=NtdSv){{EUbKq1aHw8q#+8{)@dER+Puj1&Xz09i<|@7YOV_c$IhM}SA$IpVo)zSCn)jx?+{;K%q?SHjb1vf3;y!E+$ zapJm(zFU5JTeNfipUSYfXHGa@t)_SKZO4eKl2WVNea~Jpsd!n>xz=Und(+oBKmFeI zPjycdv&*&K?U38=#1>foc&=}=Mr==%Kx*sb^$FWQ3bvg}yZ`|4;9ZnCVjj6joH#&YGoH4mYN?c zV_T#1HRS_a%8Kc|y0}uw7<%RmJ}_`<-Lq3%=|) z&wc2a&eSW75#{nuyJ~)X4Gz6o*O+qP>aJ+<(mZE4uHM;OYJO9(Dfx&0Pxo<(faIx#`#6tov{?y>8Rz z6_pFJersL0Zf~2v?97FCKW9AMaR2!F&h(STXUdnoSs#C@uhRb4hItXk_03m)PuUZ@ z$6vAD`*okuo@sv1qg|XzENt&apX;4<@5E{&_WB~*ni^x@H8+I+&Evc`Rb|zu$48$$ zc(dDX(@P;qd)axa>FajyuHRenGs(_9Q?`j!@~7LHn_HU1Tu)`Xow7flW7)2%FOz%n zR@w=jCtDceR_Xi@3v1x?*?1;0-kIN^;pKPsiTr;zP1{<1(%F+w;X@pI>F)dj@$EP!hCLL>@kh|Qu+AgRO4eE$;tKB z-+CA8p8Nd2{z^&eyzN^0TT>!-{*|3u`}eF_J*%&t+PBvi73%-ieti5@+LPV>;?6AT z=dXh8-oJE>jY&x?nSH-7D)yPHuyBoBTiwgup3ZB2Uv4bi{l!_#Y^`3d@6YWod9C(m zta2`V==wKsPLO|0yy%3-+*(1+X~NZEkwS&is=Zqj5Q>;?9jHOV-rryZ7XOta|DH zV&KrQWL-KR$E&?)kre8Lj>nGMjnk_6y&i=6#y| z`)up`^`-f7!M~>cJpF6;-lywV^syKD)$r!Xzc5amC-CL+-|Q>jQi`MO>r4J`sNY-5 zD6sF@rTHoSGPPEU3$E`v?s@QrB!Afv`F8K?6=kpO^KC2drSE^wQY4tYYya<0#&hh& zw(UETH}UDrXZ@@HMs~(eUy=FXdhhd1wRVzoe?KstlPdoHbzJJYv+XBRG$-z_xoGnB z-Q}&z%+0Y((WW28*ultt1xo2KA!}NP5RquaiCf@rgmr=Ffj6sCUCOh>#_saLn@?{yA z3m6Zx{zzb`XV@ezKf$_2f}vr~o!|mdEd~aM-BWkojI7$VV(mk_$JVH&Gh)X z^v$+xUg^|s_S0{+b0`(>E0~&Lptfl4=SSz%_gDPNN!IUwYPp4kSvrFnb& zOiR60^Lme*TiNP@^Ipq^RkqsqoQu3xtz&rcxbC71^MzN+cYfyA4@**Y%5o1n(%W^; zz0xpt_v%nHj;QwZ+rQ(cpRdn*6~Dqq=W>Ca|7-Ja&F?0BiMSJ)5+k+z@R6NP_oqFt z*mU~Oi`5^a^Yd)$mt8z@+2U-_|)CH_~Y}|Pc2>_r{x~-^+dh< z``-`$z0LWvm&0iDr`neE?Dyq)mH)ozUr>B{vh!;2D+ArXyAC!4?_K*n(6KSq^_Oja zrSqFRmuLCRKjX4bvOsKNZJE=um&@Hww^!P=JejrA{Yk0+@pn(Izo>s<^EyL4|NhyE zKcTy8KNU|eE4!TNzq+_GZC`oaqK3~~mMt@m;;aA1+j67SDKwMO;Q53d4F7)3d7xZu z>Y<=kR=LUB#h^&K5zO(nl(FMQzU%ar}q?@=PQg3nMrdfZV?~w9+ zmwdlha)lv-cqmT;zr^<3%z5mlN7X!M^USY zy4ZHJ+5RH+r=KJ~t$DX?`=4bG>#nbq;W(al{N=TPI@JXq*4-{;+dch2>VdlQ<9qLh z6i<$PZF2KS^`pCAa@cQ{cmFfXpTGWZgTTzTZ66fpT1$VMCoOh2I!{l@FyqktvNJ8S z=G2u2mu-B>xsq?&wpnwkk0fk+>A1b}ylif@}uga zHoIbd9pt@*!fGI zeIFlgV;?pD)^>0Eb-zyT{ZRXFUHYkV#e`Z|nEV?6mkU zCpwcSFX{gK=ig?Y-7mhWexHSyeCe+18zv_&3GI}hHB&~ZR5G?T)Lj10-+Ki!w`a&l zUld;-yDchz)6%b|Z+1Uly=zZ|T6+0DJKakXpX#-ruiJ7{96ETRju^ZUWME*pvtBMp z^grm#(6ImiWB&gS2Jg>^`~N>&j@$Nz?K1P`HqNB^>eVjkmpwSzmVf7yGgOMdwD#Y> z;_G|V^|r@kzujM=mS@ZQWL`pq`vXfRo(DJE&&nvzkPP@ypvA_pfFbEXJyQ&`T};5F z-#ZpCR`4)5ykf{>5%B(=63W29Q0Vr{e!jnD>TE0h{e4R|xm|hpf7irdo@mbrt=n(g zs@}dgZM|hq?t-%sxd--DspKp^7?S;YzSfS0tzN;a^`5q@c`I}y%=*Io5}7wrlaE^X zT>f*}HaPFiw^&!h7194?p9iJSKILEkZo4q&>Zc-Cvuz7z*q{AV{b2RvH+$XVO!-!H z{<(2{i)~U~^V7}e99K--Kf%q^;pL{4l9u-_`Q+4}{{8U^@3g}ccN_iof5I7C7H!xx zbxo}L%qIPrzbbg1f7a|yf3kk+j|G#eC!}w>y@~VY)V&tsuWQ%8eBhV-<CyLW%jQR8Wk%WvA`d@Ol( zHkxT&>(0H$pWi;d@Zo&-;}iF;di-Il{n_{5rEOksw>Y)me&+rCXQtK6d;j}!iu~U- zoae8~PLHpvz5n#Lio*VBld5xGmTW35J@-6U%;mOG=OX~fnFscVr!+jDeOG^`Kv4%j zV>(;6aryBL#qNJRUO)GXUSGfa+8Ob>ch@BDhm{3u{STYjCt4oZIF*}W-Y=P#%A3q@ zFswb*8tddA(D1N-hRLya{nhsG+68B&-9ESbd*?CZLiq^mMt$yMpNsZ##4X?ce5*-i zCF6D8XLrRV7#bKGq#iSQ@v_x0m@x1abE|oB zS3SEX?{+T_&6-!>%k@v~lt5^O`4Hypkd80p@Vmst~|JU3&B_QsiS4n8TrXWjmC^XJBEuM}rrOrQAZ(ETN!5BtwC ze$wZ5L8IBYe(#N1)%6jZ^v>LRcIMn)yBOaZ*SidA_Bu^wIhMuH5tA z*SqKFq|deIeC~h$dv&epUcYbO|Ln3~c?#A!iOU$Z{|BmarH*0(4@9#Pn zEspf(A7AV4a%*{!L3dQ&@1C0%YxC~PhMVk<(i8r3z1ZQ{*TTQ0G0V+!<0tGXGTvIJ zee;G9!@pfIM|9V)a4smd?5v)_SD%)cR(IlJME~WkYk$km9N#{t{@+i@Y}wm|H_un^ zZsugjx*n6qAk}Kg+}b4ni(TRXdjNx#1N$Wg5eIe&y@n=^1CvW$I_}ao=49xwn0TSR za)agJy3F|RTWarqi^#o^G3oe%*r@57RnmR8xA0HhRMq-CpyKF`J9VlUmQgb=UM2aIKO{pGks(7>c!u4_rKsjxGVW$xYXUFhZ=NO&o=g0G&O8{zEyMY z(I}~$d2{#tsCm7lU!+29-w(aIUA%FgugaHPKV)1Vu}5$fGz?LO)kaz1q7&;pmHVSrdHkzJC9-h5e7>uCE8H zcI}V(cCaq>|Ne8O-JG3zw)1ie^W+cx%dPwv`uA?`jV(9L z9)8rjzdla>x?{c4m${GTp7?J6JhCkA6#J>`bDj5jiEaKm|ME%kmxcAwe{+vku5)@EOsY-w#W>ksSu$$#NLz3|Uk z`4dO$mg;Sp+HqIDO6mHir;;=09+G~~_btiA{o7C5vTwW6)5Ri}ni|&!?4N40PDSDV z$LUY1%}h2*J@Aa1S=gq+J+JfnsftN8`}ZsnTpE9Qvdqr@o4d+$eh5xIX4Si9MyX8D z44>zxkL<7rOrN(--~Q@0-EFE96OtL_xbL2dp25p-M2o+YQ`dp9Eni63Htf#pjgtJ= z41TRlmVBPJ|M|5#|96b*xAF9f#-c_>g98Ux4=^y4*aa{+ zF=}W`m~75)u(f2m4-eK?)g@)r}n)1$&XGo0qexy#y>IicaT`w znj?8n?{#!{c}SY?Zj)t>;@fBLQLd~x8uaFR)o|`vR|gQKi36Ra!qvc`)zWu|V_X4d0q?{kVV8l(|US#c=(V372?N%T~9{`gGve+t{gI z*UL=ypDmkH8|ysj+`8q59z6&S{l52D&6!&)%J*uGc-UvMef#q@bMt=LU9+QSF1nsn zZq27UDY5A0j*H8=oGZ5&+`hd-d-A#6xqLrVIzNA{=XI7ev3c<9p{&zVwss!lyPw}4 zoT{>eKXEB%L(B328_k;c-EvP#m#_SPqdV#5;Y0QRzY6(><@en4t4}?Dy5-MAYnu+a zeCxULz8}wsJlc}GYD4~PIms@q^WCP_v-+%L_jlQi^O;X| zX3grUtd@GS{^j2Khc^9lKhK@hJ@c7+_|4Zxt@iP(yniv_>(8k7Jb_{1o6b#9u2%7y zbbaPi$46fyzvkyxG3WEow^u){u>6egJC%3E$Fqf3*L-@h^|5+N^)I_*aqrh@vMHzH z_>I*!GcVt6ETbuY_h8z#O-1(>&$7Reu(5L<$IPDjbABdoQrC`jI?Y22;wuPZVb6chHZ3U?w#vjK{ zy_j4WV=Hy`agNcv9XG#pY@M@7X|~~!ixP|H%sD8*nE5=t*YJnoMzcvwQ4KpH4!o01 z%vw>{xHEwHN*hza0!9gj0F4D{8BFyI`V1$dB-J&SYB4i3yzbr=`Mvf;c)`~DOH}7f zVs3Mun0Mf?YW3@!eNu)U*Zx~h->-W0i}Wq0dpRN9?|uJv$;>h z>s7ve+I@iiTUgfWkvi~M4zf4z8dR*Y{!o^z0b z{Mj7I4b44St!pRyKa>lsdOYcJowwWa-tg+z)2E8%{L)R+^b)K7>NVf-uH)3|!*aWF z|6O{zaPQ)ztJmwYJj`|HXLUpx`(L_{6H)npqTSs3_PlJ1%3Jr}@$L@~b-w<3W7*wx zJzwrGo$Ecl?8M`Tvz@PWPdvV)BKOGk@H2b1-g#U5?&RM3$>-mMzwgVKKlpL`_2b_%e}B|e9uxaDk0V+7UeVfi=UKV)|GcSt zG=1j#&0jh?rWyrX)$d68Vf20#%l1z{jddTpul@h3>Gu4W&oUo8EcFRxo;}|!FRyjK zeBqDxJLeo;^L^#7KZo6HW0KZC{@0pPQXumx{@bSg;#sv~8(-{*d_Q|0yHwc6v#tCq z&pey?_=)-6!~O5hZP^`MP@#U`G~k=el*99`dp>w?{6Uk4w@gJP_V$hKQT4aaGbn~0 zEp23C_{VkkqwQLKW`?Eb{q6|wWo)>Al(&C=SaDX>`u%EiBaUo3R{VFHX-{8kVV%tP z?6vFv#~eQ)qrSdr;`9Hi)wi~9eb#oBwf0>pqm*2NvC+<)YgOwQ4ICIRFtRZyFiGe! zoX}kI#xs@oKq%-!fD3N1N6#w!pOIT{zs|OLoAKYIB(?XFbL`eyzdy4)?$y%yLjFCm zMT_@b3jMe)dw$cL$HIDB6n{G86@UH~{Wj{xeZ{BJrYDW3)xSwjJZ!i{K-kvfs^{0T z($$yK^XfV#>3-i_LZ0ld&KbQYesPtLzqx1yMIlu46 z)m7<9+E?Au+g{vL{_C}+@&C^ex6Es6iaB4K%K9H$_+F?)uz&TD+WTiN%bV^xztMm8 zJoz$f!{03TEVrMszGoCzR#&6?dh+FS$NuI-3(jSHn`8Px?n~;^Yqj6y`X4^7i<_zO z{qx7Wyi%%|N7yzW3$fk#ysfT$LC^V1>@&=6AJq!;EBvJWJhb?Oag*F($9Ki)s{ z_qn9*VY$cdJJSLqjP1{sy!F=MeaPn={n_J4VW!Ek8~M$QHR1(Q$;ai>T*Rvz{+$$$ zP&mf6BbQZNsiE%SVupQ80Rag+7!FK!XP9?4){BjSK_oc5{^ZG%p-b09wPzK~P`aMt zd$xPp>C@M_p8vUU?p@9ToAz`1J@tPtotty)-K)PFr!CqQlD3q0LIeA6v-5fRu}dVb zFY*cz(XW`txKieTOp#uS!a~u{?(L_!-u+egI#qr^?uy-KuhU=bUM#RIasIk3+V0A% zg~8sFbS8?2Pq=b%&#@`+M(!{c6YC;_6>dFSp(PSMH7NHR(9@e^T}F+x_>ycYXZ(xOeK_=SKhU zct5Ln`#SfTtcFoy?K5xLvy+b3mY&zMzH$$1d-t24AvU|1$Gx#;LGrZ-PymS07|OH9ht~h;xan%M%gYT+k#wSh+PSf~!ZpMy(x6kdKw={Ae6J+$_fFok`LWqHZ!ENqh z4~hT(|0HH*Zrk+#|9__c|DD0tpv3+EA13x|&P(eJ3w-AT4s1qwe#^yB}Zt zxcvJ4)#G2k{&e1bO=9`I#Z#}%yQ^;>#&~@HFNw)VH6Hcn&9srf7L^&RShDu_j{dZ5 zj|>mAd=i}VO!j=m`T61!=NDz0)gC_|bH@Et@)0TH#ig$;C;2?Se7Ni5138A7-p>2K zZ;YL-nB4#Vj%vx?{_IWl&l7I_KKRrBf=#pNnqxK#Rx$WAvS+cf@z~cDT*%0ucHQRJ zw2LVfFW=;DIlx~1Aw_QElRpps{b*nexe_A+>ftg!U}6<1VmH{qEyU1JwtS~S{mCiw zr?y8v&3(7Xq}63wgyxwSrBjW!h_!U5Zpw-G3!ndF(MsjrHQ%1cKD~7GRsE)WvgeD0 zpZD+8dUoU9{q#AkKHieuMU6=c8$H&qnm;Y}*OK>=6B@04djGE7y5h{+0Ac1Sn=N`> zQbcDZT>pJ>>n-l9Da(Z4ij*3e#QSVYk>Ys2_x`ig*Z+?ndK_IeJLR(4j;}rIH?G&| z5A(^>m)lY2^Weuljlx;?%az|xwLkd3wf@5=8T-3mGT(BX(wcH}f$G0aOVaA+|A}7y zYmahH${b!b1J3TB*Eq}-MM~f}xri;72zUP=;dUxeT!Sj4O zH^mxVt9S0b7j^UUj}KFqJ(GL>^!iJkFuRSHKrS=CeJXJ`dj!@_gPo$7_;rrxe(i zoa!_e{qt;l{s|R7J0q8A8TUC_gj^mSp23u15>mDH0jKMw`rW1f6YO{H5Dk)Eb$;#q z&pz=czuvlk+PCd|Tlj)AKlzPsUY>W&AZyO5`={-K1E!hO{>tV4l=pec{`!@N7frV_ z_^)OE(suG&wu(sO)xUrGo(q|(v8Mg%i(l)sHtn`vc`AR)^+R9G_syMjXOUC>wP)wc z7+P2DSsfC_E> z689-P^Z)Q?n&R}6*~9&wMd+%{r}i~I`6+NN`tQrvk!N}fb9E|AKfH9aXq%o>TR*G% z;K9pv^A_grG_u+48)o08ykmu=@L75B_3ZP%C9GlnpZs6!N&0PR`OWk1&r`p@^5@%? zMf2mfzW#E%>RSHnzV?@P>Gid{?-$+r{qf;(<5O{a_r2R|`l!xw|69}U-@Dce zI&Zl3_l4?wg@vDVt}7I+&G~!!_v|BQoc2ALw>V%0Po7NSy2~ps)J~KCyjkh}GUn&j88U32w|KWi?bh!v78{m**fslQyF@LIoOtRvCq~nyA!ajvcU`m*JYXuc z@K57J{2P(~onD)(mds!D z(fyR?tC?@7ui;Y)`_#7mrg?3n%4hAJ_QBE1X4_?L4%7Cw^C^*f<9UAG(%StA=FbZD zeY2V~@%J5n?}xJS-<#@;Xc*Pmr9emp5N_SJ#CWB-gjr` zRR&&p?2cw>tDU6wuMXILVx;FaaWe#|9v>`CN?ZMGBN!` z-LKytKj*GbJ-GMlU)v|%3)&x@PMdHmzVYWZ8cuq3&|&DL>y%oV|_V@A{pI*V5m-3;lfO?A8=Z+j>vm z{?%(tk ztZEO|-*z!RW}*G<-KVs#y+_LaevwIQH#qR?pY?OU)a^5)e{b?j+5Gd5di%_qzfX%x z@BG&(F1JDFz~9qMHJ^Cr9yrX<@6yP~8l!Q*`J8M*0K)?2`X@|3)~pH%)%0LsNZ2Cr zdLL_B?Q_u`SDIU6xHLCxx;5LgSS?d#{k&(pG>{Hzw%ItpXLZOfO!W(DPGIiZ8T_`yaIMj%{Ag%QI%rSAYE3eeTz3Htx^$FN+>L zIr!B3w$yc5J74ks?DX@w3ICtlmH0eQkbZ1lD)Y#Ey=t%d^;jT( zci*joRZAt7$EF2c`@<$-a#l9?`owMfPd!LZm9VrzIU@)_6A_d@d>X zsP@0aQda&so3;P${P|hq(@&+=kXJp29?c5A6Bj){=GGG>{?gs29yG1}JuUKH{C0)< z{$t^-+9$F&%`bBqTy%f@N8{7)zt*Nt9^^GL)p5Q3Ai1iMvm#XQjbH(T#J{>Pdp}(L z68z2L?wb00y=Np&t2}zSppesGV_cce`3JAszlt`0jdO0A=-%+sX}@3e8-@ezw%gbQ z*8BW${=B+z4jV%P0|Q&YVh1n5hW3c7$y=LP7!tBV*n%e6-`^UY)5(>2UYuhM8&mM! zsLdkU-=DiB8}%ez6I zeBX1TQ@g(2JLo-ckN2A5_uMMU=k|6?xqMI1e}DSQZJWw_Enar~a#^e(rha zj^5Z-I|)7W)wl0hTwPTkoWN7;pW-6QbG7am+n&Pt_ZO?^FLMkJ)T*|gy?qi}=${jH z6)~3&Jh;l0d!9|MW4ZtPSJJZ^v#*)uUEllk@UpM=pDXHP|5i-1pI!GLar^$CE9xcK z(`**!-ar2S>H2$DKCKJ;`9kY^%-43~SN}xqYyOo@6AzyE`ju1o%l?u-r^@U1GL;pU z)iS*fwY@oCX7}s#|9{0EiT|nye0Kb=)t2k8?Y{rJKeO!p$KP?<=j&uA8p{gTuKAX< zRs800ZN)|FjZd)YaQ~Q9=zVSeb9S!xhP(4tR+c3!;@R{5TkLj|8K>KI*mu5&+tFXP zFYA9!=I3(J)soRa1b9x|jM`agqyI-hF8G2129>l5VpEO`w!f7gGqrP+R8R<>%E_{*mo)3PHE-af>{AjfU{LOX!LA*cA_ z`wLPk4fnqXZoY2y?rq7dVHfVm~c;Vc7#NW(fdDGd+Jol}i8 zm>C*se9BaFl}|@Sy{}Kb&)4y!X3=7q=CtAiYxZbZ?4CO*ET*eeVjXv6;qLF&)ju|A zIkeVWeVgrmF2BuWlF8DqvmSi8%lJ(_S^p8oagnQujnC@Et{9wSYk1Kz@!S!C@ZalS zG(1aKDDzi`H%(ZTc~OL0^i*`px;T>^tOe?|f@BkDqB|`TaJp>qiyOMheaMXZ5-4D<5oqp`e#^=h>#28$X|}nbv$aI^uFv>eEj-^+%37C8#QX z+^!qK_eQMQcDbRzvwG2wTYhJ)-*PO`z;s%zT_=KrJ!@wSF1-;C9&_3I?>ykW0C)9-puzV2CA@oHu3Y`OKB%NBEa zT)S15{8qo6P1F8~+V^6GH$U%s8Qof6UVqv9T2AdG(G_-V+fDX)2d|Y%yd`h&smbDr z@J)ZCwh%_S+j}mQ&soNpu*I_J`~fBgdG+64|2W^jTTuP>u5`Ak_BV^(`H4+`zcHLM zk?Lzc@ui&k@xF#F4BwutF3v94#JIOJeRby1-&+}!ts1JE*cNNZpP{qN((R$E zi+a1aTI_gxv>PJMr#)Z9~DSRFmPTk&N5S=ZzD zQc`QL=F~*}ShsSy#H!ExS1w-nq1Pzu{j}{O<$mu!fA){P;@{(EcW~-E?@!5+6O5u> z&2CBF{Xtt(nXx{0|E7A$H8VGT^H2M4>ilbM_PX5qf0Eh8T77A!f7Q-0vtip|BzNZ5 z+r1ULdA=Oq-KqZkvF@GaP4oV5u=!ne{CDTP??))8um2eK)NWPR_S~lDm3Ql>EIny% zkS}{t``LEewMFMwUfCjVI^Uv4-obB+-6)#%pi&qzmfzva_)=?5eImc!i;XPyQ3bl?Fc0 z-MIl)4yW|iMrTd+WMKGme9gs`<{-xpQGE{mQdYuXv620;-@>(^tOMzP`#dkfBTUK zeCyeFANn-c^1Z_34-v%{^7W?mmCq+Hf0eO)?~T2CZxzoy`Rs08j?m+nE349M|Ac3= ze~pjL3l0!23KXzj%s6X~wZL9?rdsyRua{2GQZ30}af zkl$Ubx5u+I^Rb%e(U;}B#Ut;3FtjYW_nf^y_MyRyRR`H7f1lYKRbTdHU#xvWy}?8i z{uCxH-H!d!_Ltr|7FYIsx9{HGZ}E|r3wI}8%B%S0&GPs7E0_H>A8yK59>1K={naJ@ z^W0xixjcIG9#s=U;BQ`RNn)<+Qy=m+$&*WH; z)?U89Y*O_d<^;1v-%mWcf2Z)6bom(tr@v>r>!n>koS!2;cjfOH!Bx5n`swHHXatUPN5a?qzh!tu<3gT|gy@e`i)Ox=+VJCh-xAeL7Ok->s?GEM{)%9_nwNBBeSSD| zhz>)XR_+(;da0ucJ&C+qFRuO1vzD=8f8XXC$>0A^NnWG>clNQS z&v|F1`S#^!ggKkf;d}So?;Dfgf0K+3`JELDE{Z=esbhNAe)>@FF(gF_I170gvotnbJz+iDte5zA8Yt zQ`7EA!4ePKz`2LzO^Z0C=0B~^zWGLQNyglsX_DU$`MGZ6VskmQXP>A4*0jI+(j9@h zk7dq0xsj>*SfRM!r$gO@KXONNQnplapO;+vJw{8l#7Xo(ps~UKe-imB@xM<7+V$VA zH?mvffBSILb(N-$!HKEAc&)9-t_Yp=hJ<~LeAchdU& zs~hANT{@l^6MuVs^<6tF`>@G@roSVFl*0V`L+j=KguY(Ib=l_DPNC^({MlJ1$L?0u zw@I?>yAfyYWE;Kaij`T{rl%_vie*q83N zau^qpG|U;mGtf5&|D1v~$G2oyi->CM=8hV$BqS*z1_XjJ4T=>1^eVQ^pL z%t5Zz4R5YY3O5Ov*#7rRoAutkx9;=5?2PUR?>w{lZq|nHSN86C*Pi2;@%Pz^&Z|Er zJWXm@_^J9!-0yEjvzv>H-_L%{nALHjWOMxKkn@!SU-#b7F$;V*ZB6uxxbnr`>C*q3 zS>NRPYX{eDvUa|g^3f(=+pxEOf#0|KC8s9dvoevm<&=84L#X%rlfds%?a@=^*RWM4 z9{t}MG54vcOQ)5~`Q<_IzAmwO7k} z&*B&Q>u-1T)GnEoeDCY;#@+8r-sM-H6W4#QE1}2z{qq^K-E04qD*K=N^1F6cbNSi& zzuC;SMfbgDIqdp<`}iAnOH)7lyx57iZ-2Hw&wA$Waoz66(l-U?_V_6nI;Xwq=T!N} zpuqXu@ap8$&+qxyO|rfGS9D&RrTY1`ujk!d6!F;6_uZdqe^yxDd(v_3`~ma)8w(8% zPh1n&WX@J|j(?r?|CY(??`s+R58M39oOQpUg73gL76~){p1U>-cHB2?e;;aoY{YO{cE_3Q z3iL67k~Yizqe@Fl=XXg62q?bd|r4QqvzgqI-CI*?+ zn|5v7ekxM>%=`0SyKk3DZ@Fdu=l#iZ496_HCruFulm9yXgsQc~i|_UIix*#G*%tC= zW>CHQUHQ(byS7L~*O?sDyvb81m@=W%%M(n>Z4~9OAC)me&O1CK2=n>PER59)-}`3B6m68*Q_>T^|`1p zf6d0qJ(pj-`y2UuWAynMBGM&$x$6Izy6yKrE%W>R_KV-$o|T__D`NjnKR!CxKeXW1 zzh~xBmA|*Y{Qggl%kIy$kH2?Md-DF5-je#~N7-zCUQLs}{q5K_9qq@Gb-&~1FK^7f zt)Bg;e6>BN-Sd-?jqm=3KKc0L^L+n5-p@9Fd%NyZbZ$a<>)aLWRs0o?`;RaF`9bpM zyk+%wv;seJf4M#LPtvcYiE?7@nOFaWulx7x`uUzL?I*fXGFCe`#~i-KwSQUuB*lm4 z=AG47YWlfqhTZB!@0+(5e>?ilVBw?%q1OAQc+VU;lE1w=b9$HEt%-(fH!oB3vE0O8 z6!Woa*8OK+J_sbcN1vCAuetSmsQ~|j1x)*H#oTaT!OBn{G*`H$b=v`kKNFoNCs)7O zW%_PrHOF3l&G-GapWmfD4d-_DS2@ST_nXs5ihGuf{rqm`*V9=!B#mdpzmK`mvj4N_ ziDk|Qi>8%x8Y%ZmH8@F{zGpeWz!1K_fssLiVZk-f($5C(qUoPO7X7VbVBv zQ)Bg(X}y~R?nRrKCb1^9OT3WP*}UO>-KI4~#jldjo&Eo*_^FRYI{%wFA{ugWwRaAj zoRPnCd#=%q%3t?B>-U~?Q`LMIbt~l72fp8%LiXpcJjqw<_-Uh-=gr#sxD~7YjXqn~ zhAeZlR=K#;WRB0#I*n(W%I%iTsO@O{$20LPlc8^ZTE&O&S<;akwqCvL*lJtdmSVJR z)!jM!i)XONUgU3_@phi1wSmiapT{cmm(IAJqkOlcWaGJ*tt%(5?lalG`q}PjrrR<_%ET~da^S$i;@PT7zUbAnwrG5SP{EA(V-~Bu>TYrtw=Y-e~H45C-d4C^j|NK^X z%2oUOs!u=i<~?5>zCN>4QrG-n*QcX})2|oBp80?7-2HRKbIm`d9M6ArZpPf5KUPIn zz5RDuLu$_6-Ccb(=aPk`tnDm5MdW;ceC*PGRn;W%Xwk8(V$ayt6J-_x>))?(W(9iaB26=QH19Y&r~buWinRuV4|jIN}!mP4X5?GE-g8 zy}RG0Z~gY-?Dm*rA(sXJeEw3O++=uH_(aD(#fMiiKCZ7n^l`rAuXoqKce5X{ZM<{+ zz0u;p2KG;E0(NH`&U}~JApKW^EoVJrR*%$zhG$G%J470o0vJj;uB{SX)uhGAz_3qD zbK4n(GxN?*{ugj-;|s6OzL>xLYM1mr3#8U~GJRj&w9&En>dZ}>PTAKMEmS>{bt@(` z@W+F#HXDV6EqiOCf7M$$Ws2W$h{~1!IsK;P1EXiJ=P(k%<92!=*TTSM>*a5lISGC#Vgqik!^qL>`(Q;AHQH9=lR?k!Sa&(=aKfQL+Bbng9 zL%VzA>W@r|mJfIy{HFGxSZmR2Z+U8HZ`tjkxuMt1@=GMi;$?bbK_eh;(@~>5G zAFSqzdp5G3k9&7E?zhv&YsWV~J!WUo^0T12%BS}4(x2<*mJ1wjs?5Ik_HO!@#eSao zwN*Rj&DuZtbx>WLzUUsmNK>Zd*Zv3G>%ac~eX>jTwfOmjzstJCxcdH0*V(VQb@um+ ztZymh`480cZ{}?K6sy-1_(i#O|8ITWW0U`TdU9}|F#oWtTc#{!sOJ?h(8UN9^){$S&1nh=>7ydwqMmjd9bzas6`P z+3EZ3<8w}v_2LS%y-Qf!4jUi%Sju1~{pDKqotv3vQTy*n+uTk+9LmGZ+oARNEknkF zX4NN56V9;xVpVoz*I>BGmc4dW02>2?)|Q`@5+Zl?Kh^(`ob*5S!d@5G%@0*WxY*WB z%3IC#TmRV(o21URck}OEU!1s_`KZ!GrqJu@Hx*^%mp@iMH%-xo&0?D9cd2#9(m&fJ ziJo14^Y8_}eQTI5B|Z&V@7Cne)fkxOpUrUi<3u%4FLma#*A2gkE)IXR{JPnz(N9TF?0ZE#JS@yH*KT{cS$Gt0Tv|`{dltSL)k8)@+lH|NT~%;o0i@ zPG9W4zB1l;u3gikG_QJZr15-z#qB>g|5$#_?9k=)g>&QYi>{vYfB)}K_xVL}^JAbll@I`Tb_iyWOa~}L~De0=e`pV~Z+kTtZ_8We&PCWkPPWNK>-+!H# zWEp>%`Fpv|>i@MxEvDPgy<7V8?W1|E5s$9aub(Ahobmp?;_5)&GwB~!m4>_TnYCqi zXN0-`Z|}A8_S;v#kJd?bw&87;dwp~J(Zj`4CB$!XyRSS}C-1N8#=2+MB);CIvyN)* zy;Jr7YF^(||C<(%%e6N|98byb4m!vR9c8FR3^Ir?FfeGe|NSEl9%S&S|Nr0h|9@*R zGWq{s=>KOq?Y$fNU9uSz%yzZLzYH~Du=#awa<1CEyRRN!-1__Z^RBY^^Ob*o&aXeo za(&iZeDKi5_`$7vGgXCe0UbQN>$9JvNtJ-Zt-mU}0-1T&w@iPdlMHg%$&A&Cy&AIyu<_b?5rXUYzn*#@r`@|2UJ<4y|Y#d@Gvm2ou2SRYeTK> zRfG8{J=eYo{^G23oA$fLtmreFl*Bc?Pse(*bc*M!l{|NAy~^~;iWMf4uG{gxiE-I- z$W7)((b?dYr}G#TpT0Jnvu@Vbk5N%we@{=$-S^F0{DICbv3Uvkzo#(=xP1F(%~PLJ zbnpD)xb7w|HLGZ~Kt&dg8nC{P&0N%h!jv9L>JHzF7KkDr1P#sUJ;ec5{CG zBDi>d%o(9lzSC-d>ZWgs`gZ%l_1@FxB~{MlO}cb4V)^@NWl!evtEQ;$2+$KFaL9^JF%zy7p>segEvRwNuk}e3$aS)?LSJZ0zpt ztgF57#)tHkzO>B4n z;oz0UTzXn-Smb`&+(^&TV=&;pd#b#HZ82lryS45yzotLkGCSi?z3b+KFMdlhANi}0 zA*cU+^~SoKcl8x4KhzoA{uZ5CaMOPN78~w&u1ywxY1cC*{&>c>=6T+Qo}k7f?7Rm) ziE=mHV3sXVZeUAj;4W~^U~npUy~@dxfk9zIO2>?^uE)G4u77sF^UUes>^zx5p zo4l@;@6oY*dLcuqe%)n^CpG`EmKaH4ZY1MEbwQ&wQrTn)fgL`^#7FS4m!o zy8Q3s{e?G{#LEADc2WF=%j|t=IfcQ^9_^oFD{PZ2ql&`r(KiyPM{qbX) zKd;>5xxqrl_X%O&`_hB!X8&pJH=o_L zdTU+o^H%%U@VVJ+c4ux9=>_shq5=&+;vy@NV8wfn^(XCY`kIYb}WXr{$j5 ze$;WFe^e>&hu(X;4hHsYObM!=m1uL;{^IJgqwA#hp4kvHFVycsxYeJz=6w}E)YIQb zW|#b`6#l8FXT0<4+NuBYe;LlZeslk_V~2vx&d>ASy!X^X>0L$Pn_c#V^IcnY&-MOJ zJuB^F=X1}i%2^ZlPz@BKXg-?t}^c&Gn<|MS1y$Ief?Pp`9^@}}bK_Af#8fBt=av179N z+m-S&GSYW%d^P{(w~Y9bzejXuSIj!l_WN@3@3V8|UoQXUc3STJ-`|lOwqLW%`R3Sr z$`tIM|9#$v&B=Os?{ELBh}8UO`1tqPu5Z5??DBq}t8XrPvSzOSj%ck9^=CdzI@ol? z_s~9*zdKTF>^Ad0xsl{CS*mT0<(rS2w?}?TWQ{k=4rIJD|#XIk3sV+M^bLHEDZ*NPQ4(EQ5e03|2 z@!u<(o8dDU8QLSB*K6)O?89L3CvClH-d?%iM+~nE-c516btmd;*iqZ~ymx6#zK4A) z8cL-b{`}k4cz5691v9TdX82Vl%fw^N9%aIK;qhMPXLgRlT;*9SPP5*5_Gl5KhMoZf z!zK&nC436L(^iR2@nm55@OH`M*T4U*xtf&seATVsKe{K@I0YZv_O^XZ{qmoWWPh8Q zl>TRbEhJR>v0Nx8Kk>lZv-jmn*1nfNq1<=$PH-z9!{Pn_Ftz^2PhCC7hhp`&uf9FIy4d9JdbxZ%Bh?$ztK)v%`kTUb>9ovQ zo0fG7d@FuCtokl@#Pa6(s>ylpOXL#{&*ME?D5U-%c(Vv|;Pb;tCtohFF&M`lK`pD^jTfRi@-+Na0|Bo$GHuQ78E^XmS>~&|hd#tW<&L~fN!Ohk32W{q=YYWse1SBvpNL{&5 zaL|F#fn9=&A%kJl!KlzvDhvz^>sD61`BU6;?A+zhpT}7|KFPjGTdr(lxNh32h_qYD zCz}s{61%rhPUNPUN!6~C@2tXlH2<`|`^de_tnKEyd-V>*4cvQQ?`r4eHmYB3^z^Fe zf&wWcyVbI_3@a{tgwsp1lzMimgV4N_?zD}%dnw9p06*6k4D~cRmI3+jE*jKjO zcFm!MJAeK;Q@>>K!nd}WXO?H|oa*D2a3EaXNbqXngO?x$G~i3_a$~vFpC&|NK;Pwf9W*c~<&{{Q*B1Y0*&lyX`}beV%6Ia!H($T& zw)6J%!uoIXrrI9+{V?cTVhqo*uiNK6c8{vBpTBnh{IrctU1|33r{90QSMGw=0~y(# zY3IK`J)Q4<%4Dju{CD2lGoCWnpZVYT>wQbNzThAI&&k?-TkL!47wFATPn4dCP>h+%$uaDi+ zzMffp*X`pE+t>IAe$Dg}q{`k(3_snOl%*zwzGtQd(W5c`M%-56|Hy%iPIiF>b zzQx98JIr=7UbEZA(7XIVhS~m-1xrY!%oHRizWT^hr7m;2%p!l8^Y7-rqV^^WCgeHq`la&tl7v@{Pu|O_ zU&u-n%@+MlB6HcLxB_;26kcNc9MM-2D@0r$?6`ttzmX zH@CvLZs+Xk%fFu)JvsZ-oSofnZi2Wt+ux}ZE^}7AHa%srqh$Y|q8-xzew01vZfUBD zp1)o0?adtjyXV4c=Kt`^zS@;`M8N&X$AjG#Oo6*I${W?nwxy+|O{y&^IpU=~(~x=V z&!>8;9{i}EQGaH$jcOkVEHO2n%;3IlOIli*#VPm7bjcHG_UF=e)|Qm8$Z_x8^k3=p z4QBR^rFk#Iqr4M%9%T1EPU)36`mpb*h1=#$iEPI{pa0fW@tsw|PdB3C0uZev6w~?*DJ%AZL~G@WlP;3ue|IUw(T-`1hy`ABGDKoU98N zL>TfJc!I8KimIGsU|_iC^u#oA*V50GiL+|e`X??_<;}f+kww>@b>`IkYmNP(KfMkg zO}_2Z?jd*lxvJ#esi|*|ecykC`BM1%iz^!g)XP5RFfeSY+O;rtCBv~bt(_-!&Uq** zmeN|ZieW+1q&B|CRrS^_^MxJm&tE;C`N5XJqL2I@;lI}`;g8Or9#hXeukhr%c3%GM zkAj)$E@wPnPE}+0>n^jJovnA%f9w1Wl6F0xdrlfIi!BOz?Na4BW!*-{ipQ{f_^%V&{BX&g*roez#>Y_eC!wYWEwZmAbX9o6;s< z8@5MhfB5|0vm_=Q>Hb;j$uDPi`{%Je+UNOe=dS1Nsk4YLtUnlW&~oke_{0T;`gY%0 z7X|)X_S8*z_WGHIqVp%ppYu>S_xN#r;l6Xqj2$dSpWfumE3LSZF;n@e3!jBej)}zw zPrY!PfJQbxet!PRH*em&+3LJ`=3ajO^y{bI94_Htkh^{7)c?+1n=|v4oC(VRv_F8! zYxaTrkN5QK-MpXg_TOVW-0$D@`~9Mm_17EW9b38%%eJ3=d~aJ*VO7pwIe}WnUv_zR z1(Nj)ll>2b9dKS;skR`SeU0s}T9v#!DTc{x%!@fW6Mo*E*RU}`uYqX~b4dfA!0Ld5 zDx3@q3=8&OI&x9`-I2_A#o+DMKU`~$KdH94eroErg{PIvw}`t%R*M|rN#3MWyjHSY zj{EojWiO-VFJIbwd7UrAiWjRjPH$|unzAW%*Zj~3_WFS8OpanbR))D*-;eoEV@#3N zjazww!APZa?gD9cnG-t}=X|@^(0(^Xz}h(UZswP;Vuk}Hue$0#GcGv&Y_mWyL*)Z+ zKJ&KaTArm*xz~aiv-X6X6%baPoB850Yx~bTnrD|!T+dXp<29GcT|>*I)wB6M+(K5( z>5_~Q6_h^dm*iCcJ#NLFu>5C_ABhEByRY)M=y;u;-noN3xk+r%8-9fN7x!?Q|4({f z^Y@2S`0{ltCmr;^IN?VChvfI!%I_tr7M{DU|6s=J#EL`rgYPf6DPR5fan`TB_ZGkU z_+bCV+l%97Gkihb9~P7obP9GD`fDEoBgdk(lN$-LtXw?)*ZPS ze`h_Ix!~sa7aN{Woi0A%y4-?Bz6*?O45A;{7Swz=?xi@xlMS?>Mb3VNKYyFpw+D*46)+YXc za`eviXN4=6I*-p1nOgi!`1Uu+fA!VXb=B2SqPn`exobHTRO`#V-qZ1at_GvbgRMJ{ z{x9F9oxprw%4GTaTKOWA<;Pou4TbuC-@n#i($IbNR)=5PN%n7+;v4#xGx{7``|yC> zonLKg_iN1)>i6`0KDOgML&9v4m<;<1%$4jWhuLcwT5K2`E;8)UN(IFwgIn>ciPaO2 z*SyV~)v@*SucCQ5Gx?7z-=5WfN9&3tlgR-Yvuhc(t!t#-ZjQMy;fYgew|V+%x12p% zT3lCLx`VkT86uW{$)2cp(3-)L7%J>pC{@$~12gif`n;t#?@!59!$GE8% z?wH8etk_kvE~EDSk}9R--z|Q(CT(bQy7VQDclz6zDIS~W+^+nY8>11Lf7$7|{0dJs zv&~htuWh*wbndc|{j0vty1vocex|enbMF0#sVQ6jfBwC@E&WgTyJs^MS?u{k6!iQo zZr`n(a{KL`+Cqcg>+_gjf6SS6j9E?mb@jiaaq`#Ce7@8Db5h9NCsSD_ot=2((cGPn zZ8CCQcSr2opl0(*@Qhwpq*c$X>F&(ij~|#YV`ty9Ft!K(CNS)0c;m|S@7JCU|LbLW z84n$s8u={r-~1MBcC!s}kG$_xo&UdgPG$Wg+pzp&uV#tG#^?WEEc|9apTqg{jI-v zb91W!v%iA7-h@fQfnwk&J=1ZtZgpGYjr!~jOtr}e7jT?q|6_FI<}Uuv#_bd4IH$=5 zhehn0^P|o6w#SY8JA3?H%q~7ycp>gWEO+sO+hVi(ycrYp`8)R-78Fh8t`*zQoqvSU z;(F*sa|Vf+BkT+!es(>c5ebgZq_%i&V-j$>wbjhvYGrZ^%Y*lo+#P%;nu{N&N?$!} zn>4fj(L82>yYiM28-g0=Y3lXeJEHl~PEP-Yx|3*i_y5RU9Qs>7?yE^NI>eV$e~ppn zj!s3p^O^Sd4<|T1lYE=1_j&jCPwZ8;_0`{HZ_lqySl&J7#}m_fz3J-T4_HdnSsLdr z@!tRCnN9h*n3@L{4E2mcUW%_Ra_2337a{+;^8cRypXwdhFXVq)pnm2}_|&UhCeKd` zzgHBlnJ?M&^tFoPlNb6%|LXUZ{VQ_X^ms1Q{h#}e=f(lelH>m;KRdMKP45)@B!1=l>z_X@*6;tNGDmW;cj2r*+C>Nd1-2ip zTGuw`!)MdF11V=^h3g~w`6PZ$+hXE>;7?Zmi(fL_@{>=-HPkZo)H40beH7-!-o;oD zx{%RSk%yrn4z<(`8dz_O#*%mcEnbAs2S8K9R~% zWFOX;d^$s9i-Z4$>&Jx>IH$ifQdZy*|0iE^`V`lR$M;^TsxUi*)xTV2=V9X@QWtKt zPfn^rVe$XJQj8DU_pw_(Jdn1oah=jJ#uJ~`D6CUvVK9x&`(ApJ;Zx0?kY$ZkFYN%hMmZzP+;F|ASBv-|U!;Ggi)F-+$$wxhLlr{==KAXQ`aEdvwpyPh}Bb zt$_WlixGk9=V!JnZ;JbMooAJB{hR^^{^zg%#aS^3T!;=`eu2$v^UkDydvnBYF8?jN z@cio+6?e~H{2V3dxOe&G%uAIQ`0m}AKBM;AjQVS5{z^~(9R8?J_OE1w+QoC<`SpD6 zZQ0S;A+ztiT*4+F-d!;#b{dxI_{`VmD=M6__SON#jW<4hU#Ri&Y@4_O1H(V5y(j;7 z);G*FXuR><_1}C0R)fa#!Smmk{GOxqF8X}Q%ig2)Xa26A<1|P3h!?{<<9|$>qe~S0 zgB{Ab<`Y~Sf2DR!1orkmHWF=lNN`7W)lE4tq*vKkw!qChuF3^4> zC=DEG4Ckh}ef5rc{P*#JyLV%Z?%cS%?ZevB^|z;b8;Y7=`}^F$WDR@810J)M`)6V- zgltpQZ>#QJ^YNAD4nD3Bd-K%eEDU5?0CtG{#g8%Yc*BEB3d9wNGY@2)b zU)`2Smi_e&Qctk+6X*P4cjZfDf@9l@wwqH~8CcUY4^QS(_`W->n&Ddg=WUm`9Nw+Y zGC8o_rNn~ad%FHr7S0`?9-oeuXLSF(ytDG{(q^5W{l4i5>&%m9w0zm@74+^*n(w;w zqiR~AX(uf%>68~J7pe30OQ@>f6$#(Z+@a@-ihULGQ z>Tl*hpD*s6WK|=)WN7q}pg2-E^H+V@f78{`B~9WV1aFz_{Qur&>i&Ihe6v07_IlVw$xk`- zW5Geogs-!9mv70Kcf?gJA!PZwz!!^7o~TmMO08!|VaN{nepY-^q|R}xWqt?Twl(Ld z-QCM!%E~aqel0JNdm2h z*qU_1~)+@Be)GZl-0E{CD%eS1)+~wtmTAaCKYE_pOrGH{||%c26hl`{ezc zxhGEFUvKf;>1#wD_uKGmw)>Ukm@4-49NH6b`2B}@S5v>=dA`1I|Ft?Jmnr6T8#DL% zZ1}9KUY)RCZ<^N5;7`AI?GD;B(~I@Gv}6c_`~#+Yr}iB9KR3&(sh)R=5&yUSj~AY} zvFebx=MyXcx=XIb6D~hKAzO64ew)y*uPoE#|Jzdi`$oruX6E(W)-f>eq{z?|yr4VJ6S9jT_!Z?LGdNpP@ysc&0Q;`<2&zE0-1d_AIrqaDm(j?=IEe)pZ;OOLIB$l@>;Yy6v6p=X5{CDCS+Q&m<9^NAE375*L=a@@&}mt^aKgk26Pn z@Vu|CZ*$dWu32`J=RTLn@8>qLZw?FhpPu|qIJ&<6%m)8_pN-$X)P+7i{`Eq3&c5I6 zpZ`rb@o)9~-|qc|`kARto0Il@ z`o(7So}s=_{zC)1gVzDOdk44iaIdMW%)2r{I$&~fnfKJ0;6CPqRdIE%CJS8r*z{uE ztZQ<+YL_m(C-A*#&(|7(TCdlkhUb*6zTUC)W6V?IwAv)I_4uil&vM)EUeDxsVj#9< z$DJFSm=4s)H9ooX+Ru~QU9R0a zetvca!;#W74YM6jtIx*P*1Z48d+J`y|9?xBHP_TT@xNXz^R4sZY-{I_CL7;Ac$rky zZ!DSE?YMx=qITV}`X}{%{Y5{*dw71ni>x=xHJyBJ+F#+WU)ra4*RQP1`TzWGVa=OV zyRxr!dmkNrKDjW>HS1N?*^O-=VSlWcQBcKFx|UxRz&^r^|$BB z%=!QRXz?zqk6+(L%Jwk-`Oh0wdo^+W@0>fU2TcJ?i(8%Pg5Y)h?utVew3#f2p*fOhd^VEH%sR`3Q z8(!VZlq99DBDVF8Y){6{{1S$yY}SsO*0vo zD(9R`&?$Ja_VX%XwG(EmbuO|ivNCp;o{LUl`e3~8<2we2yuH8o81yl#sy}l-z|>&0 zK`>y;rRt?fVgB=X0iN?*0A~D-YkBT>B@c z^Yii=xoxF8t-^HbTE5+~mzdEKsZwbk;wxov#Kh7^fU$nPE^EOC_wRE5Ql{4SNJ`rE zt>J$&MS&SI%;InWoCO#_x9NcTO?$=4{>c3Q&lD086zn^*zdboQxwGg0|26;r>;3<) z|NpW{_0GZxd3v+YiT)S2W|fexxV`ZH`iuX6oWB-nb64E_?(6gSbgs{O`TC9c zPBn{v^&kHqQEJLCP3E!weDi2(!(ZK5tdoB-H_SHt?D*em=7Few-Xl`hA0?HqWgIBn z#Gq_1Bb)cD(1`K2%k%%&9@)fK_Uyd4{pSYu8IPau?H5RV`=+gJFdk!PP{|5X1AE1xo4NU_omsT!{Z8{b*C+h-ue_v}udoO_=$k3Ad`sUw$#ZAV zpP1IK`FpyA^tu(V|2yt?sd0LEX6=)vb$O{i3$#AVmTyU{PhDPcVQ2lSzTjUbkK~J4 zIdpc|oqc!5q{>k+G$QB4O|FwpU&DA$&a95ya7L?R>%4a^rF9%<)^r=I#Qn-Wv@KG^ za-PKDs-BZ)o{QJpZ7#Q&zIoH9CmZ9mZqMlLb(!6Lx$u?8w;T2zPs6-qYV)_wo^S5G z{qonUoA>U?+Ql3{$L0Q|`B$P_wtK7P+#hDWmsU?drE==@)~n|iPZWOH^lDYb{aF`+ zKQ8QU{VI9nX8HWfn|IFCK0EXO}#>ysToCYBKe$zIH0Vcib_4ev4nvPwQ@)<<%>Xb_ujI^aMSwXWOPdJ2_|Sv;X!B_WOGHu3ouo-`Bj4?>qKczhj@fm|?;3 z_Rari+~fQIr*FwVaku1?Q?7;gIdE6WXC*^VCZ=-*z@Z~u=G)V?Zj@2x7Wq< zPM>R=Sm+=9v)c7p$u3swlV7&0K8*j$$X1lTd&a>vEG=H2|1Y@`7q?S3dg<5yl>uK` z6SV$)y&Y|PUF87NJJwdF19l%XO?P^lbUlilx3>9$dj0b5+<@=mo{L}noqhegclC!? z+vmz%z7zl9Ymm&(Usj(AehF^z`~1K7z8zgk*Zur^r{jO$^q+rpf6n{Pd-mzV-$Vbs`BJ~HQukBmv>a)ts;PgOQp~Q` z^K|?+oO4sE_Fwaq`1(lc%U|pF=luU@u_L~I$G_+b^WWENPyJo-{m0hy|H)DB>ypKi ze-~=-y?0K$`PgF5V~=Wy&?sF2hM!kV9zA=#wL+%vUH-#VlWS*Zm~<};+wfp_bN#`u zTyyu|H+X&TU)+_+_V)c(=S>&?|Nr#YxaFZ7CRbKn&Ei=5taM#*UaVh3Xnp*GtAFnQ z51-!8x}|KoeL`NW!P2tZ_6D!t9Gdy6%i4VJdzt*-miMcok3U}fwKU#-+q3<9%Vw_6 z?mvC-^z-MM?~kt&d=qzP{`tTM1z~E(4R%g5oLLsS?6%ERcnL zarpGLyIy34LA~adHDOP>`gXi_`Cb!H+^|{WKn1r?cx|L*?5=&eHP7`YZFb)EV(i%Pz%u-{TxpA)<+*++6q+)4S6^vBI< zYp!U1;+?joF5=qXL%4**;Sl=hR!+-}{v>Z)1Dyy4I)4`kv7K$o`jGZIjHbzwa@hUjI(+&1ZM* zMf#^b8}54QM=QNgHFG}ZcV@En^5rHjn!6Vp^KUhEznYa@^m<~c9mDhtr<50mFWi~) zLAG#L?d`wzwPJO@^Q?5r|6kb^ye3~#<4sR<#9Y;8<}Gc@=O@TH1%z*W_*GqNz0QnN zet&LGK9scgbJ_ZS@Bc;Bf6U~Ls_s8m|DL}uZ13^#kGVa+|3>_K{`YBZjGwjN4nHPl zjm+8ef8F9+JaupF!^h#KYJ9&A?G||-wxR1!dZviY&IyxjQfzkA2M52%SovS_UH02U z`<>^lHjAq4T4=ENs`%6o+0)x%0>WjN#M(=(mc9FaMp^^sy@YXGKn!k&uK3(+p z)cTM09}9EWZ@ar{{@&l-)6+h!I`)Y_ z-`3;v`~8i*jfK6pr5u(SZ(F+l>#}I6U-#zSZrIxQ;yj;hecAQdrtZwOU+t3{4m=gH z$~zdq%K4%`U>n1d33r-<9hn#yT(qpJxnCVFcH4jB{a&75JHO<?f$7cXA*W>NviPOE?O=a;cNpK^(HFU{n1kDYupCTp$o&y)_MHQi;RA>UF$nJ3g_ z1pMzm{Pq5W(xqE|{%Ecj|0LIREjnW#&qM+J_pd*^ez1T49xK^5>1o%T=4Cw>GW{-H z8u;UJznaq8%e&fHC=)3_Ty(`Y`&>Ld8FG4|$ys|5mARVMj{r%nep$xx`~AE#1fmINzyw_HgQeP{WS%uF32X5BK^pi$C{@ zqr%?Pk3ygBb31DCx%z5Bf^W_{4*{dy_3<}+<7ywj+*+S}zj@1oFPHCJ{jmM}l!Mxn z_>GUhcfWiw;f};L)A#3kF27bwS-7D5$d@xwrQB%|+UN=+K_>|kMqakx6*v`dvJo1^@u_b)h-HR7$ zUp2&4HP-*ycRJ^nY}d;N45|%!4a$F5^4M7a?RxuRs%x+qL)=bY+n`-MXBhV^QsR<4 z7UfuUVxP{FJ5#II)TnN#d++e2M&f)#Lwb`k^MPIJ*CJfb|9`jDDw%nH9pmzgnKhw3 z+&dP$so{0-mu)Z!Y2doR=*05iVC>bP)P+0@3^pmt=hY z?~{6gFQ2ulD6WUYTckNko%pS%1$%?K*PxG&4{H;u2GOY`FUp-&@+ozU{Jxi5m-TM3YxxNrz zjhCKO$p>LxCC29*epi2%I{B%-tQE+;<}%YHO=Rwu(5cq)PxnUsm|k;adVAjcOdj@< zFKjxc|9bVGO=iCN`qh^&&H|I4Ip@q~G~>O)zWxwT=aje zm2&3){{KoP>+j6;j}w(|Ny}TgLipg4868=FtmZ2`W!|V2GVS%9dRgYK^7w-_4UGp? zAFYwSvTXMufd{KDzREele*U!v>-!GJ&G*G$PHkG?bWis|U4*=3`^WVU)^+WcZ4aNH zot)tHL-v5o^>33O9$YOi@GTH}wGU>x z88ckiwf2be1%?Cp%hwhi(Y!0R(QUnP-rOnS*|le{-R^JrcREsfSC7h!4gPCPYE9NY zx|Mroa=i^>M#SEO{y*pMFx@=&-TAFAHYA)()n{5d zi`6sw?>*xRo_mk|yoL0E=l#!Q8HJ}ks*-YktdSX+E%AMdflYkRpH;;lpHwjQW`<3> zpZ)pWMeo|&R^#1omGl}K1r}cHf4up+(d!iP=(c@->)XH9%g5ZZ4}QPg+;83eK#3dk zpDC8#6X!8n;llWrr94m3@c!aU6B(|aw|vR@F^KtliBu8S)j2Dgou8lTG&T}Hlk#iV znctKC?_*r0B&fM^)y>0P2Q=r@AAJ>FYi04_%is3t*Ige9+X#KVQK)|W<@GnS&a*M3 z9<(^xzr?=7Mej^#WW8_wo8Y2v-!6VXy3ca)g7!!&8{@g*OUjSDP=3KO^+~Ce@1Kar zUo-^eJsy9q$ze)zwwYUgv&4Jlif_{o4M!q0D|?bXg^H>_fx5 z_i7SPyc8F`efR7(j^w@9Z#Be}|9xho)t9+r@wzIu`i>*@-+$^pcRR60uebhd$Wa-u z^XunKcl%y?MAId2`iZ<*84~|*+1}XX=%yKB;BVsmDm zAHnwJj#)@ zobCrM)^j^Qd-QO}&Q3qwSRL*A9R(pQicSg3+=G_Y+RoQ(ZTWZG^`H7a#f#cg!?rBi z#guTqcq#MF${Wk>SE^dBQl4C%XLqPDHtwxaQP_pO?-%k^y6nvf{{Nom(d0rl)tT0J zH$|K9c1f~o?f&p)#=VK_7bY<-|FXSk=FvZY1Q#oByIJ(F-a(4*_t}3hpSe2Pr7DKJ zm!JG*CRr|y&gW02^WM+DEh%6d+}eAsJ^kLVBqPi7KjjVCUu(Xr|K7gw z{nooO^Eh#OnG>mYfahv-Rpd z-@FXr`y2B&Db_H^DL^!1wxoiaSK_C(j3v*XDPP~^y--p1tMR+k?P$N(NM5ocgvczc4SUIM(gDB}NrumAtu{{IgG zpKN0D|9|kmUA_-y*5B;rWO07IO?dm6j7wYxR`)1Hos&j1q&69r4;gWy)ll1i+FT6JQcy##(FV>wN zoRXfFm?rzZ`Lww@!|e5c0#8@&da<|OIcrJS`BKSy)yZj+@qdrS%-tSZA$-g|i#pi{;J+}S8i==po@4t=Ig9~-Frt7t59IKtP+Tcih$?xP`!#$VOV(0(W z%B}yKZ(DNy-%F;CMIucf-%aOr%lT*h;LmIIO(y2XJ562IyRP*=ktqB0-IV$tv!Ahg z|C1EB7#p@|7njSo=lN|>t2Qy#y*#>EI5ph({`?y6D5E5o;@84cjhXL7wcI&%-=O|e z)NEIscAwoWGI5)E7A<&s>qk)U*IEA=>vnvQ=uMTqUH_-)?^ff#{pmYdZgC0pZm_nz zFp2ThqQfn_k4Q|l+|c#pozKqnfEQPk8yV7z`Oopj^&g85+cBYr;omIX7xQ-eALCA` zc{ugf1JkvtN)`t{JU?~oP1%dpJu}Yzqt~6Kc*!ZT7Fu1JDp*> z@PQcyeFvp%(`?@x)<+!pBs{0G`$2`YqX}c6&AHWleRXwrtxS6F%{{#}qD3~jPd1Ms zjG^0+kxN39VF9DRl@M3M?vj<)R(Xa_U|#8_Ei2LD z_xpqWbKCh`0~NB_BA-p&aG~PHy0+x2p(QnJCe;!*?s}NYI|NN`Ys%b^?OgFEb zuaA{mWc6#}o&BMQo-bi-l4Ox#TJ`Vz(jO1w`{mbvN_nndYEo08_J2BO{Tkk)x*Ivs z(KpsCR4|=6^Gbmh^WQ&~ZtEWFTx?u_eboWe@BjU_B%6OYz#EydF*Iw7$c`$7XD&)R zU$wuOneyu)|Nd_tpU?lAkg@n}+Wor%YuB`E@>@u~s{dj4d_|dS%63B~pNa>KDUGv@ zbN=nheIdA9(t%@3ns(v&RZc9CnLpmn(cXAX`Tfo*vE82pPZZUi{PTFvfkaL>S$0C!Vg5ew6fm$90*>g?H zFEHM@+dMU_RckUsJwr|T)z9s=7TZtezbrk=$*S>NdTHx|D{}FC>Z=SAuU$7RaQ~xt zk9AH@?fUP37VLk1pXX=!>&=pj_UeY-e_$@QVfMsUZiX*w=e_vKH+NQMjn_Y`t%da> zpQden<@GO}HXhTCE4Xytxqp| zZug@9F4s-P=gJ?u=QnxX-17a+KCugmQCwGlgk~T3=j}I3N_ob?fM)SrzHnXjYewLM+uzS*aosv(_2%j>$IBN>{k<+~ zKChq5WOBZQPxRcYicjoE_#gZ*|9hmNuwQ-EzC&t<7bm~Is{iw;HV4Cl)b&>#ELn^g z{(0#>n6`pJfNA3m75U7~ntRzkJYOZ6xyW$$nya@Ky9U=czU{hs;_+>J0~@^$pEN&+ zyxGcj?9rOuKP{!P8y<6BGY~U0&}-l|v0l$OSJdLq4eo0>`iuM3Rd{c(IrKc+6mWUT zg0?#i3)}deI5w6{&sxf*#>jADk(}p`bNgP1-hKG`Wx&VhPyVaEE8F<%;;;R3^&00Z zrv=+uo~rR-JF&ISb#uM@8a+Nc;iDZ#W?ApJc*o|xZ4smWe9H;DA602*^UPQ8{AaQ> z{E}$cpl;rr_SzmQ~?|fEc zOTi17FHgzqw6G;+*eZSv{N1$m+x006E2}CEg&#DY>=fv)FY%UWd$aZWJR6RDCBFBS z?_U*J9TKhamft+ZNZj#WeQ1#D%*@MQUG~4(%5b4??W6T8t~v4Sx>bMY-SfQ@+mPO)VU4ZzmEH+d}F-0seUm-{dZo!`899kF7#*>>+LHRU-gFlxYu2CYj$0J zH=$cMgRcJG_08tMieg@SHLG@$JzRe|HZZ-N{=Z`C9iFD5wINm=LbLu(yz}qzRiBz8 z_P$K}OR{Za1!w8}%xnL#^yKtE|7_l@*i&KrS72p}l74aQvt54euCdC7HQP1za-Ntt zBk56nx~U=G@|@$JT>93>&pEzS;F)jrd*(pBJCm&3m#@F9SbNg9?olSQJHx$Mr7x!5 zoPCg?;%ZpQ`K;3l41Z3suW7%SKXZTEROQZjMq9NORUY~O+WWwgf4pyE9>;EeYyE2N zL&@&7JCC!?`x?%Cvsd*vr^&lBvNJb|d2HufyJ%`o{;YfTHS<AeQsgh)BLCH6L#)-a{phk;kVLnCfkqto}KWawC?VG zDe+#*i54k;6N*=Nr7d^zDOZ^N=9P_wCwKq>k%O9?qRq^QK!<;qmN=y^7-Op}a>(z47YwlOinsWBs@AanjPAeE{ zAKA(8wfN)Iek9xWul+sOm2q(o_clHA*lt&}UB&&3(X{&^pC3Nn!nv<-<-Ko~st059 z{p{ZsznW>cG`_Ze{pqQe=k<5}DX+_VZ)sI@{?WcaD_qSTEjRXefBxl=(fQ5bmAlIs z&if6flNocW#Qx>@#RhRsoUpRI>xjms`bPC&gNq9Hmi;UUmv<3zDHH#{@kJiT=dV`D zwk}SSAC~UDWPC_S#VbGpci(V zvvi6q_uJMqr5&-mM33-`?e%|KaEJTIZDr-4scjGU{b=~M`_ld7YEITS*{3ZZACh7C zSLIv(X5Ng`3=TSGUFpAaE*KotUv>FdT1?&hjViDFi(K>TJJ%Q2ePaFXv**D4KZX0> ze%+F>{ax*u^80M-4~hQfoUhiFcjxl!4LtkoE9^v$g=t)AU=(j)d>|emqOc@|Lyoa^ z%DSwjMw|=|r-FV@R6cosdEBZ$^Cr0`MjhT$c5|=TZkzh>ef8qsR+;=+@#BS-?2--r z^($>Qzm*91nHl*^WA`6f-4=#rADDM@G$<)+AHVxL(s1h5_fE!arE8B*{>ZQ-|CTX4`4s<%*3z_rI?$s>Yya7pHCPJKpsHkFs}`hyGeskR~F$D6&+DukWLzoDmXu#SoMw|3cALp`T;^F#Jsum88*Tfg#- zf7a=eyHW*e&%0{!A7$}K=05Zb6Wn9w&@k`V?-mxZh!1y1MC49@*a zuN{1Fe%a^62JhTc57o$Sx|vdWqF(W@n$1n6&wUEnH@JRk&1W;|$cw((Z8YbEj>Y1= z0Shc&z5kX{A+fPqTwnD5yNF%CJ8rG5f0n(Af%)%Gm3pbIWsC4&p zugS~wq@EmlV9=Pf>(zyL$(y(4HHZfVp1`}%}{6E$b`7 z{L{ZUmT=2zw|riFC;w_<%A?AFI|7|5+iw;mC%k_@?LpK22d`)8MH&^v8b+~i7XNwH zZWULnnepVB(tDw1G9M%7I|M{O%`S{M9Pm;r_O8ql#w8rj>lRJ)3e=ywk!RVQm!Wyj zR$H!le*I@%VWj2b;Ggw(v#XA8b)V+G^VREUzD-vm&QDbSddZJ_!J7B#t?}IMjZJ5M zY^psJHn+Yu zRlH>B{wHjbK~7WI)gpCu_TbJwbV%9u%6aKRndOMPcJR{^taDt zu`@fh*dy)7MIV zE?M7hnf+()<<$4Te*897cz>Dgk>#(G5loZsSrpy<*YP+aP2zcd!@iTHCod-^9@({K zUo7L!@Z)k37h|q-Gf0SjnBu^#!sgWT^OoU{hHVblnO8C|xg)8tHfrmtELH}F46Z(T zwyS6AuY6C~d+GIN&-IDZl9uy-ke#+R*IRSmmuBU-vqVP37*Nho`G%&YRQj_Ah78h9kmNwZGr4nR@HE!qxZT&d>Ls z&V5{S>GGF<$A2!`@7!Mh`_`=0o{Dj9X?yINwbS_LFqo(?_ixvk%l@fM@m%*`D+jy3pP?fGBs$HT%k#Vcl{t(iY+n;6szR6V{6P#yNiZ-lES_HnI$YQ5 z|9`Xp|K0!p_xb<7KKTFtg#Z5|mP&#~~f-x15p&68J%eZ8*==8=Y>hu~ALf=}(0to4?Tv8dBE~oW z_enK0Ff6#7zDJ3DLE~q?wAG*0OC6d$pBidit_=Ip!*!_YMvVBCg#N$Jj_!Khp0(lU z=JTtq8&=Bv+W7a^jQM9aw4Dex=084v|GC_2Q)Bk3HDZ_Dbfi|1?!{r`QAd&&BMuHDn7pV)eE_RE#pY0n;PWjxfa9;^0n@7D4=hOKUY zx;*&SUs68)dqKd(v|kPNS-X|n=SR;t5%@LuyzI==tF~U<94dP3(@hJH>cgtrWo+3u z8XL8~G`Vl0y)d<)>c-qDXU~+XE6YWN#JqSQzHE8v3ANYtb9tI)H_MmST`QE(J*E{R ze=F})yV0C!-0h(e-#=dd`9J*s$(}W<_REGbNO$GBl}t|K)cTR0dGX?AJBR;g{pTpp z`Z&=<-BV2N=3B-!|C=8zNl9V2XSMc;>gFcKhR{{Y?_b(7Cj3ZM-4@|n<9%F1>FD(Z zfpacD|M))Isd%mV1pfN%c7|d(3y&Up`Xs(!hg9tj{yz)`r$m4Jam);J;Jhgv@IuUE z-kOr~m07Bj85rL1*1Xn?ewQcjw&(t(PdgJ&@o*h9UE0c5A{pdSyDW$Cu~Pi82P{kp zL7)13=kMrWw}t@VR6jn33}^;KHbt3Ib=SuvfliX#Z=pM zUEgzNH#6Pk`o^#zud-e2y~mGeVT-S>kC(3A*?(SP_2Tah(z<{77cF0KZ4v*}zg_L~ zJUCx@#3VWtaX$ETf3lYJo0aTuXCF2C@-><9Qo#~=d%NjB#guMtmlvNt=b7}ud(Xcb z&-wA>`zpQ<;)0L%$}<@BZSsB8q}6l4uYSAT@5#aHr%%QE|4;Q<$EZ=4W&b4b-RD-%zGwa`Da2A7|x@1DAb2H2=W* zUmtI;dcUi^r?_5@^=QZ4tUgz*^Lvx-S!c}c%Gmowxu7}S^!N|^zi;0L$_UlH&$E-6 z$DLwae>CU8g;n!|UMJ7pRdW*v{-cE_(`L8(YLZYK3)FdtR}?~sN}Ov_1lJn`Pf~m>$}*<^xYZGR=2(~QPW~TBlNstcKJh+09u#NidDMpCUY73> z-LR@(D9hN>Q(x?x3zm_xaA8UfA8{Jh;y0! z{XB)mF_!g2i>u=ahz8;DF6<(Cz&(C|}QqK%6qwi0ou5(?O zdAH}$rhu%{FY-S;vL>)srZUMgZLojq-^5q{_n7qhB|m-lez1!@{OecY(oI)29Vf)S zeb-X|T4GacrBtDMk4m9OU)API|2Cu~XFET1f7;lWW%d8}arrw-*Y1(Bn^1Z?Sc3i6 zzotpuc1J5;YPesVF8<4h|E@{qDZaIrzA+c3y3AVkIO1lfts0Lx^FOV*7iP9GAGl(r z`$Tm!JA=>uece-P-=^Q}`B{C&SZ{8?eyiXAe(rhCyr$l2#@wIJ>q`D=sZDgA^HJ{K zmSeHo&2EPaZS33q^6&flTcOR)_Z8|Q8V~Moy49TUgmu+|NkNPrmaS7_qNZM3n!v`e z!0^orJ@fPPbSCVX?Otf5_vNjM=(%r8?;fsNeB!?#U~sQ<|7f9rs(!14B?}-JcKZC)y$=GGZT7Br{knV4zX^x#*{475GT&@ry5i&W+cFksYQCz? z=Kbz|w7oSwX}{&(7UzBchh4g+Gu1SotFQ>aMxp;Dk^9^Im`ETS7zSwGHc=#(NCe*QT0?c*n#_q;yG7&h1cvU~O;Wh2M# z`Pb+D&G;>(%(SSK<;&~r`*Uq)ROi2#cRuZ_`hxxavdj$fTs!L5XEHLJ{nXRSD9-HS zAjtTHNg#*4VEVhPt45p*4D-u-TASNGM@4Z|zLQQb5a}^|Q+MXr$?A1;W<$Qe6ExN7y|LFbl{qCHTyN_6E?yK+H;j~cvTG5A~2*$7PwhMpnyrfybW9#|L89!OR`Y@>M z_3!a{v@mDI&t{QNQzCU_Vw_B51E0q2SOnh`fJxWEbewlc6rbAs5VtVzS%`SY(RJJJ$9?Wjv@V~UH|J}qQrVRBKeCn|F6A}fnKvmucX4s~;ye7eu3E`d z{+;pvO~-G|)JgmDf2+?hE}XrY_0Rg0SuxL#)_$y?a(?D_xbKuIKpG> z{LTLAl$q<_{cOE|m*=1Aqvt=OjRS3}Sj3F#Wgoh!o&EFUdw1B=4@v@&&tE+}n&SHX z)wC7om(5GRF#I#;{t30u!GG@EQZ2MNQua5u_s;tM2FnIhHOKe| zN6sC7@qOO$O6IJX-p_N>9?S}p|GBXwVfWh^H?2(df4W&D5*(SSLaN^tNG9W1agFI+3I#j$5?P_VBU&7iLO`DGB*7;pSOc|L+zD{ zRqemFvf6Fh6}I}DG}oHQV}U7b|4uJoyiM{g@0ky;K3sXcqUT#IzhL#j_D43RTtW;5 zQ{~G|{(Sv+)$iTyN$i)ubBon)I>dN};fUsP#-BCvwR1Mr9%(w{8+T>9$^_nri&ilF znXfCxs3oMyGADRhxuemyx2N>~ZB5KzVr2?3KX8+Q&sxgbKJMQC!!1u%{Ql3&=hVLG z`L?+i|2&yj!L;W0hrqZ!mwt!%&N!{tnQv;j?$56~3uZsx75($N`936eKHI@~=h@`1OXR|fPx80Nr&l{=Z7yE%sc`CLhv#Ky4}ZEhrO%Pi-}d_{-@-}nlfb7xqz z)^2C77Q1=#?eP;!{rT8WJ*vyPRg&*3R#AU%!k4c{>L&g$y>m2ha@=;lzugyl0)^OQ z&xZG}E=kti@L)&#zF^yL>#ym^oNQ>}{a2;?VV>D^AxGUkUebl0TN9Wh^p-#6=`F1G z`SsYy``0nC`}LjwUcYa2=bUvd@X}k})7ukw@+b6LM<}T4UYNjn;(L5VmcXy&-(Ajx z>;G6NAiLnc`~+pa4h;o&hIj9RyjHLBVPcq2_3+cOu*+NC?7a8&_nabKyMM~2Zr_up z7O>qrV{q;8O{elB(->7t`m1=?yqR^V>sn2)W#_U8+Xok>o>9)8RG)ft&v!;OhUq)k z>@H-mWUh(-lm7fqgw(4`SJxh#J=JzcX^=S2fhBuNAAkA2XG_fDu6+xeOZ4^MKJi}} zzl{qC;vWWUA(mMdH>CqJ1wrTRODXUZNmDd`cKCkiG#jjMl!2f7VTJbZ>sV> z&pT#pYgXQ=<(;0{$241Dg5Bp{g?i@Cf#HD?zkghcpYOl6dtv+{hO9qcn{wvG%{#Y) zWkU4&`S-X!hpnmZlkN-MulMniul@h6Ya(MziYv~SH&6A`|M$>p`s+*lo!(!K>_6+g z+;sb{)nvzc>%RZG|Ks`cwpss0N=#fLmv6T2JX%!scEgd?c4rTB-Ba2kbHBVcP3MG( zeElMwt=-Fym51z$(ca1Bb7Z-D#~#0B9!C4>Z;5=J*C86ac7OEd_-?nRdB2kn{{HDw zUi%_!@8hWDsV(vv*X>r_YF~Ej-|D{e`sR0Hx*t5|f8y#hbFbacUvuYGPFa2J=GmqI z|1)d1?CLe1yTFw*`0mt8F=oZ9Y&d_c>U~uFcHJ{w$$E_&dbj^R^)h%KzvhdX=qvUz zE$!IiBU1x2zCM@Trt_&Gspx*@nF-DuujkJ?yCuFT^@j7Zt}Cs){^{w#3=9qu;613| z^)8YO3=AgQd4fg%|BnTaE(CxVyM+Az@Av<|*FCA+CuZ*)ots|Y(OUb&Z26>1vsa}4 za$8;RKTW1T`SR=Kdp4dZ3e_y&RYFmH5m z`u6?GUeVN>S2|hE*ex~}z3=;K`*w+m$M47bza%0q)bINle)!ZTqvnL$3!mw|vb`Dd ziK)%w_N$G|XP*V=sJCcKJ6QVeVw0b`dC$4{q%^)xySD4va}Ix2SLWNO_wV@Zrk3rq zE$kmx@oSgs-?7}25I>#y!ue8JGrs3O!keQ+ySTQli}1347<T-nQNpkIz^ZuXW>|%(C`fUs)GuIxZHRBevw`f4<*U2NnE+59inKJzZ+3&b!&Z zjzcr7TUq(nfv-=NRSV>mBpd4nv>a($#rEZsyKGU&fzl^aYJTa?om+2vt^5D!bQy7u z#=jQ1!saSn$^N-^C$^Ugu7@mI-xoD-L`*FuP|88$~Y4fUS*byXYuYS{wUwwjV z-K^)DFQCyvktQ@GVux`rwblL5xAn-E)*0I7IGD-W{?s zE7pL4Veh+7tM$uRHREr_Y`ViUB|nyLRZLl*(|-oDoGbC?>%bI*b z3tv`#xhHc}b;`d5p}9cCqwOAd{pLr{Uu@7n{*0CF&%N(VMpL$R zFE9Fhyf5X1^SLj5*18G%Spu%+)ud0GGkw?cH-$FuEW*`xJj@Gof3t}D)!g#NfVQ3N z#)AA4{!E#sRs5u0_393x79WNOx_7s$E3`hSHW%Z%A==b#@M5psvB%N>HI5uVdime& zndNgApA|~5m7Ql@Z@fn?-hG+#gOUaNyT7wB_{s%x2wWk8PhnKNT$c zV^?|oU-^r#|Et3+<{%(o~%M->K>gO_*p02kGy|U2txA@Bm&EH)7uNHh;Y_D1_|5Efx+Ks#Z-_L5S zS-N}qHkq}tbqn=7)u+7V59wJFva_x3f09b#>BxCqYYQL9o%Z@E#dEZL=gHRwZx#v| zm9+l<$fmQ>u8Murx`*PTas`Z*wlUiElZ+ggnwz?L_p|=cJj)oT!2GXD_rb&$N7Wd% zxCs~f`m*!R*mr2dGUfjNX4Y}1t+wy9_MUV3`Q!QZ%oo=;o2IDWk>=skHh#OmIA6i; z{`my&Uk_v0k9DgacfZg4B9D>Xxm2`5s`%K zrN^^oOx?Qa%agh51MmGS_6}U#nPIp0-DRy?@9ZbKr`};pxv=5yUbjf?%)set3m(P> zO9j|Uzh<5%Qt~x?b>^|7hrawOi{1MrpY_T1`>S*&)^B<%<7KlamF2^iZ^}&fC$LUG zx~lM_#ykl_W`S*j?`JNWb~QAvvxmQ|IYu?X+uyDCJ~YH>e7(Vv$5TG?*6^8 z==Cn)g>K5mj&*nIOYOZa-!(t^_3HEI|DS(-p5lEq{lDy$DfLl(%jOi`;5pH>?`nPJ z&qRv}kNDz~yFU8-FZTKz%GLV%ZsYk`d!m)pm)>mk@<^L}?ZAy+_O}&`q?g(461nK% zbvgKUPg>C*t$ zS>68eR@#mFde%MHU+lTfutqK+X3=58&924F4)+hQWtZq@n&)7;eF4*^c!n1Ymg(mY z#)htqN>yWIsBZVP`L-@zV(PNa-JaVuZ$#Ye{#w}Vro8Iw0r!f1=9V{8D@(SSF^0`Q z)m*=PfARmk{i{xMzKCDe{aoQ`XX4xB4W-@n3D@4Knfc=E^5TZ`bMDDs<>s5QFW>aNT-@28Td)7V z<2<``+TE2Jg@-sy<$SM9KWcdG`l4%7u3lZUJ3D&sr(d7%*P3-k?0F^1mGJdok!?=& zqvE+MrRMe;#@80}*BhUDd0FT4Q_hK2|KGk}&id>0l0{1-&u?45>5|KYzY{;bWxZn? zUi0IM*Q)4M(%Sn|bc^av#}>Jw^pV zMK6|XY&i0Je%amTNs2AUzCKg!;D5F(w(GX&xd!8i&C$zv4(z$VY`@H}Z)?}6pI)Es z&%Sh>Zv8av-r5< zG!CET{_;-Y;hxv$9+xr31x=DTdE}snr$eU-|MP=xWi#UL%5%&)ZL_s4)4{m<*SpXH zp(D*~(`|#-{rkDaKk|F#fB(#L48J#buQ1;8Y>Cj12iLvX>kaOHT4HL^wKmVD@Gkq@ z$d5Jm4lX}z!y2ELr*~U?x~R#9#B*=%C;J|W-g&i7W7GYMJxdpz{P_7d z&%4VfbNR;7djZb-+Zm=EJ|nUJYlz#8*}Q%h5v)6Fw~LF^&fWK*bIZ}UYwl0f{L6Hq zpY3#z(y{u|&$)KR?AL#-sNb@N^ZNa0WB+*-dhWRdjxXZ2!tK2O^ICP^iQuYBeior{g1eJxK+nZ7Rgd0NQsj`jS-{$HP*IiI^W zasIZbYu_sVRQ$N#|Jvo-`AKS@kIr`baB2PYmZK&AuA1I+IrjGGf+Z`&D-65sFV$Pz zKgKJgb^G@!^H4jp4UGS));^F+GiFqZTgrL=k-EddhM(zdJ(vIP_p{^w7kK|od`sI) zliFjS_cOdNJM`o0>!0Bw)#Zy!=h#oTXuBTW#}+ryVe`@%>?=;UmPx#*VA6T}Jc9ep zKGR?Z1r3iG?>{nMS)jz&oBc(EQNm_->Gq(d^&x2t3|wE^d)FPk+~0ff-=#-1A zrrj6QalEx}BRZT55lm0w+>(cKR zg0~b*zy0NI{o=o?FAIl+glv<$`MW!#dgHS0N!=%Y&yiTUwY;t?>9=jwSB`T$pH1qP z89qu=>f)(M%i7a^e(CuKb6VCLRYj$X{djw7{)9KYUmY{DFSCjE^iBJJw>0F-#GU@x z^ZnPy`$b=_**#x8zSv6bR$zl&Y3{#0$)+MEivxD=ns9O1uE_fO69%^y9eHs7&$fmp z+dzvqwE`CR-ix#CYA%kjTX0ij-TB{3E`=kfW{P)hW%ZPW3M@tt(hvxRpIc z@)+~W&}~&ma<1}!ViRHjrKfq`^PfBF`fFrRK&afNV`e0jn&m_>U zr$(CpeUy|a;4z>3s%)R`F1y!3ZFNry`6KG5i0aIK^w#X1?2A3`KSX6$@R>7R@lD#} zuk~DTqtCB4+7 znCrdH<}lG{YtAd`W_6KXk{v93_tN&9dFT3^LnTPym+$|1UhPq@|9ddAKR>!JZR)98 z!8Usp73v^M|nIYg(Y?eZ8{p$$f zTe}W5)}CSezunIFaqYwxFA{$G+p9R6zJBRYIbpuy|G2P{uRjBS{Vc4CIkQ~6vB_Y$ z;O=jCjz5cQUsnFlv_pRDIraNod)e)564K^~E!`Rs1_`+db!*LU?HL z8V`Asy&Y4()&?Jn3XXFZaNb$#yK`!o*2}(F*Z2b#e_{h3?0I@kA~;JvbMuK7h3Klv zjPmc_9zI^g{LCVC(KMg9^IlA<97~)Q{JCK^x%uD!v)_4>cH9qHz#Ud2NT4ggA@Y;L!U;_FVX-1y}=u6y#IqX*+hW35&x`mU(9-SlEF!0 zZ0&!bg!!v7lX&f=$AoPuNpBh7@T)qQ*ZqD z>cYrt8B>4F*qv8=`>RQXLtU7dzM)`Y>zBqo3K@S-yxV<=Q9k7F>tLfpml(YmTV_w4 z_;uRtdQYCWQv2A1X3pw-%#dSZ#lPj5OR5xKW!yARl?q4vZ-l!=e!|RC583Z@gFYr!e32aJq!MPvTW*SNA=YU zF4(Z=btkmmd)u9#K4toJl^<6__s3t=@3i>*JibOX?e)*~Gu`f#ROd}*OBTphx3;yO zE^g$hw_dL@BzRnU3E1`t!=ywD|e^jgrqdKVIz^wdcDM$D_;AifzBwZ<{#R ziEGz}uctjPWu-j0u;XR@)f1aKrr+PJ5VCUWs_ieUKIN~PDqMb=_4tXarX|8RT>>`s z&0jh_cz>yt-liHQDZACvwl8t{^0<^ET`$8ZyzRbzD4&D+r~M%ZW?V9NtSR$e>Ulz6 zMLd<~@y=Dx)MDG#d5MQ?ZFge!c^;|Hwe3vfC${H>A5SQ8c+5M+lIp*lud;sQlvk%O zo5gLa@|<1QvqiUl#je9*UIN}hY~LM&)56#nHX4S7PQG00xQOANmhOv5Gmi2s;8}l( zBX6ac$v2k6;+|6uuYK{oe81h~3ck4++wS+Re{b$^?!e13sbgJ7DhiVC&V0u7kJEJ} z<6Nd)TmcOsjNkVPdnem4H1JKZWhyA2Uau7zI+KM#!DYwZ$ot>8avc06?u5lE)kJuN zOVx|-=c|7IZjbm?m8L`Qw`@N!QAWdS%|DTp2<^?Uk3LPvI@?-wGx%0U@?QU$$rBEq zJ9@aZmZ4(W%j01-**2a#S2XCG%m1zsR(b66^SOlNOw}p8oU+$^N*-#tKQ{7Ow|;4k zl$A>TL`#7`Mvg1qOrKJ{-8cQ`<;LH2n-Vgm3_~Oz@f>5x_9$LzlJ@m<_xhzF&-eOV zs#19WxaW(I-b?e;oxXdo`)4rMZY?YB5x;8p{L`f(?O)#)_2)8d<%!-{`Tu9_2WIh) z_frk-FE42*INp6dY+bX{oXhjqzI-G)mG}A00w?K*{pahCCQNwz@_zaB!p9mSk1l@* z56f7+(R;hCe*VAzH_a@y>fB{N?r}dADO`O1_^I8*R6l`e9ftkRr@S8vsy%_^Xc~=7M=1u{}(=upEpbX)_%cv z0+$v)V%arq=fm7>{@2}V!=GM%w~}wRcP7IHhJRYI4xW50O4 zUS93h?f-4}$|VL}y8I*M?*AXP2Y&qIlsaB(9>$jB6#Yv7Vbv$`GttJgegv(bv__3_ zvW1^P0PDXCQV+^J879~=ajax+nKG$lYmiqu8^eK{3omZ`Iqwpu>hgUiS+|Rh`c{>m zkv%JHyXtPpn-kAlEb|^*lYL{*a7_O0o%&3RO{-J4+w8cvdiwWwEAJ-%d0%om%i-PW z*Jqe2oWFm6HS0~`e#6*HF-Co#MIWzzzw4CIf+v6Tq?i@{*F1PDl^WLnT##wwDWy%_ zM;}kKU0Twx#eJ3S#&sOYD{9|Q*%|#>EbjicGsR1}Q-4nJeBLXfbI)&8fJd#EvV+XZ ze}@*8U#`E~uw?D*Z)aH+Z~M+tzrW|cWbs$U%vGPy_hl()hTiQz75dJhZRvAW!{?v3 z)TfBvyZU@(;olxNaf_#$_H13F)JAd$o(R zTKG;_(wRqp%CEk5K4YtCDC>WC^4$OH=KkKRv+#R^{LZpNbNlOGY`FFLSMA4)QvIMJ zxpwvwYu?Ot{Py~r{nfRVCYz`3UVmeb?B%!7zf$8hbdT~E-rD~yVXAm_9|67z1x21s+(ea^NDpn^3mVSHpV68TzVmVbmn2D2hPVljz2lz zax~WR(ozH7V?SIkORVO#oyA)}`Ky6rU(LRdUxy`bzF62&r26Dfd9mP`Tiv@pu>IQA zGG*elkO}jJI$YSjUwXCV^SI=H>A%Mxnsv&6Um=suqzmCtMKx%2e(``Oi>ckQfa`mo^+TZ>cBQXb1$UT0?SoAz(_?c%E+ zqF1npZ7TVb@co_RvM2gIo40(GW9Pckm;3VcOsR7UbqSYqKVE-$XnFfGor*8rQX-8m zEvc`UpJh77Ucmo9rlO@}(~cS)s|B-eEcL42duQ>2(mq87sWc;_B#9tSo8$XMj>TS7 zOY`({L?jxG}rX4>HG43TUOlHyuU8@gKjCzxc5bpQQ=Ta z=iL+U=B>Tqu$^u7Y5jLh?n29jcE0_>Io+n%>hbZzO}Q^tRL!klag&oH$l>+U-KLC{ zA2@3aPS$12_%Flqp-)T9cJ(fsqT)xHo)+8N{-0*h-JoCQB*|QK?iK1tc(A= z$}-4zn{%xvxzn3lH+jCh7 zjTJu+r~S2Y((7gXaPQLw#-4vE3mRr$5Iw-{@aY6|fn>Dy)m1@ELJSICd*h=%)<3>m z`L*}v?NHZ~KB~socUY`yx3aVLZWda)bc$~EJ%)w9x2{X*Qr7vrnz7l`Ws{khf!_mu z?dkrz-)Q{St(_^t5V7m{jOmO|qAlm|S(Vqg{IT!c{lAymtUGPaaK&%4L&VbwlT$C7 z|646OQD;TsJHoDRt16^&ppibxMVlG{>1Z&XGP62DrGN%E`6FFT@%foah#dM z@}!L5=MPG2?gcP&sHFbbKb@~3|4nMt%Ud%x?|KvQY>L-TDV9g4x-+hqKJ!?%<(SWZ z?ZbfgCbD|?elH@%?q?|T|0d~ zEOe#P*~jmzR-d^N*y*_MYUN7xms6z8nAaY3?TePpdBZ%_XztOr`V2Mk7038Zeyh4A z#{N<~n>F{M|Drhl%X`YJL}T)fec!x7nBDN_?1F`vnHQIeuPj)6X>!(uk6x3?xKm`S z@0k85KlfPqxYG|!{oVJEZeFqRO@PfjTb|CJOc#E0G4NU+oWyvKEBA@nUg_%40;!1b z`BQJSsWEK0uH*ePGgkln`ftnYdwvBca!PGy|QTfT`WVfL~osb5O(diOm#)ARhw_xdGU zKj!ZICAr$6;Y;E@#tp@#md*8FYi_K(w7~jD;yLMmcan1NbOtlbyb?C8A=>Nrk4+it zXKZa$d675!{hXUZ5+(Jl-v6J!^M5$!^zvy98`ldgPyBMhbzbi2+>j90SFH&jc5V9d zYUf2YPvgrctM(}DRCIoR_pUb+gI`zPjzbpxOY7xAruKh7bDP0NuzB}ZThFgrvbvSa zli9Vdtz&d<3boLT{jPa>7Sn{~%~9u*3-kLz_T5=u!u;=(%~9DiPfGV?Y(8C589Qh4 zW1E|*e#f@0c-ZxFRbbrWw}%t{P1-M+@wc2;0kZ zXHSes*j#rsyI!vB@m-$16>qDisXsW~P<~?mF{z01srME$Z}N}dee<33eh2NDPnW)b z_uJ><|B#s5M?W(y$o!uhUpQWnX-tYq|2N!QJO?D=K$xXjo{;RL+_!Yv+}FtA1s{dvS|}*DF)X z;}}&Y{!uyMnwFihJ%O3A=wJ;?MSCWbIAhSC`h?vIlP569Gu-=?^Tf=smp7rV*6&LP zr>daimVW_W$>u+w?96uml#)8{{-vKk;_o+PF&x+Z-50I2;oqISM~`OXDF8y?8iw=y(T*O%(2 zXos%OV!gFP>WwT<-n&mnmnQvVY3hp}KNOg?x8=-~BMNW4A6#v_ z6|d)OVAC_*NoCO&xeq5*7jN7%`>V}mbJywBHyN%qPu~%@K{CtOI^5Cn`Pm(D_c-k~ z9KRmBJxexXVTZQH!Ol6~-s}C+KTz=S?DkB3hXjM)pJV2pKl-loZ^<#9)Ky$B{$AcU zZ^2BlRlDozwJyFr`Oeu#wXI1Z#*O)fvDdt<3zi-C?fVtiZ0<1W{@nUmE`3dFR_Qde z?VPx0lG-z8Ue{wb?>u{gQh!deZn*e)Z+}03`us$OjZ;+_YM#yACiu^P)4#?4>noUlZ@9YP;)i3*DTjY~ZnXJ6!|}^$ zruvHu1aq4o{$+S`dV2D4!Mk$DzAk$Gi|6s)Yp)cZ&yjv`c_G(()(Z#Z6?cA7Svs|8 zCJRIS;xLN~v2z!O+%W&O=B-R|nN`03`|ryq?uzAOESk!*Om=c>`HrWO|7vELeKTC_ zV4ObHyP#m1^*nI~kJDdsbeOgOm!Avy@oe7lj^=fH{@2ImU#^y3zV|>V!va=rvnST^ z5#F`O>%JGf3VCU4<(ayE@rL88!r$|Cd~Y>coa7s#G(oE0`uggQpVK|X7;RKqb8l6p zryQvkb^e_$v7{)0B|L}e`>nfqpWm;3yv500Httg@$LFK#B7WXCxhocM?Tq<7n@I(> z_E*;RPl@^dve`G@kLmaa ze=ZIM-q^phX1=r8CoRSjGt)R`@00qldN1{x9_<&t?u=9jtW+v{)+oo zm@G>Zda$^+YT9u)UWM>W_jid?*Z(Z$3+dZrD}|K$ipRI^`L;=G9ANen~Lgju|o zqUw7?4VW2NmVDW(Xlc|XcEbaRm|oYU~>)q?O%QI{)vJ?a|GT1GsZDUoE`6qP{UGYDe40eC7&?(@w0EkHZXrjI$^R+mA1~st@%BHV>FdC; z@cD`4gGQ5XF!bKz-W~L0@}7v5p^qXCRh3O4x9;ip zg+D(07mqM24&J%uh<tw~5>wyZy4@=E84P;MVEgHleqI{Yb69VB;nQ!2 zf7kzTZvXq%T|uqeu*Bk1e4>#{zS@U9r3!B@q;S_T8N7FA=Lz|vD7Na$5um(;O=0J*=}`qkjclA68S<;3%h9Rz2{ zm+MbB_jqTC@~Zc*7aWP2BqZ=_W6p^s0ZP~Yw(_aeXU)IUu=LU6E0*uQpKw(d7e45V zYm3%hH6_HaGW70@MU#W9m}Rz)y8B zFrN8H^IZ0lqn3|a+h3?2{}9Q3{_#G&Q+*;CFZz!iyd`0^=IZxPUa$6EDN)%O8=vN{ zSZXrq(#*)#Y3{S?-LBPstai!J-QV{_b>05E{JWQ|-QCyathnU8YXNJc!&0vdo)^pq zuXa!IbTtkab&ZW(*fj0(^pGZ&jnRE8J@s9KKOQcf`JyfC^XsMm?$}*62$f^?%~V{Z z`}5~a{^m>PzrMFA_dCqeQuIV?^3U{xg5i_u(}gygvMu|3^09=y?D_hePrHtlPna=j zsmy-&>o+F-t&-Z_Y-9IC&s1Ljb;!p?+1maKnvpYOouV#G(UzB26e(+FZM6?Pzgc&; zVgA|;6LJi=RT%zpz0Hu0ZSy;D(|cOxILok(X^|K zvs8cViij6J&o1`n&6lS>>C?)C1=Z@0-Cw=;XyMCKY5yN2n0#-jH(A5-Nlu`Tb)$r4 zebcn#&!0K`esnlWSXE|2m(hz9m-Icp9Cu$?x@|aSA^hdtPfz(shJarOt}?AtO0PP= zWAu3&&uN_?4~ul}_jBfa*jZB;y4RcZ z6+W+=#5HGDqgH7dFt9$Wjv8%d2m}k{$E193){Z_`LeO|Yx;|`z8Sr+KNop* z)yeY0=FhCb%xULq=1?-E0t!9vlB)zR zY%Ggib?NHD|Hi+ou4NY9vTmCFFn|89#U8EQo-ZzYo_Mk2FV|%6bd&S9|F+M)sOZkw zB*vv3wDopZo_vk1RiwPi0-My+J4<4`|K*iDXKAcAXJ%}YPK!JAu0Hd&w6Z(j;}7=E zc|r`Vb-#38^kj6o9y&7X*PB1{!uqBb(qCRTzx}zZ=Edus_Z#Hj zDX2fL6?`6Cuv`DN*XyfaBOK%z%?fO^*{pYEJi9J;mM!J=CbmA`%e8*%xsx)!?TDBw z`OI2y1tV_(FN1^mj&nshd%KY&MjLKHFu8=<87TQ#tBdV{JoxY@$$Wur|;Een#-9zP_=W@Wi49j^``#M zQS&ojPCc_+=(y+9-k|OI(^&rpG9JiK70933(4sDXXJwiU!v}#IkKS2sc>d5h%k*68 z!;CH22kT!wQ9bc0{r=Of;;O<9nlqm)&{?sn<-gG6AV<}{Fs+Lr&ng#e6Y}D^#CT<5 z|CAR;OKaBrTfbF*;*|dDaWhl985it7y60?YQDXh>^XEQWEBrFtCt4G?En*dqbF=Y( zo+nF!1J(p@%+H>+U3bZP4vAW$XzuB)FOAa}Wy=m1+ka(HH9Y+*PjXQy>-RfC$x-Z| zJ-gqxzexD5D6&FK;HOZ8HS@=<-`9p0yKG7E@YdfVacMzBbN~DclIBb2?Y}Cb#kc*- z&KnVCKivK1*XJ!_lIibd$n&^cU{)*;|2g>e7sm$2;2qaYeQq0Hi!0lHA!&M9xvjy& zNBv@^b5imugL@=RivLJFImEtWy>r8Ym5u9pj@y=Pd%ut&X*)A}&9>G8=j;@|2Wc^3B+?*4z?Fkyc^ zgYCDIDmR~`-A|T{>lLha6y`1XW~}h+PS2j3i2ac#*oiFn=z zNw*n3mY-=@>U@xaVPUfxtHN?N1rKLlhow=W2YDDiT=JYN@crD2S?ePG$}Y!l{UbM_ z=8Wq?*P}YhFYD&MGINMitvB1oBapSSKl1d%{|qwv8#vQSgktA?=Kel~Z$aA}b7Y`(o7OC-PEE9f`%FY+-l#CxU*`Nr{^^MyQdP*8$3a0BRj*hi+7HF-PrlAMW-t~)9lxmuFh|(>x)kp zsC&KXT_dzBM&a^Rs_hF19yj<`2S`$FBR?^QJ3i_X|bmtSOV4j`S>C`)oUt%+AR?4cl8p6JEbnj_s*6 zvWQaqwyt^6w+T-y?oWF7Zc~BZ{A)GmU+dgjuVgGO(A)1k$7IW&o#IOTKD^@BO!ZhZ zc3xAd50col?9%&Kqjs_VYeG4>z9@Gte{##4A=T&}&wA!#&gT5pn%_PwKVZ1+``Qmv z&)&R#l3Wk5b);yYJ<@Qo_4sUUG$)o-=T!*w4bk5Z0ReM?TdzN0lSdhb$ynWTR z#)mJ6|1kO6S-oF5zk{9pLYoUL25&Px; zCcFKvL|NYzxtgl_UzdF*L(J5;ZHj74VwTX#-uk%+OyT{Mx zx8;9cw-bBDOUFyIADuG)>@wNr=-wGo(|3IMzHBkWg`$neMPv(hT@YO;TYuVZ>4(rh z{)YNMp5KQo6(s)VSuyAJJ#l@g&-(k%O1lXR_a3Lu(7V*|hwtjfMOBg)80sJBe46{2 zWmnBf#~|6*)bp<%^1j-CWX1iRyKZ%_DhPC{_h>&U{^Iz#VyowSBLk|Y{_EFQFOn|% zaLE1r?mEW2hT}hfPQ32_e$HJdi`jV-W;{M$U?KQoW3>IV+vXdK*&42%&x>sTyU1}_ zUB~{TmePhzH|J+e?Bf03-?8P1cGZfK%KAEvy9TzVYJc?h?0;#TEAR1a#lM=hhrS2T zUt3>!UgAvOox4j7XXl;xUU$Q+{LKEVFZ5;mxGH!;j7oF4pS%%M(ObcB{`AR-)6<@& zFJOoYiniEu?9b%3X3@sWv!5M5^YXp?_K>RZ59xQglONX9b<_$UJ((26`su`Or(buO zm6!PG*V~KN7HyWQo`c z3bz>_sLql|=IVdpBd&2TZdczwBY!K7f{y=-r0+7+h~`z+=Zo>USw3r3jf#C_zPy-e z$C8r2UEzyl_t+=A6f6=30wv$$GJW(%&WGj9VjY zcFpE7<4wzV=Van7uH7S|6x<#D*?kMoG>KA6_l~^vb=|u;8NV8uznkf?a|gKm!cBwk5w(-X56%lvKSUj92q@f4Sw0l%b&q-`TN z|D68p&uR9`_nvHsDBxq->t^uw+A05&%-tXNhBw?*P1;qJy))?MkE?du5^P>`i`nk#$?U4F&8GE`86|J{-N#Ms%r(S^Pgw< zm@M!s%FqiI*m$KsH00t<7yqm2`}q$1{c`7#uBzTw=Jd*$@*fYL|5zu!xLhgzzw!Sw z+>4@~J*vI9&i+nNS;*qcbyJkTt~NMe_wKx&;HCbR^^dBe)BfzZ!@K3P)$S6d_Sp;m z1Wc~K|GlC6`I6Z)ioUH<`u22s*v<6!6P|aT*xFNZXv@xh7B4v7?>VtnVx>~m+&d?% zKPS4*Q9cv$uT>*q-Smv_X$OzRG-sEuQ&7`a%0Ii}+ogAFwugS3_o%47e+_?j#B8g{ z+-`P1ly7~KzVdB$b$xGm-u$vDXLco}?*1*P{_}9?s#ULEbiJN;)#zBh)Z}>Mv+Z-3 ze10i68pQc0mY-rPwvX<8?(0==SCFT+-|g4@1%isV@#fNt#_O_sOI_J_hD|Rw zSj09jWW{$6@eSW^tURn#&iI6BLU7m8Sxc6BhR$SQSkN`^%BBP-?xf9XuTyR2M;b|L zwmZ#G(P>-Q|8!By<`hPwJLZ2v8S0(>v8}A>dif+}#Zrg7)ql=@d-FF$W*4Js>)L6P zoL=4Yjx`kH?>YS;YTYH<~*=3S3Z?%VjmN^WV%{{`oC`@8fn3VoQhrhc`w8I$|k$$x~!ZhcnaezO0Y>r{^` z%fjk6_)dFQ>hF|#?8uEdVw)24p6+|%`seLq>wu!|dfN+Eny0=z+g~jG`sRDqKg~&k z@2^ePVSoL@&*sdUV+%@-yx-lluC7Q;mDbmXFZi9T$t!fLa`h4E*H>N( z^)2VLKP20H^qFN<(5LCusgnQy#E$z_iQgA?U$}lRR519l?$YaR zdl+1{&h*?H9zRniS3XTGCvb;K;MJmziIGvM-iD%03GSy=>)V|s+i+KXpMT-s>o?ab zz8Rdz%;KAS=6Ctwll5~PY(0P5Z!0UCu!}d}_^M}OVPNd{*BhQ4y5gL5@-+YYwJKA; zIi-tw@Ro_b5MQxmTkzu~?|m#r4Ewa^o>Xpn!mvQ()>PZB;;@F7%kLW8d-Yo9pQZff zDeVWv{-4_V{k1-C#=A6w_b6_f>5)}+w~Wl**FBsb z9=`3t!lUPx$NY9?RLwmcw6bE=DyG8jh^YK|Zs~uI9`x9e)O{jPIDw_UoN>(--BsE> z`_}|J+Uo2qxnF5r+pLsJ~GNj{i?dAr~B{#OH+&z%H>3{4rL&;eS5^HSVd_U^Wdw$gy zv7cu3=J$WZ=8Y=`OD*fvr{sX=Fg5UGX1qL_i}5kis2*Zm6U%+|zpdM0G7|GOL8w;>+1ghf9aI2JI7zPlM46&ji*#Gvr{*4Cpx_M2}B@7eKk-_9%MW*bB6|8&le z$^X}NPVxHV=N1R7-2SpUgdM*tH*2@nu9W(ktAV#eznc5&tpB@<@26R*kiwFPJzNZ4 zdox9!oHTZ=FRC{CUp3EWkEM=8f}Qat##eV5JDBp*nkTTxCgz-u>N91Fxp$L`(;?1h zw_bo?nFB$wqZiM>np5^iBk;tWNp)g{lLK0I1s zc_pp#Q~i}rNvE%qK7DSzS7R;H(|Vj?@w%|H+V_lq6h*I}W4x;9*6U@nR$o3}TJpB{ zeuSUs%?ZDiKEJ%YSS8Wy#TI_6#>TeB;bmUmxYTJ&$><@28d z&HgbNPhoSbXRWjde)3{B!|X379oX(^&E1i^MV*r)?TXagn}U(&A{<+PvaShzfA`;x zn%9pe*{n&wKY#xJ-^z*g`~MwoxEfs>VSeGl9OcIu_x~ShGyPTTP=7H`kIgeAv7YB+ z#?s)x|IN7;84Uf*Y=tgN@0azzh;XRqD!E{H)KY&KV38M#eg&I-;E{(Vz4a(eZIUSYcvw{d~h$RI$-%;?43i~=QFe4RT{g!=>5HI<@O2n)3TpRG6+=dkrb2N z!*66B=C7@LU8;3;SlxH)ga4i<6y-{M=JP0f7JdJf%>p0B%l_Ia9lJjbh# zC!Nxs-d6tC$o@m!B1*P_vv;GTzoYN%`d`l({_LFiTF!-G%O;;FdRlXcAz4z(9LR9fJE4AEzbARp4 z?$1f8{~O_K9q#b!<)`${cj@_`H@;lCXx_v78amaVyOl%AOX5Rst-AcL`LMP3viibJ zhjsWLpLKDF(YecOyVYpYce!4hi}^iz%UJz)UNPLno$T9j-{j&d$!cS-XFhw<6VhDR zUA~IXD4NZiccIvV$2Rr<*{L(W-xf=ImKE{h8B5x^XX*9rl51W+xiKSg!$pB30sT=d z1r8gRi%52@>E`>Nc}_esDwI>FQPcT#l?~7S-^Tx}F58tXzq5(|ARG5RD^Q8W9>)71 zH0q=2Md7{D4{qPEv@Ngv)qnkYc*OZ*DU$tmdgq_F8#dbP^;_`sm8`A&ZrvSw%D7GS zrYE;cC@p22!WvqyZZ&z{XFK+ve~-nk`FZ)E07Ji2FzbQ1PYgREtaenmH$J!->os-N zDFz0H+uhHmTdj6=V?TY=kh-vPe?>CD~3z;oWFL+kMVYKJShP7*j zBcEL^+%at*zb|X{OU7)5j=q)`3?IJ6JAy3{I;9*_|sSOUkjh#%Gjycd3x^Lp8W@3yq-Si z?)f9pyLZhFR@wDOpdnNL#aH>uzgs2cssr$@qX-?x@~V3x6jy|X}Q>| zLhW2leXJ?V(@#8)$`8%4t-o1&WJ%z5o@gx=&FINH^|yqaa*OH{OW*$S@WUftA77|& zJZEQ6$2C8C-`r)5^PckF$bFnECZMhP?zKa`>5WU_nYqXj*zw3^805| zLg(R$PfqXbv~v71Q&hL)=kYkJFrRlbg>;@qq|cqZW#;7i{n1}eLYF>tAch-c85kHi z5`xu5!RsEJ|NjpG4>#EV{~!4Of0&)r*Kek4n|4aP*r~n8E4{+4`T?WCAJxoX<#DO= z`2Kx(<9)w-t-MLy@0XSLn1YzrK0d77rDWYV|JW>Bck?Qiinn#_1|~O|7QJlPT7RF} z_#SI(>or!T;|;GjyxeWixRasf$xg-%_ZW_>3R@+r!oU#Dk@@cbvki`?y+7p`Sh$6q zx)CsK($ozl>q@HlZ_nch3OJ;tRmkw*TwqG?g>ypr=C>c-l)blZHfKU)MY*!HL)qS$ zTNU2a|E{0bIB(zmwUeIyI2F0A_Do|+m(`5r^?&4fPV-gVER6{H;q*zZWg2dbV`><;Mx;4D1b6x8f`&&Q@t# z`|{xD^$G6vHT+CBW9+8?nmPBU#xKLVuYLbabgt;!eDS%HF~v?c?s1*$;Z^L*O3y`J z6Rukt^RMR3j{5m=Txb8*?0qG=wDViU-|y>!UhjM9BD%f%@t=&(XHFEZ-?s13%Vi&* zg&TLg_?+JK?#jOpU*G@!);_Hy^!@v3+ApirWRoTT|7mHnT(xR-y?e-Zk#%+|jOL8G z-i@Ml@tMcYoLF@z`+V!nf;;CMRQpfAu3LH9)3WYj+u`Xy@}DF}Pfd-zb3{z?-Ljqk zHpMMbmB>xt4!@%-cyNEF_TQxCd)-T7vaMDeobmJ2gSBt2Hn$bD9I*O3b$RKgXP#z0 zYMkN!%p3jYV)vi_+F}J+2ZH8rnB5{=YNKEO{2qgXKT}TE9?P5q z-%iUOZeI49iMdASg8qcFtUL^?Pwp(pEqFaoW$P-fDV_`sk23w)MUJIy`n!+g+x&Xn zNsr5~?6h*exFF_xW!~hhZBtwoj8~uRWfpk%-gC#tnUCHqQ@z%AHuc7a_jmSW{{H&P zRGhKg<7Lo49fs`9p&La^x2vsG^UKUGxmYGH#bfa*hj05Q zw`H67%)f`KI2)#|=inCEbgkFEL;G2hY2GBgz4hrzHkY-o=bOth?ofL+^}(b`>s4kZ zK5yP?dwBH`otsV5?lX#eupfJWdDfp!k%sTzDn#A1Q&T=vJz-$q*;6}pM$Nwb%C{z} z2hP}^4&0f3X|C37b&n%`U%ZZNH#v1b?se_{Q@1nD^Cg`AGi_~)7^~N#=xaYezmeW% z{66N-meu`|{Pl0nU;3_nt=-mC>wnj?KUXcw&3+}=n;v~B5c+EEdikQe-&gL|e{lP4 zZhL(3+nrVk;!I1X6{cL)k=JF{Gg|s%zQg4ot6o$*biE#a^FXQCIfet1nSVsT;aqCl z@A&)e!4(@-lm8u3waomfe9^5;_oS_R{g{{=Ye3rA=Xuq&P(I&x@}2WFSU(lzGul<(eoQ0 z{rOq<=bpvWyK*s#*IxdAeVF@BeLZt^&zn2%rK=C^+U|eh`_lX+znL~Xy>-4pw>y6nPBW7>Tqfy;|qqHlXvk3EfsC@WN|n=Tdx&soTsvX z>x0nsy^@>mJv9mvo)Tt#`lh=EvqhEC9rmMUHl-8)`QB9W+Z2_1+UWXzGwID=1@^Pm ze|VRvX~b}2-LyH+6CT>d-r(lAd~E%@zk%xNj6V*SeYR(MFBbJrjZN1o;W3Bio6?_$ zvSdR2ME{-K(w}=`?=wC{{e_;Y4;K8b+A%}KNHXL9g^7C%v>7a3zGZu#ysn+~B~P`2 z)GvF5F!v0%tiO@5;d`@g?E0quaQf+A+v0iVz1dXH-_I`1khuHXTz>Ukalah);gV{^)CI(XVydQ{ttPn$Q2awN&x+H05_qW~nar_kS-{ zepmQ()`IMd{=Z#ceh++VBKe_wtGnQ~n#$67dwJ)DeGfTZ|IU@ielI(JY210sUc05A z-aXtM*Ssfn_PqMJpRP1qSUdCXpVZe)mDf-HIjC^uF5B&*HTPn@mZ`k?Q`+}!Uzdtc z$`il$O3V-Ji)xP9*Kvtl6+7`Fde^1&vNtlk>pr{+<6~#YmX!N3adGb7$0t*|CVlcc z<5FCr68tgRCeLg7WxpRcBED5N=jJ}nedt|&yzresmGZaN6Fy8!73%BEKW(kvU!9U^ zuruZHTc2u^xtHEIa!WN7_fJUHy5nsn*ARL@pJCoDohN2%H4{w(5_4Pi?g+j-7h{_6 zuW0GMUpYR9E7#okq=5>EQ-hZF){&t(~m&E$sj2(&jaq_>?8yV%xI9g`BJ-xU5 zL*JGkW+usekJp`M-1ar=JIh(FdImNfhE_()9}EmjrrcQ?n%N4v!DQXPgV+A5-tal} zsP5(`$Cpa0kF>n0sEPFob~;=?Q89e7sOpN~s8a{rc)pcvX81QL^giQ<5}DLaYsEO6HpFja;d8SE5c|HmUmHq4)L5 zZ%Wq)J?9jd5M;D**2`ADpU)F_uWGDGIa=-gSoX+XpD>1i-K(NEd#{O;o#kU_A^u1G zd~DO?vbuu&mrE5>&wdl~yZk!GO(SD%*6&=sI-wZ?Gj=UnG;hzZUES9&FZ`>sOzx@T z?;Cxt2R+hw;{Eqej&6#&xc=|URmn>~>H630`&|DzxNmau%;LlUGuMmEc(Cfq>*SY5 zg(8*T`d0t@{C)1RxVnjtr?M4Yza?T`TAyN*6Q6dv`}i^QM=HCj%*+12Ud@rZWz*6h zfwNL1epFpxTXf{pJMI%d_J&TJ(cieFmtj+t(K+$`S6=JLR9Gq9I~*{z?bn%g??e@R zHD%tvIa+$mnCpMQpxtek($mzmk?n={{x=YNM-ab00v~lIOQe~Z)laETC z{d?-*4y%aSn>2eu=gqUcv`c*QlMhvTD(xL@l5f_u+XU!t&s9w8y|1idyXVWcpy%fL zueN7~Xo!5;dFj*3cQWC*Ofg4WOF zm-Wv^)fJq0d~D&4|1B^09PXCXduH~hRF)^d`Xf@SI7%TpNNjUK&{(C{7cxB7cjtlkehVSMnIO}C! zjs0T9V6#;6y!YLNw@V5<6_47_oTaxpUPWL+XV%oYva2HgaNP7=&@jo(`_#01)?ex~ z|5jb9WhfJrFZ*yMW^QHPH2v*8@7}BH+j?&-E7^Y~koSP+p)&`a*6xj!oboLv@zm$b z-#4%NQ6abT^1JVqHo_O@zTWra#c7vQ>3S-C@AFc;{{4}auiMKdZ0q=B{=KTG*Rh@N z3a)*u6aTVg+Tq0i|JhGnzxJeK|5BeVT@$YsewkMP*Hj~xW7)^I`EK*4l}7Z7@A`Mi zsU+O$f5fhxPow(ZO#PoTX-(+l;7a4*Qz3SoGGu^k8kj_3A%N zXDnv?d22^^d`?8YH0$X@q5J|KOH!t3t#!^zw9=ekoA~1C0&%^ZH_f&$b4%pSnaxr; zo|jg1AKo}?{ma+vznR$>{&CH{V76#ZQDf^$(OVbH?lo`nvXEXD>c5fSUT)3LiT_+) zcSb+9IJQpYZ^8e6mW-SCH(owfnmy|T+c%fFNrs>RFx9`h?Ke|Wuh8@*&{J14VU74Z4AYDYB zFX~@2t7}5#nXJ#huY6r|X|Hr4L;ak;n<_gQxT;G(?|J@hdBAgyy`AiPRdRkN2CO^A z%Mf|z$D5oRvwm(}xjxdEdBL*9S6#2osa>#7qA2dcY72G#_@Cn3GgopK1!ZpKlwob1 zvh3xK-(QZ#IBUB!Ejo0=`GrGlKwbFTX|HV9?(d%Zta|a?-@j9B+T*LPUds*tP^POd zRsZ6@O!Ugy#ZePok_>sahRw}#-*93-@5^OhF5f@@$JI=S;lFRX2-lR)`*Po``>~UO z?ZWhJk+y8hLz0y;ITo*2eqFqOATN6I{YQY4-DQ>&t4_#J}%9v+kI` z=f4|yMr+L%#N2sRHt%Naz25tZ`+eT2uTHyB%JcYgO!3((?_Mpq60pp*5K(334G`ffn0hUARfrlR!;0?e`b}9LH5nE) zKTBorwr+|$Djfdp7t0N+H<=0jh2qBwixMS_(hqK2H*XlRV)1Qkg?zzA3`CFR}59cuaRY{t0=gqVl z&3Dxv>Sfvg_p3-gIdbOS_lV3lJ3{x?%Lar#|9>mDV%yDo(c2b2=Xcv^wrBbjkB~>g ziQLN_V!!$A@Vlyef_r5|h1DhXS4HznRJEO)%C^?*vR7wZd~E*uIynZ$viNXa17^ql z_3y17b)Mppd2Jb6QmwSBcK?YthU>lUs~#VWxi5cypVFHr0?)rLpQ7-7{kt7o0*&S# zyneI(g?sst&!+M&>@(wMa0CRauc??MTpS_IR*v>Js-h7 ziU0rWZT|oN&ybqDd*8P;$)ARK`evhubzgJU#N!6%0rX)|| z*1By+xn8;yy?-ONmTv>2${)poe^YXF=095%y?G+fiOtqlw-+pbr7JHd{fBosw=-*s z>iN9bow>`!{U=47w_cIU4Q3b*r?GYGWYn!WJ)<%+Yym#r3vEcv!#+4_+MgoFYY-PX64X3 zcTb<~=l^`M-*04xf8P0y%ey=IY{x2-5Aq^r*ZTk7pXJ^1(NsUM+qTsj!3Z*RS1GTeTd&7Tf;xSS5CvTfVJIuXfeZwuv_LYqa=4(Im1 zV3#`K_(aCSuRb&82}ujxJbvy{&|1q?^#M{BcKwrjtyq?LcankL_WO6^M3;Umky|Nx zi$i9~tAN|`i#9x5ow{|o>PjY?p9<&9=1*1JvTp8CQ&!#NPRDi0C+)ZUB>Q(?JN;jL z+glAz`$yAx7BFnneEUZ-;}CPh*;gsDjYqi-%-&%7>Gb61$B#&VEm2Wwp`&~4Dk2J&bjT_xR z&$561`1`N^<@T&1wkZo+c|1Pux_4aSnUC&)fG0j#2DkR}T##WE zWxL9ya4}bH&ct@cu$Ysk`Z|Z@W!YA79}s#j6mffo^aq9dN1RUI_yn4wg%}!~_>8{t z)Gpcd!u8~|TUHyVUO#VM9#L@mrTNKgtGZrqSFR0R_~BTm-N8S9%dT&KlhGABL-b43 z^)K`P#jkKa@f9*u3*c{ny;f-~X~U@jQI=D9f;}VC{eI#KikkCN#Z$FsbtD!7FyA zc7IkDT>18}e&)i`-C2tsx$d<-Up}jOLcX_s^=-Q+u{A#)Ej#dkzWISEy>V4Vfy*xL zdeeRX=dAVm>uzqEtLt-b>EjP8jJD2qd6j+KIs=u*siub10fQKDX(b^R+Yb?(H4*cM` zv{cjo$H#9BJ~v-|&)alA^`O1pFZ;X8Vz2%6zkGFZm1_Od(y({0Zj>(my!f}ls;5t% zy_}x8eQm4vw36R2Q;*_;)fr1iQ=ZJqmbi=aoU z;=!j+s|B5puHTsWc=Nsf!jIDHCGM_&G574m$0wG)my`aO^gg0xgZ)m=HjxnPY0-IZ z0`HSI)z1Gg+oR+Dd|e*ZKTEEB+Hvf3y8gr<<7II*o6J-tL-z7>>OGs3%%b6(E59f1 zt*ph42X|)rJlW!IDJyo={@d~YyKTN*+&QBwN#=nG8~5JX6X!aAtan>nAro_|u;ac? zdj0lt(QY%wk5_-!TD%EvU47|?c>I3(&%JxPYpb`Xt^0A4>s!O-=$Z4L=37pA{qwBU zC8je$hZ&h-K74y)8rRU=yr8)L=llP$Hu}kPg+4H?;1K6JY~my>{8i8IXN+Z;XzTT= z-5y81j+8MduYItZ&-QQV)1yZ9ftGvz{{J3-;Qqwa-OHb+9%Q{9IXfa@&$YB2_YYZb z|1q8CN{~Lkz^Z>U_g;VV_QIZZcD++RT$+D+di?K|7I&9l-v7TM>iF|i{cpEB?Ct(v zJe&OM-SNNN~h+pzgd61@96KUzZSo*{as^xy(`-P z_0>-cr}A(0yZv8t*}s&tM}9v39XoHH_CG(rJ@1!)yHpM| z-t{AAs|pWedG~++7mw=x|*5|i<}Z-3x6rI`^{Q3-CH z{Fc|**6V$l_pG}8p-pz>{lwjk_s{AG?^R=n%3OQU?3y??Lx0H0_{rZ{IioB189wZ@ zu1ym(oS$;HPP@5h`&Gk@kGH5Rm%s15om8KDSJ(bn|KA+bSty&;a-Q#m z4euNQz5khy!n|JZ*gkh=z4H9UhfmhoYtzi0){4#WT){NURpK@yZvq2@RKrIG1}V1diTnHN%vTfs&zt=(|JJR07!a>@ zGh>6!-huS^trbjp5=yi(lNQ zZ{5&df6v6$^1%91$NAU4-nKex`uf|~TblhH)?M=Rcd@rDt6wkkyoT{q%39q?|9;V}=_W{XWfv)43M#ZRoM_^`v` z%G(2BCk_6+&$;*K{$sOaZ_me>Nd8RRZl?aROriX`O?33Dj{!NJ-tu9a+V@DZJT>-~ zYc?$ZcI3!}-v`dN+$fw{|Chg1u~{^6$M2;k&l-FLmb=`(zt+AnW2tY~yHiq50Vki# zSjFLdsZ@Bf7@1Zl}!m@7vP2c*b#5b!vZu;ew`(*3Cy*c&s_uiu z`e*;`WBkqM-?P7Ej^KKUV(zAZGdc0;2 zpK+Kse~*Fc{Eeq?pRQi^RhG*w(^@*$QY8LPma>^Ok8SCl&i}&MPeT@{Okn)y729FF zXx2uC4^nqKO)oe9l;$}5h4qQC{#U!S=g$*wBpZarCDl~_oiDb=!s5W;dh<7SW@SYs zg^M{E>o>(8+-Fw4+Wn|)!$Tv3HmwE60-9N$9AbUS$f2n2|1NLss;D#u1`p4FZzg+t zAMVX5JMVh(kp7|%(Kl~vNuLT>|4!~LheCp3e`YjGMPs_^7OwtFzYMjXO?Vb}ctL+m zkKIq{giH7S^BFjK&)NO@n{lI2)+5Fh-(O!BwR*E`|4prW$*AY**4#GtUuKG)q@lk@Ay$&b7f>iS>KlUP)gtLGRj`O3~g8 z{%^f2E2i(LDD&O0W&0DCZ_CAVcPUQ#bZ^?X>*vF_8+%<7o5H{Uo2=On6|EsTW-ExNeU2v>?x-%nJ+k(vP z`)^3?4`;nx7vb_a(Bj7?ukO?5)n3ls`TER<+bpKHo-A>@IQ8lu-{W60f`5z3r}k$p zSQj5RUE59N!*S((4%4Q;3te9Rvhee(J8fUe!!KIyRowEsbegBZqKfd=lOjv%Q;nXQ zzhAYv@#4Av*7Do@lqUa^G~T&9^r6x=yUVr$wx2vr88lC@cuh{rq{wy)tVyF28^F`Iq_sEtv1mV&wm=`)0Ob;=-@C2c>Q%c0QBk zV~*kH*rj?h_1XE~Y*s57!x%dlir8N?@SfaNGJTzvqzXer4d35o)hfrHtKW+`o3s7y z+78XXhnCj=2}+y!?qzZ4);nbkhqBJUKiss2h3)tL1=ka=TbPwSm{shw`Q|gv{@0&- zzZ)>>abLA-u)4DUh4G|M9bK1v(wIB;x2;3PhDSwx|XyFH5yIp%u zwYk1wU(Vm~qgF)k{mH|BpT+2%oOsj0|9wT}wd8*jh94n}M`m3c? z>(ggL&)__{P2b{Qe>`Tb`L3}f?eeNtoxjbQA1~@%Q7%7|Hp}GPl$7@X*)B(^I!HaU!V59cB<;a3AesJ&}>kc**#60@yGcyk|t9M#I2(@&2FFayS^@^ zytSdj;*?ekd&4wshHDeuAEr(5imu4bDShzS^XW^ar{CU`tZDhSed67Y(n+<TBY37rhAmaz*_(4R!lAZJU+9}|+~%{eXwrb&bZ&Tw8cL^xDZHai(w(nOF<65t# z=l4{UGMw1?*%%gRCltS8=D4(U_wJ~zXBZeBr2cpN$gw!I?4QW*(3s~%6J<;}=eK8W zd|~zfaB_D>SR;Rz`CX%iYk@m=Mb6sq>QcM^Ox0J8mfzW%s}4k7y0qotzVi9y>sRbv znDq1G=eqg~=fmw%=283iu-)Ee^r`G)oz?38H+Zpl*QlH7_PuWTJ^v27 zZ{IEVT!y+E>!&aWwz8jl7@EGp(34^J2BZ8&bx9zwSO!ldQ3{S?BcpO5R-Mzo)#uvn*nke`F;p zC;v$JgJ|`5#6Pc_ z|HT3hvigH>6ghARF-#=Sz`(GNi+7;}c@W^> ztD2#)ahaF(CS)FZW^F8@BV?WsH}|=S?yPv`UQLx3C+{D3 zeL4NFw#}KVZwi{VlN%aj#4_2fKHlY=TT*n@A;5NVoY3>$z57`r_E*%KGrWoKIcfA{ z&C6Y>7n0fq?tPr8!BC*T-ds)fj`^$0Hcysi-kWzI@maCbmgsfgRxWZnzxO(`{=?(8 z=|B43X`BgO?zDW(WWBv@7u!2m-PtRU|7raMkByxQTeg3g)W7D-iiP)@T>{mbx5zx@ z{LAi;ld-SN!f%gSA4`H{%Rj}b{89Cr0(r`dD&maS?kT@FVPBBHm)#`R!mZ|W4j=uh zs~qat`C`vk$tOEGepJRsSvRcdTK|65K}WOauJ1m6wqlyWpYr+0|1<-!DUX>9*8F#o z*}Y9IW`npxbaF%8oeihltF?7<%RcDtP5B@B!ga6zIfcVZz5VC1Np*cq{dqF{#>~lA z`0I~-lg;ei$;2uzI@zcZ)`uFgu7Y4)E~jf7 zvQ{;uO_eWZNVHPU66E#NvfO`Pq~RU^t%GYN|7?rRPzzRhv8qlaVAbZcYx>SB&A2}I zf?{zKXZ39c_nVh*#yX}Y=h)xs+Txa&p{B65F!@fs`t}V!suwe4vWsfPN%_7~&6O$+ zZKxErnv}kZHFaXcOJTLJx}K8io5o&`N|TH-m*u_``ftbfWxjaF^_j}I4=nlY(^pb* z;Hh1M_l&3Cbsg?Bo`}~okmt_2lJjT}i_(sUkBJTHT>b)#ry7_vN*V$g82I14(^|W# zQ<9;f&$J=F-u8;YPrYsYX7Bv-mY>ZE|5kPTi|XEI*LNNN)LIx&x~;x%FOoGrwnD^euJhvgO72!oji+mW zoiGisR$QsHEWZ3{)>J$9pmdr4E1TakO+0bo`oW3k(ixbl{^(e_e`ZiJ_~9kL_sa^a z2aR+1<%>UbpSM@4o%ioFf4yA0cGl7Z$@7ywa7{bs{6#Cs-sbsn$(1!*Zp}OVm~-7n zRkwA|AA3B{ImB4l%VThO8Bf>U!iN51oj%t6E>Uk;+V%*UPkeKi`wXMZ{>~+(qVxVc zY|A}Y&zFj(=sgv-x=<3trc!t+33_9Ce zRd)Xk7mLwo;N7{PjZcr+;r0TC!?qsTOILY?vN0%ZaTHnNDLo>((z_n_=Xyu{_)F>Zqk9!sMpa}&O)=5n&q~fb9Ld2I{9+n6kqX!UP~AJ-*d~V z)R}Q7`&|1H)`aaJuUgt4G?j@c+-~-_rdQzZUENsqcR%;{*S}q}XW_$5p*#K?{|58mbV)m*V^{^h_+Q_prg z7BT$WxLfwz*3h49lJX{TQ@8K`v1iq)4;7ngrSla^rshG~DDO?jN#+23`TEF@9X|WeVORgL|Za@1x+&hzYfrxyP=(HCJ-VeeU(F8Y=Dmv;N9Gt6%(xh3n6O zAG0Rhwy!o*`grJo@%cxV^_js*KF8gT|4PXDQD2o;$fv*fx)2v{$+r-TFW;nR)=#?= z99g@fLvKOb1q%_@+X-iS81jXl@G#utiv4LS<$91|iIa4>TeOiFr}5$GQggcAe7k+h z_y6w&r(YXZ{@F9{{&U53ZyQx-UHy3`&G?{j`38o**V`PAS3P53obzOZ$>NV^96UO* zFPBd?`1G{FrFq_hRSZw&*zBl&leL!XAP)mWeX-7dr+d1a#a<~*<*Qy5%PGFUkN4I8 zX;l%Hmg;lz4Ql$6Sqkd%mw%6*(I%9=bKw-_x3}ueDyn0e((gn~XH2=C>caC1TcwPV4$m_u*g=1xVpZC~XE#sNZ9N^z~+Fjk^iuv(V=NgtS-)6|LzBaS;qt)(e zzP@RPCg{g_z5gzGQ24G*yrb#9JJbLBrs}`Fp8W46gMD($o%!?L)jwOpf9B#u#tGA& zxu0ng|860-qu=H8?=RnauX0^iytk~~<6DuQ zj>F68L3Uy7(%+}%72mqlUN5@%^J1X{(>vWCYi_V?*R2o@cYSd3? zz5~-euDL&y_p-iqRb-#(K6j$M@MX`vZKjvi4a45rmCU*GEh_K5^_q#k&pyAcpYfnd z*5v=}`SyFm_3!!K-?=9HtKs**XXFkr8zd&^pOonBdq0~+BIb(Yp=r}u7rbQDOMY0% zs3fJZ#D;h5oQKbumSUs5-iUJ#-Pno@Xf}F_5pGKa_X?*pTQai1W&R&0Qm-gG| z>M{-+oy*Uxa(H{(`})`EGk)%qU|L#V=(e_A?=Is3&!;Cm7$0nS?Rj&O^uAToCEonk z+PH4{=Y%eXCI6njH{f#M`W1O0zNK8|)dz{KJ1UkheUPW`!Zp1u_|km8bw`fmf32&y z8U1Tv$sE7@>GNcE)M>J=5oQX=mEU*r_QB&P?EaW-%sOCc5&hxoJw2NS@kOgbFMhgn zV}qgN+~^zi@4F-}t@2vALW93siGxjY&*FW%j;<~L@$bH2YOUS%e7*G#{ii=YK6~}I zO1))4tucAC4I7$2{GSv(Z&Sex=P{}eR-~TB0eSk)`qX_(~Bw;eoS9}St0-X)fLODE~dzstXMD8 zJO5yIx%h8kwao13#k})3Jvvd%uJQZ!BKA!!iZ28zB)^_W;W)Wo``BdH#hu309V>t6 zC$BhbrLjRYt^07}_9yT3Uq;s7)IS=s3y zJBOC+T+29n@B7a;jIN939M~dJ$6}zr-NieFmHE+f!*vUo-vuzlw1{wVRd}6jcC3%u z8ZwiS;lqqA|2&-D&%FJhcq`nsZw$BUfT{z+HS6K$W z3zr$aOf91JrfN4$of7@)h;se&yhl>%4CSQ>^%GkhLT;;0E({f&ad0|Q$EE7vC0={I zZ>c}KETZ|qD(k)6OYOajBzEZhzh)ON+3@o1_V6%$<^rdr)S>z z)EI8}DRZCp1jlWGvukR9{}leu#u-zaXUC`Y<(|>z)!h#rt}kC}_U2;z)YKb0IV*2u z-g4cW?qu|={%6FceKBhv?Uc`qH9dbmZvOwie_stbZ2NWB_GL*1f1UOE)c;qLymme2 z+4f}rZQEy3>gOh0`VoJ=wp`OEH1uZhjD+n>KbO_)l+RQY54}45rImO_>1WBQ{ZqXH zMKtG~+~Y81->P{YxsB73v#MNo&AvMA!>RwmQ+hA=#T7Ax%qm}9Z^CTXIH&eUyzY$d z3o}<xUC$O*+)X7h`G+&!E!Fw;(YVJ$_tWkF>woU8GU=Ruqg%z9DNgF` zE5V1Jiy04R6+2a@NHjC9i9b|dAyd60w!Y8*Q}%=?cIUk@^6MMEJ%7#k`1L#qs|S+q z((j};#H};fW!h8De_%l#)4Un_Ok4Oh1Wv^A?s(28aA(()by}cXxGmNkk3SJ^)7lmI zd7t8yGkY(tf3`Mo`^?}Y>857>%MLEQl-~T=OSV+C+d}CPQ=jyT@a!qEpB|dttG6jC zw_ttZwxUvX&ZcGZe_zd)I`GM$;7(Ql_xrVvPPM-434HzTTIP~tmwjXc8{NXD*QYXZ zyvV+h>@s)x_Qv#{gGpVK<`78 zu)7ZD@2JD(>w}qQ-p?ux_jA~HtlW!%ovXV3PKVF$Lst3bGECO~oHwH19N)Lhr|1gD zyo<6kW=^=hJ67eDrnS|%Q@cOu+clKPKfSZ6i24?S9^QuWJ1A=lSoYxqm|5 zmWQT!U!1?{{==DJpHI!Jx${?gljDkS+goK8Fm5xqZ+i3G=hC^)GsES!+^T5u$p7}V zyR|6A`#o#@-eb3IRX=C7*=Brdc`p8LQ~S&-)$+L|fA1ZXOcnlSF7r!k-SW9jzt|a4 zvsQj_UA3j<-68$&S07|unOfD&7=N!eD?EEPfD$J6F+XC+Gu3z=wzi4FC2D!IE>$cakq|a&IsiAwN@ZhVq zc?l&a_DXEruXsCu`RPx}hjQxs1t!m7;CkXdakkf|H;Upy@lCuc40ck!r_2^jI(&e` zYwp||%BM0IuI0BT`u=~B`S+jA*SvnWsP^Y2AAbBdIbbmRK*x*Hvt{nbe{O6uJ*NMj z#aCo?W2AA~UvKW~*^jv19IQX|VI^bq4AChY8~z=n1O6LrJM;=u!a&29I-d z?}Y74|MqCoo|89%KPvEM?o;_5TszCvev^5AU%$D|3ICJteVHBBtGCWrpZ~*cJHLS% z=Q-UOJrl|+wle--nC`7G=j*d;pADCkU)qup^?y-c|D`ir3=fjdMm6Y`{fqf_pg!b| zxl2gh%|}7UHY~4=mxxWC!*Xf<&uQUVcl7R`+`n(#5pgZO)jeU-**q^)zjRb^9+*1! z8;`%xjr|eP&+oWhRdRC(-0Q_}A$cgf*|GP=FU>FCKNs2^KDgk0+`0IVoU;uIUO4)G z|E8Mox9;oG$2BI4brs4Pw*8Tnd=biWdwFzy{kz!v4366J-?zr^dbJ|Lr{-I{RolvY zjIWlie|DXrWzUCFZI0jDOZT@W6+PIt%JM$j@_-2^FKn;3@}Ku+apI@Pg>g!;nF6-I zxgylR+`Q&^eb>DYf-yFKSwAzStZ+T)KDlJdmHnX9ptsHoS7u8mAEnSG;@smSnv2}1)9uY=dSps1;ryc9hc7&vD6`Q-R5-TMEncwg1z z&-Y}$Dz93t#J5|tUhK9`a@$IVI&J5JTnYZJOLNZaepKpS&e!d}>5SM{{>_@3)7o}f zR3F!E@Vd>$e7|n5SY)G3|L2VXPdM3pxBv34XJ9xc_SJ=Pnnk$$o7jglZdSaFT=aL_ z<^N1`-kK#Y_Ga>!|E2Z$)vCFDAquJ`XM@izF^&0Obw}y_rHwn6^zd=dY2nFQ;^aT; zks0rf-pc0;<*RPrz1}cI`}>VpkIAQ=G`??I&&2R~-Ti+mjL|)FnsOO`6(8UEDR4Hc zEu-(fX#@9F)Ib{%84x_l{r{hj~2Y%f1j%D!H)`Iz&+->Y_u%WY_FV{H5U z$J%y!UBL^1$yZgE+Ig@nn4!JA=3BZ+Qc%{c=f!_D7_W5xdGgQZquPF_=0E?pe0E#< zX|tF8l|2o$Yl{}N++TIo_VMwp&tf)BFS`-+w`YY>^s}lj5+9E}t^fON>8{lO;SvAu zZ)Mu?DEMiyuSsj7jqKTPU)pl=@;R1Rl`h^Fqj+fE*ahxZ)cGoO7W<)GD||D5ST-crX^QJFyp85lO4mzH|DO}{>i z&3?!B7d7*mcZcbKoo~+xUKS{dX(jH5}y>e ztaRg4m?5XUS=_PWz&F?0?;pI|?dzPsMCg8L{~l%G@GCaU!A)%MY{etzWqNpXt^wz0-Bxo(c~x$ewe(zy91}F15P)&zEhc@@0toPJMjH zfB)OFvTmvM8`&f46}_&g&x>z6ZaH`Puj#)l7_IB;?nkxGdl|JR+GYR#LtkG{RphaG zDd+F+@#3*WmWSx4e{0^Z{BQjJs71l-%b_WMD;F_-|ERfY!uwf$DPK5UZVTU;AaeQo zuWgdozdru=K|=TT?Vq-7ACzyFdRBYyik@e6|EOy1qO6CX-d@VDU$;+eQ*r!O;1bw^Ew6RNJ-hRE` zPyYNV^FJ&9w}4l0W#z5v6*Z>H1l^37v3^`kV=y!Df{+aLgE}G9&mSJX5zbRnh z>O*|?OpUh|F7(}|+dV<{SdIRy~FMUm6KEIR$IeudVJ`9I}Z9t6Bx zRN(vC$%el_O;5kiP+@rWXNGcf599xvQ!ZyDI&ISBYdbm5ZtX1I2c>HQ zD%0Y3?bcjxFS1VZ>aPnsKZP1weoCEr+wX+k<)mrO(}HF7BeeF1K2fwMx#eOgS7?QRMdiqI=zUS%<=rXTq<)Pmlc%f4%h|bI#ve z@(%kl_Ie8*KhC+tdSb_#ALSLg_p5yve!RZM9Q|-_nb4Kjp@)j~S$}%fUNPdYziyYhv)h>+X0EG0z5e<9^Cd{tS;b%Df!uMNe zMH=(-#s9^g&F4P+=;VI0FYBrt>w9v(x^J?Y`1e#lqs>G6FNarllm&Kv@{XT<{?Lz@ z%2fq?4ks$>e;vNr@^`+CWRP&Aa(0z@K5Ov2*lsQ3rk7D^^BD_yX1AT4VV~Qkx@&`s z$?5bp8_S9(FXTM+#j}6P!RPAHe*7=Yc0cpH_vh7=qh{Wmvs#ZxGX+c6I9=e6z7_St z@Ahp2;Z0TBKDA9^lRo9d%Ee$OrF+e6wdzyWEJ?q)!grDlbm|#CFE{@4d*Axj__fnF zvmX1nK+xWHdd!0d>mSr)r9JujIqTOg-))=`?>T0?uXPcA*0ixgDL?Na!v*053`_VX zNH+*HReOYag@X2p7amj!W@>w_@^*hA3+vu#f?)xDH`lZ9FI^Nf$M5#nsMLZ&ldgBH zZ@fR;S{V1rt^T`1@3-Ui+%4gCYo1#$EU@{R!f;^u*OUAG_ZwCFy3NZ-@l|eCe}5pD zVZ!R_xsiNJZ!Z6Ln_K_+_rm#~Exeb1ZEH9ox_en)(#!h#PU(sumMuc&PhN8dX?R%| z$c1dWxBt6J71w*C@39s7-}87=UtRzE^0{VtOI+C=VS_t1znVi>6}Iju{8hi0DROsS zo%5fyl}Zge=jr?jS}el)Uv%p+SG7qk%l+=zs|38LS8WLTs8V_I{0qS)-OqNf4NqL! zyI<>YTD+3Kx8&=|*O`inOH*fk&Y6<&Ph|S#Tk}@kd(mF?|Kyw(R`0F{DC#Zxrh4wT z$ZwOdS2G`8yKA*}Nq6A0Or`VZK*|(~IZBLZ}*Ovzx ziXqG7-dD-DEsH*>8uXf7Kyl54l-tc}$&_26kYjYJvzNde2mJ7IlGFocFvxK~S#vPebxd*~?@BO-SP_W<_^OTwH zv*+G-=KRcbL;lUOJ7>4ttdw5+z(4uXv#2HiCH_BQ|Rllu{h3(oL{j)F5v#g7iWE%0%nnVPJT;ue@)3NUXxQ4J%ku6 zcD=M+@YiT&`AW;{#U4CIPhYz8{Fu$o-uK5B8d^s^b5=Yt=kkY0=7?v1oh_sO|NZ;N z@5%$&9a+<_)xLS|`+{YfRGBgJIoY_yfdYRsD|~F_{$Bjt-Occ1va_np8bv*|+3y}s zv)L43mS^$!`>DV2JTvQMf*wBFpL_EZTccyFV?~B2-@TKJlX@iAhe~oipHgKMH^cpp zVPo388L5KSKVzjXGKa`iXxf%&31~{4*OFHa(eiq@|F6uE@}IlEoR(d$ywdLDzktH) zr4zJyI(a{C6}!`?D7+xee$9_h$_po(-}tj9`Qn3Uo{l4?#jIzNRxMlmr+&xcip^@D zl{Oyd{CuI8CvU-ncgux~SDc&ndVlQIV|5?4lw5m!OL)zWil6saoP8d8{;ToyDFIe~ z(sz|Nt*cz;nxVP>Ut#N%6nFa-D`ordl+WF7`EKWWyFay2^JNxleBS-NDRI5w!SAly z4CLDw-+lNlran{J&Q7uX`x?!*6{oIl-&SAV_O{^S%si`~uacV`cuwe_Hw2CyE@xw!E3*L^S>p2x&7;}UE}9jWgd$w z^|t3uocneDo#fxYZ|zi=ZNu!4&&V?2`}^)A56T}h_B4brd}d@&;^MF@Z4jB{xGHM9 z7wcpOhA@MaNzZE@e=sw?Q{(mceBcYtP=^z{mg!sWeXy{8YL#Mx>wV4S7*>w`YHio| z+&H--yL@5I?@!lmN$onhb+*oewBPApA{vuR!=`%fQ2r>8eE6>V`?XT$&-3-fWe)6m zv)Xa-t<13dJax`@`E-qk411Yr?UmcyGp%p0G=6X?{e|{(0f}t| z(>m6iYQA27*PK^R|C1iq4QJ)i9HLf@8c)eA$hOVzBu4>Yq~K2Tiy_W8@ppO>&( z6t%Fau4-A}Ulu1)=q6)bn} zR$V*I{;6;B%6Wf&q=jbS+EKx%dcv zo%|UWjh;t*K7C=zyrX-!eOLSc_oRDD)Q%4EgWs3}eK|cdRlc7~+aT8cT4Cmf2W(p3 zuRf4qoz_(&A>I;s;I8_Gq95hY3Yn(OkE_r7*>dHHq1_)Z&JKx6s~r|a32u5RY>l4r z-{vY!JI}>(_g}Rd>;LuN)WrXP{I@)GLh1cr^|$#gbH%lmG=4Ol{UCp)<7}(Vq5mUV zc~7z3lbU-`^xBXNOd$kSY<3p|7vO1Q_ z*%BBSwljL1yt^uNWsm^_gGA;0V5Va3Eg5?j+}e9*rmoA^-U7!E+ifRZHb1uAl`!Ye zt8Cdu?uf&gV$Up2hc}-3A9JPTgW|IqwuEg@ZSuqzmF`}t@3Q*2{e(g5s^IFsJ1@;k zWKby1_`xd3P<=0S@|pYEGZtP9{aEy0WUAWnt#y+-OsiLF#WAuu^EGWqo|n?fqR4G7 z^_7?3DL+VUQef+Av7k-d#(u2N9qo3eeu_+3k@HAzd*q^byZ6l4#o24M%CR|G-JW%I zslm!H?^!z@UX>Ej+pfNOe&!~fUxBxNzv@@pW8}YafA)Wc)bnSj>@WDw zYrp@d^XnQ;|6^zF8eIPOW0k0U%d+4a$$8bU?)|@eM(&yFFE{&bDe}t~h1a)w&U*a( z9VgF``0NEIU8by9;qxrxjco9;D`rhCJ3HE!dh*@B*K_=dY*u zcQ4CnTkrZ}v%81Zs$%{1TW&m=$RX&(UC)-oFvHwPCOWGqN9{0^KV%UU6EpnaUquE6 z27c#D$rAtndxB5j2?8&Iasrpicz2hA?dzQ!Gq@YPb-J&HAKL+Y;snPOjM zUO#?w%jD)^iEH!IK7F%yPx|z8{wzk@HSeRhGibm4mv`xn|8B;5lY`05o7eL^yv7{I zJB_jTnb|iTnd#GhGh}97V_@K6aA;@S!*FEYU9YWPceRW;873TcQ9SfU^vk=aNz7LT z0%m1QRZX-{Ov%u6ynOnPKJ%O!`x4b0$(%!X@2)Ri{`SI&CzY?4z5W!p(R^ofo~=bg z=H}nLTq{nj)MdYX>e8OYFT3m0Hy5nhWvy$=Q2yu7S61eA(HDRIFMrFfIKO3L(xd0r zw)bCgt88DoW$Bx!=$v~&S%EiywcZeoHm&*Q-4Ii_O}{qn1P6m;8S~p&Ik^^#XQZaY z^Ua>Q&AwROc%tCCJ3-4OXLp~CTJ>d1|8nhhe-!WT2~cU+vvY@^)T*-C@A}=h*Vq5K z`Xx-GCn#t8R^78cGRMN?JNCJ+I`eqF+1H!%?^s1LC(SZ?F3>YmR{@ncu^Ss`^5Sn{BMrDp!i`C*HwL6mCh8Ee&*uCFH z7S`>b#V>c=&i!fg-M!oG)c>1&|M9fg;hfct_1T$u8`(>qP4!O7-te4jy5fbD$6KWi zB&x7k&03L|{Vmm;r7D^6%Vx$dR;di7iswyy57?$hF$ZWSpXOnxZ?L%~lE1X@LXn|b z>}1~`GOAafXV1-e`1<>v9wxR^MSgu77VL0IUc4{Is`SGNm$s-PlblLDyDR^__@+Cv zK3OdDo0olohuN~C_zD;HPh!izJKfG*`IX0klWRTW%&Vp9uN^PfMB1%utxekhSxM4H zoZ0wr8N<==pYn=J+VAZ=##;a0?egwleKT}ZHm!R+cPUHf($gmozU1cRsy}CBxVf2Q zid2ES^TEA){w_V8sdrdIrgCK;w~(J#c=^I|bN#tWo#L}RH_l)3Sueq+aFWH+oASK} z9!b~yo>=GS_V4VH-7BI$UOss3fb!8;IVbyzyPq_F=J}EFdcEKOj(;28e9CmP`&)nF zu!y@Am(MT$cE9>Xp7HkZzYR|q#v_PFt{uDx@@ z`R`v-egvOlJ$ZU|!iulrC%2l}Un|}HBKV{C0<{C5rda+{Q@py{Z)p|d^{C7Xohx0J z{dCvuo_e4x%GdnFuf^K$WY6Bx-|Sxf_+QJl+WH#xb-(7U3izvYYRk7f_ht6q4O^#p zXi}TlxkaI?W%5rbaqLz4d)IN&-vdDP2h$TNr>TcmzhKsG;$3>&>quvH z#)&oa<${z#b`*Vly~?t_KF@uI3Ae3TyVwWjf0nujRYlLTT$^xf&J_MX(4j634; z+!2MoJX?5cCVY2ieo^_tO#UQ;fdcOXW;b_kn{@xYrBhc08E`TvxC%|0eySvS{^J{U zFBA85BgW2MYys=b6J*%o=+)nG7cW*!c+*X(_HOs-EiDx2~wWO@)&(6iIs;ZuwC6nn)Uy?eh?=JJ7W7v%fH zC8tN$+|WHf>B8~;o$>Xz&$qKRsz zF2%}){vzT#osGN^z!oeO%}zDXXe^e`Ri`v;DZ1Q@^XW z_AC>R@6B}1)|tf_>mQ%6^a^-ZH}T$=ueS{vCVqZ3=OW9YTb{?PejTnhx*BsnGT}!B zzd`NpNeS(Zr`Xqao;@t^baQ<)LSdcz46KU6lJ*kpK8id+nh~494@OGIjrs- zezHMy8{f4X6aPduZO&?{yQgtt$$_l(uftx))H`p#Y{6M1CLe9Kp?ZJV<_GO(-po5H z(c9cUiUgl}Mh4aej34e4Dzcvs+ZDQU)fp8A1uav(^*{X&%Wsi7H-)R{q3A#H+ZAs1 zN$-Bi-#>KAU<;E*x9~50?gu{3WtG~Z+Yj%H(Ai_PfBBot%9D>74=gZP!YJC-wd?kx z=fWaC?C>OJG1xULhb|4XEl4v2k?6`l>A%!Twtn0 zt@N*H8=0Sq*1YR)tVsQu`S+jW0rlFj<*TP?y_3;TcoI||rz7fO+4JI0p+rIIuHMe{ z&Mg)i74sQcuV23YIJQ5v{&(N`Z)=iwN#9w!tFAtP_cPz}xc_s-yCoOM#3t@npS^Qy zRYSSv@5i1}ZH&L3TPm$RcT$v9-|f?n{etzX!5>VYC!f3MSo%o1_FnetRl>G&n3mt( zUoF48GZwyIfjLt@54+^TDr|zTFm9=HUs9{++LR_Nri)T$SI6uJpatN`-A|f8Rb_ zpVA79z<=N5ZydQtu}5gp0>yB(!= zPR@4wwmv)|xtW*Y-mjRGxd$vkcV@ff)IWZ@<*GyLOJ?O)%iGiTy`Qr|;lADPQ;&;f zq~DY~{9PoPEWW-r_3O<}`+EL|^rGZ`2dq8bGz332z|I=ovoBC=|kkMpi8E5)}p_@@QX|V z>)oRgyu7l$d0vk4y!!5|^P8VPg_tF#W-g6zbjyDDS!SQC($tmf&pbTcb7;al{+VCy z$;xt=eY>LVu*CbHwX^Ld+aC-rUj6gAyIvVD-uByG#-g6zzv=gOA8+9+uM$IYwDz{& z^SZlk&(Ve3*F?|%vSp9`Z#KC-$7+78iL$w-^4G4*rvAEnxW>)-Jo{7l6sG*2@UBgF zeHx=lZ)^YaF71Pv>;7Jqb@=t`?{~{7$A6Zp{7kxK?^470pmX*g2T{vLS>+k~We+`8 zPpFxdUT$~er-N_7^Lmx9yNa)gsc!vv`Mq9%hs=(h;fp`MmXF@eIs0C_v9;$f9nG)N zrYr6*KXLx}`>CBr&BdcqTc8Jy5Yyi|2f>LuzC4pL?hH z8iZeL=J^=Ex$54N9G{sD&CksuH>{i9aK8E_=afv}pbZSHhpxBGdFfa6-Jjur#76Z$ zC+q**ysrIo=>rAHSK^obOFqR#SrylYsXBaK^-;*R;=bR@7kjhRDqCfC*SWS_dXWD< zGHAsVt&dYrpWbs-yLrv7_gaO&-FLUXjhFI#{bt%}zc~(~br)V&_1kis?c}w(nzBr< zds+HqSKjb@8$SP%OYx9eT%sp-`e21d%!${x=RRBiul`o`<@u)rOSv9RerqhGKYQ-f zRaa-t-myQr(M_Q8_VgKRF2`Fx{WoF%49WOaWz~CXKHZRMRakF&=CF3-uGpI68`O9+ z_kIdZQ`@v>@fVA}enBB+-GZn0_8Byq^gd6TvQL{~hN;`!R2@+V}TXLLGzq9E!jBh^GcW4 zvSUJ#k=vh~omOWbIXBSg{n-o8s%5{i#O#x`Hr@WsOkno`p&pZ7EI(Y-WTYwR zzu%I5)!K)vfBSUadiRRoJD_Wtp33YQ^K9hJmd*3?5DmS}7s(*!wf2;1y`!NugVn;5 zc8_#3wGVvIT=4DZ`SrWk+w6UKPHg-Bd$yl<_8dr=la^rlXS?Y7`s%(&ZDarW#`hm- zIez<`%DyrD%=VbPHGFqfk0fY6XcB5*WXNEgP~Olc!pNiLz$tBgmR8)fEw5R%CH_gi-I zpS1hYDY7S}7>a&<-No!Pcb(0}Hh zWJAJ|mq<%Y++(&^KjXoiAA4L`Jq)`NtR5{43J&?66)WmHVP?O}l)U%-C89D6*Z1+K zUaEIncYfMaIlq;4H;T?H7N~rm@%Dd+|0~-@ccsMjc7`EBuWFODFSD;?VqN36a3w}rotcueTu(mlWQE}za^ z^{a335@FjTr71a+ZhSu|y7~;i(EJPMmDle4b?K^AOug`r{n5kB&)6Et< zTtDkNaVd{s|43G$6mb1e;ga~MtYgM(OY)WD5aa65B8>BO<)RGK6hJ=tHROs zYlH3Ay`KM{DeaDK{rqd!uVroD%e3Z+;OiYipI7V_JaPVp=>jG*_5&L}@;>hR*WJ}- zIp3OT3-8q4y04qQ_xPo@T_GF)*EqacDt-U`{<(XZ>wC1>Sx!$` zlwB`&0s%8kjCTY<_-$!NV&fXDt^4g97(cp2>3}rs|$K{C%nR)9Vw+QLiH~kI92T4PZnbDbwA(iO|3BK_2AykIruSjbUirtd3=Mmp z^ROH^S8_hLCTnf&{Hy1l6eP<1|I6^B{=`&w9qt{^r_X2V%Bfqmt2JIlbT3cGS;I7~ z+3smBUoNa$`R(i6$)*y`mJC8y1Ya?2J0m<#<)WvD>fx{t3T(BFXHX(~@>WlWpfj_Qz$ZjwhE~kh!R9%J9wm{&c-Z%67Wn0}lNt zpE_w?$CKC3UQ4B<<+Us*-R^sw$Nl4OuTwJhU0jM=3ykZ9SN`U4|DRi2zT?Q7xDy#S zU7m?}+w(FmO`kb|QK8;o1K;<`IaPJbo1fg|EP5m38}@pGCYw0ph8+w&;mY3Ujka&B zPd*SZ@wI6r7w^@S>q$!6wGKXt%3a|(Vg5>5|yvCJsJ{$>ab3PZ_B@cWnLt|K0!p?*IRL z-Q(s5E|bOMp*MNT zs-Pey28JH(Z{L(vuf^EC&|4?BqgLLpe8x(%{#PF-JdOY4{W3|E_06+|8)h@_NL$uz zE*tUT%oNG;M|G<|e%`!k>B-*pKkqQ!+V{qep=Z_Am20&Fp5C~V{cq{~^YwC?y62|N z37ROrc+S2%&x*g+8>#s(zM0B)_Jin&!#hqzZtDtLeuPm+Qc&iZracJ(ag74xggEgDjHI~}^b(M@9itBidg|1VT)&+bh2Z2 zXpV8>QS;sFcHB}wm1p?yp-I*MMVwl8asRhC{l5SCkLdQyzJUEMA$9d%OZVI}i-=lM z5_Ub5dlF;T?~0?w*82so{C|2i@9?dy>4(4gmSs;>uFrjQL$BrChnh#L`5*nSeV;bB zf$jOK@RN*t0#e-NBV>6Zf7uJMfuYyxGee&~eB^b_;y?c0TWB)0xz zwKX{qGdEtya!Kub&J|WK-o;Nkcs6JwgE|vK$_56zUpg;@v>0?QJ-j@#!}#8uzf7sm z>iaide{!Gw_1pD-mKRp3#`UGw?>QrN|NmFMvY(v4-hR2|^DEh77Ux@oEVb+QoJWfD zEggb+TMx=QEV!bx(Dx>aiiBSS}P_igFDD%aC)N6r2D zrMGfx`Tl2@r%oza>JzqPGH)c?g$ozg>oRk@?`*wZpTDPg=_2p24bt_8#l@HZdsG+| z^pTOXCu{ZG1K&!&-OIjF9XwMq`O@XRdv7n@QFMb}li{XK>=tW=tBY>CJk0$1`7_IX ziHOvVn**1uf45FcHm>H3N@^U}?tb}aOOHNzbzxq6$;G5U`K^Kz=e=#&w>&AtY+^*G z$UThjGRduC+b?-+yS?bo#Qe-0wckDnt3@Qyh$cJxVY+m}@Ul zm-j94zReZ$Vw1PN&+0Rb4yM=5eDSMT>q`oczT3V}|8A6W|G3g#U&3V|{&|7rmy6TN zW}jQO`RCu484erou49iqu;H)T`l~xTpZ>MWuj<|Ru(mpu&3^x?6Ez0)v;WFHwz$jq zzV|}gBheeSW!p}@_4Q;o_OTL}qt}#S;<|O;kHYe(=KCI}x9wy8Hgof*>rKXQWWMg1 z@h)l73Y&-D|0^)93H@xksr`yujoXdag*(>r$r|r;cS>ox>AmZZt>f`2trr*B?4GT> z^HjF=%3hxAvtbfZ@711ae{;3;UAL${N7&)tjDqEdO0@S)ovoGdXst9Cl}2c)jcHg!0wz^Y>nRQ+2<4^-~skhA>OrCuWh+7Yv-0FKcJ}h$dcTh|_%f z^6&NX-|5#A_u9mjMcT*Td%J%9*Sjxc{ye#VEYnx*^!zmDHDC8dzTQ0FD%t1HSCd_7 zwnFtC@^M@Q+}kI)C04_WJ8wzRc{IZu#F&YH+XrJUPvU zvu~Q-gSrnD<=Va2Dk<4-HkHTeVAIYu8h_s&zgu&(>dKloCj_!}|8=LUclVw! zKAGapx#>=-^7>z9vwT+{^Y}jL-ui8AT}&De%&%TyJJzXq&}UzAF}rKA(w9uPMSs=n z?;L9TZ5wME7xi*O{hDu=KmD)coqy=}p5GZe6YB5%wZ1pOrkS6SZI9ru?>isZ9y%gi za5v-hl)XCqGno5+PW9Or`KI9Div5C1ziz#H>U2!G;l>`{&5^=SZstARWpw=Bq(-Ux zG3Avns-?P0k5xo%lDfb$jiD<&#@`|9;2mWgIEzN`D_>jXdwj_I&%f zPk4Rt^@fSht@ew5FO5?=KkGr%YM-y?>SHhVeqo8UHD52@7@aFV^JB%UiYz~y2fwTz zBs-sL{r=t7Z*OnmbZe*AhPV7nUHp0rr`DbRt9|O=(*92Q?RTqBEpQBIQ+i!@uSU9o ze_y1&`SvqcE`HI=-ZV?gW4>PM)!yBHekn7*E6j^~)2NhjQQ>X81d~}pwS4lC8FOV0 zclFfI;D2Sz??2~B?fvz$8For*R8FjZ#F6x{aJRL=;VTn0!e<_Q_>OzSZ$9H~%qnNx zUb8Wn$1D?_6~^PVPM+(+xqFxQulqmoQ1N=Z<7b$)WIEq6FE{LAy0S-R-5wjktnZVT z?JlmK`<=b))cP!+eIF)Si@Z#lZ2-Gx%%@hpipwI<9Z=x8BRGHC!sWJ;K7IL$J^Bkz%cP=h;)c zueL9%-LSSQ+Ux(M%eGH9eGNR9suj0u`|r;-Tk?Kor}A&N-@nm(;or~OUYy$X@l^Zu zFCEkTbhp{NOC(W%Z@MX3RU^|LfjZg2!$cc`HkD6bey{zp$>wV(?R3o~Rd*?`RX*d|y41w)a{H7?4>dQ`A6x&% zdW&+<)cZG?w!cu%=C3L4T2kwIXV2HP&s9oXRoYK~6wFMIk>{M2JM-4}w9S!T;;H=7 zXM*PQ2W-E7pz8CCcSWy#>I858j+kQqcZc0P{xgC7JN6jl$=TbU68wJcvjP9Qou8Md z&$s+`?dv@Kxz}EAK3>UVTfA1Ha^G{WzuUs4*zprGmmj~}!oAbTdY89w|JHRcZ(K@KjJADM`M%?>n)Bq??9&Ef zoYU;eUD!hulP;TIQQMsN;_myKm-Zbu*EZRdr1UFsYyOvqxvQe-b_AdJW+tR~7wt99vpJ8LV|9#)qq_y$4UjH*s`!DD4^;Amw(fGYy z?B|w$Z*VFIzvkB5x^eEN zz1Xg3j*Y1cXPn;TGw;rdJAOwmX~aHOdi;J_-QHCXGp=ZV`MWkCzjKR@`~5#}%MO0~ z?yMloT3i!-Jx2dU^24WJ`TYW$sxR*4iyGCqV zcDbnc#HUZJ8XH{?#$Wj8x?%d?Zys)sc6iBzYS&EL*X$?W8m?Bc)c4*5x$v3WQ{VNb zZoa%mPiFnr`QPW&tBI(bO?g|n^JjLCk^|e$d>eMvs4%7}Yu7Gu`}bMwb)fb3Z_8e* zyO-pD=jM8|jA`L*j@*rRGfd-N9e%dbRqXR#{xkpHyq7xrGKSMNe%Ezd`-`%3za*~T z-y>i7B|hfzyMm8}S04qw~{-50XcM`k${)ne+JM2l52ve z^!(Zdf6uRvJ23HeqRjz@ycszS)xX`77I20nYVMybneeh!Zb5^q25ZL-W|M|o2Aj&9 zwe`W%Pw_A?{Jhe|aB&Ks8E2KZk@ju%>5aX7JzusKTopa6aqtGGWh&VR~J?c0m?uRML|%YK%IJtwm>73Qzopr^@bk+SxDsIw32$K*oZM~n=c zHRiXf?7TVi_KI)(OW6+w$;r%LwX-0nx3uCZwh!9{2lRM`t7EEhJ^5AyEVL2 z7ro13&ine1`^vTV43}PTHZZJ|=T@@GzMQ}5D!b4c|79D+d1a<OlicvKDnFU>-X*D%kinZT=L`M>J^TYTyM>I`{-4tz}1=4jo;OskDr%))I8tc zoAcV4)ai3JUR*V&Q}6UY-VZ6=CyqXzlXtDBNFn~)a&<@E39EL!X;BfHygJPK)BI=W zoUMNBaJwmcfZM#8Rfw-{okGUR(>vs&7&b<|-rW9jnda~GNhf`e zTi8st)XM+&n4x4=nAX)&J@*aH`}w9e9#s(9YGtRq&iahroy6EDybSj^-<}dwy`g>J z!pkpzX5MT1mZ;X(_;QlM^7sEP|9jt4U;eyk^EWon|G!?_H?R1wzM!(k=2;5I8pF(2 zM;wY@GpHGzXJDJg19@%{PW{lHD#`Tuvi&;#&6FB`4tHt7k+*s^Iv3o#rw;uTTL5&N8gd( zo^qnz<15R5d}-VKe_v|V zVNsXM^+*0Pq-_7J{x7U)PGv{IVRHqiT}6N6Zp~uuIP%<+Nx}0^z@o`UniE@RbM`7O zFxz94AZ1ve#^&v@YI+JkC!^s0=IPg$r(I1Dlz9C$|Bfj`i|3PH8h`6|?0NF)ILl*o z8D`7tBA5GFs*FPKs$_8~*1yqaZn;*qWwK+#%mCKTbFmBoq9-8BlN>A&qeaRL3=Et< zHeM0^|KI!n|1j_Y-roQJcmMx?`v3pGcCXeXNEcSPdfS>qd~pO?|*lH zUq9jfw<`Wm{l*v9N|Jp3|4%vaar^DIx-n<7!JHj=wR5yo_%*!)Yd68Sr{}Fv!A5y68Sl8 z;mfrPrc1r5-tl5j_xTr`cZ=th=gi&0bfxP3;e|Xox^_AJM#^dRZ~b`YI3D)+H0l1g zZ8?Q@+JDMD*KX$8AhGM3Q}WW}7xO$cZ+&@d{KfIJKf{;J;_5}o&lm13&-i!!d&$?M zCr|y$*ZX0`6vCr-a@!}p$%T1r;`4j{ZZ8gX`E%=EI@27lX#&UU;_vXNC|}sT_uJl+ zXEJr0XXrME%UXH*1nPxcG19K@&unb+aggQKP+s0)sk~Fe^Y14u(cU|f^Bn|T)!4Ty zod4B3ZIi&M_yboJH7jNn*59kClk(zX&~fS3deHx`_)v!R#Nyp@v2kw~sPF$|)L6G6 zI=H|p(Ef|(4(Is4&tJZLxZK+7e{D$nliEv}a_{=@vwu+D`1Czr;Mr6DyFc){*V`1B z_*vyg^w>P}kxhyV+dgwwx!Bjq`4t{sE5B~ie{|kjF*qTAa{N|?|Bs(5GVI*5Vggh3 zGap5x-8Qe6yQ?r}Elnw?`EYQeT6#=xNYnG^X%BRsA4%*9H;Xwti~U&JmHCzrd>(j( zn>4I^vFB$M*QDF)_Lv`>bM54D(N_-lgY=5)pNZCNy~tzq#Ip5y$O`*+v!6*lJM`e^ zJVyICZ$FDE+c_VJzAl`i!L8T8A%5@Wms4g}n>T7%?DbiHt~JidGWBA?B_H{e;yM3s zB?rxljqZExV)Fa1)Z>504HNz!W}aieyiY>SM{Q-Ta+B=$Z%mnQCq6#ncK)8pv3~Em z8RiA-%|Gf3HcHepRAe~_Z4&2HnJvvwJ~e1nh~p#%hJ@1}XVgER$N%;vllxVVA95=N z^sN^D*v+2W}a=@^(cIr+UD2Zk%@84$=6R!+~_&K>gKGqj7$EC zmN6tu`TwT;mOSU|+yC`n?)6U0=Vkb89+h^_B=qmLLX$mJYwOD|S@Ap!7O@ixz5G7D zP;u!L<^8cnRVUV4nZGIjF7z@tU;Il_i{8I!TiD)5GJ5>nbc^}O>HS{}9$dX%Yw2iG zy3XBACzWlQWna-ap^`sQ&(I_PePG{C{TcmgJYSN{v}Lr#CpNFKb`h)%2eO0ISwdU+wZv3ux)^Gc|bvHJZy9ux_ zJHB4HdBuFsZTOp3 zsb0MA{@a(I1Lbnlqxb#Y>#f>u$`Ss}|Fhd|+o^RIOeeRW`2W#(ahLAQ1Lew{@*A?w zER=OPwC7&$vv~d`wFlZVE!U~+GB!OYaU@9l&#ZIvB1^8l{BV$;HS|KZwsJz$iRQe& z$NY=8zuLupv2!uYr`vicTb_a*AN zjBf=FtIqCt{{7!u@xwVY9%)K_oT&bKC;JYc{SN=%_*-9Fx_@2A-8u5rJ39TCuiMo% zZJEFO{|T>n-WT>ohaDE&(Y(OGvqGm~g0%yOW;It(>nhON$$~<+gIli(KX*5b6OX)j zd-gQ<{?Pj8GW+UoJ31!6|8uV4rl}~?@oU+O_Aspxn>PR6#^?4*HrH+4j{g0dx?6R^ zM(1VBJB$7P-ab;v&`|&S^@gdlcw$s~?B7pz&eE6J{Z4v)siDeLan&VX{#{;TxYE6K zVLsYsEM zd6)F@C2`~ah-qip=DKlpXub?UAqciI3=^L-#edW_TN)l`*!}H5HK&}n8C~M z56|yDdFgk<-uSxDsn`BixF}d{atOYETl4?TIL6NlCmDtQlC%7yXteuRc{3-mUTTj)!1$#K2FW>QL_oGwF%`;xGiJatRxyBgq_>0H8?2S&pxbN!~ z%33cd&QG@g`Dw!rSN#+Jg{F8<$Gvn1^dK8gRX?>VEU z=GQkX^7FU&>iU>}yBU7&a@hZr%WalIiEmdk!QO3bMSKkDx{eA@ zG{yD4=Pt0X*En_N=Gyh4kGwLcGW_@xyKOIL!xhE&u1kNjuTI@1d#W|`%C6taTmEmH z&{d*3VB9SUx@6T%Ne<^M&ANZrXppNxzp?tM7SP9&dA7e5tRH z$-Jw9d`ZpzjM6KPUq1V8ngUPOk<&4kOHSyVI==qsmiZMa!F6A6e_Q=&Z#M2}+IdsR`NWDYxxM+}KGQ=xb{|RFpctz7zx3gb4z=tD4M%$7vfsDL|EaGk zOHe<~wQs(TMT5bf2)m<`_A=Vtdhi1#!uFFJ1drFcN>=I6>JcHbZsZBSQuQmxI^4gKKw- z`Y51un0{;Qg=(RJK%ZCTusrCr&^2C2V8{Z`&P`L%~h@w#bku@cL~ zvVt{bTa^SObWbg<`}9#up<2Gr=fLi#x9XP|@IO2MpIT1_# zT|>TIrMl|;%ihIay@sg+Ro~uvkvvIm{`T1sSiXFo#2VWxqkS!7+UuysZ?!+` zvz4Car)5T-Jw7?-`8+O_yflHN?-DC+?C+VK^LF9gf0ahRpDms~`Pj3McUa!@e{>J^ zP?27g^Ok-u1G&XSrrIcS&o#FU$d)tv4rzp?z8S)au6 zQpbIHWu5!7H^)xh+9UKntUO?AwEC|3^@_)R+qlIU_N|mzt8CQtaY8{-Tks2}^&hj2 zdAs!gJER`*TKs?2|Nmbq7Ct@mZ`KXL?d87z|2^J+ly!}1%V`D*?4f9{pW}clG!$Tg3bca*tVSe(Tz=wZ9yf|D6-%{DCXD{^o0CW3KMxnISK0{l1TN()rJ;xS1I$cS`$tDelOS zygd7}zQzismCH|C{|xYxxxeJl=_xLqSy6vu`EnFD-6+WWF|VFI_@9`dZ?o9v8^1i# z-kfTZ4LGn}r1}2pr}NZuwOHz(wx5pTeIM`pR({c4>#x&8%c$RVe=qs1^{ba(m$&@!*R0KR=6~Dav7F=1s`N68vS${Vw~wuRZR?#B zwKn;`n2Ndoe@mGsX%;4*(*R_7chOg^tgU250P=baifV$Zz}PQ)}f`+t)vP zZkGP;_WbnEiD7pC!~LH`hOI2xyXucdZ`$*NtMWVfSLZxXdwCRnN=q&d(Nnd)9?*#^>Mv(jR8* zUo=1O`CrwTb;q||>HoR>a0c%h3480}V>>Lq7_#+9#T_`%l$V(PUhw3s&$lvJ9xZ3J zGdnC)lOkbZyQO~B0uCF^Jx#0L#TSN_UyiWmtiHqhX8}XW>7xM*4t@)nD{^LfGBA8N zdrY-0zxRVl?62CX5XG-nf`g3-&UJTE>BCIui z!})a&IaPk!>aML@!dWa+;7oi#A>f1f7*Tcdz_^?qyCr9 znrhaRw^9x%)4pBSb*xhcJR_86<-_{_xacf-E zf#gqV9|J_^G=6>>QfBexpy>jcGwKqnrSHeZ)mQN!nNoVME>iB^QI(^=)&%e8|75Qx z^61yAb7c$Tbp@n$&gn?!J}dm`!~LeCzn$%iTH^ofDO5aXUHG#0c6s^nsHceuJ&SEJ zxU&4CzSL>P>&7J3X|CQbzBcyRgs9$C_cZ@_@|~HvU&CMP-C2!R{su1S5KbU;2&Y~; z<*o_?1A~#0y0OTA(4ftKp8x-!{QrOb|Nkrh|NobY>xwz4ylf5|i{Vl?{tdkQdRz}S zTx3_STX+9o)_r@?<9?qdTH-7}*VWYWF3^8a^M3nDFS$2IxBG7T9V7i=7K3LG^RaVj z?@ym--p{FH*ElWbxmwiAqYwXfGCuwi+LQ3N{>It2d@6A^46?scJi>)GoQnLAuzhI+<-3y3?9|U`olj$P>v_I*?0jnd zZuzsH_OERoF~od-Rh?SK%8=`vs`fjX*Pm<2yr@^*^3!?BZr;DibNFsH!v^P>`&T|m zV!XZA#=JhxykpM>o~GOW%C&R%p4Vjf{pn2b2FCgO^4HE|zxIDWm)Y8=7yY~UoYyLD zpWeRx>1T7b%R8^_I(Y5xhiC}_vFV48zBm|U@NRFtZdtKh+N(o7*|84IZ;MYv-wNop z-}s1Ue|6H|Uq)5RLI&SnJaTnff356Mq3xuJSFde0Wc(y;Fs=UhlNTR1OKIJ8eEN2? zuxf+7XT_Ad_w#;4slBUvGyP`us<{V3jN-c0uB7@sJzLf=OEO#K<FvYeZi8W>We1;s&nNish?UM?`g-;L_mf^np3r|{e6O`T>X_;=x93c2x+SV_JKf*O z;qdACk;OU9b$nAKuP^udUM9SrpS3(+S|wW7bT`VtoWrpQdZ|M=GA`o`(M z?@yd#AFlQHK=Jg&wZ#+nZBn`Xe?oA@E-R1!|D9XoT#nCO8+>JO zBs0(cTMeJT!cl+gT(SGrWplIU7jE>^(^$XN>F#9RDL>DyS-RmU@8bgD`|EChpBC#M z`1IcPrvDGCm>J@#Yz|5u&Cm}x8}iF$XYMk+`nSw1P5i=n?SJ=QuCbP%eEWHu_&=x2 zSN}_P9{%^9uW8@^m;T3}-rWDI@_sTn zXKwsBi=RvVpWU~w_m102ZPbIZlS50gWF1Oe&{XFSafFfjTuWB3N+ODOgT9mleumy*a>w{ z3_7MB)bnK5>a}*CV|cXe`EnQ*%$DF+EcD*E>&N#S_U5HBYme1$x$J+RGoiO|+y3JD z|JcHtdcT_<-tqHL!QTh>`|F<{J-zVe)_MM`a{koD{rz)QU6yfi^Zy(dt9gP+|15V0 zB%V23pwGPR^zDxuYF|d2d@84L`Hw-~NBwtJ**mwTr?T&kozn16bnP~4t66PJln#A+ zd+_dq4Rhbz|M<(jCxLUZvo(MHft+{w*>crY^}Om?viaP_?-m(KXnec<@?(R8|KtmI zINQ_S$G)rajC;v^HSv+jzTBYXM+PGIbLPBbUuDyK_&EQ;ybzVrpFd7ZtZ$uNX3l$y z|J(8Ng%VHB?_ceyvG%m{!+DI`s)M^!HMhj0WnahsDlC^}dt#Uf?+EC4YLN((JGC`AcVdl|T5q zf9F2Y*V}*m{&*^LdF0MDE6uK3bGu%(0YjI`(;DeR7I}{-%B3YdvCSdlz5);Jts+X4iUq{f1SI3_O4D_k7-~{X63W$2a+P z>YLT)>7G5FEXfkQq2(NJY4zvQk{26J-_ri_S)skp^XD1H{d?B$JYT-)_Kh~y^SS9J zXI5;||MY&1{UU>0rH}uMZuW;IKCR0vTIu!Mz#~Tf%JQgXo?Cv;O7L0u`&7`!{I{!} zZ)Rvj6f|<}>#Wzgrn;7OvDb@>ZJ8#!gr>8cW@~z|+3f6b?YM7$FIW8E6}@J?@98(c zwe$XepI`E!BC`GJz2eNi`u~*=65d~{FTa0&pWKeVhSOg(9L=O2MQ*UtdG|PhjqkBp zfk9DheDeOt+Vj_!btg~Wc#t9fuXk3q`}>66^T8@H-g&}Tj_tm0R)52cjqQPv&x7S$ z^O@c*DmZAu$RPS+x~!4JH3kNL&7JK`0&5b47zE7Ax}|RBMio5RKKaRWBeuD1y3-Sn zM)zMY{%F$tWAlpSr;dsmcTO;hIJ>=8EZ$p?^D*c~XLbbV;T3JQ-qOe4rRn_IdAXmp zV8*}c-ya9|t@CwC>%SM-@~XVvXTyEIdi4g)drMiu$|C)b8@>>|#Vu2ozxh{AvV#7T zrj^d)ck$UXx*glTuX^iXEnymW`de;M*vB~OeR?MzFXE0_ zwDiN38EduwPkiFxq!F6+wZ5+`WyjI;v$$*4eyUfMeJ?JB z?|N|cx8#J1`jDF9xLJMGQ_5=}YFF>u-tywU#ommGJu!cIJ|7P>dTalz>i;g)z4!YT zJiqzr^(s4)Kkw>q&cAv-H+{v9Z{Od%`L_x85MKR-gqDPXRf-MgN)h-AFVl?QbIwpVebTK>wrlRL z%Ppf$C?zg)9h;`U$tw3(+~z53*(cbaRf?7E-d zcTa!9tmp4``zO1>T=!R|lE(yQpV0fe_RVus=gM9i&+t!9-?DBp_xkK`g~{fe(ndBFoMQDyo231pJ)KsSpv2nvc1w1; z-iw4iD-W+`pT@f^;mN!s`nQC&i{++X=*I|C6t?+ z5_!*)Wzy@#HEW-|Ik&T0CSBpvp<^qr=H{)}a$4WN%1yHOYzgZ=U4Q#~H&VhGeU&G7)P3J{F*5nAaF+OjzYeW4Mb2tBG&1=$y!!LuFst-oc8&|1 z93t4B{cU7);9bnQ;6MO_1G~pN%OwxAJQx_(f4(a^KS9xSuiPDvoAK{|mmXhvTyd+C zjo<%i>*}-o{g0X~5UD!v_C!yTVaLt2pJLw3s=Aj!qEDQ83mhdnL zta+5^w2EV0)83w+53_iFtdKQJ%8J<~7qI%>{TG&c_rArgIK69bl{oMD>YUZQn)@H` zx%^Sz@k053-Bmw#Kf5WV#jYQIXX_uOOh@nX-}RC?rpjMYH7q|#^}S=d!%jV z%(-^u>1UJZdV$xA8`g2QD!+a8r8;p_XQHdh(Y;wu_LR*0zH`Q(-ZzKuE^tkGKE;1| z-K!ZjU$0jQ3V&a)bh-YEZ&qS+6z7)R&bPn1Bi5?0K=}$K&s;7MQb$hK{zjDtF z;p4l`^Q)b^xaqI?_wZ}~54zS?2tLvO{qpL+4d=NRYW3|6U9jq(roF#4u+qRF?5!?bfgelv|@Cx7A&dB8o{?aIFw@{!+vRvg^*_p_L9U*g>Tf7d@2 z?)&~;zu>fB-bI;-VW01=J$RU925*A@p^lHGWjV9DO-&w)u6?s}LE%ppw%NM&nzxS6 zxK*${H=r!Leg}i^>!RonyI-9Cy5wnmYevx?hKnb1*Rws_xcRn!YsIBUhvL@SwpGUN zxR~>$dP~I0^)q7krLaW^@SOfFc1WUZ`bocQ?$Qm63>pn*CbB3sa40NKVV%sdVE^gw z%l4UnJ7F_ftm>6hTG^K4HtWQ%oA1d~E!OOx_E{k9qu238g^VZarTlih`+v{7?#XU7 z`+)TL8~cyO%jXpEvdAKrPUJl%d7e;4R-t8 z`z-FBDO(<~eRqBIOZ%ewA8dc4QhpTIe>>6{v*7LIn<-CMhObw;dA&3>-RZNI+g;8b z@gJlQc|JVe^8HnuNCOXa5GNBlh$EeHSCxT*!R}#`sR(4)M)?2#J^%lo`TzgF!2kcZ z_nn-xcC+b}e+&sGJ6ESm`BgS@T~=>ayQgP=tUgMzyY&8&WWJk!_L*I||IEDSX33L2 zTRo0He>KD3*D}A6w?O`?4Ll_jNnca?mt`qmLB zVRrQ4ssHAd{42_memk@08Ex{9la1YS%Q~miXhGkJmCrBkeVDeTTu!f7{o?NTMrCSN z-rtX|HAtVWrhUBH-luo|;%V!CgrB#v-S;g@hl@>T+Rpe{hr7z#a}3w-{I*=<$_n}a zQFm5<$u~R{dO_jqVHZ24pV#WoJwLK5%k52=es$!lqQ$3*FWQ}JQJg9KdVin5#A(03 zO?kS{aHIXy-H)9giC>*?W5N9(!&5y+-rZz8yX)e)1)Jk|URUf`@>VFQ#LLYkU};-% z=!NCsQLK_hcjIl6_E$44Tk?Od`&*rVqK_VxO>OV&4}X95`eX;uXCLPj-EPjS5@@NP zr?rD;zWUGP4oh{*_1*u)ca=HakGq$`AJxuU8@%)9jPGHqtEh@ZP56JDCp>{#+|H2oi}BEK$M<*QE}ks;r6-yKcdb@@zOFXr>iqhcJu_Br3F(zPIn~?x2^L}eR;DyV$U1S4`=k`W-S+PzqzfDv6Ch4mCa7?Da&*h zNICUe*R##J#^@8D5MjUHw(3vo>5`?-wzu_s^}hS#_J32y%fDbiEBm^?|Lz#`t1RbuaAAI1T;AH2&7UW)znE~bOD)X! za(qX|rkh=9j)$|;9g278>X^i=Z8@4HEdDby(_wP;nmdUJv0w5SnWWF&nr^$^g?+>H z3%AUE-MBBy=4*{+|gWRu0WgK01o;hJ=?o*X0rsJ{Jx+Pwg9;)I0vftem4g7vu zr(MoDv?8~DX1*j-)2sKV%e8j9tl#zjN2l~*$Nj-CHK$)VlOfpE zJ|$R6OM1aC*(bA{uIcmpb7lu0xLIt!?&BmI5B_*{Yfh8t|MSGP?Pv16HGDPKyi(@h zE&bazYm1+5+AuS`aCy_TZ;anhh_ zUGs-m>1AE_uO+)l6&8E%){)*eZ_&)>JYl;o6fF@r)xUvbr`6&js|PH-Q6Ex-t7ATV zKiOIp88=V|-J#N-Si{%llQb})SwMvUV4!fYo zFzFZ*e>8jO(|9!tt)~hBPhULSy!?dnjJ7p=dltvptz_};Q7)YDzr5<>rxT2cC5|tx zef({>=krW^?6x=Z{+;7V`46Ah%K29Bsx`au@cs1rY6p3n{4bnXx^M0EgC)OSX8&F{ zUCB7&U1`c!m-+>t`hHg24bhGhpMUPlg|)x#$G+KhF8A^4CnoK!76upmx_PfxmG57F z=X}op6RYQo*X*)+`~8X8yNUBZ-&t@$@wT^L%++&xq0Tl{-yQDGtU2jn%wWf5JJr~A zb2Wq4Z0$tkOxCY);+Fm=Jn=vHV@efV|Zf z!FDSzuRprOzRI%c_KdKwb@gBNOH`{fSmfN^JY{LbmM!|*VrBHRf4*3{d79Dk=+dLY z$EtN|9a$Rw9jUy|AHp#$u*Sdc&5m^e?^!=D;9mJ*!AF8{XnnUvnfBmWN1C>ARCue|&a)6}`OH9mE>j^Fc{Bd8{08~J~&uAaj)@ksSK zT{D>*59+J#cC^(jxjZktlSZi-R;OI=ls6g#Kx|Cf$_TdBsp zOf_SD!}0~vcGX4ke~iCu>G|};deyds(ibz6Du14O^XhxJwD|vTZuP0fdC|YK^9vrH ztbJX+{kr7znvY*~1atgv-;O@{dbXF#{NGXeeuht@-rq`>lHak9{kzq&=Wq7RxwLoZ z^Bvdj8hqD%E_A!zL$2dh@A}K@tL(ovy|O$f9jI?~yuzz)-?MM3uHVEhSrT?BaR%Qp zZ*QG*EqdqUOP{jRzDnMTni2Zt?;qCrihW;yhDlD+dhu^d{`uJ*mFZRC zQn5XpO54|M`M00rba=VQ&nuFm$2<1@duJSSYE|L+aa*{I74Ge%JWGhaHdN z=RI|w5-F-;!tjst?$2U5o##xh7hc_Y z>sSQN^X}HadvSh-)Y&e-@RNs(X6e`O%-G<*oH=nr7K0n(ya`DXag5%V1Ed}>v3h`x z2QKi`O!YswD}jN*Ao!}VtZ$S1j1&7xt>o4&w6*!Q=^>}P$wsSS2bs7mhU^|xDfYap_~h+{=r9w-oL$iqWFKWdr|WL_$MF!E;MCp)A>I=ccR}aZY5p&TcOE% z=NT>sc23>Sa2s9~L}4`?jk8J@1@F@9%f7w>$DM^U3!wAExcN{YN@^p2*#OeebWLIPP24pVBy$tFPwWesB2s>we$ICYRM`&sbh^C((-i-oc|Qf4p;)ExQ*J zWWTuL#&Ru|g{Ri+T6lN+Cvbc% zXMvl1W&1|AwD;2mrDuwr4(~?JP=rx8=2Q(ifRZ-KN^ErGLWy ze~f%qIpxR1-|gFZPTbu1$J5v`rTV_ZfK0eWnW&PU>msbzV+l+VJe3#x=yfG}K zH#xgS-sQ92^#bmd-b(jgt4-8h`NW&OY+a$>6uY?ha%}aMuO7a0cUaErH08f{`0q8# z=A2R4DUs%_yesO=>eqig@?RDz%-nN+T5_fPoY{BE3V%#*+4{C_qPE_3vDY<;J#RlL zekhOmK5O3klFPHwI4mr_T6affy4^hVF7$(bi}+IS;}^=kYaMO`zM9!&Xnj`vFI5EcUxY29x(6fe#5f< zDV)o56#vF`>?pUZ*l1&ZYpcNBvNeA`SpEUjv5Oya zU#o3&{}O5Up|f;d{yNpO_04;Bv1WZKRb5ir|3Tx}eoiItve@&#CYn#rx?%oz?`!sd z_tITMb^f0CnwRXB+-qz2Lgtp2;{A^+Z%zq5TYOcF{ov*07xkJyFTcO+XzJwo75BFO zJeofB=ac^;j*3-Qw}QT$E{eTV7izuF@<+Xl`Mc%9MZ$u*vDGgNEz2(-ExaGzvs-=l zy7KRhqG6G*O~R+|v;Lm^>*nc?q35k-IEol^{@dPksoC{=$&sBupKoBwpBXh}uAslw z9`l>WP5KMZrao3?Hd*`IRD7~D-^as8jqiOjo!1d*YVXNrG+{t- z{Y?i|BI4_(Uz{$uz?yMx-?Ked>u%ptzV>RTT>}49>1Wg0?eAaeJ^uT0b;CFF1HU)i z{B>hzcDfd1=pNxV{*8#{7>;>(c6Z(*B2X9?ycUF;k}9X zNl$4ztIS*OJ@4vQReU?{TYow9^FiOW-@c3fSarr~ySk;uyK`R7r}tST{m5E8=hs(> z{_mS-{feHZoW6Mb`>m;yHfe6tKYITJtFu_qf%Kgd{{FuDW|LI8P|CvZhd0%(+#%z+ zQ0!*-JFAbuQb%Sa8AQB^*Y%b%v3{l#Kl#4gt@f6d)ZcsJ&0n5={6gOQQOo0c)B2g> z`<>-4^!$5aDgNcjO$F`a0#fs*v7NdfRXXdP9JMy`ug>=U8`@_I5&H5{rt>k z&eMrc)xUVn*!k4r;`6$bN*y=rQks@NIOY9r$*Nt?iiPJ%H9MV3nZs|oSmvRgpH6{b z^U>IehpW#l|Mp1V$FIP;X!6aIM|Jnb8sE?USTC~UY|Z%#Z+~p`FNnGP#`h`DuidXd zz4p?Rx0w-N*K|tzWx?^guV2P}=lGuKzpeD_QXDaMu>tkzQ^G~WyX`TOfW_7HIjpv)^*}oQjdaz(~(D%^y{GU$m*;+4BethOC z&m$JM(tocA&}W~oImcY6uI;b3akKoUu)RMfyfW^|*m=l)t5Ff-MZW|_=zU@ijfl}1 zH3kNT;C`$&-nlUf0qCM>-YTs|6j>&rOr3ikmjHRFD_RUxVIEsV&^#f zrMNlff8p1>e|Golj|*1^-M^{-)8Fuc(0t(=^2uo~=g+uh*&N!}9>Mu%XWfGKn#kli ztk=_%OOA`4eSVMUMg3{(S;}E9>+ZGHTBg*$%znOO|AFRcKZZ4dJu%7eOkzHlUAon@ z_2=#S`H2}4-`?{V-)PNYj$(VKrEi<0xHkJeGiO8Nf@e)1+Zj8=rcC%|cKNfE;Il^d z2!nYIOi2t0h8rF*$MPyKk72NK*l>oS;a5S;+4W}C?7jZCCrG_o*JoiqJHKP@>Psb-LnIn{B7(dZ+N~*A;}!j1hgb z?&gE+`P&><`*&vhJln@#@Fhv^s`=mhzk81eR?X+x#2RZkm?wC!E=} zIMKtk%H*n|+oK(IQ%lM(+Q7pvf4$ZG z%2u!N0as^F|7_WO&xs@RXj7bGagJB>`Sz36D{pMRsg{%K z+`LTXi?ywB;r~BRzpp!EE>;KPO{aJYL4~2_yNA^EkSM&Rv-rnt%b@|?B*7laH z=E?hhKVX9B_w@7gJD&g1+xY(csrw5%%g^1vb(co?m^dhzOs|w| zYh$v=_&RrY=jojKYw8={Ya5AeQU3W^mif!v7w;KoF>uv0o#H>ibT07&`>Ph2Ms;46 zOAP!88!VqZd3Q>Mfgxk!%~yNM%EedS^y9i5dUM6A9X8j^gU<<_v-$q|u70w_hxJ^E z(hLzte{550>F=v9dL+|*IADLB)WR{rm1;)$)R?Np&79S3+}6NStIY+FTH+YP+)a?)s9~(mhuGacs`E zVa-zKboFaqX4zfP3KN~^`lmjFcUxcElc^s+YO&l{d8tS8m3Q&<%H-Yi>%INkGPNvL zOPpT$A>z~;&6j?H9c$x+S1#>&#MqI%H%M1t_Ze3v2Bs(`t&`bJ8PB(NvCWB9Ubg4Q z&u0?qD{CuRKjhkfH?Q7&RM$AKYX6+P*)`uw+yDKUYW}#Sd}p8KzW>3MRxd?T;@E2c z)KspG{{7XE>*EaB`0H-f1wTJEah$3@bDQn{7Q_Cs^E2i&`R#v}R+e$h`25$cmLH<+ zS9AHVwX2Q&?^B#KDLBQ{6m#^n|2lUv**KP8$mO8TMT=>_S z)5Ytj2>5!%TO@rbUQ&KEcDn6a+nM)YzpiGPH3|G(0KR$E6OIvV8gmEp8 z$;EHQYi`A;+eq#D8)LWaU$*~^;};WlAFq9}`Cf*?y!t|y>&cA2*Cxk(dr(xTTfgDc zZ`-0H+4n6OC!f5v;n}`zr7v&2+LfO5%H% zbNU58sodDUTEw^~!v5EyndJst8y@5@;1bwU;Uxcv+bE;yTI!G9jW@b4?AJ)Tvf^jJ zVnN4+CJi$3Y!NvR>Wi*3TuESJu+e4aIGe3v!`{C(fq_9NESWF!_oP3|e*e_Td-#(7 z&HL?ER{Lz0-`IM2pYikqmK&0T&(CJwv1OO_e=cjAwQpMD*PlBeD9>Wp$s5{h>%Llt zfqUumvm1=>uPu?@-g#EQw0g3=hUbqp2RAXy_&>?i#Gvo?BES9`@qhL858wBExSz4L zPv-K*IkJo)_xJn$dmr(a?xGCt{+aB%boiD%}xH&i(Y!S<}T%U?q6gZH6PdD+G*w^wx z@rK{^*VEUZtDLB5bobuWztbllu=ZNCK097iW0Cb!W23AWs?z^Y+w)g#E6DY&bHBc7 z`x^h9d;V>@=Kc3up!DDJ$#<)(rE)jO1=k)rq|=%9Y{%=x*{gTYS#DWemwh_dKE)*@ zWH*1U?}xL(zJESk72T5Xy2)hMjpZDtMeG;le>>Wu6=_&sW>Oh`?5?Dy?fqh(w1=mz zrFREiU3B;T8J?4VKi4dpez#ffP0XM5Z;M`Ue%iQY@83$bc@t%xF4Uj>F6~jhSQg(U z_SfEN%$s~zYaceV>e*GMxrJ7&GJh0s&$F%fw-s#p3)otD?nlGM+eyKki@Q>%YNCAWJ1LpdG4HqT~ z7%D8k!;rH5j0!`+y7l_!jPedI+nkkVkgvI1=kYELaq;Do%^q*tlW?bn@rKUP+0wTe z1gpN!GkCaMn*Va$o1d5Gsc1(O`I-D!|Nc>yGviv-Z(AFjxA7fsIGysLZtD;I-{;SF zmd7*9lZ~o9Z2j^>;_KtZY09;!Wz*UI_t)>0GVXN>THN|Q!&uErB45!uVy0c3e)+`h z-%K=jcU9cC=en_f-Ke5wVlcJPgytTTkXe&bsqVX z!jDb;P~XtzJG<~te*VdaYhUk}-hO5Kg@tc#b+(_lQS-%f?HW_rwAtOK&pvqi>CFql z(rG`{*Yd8aKQa08$EpAK?{5?qTXI8RZ`$KtCWTb}69WGw=J0QQIQ?9AheTze_*T?VI8p3?x)Y&Jl zi^2|fbMJXG^SYeg$JM+4eKPT1TQ=)o%oUA03H48oTlIffe0LVFgL&llz4fcs{ZYB| z{c8PFp8sN>(@q^t-?iz|uGtG8?5%crW#ksSB$f56%SB$k)N}t*&?!M|M zXJ>SN;kH$E8owJ&f?si5sJGdEHcfWn?mYd)g`)Q#Ya! zGTgfvGsTybuH6#K83`~%sqws^&U907D`GBxHYY9TGgoep!s1qYyE<=Oj;}(F0)Tf zeeAlOWiAV=N~`?~y9JCNWP*wm85kZId)DvME!cBE-Z0ZAoPW>mGkexYRLkiFFWr7X zBg#ek#+~=-JhSKV?3}CjtADMunc?(BeK9GQW~TnL41LbZ`ozvZm7(u~>&~`9nd-#u zg>x0(s72bAGl(#Kvwj+z_7oWNO4i>S0t}z{s zVb#@hHs0=6cJ#F_v`u`vDBacT)19<``nTt9%3Jd7Rm#KCaI?iy9;JB+Z)DdVJ5a^= zwf%$oe~YMFEfJp|s!jOTwC33n(ZhSR&%5sbcKYYv<d-m$xz2I-H{l*bL zR%b`MWkqcE;nUj_zRKa*m+#llg>rf_NzA@|JzCZ<=8D>;>x(oPxx5;8xV$Z5{osD} zl*A6RErRc!*MISSKas8EgW1JpbNb6AnR4R)ci-UU6}8!#xa9sd$t}^MX`c4;x%-Yx z|FZayVSnHLm-jUair+@oTL}HqRQ@9QH+ zEB5>S-}Qg{-i4XF?=76)y)k0#-3Qq}moqHiYhKZ9J>l@(ja!c;eJ$En{`vm4@43v^ z82n9o?)0-HEtlz+K3~W9_^q(ckD`Rey)#tn^(|QEJpP@*$2<4uUblFo#PhHB@iwS+ zKIANkd3t;M_5}AX+q}u#HJRm4INpC!HVyp0Z^eRM{R6vhHu7w~dE+q8na^)B+m5+E zv=0z7c)-*q#`NKhtOMf}=8yxfEIW2GYfM&QxUy~MDvOIPy2}4o{5HmA*jEXMRqrc8~FqVh1Wot`oF$U?re0Ooqp3T{^Kbji;J#PsQ4zkEv zz5d?T)f2MbPrKWCVr8J!vvsrB*GoB`*dwgb?B$;AJGgvXTya~;jb6__D}Fs`n@}k&*VhxdmEm|3b+5) zuTfPy-nC>s@7?|XIS+Nbb@QASdN6qY=E#~kwnh+PB}H^VYjLr&^~UT-;N_@>69i(~o*Tr=S3fn@{im zwP3%ee9z@Qvy(}1(9Z4Cb(S7dX*}lrc4GXQ*I(BjJ-Ekc?Wwa(kBc8qoLr_gck9*L z>T<;`*IVyi`EA#bRQSyy&`w#Mttp3=$SgeWFaOfgI@v1k%~s>+ro*r`I5QEWJn9S#3=U4u zibVeZ-}3+ef4=|!PyPS@>;M1%tpERSsylV(q3R;hR-p$rT(Rf=sD>CZeqeH0U7x?N zTk`j&8-4LF?=MfEZ{71U+4;Z!Z+H7G@Bi!GI4EcZ6ox7us4$NzLXUcPdI!pLRpb>6Mmc**H>{1%l@R}3@X=l6e^Hou0^mU-27yY?O0_I4{;JKgd& zU!8y6+48zx<^!fY$^Kbtz-+ePy_F{$7{C^h=MN|F$in#aBQGfNn>bhB3 z{n?ujXXkDGs2U$!&3@zI$5#UN_TQC$=J@hI`ja{H$vffTotu)pqRm`W&z_(3#$$6E z?~Pr@XYA?dTkVlvT2VA%=4J7xGtZw2dpXzm$o93R-Uc@$B)GP&+@z@R?)hAnn8g(z z!@r*Uws3XZpEoP|jP2(hyZGqAGI8UBbHb)vJm<4;-_1{g`#G&HpYuukrV@Yfbl~!! zdZt}xMYhg($!=)zENY7EnJpgw4%`jZKK?B8V56yOS_DJfsy!2KugEA=0x9F))z_+ zn9X`x#`Da3b!6t8YRbT6EJe^+^tcUiVZ$=}7^Px^k#t#181 z=V!LrnOo13*3N5NDWJ8$NR*6wlTjej3E z^J(AETS^Qz6{=<2(3|ZE@Zl64m)g}o%8!|vNzAi-QV^w?AY<wR$UXh1t^e$^AJ`VGLJn1Bt!KIDWa_M&tzxTen`m_A% zi~lrJxA&<(xvRE4fi;eI*2Iv9R|xEy z;w(JdAtBp)isE#?tVgqEPrVxPyZ*ck9iS0u|TqcV7SYzgh8v z8)z-FGK~`Ut^2^_3&6=Gh{P#wwvz=LLoa@p_S&I(U z8=vWF*)eO&9oeTlbl7g$%Pv)wJ;tn=x_IR;j)TJYBUVg*x9loUYMPnMzw(P}cXrR4 zbJ3p5{_Z!$y1mD)W!(N*8b7z+-fZ;&zV&baJFa9peBs-E>1EIN^St#n2+!^K6?r?@ zzxt|f%D1Q0e==6iYyXy2vGwtTZ}sc`gio6q^#AkX`WM&tT-dktsnzS}>t#;X?Mt0f z{AImk{xsVY>iI?9#T$(;@4rx3yhQwC;nbN#(!)-7*V*hrkefJI`XP~ z_tqbu&b{qYKhpNxIeUq3!F`y~#E^xL1kZ+0&{FvpX_`dxU&mT7ic z*P>-O^t)H9Og1=@rYg5BYs&R|s*$rc)gHEpc$2eGPxkaOo5-lPdhx@GUtMqSdT$=N z_)0s&W+`RSQ!kA(u5Pe3TDkxE@ikv}2yV4BYm+TF&cIUZp z(zc$hdh%KQm5v>3K{^&wV`F>1Uk_6h5{@wMoH=Fx=IO5-U+5NFuirEKpWfTsSAYMQ ze(ONv#`4_wy)AXI`@WURM*3F%{G+}4V3_?ZhPlz(&+f0Tsr3E)S*)1ZslHBcN}=sO z9j5>9XN8^&SAN{Lc3D*Y+mp4YC0{2?te==%I{kl% z?oo@7*+#ynroA|QnXhnqcTkoGfXzTv|)7SDH`nR@)l)wFNXk4=>yxiv0 zw(GLuKfli0x_+Yl^Pftp=`l;rN7Y$guAW=_s&<*tx4OLbhntUzvgfRff4$c#H}KKR z?{n*S$*l~HWDsYttM9tgncb06BBgh)Dd^eBSYeUP%#o2l9P;<-*T?*gpZ-bm%dt(} z^W8RozV0s_rl@H5YuZ^4PQx1azSZ_DJ5qCbF0eoP)YIx_qIT!)RM{_u|0mz*Q%?P# zvL@AX;`vKQ^3t|XJn$>xd+5jI8>j!{f3WxaEXS$2r}OOG)}=S7W&E$J_gF3eh0mgb zZ^vbp(+<2sTX>$VeZFn!lt;I6mQ=Q6KUo{&V5Bfn>=&B>1B2`WhKf^`yE{D@8rB?3 zj;T!*HC@ks#^im4Kt9jc{B3)5VyYiL7vwo*w%kE+*ZjB77;5{plJ#FiY|EU}cQogn zxS;#KTaR7#XWVy|vFNIt7s!j)$40= zr)Dj?8D0^wyn+8&%ANI_!|t#9Cdaq&;NO0+#|E)JQj-R)gbLfAD%Z)7wK0f-qx##A)ot%8*r&?c2 z+QJuM-{-A1+1Bx8o4pl}behfjHL+8U?mD>FZ%O#{rk{6o4vM7x8%g7nwE2Hd|X@;CR_7s zXWg5fH~-eKil09H(R}X*$;GP2wp>h~&vf;bRQMY2Q_l()ud(~zb2TYqr~S$QQ+}_1 zlbaR!fxrG2<6Hkt^;cuR?6B73EB*PjGUm;W?AK)`@7>*V~9z39P`GP?3)sHhZ~So5&|1g$3%5dOC zk$2wWMH1R4yjsN{Jj$!Fn{|1%vyNJYl|pv%B)LmC1<5foT3vtp!9_5O;cw&nonN;{zPO>2M1tQEEH~$N7 z=4A5+udg27`ge2tk@8dbC*9A|+IAu<&+?D`y~zv3lm|DVGF zj4wZ>a<6}x_2t69KaqW$LQ{7p{nY(^+;SO@+L;g!cJ27|X_*rzX+=c-z4%gMcFyUX z>(f%@+TH)3GhF%iY|;N!m)_mmH^HTNZr|#Qj*nGy=YHW$u9&&``{j=@y6$4J_E}+9 zs=JMg1w5^KW%Od+*2ikzoVGhi?i=fDj)uvr%6UQ;f9;B3-TX#7f6BBsf7=80y$F%C zGSd*V^K@)Z%bF)Hx9Ns>#T1v1_Ky!(UvLxcn6=+a=t`4q>VvIcjISB$oGbeJ??~>% zn^MQ+{u#-LlzqN`+0Qxd-u&3k0PDZXcdiDn;ha?Uf7`k1?{?06@OfQ){X$D0aUCx; z(_*$ihwYY~_Ubs9v@`Jz|LN@WDJ73L_0OGFQ@T6p_c!COX|?RXMfXk1mssF-kLTO6 zozssmS9^Xp{?boL^AEdMSeGJ=J)GV zPJMptYWe5u)Sibqi*~>Nx!~L%i%mVD^;H@&51Hb2zB#4p7-;8c+G16{p;vVB#wMdZ zjC$|Rsg=KftLbn#`cKQ(Ip3P>o;m94t&Ujx>tF8a>@WM)oz9!}_UqHB7rMf^FQ|Yn zFu1EymbN+3FM(sdlcd3Z*18&l1cr_aEpM%Uwdu9lGE9@^<-D%I&&!d(vqK>2(mYBgIXyIeuVnj6~=CY)ORJ!_V0k*ylvx<*Eg z&{vK}M5o>~xW3|D#NCBorxc!1eD%%eo9z-tv3E1P!W#}x`*r46Jy*NHvgvPjeZF;f z*LI$C)&;$#YszESv>X#I)AiYDTV*13K;ysF!{Zyz*H2pNw{&CkYVP&T*-mcLog($4 zo>U)Np8Mv+Cr35T>9tElEZ0nCX!=)L`EtUXQsbNRe{DE0_0mq(57T#KP6=EPvAa0< z+U{)!7RN2Tc){)ShK~#r7&28qM83V5_`A4Gm1*QrCJ^>FK2>vlH)#h0Fg-l5Gf?9TNLRaQ1&w ztysOgKU#7Ey|ot2k=`v;@Vy|3`=(RIuW>#L7Gepb1t z_44O4rTe~p++4t++x|i-=41D>{-V#n%B^P!%&lEp`c^PB&gb3tpA0$myK^|h z%?-1!T`$>be^6z*eewD1H!QjP)bGwNlxR7kS=xP4<;r>c_wQM5-uiXwl~OzF&dPI_ z-<|G$+t%{pT>rn9(@%bvEMJlTRODm*=f0UI?kp+)H+^Zj|DHc5ejel4m|nXh!=>li z{}=ZeuFV&UOxqP&HPzJr@ea>F?-x%k+Wb3{V-l|gJA*&u>Z*;10T>O?t?518<)Z)p zfBXOcKmY&#`~Uy{&-4HP$^ZZV3+=0%^V56IlGp`ORKJF;&0ouBx#SFwps`&U}BIL7nVb-VVr zbxL#m_$`X-(oa|&IQ9L_?x>Wv)@C=)|9IZjytUrb`gDM?@wUB*!86lun)Sw=URPf~ zx#V$fSK({RQ*Zu0&CL7O{&|y3$u;#~3wytRY}7D{t$T5Fv3BzItD?6Yz0!O7{p43h z6)BuA_xt_-M&Xx#N}=!i+qT&oTgz{IBINKhYWGp^-@D^@>!-=D024~cKz?hZNAIO}&sX3w0{ z9@}F2zMD)H5$sVnDc@}POE&Ju(Z-Nluadsbh-uTa?D^~%I7Pd9`ceB?A0=0c&aS+r zyYIgz-^5%U;mzR!KV&C|X|6BSe>Zco+iI2<%)V&>I(3`6h1d^w*MG8{9{2Ou{GP|J zCYY|%Tlc|_xqi3K5v%1Up5-Uy9FKqe7Ier}cFDQZ`%j%Ro3lhUX?;^AgHB%@&tZmE zX|HeIIR$LXrY=ybd;YbKasAfWx%szM4K96py8U)R(UZKz;=iW6d^BtCyxz+%R|ju@ z>EIJq`s{J~;WdlX{uzE%6Wj2t<#wX{4&^nrcWW;GzGL}rZ&|I)-uiF3TG!fQb3b!u z@^W0@xjb{j?`?YTxW4#ae0%wS&iMkLtrIuR(SBRM|6Hp(!>@cUaZl5l-(PD_d(_VS ze3I|2{Hu@V5y5qB-AVk0lGAwJZ89BmtmEOoCmvu+Wo#o^U zhcGFpnbCRD!l(I|_&Du2=WqR3AAWiL-?H0ElP0)ky!}62++)A~3wb%qS$5O>-t7DD zf2@k#-(b&go`%%Bb?1+>rh6BQ3MPVz$-vw^jI4$bnyk(nO zTcs_JJ$&J=9?IQ$U=7=YRRRWQRvlq3;?~_a|Y<+s7 z@uG_a$3`z+XUUh3RU!-`_8$tD7yik$aABODU;Xk5Ifj(T^4b+=wAL*Cn0%@>GoEMG z72kWOoPYe1%UXU-Kl**!&Ewj6sr}tXr){QAm6)a}+HJxODY%A-J=E|pR z;*of_|CL2}eGK2KpC7jD*ZjV4>)OhvA6u>e^j1B)UE3P&@}SV||GF8DIltQjigqy9 z7yj69w4G~b^OyX64ZIsc>B61J7?|cP4HQyw%6j`??~-SZbOd2Kd*{`K_g_pk0tb7rrvkBDMq=#Sa* zZJy(Yh4=6H&;Iw=_e|x@qAgXwYif3Wv|p-TyuIe#@~MZ*oR3}eSh#rKZ(V+_so}a` z%8&SL`4Cg)|4D6n*SyI~4`gfJ{84{ZN^eQj9=EK{a{&`phRNi&@-x`Yve{|uH2G$5 zJ;U5Howt{jNOqe=9A=;Vx8ml*`^Wxn@~iF^y8BP;=Z*b8MNRa7e`n!yk7Ijh;AR~8 zpQkqcv-y8ci9!}B6Q}MY`|9>ct&#m}R-jZ|J8%0lNsoIWGZLM@*@m}grV;K;VGcht*04mLx35YSQ0XVsEwP;=b+mYz%+Jr+CXxxU4bZ{*?Y-r_2KUJUVX<75>5&MG+8yGD7veUJ% zMm>;|+VE?xVtsGhVPTE>@VBe8U;5sCtY@y=^deknQgPR;Mb=ub$=V6qk9CL|xPF(q zf75Jl-};|!9kW(tmBoFTFTbK=WuZff>#}68Ad_!>eM?t)*qp4tQ?yk?BE`91mP8rkxVjVv(ne3H|etGu4nkrGx-I}^$$LZa@x$G0? zeTx38adJ(LPLTObFUR~~fxYH6y%P$)W&E>rveMN*r+@!O-`Ur8Jo@b7|H|{q^78D= z6D#%WcWu17SI=1g-(#)pcZG+OcZt{sc*%t|{eQn5bE)6tAztEe|L(J^asO^kn|)cEReR@~Ftc_Ady#^t;$hR* zu={yjv93G%ZzA7M->F+SufNsrU9?Yqb;e`2BQtfke-#hkd$aw(v0veKf}2WCO%!NV zx-E9_wYA^E3ZItm=TmUzeS9NF(BwO1#zxLp9+l8jT z8t$#lPTRbWJ4(o_KlS`3&f;^^XE2G|8J~H;uaUu6B;mPe&ef1ww~2~zk1!& z)mokRBom)5j`iN&`DH6(!TiS(rHO3@I$R4^8cx`~&ho3q^tfv;)0{WHE%vPW_PFqA zPTkv2%{J$S-d0H6z4dO}?{}veZyZX$_G)R+37IJ|GuD@0DCa$UxPE8ZzwP(z|qXa&6qUH#gYz)$`RIzi^SYH~UckhSRlSo38y?^2zYt>*ca@?7v#Q zz1FC@Heuswtx|WjZ?8Acwl2GT@IXS_r*jMaUso63*zw|9>em_KiM6L+ZxQ=;YTdcJ zpVU0GgjyF{F*W!0f84-)_*JZi<$1$>OP;svn)xsOBada`?3?=6r|!Xr1X%k4)G?|Wt)UYygt@htPsUH7%T>T9KTE#EW!%FAMzeutJW)eFC! z#jjs`^kB)?<^K;Et~>kB|D=w+uIhVZmMhvplYYD@1ZdkMH&_BhZMZ1WM}PAG!YX*|VIm zv-cj=uROJD?eEF@d*$!n;5u;9nsyhZd*++EMEyRMdL_Urq0eK86z7ZjNb|3CjUG;YrP_g-iJ?(*IKZ9m^ETZ@gd zUpV|*xFsK%C3?!`YxiFJ)cM)?QF-l->Hbe*|1Azzt*xm)ZvMIQto^H-^CHu0Y##MV zU9;{x7yk45+}S3dH>^{6blmj7p0*h~UN~}FzTQ);SG@7Wj_`SAH}WrkyQ$7!vS`0q zj7|R)?N@>CLc!O`*`&{SE?(5xJTG#*n z_lJA3eaAQ*?q58w{cu-Uf$j84hKlEzNw?W=y8oZtXnFqLf?pepMgI3)oLOJI{=>S( zjL+^nmu2}%Zxc+G{ra}*gx%vxX5%NzZ+&1di&MJItL>U!=E0LHUDpyg@dg*m`}3I3W3D%d4v0i>FIIo_W<`wi)}CUeQyZZ|_?9 z@hoqE9gD<`rL7S=_zv{BG&dc%6LVuny`S9FkQ0|z#(v}ZBo%62ppznTm~X@C3(ueN z{g&2D=gCfPZNC5Kf&s@&hl^!WTMt)GTe8rg8^)=Wy(`B7Q&Pzp}CM z9QKCwc?`n4%aZDn@4Bk47XA1s>B|W#iSth%dws~>zsvc0#C>I98OBwQ56zem6SeKG zMA^-^wLjEq&Ob_;>^|{d{c-cQKYdq^1=h&+xxQ}nWnunwKge85ckPkWfA0O;@$bR) zC118$T`Rs&*YY6$Xy4X=9r@S(TkGxqCb+DYb^UbJ{g;l_8*Kb-v^8(r0SkUFdvNyDi)q)sxqg^ZQruj&EKN~3DaHTo)d!_!Ew*1&zw1eh)H6P~ z-Fo4Kx&yHmo;XYYAg-?6_yF#Ck1?Z+SQwZGZV=dyn?Yx#4Z-*c5XoF?3w^Ly7< z{go@$#{aD}ocizU(dF{z9?v{CcVS-CJAY;!bZbHIyv=@1xWEYR~I;DaYGPO=eI3EK<6EPJPaa z^VMr7?0^0Fm+hj%mws>lG~vvhnHijU2TskXjhp(FIlPqhr@fci1TNTk&q>61k0t{H zgW{Q<^&arC`29FyNNwCwv)$#CJ{-TOYJAr)G8 zV>eE>+Kt*?!GE7ZKZp z^^RhivY&bvZWNjld*pUp&$;Fa-RECK)tj%G-0@j{_HUlWuQgo`rTdZ@lWE8y7gZhQX~FFrnxT&$k=U`^S- zbC3RBb$tJZ5>^S6-fr&p5#>8}>WT-EZ4>feYt9Oxyda`iZ2!;#F6t%-F7WUZ?(}_LFNfbbfwYfBzu6ZKYoQsX1SaHsvs-+P>@L=biZ1 zJ?#7P%5^qBUcY?2#^}=J`oqo~p`01I|6S6{Hh-0vH9chArS02}pJdv{de8FC$=o~5 zwT((`{!h-u3a!nIJisJ>;!#ml?f>cSb~lc5I={Yn^|;kdj&Hkv{1pE?y+3>Dz5Abz zd|dYbaeN*qj z$H#3pJdmHYWyf-rMYZSCG8P@4#r|PV<6N;UQ^WqLH~03;-SR=HxJ16T@u1w{qb*#I z@~_x8eDG;zV-2}*ts&K|Ij`R3J!5l26eDxOgUgIc4U7xeGTiUG>qMrgc{S z?a@o+IUhWE8{;Rcq#ftCFxBjspSsNM#Jl>-zki(f+f^)G%-_4>)NRAtyTTtdr)F#| z;oQb|AnVG?%65hcdp|$4{pd4)s#SIRU;Fu*`WElX7>?Zd_SJlr!79C!dvl*zm+f2l z{9f7IJrDMX_y}IIUBCH$gzznw2o}w0oUN@HcR8Q>?V5VmW9M#*vh2tG=a}C-omDg= zvCb#Ye}8>uY^~4R`PUa}i`=ef-dz_gQO%oyNLepHK5|%CnuGU0wg|&BOD*wD(0k>Uiq+ zCLoRJIA77uH_^Q3r^n>k*c~Zamp85RMs@drEnDh%iw>^r($bk9R&VN@Yn^(&azP=( zDKly3vqe<}pBC)btGn;?XR%S`i8Bw~EvI@^XLboO>&NYUlwJ71dB*(Dg&%}@BQBeQwFD+V=m2 zuj03B>z41j^rtRE?|JSktCuC4zs@n|5=-7@8eR47*3rA-cDLTF?#sV+eCf~ngWmsA z`!a0X_Eq^s#=if5e5&?!Z?(O@ziO}l<#E>e#$V+nzvq6p^L$yU^=W&4n+WGCKF70; zlV`2|we(Q+N)7pWo^wtZUuv$D?3^dOEa2(ESY?kg{wB#<0pG$8A9o$E{~~yIpKg$h z%(1`A8-7&WexMp}t5!HO*HE-D*BP@NYKd}7tWVUCR((qoNNg{>ufLOBr zgs?B%EL;maowl@RGN>_1bTAY#KR6l7mB!$3;!RBK{rj~q&z#>WTzw{DxnEY-&gm=4 zPDH1-)jNJ)wq}D-%dvNpcn&<9ZF($ca^PjCL7XDW*^1r|BseEg>yrLf4 z2fzG-_jX>tdF#2%3#W{7|Bg_Gu(=y5HlC;}&<}GwEU;s{*_Opu`HK~BmKWK(yPq_;_}<>1TeCLj{-Wd8oDJ)R>c1H@|Ge}wL-&;T|0+#e zhiRwfe{cR}_`{|#;NyMvVD_~WD&pIkB|e+F@qBI*e%o(i>F@E@_WRPFkFqcKM8w|Y zHU96yEjgS2+ut(jNh0@n{)c#<{v3KnURh1@<=WEedu5(SEiU^Nwfm9A+RuAd-T@Sxjv>qcisP2KfZ3Y*6*9@wNbRx zD&A+?tX)5Al3&!c)(ObPd|iG2^Yf%s@v@o_%Zexa_Eel!|F{3Ig?I7Pz4iSP3Mc=) zS?0f@zG(0HqL`D1FaI*yFUR7}xw_PT%4*T?t^fbOJAbYDhVhFXM?T#Ve)I8;w8>I= zf3wS%H*GwUAEUAP+TG%pAu*{li|#xBN`G!D8?Eg9wL0%@`li129Vx4VKDa!3bL6!b zTZp}nRWY~yJ&Bn&ul0Za`@KeJrP1r}9`!y~OMC0fBly#te(iq|{jXkI--h98`>&l0 z_cUWVZ9RMUHmzE-@Wf=B#VT)^Tt9F&Hh+~b+G=OR7ukQV?Ek*UuW!$nk>0VlUZ+D| z{_9%v<6>=je{b7XuX#P6_g5`1!`W-sZKq9bp7{8l`+bIEf_)PV7v0?M`|5FJr<|Vl zS%Z7x_3!>O^8_?3;Rw*`;hE9vo!7j(f!{S@hR}rvj5*W!CQcAsBej@;D}bTsn-k-^ zv#c!Jn>-m3wx67HF1>7?Krue{q%_^;e|i|??KqLJ{gWA;Dx*hKP53$AMp z;g9^?{og+Aj`H%l`}gWAw=4afEV8A@rM&#)?t;kFBb$zj>HeSmKlp(2oV_0&eLl2r zhWelPw~zN;|77rP&twn zFRk5MEfzc1Q7*V^hIHAAZCw&!AK&fVw5fjM#e!nL#j|7o+FwgI|5`Nl`@g!SBIl1@u5n%P<>+?%+eeM|$J#`3Ml)Udm0(#VwDXI_^ON^i zg|0cabD0$9&wbIm*FRF-xAjQgoRlBGb@tXvJ$DS<-&OQ(-+zO$XFtAo2&`87lghvG zzuB|fMn8AtUA=XCx4ZJDYpd;T&1IFsSwB5q`+s9-)6Jv4N224uGsWG@jdW^y{P5t} z3{P*>=L;Xb`|$VLnusYoCrsWWb;7MVmE-5F(8DozjwP~&82+3ey24Adfr(+C<(;3( zV#{L~f}hqGg{+@wvY1(-R*mhq{NJnVz5iQ2W}X${-ts;FZhif)@5$}kzjFQZ*zS4$ z!o)e*`@g(Dv;GEmOjISSb?8+#ppq$KXq*ZlZe;+d@1!Ttl=%HC<4EWE8}z#!4u z*ZPx@V~#Yl9s_Ga1LL3Gi${bL7&I1$A9%pb;aaFQfsH|-w4R|nT#b>zrDW2dqh&=) zGY%<;-+%t+`@H%ak!>?U4ul#fUzw`VgkNrE>+$rDj zzU-Rd;xY#1)2j^&+{#Y`oHMVi%?x{ew9u(RzlC9+Tz>FE-)k(p?ri1ijd^PyzHK#k zQjFfyd;hg}TbO-1-@4kN{*&&}DVw4{{NH)|)uT_(@3^-;Q=Gfbr}yLZeiqlaM=mcm zS2&_Kca_IFJ^AU!1m}EQv8J~{C+v8Am`;cLU!8Wh!W#9x9*=@9-1xTe`nkqSHOV_` zz9wB*U0hTg{4ajK%k9va)$HH6R({fn4te3@kvMgtt#ALO1j98c*7vvT2Y+a(zjpRv z;N2VZ_r8}{tMQG!HQT5zF>HU@Pj8+tfpRI`t=WZIrrYnYdnKoQ>9vl~l=i1brtX|r zc3`r=?{k}1?sbuF_3({vTX<&529`kY%P+Dfa<*=heyk~JRymb*nWWIo-qO6Y0{?Gj z{`PwD;`Ab~1&!sQmlYiS|31I5vQv#cxq-i)X<7Izsa2T{9}8PO6u))GPE3$Iw0*r+ zc#&9=T6QH*{=bv=#rIU)^Z#poBj)s-3Gs=B+P7bO-~XPiW*_oDd-H{21B-o9vd8_W zmmYju5&QdF=K1$;;!@K;9xdJWdRe}pl()4*fAx=h_qSG6ojU5on*YCZul8hHsokt! zBr0n^Xx00ljxVxVA=gy(Un3*c{*m8)ox^SKlF#Lo+!vnZ_;<>rr1_#3GwL3^csli@ zn2p=%ht@*s`?5~Q#>x5~(_JOI$ZzldPi1!*7~V73Y3AHf-6WZNv0&B=>zVDf-WkDq z0o?LI^Y{K=`PXn}-w(gT^CE(eS3dr8yFS(+@_fF+sz zCfhPv|8^-~#Q#%9d)o7V#@G0bGyeS$tVnohXf=82!*%cP?fYhKk-g?;-i+sp_rqe` zv|qm7a9nCrXrqo~X3NICo7mgWR&720dY$Kn{^_dH0dn(Ar%kxAS$5-b-Sjnk%bwih zK6$P*HsM`FbIaBRMS?{+^}qVQN|h~+jx~`~el#sWvuC-9zz2C#27{?C%wnK3D%agH zW#B(})^IYzhN-=0Q`f4Ct`A+*@bO~7mdl)nf`4WhMt(F1JX$^XN)z+B(s_QioQ@NJ zT5p!wIq&w&Ts>z!udlnm2x}SMnJan2=>DabG6|-P^_%CsSR6WQ|2C<&->%e~{Fbbo zt@t#)-R(TjUen0`&a3(UU%zp?q2%|Ayzg>L<33cm72BVx`!?D7g}K|DZ?obP<2HRw zyS8cCwI#*h7JZGctj*bW_}$viM}xP@ZTfoW;hfL665sQuPPn$|-=D3w4r$jKEm@q{ zwmJCzQscKv^qzk2Nm}>7y*u;!OXuyp=XX4-|NnINjrJurS3b4*t&zL^=GK;9XF4yZ zN}Ja|t*;bguMSyqTVn5pd$;0W)q6+gb6T0bU-n*mnuuk3Z_f|b_qV<+dUW^s`{Wm8 znt}WNYb>nZsS^^L%e`*zYo*V3t|Z*Gd!IC=)bY3RjM=kVq&+1b-Ll?$@q+8kp9iH2)JuqXY|nV|f45YjN}q8@W5N3uqP#}EDp7OF zU*7fOHQ4x4QoA@&`_byvezDIzRw#DYe$ITYcJcp{t4E%j{jL61a$!%>@sm5=Nk4J@ zl*m%EY4RUO+XIP)dz;?9^MAhJL$5tk{-Ta1Ro|c+l?7-2_fF_Q{8IRj^835Gri^hqTxf~K6zYZJJ>NEU4<9z=~kND58wc+P_cka&OdgZ!QWCv{g<{@JI zMvH-=o}vFwcR6$bhZ{1E!|@-qYih^7$e5G4JbuxP%lw~n>IKgF#;El{N%6d&{>7u| zMjX|$Y4-R3t>?5^=kbAie)s%jo|e+M-?#2WXWwD^GXFW#uUj8J7eAVra^That5W(2 z?_cHe_Fa83Z=-eZv#0rGcXu4SXYlGX+r0V^1BL|#3z!ZxaMdpeVqg<`#aP{`?JfLe zg6m1m?_SVOX&#)l<^vLHO}ybJpEha3OB112^yNj^H!f z*Bx45Z;<*&PqE>)snAjmhCkkawJW5R-cI#AJ!|!q0=DjBV&{dNr!ah}vcA;JxbyBI zXOr~H^~%pS2{Wy~7%!!hq3b2&^C17yuWpe?o%SEX-liY*cVlr5wv)=8TfDNa!YfVh z_|sGI%S$!~&CA%3QS<%&`rww5Ni4ro4waoV$STR39v!!GVs&`Q@9B|F*`Gg48Lt!B zD#8Bi#LbDf3{S`DihW%_!zSgyzv+3=2kk9v%^zIZ@OMZ3rvEduMdDKrv}hP|zRCCC zX8&oQclzp4r#CL)xvv)AlrWt4#iRQ|s=<^=*@kn@$9VcvXxM$p5m3sE-*H3Ler~ZnrtUkdI5LmxM#7}wF z7qMEY2P?i`yL5iV{AFL2nxA;pOr2-=*XLPGd|2~F{lCiZ)BVmK(0+ZMB{J)5CHsf+ z?}f73)f1-5IOkkbSjiMzt0%Wyrn0K)%lE(P|GQ6_h;WKLV7^yr)8YMLQHg>!!}K#V zceKrD@jmpjO*~=F+w;c~de1sYUG50}Q-4)Bg=Np*=E8o_YKQIql^uze_IlEJzYE@p zMr5yfTNM3XJ961V$ zk-CYCcfq80294=H3~X-%`=x)~t2XK0P%vNi&!u^1-<;Pd)v zxb1bvf{H2rnuoLA?)!QvuvRmt%V@*amsk8bH%9(jBvs#ZRD0VbyNmbufBy7R%8Hya z{hRZrA8lHJ=dW|In)yAgYMmf>Ff31Z`Z{{lqNf06t};*&{5j` z)7@uA-*l~Gud@8(VL4sny?Rt3BJxv*)=mOXv2Gk>~td+TD&Guz_N)wj-@X?ym{zAsF> zGX9)$pHZdaayn=A>JXVy@f@x6u>UT;idli{{3TDos*K{O1-4g+*d0$)fegn-~QNo zoMordvpk=w(^s4ROsHKbw&BvHyMG0I4lH`nmDGIf`2L5^UzN@tD%sJwP1tj~`1y^2 zAKv+2yQJW%#HYf$a`ArVSDo9xt8DZ7-|2kj&i^QX#-LT9mv{3nDLeJ|-z>$Q<-67T z3KpI^|5^XgbirM-6~CXi*&_C3|HuBvk@XMKZPlObk-utrVVQYt(6!eIyW_rA+SZgk z{Il}~Ysiu+qUM>BnieDy2+i@`Jh z@A$D|W=&6D#@9}R$jJ%8s}!!E)%JX_Zho4}(k5@#dpqY`ur1PCDJ;OvGW{&yyMxpB zW-;hH)MszCYhC*D)v>jQYwc$3tIJkjv&*5lVD9|AJLi^dE_l4>`ithP;y2dcRz0X% z9&wRLKbQ4GPy9aNGwJ;1+5P&~inI6DNj%=l+oAla*jizl-Q{F~dj|DMJQXGmy^a@L zHv7Jib7;KVwMT_9qi;H2y+{M!pC=p%3=BNiCa+FlU|3Us_F5TJxRR&%rQbX|uX?oq z+nA*>Fq^@)ej>s|Jpru>*kzC;Th*Wz5c(=@k(n-nRsKCsLE35LtT9ONAK>> z_me(SbL#7-KK+CV4--yhZr+9#-UezS^K>fK#Iv&!WowJzT|-o8)c`nS)=jXT306@6Ad z{UrSAd^4uC8~+`?q`!XmJU{d0TCZ3Bx4pvsRa3;|)}5b!=55`&@!l_~Tl3xTep#Ct zUL&-9`Re=C{rQ&SKaYxSb9eu+?wpuU@~`@Hynp9>-1sx;;A!DiLLbi`H=n!iUe1T7 zEybTR!)qE1)89Xu|M`!^q{_gnUVmq^dEfZF{zLTLNng}oT-)ywdQ53b{QEbT`;BKF z`E7jT<)qm+w$1$b>4WocnU$|>8DoXir)<-j*LvaM%zgjOOMbK@>=)cub@5_o;}?#< z=l2(!w`}RCXTN`{+d=h7``>kTdqU?|uk;f?{KaOs^{!?M8>ju3WjH?lesAB%_Ku0E zu5-@G>`h@j3^{t?g}LUnGi6U)Xy^Cce0=Nl|NCF8`7kjEY~Av2 z>lK@DKVAKbHvxI|k5f-X6xV-#P?+VM7_j{^cS_^xhxNxZ3$;FcDot9t|L>Wp3k;Hz zBC9sZ96h-;RoA?2zqRFxI)i`>GMe$ zsq1mM@HDG8drv6^MZ{#d&3m0aoAr3Xg{@m#optv_r4=z96nV3Mc2BI^vm+v#>%W~( z-`aoYJfHdHx_qrektTnCmnSeT*4vdV9Av#~4zFd7_Mx;~+nhDlKl%<7ck=mlH(%fN z`!x5Xqmy1_#x62vS$(E%U&McI_V+tkBhP)y7QcVt(7|+@|1DF_@6qP|lkb{!_dVDB zqpzl#ZW33hpFAVr+r4|2A1>TAFYW)eJ!_SZ*887knzkgReBX>`+cthYU$g2S+wvTZ z+F5&}cgsZcxz)Y;Z(aK_T>WvAuq4mUx&yN~A0%zn_?M zfWy&!Nlw0;EXx}4t`kO2cT@*q01%7;e9vP+!U1A`B(bBspOQtz5g8cFpF2oKfb>@{?o^=X|eG>*2jOd z*u8mrzViKRruWr`x;M8=f1ezjvEajsU-G;6&9VJzw>bCb^X%1o>W%Leu}cPfyyH7% z(Q@W#8so!#|6Se{|6=zIiT2Y|P=6>`nD6^>d1%|E6JiIB%n^zZ=U%~Zuky~$>=lbj znY@^+CaUjo3EILRz#VV!Fzipv%Nzg8{{-x=P9?fdf-mW_;i5Tbi?y|73uMF z&n;sWX=vnD;bCGp%gFFSAgC-=h@s(>@3Yq8@AK1tPwU!PT(h`;c2%-&(f)&tU+PyL z+IjYQEMN8<)~|O23wobNg|sxv9-g-(Qr7p(ULL_`MM0n4#daI%FyvqQ|Jah{gjHAk z`PKO^Gv{jYtnuz%_h{a-nt6{Iws`w12r;jzx+mp-Jf2q&3**v>K*!1lEa|`OD8GrJe`frxM zDP~K(&-0)~N7=sG9*?#Cf0=d7{>P`x{wVL1-T8aD=9QUQHD!O*e9wHYe!Jnvk>;Kc zsmCu0ZfHI$zsxS-^y_t1KQ}G8_{H?3N2i38y~L}-IW9N$t>K>h@{*Cf#7@PoYZ9}> zN;lq8llCc%V6C?gzJ9BI-oNDwZwP5++xGLUdZ}bLG5+dyudSP(9hv{n`zF8b4oNe= zd`5lk&u6}zY~`7`>++dnO{acE#MK=2h&$k+-MGbO-;acwOSYWio>V?jZ}Ye1v1i&` zf=UAy+|2H~P}uy;`sS9?J@#7BkwSO&+CMpam-!K+jnoIDZ!K5TdFx#?4bLt8)?_FC zM~R~(^~Fma`Mx>3*X6vl&e{{xclCAO2A-W;J|9=j|4{4ttN8!6x9QK>e~Qm}ntE@! zyfTxgVQilL-%mN-Hd)`LUoWlyWAZy|(e@KtU$4A)>`2YU<7zfr4((A>H~+nTZ(OTg z;l*ik(Ko~`AHA=5_xys*Gs$(%=j$WtZ#^rS()?k=J!7V-ck86Gy*01c*ml^m{QTZ{ zV(JsYEvG;ET=|&bWybV%eX#*|d;^zU*PWf&i@FLLqfW&5-O;^rsUt(-Lu16pZ{F2^ zKm5wGdb8KX{O7iqZu!-YoB!7_Kc3k3Y;ND1Ij`ST7~VR6XGV4Lv&jW-s^&kpeR!?r zd%fxnF6TGxYK&_&R$Q}|@^#7Kso%=!(DwFjp0`h80|WB|Mz2P9#ZSQt8rBmU@Lwr=_=IgqQJ(u8-AjI}pRJDP(5bpKH|$+fra6Wo+j;5YJuALBA0z*r6b#Zd z{LJol@^(Sl^Mv1@wQtUT8<~~xe%|!&O>1?Rc+Rq$(EsUhH}gy5aNQ}pR=<9;wxjXO z&Fm!~?aMc2T{DeQvz>NKTXI)dh1%p!i@yb1mrgYKzUZw7$5xHIF0bnMTV*|y`6adQ zvC@uD!pCE|-=F?4H+}BuTK}5;)z8n%KfiD^`|kMwv-gKS|2}v1+}<4bnd#Zr<&yij zi{)=WeD>7aef8(ZtM??^hqKi_zoT_&mtF1e_mW=nk2(14*B89nG2`#erVae_;!2+_ z{l~pF$Xnj-Td2>3b7y6~o}PGO=Xt&Qwc(G|o#zP_O?UTrb@0oL?Kk*+?_YmXZ}p<@ zi^7Gc=bVq+FAj~Kv%KGFTSxeXJsQG_Zc6nby3b=Lyx3v2gyRsi^M^hG&bc=~{eQc8 zWyj3TucBmDWp-ZObmHxLt90>h$H#IfulPr|8_T*E06(eBX#K-}AnfO8#F{S--w7!!zWIEt{`Nwa4}6g;UvD=AM|SILr3my{b2b-{KNY zU(dgnkWlQ`A=~Ety0d$}Y-WD-%n02OGuE>{{-IQ@^@W(kMA{`ux0nDrvGV&XZiB@eoKA$ZDFg^ zx(ze)55K-<@N7$T;W@+BgSTR4|NTADZMuIwSI)zzFW0_#Kf2cGRu}r-=ucYse%kaLS+1MUroGqwmCLxv&sX2`?DzbAQ#hKA7TK(y^}$Ny#hZk{Ka(_m zDR4hnQYvA0rFfIT7}!5FD1Lt@ z^680itxpE`bp_YnSRAnBdcFS%Tia@--LKo8Oq^4^=Wx|t=1mLhuR3)9t>|3-NKq~K zpG?Clh7XK(nK3)Or!0$QsFBitVy4!$b5(@#FP%5erxX@TU<A`U;R;)>hI!mP z0uEEf{0rEEue_l86JH}rrak<*!#nuUrweoMXQx@_Ok4HS zdSk}0JP?fw3w%6P?3hw@2+StRyFg^66_=SBxqo(Tw^?geIT)ckX{(x`0BN|>U zIi(QwAZ6Q!fB&<0n(eLOe{ZV!)AYhS(>1HVFXMgVmYyXjW;1W;@#RN^nG)|-KKZk` zyRCjt{5Qt>X=3NUh+9R4V)wr5wtlgw zSd(xu%2zc>?WpIj#V)bAKHcHfTRy%1FojP#=2VUB$~B+88*9~`Pr6|)R{!*|q@HK< zo^KUvh5SDpJ>@4GAN`Gg$L#w13sX~`epzDfCcdt|;M2jAIxp)l)hy)`ySe*qY1)fS zj)yD%MQh)mc&leu-lE4ZOD$`1gBC_?*Vne4D);ZRAg|%6sF~M0w-_mY^KKWkmzViJ z-SUpa4(@7qRsLPG{Xe}ivH0d4AAkJPvn%tyu!e7lDVV?L^@}M+I*+&gGitmZlsVyp zdg033lEu8!ZN3{-?QnTo@wa|EbBE&kH*0+sWED>_d70{aeQ)FU3o+&j{I$hCjTaBE zzxinGfyAy#?(VL-xnZ@0=H10h7F+!NpuNS?IA0Nn=vV*NL?dfH3Hx_jzgFxk zJ2v@vR?p^)Z!B*AJPI!K7*$`q_TYYua@vVUwe@)q4~Wg*XO(?qdF8vSzh13U+}QeY zUqb&(z7M<`4j9NYa6aa~!m#WB0~fRSo(~O52fLX~9Cby^6v`XsNH@&68*9MHkg&1S zec!8So|6@M$NzY1@9Rny&zjU(|Jk?X%<1!M-fJvik-NHzH(>7S1!v3`Z47OH#Ps`d z`p&8^^H-K_s(-j_VbA7Gf3p|s9?0g=4ZmjkZKBX))wOqu?)cT-o*R+P{Pb+Kgn9O@ zsQ92Ks`)#o>;8^jUoiEZZMps)>!%k2_I=)QRPWmUZ%buQOr7`pobl;q+jqA#y_lAs zDcOIol|^RpHRc%g_tSF2`!|3b~lEj*4Vntzx(-BY)Jx%oqoOw&cH z@{?PB#S}U!MR!eWUEOr^L))6y^%LJ%p6HMWX;3+Ff6^1?my-6ek$2aMvWNWt^D3Ta zdG6LamY@0ag!{REW^dVMnXAmac;(sqQts!{kD6WIwA1V>liHWHr|nmnO!Sp4Jic4+ z+Vk4kSr}&(|@8T6Y2^tTmop`nvAVesoad$KOd{}!JxIsMP6qJ1;%XZ)VFE3FppuKwP* zO1+_W;)E;qrsoceEPu8`^KdC+oaCGz-YMQfoDVMT(5k<^!z@=dkazyo$r=Au?bqMd zKbz$CzWKuam-asY{lB;TE%vYY?`ypLg`vr{D{tTI*WG@mKi%ZZJ*&8b_ms=d*!#U+ z(VhLx_RRacJ=e1qn44`W*rXSKFS-BY&Zmafn@ZWHot`h49QoI?xTa)}PEmu-t%Lpt z`?8P8Ub_^%;m!38=JgY9FFZV7W(%91ftW$TDUpf=$_tqP1v@h;oMmUY#&E!O9yi0h z8itq!^$Z797#uVWqs7$}x7wF~I+~`i)v<6VYmM?}>n%K`o=yK3+dg3Ey!B9*TkogZ zM&IuTz3xxW*t=ruiXw|+3AqBwCjVXTzex5zurTgo!4bI+`{kCKL>*sWKmYzernC2= zJWht~%D7tb`bcrfk57N>PX?COWqA2cEdLYs-X$#DDdxheJoU>Ns;_xVjC6Fr=e><` zKYVbzpeWz+W&6L`fBctps9xiS_5Zc8E2LZ-c@?8C<-P0sb836m^fuW?|Mu^Zw||j+ z?U`fz?YXh<<^1zgyc)Au_RPD#Irx2jVmgQPzCA3u?vJjU9nf3dcy#hMv5PWX+L`fx zq^i58#$TOk(xT#QSaLQ(EsiI(?UuQHaJ7LMyHrO~mgO2NBAl1!aBO#aAbj?@Tj?D4w8v%r z`Ti?-eywWa4U9hIx=fV8f0fJkb;l?AD1~+(dU$@>*7ZwVK5IL2TsPJU41C^fE%aL9 z*2$ZznqO^oc22sth2Pior+8i8x(Q+b{vBHW>+VrI_WGCK$}63B@4DPH+v;eK{@vU= zTb$fnx`MN{+@^?s_Rl+Z_4c!QfBwhTe4G1U{i~DqjlE192kraZr|DmsXBr%xo&RQL zZO;A2D}H%7@Bb;1Ja5g~JlicVzM0-@PW^9uLp%GhTCKGD9fQ9H(ehiitXpaP`S_`a zH@>din`$}z0IQs5O#Kw&Hl;NSn5G{w-Lb?*a&^P4mW+yt27LP@u75khsh*Uoz4-sG z|8fa`&NIi9ZCB>&nb zkI5<>k*gJpNbX!GzwY;})%*n#?PfEyLmy09?{MmZmFR?tzi%17-+2CLJqyF1lhJX% zqkQEf!~`oegIR?hhgj)6V+s)FTBneH-g0RQD+9x`74@z~a??MC_y1d7J}JUF^!1^m zrCi3VrB83w+&jbO&A#s*g?yW0&)P(@PEUH>eP!~-q=S>=&wt^ce!Dd!GE6J>?W%Uq z>kKmMfB%b_!YESn>%QCR|A9?%ho97EpRxKk*XR}NJh!aGHL}+33}cFXC*rO*`L^bKGmY_R?y_?G}eZKNiI{AFEn6u`AHgA}1#D zbiUL?$$xv-#6Nw1nk$93YW2*6$~8Hucg|hfbk*;N`PrSeBEFn`OXs+*UH9xAUvtbf zk-ksIsu-xo?z1ftTr-EiP(!zR73dw*{~ee|ig;z3tk?^2ET(e9iP9VK_qfBuqNACt1Z;_HLMD|Xh$ zzbl^?yWlZG{2%jFs%4u8Vy% z=fuA!iKicYi~4)IyI$7r?}xCD(|P-9w)pa0DvDUWBUryaF+kB$sweDWY z$$!83Yi!s4JoS2G%59%L@{~H;!t?g3!!|El=e7YCsq;6pTrK3@8z>}rKT>md~kHGYZ zu5C?OFKqPw=zd|6jQ*jLvahyme)e30m)Gu1yxGJ5|0LV%uR9Xf)ZONN9wD*jef0j= z@O??@Yu@lP2#4+c!N|LzXl_FH)?a-))}PJ#bNgyT?%Lb063+F`V!yibp!S2t%4<>% z!ZLq<^LQJZ_Z;OqVDv6oM5DF$X=Zd&J&S>9!okc^Mo(|1X@4Z#ZM5k-O&~e)9e0-{P|ipUiQXut;jBCbNcK;$7Rq`)u#uPV>o)`g1YqxXhL+)75+T ztzoL)BrIWcE;9B&=Y}U+uitXqz1`ehe(`_l#|v1*Y^tX^KRx{Nqg&lw{tqQ})i1YA z{cTd$ol$c9?!Jfw{uNf|3p{SNw>&pWvQH9u5@~dJT3SQS{6)l|D^>leD}90t^1K^B;WivH0SgJ!R|*p*41}C{x00|lTlkNX!f1u-MPFz z{)tmh1(%gZrMP}ukfOijY+{?@$(w(!?uv=cVGCA{wp2Xx=eO0Y(`#ph+5bN&XPcQm zwc6V={#lXUbu-fz(Xamtt9Ra;e&gVhAgTS!BjQq{cRuoYJ9kx3W@r7m8OiInZB$Z` zbejH~|6`=X-$`!I>t8KcZS!$wM|d>jB+2-byLN5L?pu1|eovjpzDuji{{JoimH7Xy zl0${xw9jv^+y47C`Ky~;*yp{LZzU_|IcW7dMrJp^y}4iS?~d1TS8KM-39UTS%eUj> z+>LKm9iCQi9vAp)V(}9Ba{g@Fk7tk1I(=R}KkvHxF6%FKo^L)L+fn+zum0rzw3CH? zg1tY_t1sOlbLxNnlQ-qR=er4C?NJeZe<3n_f2Zl4*OM-Ps6Brt_Egw+-a=lXv-?-6 zR<4qqpx4(tx8R1;dB$sj$Nuxo{I$)%cWY{l8iTS*0wZ*!N05a91a3>G+|^-VVEC`H z;)m$}|GSaypW5;N|9_7E|9{kF%IwU}@QrjZ&5;u?;JvzpgD>=l$&KW{t1a$*Hmt3j zb>(E_j;b{>C9G!{efB3VM!+y-$B~rZ3%mp40-X1MG2PvSR9s;>D)bs~K(Z+z?xJo==1| zK_ue9VFt!4EgT9h6Kt3`6lY5?Fziie&N|$6??=m*9p61=yzAE8p1I-pj&zf(GfxWCk>_7zl2t9 zI{A0Au}AhTwup|M$C}p6?D3e@Gx5^nv|hd4UpQvxJe`o^axZ$S>Arip*2>N02kToF ztd6u=%*{JT`)F&*^qIbnM^{f+{>#6*>q%~0k4dI3dso-@Z01_(v-0`o-5Zx%DsVkHZm8pJ zGyi1ddxPs?MKkk%=7c|2vAgguV^hVREBn5bznxeg`+d!+(}$Y1YQB}7i@hA%Z~HrN z=C41Sq>h|8xu@Uz)t!GKXK&7*`NqaWZ@*A!`%i^6H&=g(T>5uGq?q5!_|}#0c+}3- z*bDD_blphXb7gKlx53w#FY?YJPd)VhZ`YonmAm&`{*PP+`<&aN2B)|1yR0yL{Z@(D zl6&#;wUvb|Vb83Uk6NE=@bx!Yxc~R9dxyKGTJyL|n#p;}y!GBA{+4NLk6N$weqNKO z%pwQf+14Jn|DXK*Wc`t~bKTxd*>dIY;V1Ed?=M&x$VKGoRUSTBy7x<6b)2ep+2`ah-(S@~Dq?Q`R$;m!tnA^=9P3T`@^4=k zz1=JRrm)D34%4XmcL#Q*TMtZ?12=?pjNe2P^JBaBxjJzPEHH zZ}GVR*7HYaus0k$!oU@Bk+F@jp5Y#&Q`z<=76zA1!PjioK3|o2eK7+^pyoqq&SMWm zbCq2d2k#gA%&T^~R={${^+d>Rr=SLs%1AM=Xo!PnB- zS&u$W?Y`uhtG-F}|If{b%D;5Ptc{Ukh zWv)DVKS?#?@4pPaO-2uR4}Ir&|M$_G6QLXTS_^;Nnzbg4JuB+;;rmlR&bp)fgl}!( zhgaYKI9+(&lWEP`ZS?=m9oerpzIsgLdY>}y?~MAbPOC5kk zhUY2gZvELCf4V;0Y07j-^V7VN3+(If{^~mR@B9j~h@%qerXP=+9c0o{J zcmDMKSL!lqV^`)oHyz)7GF@jqL!;P?eD%NmvHLlCZxqLG-uttzRlMFh+RjhzOPtr= z*xltFz$=Ib5VDbX)>#5hDzTnRVmNk45}53Ykr(~SaycJ^Tyu4 zwsGHn{mxyu#sV@7hqxHslXAjL_k@$XIsvv`B@zw8rxw*%RO~1d9UH14! zvQO9cdsUNOKFhj)tWSH!?QiXE?^_Dq-?Qa0uIPXM?sVw6?WZD=#Ow>!6tDdnm%aG? z+ik|~C2wy0G%jC|dE?;SWd>81F*2&O@iXvnpOmjR7Wv`DdWPYg^bMv-d;ttas~DF& zsGs7=z%bqR#M=Je!`m`-5~Hpuzt6L2`tK35`B5?#bpkum zD&On82sy^J*g0*-`~~OC-1o~Tif&hFJSW6>L$H6ZZ*Psiz-T9)j)$7j1ne$#vZ zFAY+A+Fw5^_t0K*@NLlE(?6f@uA1P!rmChqVVY=tJ^T5i{{oWoj+iaX`XF0-`g)q^ z<^PY@7sUMC`|X-o+)tks)^ZN(^7{U7-nMqmvj5!@9Ho^J{^u&(%%Aiy9pH+7!>wEV zscyaBoimqfTa!hv+1}}n-4b)X@J8ZC{b`%-)mH~xNsimHAYM{xvE$dO#P?1M?=bF| zbYx$vo5%Vqb{h}X@A^gjt5@x+mD+zEJe_f0vizn+(aBv`rY7Isu`^#)?9jKc zQ@Q@T*bU#B^G$VjvwRx8P;P&Wi2CD)T)WTgTy6ha@1OZB@oy)?s!#8WIl7wJt1fPD z%!~tX+Z*Sf+Pm>lU#7~jmt8uVOw&9rZrUTir6{TElg;eZpWLgS)qDHZM<=qq6I&Ip zzA#1e-X14bCKrJoX}x}f9y)#(4MSyHO<7x(cj_Hx~|&xdDU#nO!YFYnh_ zn*Q8e|LNzm7g9CzijFSM;}=feGjH?%nLTG?_t)(G6}!OP|7wZ(Yp>*})aH~Vhxy1U%o)cfZ5Z*7uxB6$B6?aXZp0I_{ zX8wu|-(S_LM66@x;<<5D@`C09MhTBU47v|a<+errv-ZZ*fj6>t3J9&& zd-PgztHg<;%1<22S6NFYM7)uH&~ovb{i^IZUDaB3Lw)mGf7>UU{xlufAUV?z)5d7a8vSYxvdeDtLKOXw?rN$DXVEHwL{@c)0R=q~3ql z$u5_l95{U@{h)H@ldb3bU3XX8u01$m-ix(WH>JEy-=3{12)>+n_hP6_aqOMGYNJm& z;;X`fBwikUZ)@ti@AL9yYfGaQu1;GWD7NZvpD*L>>@ z>9?Y9uieRiSy%DSCwu#!bzdz1ua9@%8ZY-^?rizemBP7OlK<|mF!^xc6W6vo#(5ia zuM37)oVcJ^naPuv`}MJ0bkMKvgZ_KP-0Qinu-ul3u|6s>-@R$utToGpm;LJWYmd*k za=-rPmzf*5zfAjn*yQM}>2qx7*|Hbz6`b+^<)KZRrdRa_tlf92c-57yA_Dc-oO0xc3DfQ>&*uae2jm)A;+?CTG08P zw6vwA%=LHXc};BJnajUw%E|-mb(Jv}Y?sa2B%om}>^bK|wUFluh8l-I|E|}6-17hY zjs5(`Ts9w{e?8gexBTW7ySvhQ8-HgVs=NJS&YXf;@uLxp^VWt}JM?6v9MP11CfK`r z>e{W>g*z;Eszyz%SGLznPAuOPdBazJ-Ep?CsLTV^kNfLc>wB(mee#dtNVdt1(}izV z?>F7VuKE1O6S>B%UkukXHfn8o^1m~;vsV5@o&@KC^R;Il*>O%g-(YVbp%c)2k)dHq zIzz)Q<`#|v>^guy6oNkx1vWkC1UYphWZUhihf1- z&iST!IN1(IRTEy}>b?-kL_x<`5ga}?(v6WNn;&FcatB=+n{wpdp=h@W>cc%Z^Ws&m7_3?(UogybK zz6*-InK&a`{8tQ5TX&ei+qbX6y4s9c-S-7rX#IK?S9j`Ge|+kfZIK(EKilJ6P*+$a znX2aT^g;fTPmhGH=B#oHo!+}G%;=hqB(LJ4`bAqlh@73nd1PKjXp_yOnMUs4vJ0{T zz6S;Ld(LSKe^uXr^UYy-v5_z?}`0Iapv>q zvwtvrR`uzB`OUTemWF;Tf421A{dB#6*7X}-Rv+$WO<3jh@^yWq`Py!C)mfW&1f4f6 z<)1p`2HVlR>SkUByR1D8)mzN9G!CYJ>^t`)$&=xS(2?ii*}2QVD)+W^e@)-L|8F|` z-(UR+cYaG<+rXT({-^irzpMTG?n|?U^*0~j)C@OFj{Vga(dx*2#MWHyi|CuvNr!&y zJTl|{>dg3uCBF5?dF;-1)ZgqlYkf_kT3WZm!Q*Vz<>%tbw+u{I9IBaV#~`)bW7^iT z3`zOgo4)6`UrJVUHkJ>t<<`srt4t!sh~1%#=3eJ55d=# z#d}!I8s|Q8@|*te@)s5dz2B+drUq3vu6tbJEM30i`pe$g|CDt$T)X@*F)2Rrn$!)| zlUskao$TJfN;o@k#kB8MAMEd?ESO*WYX9}`+g`k^Tj2cZv-dr(45u%~!hYNyKRUiw zEa9$w_WM>uUv-4($FfBGZs%Q3>-&VG73=rjy7Tar*Sa<0QcL!HS=zJv$+YapC(QYt zZqq1#TD>qh(COFFq?_LkuDpDRFPwkIa`#v5S7$#rF@9P0sN>8oF~dJEKAo7gy8O|} zI{P-Kg-4CJzfFFz@>@vW`W7|SE7DSAK4b!TP#eD%xS0_0=_%GVAh*9ceqN&)DD=j@oVj?GAT-he}p=G;`a3 z`O&|O?}R1LzdMyzC+^~?Ka*K-$K&iQm)d^!ldtY4Mcq4ifC)Nyqlp;2(Pdy@ z;I&gdAoBnJ!ThN5tP4+BXz`IA=e4jQH z-(M&rA`h1*UByYUtuGU7N;d^)SUmr~c>03!rE_11q+T`1YRqzeDDsoX>Q9&Oo*6GEJZY6)y25I5 z&aWqP9aZ+ciQ`%n;(l+QRY%gL3>*8V_j+#)*uN*oxU3TYP!AiZ@bu- zZb`2CtnJaUpD(`OE?Z`~vvr>HCpk`gQ+ViH&iOE!Ab>u4P#qekX6ex#ep9>#sMW{?6Uo zD0}R8QFDvjnpOD+zCW(#I-#sTAt0Z-X3fo8mV1uJd2&0*pRJbIcp{C5)n>Km@&a~! zU;hm5UAqn$88F%eu4uT!$mO87!oeeNCL@D{{*=Ol%Y68}*G(&a+oY_>BF0}dP0VXk zz3Gl$KV}3wvK?OhEQR6Ki|IbrS8}!I>7`uDG}Buw|E*%X)S?cCwCOS~^~~q&RANt; zP5oclbdUXdsDIKsc8RqL*Z*92x$;0oRq-NExnzmz*fs0!sd2oHF|2Kj(4YQ)|1GP2 z?ce3^|GS0zTwW-h@1z=Fem4HA=qvxj>+|PCMzyU+ubb%_(m-%i@Ij>ul?`mUkpds>zzZ%|CiV@ub}Sv^CKzQF3V#KexZw z^nQQx#hWF!fA7EkrfJ0--+hTYIc8jRT`2u);g9dxvC~i9)tq@WsdK;9gnUmX|M1&8 zz5j>Qn=hO6_sv63)Bhd*i)OgTckW8Q9^>1}-+5{y^NWneV@^B`@-h#+4SaknrmkZD zpJc01>GZ5uWnS=J8z1)N%E6ms79LQt`rR@Dw3xr34`Pe!DQaDMbW7{6mr z?VjCVuFa2}Kl_4v@~(gXcj`*q*OPu^cTKnTfYr&%zv}+q+<2W`V!QWJ=Otgy?7bGh zz+LKAc6&7YCmHvQ%JYb&`(D4VC_yKC z=aUO(=2RY;(;M?WvAk&QJjXL1!tP5o@O`OGp0rfd@#s-~irIUqzFi)nzPD!F`gGCF(&S)~Md69%@*8ed zHD`S&aN)Wg{>AR{|AdqI?B(wkKHDr)@MA(=O~fXKd2%&<`MWO`F3XsI`m?*(EUEvM zQCO7aBAfF~&(EYxo#F9XwSK0n$svokN21&Jo13-y z$xl8%!!*6lnEsx%})J)j7@d_!HB=< zn{ppAY&oBOQtfi~e$6e;8&oT=^G8Yu98N#s5}05!>sJ5iJ0;gcm*oVXN&IuPZqd4k z4ec^Z-M-bV_ETRecItEY7uS?Uck3Nr_FJqp`N`&6{p8!at8B%7?5+N>%U_F4JGk_b z{ZEPOee1=)=W&bGS6$D1_J6C!jwQ<3mgj!0T-JT}o0~#S)!#STg=RssE(U*oy7P4Z zll9f2algMdUTF=m^||`>__K?jKA*T(A|tM#79tt5(>QGM#-IZq93Nk_+WYR_ zrCUA8;)j2E?)ZQDdc)tU+y;67TY55&slw}pgAe1@qu%MM;AyB&kKnQUz`|v+CySxsN}x023CkV3cZ>QkFa&r$ zT=+mZDpc2TN&c%P?_G2^d$cJ{KC$2Rf6PaY#ikY?ZtY*bMc~AYcQ=-v*8N^y`DuSY z%X41!%g&oGy%sC=DrKGWp)W0EHb+ER`CgV)ejAG`3r`vL*14zNH!|xvcJb+awFB~V z%<30cuj!d~^Gxi_zUkt@W~F+FS7yA-hQ^As&KDf(g9>*j6zZ2e zJhj2!N&U-BgT2bm@t>BhnIz4(W4)OspIGzNn|&vi6|Gv}cl3?zyyfYu#iH(}W&HoO zV%0U#*UcZId_ww9)z82CYsa#qFSi-&FIHo@ZfE=G_#c&?HCZ>`d@ByzQ7abR>$5#& zE&uQ7#WjgKE9`D-_Fez1a_)AOVTASn#liKztG@{Kul~L7^7MV@`JVl|z+RX5wDZQ! zb3r$gr@id4Xy0vdJbp#Ioc=pc>CM8g_J4osyXI%!>bZqou}ar;|1EKQTQBzEs^Cw< zSO5RDEeLq8^u=OD9#6SwyI1D<&sCFuz5hMy=hp$PW|0nuRyzJ7Iu~W1{e;u81ZR0zIl|gB0ilI3S|2*bg&Gw1D#1$o$!K3%b zEJ!7jRdW4@rYXh0d=0G5?sl~L@o8Rs{r-QSnN8$>NJ~6^nfZ1vTh*`Qi-k)P%Gud@ zHr`xYTJlTxN$bz_Y?oOL|2PgFcGfKl zKJ`cFm5f`j`k#X)_rDdj{BM$BX2^N-@yt5U8DE*730)AYv2Xqo_*87wVO|aqo%C*o z)rFn)h8#QbFEjTuL>b3Hc$KM*lq*;wJonGw< z)#9FPmJnl|xNd)Aa8UZXNgc;|&hsnre0;Ld%r5Tw=+uH$3*%q?JbO#L{`a-@ zYvgN6FWxNOcRYJ_0mIJE-yBaIU%P8sXny*NRsWwmp3K=lZ`~&kJ-KE3H+Wxe|Lg8Gt!|siE@d}$+uxAN`9B5v%Jo}MPrMvDaYFphclC*;+V{kM*UMcJHt*+_ z$^BsdH2dr|-JhRqjd$;<-@Bp0K=r0!@{Rv*8a3X2KNG}nJYQqet=Uf}J0D9+p0D;e z;9dLm@Y81=M{zGnF%|Nu4_~AEt#Y!=WyA8d58b+4(?8u$?=1Wnqy1r?pLSD-{=WVC z%5#jXUS-ZYzUlvB1&?il(`H|P{#f+)vDkP2eU@zUE!t>#Zr_vJp|4*4nU&L6KX1y{ zd%vu%hT1=gxF+5>hB))$f|^s-Pd2n zT8Hbb>#K+^TYr1Dq4l=n-0+V(o>%_M+PU7P-Z@)R;7q)8?~N*}t3SUn=D)SwYc`|y z&5P$<+wZJj{qI;>U2XT?u6eIMUJ04>+huc^&NcJ+`Cr%8moLB8TX1IA@5B2}ZmaZ( zSnhqt`Uf*pX_#H{eSQ(?i~F18{)MRDah|zzPtDEsy?f?Y2Ft1F#YN7!puDncV~54v z50QHg510?0xvDJG0&J>&fT+_V&k?XP$Zf z?dhMGzg6er*0W6i_v415;Gv&9Ve$&U<#HxW|0BF&u}aV6Jcfu%ccTrq-965bu=u0F z0yfhvADrVqU28NAyL_uBGaLv~voF8DC2Z0v zkNvwU+*d#AUM2H*x7XL053?e=^IynGAKZ3m?tOOY&CGLbHfJ$^tLT6Ge)IZ|mmV0j z2b`B&F#BnDk5vSde!%`~pAF6#oIi8ocD*L=fqSXPRUWjc9{+QHetlv8xej^n^q&I% zPkUdtioeR(t?B+f;=ZYWYuE%E0nIH11&0jja zFM5B`wH$_mzRbRpLO+_6Hw7Gbe6gd_<3rVk>lyCMX`9sqqYS0?OBt?qxpd~)o2x7K z`kTFY7QR*LNKfV4bGt&Gi&d*~>{7^h@UYJDChO~EjO(8r^o**Ww`;+%+LZyhk%sk| zik7?ca^?5BJ@WXuE^O_`xOHb&$K|U>Ts^z}K>G7_U1dC%uPxp$`tC>9zHiSP{ko6N z`24DF_qG0$Z?<07;B3G8|4n-}M|SG&TEp+})kVUhw~31RT~)mwI&YEQ&zp0XvzvZ7 z|NNbQb@XxXb+SmvMp5bwJ$rBB#eJ1^f~^WOS~5T;-2R?WD+^XM^~MRQte zkE|8%GP8VRaP4FLB(Y291q0%XPr98hZCHEKC-ml(KNm!HJ+#;^U|(@>%jG|xrXHSm zfDLwfjU!@AMvsAk!Mu(kN%;T&-;hN#&;S45{{R20|NmdyvzW6pyGQ&j)71@;HYcN9 zbl(aY99He#yKnaYeRZE_>PqmQUh#SF{+^clKO8;T$ESZwdz+@Kws@o4%=32M?Yy=& zjtm>W*=K(fPWF3iCi~!q`MG@^B4Pi}OuU;VulKTI_YG;e$#ppl8;WZB&j{AKzSGU~ zJ+O>fZ1%+j-aTwBO$#~2rko0K5Uzin_+fq1_e9B)@}e8qIL|X!|6oX9Xqei~ZNkJM ztH8_PP|xzfX#xYovQo!}UgpogZzSH0-Znd#^APK_9r^!?e=W~3{`=(Fj?|`I+2+B8 z^DAq%+6f)t5v~0h`~Llc3-d1SjLLlYS^3hd{8_mM3zpbiQ@+i%E$n1SVBOJQ0pIy} zzrA{M$aVF_c4meg-)b*Q6Q_*+hw7#A;rIVfUH36Vi6`()y|lsVsV_TYV=wW$b57u1 zZo{vZc}?Ka-gAVyqNH;*;7Pm|dtH1ED&K~0W!Ba^F_*S+w4807jo^PVkZ{B{*1oqvZe z9EyF@BlLlfXZ@EC$>Fw_v*z#O-oN{Qp2~-NL7PGg_XK`kniciKeu<6lip2Ve)MXR@ zd#&j_{Nd)$D|7hQ#3$zR&pDG65`SSjnM#c= z3kVmrRm)!2Vf8oY^PMS^>z;h{l3ndxTKTn9&SU-y!~gPLJM+FNlm_RN`#NonJ@>e0 zkJr|?e|zt*IQ;pxex+^f%9&e~*Khry^}GH}t?^uuqjINypZ4@Tt+wGGONB#OGIy)wT1H2=lip7|6Y~s;=A^E zrFT};Pi`g&XNDCFahZ2cR&Vh=q{M#hLdBd-+qcY`;(d@|pTn+ym+b%jp8YbT)Qx|d z%trb7|Lec_{CH*i;O+hM5*N3hJ+gk|xvzKnt}K>O_)*M< zwI&T)Hu9bQ`(F3op0*65;_L;xzjJPRBpDO=Z0qaW%d=~u(%vw-!F)4RW(M`$LPg^+(KZM(#dBSY5at-f~-S3{h>b-5{x4d_6VOYk+?RPR| z7+!DN_h1RvRP|r;w%@u`T3=uGf6X5~UiNwV^;>4no0xsT`*zmN{^?U!|6cy^Z*0(> z;~Q`PxgQm}xU8cqoax%9nET(nt5l4wueQnGy|l~z>zQ|w_J6n~yDrRG@t`!{S1WG? zzt6c>_kX`}6s(QdfBW>CY3ox9zkK=Ozgai$^XhMc=bz}e37(8xS^O#A_}+=RwR`I~ zK2D97`4?yYbLIN!)ACc#`x@oy*`7N8JpXs%(*-H(%l_2qZ^)>-UoTM=bf)&^EY+8k3oykcWQ%&GH<>bZTBn;+PJ50$z%>qDkc z+N=M)m%gkj&b<4^_vieHHYtZUAKO>_yFP8wRJMy+leAWv+?YB$_?2nO^@=w}{(oJMiZ=h5HGAQ3P-lMOXG--?M(*HNz^?>AOxPPc1$Xn7aQ<+`UfoXWh3S{F~|aa@y|G ztGc597*1~W!fCHZCVSRH;(1H`PPGK< zli}I<4@>pVNzFRSn>35}kKg@dhOPz6)a$d(NH0D4FQPKibIVM{L;EKFHd~NTwR+Kq zOUauUjZGE@eLgByCVVTRho{HVs?0X|=BA$wUQ#BpOzE!k{#CZPf8QIQ{_N1Te_vnt z7Wda@&9F|q_oZv9?(*MVw|A{yJlp(h$lhCDB2Q195hx(^d27}C_XY-A=BD-r+&sSc zNwmnT!0K0Reh=#3XQF;A!`#g1dU8S89Qtzkc6?Fesp1VN*QKI+Rf9tJQom$&G z$?&V_kyqOe%evkB_hqZe%$7$#4qkie?p~%hW#V7%$p6muYIDzZGH=x0yK93Mi`bF` zzMSM!x90o5d~N&c*xlRPzASw!x%bkw){D*8i!5cfYn+vK{azo}?Y=|fW89y~Wq#d9 z^=i%5<<|cM&0hUwwXAu?{P|Mbo!NeE+o4qG6!LLL;lj`Bp1g4R`Do?)h4r%+*IxT* z8rZyO_3@^iFE_3@UUMzqJb3M6+p6FXy)T`(L^K+u!n@cF3#dKNqg*PGe5}X8kx)I_c}V zk6&J$>dTmS=JCmz55I~;{NI~$3Occ}&g;B$D0-59uA-on)%5ZbZ?$QajY<`apVoaX zx^C$*b4maID^=xx^4&K)Qh4$8n#tYcnj5U@&o7?s^Xrw+kB^o7H*%AoN9l&xuC|}2 zut;>R`R_G$ZasVU_HMX#zxuzS{I6SYV-{3%hx@QHarh`6WSPOu(8b8%C^PZOkV2>-}^jSxopV^X^Eo9zk541!tdBkF5CBL zThnsRl%w^g+{a`18f?uM{Au1A<$qMe34fh7UPYm{)$QY6RW}jG1zFvH8 zprYGWwdDW4bJq8*zh3iM@Zc}09ex+5*>90b+Iajz%EU+eokO-<6UcZ z_p;IXL;P&_yrZOD|ECMp3vFLqHgTT&0YAO?M;`Bf?p5m5H{wxnD|I~K!sQaje9H5~ z^t!rDe?3#r?JfOX^VIig_xD?$AA}3s%bR)G^#0oTmX5ne%->!No$lGRkf+O;S$&TG z)3wJx>)D#TNt(s2*xMNxoglH-u14h#|Gjo@&XcZBWnY`mUpz1W-6=ua=M(Ga-~%f;Wb`|veRYYLK& zNSNE&z5L*+JT2#*kn=i^liODATBC7H;Va84(|OFkGg<4mm;W@Iel;jzOHB{&ONlk% zXa8Hgc=!9^uW76Xu>uSG4Q1Ed7Ww$EaQ*N3_jHRF6juC+cUJtrbzK|7y5PH4Ht>Dd zZMzy3>ihWG!jd^}E4H0;6fONJ*!};lyw~4VlFR+L{#DqY{h6-y^LuQM^xKEwM<#Qy z@(L}SIsazh*RU0F>(AAvnyJbZKNZto)fjJgtkUhlVVRU?-hAJGF<&%nJDB{&wENJM z{PAfws-?!Ls_?2y_C~89PHo58Q)8|J#}Za`OVIPlzNrk{mWmw)xWB_enaQx z@?xG=jmXIMwfmlVJy6;H?a@JwN9WA~xFk)VU77i>b%Er8znwcd=4Z0KJ{5F{`|tbo zACEtkEdNnH@4cDDp4z3Ax!=P%w)@>G-m9|7*frux>f!odsX;xzkIrV|dZ1CbR`ug; zgY!oD|D*4HbDeJ7Vt%<;tYZGcnAE_&`nv1$>t3|jekR+#yOV2Q#+xU`%XBjZ zg|p4;drwT=eeB95J4eoY4W@DXGP)BFI#v9vv#x#qzncB`V}Hi4{rTJTZ003zo>ct% zZ}ytG$1fOef5*;!>&?~cJ3p`PopG41^R$d^`^bZq*QUl)wMlOd>Z$LAx2ANCy>+ii0pD+7Mxvo}j|B7|``eM=(ETt0} zC7)Z)J@RhD<&4!*noUhnuUkJ01nA@%ze&69JHu#|$~VKMEPwC(O;cLAl-W9BLxM%h z`nR9sm%XS^^nYgBU#}&XalfZzy>!s2sa5GK1LwbuyzaXV;GKy21lz>MvgCl}>ZZ zfA{UhQ?-iJ>Hf>+N?v;M?SId{fLOz~vr_GLvVQ(qdve}NYh&I^tn19@PdAC0tG@Qd zf`I8UF&i!}ZTvaIrY3sY7uAfgADz0tRF!5OJan07b#7_+*ZUS8AyU%S>={@2@5Id) zb9?%3uHluk`vTF9pI3fk-+FREN4;)u{VMZSd4jbKD^m|Y-oLlNF-!Z;-B6S1>1#dW zCTIvruj~8q=Izs>!&ZO2uAksjt-U)tzjSHgPyXsD@1O8TtMA^J_jh9GW9^moGe28R z`4TJqr1`9COlYF#UzP>&_Ro1Q&vDtYV)pr&b`vJgn{@T;*SEd(F7d*F^NKQyQvY5M zW_fH}|8t|A$vb=FT;nI%dD6TJHhX5NeLKBx(~6(pFUYobUU(JtiqEmjXQ@|c@LTH> zL6uIn`IFkdrh3)O9{kkV_Tx;}rxh~u?tfNae?0F)>CcaWiq(J8dW$t49o@WL>7jT4 zY#&r4V%SEXfq`MOD7S;~|No!<|F8cHzBKAT^Z)b4mwT53~|Jw9{S z_zS01&O=s<=#MeqOy0%bm}C1te)skJ|31&Vpe)^S&0^h*7wNu}wf~-eAJ)R#Q5(Zh zd+CWqf4RF+|Ie%Ge>WZYxb}&5V+_~mp?Ymw*cBy&%Cym5UI};^7rVxy~}xF_qB*vhdYZ|=XEyxz0;QZf$u;x)8_eH4O+SnPUe{Y zsycScPP&a<;01#&LvP#D%Z?A3&Yuk4(8R*P(4=%}J4c#q@Q#n0D%Cya{z$$fanF}) z+k-P}F6%EW+M}nN$ROFzy0w!r!)>?Z>Gyg~Ce!Obe2xpBwrPnCOH=ie!{>Qr7|K*T zzNWGm95!waeL4H&X`ZLq+qXTHy!NiQOQz!X`A3-*<-b?)z5Mv{+C83dv%SaH&F6DI zx4(7A)@zk@aasxAFMaxF_~~d$;*pDWHw0Um;=Z^a{-vS5Ic{CqBug1xxpyBg9j?<@ zwj)CDNA2FNw;1bJ?5n<-o2(c!sXhNxe6H&MaCiMM{eOb`-J&Hk{OfAw^gDk^Dq832 z!KdQ1^jCR=*ug%IYF}aXX7-nJg;Rf<_IcgZyXe8T;K};?_5D+MewFy_E&ckz!2G}Y z{EZ?~Y+wIGtvj~;&V}#ud8Xgv_Fcbh&l16Imb9iPWt%E9O4l!bUB9A!jl9I6U-P#| zy?s;P{H*uI?E3WjkeX7L@T_Rx)@SZJ_Ge3NeE;ds`R(4K5l3Iyf+G&f1e(`ba{D{-IU5-k~^QT zv@fp75B(K$HRkW`96^@7#;wQp*S`&YwQypa+m??yd`tdaUBBI{{bMh;t?%nYdey&H z+RbyHAQayHMt0{fr>aw3I{I6$K4+Ca{aJ0@y1sXYukNI9toi?E$?M~bzg_r||9;w& z!<8FWx+yOR}uV3kl_pkc?<-Px!olk5<@9d16yzbsNe{xkqrj#I$crq8>Var<5hnMlkMhd9cy$!TP>^<&}ND?GJ_v*Np0=8h{&_2JI<5A01}$E)~Fwdyd}QTD}! z`!3zs`Qhzd#c30-?PV7*liFy%Ht_`8ZMOxtr9>_)Sis4;fZ42sfnRS13xh%Jy^FIY zS1rB#ckZfG{#3siH!rKL6D#(bC>xrQ%~}_nBQD)$u}w>;^Sdm=IhR7=_WW1OnVSNv zAMgEsNksonGg*{^3`Uf!Uq^^LD=2 z|5Ltt+Lhkdf9sj+MT+Da)xwoxV*b54I?-30uX)jd#?r}qny03&E1R_S+S6GbDbu#L zUKiiLV*9NrCf|3*Z~SmlWX194DW{JekZ!zn_q3B%w)KyPbC-h0jMeOl3v|MNdj5#RLZ{f8Gv+ut#spLFQ1^YtiU zvHx$3{lbgtpL`M3sEeH6b?;f~H~x2?wfjG4%#QHv;>hbUPFL#tz9U7a{^ZH9)y)yt z>l6P+HHy^zuUpD)y|<)#>cpe#zb;9`Btw+V%|g)O@T^Q?Z~JH~X2 zKYZ!lnEwGcWztyFtT<|GZ|=G$`L^KR^H`JHzmk^EGyXlJ@2x#^&E;(Q?|+Y<=IK42 zegA!ZkzSRG*%sH&$@0gvJ664zQ2VxH*Y%Sz4G*{e|99kS(fUVK=I+=0&droQ)l~Ca zD1CAEk2s@c)Ax8eg+ASLE!W6>noaReiJm#NtM<@|GUpWnzDcA2&*tTg{u6nE&Tgh+xY!#|6dsoC|PqRx3OeB`B6_$Xg;m8Yym z)Ab8RsjN2|VP2~37 zCO`jqx$1@4e`_DD5&gS+_WokNi(d_|$;cO$yUL$eclpoIFZ)=T?b@z461)|+zBQ*a zC-v-qYH-`zm}UCS#(G(Yg$G+2nJmpidcyq~&atJ%FeEI-#6@!@g#`@c);CByua-S3~} z=AN;C;|BKVq#e6GT9oJgSiE`CjfYjWHdj-)PhP3oWHT)?-B$r>>bD6|CB9?xnL78TpBiiWe)kRYEDc7GqaWe@yQxxTY`_c4rsjB~{dS|g}=Xlg6HFPb0T)lSZ{^t{fYrZ_r_;#jI|L_( zsLRyH%#4_vwcA*!X05@3pa0^gscRWKJ!x4Iw5|Hp#u|Uw>$7cQU9$tv-Cr8{-1z$R zsq=nW-1}#}=S6xi}=gd|uD*Rxq#ROda22J(-R9%hzpREEY8@IrRL~rQ4hPpJ%<* zH$CAW*{X7TWzr+5GVj}|%rQBjg)@TRRr0@ac?D?N98lhpX5*k+li>6I{i%o7OV>-z zzwkM=_V_RPxCQbo^=F@M|IMd;L`nC5h2jL}f+&UW9B7&h^O^|02HlJhLl0(`lNSl+wJGk>EA}I$dkwO8iPrXWJvkKeazdD#18+B<0RwY=7;}U_Z^P~c zA%+DnTqN&T{`8sltZlc5)#qPbJGG4cEZ3Eq?wRt*?7)icMJuW@+5Y%ExTUV1ANz&H zt$BakL*=JRmQIo9mgKE+`L1}9L9cSF<~4%@bK2`}e-@2**}vQLQKqlix{mJfnTeNc z{}r#Fc5b^>dcM;4lUGtTx??v^sI5P}ep$`kw*n`>>o+fdfAGg^Zt3Fl1uq>FAAVsz z)PLpM&+A{NPycHb7Xx166?B$2pyeVmo;`VRtc!Yr@v-E1eR{k~bK zjc;3>_GhNg73(|mZMGY{xIcUAtu?U`GmahKbiCZf%>I7T&WV}7XFWZ7@WzRz2pfU> z`7`P>vSkn=t=KE^#LL-2msV%){1l<%dN?n)*yKoY$=|o@pZnfAwk^D}-qJeV zWZkKfsUdBXyo#ivM=VTq47gMiU=Mx%iJJHBM{7J4zu;KR4 zlUg31T7K6%P~vr&f0>fxi9c@H0;N)?m22mIN_rt@cej{p_O=z}&$^cCum4d0{Q952 zt#WhTC;hM4U3Ky1>3O%S?6ZIWQ`*9J?Au(;+ke;k-s+V5Ja39mOx>r0U)NnXb~^QK z&vVV>PmfowKGL<<$F)9x*L?q=-(Bf8Y0{D0+olVCZ!r(B4buO2S9rXr0aixZ3M|9t(P;A?$i z$K7e6bB;?SeO{xy{K>_}MbkOkP2X(Y7yrFqAba!8_YHh~2Rb+Ky|;~;KK0Viugag@ z(-!l0T$4ZFWm}h~w{2~@b{ba}r(IMIuiL$2Ojf$A66;^T+i*j8J)d2hej|hRv^&$M z#Oqq4cQ-cBp9qhu_*cS3NWZ&NZ*Rl7eve_9^%VJOVjX!NB2PUjPVLg$D z;X3O^$uRHhr=0D}o*y_^yy8r2rULIIh6SRpZ+v(&$@sOpWwxY-joJAr;q~Wt-)+{Y zU#xIFEUs&N)X5D}@z#IdyJkOrp|d`B^{hXOv;VJMe8zF3{Te;@sV;%rq{I45Uc7!G zVV&ZgHF=@#GxnO>iLSB_Zcc07b~fFx{0T?VJ?DjYOnOt5kK1ML|7!oN=&8x~NeyC& z%i9j7^kd=bQd&+KaTF6YW!3wh;q`{?8E=f9N(cC{tm(&D{y_i^0D z=;zFyTA_zMcgV=urGaSUk^mg z_m7WgPwmg%7S{b?)|cOzNi7DAVN8p~KVIQ=s*j(p{hs^4B3FjWz4xuwxGm-}U|z(S z&|H=u$7^Z+Fir1N(_KA?j#0=6>(E_OggShCOtDotTw1i;Iae{TeFp!3OPQuR(^?KTm)(bUDE;E8{Kxn2@Vw>R zZ$q!S`-Yzhobo^OyX`6~{l6lnJgNEn+?P5kysj5MoH)^K%buI+*V6ipy6f(LJ-t{d zUhRd^lZEH><+i+=U+14IE7rXz3lZFkJcQ0QgcJHar;@1(ElAT z`ul|MV(;se=b`x`r+{Y z)~DL^noHAdUDYo7)TP)hG5z5@_2~Hn>+AD5*D
|EZGU(Vn)&iJ8)Oj+dX;vWeEP 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%0A>*XCYufAH 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 From 957dc278e8498e7c7c617bf1ed3a3d1966e858a4 Mon Sep 17 00:00:00 2001 From: Son Phan Trung Date: Wed, 5 Feb 2025 02:13:50 +0700 Subject: [PATCH 148/460] change the link of the Bug Report button (About) (#10268) --- core/src/mindustry/ui/Links.java | 33 ++------------------------------ 1 file changed, 2 insertions(+), 31 deletions(-) diff --git a/core/src/mindustry/ui/Links.java b/core/src/mindustry/ui/Links.java index b3c756ba32..e614c24b1c 100644 --- a/core/src/mindustry/ui/Links.java +++ b/core/src/mindustry/ui/Links.java @@ -26,7 +26,7 @@ public class Links{ new LinkEntry("f-droid", "https://f-droid.org/packages/io.anuke.mindustry/", Icon.android, Color.valueOf("026aa7")), new LinkEntry("github", "https://github.com/Anuken/Mindustry/", Icon.github, Color.valueOf("24292e")), new LinkEntry("dev-builds", "https://github.com/Anuken/MindustryBuilds", Icon.githubSquare, Color.valueOf("fafbfc")), - new LinkEntry("bug", report(), Icon.wrench, Color.valueOf("cbd97f")) + new LinkEntry("bug", "https://github.com/Anuken/Mindustry/issues/new?assignees=&labels=bug&projects=&template=bug_report.yml", Icon.wrench, Color.valueOf("cbd97f")) }; } @@ -52,33 +52,4 @@ public class Links{ this.title = Core.bundle.get("link." + name + ".title", Strings.capitalize(name.replace("-", " "))); } } - - private static String report(){ - return "https://github.com/Anuken/Mindustry/issues/new?assignees=&labels=bug&body=" + - Strings.encode(Strings.format( - """ - **Platform**: `@` - - **Build**: `@` - - **Issue**: *Explain your issue in detail.* - - **Steps to reproduce**: *How you happened across the issue, and what exactly you did to make the bug happen.* - - **Link(s) to mod(s) used**: `@` - - **Save file**: *The (zipped) save file you were playing on when the bug happened. THIS IS REQUIRED FOR ANY ISSUE HAPPENING IN-GAME, REGARDLESS OF WHETHER YOU THINK IT HAPPENS EVERYWHERE. DO NOT DELETE OR OMIT THIS LINE UNLESS YOU ARE SURE THAT THE ISSUE DOES NOT HAPPEN IN-GAME.* - - **Crash report**: *The contents of relevant crash report files. REQUIRED if you are reporting a crash.* - - --- - - *Place an X (no spaces) between the brackets to confirm that you have read the line below.* - - [ ] **I have updated to the latest release (https://github.com/Anuken/Mindustry/releases) to make sure my issue has not been fixed.** - - [ ] **I have searched the closed and open issues to make sure that this problem has not already been reported.** - """, - OS.isAndroid ? "Android " + Core.app.getVersion() : (OS.osName + " x" + OS.osArchBits), - Version.combined(), - Vars.mods.list().any() ? Vars.mods.list().select(LoadedMod::enabled).map(l -> l.meta.author + "/" + l.name + ":" + l.meta.version) : "none")); - } -} \ No newline at end of file +} From 37d0ba65e0cc07c06e38839181b40da8b24884ea Mon Sep 17 00:00:00 2001 From: Anuken Date: Tue, 4 Feb 2025 14:17:40 -0500 Subject: [PATCH 149/460] Closes #8467 --- core/assets/bundles/bundle.properties | 1 + core/src/mindustry/core/Renderer.java | 3 ++- core/src/mindustry/type/UnitType.java | 1 + core/src/mindustry/ui/dialogs/JoinDialog.java | 2 +- core/src/mindustry/ui/dialogs/SettingsMenuDialog.java | 1 + 5 files changed, 6 insertions(+), 2 deletions(-) diff --git a/core/assets/bundles/bundle.properties b/core/assets/bundles/bundle.properties index 6bd6affbf8..2fbea52ab0 100644 --- a/core/assets/bundles/bundle.properties +++ b/core/assets/bundles/bundle.properties @@ -1246,6 +1246,7 @@ setting.steampublichost.name = Public Game Visibility setting.playerlimit.name = Player Limit setting.chatopacity.name = Chat Opacity setting.lasersopacity.name = Power Laser Opacity +setting.unitlaseropacity.name = Unit Mining Beam Opacity setting.bridgeopacity.name = Bridge Opacity setting.playerchat.name = Display Player Bubble Chat setting.showweather.name = Show Weather Graphics diff --git a/core/src/mindustry/core/Renderer.java b/core/src/mindustry/core/Renderer.java index 47acb4c454..00fb77bfaf 100644 --- a/core/src/mindustry/core/Renderer.java +++ b/core/src/mindustry/core/Renderer.java @@ -27,7 +27,7 @@ import static mindustry.Vars.*; public class Renderer implements ApplicationListener{ /** These are global variables, for headless access. Cached. */ - public static float laserOpacity = 0.5f, bridgeOpacity = 0.75f; + public static float laserOpacity = 0.5f, unitLaserOpacity = 1f, bridgeOpacity = 0.75f; public final BlockRenderer blocks = new BlockRenderer(); public final FogRenderer fog = new FogRenderer(); @@ -158,6 +158,7 @@ public class Renderer implements ApplicationListener{ float dest = Mathf.clamp(Mathf.round(baseTarget, 0.5f), minScale(), maxScale()); camerascale = Mathf.lerpDelta(camerascale, dest, 0.1f); if(Mathf.equal(camerascale, dest, 0.001f)) camerascale = dest; + unitLaserOpacity = settings.getInt("unitlaseropacity") / 100f; laserOpacity = settings.getInt("lasersopacity") / 100f; bridgeOpacity = settings.getInt("bridgeopacity") / 100f; animateShields = settings.getBool("animatedshields"); diff --git a/core/src/mindustry/type/UnitType.java b/core/src/mindustry/type/UnitType.java index 5ddbbe7763..ba68ea5b30 100644 --- a/core/src/mindustry/type/UnitType.java +++ b/core/src/mindustry/type/UnitType.java @@ -1348,6 +1348,7 @@ public class UnitType extends UnlockableContent implements Senseable{ Draw.color(Color.lightGray, Color.white, 1f - flashScl + Mathf.absin(Time.time, 0.5f, flashScl)); + Draw.alpha(Renderer.unitLaserOpacity); Drawf.laser(mineLaserRegion, mineLaserEndRegion, px, py, ex, ey, 0.75f); if(unit.isLocal()){ diff --git a/core/src/mindustry/ui/dialogs/JoinDialog.java b/core/src/mindustry/ui/dialogs/JoinDialog.java index f6e4191c7b..cd9a8ead09 100644 --- a/core/src/mindustry/ui/dialogs/JoinDialog.java +++ b/core/src/mindustry/ui/dialogs/JoinDialog.java @@ -667,7 +667,7 @@ public class JoinDialog extends BaseDialog{ Core.app.post(() -> { servers.sort(s -> s.name == null ? Integer.MAX_VALUE : s.name.hashCode()); defaultServers.addAll(servers); - Log.info("Fetched @ community servers.", defaultServers.size); + Log.info("Fetched @ community servers.", defaultServers.sum(s -> s.addresses.length)); }); }); } diff --git a/core/src/mindustry/ui/dialogs/SettingsMenuDialog.java b/core/src/mindustry/ui/dialogs/SettingsMenuDialog.java index 01f7c05a53..87e3ad7f61 100644 --- a/core/src/mindustry/ui/dialogs/SettingsMenuDialog.java +++ b/core/src/mindustry/ui/dialogs/SettingsMenuDialog.java @@ -390,6 +390,7 @@ public class SettingsMenuDialog extends BaseDialog{ } return s + "%"; }); + graphics.sliderPref("unitlaseropacity", 100, 0, 100, 5, s -> s + "%"); graphics.sliderPref("bridgeopacity", 100, 0, 100, 5, s -> s + "%"); if(!mobile){ From f3a0daef8c93d5c39bf93ba20034f85573c147da Mon Sep 17 00:00:00 2001 From: Github Actions Date: Tue, 4 Feb 2025 19:18:40 +0000 Subject: [PATCH 150/460] Automatic bundle update --- core/assets/bundles/bundle_be.properties | 1 + core/assets/bundles/bundle_bg.properties | 1 + core/assets/bundles/bundle_ca.properties | 1 + core/assets/bundles/bundle_cs.properties | 1 + core/assets/bundles/bundle_da.properties | 1 + core/assets/bundles/bundle_de.properties | 1 + core/assets/bundles/bundle_es.properties | 1 + core/assets/bundles/bundle_et.properties | 1 + core/assets/bundles/bundle_eu.properties | 1 + core/assets/bundles/bundle_fi.properties | 1 + core/assets/bundles/bundle_fil.properties | 1 + core/assets/bundles/bundle_fr.properties | 1 + core/assets/bundles/bundle_hu.properties | 1 + core/assets/bundles/bundle_id_ID.properties | 1 + core/assets/bundles/bundle_it.properties | 1 + core/assets/bundles/bundle_ja.properties | 1 + core/assets/bundles/bundle_ko.properties | 1 + core/assets/bundles/bundle_lt.properties | 1 + core/assets/bundles/bundle_nl.properties | 1 + core/assets/bundles/bundle_nl_BE.properties | 1 + core/assets/bundles/bundle_pl.properties | 1 + core/assets/bundles/bundle_pt_BR.properties | 1 + core/assets/bundles/bundle_pt_PT.properties | 1 + core/assets/bundles/bundle_ro.properties | 1 + core/assets/bundles/bundle_ru.properties | 1 + core/assets/bundles/bundle_sr.properties | 1 + core/assets/bundles/bundle_sv.properties | 1 + core/assets/bundles/bundle_th.properties | 1 + core/assets/bundles/bundle_tk.properties | 1 + core/assets/bundles/bundle_tr.properties | 1 + core/assets/bundles/bundle_uk_UA.properties | 1 + core/assets/bundles/bundle_vi.properties | 1 + core/assets/bundles/bundle_zh_CN.properties | 1 + core/assets/bundles/bundle_zh_TW.properties | 1 + 34 files changed, 34 insertions(+) diff --git a/core/assets/bundles/bundle_be.properties b/core/assets/bundles/bundle_be.properties index 39947d3a81..8391022138 100644 --- a/core/assets/bundles/bundle_be.properties +++ b/core/assets/bundles/bundle_be.properties @@ -1216,6 +1216,7 @@ setting.steampublichost.name = Public Game Visibility setting.playerlimit.name = Абмежаванне гульцоў setting.chatopacity.name = Непразрыстасць чата setting.lasersopacity.name = Непразрыстасць лазераў энергазабеспячэння +setting.unitlaseropacity.name = Unit Mining Beam Opacity setting.bridgeopacity.name = Непразрыстасць мастоў setting.playerchat.name = Адлюстроўваць аблокі чата над гульцамі setting.showweather.name = Паказаць Анімацыю Надвор'я diff --git a/core/assets/bundles/bundle_bg.properties b/core/assets/bundles/bundle_bg.properties index 9b50a945c7..c78308d9ed 100644 --- a/core/assets/bundles/bundle_bg.properties +++ b/core/assets/bundles/bundle_bg.properties @@ -1227,6 +1227,7 @@ setting.steampublichost.name = Public Game Visibility setting.playerlimit.name = Лимит на Играчи setting.chatopacity.name = Плътност на Чата setting.lasersopacity.name = Плътност на Енергийните Лазери +setting.unitlaseropacity.name = Unit Mining Beam Opacity setting.bridgeopacity.name = Плътност на Мостовете setting.playerchat.name = Показвай Мехурчета с Чат setting.showweather.name = Показвай Графики за Климата diff --git a/core/assets/bundles/bundle_ca.properties b/core/assets/bundles/bundle_ca.properties index 5edfea4674..1a7ac3601f 100644 --- a/core/assets/bundles/bundle_ca.properties +++ b/core/assets/bundles/bundle_ca.properties @@ -1230,6 +1230,7 @@ setting.steampublichost.name = Visibilitat de la partida pública setting.playerlimit.name = Límit de jugadors setting.chatopacity.name = Opacitat del xat setting.lasersopacity.name = Opacitat dels làsers d’energia +setting.unitlaseropacity.name = Unit Mining Beam Opacity setting.bridgeopacity.name = Opacitat de cintes i canonades subterrànies setting.playerchat.name = Mostra el xat bombolla de jugadors setting.showweather.name = Mostra l’estat meteorològic diff --git a/core/assets/bundles/bundle_cs.properties b/core/assets/bundles/bundle_cs.properties index 0afb11cde3..62d8684be3 100644 --- a/core/assets/bundles/bundle_cs.properties +++ b/core/assets/bundles/bundle_cs.properties @@ -1229,6 +1229,7 @@ setting.steampublichost.name = Public Game Visibility setting.playerlimit.name = Nejvyšší počet hráčů setting.chatopacity.name = Průsvitnost kanálu zpráv setting.lasersopacity.name = Průsvitnost energetického laseru +setting.unitlaseropacity.name = Unit Mining Beam Opacity setting.bridgeopacity.name = Průsvitnost přemostění setting.playerchat.name = Zobrazit bublinu se zprávami hráče setting.showweather.name = Zobrazit Grafiku Počasí diff --git a/core/assets/bundles/bundle_da.properties b/core/assets/bundles/bundle_da.properties index 44198c2d57..96efe6520c 100644 --- a/core/assets/bundles/bundle_da.properties +++ b/core/assets/bundles/bundle_da.properties @@ -1218,6 +1218,7 @@ setting.steampublichost.name = Public Game Visibility setting.playerlimit.name = Spiller-grænse setting.chatopacity.name = Chat-gennemsigtighed setting.lasersopacity.name = Strøm-laser-gennemsigtighed +setting.unitlaseropacity.name = Unit Mining Beam Opacity setting.bridgeopacity.name = Bro-gennemsigtighed setting.playerchat.name = Vis spillers bobbel-chat setting.showweather.name = Show Weather Graphics diff --git a/core/assets/bundles/bundle_de.properties b/core/assets/bundles/bundle_de.properties index 45bfdc2470..f3b953a5fc 100644 --- a/core/assets/bundles/bundle_de.properties +++ b/core/assets/bundles/bundle_de.properties @@ -1240,6 +1240,7 @@ setting.steampublichost.name = Public Game Visibility setting.playerlimit.name = Spielerbegrenzung setting.chatopacity.name = Chat-Deckkraft setting.lasersopacity.name = Power-Laser-Deckkraft +setting.unitlaseropacity.name = Unit Mining Beam Opacity setting.bridgeopacity.name = Brücken-Deckkraft setting.playerchat.name = Chat im Spiel anzeigen setting.showweather.name = Wetter anzeigen diff --git a/core/assets/bundles/bundle_es.properties b/core/assets/bundles/bundle_es.properties index bde17ade87..bce716f0b4 100644 --- a/core/assets/bundles/bundle_es.properties +++ b/core/assets/bundles/bundle_es.properties @@ -1236,6 +1236,7 @@ setting.steampublichost.name = Public Game Visibility setting.playerlimit.name = Limite de jugadores setting.chatopacity.name = Opacidad del chat setting.lasersopacity.name = Opacidad de láseres energía +setting.unitlaseropacity.name = Unit Mining Beam Opacity setting.bridgeopacity.name = Opacidad de puentes setting.playerchat.name = Mostrar chat de burbuja de jugadores setting.showweather.name = Efectos visuales climáticos diff --git a/core/assets/bundles/bundle_et.properties b/core/assets/bundles/bundle_et.properties index 9d00068faa..b081b166f8 100644 --- a/core/assets/bundles/bundle_et.properties +++ b/core/assets/bundles/bundle_et.properties @@ -1218,6 +1218,7 @@ setting.steampublichost.name = Public Game Visibility setting.playerlimit.name = Player Limit setting.chatopacity.name = Vestlusakna läbipaistmatus setting.lasersopacity.name = Power Laser Opacity +setting.unitlaseropacity.name = Unit Mining Beam Opacity setting.bridgeopacity.name = Bridge Opacity setting.playerchat.name = Näita mängusisest vestlusakent setting.showweather.name = Show Weather Graphics diff --git a/core/assets/bundles/bundle_eu.properties b/core/assets/bundles/bundle_eu.properties index 3d1e427a1b..25308df198 100644 --- a/core/assets/bundles/bundle_eu.properties +++ b/core/assets/bundles/bundle_eu.properties @@ -1220,6 +1220,7 @@ setting.steampublichost.name = Public Game Visibility setting.playerlimit.name = Player Limit setting.chatopacity.name = Txataren opakotasuna setting.lasersopacity.name = Energia laserraren opakutasuna +setting.unitlaseropacity.name = Unit Mining Beam Opacity setting.bridgeopacity.name = Bridge Opacity setting.playerchat.name = Erakutsi jolas barneko txata setting.showweather.name = Show Weather Graphics diff --git a/core/assets/bundles/bundle_fi.properties b/core/assets/bundles/bundle_fi.properties index 065e745a04..1d5dbd0e6e 100644 --- a/core/assets/bundles/bundle_fi.properties +++ b/core/assets/bundles/bundle_fi.properties @@ -1217,6 +1217,7 @@ setting.steampublichost.name = Public Game Visibility setting.playerlimit.name = Pelaajaraja setting.chatopacity.name = Keskustelun läpinäkymättömyys setting.lasersopacity.name = Energia laserin läpinäkymättömyys +setting.unitlaseropacity.name = Unit Mining Beam Opacity setting.bridgeopacity.name = Siltojen läpinäkyvyys setting.playerchat.name = Näytä pelinsisäinen keskustelu setting.showweather.name = Näytä säägrafiikat diff --git a/core/assets/bundles/bundle_fil.properties b/core/assets/bundles/bundle_fil.properties index ed42b0de67..b69c12f5b4 100644 --- a/core/assets/bundles/bundle_fil.properties +++ b/core/assets/bundles/bundle_fil.properties @@ -1217,6 +1217,7 @@ setting.steampublichost.name = Public Game Visibility setting.playerlimit.name = Player Limit setting.chatopacity.name = Chat Opacity setting.lasersopacity.name = Power Laser Opacity +setting.unitlaseropacity.name = Unit Mining Beam Opacity setting.bridgeopacity.name = Bridge Opacity setting.playerchat.name = Ipakita Player Bubble Chat setting.showweather.name = Show Weather Graphics diff --git a/core/assets/bundles/bundle_fr.properties b/core/assets/bundles/bundle_fr.properties index 9ef61069b8..b8e6a3d4fe 100644 --- a/core/assets/bundles/bundle_fr.properties +++ b/core/assets/bundles/bundle_fr.properties @@ -1242,6 +1242,7 @@ setting.steampublichost.name = Public Game Visibility setting.playerlimit.name = Limite de Joueurs setting.chatopacity.name = Opacité du Chat setting.lasersopacity.name = Opacité des Connexions laser +setting.unitlaseropacity.name = Unit Mining Beam Opacity setting.bridgeopacity.name = Opacité des ponts setting.playerchat.name = Montrer les bulles de discussion des joueurs setting.showweather.name = Montrer les Effets météo diff --git a/core/assets/bundles/bundle_hu.properties b/core/assets/bundles/bundle_hu.properties index b19c6fd4cf..d234f4ab85 100644 --- a/core/assets/bundles/bundle_hu.properties +++ b/core/assets/bundles/bundle_hu.properties @@ -1248,6 +1248,7 @@ setting.steampublichost.name = Nyilvános játék láthatósága setting.playerlimit.name = Játékoskorlát setting.chatopacity.name = Csevegő átlátszatlansága setting.lasersopacity.name = Villanyvezeték átlátszatlansága +setting.unitlaseropacity.name = Unit Mining Beam Opacity setting.bridgeopacity.name = Híd átlátszatlansága setting.playerchat.name = Játékosok csevegőbuborékainak megjelenítése setting.showweather.name = Időjárás-grafika megjelenítése diff --git a/core/assets/bundles/bundle_id_ID.properties b/core/assets/bundles/bundle_id_ID.properties index 56db81e1ea..452a3ad2ee 100644 --- a/core/assets/bundles/bundle_id_ID.properties +++ b/core/assets/bundles/bundle_id_ID.properties @@ -1245,6 +1245,7 @@ setting.steampublichost.name = Visibilitas Game Publik setting.playerlimit.name = Batas pemain setting.chatopacity.name = Jelas-Beningnya Pesan setting.lasersopacity.name = Jelas-Beningnya Laser Tenaga +setting.unitlaseropacity.name = Unit Mining Beam Opacity setting.bridgeopacity.name = Jelas-Beningnya Jembatan setting.playerchat.name = Tunjukkan Pesan Pemain setting.showweather.name = Perlihatkan Cuaca diff --git a/core/assets/bundles/bundle_it.properties b/core/assets/bundles/bundle_it.properties index a3bf343b1c..82aae1013d 100644 --- a/core/assets/bundles/bundle_it.properties +++ b/core/assets/bundles/bundle_it.properties @@ -1223,6 +1223,7 @@ setting.steampublichost.name = Public Game Visibility setting.playerlimit.name = Limite Giocatori setting.chatopacity.name = Opacità Chat setting.lasersopacity.name = Opacità Raggi Energetici +setting.unitlaseropacity.name = Unit Mining Beam Opacity setting.bridgeopacity.name = Opacità Nastri e Condotti Sopraelevati setting.playerchat.name = Mostra Chat setting.showweather.name = Mostra grafica del meteo diff --git a/core/assets/bundles/bundle_ja.properties b/core/assets/bundles/bundle_ja.properties index 17dad5f90c..f166d59478 100644 --- a/core/assets/bundles/bundle_ja.properties +++ b/core/assets/bundles/bundle_ja.properties @@ -1229,6 +1229,7 @@ setting.steampublichost.name = Public Game Visibility setting.playerlimit.name = プレイヤー数制限 setting.chatopacity.name = チャットの透明度 setting.lasersopacity.name = 電線の透明度 +setting.unitlaseropacity.name = Unit Mining Beam Opacity setting.bridgeopacity.name = ブリッジの透明度 setting.playerchat.name = ゲーム内にチャットを表示 setting.showweather.name = 天気のグラフィックを表示 diff --git a/core/assets/bundles/bundle_ko.properties b/core/assets/bundles/bundle_ko.properties index 453c81528d..17383dfa23 100644 --- a/core/assets/bundles/bundle_ko.properties +++ b/core/assets/bundles/bundle_ko.properties @@ -1247,6 +1247,7 @@ setting.steampublichost.name = 공개 게임 가시성 setting.playerlimit.name = 플레이어 제한 setting.chatopacity.name = 채팅창 투명도 setting.lasersopacity.name = 전선 투명도 +setting.unitlaseropacity.name = Unit Mining Beam Opacity setting.bridgeopacity.name = 터널 투명도 setting.playerchat.name = 채팅 말풍선 표시 setting.showweather.name = 날씨 그래픽 표시 diff --git a/core/assets/bundles/bundle_lt.properties b/core/assets/bundles/bundle_lt.properties index f26b409714..ff57cf19b4 100644 --- a/core/assets/bundles/bundle_lt.properties +++ b/core/assets/bundles/bundle_lt.properties @@ -1218,6 +1218,7 @@ setting.steampublichost.name = Public Game Visibility setting.playerlimit.name = Žaidėjų Limitas setting.chatopacity.name = Pokalbių Lentos Nepermatomumas setting.lasersopacity.name = Elektros Tinklo Nepermatomumas +setting.unitlaseropacity.name = Unit Mining Beam Opacity setting.bridgeopacity.name = Tilto Nepermatomumas setting.playerchat.name = Rodyti Pokalbių Teksto Burbulus Virš Žaidėjų setting.showweather.name = Show Weather Graphics diff --git a/core/assets/bundles/bundle_nl.properties b/core/assets/bundles/bundle_nl.properties index 0876b596a2..defc3e09b8 100644 --- a/core/assets/bundles/bundle_nl.properties +++ b/core/assets/bundles/bundle_nl.properties @@ -1230,6 +1230,7 @@ setting.steampublichost.name = Public Game Visibility setting.playerlimit.name = Spelerslijst setting.chatopacity.name = Chat Transparantie setting.lasersopacity.name = Stroomdraad Transparantie +setting.unitlaseropacity.name = Unit Mining Beam Opacity setting.bridgeopacity.name = Brug Transparantie setting.playerchat.name = Toon Chat setting.showweather.name = Toon Weer Graphics diff --git a/core/assets/bundles/bundle_nl_BE.properties b/core/assets/bundles/bundle_nl_BE.properties index d65183febe..08ee9bd989 100644 --- a/core/assets/bundles/bundle_nl_BE.properties +++ b/core/assets/bundles/bundle_nl_BE.properties @@ -1218,6 +1218,7 @@ setting.steampublichost.name = Public Game Visibility setting.playerlimit.name = Player Limit setting.chatopacity.name = Chat Opacity setting.lasersopacity.name = Power Laser Opacity +setting.unitlaseropacity.name = Unit Mining Beam Opacity setting.bridgeopacity.name = Bridge Opacity setting.playerchat.name = Display In-Game Chat setting.showweather.name = Show Weather Graphics diff --git a/core/assets/bundles/bundle_pl.properties b/core/assets/bundles/bundle_pl.properties index ada07add20..2b6dca0aca 100644 --- a/core/assets/bundles/bundle_pl.properties +++ b/core/assets/bundles/bundle_pl.properties @@ -1227,6 +1227,7 @@ setting.steampublichost.name = Public Game Visibility setting.playerlimit.name = Limit graczy setting.chatopacity.name = Przezroczystość czatu setting.lasersopacity.name = Przezroczystość laserów zasilających +setting.unitlaseropacity.name = Unit Mining Beam Opacity setting.bridgeopacity.name = Przezroczystość mostów setting.playerchat.name = Wyświetlaj dymek czatu w grze setting.showweather.name = Pokaż pogodę diff --git a/core/assets/bundles/bundle_pt_BR.properties b/core/assets/bundles/bundle_pt_BR.properties index bf02f277ba..28c69ab00d 100644 --- a/core/assets/bundles/bundle_pt_BR.properties +++ b/core/assets/bundles/bundle_pt_BR.properties @@ -1237,6 +1237,7 @@ setting.steampublichost.name = Public Game Visibility setting.playerlimit.name = Limites de Player setting.chatopacity.name = Opacidade do chat setting.lasersopacity.name = Opacidade do laser +setting.unitlaseropacity.name = Unit Mining Beam Opacity setting.bridgeopacity.name = Opacidade da ponte setting.playerchat.name = Mostrar chat em jogo setting.showweather.name = Mostrar Gráficos do Clima diff --git a/core/assets/bundles/bundle_pt_PT.properties b/core/assets/bundles/bundle_pt_PT.properties index ce02a779df..5a8ad0a0b7 100644 --- a/core/assets/bundles/bundle_pt_PT.properties +++ b/core/assets/bundles/bundle_pt_PT.properties @@ -1218,6 +1218,7 @@ setting.steampublichost.name = Public Game Visibility setting.playerlimit.name = Limite de Jogadores setting.chatopacity.name = Opacidade do chat setting.lasersopacity.name = Opacidade do Power Laser +setting.unitlaseropacity.name = Unit Mining Beam Opacity setting.bridgeopacity.name = Opacidade da Ponte setting.playerchat.name = Mostrar chat em jogo setting.showweather.name = Show Weather Graphics diff --git a/core/assets/bundles/bundle_ro.properties b/core/assets/bundles/bundle_ro.properties index 371fb015ab..4cee1988ef 100644 --- a/core/assets/bundles/bundle_ro.properties +++ b/core/assets/bundles/bundle_ro.properties @@ -1229,6 +1229,7 @@ setting.steampublichost.name = Public Game Visibility setting.playerlimit.name = Limita Jucătorilor setting.chatopacity.name = Opacitate Chat setting.lasersopacity.name = Opacitate Laser Electric +setting.unitlaseropacity.name = Unit Mining Beam Opacity setting.bridgeopacity.name = Opacitate Poduri setting.playerchat.name = Vezi Chat Temporar setting.showweather.name = Vezi Vremea diff --git a/core/assets/bundles/bundle_ru.properties b/core/assets/bundles/bundle_ru.properties index e803850b40..e846304538 100644 --- a/core/assets/bundles/bundle_ru.properties +++ b/core/assets/bundles/bundle_ru.properties @@ -1229,6 +1229,7 @@ setting.steampublichost.name = Public Game Visibility setting.playerlimit.name = Ограничение игроков setting.chatopacity.name = Непрозрачность чата setting.lasersopacity.name = Непрозрачность лазеров энергоснабжения +setting.unitlaseropacity.name = Unit Mining Beam Opacity setting.bridgeopacity.name = Непрозрачность мостов setting.playerchat.name = Отображать облака чата над игроками setting.showweather.name = Отображать погоду diff --git a/core/assets/bundles/bundle_sr.properties b/core/assets/bundles/bundle_sr.properties index f342cb801a..efbe41352c 100644 --- a/core/assets/bundles/bundle_sr.properties +++ b/core/assets/bundles/bundle_sr.properties @@ -1231,6 +1231,7 @@ setting.steampublichost.name = Public Game Visibility setting.playerlimit.name = Limit Igrača setting.chatopacity.name = Prozirnost Četa setting.lasersopacity.name = Prozirnost Energetskih Lasera +setting.unitlaseropacity.name = Unit Mining Beam Opacity setting.bridgeopacity.name = Prozirnost Mostova setting.playerchat.name = Prikazuj Čet Mehure Igrača setting.showweather.name = Prikazuj Grafiku Vremena diff --git a/core/assets/bundles/bundle_sv.properties b/core/assets/bundles/bundle_sv.properties index 68a8c23fbc..9eabb3ec2c 100644 --- a/core/assets/bundles/bundle_sv.properties +++ b/core/assets/bundles/bundle_sv.properties @@ -1218,6 +1218,7 @@ setting.steampublichost.name = Public Game Visibility setting.playerlimit.name = Player Limit setting.chatopacity.name = Chattgenomskinlighet setting.lasersopacity.name = Power Laser Opacity +setting.unitlaseropacity.name = Unit Mining Beam Opacity setting.bridgeopacity.name = Bridge Opacity setting.playerchat.name = Visa setting.showweather.name = Show Weather Graphics diff --git a/core/assets/bundles/bundle_th.properties b/core/assets/bundles/bundle_th.properties index ddc0d232ff..ced7b5098e 100644 --- a/core/assets/bundles/bundle_th.properties +++ b/core/assets/bundles/bundle_th.properties @@ -1232,6 +1232,7 @@ setting.steampublichost.name = การมองเห็นเกมสาธ setting.playerlimit.name = จำกัดผู้เล่น setting.chatopacity.name = ความโปร่งแสงของแชท setting.lasersopacity.name = ความโปร่งแสงของลำแสงพลังงาน +setting.unitlaseropacity.name = Unit Mining Beam Opacity setting.bridgeopacity.name = ความโปร่งแสงของสะพาน setting.playerchat.name = แสดงกล่องแชทบนผู้เล่น setting.showweather.name = แสดงกราฟิกสภาพอากาศ diff --git a/core/assets/bundles/bundle_tk.properties b/core/assets/bundles/bundle_tk.properties index 7076eacb11..4ab70450ea 100644 --- a/core/assets/bundles/bundle_tk.properties +++ b/core/assets/bundles/bundle_tk.properties @@ -1218,6 +1218,7 @@ setting.steampublichost.name = Public Game Visibility setting.playerlimit.name = Player Limit setting.chatopacity.name = Chat Opacity setting.lasersopacity.name = Power Laser Opacity +setting.unitlaseropacity.name = Unit Mining Beam Opacity setting.bridgeopacity.name = Bridge Opacity setting.playerchat.name = Display In-Game Chat setting.showweather.name = Show Weather Graphics diff --git a/core/assets/bundles/bundle_tr.properties b/core/assets/bundles/bundle_tr.properties index 5080bf4235..931526a0ac 100644 --- a/core/assets/bundles/bundle_tr.properties +++ b/core/assets/bundles/bundle_tr.properties @@ -1227,6 +1227,7 @@ setting.steampublichost.name = Herkese Açık Oyun Görünürlüğü setting.playerlimit.name = Oyuncu Limiti setting.chatopacity.name = Mesajlaşma Opaklığı setting.lasersopacity.name = Enerji Lazeri Opaklığı +setting.unitlaseropacity.name = Unit Mining Beam Opacity setting.bridgeopacity.name = Köprü Opaklığı setting.playerchat.name = Oyun-içi Konuşmayı Göster setting.showweather.name = Hava Durmu Grafiklerini Göster diff --git a/core/assets/bundles/bundle_uk_UA.properties b/core/assets/bundles/bundle_uk_UA.properties index fab28810eb..6225820c44 100644 --- a/core/assets/bundles/bundle_uk_UA.properties +++ b/core/assets/bundles/bundle_uk_UA.properties @@ -1238,6 +1238,7 @@ setting.steampublichost.name = Загальнодоступність гри setting.playerlimit.name = Обмеження гравців setting.chatopacity.name = Непрозорість чату setting.lasersopacity.name = Непрозорість лазерів енергопостачання +setting.unitlaseropacity.name = Unit Mining Beam Opacity setting.bridgeopacity.name = Непрозорість мостів setting.playerchat.name = Показувати хмару чата над гравцями setting.showweather.name = Показувати погоду diff --git a/core/assets/bundles/bundle_vi.properties b/core/assets/bundles/bundle_vi.properties index ed8d789fd6..d6d45d4add 100644 --- a/core/assets/bundles/bundle_vi.properties +++ b/core/assets/bundles/bundle_vi.properties @@ -1248,6 +1248,7 @@ setting.steampublichost.name = Hiển thị trò chơi công khai setting.playerlimit.name = Giới hạn người chơi setting.chatopacity.name = Độ mờ trò chuyện setting.lasersopacity.name = Độ mờ kết nối năng lượng +setting.unitlaseropacity.name = Unit Mining Beam Opacity setting.bridgeopacity.name = Độ mờ cầu setting.playerchat.name = Hiển thị bong bóng trò chuyện của người chơi setting.showweather.name = Hiện đồ họa thời tiết diff --git a/core/assets/bundles/bundle_zh_CN.properties b/core/assets/bundles/bundle_zh_CN.properties index 00bc3d601a..2a2d397d1c 100644 --- a/core/assets/bundles/bundle_zh_CN.properties +++ b/core/assets/bundles/bundle_zh_CN.properties @@ -1240,6 +1240,7 @@ setting.steampublichost.name = 公共游戏可见性 setting.playerlimit.name = 玩家数量限制 setting.chatopacity.name = 聊天界面不透明度 setting.lasersopacity.name = 电力连接线不透明度 +setting.unitlaseropacity.name = Unit Mining Beam Opacity setting.bridgeopacity.name = 桥梁不透明度 setting.playerchat.name = 显示玩家聊天气泡 setting.showweather.name = 显示天气效果 diff --git a/core/assets/bundles/bundle_zh_TW.properties b/core/assets/bundles/bundle_zh_TW.properties index 7999cc78a5..cb2d507882 100644 --- a/core/assets/bundles/bundle_zh_TW.properties +++ b/core/assets/bundles/bundle_zh_TW.properties @@ -1235,6 +1235,7 @@ setting.steampublichost.name = Public Game Visibility setting.playerlimit.name = 玩家數限制 setting.chatopacity.name = 聊天框不透明度 setting.lasersopacity.name = 雷射不透明度 +setting.unitlaseropacity.name = Unit Mining Beam Opacity setting.bridgeopacity.name = 橋透明度 setting.playerchat.name = 在遊戲中顯示聊天視窗 setting.showweather.name = 顯示天氣動畫 From 336eafdb6aa948f91af0e107fe6ca497764806e5 Mon Sep 17 00:00:00 2001 From: Sh1p*nfire <73347888+Sh1penfire@users.noreply.github.com> Date: Wed, 5 Feb 2025 06:19:13 +1100 Subject: [PATCH 151/460] SeaBush draws on block's layer (#10086) --- core/src/mindustry/world/blocks/environment/SeaBush.java | 1 + 1 file changed, 1 insertion(+) diff --git a/core/src/mindustry/world/blocks/environment/SeaBush.java b/core/src/mindustry/world/blocks/environment/SeaBush.java index 23315d1652..81c0c5fe58 100644 --- a/core/src/mindustry/world/blocks/environment/SeaBush.java +++ b/core/src/mindustry/world/blocks/environment/SeaBush.java @@ -23,6 +23,7 @@ public class SeaBush extends Prop{ @Override public void drawBase(Tile tile){ + Draw.z(layer); rand.setSeed(tile.pos()); float offset = rand.random(180f); int lobes = rand.random(lobesMin, lobesMax); From c5cd3e32f851a351cd7369fbf81569a28f809ab9 Mon Sep 17 00:00:00 2001 From: MEEPofFaith <54301439+MEEPofFaith@users.noreply.github.com> Date: Tue, 4 Feb 2025 11:20:26 -0800 Subject: [PATCH 152/460] Easier access to adding custom buttons to existing vanilla menu categories. (#9835) * Easier access to adding custom buttons to vanilla menu categories. * Initialize in constructor Don't need to wait for `build` to be able to modify * seqn't --- .../mindustry/ui/fragments/MenuFragment.java | 47 +++++++++++-------- 1 file changed, 27 insertions(+), 20 deletions(-) diff --git a/core/src/mindustry/ui/fragments/MenuFragment.java b/core/src/mindustry/ui/fragments/MenuFragment.java index 497b2077e1..4e3004aadc 100644 --- a/core/src/mindustry/ui/fragments/MenuFragment.java +++ b/core/src/mindustry/ui/fragments/MenuFragment.java @@ -28,6 +28,28 @@ public class MenuFragment{ private Button currentMenu; private MenuRenderer renderer; private Seq customButtons = new Seq<>(); + public Seq desktopButtons = new Seq(); + + public MenuFragment(){ + if(!mobile){ + desktopButtons = Seq.with( + new MenuButton("@play", Icon.play, + new MenuButton("@campaign", Icon.play, () -> checkPlay(ui.planet::show)), + new MenuButton("@joingame", Icon.add, () -> checkPlay(ui.join::show)), + new MenuButton("@customgame", Icon.terrain, () -> checkPlay(ui.custom::show)), + new MenuButton("@loadgame", Icon.download, () -> checkPlay(ui.load::show)) + ), + new MenuButton("@database.button", Icon.menu, + new MenuButton("@schematics", Icon.paste, ui.schematics::show), + new MenuButton("@database", Icon.book, ui.database::show), + new MenuButton("@about.button", Icon.info, ui.about::show) + ), + new MenuButton("@editor", Icon.terrain, () -> checkPlay(ui.maps::show)), steam ? new MenuButton("@workshop", Icon.steam, platform::openWorkshop) : null, + new MenuButton("@mods", Icon.book, ui.mods::show), + new MenuButton("@settings", Icon.settings, ui.settings::show) + ); + } + } public void build(Group parent){ renderer = new MenuRenderer(); @@ -187,22 +209,7 @@ public class MenuFragment{ t.defaults().width(width).height(70f); t.name = "buttons"; - buttons(t, - new MenuButton("@play", Icon.play, - new MenuButton("@campaign", Icon.play, () -> checkPlay(ui.planet::show)), - new MenuButton("@joingame", Icon.add, () -> checkPlay(ui.join::show)), - new MenuButton("@customgame", Icon.terrain, () -> checkPlay(ui.custom::show)), - new MenuButton("@loadgame", Icon.download, () -> checkPlay(ui.load::show)) - ), - new MenuButton("@database.button", Icon.menu, - new MenuButton("@schematics", Icon.paste, ui.schematics::show), - new MenuButton("@database", Icon.book, ui.database::show), - new MenuButton("@about.button", Icon.info, ui.about::show) - ), - new MenuButton("@editor", Icon.terrain, () -> checkPlay(ui.maps::show)), steam ? new MenuButton("@workshop", Icon.steam, platform::openWorkshop) : null, - new MenuButton("@mods", Icon.book, ui.mods::show), - new MenuButton("@settings", Icon.settings, ui.settings::show) - ); + buttons(t, desktopButtons.toArray(MenuButton.class)); buttons(t, customButtons.toArray(MenuButton.class)); buttons(t, new MenuButton("@quit", Icon.exit, Core.app::exit)); }).width(width).growY(); @@ -257,7 +264,7 @@ public class MenuFragment{ //correctly offset the button submenu.add().height((Core.graphics.getHeight() - Core.scene.marginTop - Core.scene.marginBottom - out[0].getY(Align.topLeft)) / Scl.scl(1f)); submenu.row(); - buttons(submenu, b.submenu); + buttons(submenu, b.submenu.toArray()); }else{ currentMenu = null; fadeOutMenu(); @@ -296,7 +303,7 @@ public class MenuFragment{ /** Runnable ran when the button is clicked. Ignored on desktop if {@link #submenu} is not null. */ public final Runnable runnable; /** Submenu shown when this button is clicked. Used instead of {@link #runnable} on desktop. */ - public final @Nullable MenuButton[] submenu; + public final @Nullable Seq submenu; /** Constructs a simple menu button, which behaves the same way on desktop and mobile. */ public MenuButton(String text, Drawable icon, Runnable runnable){ @@ -311,7 +318,7 @@ public class MenuFragment{ this.icon = icon; this.text = text; this.runnable = runnable; - this.submenu = submenu; + this.submenu = Seq.with(submenu); } /** Comstructs a desktop-only button; used internally. */ @@ -319,7 +326,7 @@ public class MenuFragment{ this.icon = icon; this.text = text; this.runnable = () -> {}; - this.submenu = submenu; + this.submenu = Seq.with(submenu); } } } From 0bb5e00ed46fe6a3b162dd7f1207accd7e0be6df Mon Sep 17 00:00:00 2001 From: Anuken Date: Tue, 4 Feb 2025 14:21:55 -0500 Subject: [PATCH 153/460] Revert "Easier access to adding custom buttons to existing vanilla menu categories. (#9835)" This reverts commit c5cd3e32f851a351cd7369fbf81569a28f809ab9. --- .../mindustry/ui/fragments/MenuFragment.java | 47 ++++++++----------- 1 file changed, 20 insertions(+), 27 deletions(-) diff --git a/core/src/mindustry/ui/fragments/MenuFragment.java b/core/src/mindustry/ui/fragments/MenuFragment.java index 4e3004aadc..497b2077e1 100644 --- a/core/src/mindustry/ui/fragments/MenuFragment.java +++ b/core/src/mindustry/ui/fragments/MenuFragment.java @@ -28,28 +28,6 @@ public class MenuFragment{ private Button currentMenu; private MenuRenderer renderer; private Seq customButtons = new Seq<>(); - public Seq desktopButtons = new Seq(); - - public MenuFragment(){ - if(!mobile){ - desktopButtons = Seq.with( - new MenuButton("@play", Icon.play, - new MenuButton("@campaign", Icon.play, () -> checkPlay(ui.planet::show)), - new MenuButton("@joingame", Icon.add, () -> checkPlay(ui.join::show)), - new MenuButton("@customgame", Icon.terrain, () -> checkPlay(ui.custom::show)), - new MenuButton("@loadgame", Icon.download, () -> checkPlay(ui.load::show)) - ), - new MenuButton("@database.button", Icon.menu, - new MenuButton("@schematics", Icon.paste, ui.schematics::show), - new MenuButton("@database", Icon.book, ui.database::show), - new MenuButton("@about.button", Icon.info, ui.about::show) - ), - new MenuButton("@editor", Icon.terrain, () -> checkPlay(ui.maps::show)), steam ? new MenuButton("@workshop", Icon.steam, platform::openWorkshop) : null, - new MenuButton("@mods", Icon.book, ui.mods::show), - new MenuButton("@settings", Icon.settings, ui.settings::show) - ); - } - } public void build(Group parent){ renderer = new MenuRenderer(); @@ -209,7 +187,22 @@ public class MenuFragment{ t.defaults().width(width).height(70f); t.name = "buttons"; - buttons(t, desktopButtons.toArray(MenuButton.class)); + buttons(t, + new MenuButton("@play", Icon.play, + new MenuButton("@campaign", Icon.play, () -> checkPlay(ui.planet::show)), + new MenuButton("@joingame", Icon.add, () -> checkPlay(ui.join::show)), + new MenuButton("@customgame", Icon.terrain, () -> checkPlay(ui.custom::show)), + new MenuButton("@loadgame", Icon.download, () -> checkPlay(ui.load::show)) + ), + new MenuButton("@database.button", Icon.menu, + new MenuButton("@schematics", Icon.paste, ui.schematics::show), + new MenuButton("@database", Icon.book, ui.database::show), + new MenuButton("@about.button", Icon.info, ui.about::show) + ), + new MenuButton("@editor", Icon.terrain, () -> checkPlay(ui.maps::show)), steam ? new MenuButton("@workshop", Icon.steam, platform::openWorkshop) : null, + new MenuButton("@mods", Icon.book, ui.mods::show), + new MenuButton("@settings", Icon.settings, ui.settings::show) + ); buttons(t, customButtons.toArray(MenuButton.class)); buttons(t, new MenuButton("@quit", Icon.exit, Core.app::exit)); }).width(width).growY(); @@ -264,7 +257,7 @@ public class MenuFragment{ //correctly offset the button submenu.add().height((Core.graphics.getHeight() - Core.scene.marginTop - Core.scene.marginBottom - out[0].getY(Align.topLeft)) / Scl.scl(1f)); submenu.row(); - buttons(submenu, b.submenu.toArray()); + buttons(submenu, b.submenu); }else{ currentMenu = null; fadeOutMenu(); @@ -303,7 +296,7 @@ public class MenuFragment{ /** Runnable ran when the button is clicked. Ignored on desktop if {@link #submenu} is not null. */ public final Runnable runnable; /** Submenu shown when this button is clicked. Used instead of {@link #runnable} on desktop. */ - public final @Nullable Seq submenu; + public final @Nullable MenuButton[] submenu; /** Constructs a simple menu button, which behaves the same way on desktop and mobile. */ public MenuButton(String text, Drawable icon, Runnable runnable){ @@ -318,7 +311,7 @@ public class MenuFragment{ this.icon = icon; this.text = text; this.runnable = runnable; - this.submenu = Seq.with(submenu); + this.submenu = submenu; } /** Comstructs a desktop-only button; used internally. */ @@ -326,7 +319,7 @@ public class MenuFragment{ this.icon = icon; this.text = text; this.runnable = () -> {}; - this.submenu = Seq.with(submenu); + this.submenu = submenu; } } } From 3dd53fd66e432ff3ffb1a75d4626a4c9c5cc4aa6 Mon Sep 17 00:00:00 2001 From: MEEPofFaith <54301439+MEEPofFaith@users.noreply.github.com> Date: Tue, 4 Feb 2025 11:26:26 -0800 Subject: [PATCH 154/460] Add flyingLayer to units (#10312) --- core/src/mindustry/type/UnitType.java | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/core/src/mindustry/type/UnitType.java b/core/src/mindustry/type/UnitType.java index 159a0b98e2..d4d592d2bc 100644 --- a/core/src/mindustry/type/UnitType.java +++ b/core/src/mindustry/type/UnitType.java @@ -105,6 +105,8 @@ public class UnitType extends UnlockableContent implements Senseable{ /** for ground units, the layer upon which this unit is drawn */ groundLayer = Layer.groundUnit, + /** For units that fly, the layer upon which this unit is drawn. If no value is set, defaults to Layer.flyingUnitLow or Layer.flyingUnit depending on lowAltitude */ + flyingLayer = -1, /** Payload capacity of this unit in world units^2 */ payloadCapacity = 8, /** building speed multiplier; <0 to disable. */ @@ -730,6 +732,7 @@ public class UnitType extends UnlockableContent implements Senseable{ autoFindTarget = !weapons.contains(w -> w.shootStatus.speedMultiplier < 0.99f) || alwaysShootWhenMoving; } + if(flyingLayer < 0) flyingLayer = lowAltitude ? Layer.flyingUnitLow : Layer.flyingUnit; clipSize = Math.max(clipSize, lightRadius * 1.1f); singleTarget = weapons.size <= 1 && !forceMultiTarget; @@ -1226,7 +1229,7 @@ public class UnitType extends UnlockableContent implements Senseable{ boolean isPayload = !unit.isAdded(); Mechc mech = unit instanceof Mechc ? (Mechc)unit : null; - float z = isPayload ? Draw.z() : unit.elevation > 0.5f ? (lowAltitude ? Layer.flyingUnitLow : Layer.flyingUnit) : groundLayer + Mathf.clamp(hitSize / 4000f, 0, 0.01f); + float z = isPayload ? Draw.z() : (unit.elevation > 0.5f ? flyingLayer : groundLayer) + Mathf.clamp(hitSize / 4000f, 0, 0.01f); if(unit.controller().isBeingControlled(player.unit())){ drawControl(unit); From 939506ffae7de54be45b4f7f5b6d354a1756aeac Mon Sep 17 00:00:00 2001 From: MEEPofFaith <54301439+MEEPofFaith@users.noreply.github.com> Date: Tue, 4 Feb 2025 11:38:01 -0800 Subject: [PATCH 155/460] Fix multi-item boosters displaying multiple times (#10297) --- .../world/blocks/defense/ForceProjector.java | 2 +- .../world/blocks/defense/MendProjector.java | 2 +- .../blocks/defense/OverdriveProjector.java | 2 +- .../world/blocks/defense/RegenProjector.java | 2 +- core/src/mindustry/world/meta/StatValues.java | 33 ++++++++++--------- 5 files changed, 22 insertions(+), 19 deletions(-) diff --git a/core/src/mindustry/world/blocks/defense/ForceProjector.java b/core/src/mindustry/world/blocks/defense/ForceProjector.java index 0013d4c2ff..9611bf2e2b 100644 --- a/core/src/mindustry/world/blocks/defense/ForceProjector.java +++ b/core/src/mindustry/world/blocks/defense/ForceProjector.java @@ -105,7 +105,7 @@ public class ForceProjector extends Block{ if(consItems && itemConsumer instanceof ConsumeItems coni){ stats.remove(Stat.booster); - stats.add(Stat.booster, StatValues.itemBoosters("+{0} " + StatUnit.shieldHealth.localized(), stats.timePeriod, phaseShieldBoost, phaseRadiusBoost, coni.items, this::consumesItem)); + stats.add(Stat.booster, StatValues.itemBoosters("+{0} " + StatUnit.shieldHealth.localized(), stats.timePeriod, phaseShieldBoost, phaseRadiusBoost, coni.items)); stats.add(Stat.booster, StatValues.speedBoosters("", coolantConsumption, Float.MAX_VALUE, true, this::consumesLiquid)); } } diff --git a/core/src/mindustry/world/blocks/defense/MendProjector.java b/core/src/mindustry/world/blocks/defense/MendProjector.java index 369d0eecea..ff4696bbf4 100644 --- a/core/src/mindustry/world/blocks/defense/MendProjector.java +++ b/core/src/mindustry/world/blocks/defense/MendProjector.java @@ -59,7 +59,7 @@ public class MendProjector extends Block{ stats.add(Stat.booster, StatValues.itemBoosters( "{0}" + StatUnit.timesSpeed.localized(), stats.timePeriod, (phaseBoost + healPercent) / healPercent, phaseRangeBoost, - cons.items, this::consumesItem) + cons.items) ); } } diff --git a/core/src/mindustry/world/blocks/defense/OverdriveProjector.java b/core/src/mindustry/world/blocks/defense/OverdriveProjector.java index 423462318a..d5261b0604 100644 --- a/core/src/mindustry/world/blocks/defense/OverdriveProjector.java +++ b/core/src/mindustry/world/blocks/defense/OverdriveProjector.java @@ -71,7 +71,7 @@ public class OverdriveProjector extends Block{ if(hasBoost && findConsumer(f -> f instanceof ConsumeItems) instanceof ConsumeItems items){ stats.remove(Stat.booster); - stats.add(Stat.booster, StatValues.itemBoosters("+{0}%", stats.timePeriod, speedBoostPhase * 100f, phaseRangeBoost, items.items, this::consumesItem)); + stats.add(Stat.booster, StatValues.itemBoosters("+{0}%", stats.timePeriod, speedBoostPhase * 100f, phaseRangeBoost, items.items)); } } diff --git a/core/src/mindustry/world/blocks/defense/RegenProjector.java b/core/src/mindustry/world/blocks/defense/RegenProjector.java index 69bbb61116..5d05295de8 100644 --- a/core/src/mindustry/world/blocks/defense/RegenProjector.java +++ b/core/src/mindustry/world/blocks/defense/RegenProjector.java @@ -97,7 +97,7 @@ public class RegenProjector extends Block{ stats.add(Stat.booster, StatValues.itemBoosters( "{0}" + StatUnit.timesSpeed.localized(), stats.timePeriod, optionalMultiplier, 0f, - cons.items, this::consumesItem) + cons.items) ); } } diff --git a/core/src/mindustry/world/meta/StatValues.java b/core/src/mindustry/world/meta/StatValues.java index e896dd5966..8bf34567a2 100644 --- a/core/src/mindustry/world/meta/StatValues.java +++ b/core/src/mindustry/world/meta/StatValues.java @@ -484,35 +484,38 @@ public class StatValues{ }; } - public static StatValue itemBoosters(String unit, float timePeriod, float speedBoost, float rangeBoost, ItemStack[] items, Boolf filter){ + public static StatValue itemBoosters(String unit, float timePeriod, float speedBoost, float rangeBoost, ItemStack[] items){ return table -> { table.row(); table.table(c -> { - for(Item item : content.items()){ - if(!filter.get(item)) continue; - - c.table(Styles.grayPanel, b -> { + c.table(Styles.grayPanel, b -> { + b.table(it -> { for(ItemStack stack : items){ if(timePeriod < 0){ - b.add(displayItem(stack.item, stack.amount, true)).pad(20f).left(); + it.add(displayItem(stack.item, stack.amount, true)).pad(10f).padLeft(15f).left(); }else{ - b.add(displayItem(stack.item, stack.amount, timePeriod, true)).pad(20f).left(); + it.add(displayItem(stack.item, stack.amount, timePeriod, true)).pad(10f).padLeft(15f).left(); } - if(items.length > 1) b.row(); + it.row(); } + }).left(); - b.table(bt -> { - bt.right().defaults().padRight(3).left(); - if(rangeBoost != 0) bt.add("[lightgray]+[stat]" + Strings.autoFixed(rangeBoost / tilesize, 2) + "[lightgray] " + StatUnit.blocks.localized()).row(); - if(speedBoost != 0) bt.add("[lightgray]" + unit.replace("{0}", "[stat]" + Strings.autoFixed(speedBoost, 2) + "[lightgray]")); - }).right().grow().pad(10f).padRight(15f); - }).growX().pad(5).padBottom(-5).row(); - } + b.table(bt -> { + bt.right().defaults().padRight(3).left(); + if(rangeBoost != 0) bt.add("[lightgray]+[stat]" + Strings.autoFixed(rangeBoost / tilesize, 2) + "[lightgray] " + StatUnit.blocks.localized()).row(); + if(speedBoost != 0) bt.add("[lightgray]" + unit.replace("{0}", "[stat]" + Strings.autoFixed(speedBoost, 2) + "[lightgray]")); + }).right().top().grow().pad(10f).padRight(15f); + }).growX().pad(5).padBottom(-5).row(); }).growX().colspan(table.getColumns()); table.row(); }; } + /** @deprecated Filter is no longer used. */ + public static StatValue itemBoosters(String unit, float timePeriod, float speedBoost, float rangeBoost, ItemStack[] items, Boolf filter){ + return itemBoosters(unit, timePeriod, speedBoost, rangeBoost, items); + } + public static StatValue weapons(UnitType unit, Seq weapons){ return table -> { table.row(); From 7879ae9220d429fe3e356ce9d5c958bb63245442 Mon Sep 17 00:00:00 2001 From: Twcash <131608563+Twcash@users.noreply.github.com> Date: Tue, 4 Feb 2025 13:41:04 -0600 Subject: [PATCH 156/460] update DrawParticles (#10407) * update particles * Forgot rotation * Lock Fill.poly behind a boolean * stylize --- .../mindustry/world/draw/DrawParticles.java | 32 +++++++++++++------ .../world/draw/DrawSoftParticles.java | 6 ++-- 2 files changed, 25 insertions(+), 13 deletions(-) diff --git a/core/src/mindustry/world/draw/DrawParticles.java b/core/src/mindustry/world/draw/DrawParticles.java index 467e668296..ca6261344e 100644 --- a/core/src/mindustry/world/draw/DrawParticles.java +++ b/core/src/mindustry/world/draw/DrawParticles.java @@ -10,24 +10,25 @@ import mindustry.gen.*; public class DrawParticles extends DrawBlock{ public Color color = Color.valueOf("f2d585"); + public int sides = 12; + public float x = 0, y = 0; public float alpha = 0.5f; public int particles = 30; - public float particleLife = 70f, particleRad = 7f, particleSize = 3f, fadeMargin = 0.4f, rotateScl = 3f; - public boolean reverse = false; + public float particleRotation = 0, particleLife = 70f, particleRad = 7f, particleSize = 3f, fadeMargin = 0.4f, rotateScl = 3f; + public boolean reverse = false, poly = false; public Interp particleInterp = new PowIn(1.5f); public Interp particleSizeInterp = Interp.slope; public Blending blending = Blending.normal; @Override public void draw(Building build){ - if(build.warmup() > 0f){ - float a = alpha * build.warmup(); + Draw.blend(blending); Draw.color(color); - float base = (Time.time / particleLife); + float base = Time.time / particleLife; rand.setSeed(build.id); for(int i = 0; i < particles; i++){ float fin = (rand.random(2f) + base) % 1f; @@ -35,12 +36,23 @@ public class DrawParticles extends DrawBlock{ float fout = 1f - fin; float angle = rand.random(360f) + (Time.time / rotateScl) % 360f; float len = particleRad * particleInterp.apply(fout); + Draw.alpha(a * (1f - Mathf.curve(fin, 1f - fadeMargin))); - Fill.circle( - build.x + Angles.trnsx(angle, len), - build.y + Angles.trnsy(angle, len), - particleSize * particleSizeInterp.apply(fin) * build.warmup() - ); + if(poly){ + Fill.poly( + build.x + x + Angles.trnsx(angle, len), + build.y + y + Angles.trnsy(angle, len), + sides, + particleSize * particleSizeInterp.apply(fin) * build.warmup(), + particleRotation + ); + }else{ + Fill.circle( + build.x + x + Angles.trnsx(angle, len), + build.y + y + Angles.trnsy(angle, len), + particleSize * particleSizeInterp.apply(fin) * build.warmup() + ); + } } Draw.blend(); diff --git a/core/src/mindustry/world/draw/DrawSoftParticles.java b/core/src/mindustry/world/draw/DrawSoftParticles.java index b2b8271155..35c7d903b2 100644 --- a/core/src/mindustry/world/draw/DrawSoftParticles.java +++ b/core/src/mindustry/world/draw/DrawSoftParticles.java @@ -13,7 +13,7 @@ public class DrawSoftParticles extends DrawBlock{ public TextureRegion region; public Color color = Color.valueOf("e3ae6f"), color2 = Color.valueOf("d04d46"); - + public float x = 0, y = 0; public float alpha = 0.5f; public int particles = 30; public float particleLife = 70f, particleRad = 7f, particleSize = 3f, fadeMargin = 0.4f, rotateScl = 1.5f; @@ -43,8 +43,8 @@ public class DrawSoftParticles extends DrawBlock{ float r = particleSize * fin * build.warmup()*2f; Draw.rect( region, - build.x + Angles.trnsx(angle, len), - build.y + Angles.trnsy(angle, len), + build.x + x + Angles.trnsx(angle, len), + build.y + y + Angles.trnsy(angle, len), r, r ); } From b96e93917cfecb6f02160a871afcd8b37fd0ca8f Mon Sep 17 00:00:00 2001 From: Anuken Date: Tue, 4 Feb 2025 14:49:30 -0500 Subject: [PATCH 157/460] Cleanup --- core/src/mindustry/world/blocks/production/WallCrafter.java | 2 +- core/src/mindustry/world/meta/StatValues.java | 5 ----- 2 files changed, 1 insertion(+), 6 deletions(-) diff --git a/core/src/mindustry/world/blocks/production/WallCrafter.java b/core/src/mindustry/world/blocks/production/WallCrafter.java index 22f621c613..c9e3b3abf2 100644 --- a/core/src/mindustry/world/blocks/production/WallCrafter.java +++ b/core/src/mindustry/world/blocks/production/WallCrafter.java @@ -85,7 +85,7 @@ public class WallCrafter extends Block{ if(consItems && itemConsumer instanceof ConsumeItems coni){ stats.remove(Stat.booster); - stats.add(Stat.booster, StatValues.itemBoosters("{0}" + StatUnit.timesSpeed.localized(), stats.timePeriod, itemBoostIntensity, 0f, coni.items, i -> Structs.contains(coni.items, s -> s.item == i))); + stats.add(Stat.booster, StatValues.itemBoosters("{0}" + StatUnit.timesSpeed.localized(), stats.timePeriod, itemBoostIntensity, 0f, coni.items)); } if(liquidBoostIntensity != 1 && findConsumer(f -> f instanceof ConsumeLiquidBase && f.booster) instanceof ConsumeLiquidBase consBase){ diff --git a/core/src/mindustry/world/meta/StatValues.java b/core/src/mindustry/world/meta/StatValues.java index 8bf34567a2..91efa002d7 100644 --- a/core/src/mindustry/world/meta/StatValues.java +++ b/core/src/mindustry/world/meta/StatValues.java @@ -511,11 +511,6 @@ public class StatValues{ }; } - /** @deprecated Filter is no longer used. */ - public static StatValue itemBoosters(String unit, float timePeriod, float speedBoost, float rangeBoost, ItemStack[] items, Boolf filter){ - return itemBoosters(unit, timePeriod, speedBoost, rangeBoost, items); - } - public static StatValue weapons(UnitType unit, Seq weapons){ return table -> { table.row(); From 1bda606ec9404fc06dcdb3de8ac402f81863f93a Mon Sep 17 00:00:00 2001 From: Anuken Date: Tue, 4 Feb 2025 15:11:19 -0500 Subject: [PATCH 158/460] Various new base parts, most submitted by Skeledragon --- .../baseparts/a single large power node.msch | 2 ++ core/assets/baseparts/a single surge tower.msch | 2 ++ core/assets/baseparts/battery node.msch | 4 ++++ core/assets/baseparts/diffGen.msch | Bin 0 -> 365 bytes core/assets/baseparts/glassCannons.msch | Bin 0 -> 672 bytes core/assets/baseparts/impact.msch | Bin 0 -> 565 bytes core/assets/baseparts/impactMultiOutput.msch | 3 +++ core/assets/baseparts/impactSmall.msch | Bin 0 -> 520 bytes core/assets/baseparts/pyraTurretsOne.msch | Bin 0 -> 1551 bytes core/assets/baseparts/surgeTurretsOne.msch | Bin 0 -> 906 bytes 10 files changed, 11 insertions(+) create mode 100644 core/assets/baseparts/a single large power node.msch create mode 100644 core/assets/baseparts/a single surge tower.msch create mode 100644 core/assets/baseparts/battery node.msch create mode 100644 core/assets/baseparts/diffGen.msch create mode 100644 core/assets/baseparts/glassCannons.msch create mode 100644 core/assets/baseparts/impact.msch create mode 100644 core/assets/baseparts/impactMultiOutput.msch create mode 100644 core/assets/baseparts/impactSmall.msch create mode 100644 core/assets/baseparts/pyraTurretsOne.msch create mode 100644 core/assets/baseparts/surgeTurretsOne.msch diff --git a/core/assets/baseparts/a single large power node.msch b/core/assets/baseparts/a single large power node.msch new file mode 100644 index 0000000000..aed75d366c --- /dev/null +++ b/core/assets/baseparts/a single large power node.msch @@ -0,0 +1,2 @@ +mschxA + F_ڴm7DraRѠ뗾ތR rzPL8W )Ğ,z?Ls?Php; \ No newline at end of file diff --git a/core/assets/baseparts/a single surge tower.msch b/core/assets/baseparts/a single surge tower.msch new file mode 100644 index 0000000000..9a59795fc4 --- /dev/null +++ b/core/assets/baseparts/a single surge tower.msch @@ -0,0 +1,2 @@ +mschx%A + @Em;D#i m0ZS|tALS-aeV"J(yQ _W  \ No newline at end of file diff --git a/core/assets/baseparts/battery node.msch b/core/assets/baseparts/battery node.msch new file mode 100644 index 0000000000..fde063f02a --- /dev/null +++ b/core/assets/baseparts/battery node.msch @@ -0,0 +1,4 @@ +mschx- +@0F )GH.fӬQ|hM.4II`ʹH[@,D +.w (޽h +g \ No newline at end of file diff --git a/core/assets/baseparts/diffGen.msch b/core/assets/baseparts/diffGen.msch new file mode 100644 index 0000000000000000000000000000000000000000..526ac5a8a35d22a8f2bb5eac22520af84ecfd3b4 GIT binary patch literal 365 zcmc~TPR?MgnB(j3n0MPiK<4ze6>f!B;)=?u^y&o{OqXMNBJsqbJG+^|m&@ep5&x6Y zzjn;K6@BQV zE!QqB^v^q?$HuVLT>2CH8o7V_{`@TT&y=XGiCI`}G;`9j=W~4Yi?4sXY`53?{q9>T z>E%m)OT2kuv`==CxhKEcgzGi81#kI_Tsf9niYEL_Wq!*S*J94cIX7JaGP{(Qprj8#3*am=&spE4svQ`u3YGMRb<69 cv6CxqEZ*bS`$pl7>fx(FR`(fCt5o^{0EA(-ng9R* literal 0 HcmV?d00001 diff --git a/core/assets/baseparts/glassCannons.msch b/core/assets/baseparts/glassCannons.msch new file mode 100644 index 0000000000000000000000000000000000000000..fb402271bc35c0c6c407e62cf8b81c901c39ec34 GIT binary patch literal 672 zcmc~TPR?MgnBy88op;$mWbZcNp_t#Z_y>{d8#<%yM3%$3$#vVNP)wZdB{_o4m zu1-%Wx^eAr!kU(C_DtQ*>nCQ#mp{w*i@W{%-mGP}zTHj#d?9*fj{LUV`;wmTeXoa9 z->x^h?a2IcV|LHq3*VN%S|``j(vf|=;{N=ewY&BiPMT|yr2RQ{!&dECvVFg1WjS>D zPPhOemVs-qd__RlpA6@?0o)8tXv?g%X%B=JkM!_8q&q$mWkk*{c6mUS3 zOYWe!`}wm$4k{6O(+-_|bduG+o^x&T)(|GuqHBM+pPUyha%xmleX6fn@A=dFRD96C zNuQ=q*}vqE>Qnux^ZB(GFI~Hw%WsMIyngQuy&_7I2WMTHDG=n;_xLMMRgdT$1@3A3 z701MF9&=A=-}K~Ro!-08x|KVozj&m%qj>9+1aH1=PZGRkY~$ByJP@spTe$p0m(==- mvtc=V-Lm};#$GUeeQizjV!a9CduCqWbMd;zPu}aEZR`M_$W00W literal 0 HcmV?d00001 diff --git a/core/assets/baseparts/impact.msch b/core/assets/baseparts/impact.msch new file mode 100644 index 0000000000000000000000000000000000000000..47f2eb976123edb2396f74700f2818dba91f3471 GIT binary patch literal 565 zcmc~TPR?MgnByDd-FMkRK==Qn{M*9Q))X=9c_iYYBcLPL-FMeT_ow=CHDmXOJa^id z3s}D?^DaAe{_)I+PsOFzS66-2nsWJ~^8U+f7jBm?4Zr=a=+~0hm)pxOTrK&P^W$#+ zlxxqTddp_y+!wsK@M8Mq7|+_jzdv8!t)C|IY}x;BZCwj5UiU07%R4S`&{0FzR%fK`xfP0 zE!wT6cigwIPA>QC+SU73r&|Xab+m1o9OY_i_vQZVo7Yma-$zD%ob>0gjlpgSE931| zn?fV|r?Gc_Tb=Q4R^0V7UT;%weY$l%IrYXA?!A9x8n{0&*eNi`FeoZ89cf^hz+}|m zbkpXR^p4k?_c6VETc#{CHF-#nn(3+JysW)Xm|9E zQhHx|mE5b!2Ne%~Jn+`6`zgfD(!i`RC6oC=?FXhabqCxV4j~#EI5oMZ zKfV7xHL_@%<`RoZhBBX~r^?=qpEu3DXxed8zN1|o@~uHf^D4K=tqEG#iJGFRFVgI^o!mC@ZM0eYP_}*J2@gdh z$EzZ3OIFNUl%*A#nintQb97~oqSF+G%?fMkq>EM4Ze+FH;`-0l>fHKP^Nqv7I@bH5 ft5&2}3psF|VBng-yyNi1hk63R|Cnter|$#+#I718 literal 0 HcmV?d00001 diff --git a/core/assets/baseparts/impactMultiOutput.msch b/core/assets/baseparts/impactMultiOutput.msch new file mode 100644 index 0000000000..6155ce718a --- /dev/null +++ b/core/assets/baseparts/impactMultiOutput.msch @@ -0,0 +1,3 @@ +mschx]ێ0IS'[W H \".Ļ:t(<oËpKwEi~?c*iQܫNӛoMnT:3Z8;ݑVɌ =V=Ϸ_4vѪSW-VMw̨pɃrNOzTToM!3Ôfh >YE4Y=ɴ|u3lmFC{íM[w3g^ϝrɰ캕ͽTQq<5kuKO"  9 +m!TfW@uW^&adzy I+?+q3O$E˰ŶJW#R@xG c%b`1WYI*BaIJKPl=wEGTlb+R_`3MD=C^En;#?}^HnFM$@! z+aEH-H2(E)*7$8Y^X0TpPc1{wpHJ0V$)h2Yvi`-@YRfHE7V`EdzWrD?KV`Fwy;fb{ zvma$8vp$8L?Y($;(ecKPM}G4{%r8GYJzw5FzCI`|YWK(2-m8}Ro$HqQa_hSI&C(L{ z{<$V!RoJgy{Zke;#Xfq`D<$#NtkV4w+ZCV69{TWo8lU>k56@q(HQwo|wbeURddZSc zDJ9imrN(@3SBalm_VLiV!#A{6NfpcPFI}DYI_|!<^VQ&w<)u&GWl3GRb=uXuG~1-T zFDlpiXq@7;h0>{~&;Hy~G^uLizbUU>zkan@w=B?R%K0x}J~PO3GzfGwNO&+XE^%Oc z;;_-W>dg!0iKX9jst*V_v@J@ye|wsGh2}REJLQdqPF^>cmApPW&*0Ji{LeR;+BrHJ zS*9MXo7OU2dBvlfCzDpN#J7AES>v)Px4u62cG#y(VK3J=d_sBBv!m?t_@CtRugN{b zBX`tpNsr=!uG$n!6hy$`>NlxbSs{oVM`@n@OI%(;OlIZmFJ z+%|u4!r?PZ@5{|y6S3@t&bQlLl5$fvpI#e#kRx~9opWl*94mOH-uZXPjwSE*@lw_R j)}UVw3@r{UM;w?q6#mv*waX-Iwmx?7?hAXhl`|y(%v=U- literal 0 HcmV?d00001 diff --git a/core/assets/baseparts/pyraTurretsOne.msch b/core/assets/baseparts/pyraTurretsOne.msch new file mode 100644 index 0000000000000000000000000000000000000000..47f97ce687bffe10b63c600233f848f30e2aedba GIT binary patch literal 1551 zcmc~TPR?MgnBzMwdh%@-f!5>Zk^4?fOO4#OcJJ%GDzi(?bQptdKA&)2Rk5TZAZen6 z%JSa=ZSeiv4%gFXvB^pZrzNaI5R4>N$Gbe?Lvj?I{fVxHx62aqs*3`k%LtmV55n z8<$)6V&D1wce-|lUit5mpD(KRd-_&y zZ@gF|y?%24GhK=NODTr+dm`=q;|`o~WV;=jH0%7NuSxrS&FxkDU%q)`_EK(Fulq;2 znvaeLc6S=iQs4jX@{L=j6V!s5?mep7X+HPtXO-9`r=Oqvza{GSS>8FNLkSDKy zy~1SY^oqI565iCi_Ix}k{b&B=6$b(t=POO;UZzqUzJeokq1u(!whJOQ3suhsNJwe( zycDt%U8q;#wL;s)DPDpjdDWCDd7WB(4+>%y#Y>*IP4s9Nl9l;=viO!*>@@k_PpVT= zCl^d@IjvF@@tT9Zq~PWAN6CLz|tU_J{9P8#b;k0Ms zn`1Mf`Ri(}^Q#_(zKmn3I&|PkamD*@qE}Laf;CI028C;uPCK;qf{2#GeGyBknRA*= zEuJ(^P%B+?^Wp?o^DTdQbL*MCSlJsm%dh3lS?(~8sgmo;5>L_d%FEu(y^?Akct+B%-(>Kb*aM{}JSEi-S=Hp%9*>3hX%R!-K zR!_>!=chl-R5zU1b@j{E%lk}fv%(ZZ6J2G)ZXZcGt-INLQ+Z@sSLC$48}DB~ma=}c z`L>BQOW$fQSihyV^~DNJE3FOA-u(Z++$s8ISDjw;LrmevwK~Z~Ez9@w`YKySZSA|l zw7129lU;~6q;|n8=1}<)wgF#bL+^)vZ7f^4I`);!7IfM<)BQi#yPNgPiFPAP`mm?yPvdE0A6uXTJkIBYGyT&bIQYyJ8uzr0qipQ2>x zQq&=$c&V{VWX1YlzgDe3Zxe0dC%f%R!*@3I#4E>MIPh&-#Hd@l;PhgH3FiXx>ohhh z`gYj)KM$DQyjbl?rqQHR9oHEIvo`tf7tAf*v!-WnNltgqQ-f)TXH*K^C|ac5;*;q! zmCazn{f_WU5k<+xDra_-9e8|)Q6`R=eUA_)a%u|ZxM2Nu(#GXK86qS1t`p$0RTP?# zEG`i_-)ztFn&a#~I?L@!7~D5h3BUARVm|SnOO^18NFE;WnTl!t^>zU1iPJMG@e#+LQW%@|IIWxt+~$24nJO0 zp15Jo<3AJ2o_B=l1zcOQw=V5Xnfzk0*^fB-E7$e*l-djBoS1net;=-rZvKeepC1k#rT;u-?+}d-@M<)_V?ud@&zaVHco8LXD##>`4{rg|LgPTBK>0D z9?aMLZJb)ajOl#H14-^221eF%CI8Ns$mPGZxp%2@&(baV#&5+gJbRMsY7yR2>}v5m zMfO95@!Zc`>P*W@+_l6*Rwh6BsDE3wt5Bq1vfh)rgQkmIzjLpfdM2jv8JEfQr!iW^ z|4Ni2C}VrImL6DRw#Vx#IkeYwiB> zd*5GN%gK_*Slx2^=D%nc|9h9e{*tWc-R0oAc-94lbvxXyw6GcPY?{}qzNKZ`1MU;6 znQvIFFZr~tkwIcc(s%8kR{MDuG73D+F_*HFD6{sRAx*)uh`MHi}>q`c(Zr)KRGKG{}L=vS09 OhqABIz5UV(%Ig8v8U958 literal 0 HcmV?d00001 diff --git a/core/assets/baseparts/surgeTurretsOne.msch b/core/assets/baseparts/surgeTurretsOne.msch new file mode 100644 index 0000000000000000000000000000000000000000..563818a9658ff72e85595d97f705a01c881262ea GIT binary patch literal 906 zcmc~TPR?MgnBzL-^rTy1BCh-#7r0dxWJ)Vp!y#-%-rGE{2nilK zGJjJ3iS{SOMw{oli{AYGu4L!Rw7bVE-xR;wd*gc9`^fdD|S-Qd-<28vlxAM`rfkr^KJR@^Ih)iH;HlHx4-&R zidFW0T4k+U{l5eIzn=Z;nkHLQ)ui8YXaZa8=O0&>It-3zF8epjh+THK(UVR@>HZp@sB z_8DB^hkSO3Jv-F9L15aUuGGE>cV9F3J?K#4xfFO&;Df9s*IkW6Co(;jC^oW9nXsaz zd4i9WlwV_YEf-L_PY_`_VCF-Tlnlrln118?+;mDv#a!@U`NQLqUGgGPSceRQL;gXC-czW;)@g zV;UX!$JAHt#>`pO3dM5JjEimh{)*NMN4r~pJb(LU$M&a*_DdJE zKG9XlcdV2<(Z8TVxKR}as`oJi++$=GR-wq~o-x|gyHinBLe`?;=kU-mqGL!*ARbG5$T86VV% zyj%KkUZ9PF;2r7v2G#PLckVtWJ@ Date: Tue, 4 Feb 2025 15:44:57 -0500 Subject: [PATCH 159/460] Closes #8027 --- core/src/mindustry/ctype/UnlockableContent.java | 4 +++- core/src/mindustry/ui/dialogs/DatabaseDialog.java | 2 +- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/core/src/mindustry/ctype/UnlockableContent.java b/core/src/mindustry/ctype/UnlockableContent.java index c4ed0bf708..f8fdc28679 100644 --- a/core/src/mindustry/ctype/UnlockableContent.java +++ b/core/src/mindustry/ctype/UnlockableContent.java @@ -32,8 +32,10 @@ public abstract class UnlockableContent extends MappableContent{ public boolean alwaysUnlocked = false; /** Whether to show the description in the research dialog preview. */ public boolean inlineDescription = true; - /** Whether details of blocks are hidden in custom games if they haven't been unlocked in campaign mode. */ + /** Whether details are hidden in custom games if this hasn't been unlocked in campaign mode. */ public boolean hideDetails = true; + /** Whether this is hidden from the Core Database. */ + public boolean hideDatabase = false; /** If false, all icon generation is disabled for this content; createIcons is not called. */ public boolean generateIcons = true; /** How big the content appears in certain selection menus */ diff --git a/core/src/mindustry/ui/dialogs/DatabaseDialog.java b/core/src/mindustry/ui/dialogs/DatabaseDialog.java index 81fbbf9895..262afe96e6 100644 --- a/core/src/mindustry/ui/dialogs/DatabaseDialog.java +++ b/core/src/mindustry/ui/dialogs/DatabaseDialog.java @@ -101,7 +101,7 @@ public class DatabaseDialog extends BaseDialog{ ContentType type = ContentType.all[j]; Seq array = allContent[j] - .select(c -> c instanceof UnlockableContent u && !u.isHidden() && (tab == Planets.sun || u.allDatabaseTabs || u.databaseTabs.contains(tab)) && + .select(c -> c instanceof UnlockableContent u && !u.isHidden() && !u.hideDatabase && (tab == Planets.sun || u.allDatabaseTabs || u.databaseTabs.contains(tab)) && (text.isEmpty() || u.localizedName.toLowerCase().contains(text))).as(); if(array.size == 0) continue; From 22d62067a0c7d6053e577a9e4710c992f8aef91e Mon Sep 17 00:00:00 2001 From: MEEPofFaith <54301439+MEEPofFaith@users.noreply.github.com> Date: Tue, 4 Feb 2025 12:52:04 -0800 Subject: [PATCH 160/460] Multiple blocked items for drills + Blocked items for beam drills (#8527) * Multiple blocked items for drills Works similarly to output item with GenericCrafters * blocked items for beam drills --- .../world/blocks/production/BeamDrill.java | 18 ++++++++++++++---- .../world/blocks/production/Drill.java | 11 ++++++++--- 2 files changed, 22 insertions(+), 7 deletions(-) diff --git a/core/src/mindustry/world/blocks/production/BeamDrill.java b/core/src/mindustry/world/blocks/production/BeamDrill.java index 163019c9c2..008953ff51 100644 --- a/core/src/mindustry/world/blocks/production/BeamDrill.java +++ b/core/src/mindustry/world/blocks/production/BeamDrill.java @@ -45,6 +45,10 @@ public class BeamDrill extends Block{ /** Multipliers of drill speed for each item. Defaults to 1. */ public ObjectFloatMap drillMultipliers = new ObjectFloatMap<>(); + /** Special exemption item that this drill can't mine. */ + public @Nullable Item blockedItem; + /** Special exemption items that this drill can't mine. */ + public @Nullable Seq blockedItems; public Color sparkColor = Color.valueOf("fd9e81"), glowColor = Color.white; public float glowIntensity = 0.2f, pulseIntensity = 0.07f; @@ -76,6 +80,9 @@ public class BeamDrill extends Block{ public void init(){ updateClipRadius((range + 2) * tilesize); super.init(); + if(blockedItems == null && blockedItem != null){ + blockedItems = Seq.with(blockedItem); + } } @Override @@ -111,7 +118,10 @@ public class BeamDrill extends Block{ public void setStats(){ super.setStats(); - stats.add(Stat.drillTier, StatValues.drillables(drillTime, 0f, size, drillMultipliers, b -> (b instanceof Floor f && f.wallOre && f.itemDrop != null && f.itemDrop.hardness <= tier) || (b instanceof StaticWall w && w.itemDrop != null && w.itemDrop.hardness <= tier))); + stats.add(Stat.drillTier, StatValues.drillables(drillTime, 0f, size, drillMultipliers, b -> + (b instanceof Floor f && f.wallOre && f.itemDrop != null && f.itemDrop.hardness <= tier && (blockedItems == null || !blockedItems.contains(f.itemDrop))) || + (b instanceof StaticWall w && w.itemDrop != null && w.itemDrop.hardness <= tier && (blockedItems == null || !blockedItems.contains(w.itemDrop))) + )); stats.add(Stat.drillSpeed, 60f / drillTime * size, StatUnit.itemsSecond); @@ -142,7 +152,7 @@ public class BeamDrill extends Block{ if(other != null && other.solid()){ Item drop = other.wallDrop(); if(drop != null){ - if(drop.hardness <= tier){ + if(drop.hardness <= tier && (blockedItems == null || !blockedItems.contains(drop))){ found = drop; count++; }else{ @@ -193,7 +203,7 @@ public class BeamDrill extends Block{ Tile other = world.tile(Tmp.p1.x + Geometry.d4x(rotation)*j, Tmp.p1.y + Geometry.d4y(rotation)*j); if(other != null && other.solid()){ Item drop = other.wallDrop(); - if(drop != null && drop.hardness <= tier){ + if(drop != null && drop.hardness <= tier && (blockedItems == null || !blockedItems.contains(drop))){ return true; } break; @@ -379,7 +389,7 @@ public class BeamDrill extends Block{ if(other != null){ if(other.solid()){ Item drop = other.wallDrop(); - if(drop != null && drop.hardness <= tier){ + if(drop != null && drop.hardness <= tier && (blockedItems == null || !blockedItems.contains(drop))){ facingAmount ++; if(lastItem != drop && lastItem != null){ multiple = true; diff --git a/core/src/mindustry/world/blocks/production/Drill.java b/core/src/mindustry/world/blocks/production/Drill.java index 64929d08fe..00d9ba56a1 100644 --- a/core/src/mindustry/world/blocks/production/Drill.java +++ b/core/src/mindustry/world/blocks/production/Drill.java @@ -40,6 +40,8 @@ public class Drill extends Block{ public float warmupSpeed = 0.015f; /** Special exemption item that this drill can't mine. */ public @Nullable Item blockedItem; + /** Special exemption items that this drill can't mine. */ + public @Nullable Seq blockedItems; //return variables for countOre protected @Nullable Item returnItem; @@ -89,6 +91,9 @@ public class Drill extends Block{ @Override public void init(){ super.init(); + if(blockedItems == null && blockedItem != null){ + blockedItems = Seq.with(blockedItem); + } if(drillEffectRnd < 0) drillEffectRnd = size; } @@ -155,7 +160,7 @@ public class Drill extends Block{ Draw.color(); } }else{ - Tile to = tile.getLinkedTilesAs(this, tempTiles).find(t -> t.drop() != null && (t.drop().hardness > tier || t.drop() == blockedItem)); + Tile to = tile.getLinkedTilesAs(this, tempTiles).find(t -> t.drop() != null && (t.drop().hardness > tier || (blockedItems != null && blockedItems.contains(t.drop())))); Item item = to == null ? null : to.drop(); if(item != null){ drawPlaceText(Core.bundle.get("bar.drilltierreq"), x, y, valid); @@ -172,7 +177,7 @@ public class Drill extends Block{ super.setStats(); stats.add(Stat.drillTier, StatValues.drillables(drillTime, hardnessDrillMultiplier, size * size, drillMultipliers, b -> b instanceof Floor f && !f.wallOre && f.itemDrop != null && - f.itemDrop.hardness <= tier && f.itemDrop != blockedItem && (indexer.isBlockPresent(f) || state.isMenu()))); + f.itemDrop.hardness <= tier && (blockedItems == null || !blockedItems.contains(f.itemDrop)) && (indexer.isBlockPresent(f) || state.isMenu()))); stats.add(Stat.drillSpeed, 60f / drillTime * size * size, StatUnit.itemsSecond); @@ -227,7 +232,7 @@ public class Drill extends Block{ public boolean canMine(Tile tile){ if(tile == null || tile.block().isStatic()) return false; Item drops = tile.drop(); - return drops != null && drops.hardness <= tier && drops != blockedItem; + return drops != null && drops.hardness <= tier && (blockedItems == null || !blockedItems.contains(drops)); } public class DrillBuild extends Building{ From 5e19014b3e4624677bb9e44ee93c5e5305753bc9 Mon Sep 17 00:00:00 2001 From: MEEPofFaith <54301439+MEEPofFaith@users.noreply.github.com> Date: Tue, 4 Feb 2025 16:15:12 -0800 Subject: [PATCH 161/460] #9835 But acually works. (#10462) * Easier access to adding custom buttons to vanilla menu categories. * Initialize in constructor Don't need to wait for `build` to be able to modify * seqn't * Fix null crash on startup * Check if submenu is empty Problem that came up in my test. Might be due to my test being done with js. * Retain original functionality --- .../mindustry/ui/fragments/MenuFragment.java | 47 ++++++++++--------- 1 file changed, 26 insertions(+), 21 deletions(-) diff --git a/core/src/mindustry/ui/fragments/MenuFragment.java b/core/src/mindustry/ui/fragments/MenuFragment.java index 497b2077e1..296f3c5a89 100644 --- a/core/src/mindustry/ui/fragments/MenuFragment.java +++ b/core/src/mindustry/ui/fragments/MenuFragment.java @@ -28,6 +28,7 @@ public class MenuFragment{ private Button currentMenu; private MenuRenderer renderer; private Seq customButtons = new Seq<>(); + public Seq desktopButtons = null; public void build(Group parent){ renderer = new MenuRenderer(); @@ -187,22 +188,26 @@ public class MenuFragment{ t.defaults().width(width).height(70f); t.name = "buttons"; - buttons(t, - new MenuButton("@play", Icon.play, - new MenuButton("@campaign", Icon.play, () -> checkPlay(ui.planet::show)), - new MenuButton("@joingame", Icon.add, () -> checkPlay(ui.join::show)), - new MenuButton("@customgame", Icon.terrain, () -> checkPlay(ui.custom::show)), - new MenuButton("@loadgame", Icon.download, () -> checkPlay(ui.load::show)) - ), - new MenuButton("@database.button", Icon.menu, - new MenuButton("@schematics", Icon.paste, ui.schematics::show), - new MenuButton("@database", Icon.book, ui.database::show), - new MenuButton("@about.button", Icon.info, ui.about::show) - ), - new MenuButton("@editor", Icon.terrain, () -> checkPlay(ui.maps::show)), steam ? new MenuButton("@workshop", Icon.steam, platform::openWorkshop) : null, - new MenuButton("@mods", Icon.book, ui.mods::show), - new MenuButton("@settings", Icon.settings, ui.settings::show) - ); + if(desktopButtons == null){ + desktopButtons = Seq.with( + new MenuButton("@play", Icon.play, + new MenuButton("@campaign", Icon.play, () -> checkPlay(ui.planet::show)), + new MenuButton("@joingame", Icon.add, () -> checkPlay(ui.join::show)), + new MenuButton("@customgame", Icon.terrain, () -> checkPlay(ui.custom::show)), + new MenuButton("@loadgame", Icon.download, () -> checkPlay(ui.load::show)) + ), + new MenuButton("@database.button", Icon.menu, + new MenuButton("@schematics", Icon.paste, ui.schematics::show), + new MenuButton("@database", Icon.book, ui.database::show), + new MenuButton("@about.button", Icon.info, ui.about::show) + ), + new MenuButton("@editor", Icon.terrain, () -> checkPlay(ui.maps::show)), steam ? new MenuButton("@workshop", Icon.steam, platform::openWorkshop) : null, + new MenuButton("@mods", Icon.book, ui.mods::show), + new MenuButton("@settings", Icon.settings, ui.settings::show) + ); + } + + buttons(t, desktopButtons.toArray(MenuButton.class)); buttons(t, customButtons.toArray(MenuButton.class)); buttons(t, new MenuButton("@quit", Icon.exit, Core.app::exit)); }).width(width).growY(); @@ -250,14 +255,14 @@ public class MenuFragment{ currentMenu = null; fadeOutMenu(); }else{ - if(b.submenu != null){ + if(b.submenu != null && b.submenu.any()){ currentMenu = out[0]; submenu.clearChildren(); fadeInMenu(); //correctly offset the button submenu.add().height((Core.graphics.getHeight() - Core.scene.marginTop - Core.scene.marginBottom - out[0].getY(Align.topLeft)) / Scl.scl(1f)); submenu.row(); - buttons(submenu, b.submenu); + buttons(submenu, b.submenu.toArray()); }else{ currentMenu = null; fadeOutMenu(); @@ -296,7 +301,7 @@ public class MenuFragment{ /** Runnable ran when the button is clicked. Ignored on desktop if {@link #submenu} is not null. */ public final Runnable runnable; /** Submenu shown when this button is clicked. Used instead of {@link #runnable} on desktop. */ - public final @Nullable MenuButton[] submenu; + public final @Nullable Seq submenu; /** Constructs a simple menu button, which behaves the same way on desktop and mobile. */ public MenuButton(String text, Drawable icon, Runnable runnable){ @@ -311,7 +316,7 @@ public class MenuFragment{ this.icon = icon; this.text = text; this.runnable = runnable; - this.submenu = submenu; + this.submenu = submenu != null ? Seq.with(submenu) : null; } /** Comstructs a desktop-only button; used internally. */ @@ -319,7 +324,7 @@ public class MenuFragment{ this.icon = icon; this.text = text; this.runnable = () -> {}; - this.submenu = submenu; + this.submenu = submenu != null ? Seq.with(submenu) : null; } } } From ce1d606e7525479e10de00d22d5820a935c1cb0c Mon Sep 17 00:00:00 2001 From: Aurytis11 <119624161+Aurytis11@users.noreply.github.com> Date: Wed, 5 Feb 2025 02:30:07 +0200 Subject: [PATCH 162/460] Update bundle_lt.properties (#9624) * Update bundle_lt.properties * Update bundle_lt.properties --------- Co-authored-by: Anuken --- core/assets/bundles/bundle_lt.properties | 157 +++++++++++------------ 1 file changed, 78 insertions(+), 79 deletions(-) diff --git a/core/assets/bundles/bundle_lt.properties b/core/assets/bundles/bundle_lt.properties index ff57cf19b4..1a62390d7d 100644 --- a/core/assets/bundles/bundle_lt.properties +++ b/core/assets/bundles/bundle_lt.properties @@ -13,18 +13,18 @@ link.google-play.description = Google Play parduotuvės elementas link.f-droid.description = F-Droid katalogo elementas link.wiki.description = Oficialus Mindustry wiki link.suggestions.description = Pasiūlykite naujas funkcijas -link.bug.description = Found one? Report it here -linkopen = This server has sent you a link. Are you sure you want to open it?\n\n[sky]{0} +link.bug.description = Radot vieną? Praneškite čia +linkopen = Šis serveris atsiuntė jums nuorodą. Ar jūs norite atidaryti ją?\n\n[sky]{0} linkfail = Nepavyko atidaryti nuorodos!\nURL nukopijuotas į jūsų iškarpinę. screenshot = Ekrano kopija išsaugota į {0} screenshot.invalid = Žemėlapis yra per didelis, potencialiai nepakanka vietos išsaugoti ekrano kopiją. gameover = Žaidimas Baigtas -gameover.disconnect = Disconnect +gameover.disconnect = Atsijungti gameover.pvp = [accent] {0}[] komanda laimėjo! -gameover.waiting = [accent]Waiting for next map... +gameover.waiting = [accent]Laukiama kito žemėlapio... highscore = [accent]Naujas rekordas! copied = Nukopijuota. -indev.notready = This part of the game isn't ready yet +indev.notready = Ši žaidimo dalis dar neparuošta load.sound = Garsai load.map = Žemėlapiai @@ -40,23 +40,23 @@ be.updating = Naujinama... be.ignore = Ignoruoti be.noupdates = Naujinimų nerasta. be.check = Ieškoti naujinimų -mods.browser = Mod Browser -mods.browser.selected = Selected mod -mods.browser.add = Install -mods.browser.reinstall = Reinstall -mods.browser.view-releases = View Releases -mods.browser.noreleases = [scarlet]No Releases Found\n[accent]Couldn't find any releases for this mod. Check if the mod's repository has any releases published. -mods.browser.latest = -mods.browser.releases = Releases +mods.browser = Modifikacijų naršyklė +mods.browser.selected = Parinkta modifikacija +mods.browser.add = Įdiegti +mods.browser.reinstall = Perdiegti +mods.browser.view-releases = Pažiūrėti leidimus +mods.browser.noreleases = [scarlet]Nerasti jokių leidimų\n[accent]Nėjo rasti leidimų šiai modifikacijai. Patikrinkite ar modifikacijos repo yra paskelbtų leidimų. +mods.browser.latest = +mods.browser.releases = Leidimai mods.github.open = Repo -mods.github.open-release = Release Page -mods.browser.sortdate = Sort by recent -mods.browser.sortstars = Sort by stars +mods.github.open-release = Leidimų puslapis +mods.browser.sortdate = Rūšioti pagal naujausius +mods.browser.sortstars = Rūšiuoti pagal žvaigždes schematic = Schema schematic.add = Išsaugoti schemą... schematics = Schemos -schematic.search = Search schematics... +schematic.search = Ieškoti schemas... schematic.replace = Schema šiuo pavadinimu jau egzistuoja. Pakeisti? schematic.exists = Schema šiuo pavadinimu jau egzistuoja. schematic.import = Importuoti schemą... @@ -69,28 +69,28 @@ schematic.shareworkshop = Dalintis Dirbtuvėje schematic.flip = [accent][[{0}][]/[accent][[{1}][]: Apversti schemą schematic.saved = Schema išsaugota. schematic.delete.confirm = Ši schema bus negrįžtamai pašalinta. -schematic.edit = Edit Schematic +schematic.edit = Redaguoti schemą schematic.info = {0}x{1}, {2} blokai -schematic.disabled = [scarlet]Schematics disabled[]\nYou are not allowed to use schematics on this [accent]map[] or [accent]server. -schematic.tags = Tags: -schematic.edittags = Edit Tags -schematic.addtag = Add Tag -schematic.texttag = Text Tag -schematic.icontag = Icon Tag -schematic.renametag = Rename Tag -schematic.tagged = {0} tagged -schematic.tagdelconfirm = Delete this tag completely? -schematic.tagexists = That tag already exists. -stats = Stats -stats.wave = Waves Defeated +schematic.disabled = [scarlet]Schemos išjungtos[]\nJums neleidžiama naudoti schemų šiame [accent]žemėlapyje[] ar [accent]serveryje. +schematic.tags = Žymės: +schematic.edittags = Redaguoti žymes +schematic.addtag = Pridėti žymę +schematic.texttag = Teksto žymė +schematic.icontag = Piktogramos žymė +schematic.renametag = Pervadinti žymę +schematic.tagged = {0} pažymėta +schematic.tagdelconfirm = Visiškai ištrinti šią žymę? +schematic.tagexists = Ši žymė jau egzistuoja. +stats = Statistikos +stats.wave = Bangos Praeitos stats.unitsCreated = Units Created -stats.enemiesDestroyed = Enemies Destroyed -stats.built = Buildings Built -stats.destroyed = Buildings Destroyed -stats.deconstructed = Buildings Deconstructed -stats.playtime = Time Played +stats.enemiesDestroyed = Priešai sunaikinti +stats.built = Pastatų pastata +stats.destroyed = Pastatų sugriauta +stats.deconstructed = Pastatų dekonstruta +stats.playtime = Laiko žaista -globalitems = [accent]Global Items +globalitems = [accent]Globalūs Daiktai map.delete = Ar esate tikri, jog norite ištrinti žemėlapį "[accent]{0}[]"? level.highscore = Rekordas: [accent]{0} level.select = Lygio pasirinkimas @@ -132,43 +132,43 @@ mods.none = [lightgray]Modifikacijos nerastos mods.guide = Modifikavimo pagalba mods.report = Pranešti apie klaidas mods.openfolder = Atidaryti modifikacijų aplanką -mods.viewcontent = View Content +mods.viewcontent = Peržiūrėti turinį mods.reload = Perkrauti -mods.reloadexit = The game will now exit, to reload mods. +mods.reloadexit = Žadimas dabar išsijungs perkrauti modifikacijas. mod.installed = [[Installed] mod.display = [gray]Modifikacijos:[orange] {0} mod.enabled = [lightgray]Įjungta mod.disabled = [scarlet]Išjungta -mod.multiplayer.compatible = [gray]Multiplayer Compatible +mod.multiplayer.compatible = [gray]Suderinama su keliais žaidėjais mod.disable = Išjungti mod.version = Version: mod.content = Tūrinys: mod.delete.error = Negalima ištrinti modifikacijos. Failas gali būti naudojamas. -mod.incompatiblegame = [red]Outdated Game -mod.incompatiblemod = [red]Incompatible -mod.blacklisted = [red]Unsupported +mod.incompatiblegame = [red]Pasenusi žaidimo versija +mod.incompatiblemod = [red]Nesuderinima +mod.blacklisted = [red]Nepalaikoma mod.unmetdependencies = [red]Unmet Dependencies mod.erroredcontent = [scarlet]Turinio klaidos. mod.circulardependencies = [red]Circular Dependencies -mod.incompletedependencies = [red]Incomplete Dependencies +mod.incompletedependencies = [red]Nebaigtos Priklausomybės mod.requiresversion.details = Requires game version: [accent]{0}[]\nYour game is outdated. This mod requires a newer version of the game (possibly a beta/alpha release) to function. mod.outdatedv7.details = This mod is incompatible with the latest version of the game. The author must update it, and add [accent]minGameVersion: 136[] to its [accent]mod.json[] file. mod.blacklisted.details = This mod has been manually blacklisted for causing crashes or other issues with this version of the game. Do not use it. -mod.missingdependencies.details = This mod is missing dependencies: {0} -mod.erroredcontent.details = This game caused errors when loading. Ask the mod author to fix them. -mod.circulardependencies.details = This mod has dependencies that depends on each other. -mod.incompletedependencies.details = This mod is unable to be loaded due to invalid or missing dependencies: {0}. -mod.requiresversion = Requires game version: [red]{0} +mod.missingdependencies.details = Šiai modifikacijai trūksta priklausomybių: {0} +mod.erroredcontent.details = Ši modifikacija kraunant sukėlė klaidų. Paprašykite modifikacijos autoriaus pataisyti jas. +mod.circulardependencies.details = Ši modifikacija turi priklausomybių kurios priklauso nuo vieno kito. +mod.incompletedependencies.details = Šios modifikacijos negalima užkrauti dėl netinkamų arba trūkstamų priklausomybių: {0}. +mod.requiresversion = Reikia žaidimo versijos: [red]{0} mod.errors = Įvyko klaida kraunant turinį. mod.noerrorplay = [scarlet]Turite modifikacijas su klaidomis.[] Išjunkite modifikacijas su klaidomis arba patasykite jas prieš žaidžiant. mod.nowdisabled = [scarlet]Modifikacijai '{0}' trūksta priklausomybių:[accent] {1}\n[lightgray] Šios modifikacijos turi būti atsisiųstos.\nŠi modifikacija bus automatiškai išjungta. mod.enable = Įjungti -mod.requiresrestart = Žaidimas dabar išsijungs modifikacijų pakeitimui. +mod.requiresrestart = Žaidimas dabar išsijungs modifikacijų perkrovimui. mod.reloadrequired = [scarlet]Privalomas perkrovimas mod.import = Importuoti modifikaciją mod.import.file = Importuoti failą mod.import.github = Importuoti GitHub modifikaciją -mod.jarwarn = [scarlet]JAR mods are inherently unsafe.[]\nMake sure you're importing this mod from a trustworthy source! +mod.jarwarn = [scarlet]JAR modifikacijos iš esmės yra nesaugios.[]\nĮsitikinkite, kad importuojate šį modifikaciją iš patikimo šaltinio! mod.item.remove = Šis elementas yra[accent] '{0}'[] modifikacijos dalis. Norėdami panaikinti ją turite pašalinti modifikaciją. mod.remove.confirm = Ši modifikacija bus pašalinta. mod.author = [lightgray]Autorius:[] {0} @@ -180,21 +180,20 @@ mod.scripts.disable = Your device does not support mods with scripts. You must d about.button = Apie name = Vardas: noname = Pirma pasirinkite[accent] žaidėjo vardą[]. -search = Search: -planetmap = Planet Map -launchcore = Launch Core +search = Ieškoti: +planetmap = Planetų žemėlaipis +launchcore = Paleisti branduolį filename = Failo pavadinimas: unlocked = Atrakintas naujas turinys! -available = New research available! -unlock.incampaign = < Unlock in campaign for details > -campaign.select = Select Starting Campaign -campaign.none = [lightgray]Select a planet to start on.\nThis can be switched at any time. -campaign.erekir = Newer, more polished content. Mostly linear campaign progression.\n\nHigher quality maps and overall experience. -campaign.serpulo = Older content; the classic experience. More open-ended.\n\nPotentially unbalanced maps and campaign mechanics. Less polished. -campaign.difficulty = Difficulty +available = Naujas turinys pasiekiamas! +unlock.incampaign = < Atrakinkite kampanijoje detalėm > +campaign.select = Pasirinkite pradinę kampanija +campaign.none = [lightgray]Pasirinkite planetą ant kurios pradėti.\nTai gali būti pakeista bet kada. +campaign.erekir = Naujesnis, patobulintas turinys. Daugiausia linijinė kampanijos eiga.\n\nAukštesnės kokybės žemėlapiai ir bendra patirtis. +campaign.serpulo = Senesnis turinys; klasikinė versija. Atviresnis.\n\nPotencialiai nebalancuoti žemelapiai ir kampanijos mechanika. Mažiau tobulinta. completed = [accent]Išrasta techtree = Technologijų Medis -techtree.select = Tech Tree Selection +techtree.select = Technologijų Medį parinkti techtree.serpulo = Serpulo techtree.erekir = Erekir research.load = Load @@ -202,11 +201,11 @@ research.discard = Discard research.list = [lightgray]Išradimai: research = Išrasti researched = [lightgray]{0} išrasta. -research.progress = {0}% complete +research.progress = {0}% baigta players = {0} žaidėjai players.single = {0} žaidėjas players.search = ieškoti -players.notfound = [gray]no players found +players.notfound = [gray]žaidėjų nerasta server.closing = [accent]Uždaromas serveris... server.kicked.kick = Jūs buvote išmestas iš serverio! server.kicked.whitelist = Jūs nesate baltajame sąraše. @@ -244,10 +243,10 @@ servers.local.steam = Open Games & Local Servers servers.remote = Nuotoliniai Serveriai servers.global = Globalūs Serveriai servers.disclaimer = Community servers are [accent]not[] owned or controlled by the developer.\n\nServers may contain user-generated content that is not appropriate for all ages. -servers.showhidden = Show Hidden Servers -server.shown = Shown -server.hidden = Hidden -viewplayer = Viewing Player: [accent]{0} +servers.showhidden = Rodyti paslėtus serverius +server.shown = Rodoma +server.hidden = Paslėpta +viewplayer = Stebimas žaidėjas: [accent]{0} trace = Sekti Žaidėją trace.playername = Žaidėjo vardas: [accent]{0} @@ -256,16 +255,16 @@ trace.id = Unikalus ID: [accent]{0} trace.language = Language: [accent]{0} trace.mobile = Mobilus Klientas: [accent]{0} trace.modclient = Custom Client: [accent]{0} -trace.times.joined = Times Joined: [accent]{0} -trace.times.kicked = Times Kicked: [accent]{0} +trace.times.joined = Sykių prisijungta: [accent]{0} +trace.times.kicked = Sykių išmesta: [accent]{0} trace.ips = IPs: -trace.names = Names: +trace.names = Vardai: invalidid = Netaisyklingas kliento ID! Praneškite apie klaidą. -player.ban = Ban -player.kick = Kick -player.trace = Trace -player.admin = Toggle Admin -player.team = Change Team +player.ban = Baninti +player.kick = Išmesti +player.trace = Sekti +player.admin = Perjungti admininistratorių +player.team = Keisti komandą server.bans = Užblokavimai server.bans.none = Nerasta užblokuotų žaidėjų! server.admins = Administratoriai @@ -302,7 +301,7 @@ server.error.addressinuse = [scarlet]Failed to open server on port 6567.[]\n\nMa server.error = [crimson]Įvyko klaida. save.new = Naujas Išsaugojimas save.overwrite = Ar esate tikras, jog\n norite perrašyti šį elementą? -save.nocampaign = Individual save files from the campaign cannot be imported. +save.nocampaign = Individualūs išsaugojimo failai iš kampanijos negali būti importuoti. overwrite = Perrašyti save.none = Nerasta jokių išsaugojimų! savefail = Nepavyko išsaugoti žaidimo! @@ -1909,9 +1908,9 @@ block.flux-reactor.name = Flux Reactor block.neoplasia-reactor.name = Neoplasia Reactor block.switch.name = Switch -block.micro-processor.name = Micro Processor -block.logic-processor.name = Logic Processor -block.hyper-processor.name = Hyper Processor +block.micro-processor.name = Mikro Procesorius +block.logic-processor.name = Loginis Procesorius +block.hyper-processor.name = Hiper Procesorius block.logic-display.name = Logic Display block.large-logic-display.name = Large Logic Display block.memory-cell.name = Memory Cell From 758974477bfe6a2ca51e7db31e1dfb1db2b499ca Mon Sep 17 00:00:00 2001 From: Feather83 <144360504+Feather83@users.noreply.github.com> Date: Wed, 5 Feb 2025 02:33:57 +0200 Subject: [PATCH 163/460] Update bundle_bg.properties (#10100) Co-authored-by: Anuken --- core/assets/bundles/bundle_bg.properties | 2360 +++++++++++----------- 1 file changed, 1164 insertions(+), 1196 deletions(-) diff --git a/core/assets/bundles/bundle_bg.properties b/core/assets/bundles/bundle_bg.properties index c78308d9ed..f6b3cd671e 100644 --- a/core/assets/bundles/bundle_bg.properties +++ b/core/assets/bundles/bundle_bg.properties @@ -100,7 +100,7 @@ level.mode = Режим на игра: coreattack = < Ядрото е нападнато! > nearpoint = [[ [scarlet]НАПУСНЕТЕ ОПАСНАТА ЗОНА МОМЕНТАЛНО[] ]\nпредстои унижощение database = Енциклопедия -database.button = Database +database.button = База данни savegame = Запази Игра loadgame = Зареди Игра joingame = Присъедини се в Игра @@ -660,78 +660,78 @@ abandon.text = Тази зона и всичките ѝ ресурси ще бъ locked = Заключено complete = [lightgray]Завършено: requirement.wave = Стигнете вълна {0} в {1} -requirement.core = Унищожете враженското ядро в {0} +requirement.core = Унищожете вражеското ядро в {0} requirement.research = Проучете {0} requirement.produce = Произведете {0} requirement.capture = Превземете {0} -requirement.onplanet = Control Sector On {0} -requirement.onsector = Land On Sector: {0} +requirement.onplanet = Контролирайте сектор на {0} +requirement.onsector = Кацнете върху сектор: {0} launch.text = Изстреляй -map.multiplayer = Само хостващият играч може да преглежда секторите. +map.multiplayer = Само домакинът може да преглежда секторите. uncover = Разкрий configure = Избор на екипировка -objective.research.name = Research -objective.produce.name = Obtain -objective.item.name = Obtain Item -objective.coreitem.name = Core Item -objective.buildcount.name = Build Count -objective.unitcount.name = Unit Count -objective.destroyunits.name = Destroy Units -objective.timer.name = Timer -objective.destroyblock.name = Destroy Block -objective.destroyblocks.name = Destroy Blocks -objective.destroycore.name = Destroy Core -objective.commandmode.name = Command Mode -objective.flag.name = Flag -marker.shapetext.name = Shape Text -marker.point.name = Point -marker.shape.name = Shape -marker.text.name = Text -marker.line.name = Line -marker.quad.name = Quad -marker.texture.name = Texture -marker.background = Background -marker.outline = Outline -objective.research = [accent]Research:\n[]{0}[lightgray]{1} -objective.produce = [accent]Obtain:\n[]{0}[lightgray]{1} -objective.destroyblock = [accent]Destroy:\n[]{0}[lightgray]{1} -objective.destroyblocks = [accent]Destroy: [lightgray]{0}[white]/{1}\n{2}[lightgray]{3} -objective.item = [accent]Obtain: [][lightgray]{0}[]/{1}\n{2}[lightgray]{3} -objective.coreitem = [accent]Move into Core:\n[][lightgray]{0}[]/{1}\n{2}[lightgray]{3} -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}[] -objective.enemyescelating = [accent]Enemy production escalating in [lightgray]{0}[] -objective.enemyairunits = [accent]Enemy air unit production beginning in [lightgray]{0}[] -objective.destroycore = [accent]Destroy Enemy Core -objective.command = [accent]Command Units -objective.nuclearlaunch = [accent]⚠ Nuclear launch detected: [lightgray]{0} -announce.nuclearstrike = [red]⚠ NUCLEAR STRIKE INBOUND ⚠ +objective.research.name = Проучване +objective.produce.name = Събиране +objective.item.name = Намиране на предмет +objective.coreitem.name = Ключов предмет +objective.buildcount.name = Брой строежи +objective.unitcount.name = Брой единици +objective.destroyunits.name = Унищожете единици +objective.timer.name = Таймер +objective.destroyblock.name = Унищожете блок +objective.destroyblocks.name = Унищожете блокове +objective.destroycore.name = Унищожете ядро +objective.commandmode.name = Команден режим +objective.flag.name = Поставете флаг +marker.shapetext.name = Оформяне на текст +marker.minimap.name = Мини-карта +marker.shape.name = Форма +marker.text.name = Текст +marker.line.name = Линия +marker.quad.name = Квадрат +marker.texture.name = Текстура +marker.background = Фон +marker.outline = Рамка +objective.research = [accent]Проучете:\n[]{0}[lightgray]{1} +objective.produce = [accent]Добийте:\n[]{0}[lightgray]{1} +objective.destroyblock = [accent]Унищожете:\n[]{0}[lightgray]{1} +objective.destroyblocks = [accent]Унищожете: [lightgray]{0}[white]/{1}\n{2}[lightgray]{3} +objective.item = [accent]Придобийте: [][lightgray]{0}[]/{1}\n{2}[lightgray]{3} +objective.coreitem = [accent]Пренесете в ядро:\n[][lightgray]{0}[]/{1}\n{2}[lightgray]{3} +objective.build = [accent]Построете: [][lightgray]{0}[]x\n{1}[lightgray]{2} +objective.buildunit = [accent]Постройте единица: [][lightgray]{0}[]x\n{1}[lightgray]{2} +objective.destroyunits = [accent]Унищожете: [][lightgray]{0}[]x Units +objective.enemiesapproaching = [accent]Враговете наближават след [lightgray]{0}[] +objective.enemyescelating = [accent]Вражеската продукция се увеличава след [lightgray]{0}[] +objective.enemyairunits = [accent]Вражеското производство на въздушни сили започва след [lightgray]{0}[] +objective.destroycore = [accent]Унищожете вражеско ядро +objective.command = [accent]Командвайте единици +objective.nuclearlaunch = [accent]⚠ Засечен е ядрен изстрел: [lightgray]{0} +announce.nuclearstrike = [red]⚠ ЯДРЕН УДАР НАБЛИЖАВА ⚠ loadout = Екипировка resources = Ресурси -resources.max = Max +resources.max = Макс. bannedblocks = Забранени блокове -objectives = Objectives -bannedunits = Banned Units -bannedunits.whitelist = Banned Units As Whitelist -bannedblocks.whitelist = Banned Blocks As Whitelist -addall = Добави Всички +objectives = Задачи +bannedunits = Забранени единици +bannedunits.whitelist = Забранени единици в бял списък +bannedblocks.whitelist = Забранени блокчета в бял списък +addall = Добави всички launch.from = Изстреляй от: [accent]{0} -launch.capacity = Launching Item Capacity: [accent]{0} +launch.capacity = Капацитет на преносими предмети: [accent]{0} launch.destination = Цел: {0} landing.sources = Source Sectors: [accent]{0}[] landing.import = Max Total Import: {0}[accent]{1}[lightgray]/min configure.invalid = Количеството трябва да е между 0 и {0}. add = Добави... -guardian = Guardian +guardian = Пазител connectfail = [scarlet]Грешка при свързване:\n\n[accent]{0} error.unreachable = Сървърът е недостъпен.\nТова ли е правилният адрес? error.invalidaddress = Невалиден адрес. -error.timedout = Времето за изчакване изтече!\nУверете се че адресът е правилен и собственикът е пренасочил правилно порта на играта! -error.mismatch = Грешка в пакетите:\nвероятно е разминаване на версиите на клиента и сървъра.\nУверете се че клиентът и сървърът използват последната версия на Mindustry! +error.timedout = Времето за изчакване изтече!\nУверете се, че адресът е правилен и, че собственикът е пренасочил правилно порта на играта! +error.mismatch = Грешка в пакетите:\nВероятно е разминаване на версиите между клиента и сървъра.\nУверете се, че те използват последната версия на Mindustry! error.alreadyconnected = Вече сте свързани. error.mapnotfound = Не е намерен файл с карта! error.io = Мрежова I/O грешка. @@ -740,20 +740,20 @@ error.bloom = Неуспешно инициализиране на Сияния. error.moddex = Mindustry is unable to load this mod.\nYour device is blocking import of Java mods due to recent changes in Android.\nThere is no known workaround to this issue. weather.rain.name = Дъжд -weather.snowing.name = Сняг +weather.snow.name = Сняг weather.sandstorm.name = Пясъчна буря weather.sporestorm.name = Спорова буря weather.fog.name = Мъгла -campaign.playtime = \uf129 [lightgray]Sector Playtime: {0} -campaign.complete = [accent]Congratulations.\n\nThe enemy on {0} has been defeated.\n[lightgray]The final sector has been conquered. -sectorlist = Sectors -sectorlist.attacked = {0} under attack +campaign.playtime = \uf129 [lightgray]Време в този сектор: {0} +campaign.complete = [accent]Поздравления.\n\nВрагът на {0} е надвит.\n[lightgray]Последният сектор е завладян. +sectorlist = Сектори +sectorlist.attacked = {0} е в опасност sectors.unexplored = [lightgray]Неизследвано sectors.resources = Ресурси: sectors.production = Производство: sectors.export = Изнеси: -sectors.import = Import: +sectors.import = Внеси: sectors.time = Време: sectors.threat = Заплаха: sectors.wave = Вълна: @@ -768,22 +768,22 @@ sectors.rename = Преименувай Зоната sectors.enemybase = [scarlet]Вражеска база sectors.vulnerable = [scarlet]Уязвима sectors.underattack = [scarlet]Под атака! [accent]{0}% повредена -sectors.underattack.nodamage = [scarlet]Uncaptured +sectors.underattack.nodamage = [scarlet]Незавладяно sectors.survives = [accent]Оцелява {0} вълни sectors.go = Посети -sector.abandon = Abandon -sector.abandon.confirm = This sector's core(s) will self-destruct.\nContinue? -sector.curcapture = Зоната превзета -sector.curlost = Зоната загубена -sector.missingresources = [scarlet]Недостатъчни ресурси в ядрото +sector.abandon = Изоставяне +sector.abandon.confirm = Ядрото(-та) в този сектор ще се самоунищожат.\nПродължаване? +sector.curcapture = Зоната е превзета +sector.curlost = Зоната е изгубена +sector.missingresources = [scarlet]Недостатъчно ресурси в ядрото sector.attacked = Зона [accent]{0}[white] е под атака! sector.lost = Зона [accent]{0}[white] беше загубена! -sector.capture = Sector [accent]{0}[white]Captured! -sector.capture.current = Sector Captured! -sector.changeicon = Change Icon -sector.noswitch.title = Unable to Switch Sectors -sector.noswitch = You may not switch sectors while an existing sector is under attack.\n\nSector: [accent]{0}[] on [accent]{1}[] -sector.view = View Sector +#note: the missing space in the line below is intentional +sector.captured = Зона [accent]{0}[white]беше превзета! +sector.changeicon = Промени икона +sector.noswitch.title = Невъзможно е превключването на сектори +sector.noswitch = Не можете да смените секторите, докато вече съществуващ сектор е под нападение.\n\Сектор: [accent]{0}[] на [accent]{1}[] +sector.view = Виж сектор threat.low = Ниска threat.medium = Средна @@ -799,30 +799,30 @@ difficulty.eradication = Eradication planets = Планети planet.serpulo.name = Серпуло -planet.erekir.name = Erekir +planet.erekir.name = Ерекир planet.sun.name = Слънце sector.impact0078.name = Сблъсък 0078 -sector.groundZero.name = Нулева точка +sector.groundZero.name = Епицентър sector.craters.name = Кратерите -sector.frozenForest.name = Замръзнала Гора +sector.frozenForest.name = Замръзнала гора sector.ruinousShores.name = Брегови руини sector.stainedMountains.name = Зацапаните планини -sector.desolateRift.name = Опустял Разрив +sector.desolateRift.name = Опустял разрив sector.nuclearComplex.name = Ядрено-производствен комплекс sector.overgrowth.name = Свръхрастеж -sector.tarFields.name = Катранените Полета -sector.saltFlats.name = Солените Равнини -sector.fungalPass.name = Гъбеният Пролом +sector.tarFields.name = Катранените полета +sector.saltFlats.name = Солените равнини +sector.fungalPass.name = Гъбеният пролом sector.biomassFacility.name = Биосинтезиращо Съоръжение -sector.windsweptIslands.name = Ветровитите Острови +sector.windsweptIslands.name = Ветровитите острови sector.extractionOutpost.name = Добивен лагер sector.facility32m.name = Facility 32 M sector.taintedWoods.name = Tainted Woods sector.infestedCanyons.name = Infested Canyons sector.planetaryTerminal.name = Терминал за космически мисии -sector.coastline.name = Coastline -sector.navalFortress.name = Naval Fortress +sector.coastline.name = Крайбрежие +sector.navalFortress.name = Крайморска крепост sector.polarAerodrome.name = Polar Aerodrome sector.atolls.name = Atolls sector.testingGrounds.name = Testing Grounds @@ -831,110 +831,99 @@ sector.weatheredChannels.name = Weathered Channels sector.mycelialBastion.name = Mycelial Bastion sector.frontier.name = Frontier -sector.groundZero.description = Перфектното място за започване отначало. Ниска заплаха. Ниски ресурси.\nСъбери колкото можеш мед и олово.\nПродължи напред. -sector.frozenForest.description = Дори тук, близо до планините, спорите са се разпространили. Мразовитите температури не могат да ги задържат вечно.\n\nОвладейте електричеството. Постройте горивни генератори. Научете се да ползвате възстрановители. -sector.saltFlats.description = На покрайнините на пустинята лежат Солените Равнини. Няма много ресурси на това място.\n\nВрагът е издигнал комплекс за съхранение на ресурси тук. Изкоренете неговото ядро. Сравнете всичко със земята. -sector.craters.description = Събрала се е вода в този кратер, спомен от забравени войни. Възстановете региона. Съберете пясък. Помиришете метастъклото. Използвайте вода за да охлаждате вашите оръдия и свредла. +sector.groundZero.description = Перфектното място за започване отначало. Ниска заплаха. Малко ресурси.\nСъберете колкото се може повече мед и олово.\nПродължете напред. +sector.frozenForest.description = Дори тук, близо до планините, спорите са се разпространили. Мразовитите температури не могат да ги задържат вечно.\n\nОвладейте електричеството. Постройте горивни генератори. Научете се да ползвате възстановители. +sector.saltFlats.description = На покрайнините на пустинята лежат Солените равнини. Няма много ресурси на това място.\n\nВрагът е издигнал комплекс за съхранение на ресурси тук. Изкоренете ядрото му. Сравнете всичко със земята. +sector.craters.description = В този кратер се е събрала вода, спомен от забравени войни. Възстановете региона. Съберете пясък. Помиришете метастъклото. Използвайте вода за да охлаждате вашите оръдия и свредели. sector.ruinousShores.description = Сред отпадъците е и бреговата линия. Някога тук е стояла бреговата защитна линия. Няма много следи от нея. Останали са само някои елементарни защитни механизми, всичко останало е сведено до скрап.\nПродължете разширяването навън. Преоткрийте технологията. -sector.stainedMountains.description = По - навътре в континента се намират планините, все още незамърсени от спорите.\nИзвлечете изоставеният тита в тази зона. Научете се да го използвате.\n\nПрисъствието на врагове тук е по - високо. Не им оставяйте време да изпратят тежката артилерия. +sector.stainedMountains.description = По-навътре в континента се намират планините, все още незамърсени от спорите.\nИзвлечете изоставеният титан в тази зона. Научете се да го използвате.\n\nПрисъствието на врагове тук е по-високо. Не им оставяйте време да изпратят тежката артилерия. sector.overgrowth.description = Обладана от висока растителност, тази зона се намира изключително близо до източника на спорите. Врагът е установил военен лагер тук. Постройте единици модел 'Боздуган' и унищожете вражеската база. sector.tarFields.description = Покрайнините на нефтено находище, намиращо се между планините и пустинята. Една от малкото зони с използваеми резерви на катран.\nМакар и изоставена, близо до тази зона има опасни вражески сили. Не ги подценявайте.\n\n[lightgray]Препоръчително е да проучите технология за обработка на нефт преди да започнете. -sector.desolateRift.description = Много опасна зона. Изобилие на ресурси, но малко пространство. Висок риск от унищожение. Напуснете възможно най - скоро. Не се подлъгвайте от дългите интервали между атаките. -sector.nuclearComplex.description = Бивш комплекс за добив и обработка на торий, от който са останали само руини.\n[lightgray]Проучете тория и многобройните му приложения.\n\nВражеското присъствие тук е многобройно и непрекъснато внимава за нападатели. -sector.fungalPass.description = Преходна зона между високи планини и по - ниски, осеяни със спори земи. Тук врагът е разположил малка разузнавателна база.\nУнищожи я.\nИзползвайте единици модел 'Кинжал' и 'Къртица'. Унищожете двете вражески ядра. -sector.biomassFacility.description = Това съоръжение е първоизточникът на спорите. Тук те са били проучвани и създавани за първи път.\nПроучете технологиите скрити в него. Култивирайте спори за да произвеждате гориво и пластмаси.\n\n[lightgray]След смъртта на съоръжението спорите били освободени. Нищо в местната екосистема не може да се конкурира с такъв инвазивен организъм. -sector.windsweptIslands.description = По - нататък край бреговата линия се намира тази отдалечена верига от острови. Според някои записи тук някога е имало структури за производство на [accent]Пластаний[].\n\nОтблъснете вражеските морски войски. Подсигурете своя база на тези острови. Проучете тези фабрики. -sector.extractionOutpost.description = Отдалечен аванпост, където врагът е разследвал технологии за пренасяне на ресурси на далечни растояния.\n\nТехнологии за транспорт на материали между зони е ключова за бъдещи действия. Унищожете вражеската база и проучете вражеските Изстрелващи площадки. -sector.impact0078.description = Тук лежат останките от първия междузвезден транспортер, влязъл в тази система.\n\nСпасете колкото е възможно повече от останките. Проучете всяка непокътната технология. -sector.planetaryTerminal.description = Крайна цел.\n\nТази крайбрежна база съдържа структура, създадена с цел междупланетарен транспорт на ядра, макар и само в рамките на локалната звездна система. Тази локация има изключително висока защита.\n\nИзползвайте военноморски единици. Елиминирайте врага възможно най - бързо. Проучете изстрелващата структура -sector.coastline.description = Remnants of naval unit technology have been detected at this location. Repel the enemy attacks, capture this sector, and acquire the technology. -sector.navalFortress.description = The enemy has established a base on a remote, naturally-fortified island. Destroy this outpost. Acquire their advanced naval craft technology, and research it. -sector.cruxscape.name = Cruxscape -sector.geothermalStronghold.name = Geothermal Stronghold -sector.facility32m.description = WIP, map submission by Stormride_R -sector.taintedWoods.description = WIP, map submission by Stormride_R -sector.atolls.description = WIP, map submission by Stormride_R -sector.frontier.description = WIP, map submission by Stormride_R -sector.infestedCanyons.description = WIP, map submission by Skeledragon -sector.polarAerodrome.description = WIP, map submission by hhh i 17 -sector.testingGrounds.description = WIP, map submission by dnx2019 -sector.seaPort.description = WIP, map submission by inkognito626 -sector.weatheredChannels.description = WIP, map submission by Skeledragon -sector.mycelialBastion.description = WIP, map submission by Skeledragon -sector.onset.name = The Onset -sector.aegis.name = Aegis -sector.lake.name = Lake -sector.intersect.name = Intersect -sector.atlas.name = Atlas -sector.split.name = Split -sector.basin.name = Basin -sector.marsh.name = Marsh -sector.peaks.name = Peaks -sector.ravine.name = Ravine -sector.caldera-erekir.name = Caldera -sector.stronghold.name = Stronghold -sector.crevice.name = Crevice -sector.siege.name = Siege -sector.crossroads.name = Crossroads -sector.karst.name = Karst -sector.origin.name = Origin -sector.onset.description = Commence the conquest of Erekir. Gather resources, produce units, and begin researching technology. -sector.aegis.description = This sector contains deposits of tungsten.\nResearch the [accent]Impact Drill[] to mine this resource, and destroy the enemy base in the area. -sector.lake.description = This sector's slag lake greatly limits viable units. A hover unit is the only option.\nResearch the [accent]ship fabricator[] and produce an [accent]elude[] unit as soon as possible. -sector.intersect.description = Scans suggest that this sector will be attacked from multiple sides soon after landing.\nSet up defenses quickly and expand as soon as possible.\n[accent]Mech[] units will be required for the area's rough terrain. -sector.atlas.description = This sector contains varied terrain and will require a variety of units to attack effectively.\nUpgraded units may also be necessary to get past some of the tougher enemy bases detected here.\nResearch the [accent]Electrolyzer[] and the [accent]Tank Refabricator[]. -sector.split.description = The minimal enemy presence in this sector makes it perfect for testing new transport tech. -sector.basin.description = Large enemy presence detected in this sector.\nBuild units quickly and capture enemy cores to gain a foothold. -sector.marsh.description = This sector has an abundance of arkycite, but has limited vents.\nBuild [accent]Chemical Combustion Chambers[] to generate power. -sector.peaks.description = The mountainous terrain in this sector make most units useless. Flying units will be required.\nBe aware of enemy anti-air installations. It may be possible to disable some of these installations by targeting their supporting buildings. -sector.ravine.description = No enemy cores detected in the sector, although it's an important transportation route for the enemy. Expect variety of enemy forces.\nProduce [accent]surge alloy[]. Construct [accent]Afflict[] turrets. -sector.caldera-erekir.description = The resources detected in this sector are scattered across several islands.\nResearch and deploy drone-based transportation. -sector.stronghold.description = The large enemy encampment in this sector guards significant deposits of [accent]thorium[].\nUse it to develop higher tier units and turrets. -sector.crevice.description = The enemy will send fierce attack forces to take out your base in this sector.\nDeveloping [accent]carbide[] and the [accent]Pyrolysis Generator[] may be imperative for survival. -sector.siege.description = This sector features two parallel canyons that will force a two-pronged attack.\nResearch [accent]cyanogen[] to gain the capability to create even stronger tank units.\nCaution: enemy long-range missiles have been detected. The missiles may be shot down before impact. -sector.crossroads.description = The enemy bases in this sector have been established in varying terrain. Research different units to adapt.\nAdditionally, some bases are protected by shields. Figure out how they are powered. -sector.karst.description = This sector is rich in resources, but will be attacked by the enemy once a new core lands.\nTake advantage of the resources and research [accent]phase fabric[]. -sector.origin.description = The final sector with a significant enemy presence.\nNo probable research opportunities remain - focus solely on destroying all enemy cores. +sector.desolateRift.description = Много опасна зона. Изобилие на ресурси, но малко пространство. Висок риск от унищожение. Напуснете възможно най-скоро. Не се подлъгвайте от дългите интервали между атаките. +sector.nuclearComplex.description = Бивш комплекс за добив и обработка на торий, от който са останали само руини.\n[lightgray]Проучете тория и многобройните му приложения.\n\nВражеското присъствие тук е многобройно и непрекъснато внимава за неприятели. +sector.fungalPass.description = Преходна зона между високи планини и по-ниски, осеяни със спори, земи. Тук врагът е разположил малка разузнавателна база.\nУнищожете я.\nИзползвайте единици модел 'Кинжал' и 'Къртица'. Унищожете двете вражески ядра. +sector.biomassFacility.description = Това съоръжение е първоизточникът на спорите. Тук те са били проучвани и създадени за първи път.\nПроучете технологиите скрити в него. Култивирайте спори, за да произвеждате гориво и пластмаса.\n\n[lightgray]След смъртта на съоръжението спорите били освободени. Нищо в местната екосистема не може да съперничи на такъв инвазивен организъм. +sector.windsweptIslands.description = По-нататък край бреговата линия се намира тази отдалечена верига от острови. Според някои записи, тук някога е имало структури за производство на [accent]Пластаний[].\n\nОтблъснете вражеските морски войски. Подсигурете своя база на тези острови. Проучете тези фабрики. +sector.extractionOutpost.description = Отдалечен аванпост, където врагът е изследвал технологии за пренасяне на ресурси на далечни растояния.\n\nТехнологията за транспорт на материали между зоните е ключова за бъдещи действия. Унищожете вражеската база и проучете вражеските Изстрелващи площадки. +sector.impact0078.description = Тук лежат останките от първия навлязал междузвезден транспортер в тази система.\n\nСпасете колкото е възможно повече. Проучете всяка непокътната технология. +sector.planetaryTerminal.description = Крайна цел.\n\nТази крайбрежна база съдържа структура, създадена с цел междупланетарен транспорт на ядра, макар и само в рамките на локалната звездна система. Тази локация има изключително висока защита.\n\nИзползвайте военноморски единици. Елиминирайте врага възможно най-бързо. Проучете изстрелващата структура. +sector.coastline.description = На това място са засечени останките от технология за производството на морски единици. Отблъснете вражеските атаки, завладейте този сектор и присвоете технологията. +sector.navalFortress.description = Врагът е установил база на отдалечен, естествено укрепен остров. Унищожете базите им. Придобийте напредналата им морска технология и я проучете. +sector.onset.name = Началото +sector.aegis.name = Егида +sector.lake.name = Езеро +sector.intersect.name = Пресичане +sector.atlas.name = Атлас +sector.split.name = Разрив +sector.basin.name = Басейн +sector.marsh.name = Тресавище +sector.peaks.name = Върхове +sector.ravine.name = Клисура +sector.caldera-erekir.name = Калдера +sector.stronghold.name = Крепост +sector.crevice.name = Процеп +sector.siege.name = Обсада +sector.crossroads.name = Кръстопът +sector.karst.name = Карст +sector.origin.name = Произход +sector.onset.description = Започнете овладяването на Ерекир. Събирайте ресурси, произвеждайте единици и започнете да проучвате технологии. -status.burning.name = Горящ -status.freezing.name = Замръзяващ +sector.aegis.description = Този сектор съдържа депозит от волфрам.\nПроучете [accent]Пробивния свредел[], за да изкопавате този ресурс и унищожете вражеската база в района. +sector.lake.description = Количеството слаг в този сектор значително ограничава подходящите единици. Единствено летците са възможни.\nПроучете [accent]Фабриката за кораби[] и произведете тази [accent]гъвкава[] единица час по-скоро. +sector.intersect.description = Сканирането разкрива, че този сектор ще бъде нападнат от няколко страни веднага щом кацнете.\nРазположете защитите си и се разгърнете колкото се може по-бързо.\nЩе са Ви нужни [accent]Механизиране[] единици за тукашния суров терен. +sector.atlas.description = Този сектор има разнообразен терен и ще са Ви нужни различни единици, за да атакувате ефективно.\nМоже да са Ви необходими подобрени единици, за да преодолеете някои от по-могъщите засечени бази на врага.\nПроучете [accent]Електролизатора[] и [accent]Фабриката за танкове[]. +sector.split.description = Този сектор има минимално вражеско присъствие и е идеален за изпробване на новата транспортна технология. +sector.basin.description = В този сектор е засечено огромно вражеско присъствие.\nБързо направете единиците си и завладейте вражеските ядра, за да затвърдите присъствието си. +sector.marsh.description = Този сектор изобилства от аркицит, но няма много шахти.\nИзградете [accent]Камери за химическо горене[], за да добивате електричество. +sector.peaks.description = Планинският терен в този сектор прави повечето единици безполезни. Ще са Ви нужни летци.\nВнимавайте за вражески противовъздушни инсталации. Възможно е да обезоръжите някои от тях, ако се насочите към поддържащите им сгради. +sector.ravine.description = В този сектор не са засечени вражески ядра, въпреки че е важен транспортен маршрут за тях. Очаквайте разнообразие от вражески сили.\nПроизведете [accent]импулсна сплав[]. Издигнете [accent]Мъчителни[] оръдия. +sector.caldera-erekir.description = Ресурсите засечени в тази зона са разпръснати из няколко острова.\nПроучете и поставете дронове за транспорт. +sector.stronghold.description = Големият вражески лагер в тази зона предпазва значителни залежи от [accent]торий[].\nИзползвайте го, за да произведете по-високо ниво единици и оръдия. +sector.crevice.description = Врагът ще изпрати свирепи нападатели, за да унищожат базата Ви в този сектор.\nИзключително необходимо е да проучите [accent]карбид[] и [accent]Пиролизен генератор[], за да оцелеете. +sector.siege.description = В този сектор има два паралелни каньона, които ще Ви тласнат в борба на два фронта.\nПроучете [accent]цианоген[], за да получите възможността да създавате още по-мощни танкове.\nВнимание: засечени са вражески далекобойни ракети. Възможно е да свалите ракетите, преди да Ви ударят. +sector.crossroads.description = Вражеските бази в този сектор са изградени върху различни терени. Използвайте разнообразие от единици, за да се справите.\nОсвен това някои бази се пазят с щитове. Трябва да разберете откъде идва мощността им. +sector.karst.description = Този сектор е богат на ресурси, но вероятно ще бъдете нападнат от врага веднага щом ядрото Ви кацне.\nВъзползвайте се от ресурсите и проучете [accent]фазова тъкан[]. +sector.origin.description = Последният сектор със значително вражеско присъствие.\nНищо значимо не Ви остава за проучване - съсредоточете се върху унищожаването на вражеските ядра. + +status.burning.name = Изгаря +status.freezing.name = Замразен status.wet.name = Мокър status.muddy.name = Кален status.melting.name = Разтопяван status.sapped.name = Източван -status.electrified.name = Electrified +status.electrified.name = Наелектризиран status.spore-slowed.name = Обрасъл в спори (забавен) -status.tarred.name = Облят в катран -status.overdrive.name = Overdrive +status.tarred.name = Облян в катран +status.overdrive.name = Свръхскорост status.overclock.name = Ускорен status.shocked.name = Зашеметен status.blasted.name = Взривоопасен status.unmoving.name = Неподвижен -status.boss.name = Guardian +status.boss.name = Пазител settings.language = Език settings.data = Данни на играта -settings.reset = Възстанови до стандартните настройки +settings.reset = Върни към стандартните настройки settings.rebind = Смени settings.resetKey = Нулирай -settings.controls = Контроли +settings.controls = Управление settings.game = Игра settings.sound = Звук settings.graphics = Графики settings.cleardata = Изчисти данните на играта... settings.clear.confirm = Сигурни ли сте, че искате да изтриете данните на играта?\nСтореното не може да бъде отменено! -settings.clearall.confirm = [scarlet]Внимание![]\nТова ще изчисти всички данни за играта, включително запазени игри, карти, отключени елементи и настройки на клавишите.\nАко натиснете 'ок' играта ще изчисти всичките си данни и автоматично ще се затвори. +settings.clearall.confirm = [scarlet]Внимание![]\nТова ще изчисти всички данни за играта, включително запазени игри, карти, отключени елементи и настройки на клавишите.\nАко натиснете 'ок' играта ще изчисти всички данни и автоматично ще се затвори. settings.clearsaves.confirm = Сигурни ли сте, че искате да изтриете всичките си запазени игри? settings.clearsaves = Изчисти запазените игри -settings.clearresearch = Изчисти Проучванията -settings.clearresearch.confirm = Сигурни ли сте, че искате да изчистите всичките си проучвания в режим Кампания? -settings.clearcampaignsaves = Изчисти запазените игри в Кампанията -settings.clearcampaignsaves.confirm = Сигурни ли сте, че искате да изтриете всичките си записи от Кампанията? +settings.clearresearch = Изчисти проучванията +settings.clearresearch.confirm = Сигурни ли сте, че искате да изчистите всичките си проучвания от кампанията? +settings.clearcampaignsaves = Изчисти запазените игри в кампанията +settings.clearcampaignsaves.confirm = Сигурни ли сте, че искате да изтриете всичките си записи от кампанията? paused = [accent]< Играта е в пауза > clear = Изчисти banned = [scarlet]Баннат -unsupported.environment = [scarlet]Unsupported Environment +unsupported.environment = [scarlet]Неподдържана среда yes = Да no = Не info.title = Информация @@ -942,45 +931,45 @@ error.title = [scarlet]Възникна грешка error.crashtitle = Възникна грешка unit.nobuild = [scarlet]Единицата не може да строи lastaccessed = [lightgray]Последно достъпван: {0} -lastcommanded = [lightgray]Last Commanded: {0} +lastcommanded = [lightgray]Последно командван: {0} block.unknown = [lightgray]??? -stat.showinmap = +stat.showinmap = <заредете карта, за да се покаже> stat.description = Предназначение stat.input = Вход stat.output = Изход -stat.maxefficiency = Max Efficiency +stat.maxefficiency = Макс. ефикасност stat.booster = Двигатели stat.tiles = Необходим терен stat.affinities = Афинитети stat.opposites = Противоположности -stat.powercapacity = Електрически Капацитет -stat.powershot = Електроенергия/Изтрел +stat.powercapacity = Електрически капацитет +stat.powershot = Електроенергия/Изстрел stat.damage = Щети -stat.targetsair = Напада по Въздух -stat.targetsground = Напада по Земя -stat.itemsmoved = Скорост на Движение +stat.targetsair = Напада по въздух +stat.targetsground = Напада по земя +stat.itemsmoved = Скорост на движение stat.launchtime = Време между изстрелванията stat.shootrange = Обхват stat.size = Размер -stat.displaysize = Размер на Екрана -stat.liquidcapacity = Капацитет на Течности -stat.powerrange = Обхват на Електроенергията +stat.displaysize = Размер на екрана +stat.liquidcapacity = Капацитет на течности +stat.powerrange = Обхват на електроенергията stat.linkrange = Обхват на връзката stat.instructions = Инструкции stat.powerconnections = Максимален брой връзки stat.poweruse = Консумация на електроенергия -stat.powerdamage = Електроенергия/Щета +stat.powerdamage = Електро-енергия/Щета stat.itemcapacity = Ресурсен капацитет stat.memorycapacity = Капацитет на паметта stat.basepowergeneration = Основно производство на енергия stat.productiontime = Време за производство stat.repairtime = Време за пълна поправка на блок -stat.repairspeed = Repair Speed +stat.repairspeed = Скорост на поправяне stat.weapons = Оръжия stat.bullet = Муниции -stat.moduletier = Module Tier -stat.unittype = Unit Type +stat.moduletier = Ниво на модул +stat.unittype = Вид единица stat.speedincrease = Ускорение stat.range = Обхват stat.drilltier = Изкопаеми ресурси @@ -1005,79 +994,77 @@ stat.lightningdamage = Щети от светкавица stat.flammability = Възпламенимост stat.radioactivity = Радиоактивност stat.charge = Заряд -stat.heatcapacity = Топлинен Капацитет +stat.heatcapacity = Топлинен капацитет stat.viscosity = Вискозитет (гъстота) stat.temperature = Температура stat.speed = Скорост stat.buildspeed = Скорост на изграждане stat.minespeed = Скорост на добив stat.minetier = Ниво на добив -stat.payloadcapacity = Товарен Капацитет +stat.payloadcapacity = Товарен капацитет stat.abilities = Способности stat.canboost = Може да ускорява stat.flying = Летящ -stat.ammouse = Употребе на Боеприпаси -stat.ammocapacity = Ammo Capacity -stat.damagemultiplier = Множител на Щети -stat.healthmultiplier = Множител на Точки живот -stat.speedmultiplier = Множител на Скорост -stat.reloadmultiplier = Множител на Презареждане +stat.ammouse = Употреба на боеприпаси +stat.ammocapacity = Муниции +stat.damagemultiplier = Множител на щети +stat.healthmultiplier = Множител на точки живот +stat.speedmultiplier = Множител на скорост +stat.reloadmultiplier = Множител на презареждане stat.buildspeedmultiplier = Множител на скорост за изграждане stat.reactive = Реагира -stat.immunities = Immunities -stat.healing = Healing +stat.immunities = Имунитет +stat.healing = Лечение -ability.forcefield = Енергийно Поле -ability.forcefield.description = Projects a force shield that absorbs bullets -ability.repairfield = Възстановяващо Поле -ability.repairfield.description = Repairs nearby units -ability.statusfield = Подсилващо Поле -ability.statusfield.description = Applies a status effect to nearby units -ability.unitspawn = Factory -ability.unitspawn.description = Constructs units -ability.shieldregenfield = Възстановяващо броня Поле -ability.shieldregenfield.description = Regenerates shields of nearby units +ability.forcefield = Енергийно поле +ability.forcefield.description = Проектира силово поле, което поглъща куршуми +ability.repairfield = Възстановяващо поле +ability.repairfield.description = Поправя околните единици +ability.statusfield = Подсилващо поле +ability.statusfield.description = Има определен ефект върху околните единици +ability.unitspawn = Фабрика +ability.unitspawn.description = Произвежда единици +ability.shieldregenfield = Щитово поле +ability.shieldregenfield.description = Възстановява щитовете на околните единици ability.movelightning = Подвижна светкавица -ability.movelightning.description = Releases lightning while moving -ability.armorplate = Armor Plate -ability.armorplate.description = Reduces damage taken while shooting -ability.shieldarc = Shield Arc -ability.shieldarc.description = Projects a force shield in an arc that absorbs bullets -ability.suppressionfield = Regen Suppression Field -ability.suppressionfield.description = Stops nearby repair buildings -ability.energyfield = Energy Field -ability.energyfield.description = Zaps nearby enemies -ability.energyfield.healdescription = Zaps nearby enemies and heals allies -ability.regen = Regeneration -ability.regen.description = Regenerates own health over time -ability.liquidregen = Liquid Absorption -ability.liquidregen.description = Absorbs liquid to heal itself -ability.spawndeath = Death Spawns -ability.spawndeath.description = Releases units on death -ability.liquidexplode = Death Spillage -ability.liquidexplode.description = Spills liquid on death -ability.stat.firingrate = [stat]{0}/sec[lightgray] firing rate -ability.stat.regen = [stat]{0}[lightgray] health/sec -ability.stat.pulseregen = [stat]{0}[lightgray] health/pulse -ability.stat.shield = [stat]{0}[lightgray] shield -ability.stat.repairspeed = [stat]{0}/sec[lightgray] repair speed -ability.stat.slurpheal = [stat]{0}[lightgray] health/liquid unit -ability.stat.cooldown = [stat]{0} sec[lightgray] cooldown -ability.stat.maxtargets = [stat]{0}[lightgray] max targets -ability.stat.sametypehealmultiplier = [stat]{0}%[lightgray] same type repair amount -ability.stat.damagereduction = [stat]{0}%[lightgray] damage reduction -ability.stat.minspeed = [stat]{0} tiles/sec[lightgray] min speed -ability.stat.duration = [stat]{0} sec[lightgray] duration -ability.stat.buildtime = [stat]{0} sec[lightgray] build time +ability.movelightning.description = Отприщва светкавици, докато се движи +ability.armorplate = Бронирани плочи +ability.armorplate.description = Намалява вредата, която единицата претърпява, докато стреля +ability.shieldarc = Щит-дъга +ability.shieldarc.description = Проектира силово поле в дъга, която поглъща куршуми +ability.suppressionfield = Потискащо поле +ability.suppressionfield.description = Спира поправката на околните сгради +ability.energyfield = Енергийно поле +ability.energyfield.description = Удря с ток близките врагове +ability.energyfield.healdescription = Удря с ток близките врагове и лекува приятелските единици +ability.regen = Регенерация +ability.regen.description = Възстановява здравето си с течение на времето +ability.liquidregen = Попивателни свойства +ability.liquidregen.description = Поглъща течност, за да се лекува +ability.spawndeath = Малък подарък +ability.spawndeath.description = Пуска единици, когато загине +ability.liquidexplode = Разливане +ability.liquidexplode.description = Разлива течността си, когато загине +ability.stat.firingrate = [stat]{0}/в сек.[lightgray] скорост на огъня +ability.stat.regen = [stat]{0}[lightgray] здраве/сек. +ability.stat.shield = [stat]{0}[lightgray] щит +ability.stat.repairspeed = [stat]{0}/в сек.[lightgray] скорост на поправка +ability.stat.slurpheal = [stat]{0}[lightgray] здраве/количество течност +ability.stat.cooldown = [stat]{0} в сек.[lightgray] презареждане +ability.stat.maxtargets = [stat]{0}[lightgray] макс. мишени +ability.stat.sametypehealmultiplier = [stat]{0}%[lightgray] еднакво количество поправка +ability.stat.damagereduction = [stat]{0}%[lightgray] намаляване на вредата +ability.stat.minspeed = [stat]{0} полета/в сек.[lightgray] мин. скорост +ability.stat.duration = [stat]{0} в сек.[lightgray] продължителност +ability.stat.buildtime = [stat]{0} в сек.[lightgray] време за строеж -bar.onlycoredeposit = Only Core Depositing Allowed +bar.onlycoredeposit = Доставянето е разрешено само до ядрото -bar.drilltierreq = Необходимо е по-добро Свредло -bar.nobatterypower = Insufficieny Battery Power -bar.noresources = Недостатъчни Ресурси -bar.corereq = Необходимо е Ядро за основа -bar.corefloor = Core Zone Tile Required -bar.cargounitcap = Cargo Unit Cap Reached +bar.drilltierreq = Необходимо е по-добро свредло +bar.noresources = Недостатъчно ресурси +bar.corereq = Необходимо е ядро за основа +bar.corefloor = Необходимо е поле за ядрото +bar.cargounitcap = Капацитета на преносвачите е достигнат bar.drillspeed = Скорост на свредлото: {0}/сек bar.pumpspeed = Скорост на помпата: {0}/сек bar.efficiency = Ефективност: {0}% @@ -1093,17 +1080,16 @@ bar.capacity = Капацитет: {0} bar.unitcap = {0} {1}/{2} bar.liquid = Течност bar.heat = Топлина -bar.cooldown = Cooldown -bar.instability = Instability -bar.heatamount = Heat: {0} -bar.heatpercent = Heat: {0} ({1}%) +bar.instability = Нестабилност +bar.heatamount = Горещина: {0} +bar.heatpercent = Горещина: {0} ({1}%) bar.power = Електроенергия bar.progress = Напредък в производството -bar.loadprogress = Progress -bar.launchcooldown = Launch Cooldown +bar.loadprogress = Напредък +bar.launchcooldown = Презареждане на изстрела bar.input = Вход bar.output = Изход -bar.strength = [stat]{0}[lightgray]x strength +bar.strength = [stat]{0}[lightgray]x сила units.processorcontrol = [lightgray]Контролиран от процесор @@ -1111,33 +1097,31 @@ bullet.damage = [stat]{0}[lightgray] щети bullet.splashdamage = [stat]{0}[lightgray] щети на площ ~[stat] {1}[lightgray] полета bullet.incendiary = [stat]Подпалване bullet.homing = [stat]Самонасочване -bullet.armorpierce = [stat]armor piercing -bullet.maxdamagefraction = [stat]{0}%[lightgray] damage limit -bullet.suppression = [stat]{0} sec[lightgray] repair suppression ~ [stat]{1}[lightgray] tiles -bullet.interval = [stat]{0}/sec[lightgray] interval bullets: -bullet.frags = [stat]{0}[lightgray]x frag bullets: +bullet.armorpierce = [stat]Пробождане на броня +bullet.maxdamagefraction = [stat]{0}%[lightgray] ограничена щета +bullet.suppression = [stat]{0} сек[lightgray] възпиране на поправки ~ [stat]{1}[lightgray] плочки +bullet.interval = [stat]{0}/сек[lightgray] куршуми в интервал: +bullet.frags = [stat]{0}[lightgray]x фрагменти: bullet.lightning = [stat]{0}[lightgray]x светкавица ~ [stat]{1}[lightgray] щети bullet.buildingdamage = [stat]{0}%[lightgray] щети на сгради bullet.knockback = [stat]{0}[lightgray] отблъскване bullet.pierce = [stat]{0}[lightgray]x пробождане bullet.infinitepierce = [stat]пробождане bullet.healpercent = [stat]{0}[lightgray]% възстановяване -bullet.healamount = [stat]{0}[lightgray] direct repair +bullet.healamount = [stat]{0}[lightgray] директна поправка bullet.multiplier = [stat]{0}[lightgray]x множител на боеприпаси bullet.reload = [stat]{0}[lightgray]x скорост на стрелба -bullet.range = [stat]{0}[lightgray] tiles range -bullet.notargetsmissiles = [stat] ignores buildings -bullet.notargetsbuildings = [stat] ignores missiles +bullet.range = [stat]{0}[lightgray] обхват -unit.blocks = блока +unit.blocks = блокове unit.blockssquared = блока² unit.powersecond = електричество/секунда -unit.tilessecond = tiles/second +unit.tilessecond = полета/секунда unit.liquidsecond = течност/секунда unit.itemssecond = предмети/секунда unit.liquidunits = течност unit.powerunits = електричество -unit.heatunits = heat units +unit.heatunits = единици горещина unit.degrees = градуси unit.seconds = секунди unit.minutes = минути @@ -1160,283 +1144,276 @@ category.liquids = Течности category.items = Предмети category.crafting = Вход/Изход category.function = Функционалност -category.optional = Допълнителни Подобрения -setting.alwaysmusic.name = Always Play Music -setting.alwaysmusic.description = When enabled, music will always play on loop in-game.\nWhen disabled, it only plays at random intervals. -setting.skipcoreanimation.name = Skip Core Launch/Land Animation -setting.landscape.name = Заключване на Пейзажа +category.optional = Допълнителни подобрения +setting.alwaysmusic.name = Нека има музика +setting.alwaysmusic.description = Когато тази опция е включена, музиката винаги ще продължава.\nИзключите ли опцията, музиката ще се задейства през неопределен интервал от време. +setting.skipcoreanimation.name = Пропускане на анимацията на ядрото при изстрел/кацане +setting.landscape.name = Заключване на пейзажа setting.shadows.name = Сенки -setting.blockreplace.name = Автоматични Предложения за Блокове -setting.linear.name = Линейно Филтриране +setting.blockreplace.name = Автоматични предложения за блокове +setting.linear.name = Линейно филтриране setting.hints.name = Съвети -setting.logichints.name = Логически Съвети +setting.logichints.name = Логически съвети setting.backgroundpause.name = Пауза при загуба на фокус -setting.buildautopause.name = Автоматична Пауза на Изграждането -setting.doubletapmine.name = Двоен Клик за Добив на Ресурс -setting.commandmodehold.name = Hold For Command Mode -setting.distinctcontrolgroups.name = Limit One Control Group Per Unit +setting.buildautopause.name = Автоматична пауза на изграждането +setting.doubletapmine.name = Двоен клик за добив на ресурс +setting.commandmodehold.name = Задържане за команден режим +setting.distinctcontrolgroups.name = Ограничаване на контролните групи за една единица setting.modcrashdisable.name = Забрани Модовете При Стартиране След Срив -setting.animatedwater.name = Анимирани Повърхности -setting.animatedshields.name = Анимирани Щитове -setting.playerindicators.name = Индикатори на играчите -setting.indicators.name = Индикатори на враговете -setting.autotarget.name = Автоматичен Прицел -setting.keyboard.name = Контроли: Мишка и Клавиатура -setting.touchscreen.name = Контроли: Тъчскрийн +setting.animatedwater.name = Анимирани повърхности +setting.animatedshields.name = Анимирани щитове +setting.playerindicators.name = Индикатори за играчите +setting.indicators.name = Индикатори за враговете +setting.autotarget.name = Автоматичен прицел +setting.keyboard.name = Управление: мишка/клавиатура +setting.touchscreen.name = Управление: тъчскрийн setting.fpscap.name = Максимални FPS setting.fpscap.none = Няма setting.fpscap.text = {0} FPS -setting.uiscale.name = Размер на Интерфейсът[lightgray] (изисква рестарт)[] -setting.uiscale.description = Restart required to apply changes. -setting.swapdiagonal.name = Винаги Диагонално Поставяне -setting.screenshake.name = Клатене на Екрата -setting.bloomintensity.name = Bloom Intensity -setting.bloomblur.name = Bloom Blur -setting.effects.name = Показвай Ефекти -setting.destroyedblocks.name = Показвай Унищожени Блокове -setting.blockstatus.name = Показвай Статус на Блоковете -setting.conveyorpathfinding.name = Намиране на Валидна Пътека при Поставяне на Транспортери -setting.sensitivity.name = Чувствителност на Контролера -setting.saveinterval.name = Време Между Автоматичен Запис +setting.uiscale.name = Размер на интерфейса[lightgray] (изисква рестарт)[] +setting.uiscale.description = Нужен е рестарт, за да се приложат промените. +setting.swapdiagonal.name = Винаги диагонално поставяне +setting.difficulty.training = Тренировка +setting.difficulty.easy = Лесна +setting.difficulty.normal = Нормална +setting.difficulty.hard = Трудна +setting.difficulty.insane = Безумна +setting.difficulty.name = Трудност: +setting.screenshake.name = Клатене на екрана +setting.bloomintensity.name = Интензитет на сиянията +setting.bloomblur.name = Замъгляване на сияние +setting.effects.name = Показвай ефекти +setting.destroyedblocks.name = Показвай унищожени блокове +setting.blockstatus.name = Показвай статуса на блоковете +setting.conveyorpathfinding.name = Намиране на валидна пътека при поставяне на транспортери +setting.sensitivity.name = Чувствителност на контролера +setting.saveinterval.name = Време между автоматичен запис setting.seconds = {0} секунди setting.milliseconds = {0} милисекунди -setting.fullscreen.name = Цял Екран -setting.borderlesswindow.name = Прозорец без Рамка[lightgray] (може да изисква рестарт) -setting.borderlesswindow.name.windows = Borderless Fullscreen -setting.borderlesswindow.description = Restart may be required to apply changes. -setting.fps.name = Показвай FPS & Ping -setting.console.name = Enable Console -setting.smoothcamera.name = Гладка Камера +setting.fullscreen.name = Цял екран +setting.borderlesswindow.name = Прозорец без рамка[lightgray] (може да изисква рестарт) +setting.borderlesswindow.name.windows = Цял екран без рамка +setting.borderlesswindow.description = Може да е нужен рестарт, за да се приложат промените. +setting.fps.name = Показвай FPS & пинг +setting.console.name = Включване на конзолата +setting.smoothcamera.name = Гладка камера setting.vsync.name = Вертикална синхронизация (VSync) -setting.pixelate.name = Пикселизирай -setting.minimap.name = Показвай Мини-Карта -setting.coreitems.name = Показвай Ресурсите в Ядрото -setting.position.name = Показвай Позиция на Играч -setting.mouseposition.name = Show Mouse Position -setting.musicvol.name = Сила на Звука -setting.atmosphere.name = Показвай Атмосферата на Планетата -setting.drawlight.name = Draw Darkness/Lighting -setting.ambientvol.name = Сила на Звука на Околната Среда -setting.mutemusic.name = Заглуши Музиката -setting.sfxvol.name = Сила на Звуковите Ефекти -setting.mutesound.name = Заглуши Звука -setting.crashreport.name = ИЗпращай Анонимни Отчети за Сривове -setting.communityservers.name = Fetch Community Server List -setting.savecreate.name = Автоматични Записи -setting.steampublichost.name = Public Game Visibility -setting.playerlimit.name = Лимит на Играчи -setting.chatopacity.name = Плътност на Чата -setting.lasersopacity.name = Плътност на Енергийните Лазери -setting.unitlaseropacity.name = Unit Mining Beam Opacity -setting.bridgeopacity.name = Плътност на Мостовете -setting.playerchat.name = Показвай Мехурчета с Чат -setting.showweather.name = Показвай Графики за Климата -setting.hidedisplays.name = Hide Logic Displays +setting.pixelate.name = Пикселизация +setting.minimap.name = Показвай мини-карта +setting.coreitems.name = Показвай ресурсите в ядрото +setting.position.name = Показвай позицията на играча +setting.mouseposition.name = Показвай позицията на мишката +setting.musicvol.name = Сила на звука +setting.atmosphere.name = Показвай атмосферата на планетата +setting.drawlight.name = Начертаване на мрак/светлина +setting.ambientvol.name = Сила на звука на околната среда +setting.mutemusic.name = Заглуши музиката +setting.sfxvol.name = Сила на звуковите ефекти +setting.mutesound.name = Заглуши звука +setting.crashreport.name = Изпращай анонимни отчети за сривове +setting.savecreate.name = Автоматични записи +setting.publichost.name = Видимост на публичните игри +setting.playerlimit.name = Лимит на играчи +setting.chatopacity.name = Плътност на чата +setting.lasersopacity.name = Плътност на енергийните лазери +setting.bridgeopacity.name = Плътност на мостовете +setting.playerchat.name = Показвай балончета за чата +setting.showweather.name = Показвай графики за климата +setting.hidedisplays.name = Скрий логическите екрани setting.macnotch.name = Адаптирайте интерфейса за показване на прорез setting.macnotch.description = За прилагане на промените е необходимо рестартиране -steam.friendsonly = Friends Only -steam.friendsonly.tooltip = Whether only Steam friends will be able to join your game.\nUnchecking this box will make your game public - anyone can join. +steam.friendsonly = Само приятели +steam.friendsonly.tooltip = Дали вашите приятели от Steam ще могат да се включат в играта ви.\nИзключването на тази опция ще направи играта Ви публична и всеки ще може да се присъедини. public.beta = Имайте в предвид, че бета версии на играта не могат да стартират публични игри. uiscale.reset = Размерът на интерфейса беше променен.\nНатиснете "ОК" за да потвърдите този размер.\n[scarlet]Възстановяване и рестартиране след[accent] {0}[] секунди... -uiscale.cancel = Отакз & Изход +uiscale.cancel = Отказ и изход setting.bloom.name = Сияние -keybind.title = Промени Клавишите -keybinds.mobile = [scarlet]Повечето клавиши тук не са използваеми за мобилната версия. Само основните движения се поддържат. +keybind.title = Промени клавишите +keybinds.mobile = [scarlet]Повечето клавиши не са приложими при мобилната версия. Поддържат се само основните движения. category.general.name = Основни настройки category.view.name = Изглед -category.command.name = Unit Command +category.command.name = Управление на единици category.multiplayer.name = Мрежова игра category.blocks.name = Избор на блок placement.blockselectkeys = \n[lightgray]Клавиш: [{0}, -keybind.respawn.name = Връщане при Ядрото +keybind.respawn.name = Връщане при ядрото keybind.control.name = Управляване на единица -keybind.clear_building.name = Изчистване на План За Строеж +keybind.clear_building.name = Изчистване на строежен план keybind.press = Натиснете клавиш... keybind.press.axis = Натиснете ос или клавиш... -keybind.screenshot.name = Екранна Снимка -keybind.toggle_power_lines.name = Показвай/Скрий Енергийните лазери -keybind.toggle_block_status.name = Показвай/Скрий Статуси на Блоковете +keybind.screenshot.name = Екранна снимка +keybind.toggle_power_lines.name = Показвай/Скрий енергийните лазери +keybind.toggle_block_status.name = Показвай/Скрий статута на блоковете keybind.move_x.name = Движение по X keybind.move_y.name = Движение по Y -keybind.mouse_move.name = Следвай Мишката -keybind.pan.name = Панорамен Изглед +keybind.mouse_move.name = Следвай мишката +keybind.pan.name = Панорамен изглед keybind.boost.name = Ускорение -keybind.command_mode.name = Command Mode -keybind.command_queue.name = Unit Command Queue -keybind.create_control_group.name = Create Control Group -keybind.cancel_orders.name = Cancel Orders -keybind.unit_stance_shoot.name = Unit Stance: Shoot -keybind.unit_stance_hold_fire.name = Unit Stance: Hold Fire -keybind.unit_stance_pursue_target.name = Unit Stance: Pursue Target -keybind.unit_stance_patrol.name = Unit Stance: Patrol -keybind.unit_stance_ram.name = Unit Stance: Ram -keybind.unit_command_move.name = Unit Command: Move -keybind.unit_command_repair.name = Unit Command: Repair -keybind.unit_command_rebuild.name = Unit Command: Rebuild -keybind.unit_command_assist.name = Unit Command: Assist -keybind.unit_command_mine.name = Unit Command: Mine -keybind.unit_command_boost.name = Unit Command: Boost -keybind.unit_command_load_units.name = Unit Command: Load Units -keybind.unit_command_load_blocks.name = Unit Command: Load Blocks -keybind.unit_command_unload_payload.name = Unit Command: Unload Payload +keybind.command_mode.name = Команден режим +keybind.command_queue.name = Последователни заповеди +keybind.create_control_group.name = Създаване на обща група +keybind.cancel_orders.name = Отменяне на заповедите +keybind.unit_stance_shoot.name = Поведение: Стрелба +keybind.unit_stance_hold_fire.name = Поведение: Не стреляй +keybind.unit_stance_pursue_target.name = Поведение: Преследвай целта +keybind.unit_stance_patrol.name = Поведение: Патрул +keybind.unit_stance_ram.name = Поведение: Забий се +keybind.unit_command_move.name = Команда: Движение +keybind.unit_command_repair.name = Команда: Поправка +keybind.unit_command_rebuild.name = Команда: Ремонт +keybind.unit_command_assist.name = Команда: Съдействие +keybind.unit_command_mine.name = Команда: Копаене +keybind.unit_command_boost.name = Команда: Подсилване +keybind.unit_command_load_units.name = Команда: Натовари единици +keybind.unit_command_load_blocks.name = Команда: Натовари блокове +keybind.unit_command_unload_payload.name = Команда: Разтовари keybind.unit_command_enter_payload.name = Unit Command: Enter Payload -keybind.unit_command_loop_payload.name = Unit Command: Loop Unit Transfer -keybind.rebuild_select.name = Rebuild Region -keybind.schematic_select.name = Избери Регион -keybind.schematic_menu.name = Меню със Схеми -keybind.schematic_flip_x.name = Завърти Схема по X -keybind.schematic_flip_y.name = Завърти Схема по Y -keybind.category_prev.name = Предишна Категория -keybind.category_next.name = Следваща Категория -keybind.block_select_left.name = Избор на Блок: Наляво -keybind.block_select_right.name = Избор на Блок: Надясно -keybind.block_select_up.name = Избор на Блок: Нагоре -keybind.block_select_down.name = Избор на Блок: Надолу -keybind.block_select_01.name = Избор на Блок: Категория 1 -keybind.block_select_02.name = Избор на Блок: Категория 2 -keybind.block_select_03.name = Избор на Блок: Категория 3 -keybind.block_select_04.name = Избор на Блок: Категория 4 -keybind.block_select_05.name = Избор на Блок: Категория 5 -keybind.block_select_06.name = Избор на Блок: Категория 6 -keybind.block_select_07.name = Избор на Блок: Категория 7 -keybind.block_select_08.name = Избор на Блок: Категория 8 -keybind.block_select_09.name = Избор на Блок: Категория 9 -keybind.block_select_10.name = Избор на Блок: Категория 10 -keybind.fullscreen.name = Превключи на Цял Екран -keybind.select.name = Избери/Стреляй -keybind.diagonal_placement.name = Диагонално Поставяне -keybind.pick.name = Вземи Блок -keybind.break_block.name = Унищожи Блок -keybind.select_all_units.name = Select All Units -keybind.select_all_unit_factories.name = Select All Unit Factories +keybind.rebuild_select.name = Възстановяване на региона +keybind.schematic_select.name = Избери регион +keybind.schematic_menu.name = Меню със схеми +keybind.schematic_flip_x.name = Завърти схема по X +keybind.schematic_flip_y.name = Завърти схема по Y +keybind.category_prev.name = Предишна категория +keybind.category_next.name = Следваща категория +keybind.block_select_left.name = Избор на блок: Наляво +keybind.block_select_right.name = Избор на блок: Надясно +keybind.block_select_up.name = Избор на блок: Нагоре +keybind.block_select_down.name = Избор на блок: Надолу +keybind.block_select_01.name = Избор на блок: Категория 1 +keybind.block_select_02.name = Избор на блок: Категория 2 +keybind.block_select_03.name = Избор на блок: Категория 3 +keybind.block_select_04.name = Избор на блок: Категория 4 +keybind.block_select_05.name = Избор на блок: Категория 5 +keybind.block_select_06.name = Избор на блок: Категория 6 +keybind.block_select_07.name = Избор на блок: Категория 7 +keybind.block_select_08.name = Избор на блок: Категория 8 +keybind.block_select_09.name = Избор на блок: Категория 9 +keybind.block_select_10.name = Избор на блок: Категория 10 +keybind.fullscreen.name = Превключи на цял екран +keybind.select.name = Избери/Стрелба +keybind.diagonal_placement.name = Диагонално поставяне +keybind.pick.name = Вземи блок +keybind.break_block.name = Унищожи блок +keybind.select_all_units.name = Избери всички единици +keybind.select_all_unit_factories.name = Избиране на всички фабрики за единици keybind.deselect.name = Премахни избора -keybind.pickupCargo.name = Вземи Товар -keybind.dropCargo.name = Остави Товар +keybind.pickupCargo.name = Вземи товар +keybind.dropCargo.name = Остави товар keybind.shoot.name = Стреляй keybind.zoom.name = Увеличи keybind.menu.name = Меню keybind.pause.name = Пауза -keybind.pause_building.name = Спри/Продължи Строеж -keybind.minimap.name = Мини-Карта +keybind.pause_building.name = Спри/Продължи строеж +keybind.minimap.name = Мини-карта keybind.planet_map.name = Глобус/Карта на света keybind.research.name = Проучвания -keybind.block_info.name = Информация за Блок +keybind.block_info.name = Информация за блок keybind.chat.name = Чат -keybind.player_list.name = Списък с Играчи +keybind.player_list.name = Списък с играчи keybind.console.name = Конзола keybind.rotate.name = Завърти -keybind.rotateplaced.name = Завърти Съществуващ Блок (задържане) -keybind.toggle_menus.name = Покажи/Скрий Менюта +keybind.rotateplaced.name = Завърти съществуващ блок (задържане) +keybind.toggle_menus.name = Покажи/Скрий менюта keybind.chat_history_prev.name = Предишно съобщение keybind.chat_history_next.name = Следващо съобщение keybind.chat_scroll.name = Превъртане на чата keybind.chat_mode.name = Смени режим на чат -keybind.drop_unit.name = Остави Единица -keybind.zoom_minimap.name = Увеличи Мини-Карта +keybind.drop_unit.name = Остави единица +keybind.zoom_minimap.name = Увеличи мини-карта mode.help.title = Описание на режими -mode.survival.name = Оцеляване -mode.survival.description = Нормалният режим на играта. Ограничени ресурси и автоматични вълни от нападатели.\n[gray]Картата трябва да съдържа начална точка на враговете. + +mode.survival.description = Нормалният режим на играта. Ограничени ресурси и автоматични вълни от нападатели.\n[gray]Картата трябва да съдържа начална точка за враговете. mode.sandbox.name = Пясъчник mode.sandbox.description = Безкрайни ресурси и безкрайно време между вълните от нападатели. mode.editor.name = Редактор -mode.pvp.name = Играч Срещу Играч +mode.pvp.name = Играч срещу играч mode.pvp.description = Играйте срещу други играчи в локалната мрежа.\n[gray]Картата трябва да съдържа поне 2 ядра в различни цветове. mode.attack.name = Нападение mode.attack.description = Унищожете вражеската база. \n[gray]Картата трябва да съдържа червено ядро. -mode.custom = Персонализирани Правила -rules.invaliddata = Invalid clipboard data. -rules.hidebannedblocks = Hide Banned Blocks +mode.custom = Персонализирани правила +rules.invaliddata = Невалидни данни от клипборда. +rules.hidebannedblocks = Скрий забранените блокове rules.infiniteresources = Безкрайни Ресурси -rules.onlydepositcore = Only Allow Core Depositing -rules.derelictrepair = Allow Derelict Block Repair -rules.reactorexplosions = Експлозиращи Реактори -rules.coreincinerates = Унищожаване на Ресурси при Преливане -rules.disableworldprocessors = Disable World Processors -rules.schematic = Позволена Употребата на Схеми +rules.onlydepositcore = Разрешете доставяне само в ядрото +rules.derelictrepair = Разрешете поправянето на изоставени блокове +rules.reactorexplosions = Експлозивни реактори +rules.coreincinerates = Унищожаване на ресурси при преливане +rules.disableworldprocessors = Изключване на процесорите за света +rules.schematic = Позволена употребата на схеми rules.wavetimer = Таймер за Вълни -rules.wavesending = Wave Sending -rules.allowedit = Allow Editing Rules -rules.allowedit.info = When enabled, the player can edit rules in-game via the button in the bottom left corner of the Pause menu. -rules.alloweditworldprocessors = Allow Editing World Processors -rules.alloweditworldprocessors.info = When enabled, world logic blocks can be placed and edited even outside the editor. +rules.wavesending = Изпращане на вълни +rules.allowedit = Позволи е редактирането на правилата +rules.allowedit.info = Когато включите тази опция, играчът може да променя правилата в играта чрез менюто Пауза и копчето в долният ляв ъгъл. rules.waves = Вълни -rules.airUseSpawns = Air units use spawn points -rules.attack = Режим Атака -rules.buildai = Base Builder AI -rules.buildaitier = Builder AI Tier +rules.airUseSpawns = Въздушните единици използват точки за поява +rules.attack = Режим атака +rules.buildai = ИИ на строителят на бази +rules.buildaitier = Степен на ИИ строителя rules.rtsai = RTS AI -rules.rtsai.campaign = RTS Attack AI -rules.rtsai.campaign.info = In attack maps, makes units group up and attack player bases in a more intelligent manner. -rules.rtsminsquadsize = Min Squad Size -rules.rtsmaxsquadsize = Max Squad Size -rules.rtsminattackweight = Min Attack Weight -rules.cleanupdeadteams = Clean Up Defeated Team Buildings (PvP) -rules.corecapture = Capture Core On Destruction -rules.polygoncoreprotection = Polygonal Core Protection -rules.placerangecheck = Placement Range Check -rules.enemyCheat = Безкрайни Ресурси за Ботът (Червеният Отбор) -rules.blockhealthmultiplier = Множител на Точките Живот на Блокове -rules.blockdamagemultiplier = Множител на Щетите на Блокове -rules.unitbuildspeedmultiplier = Множител на Скоростта на Производство на Единици -rules.unitcostmultiplier = Unit Cost Multiplier -rules.unithealthmultiplier = Множител на Точките Живот на Единици -rules.unitdamagemultiplier = Множител на Щетите на Единици -rules.unitcrashdamagemultiplier = Unit Crash Damage Multiplier -rules.unitminespeedmultiplier = Unit Mine Speed Multiplier -rules.solarmultiplier = Solar Power Multiplier -rules.unitcapvariable = Ядрата Увеличават Максималния Брой Единици -rules.unitpayloadsexplode = Carried Payloads Explode With The Unit -rules.unitcap = Максимален Брой Единици -rules.limitarea = Limit Map Area -rules.enemycorebuildradius = Радиус на Защитена от Строене Зона Около Ядрата:[lightgray] (полета) -rules.wavespacing = Време Между Вълните:[lightgray] (секунди) -rules.initialwavespacing = Initial Wave Spacing:[lightgray] (sec) -rules.buildcostmultiplier = Множител на Необходимите Ресурси за Строене -rules.buildspeedmultiplier = Множител на Скоростта за Строене -rules.deconstructrefundmultiplier = Множител на Възстановени Ресурси при Деконструкция -rules.waitForWaveToEnd = Вълните Изчакват за Врагове -rules.wavelimit = Map Ends After Wave -rules.dropzoneradius = Радиус на Начална Точка на Враговете:[lightgray] (полета) -rules.unitammo = Единиците се Нуждаят от Боеприпаси -rules.enemyteam = Enemy Team -rules.playerteam = Player Team +rules.rtsminsquadsize = Мин. размер на взводовете +rules.rtsmaxsquadsize = Макс. размер на взводовете +rules.rtsminattackweight = Мин. атакуваща тежест +rules.cleanupdeadteams = Изчисти сградите на победения отбор (PvP) +rules.corecapture = Завладей ядро при унищожение +rules.polygoncoreprotection = Полигонална защита на ядрото +rules.placerangecheck = Проверка за обхват при поставяне +rules.enemyCheat = Безкрайни ресурси за компютъра (Червеният отбор) +rules.blockhealthmultiplier = Множител на точките живот на блокове +rules.blockdamagemultiplier = Множител на щетите на блокове +rules.unitbuildspeedmultiplier = Множител на скоростта на производство на единици +rules.unitcostmultiplier = Множител на цената за единици +rules.unithealthmultiplier = Множител на точките живот на единици +rules.unitdamagemultiplier = Множител на щетите на единици +rules.unitcrashdamagemultiplier = Множител на вредата от разбиващи се единици +rules.solarmultiplier = Множител на слънчевата енергия +rules.unitcapvariable = Ядрата увеличават максималния брой единици +rules.unitpayloadsexplode = Носеният товар експлодира с единицата +rules.unitcap = Максимален брой единици +rules.limitarea = Ограничаване на картата +rules.enemycorebuildradius = Радиус на защитена от строене зона около ядрата:[lightgray] (полета) +rules.wavespacing = Време между вълните:[lightgray] (секунди) +rules.initialwavespacing = Първоначално разполагане на вълните:[lightgray] (sec) +rules.buildcostmultiplier = Множител на необходимите ресурси за строеж +rules.buildspeedmultiplier = Множител на скоростта на строене +rules.deconstructrefundmultiplier = Множител на възстановени ресурси при деконструкция +rules.waitForWaveToEnd = Вълните изчакват враговете +rules.wavelimit = Картата приключва след вълна +rules.dropzoneradius = Радиус на начална точка на враговете:[lightgray] (полета) +rules.unitammo = Единиците се нуждаят от боеприпаси +rules.enemyteam = Вражески отбор +rules.playerteam = Отбор на играча + rules.title.waves = Вълни -rules.title.resourcesbuilding = Ресурси & Постройки +rules.title.resourcesbuilding = Ресурси и постройки rules.title.enemy = Врагове rules.title.unit = Единици rules.title.experimental = Експериментално -rules.title.environment = Околна Среда -rules.title.teams = Teams -rules.title.planet = Planet +rules.title.environment = Околна среда +rules.title.teams = Отбори +rules.title.planet = Планета rules.lighting = Светкавици -rules.fog = Fog of War -rules.invasions = Enemy Sector Invasions -rules.legacylaunchpads = Legacy Launch Pad Mechanics -rules.legacylaunchpads.info = Allows using launch pads without landing pads, as in 7.0. -landingpad.legacy.disabled = [scarlet]\ue815 Disabled[lightgray] (Legacy Launch Pads enabled) -rules.showspawns = Show Enemy Spawns -rules.randomwaveai = Unpredictable Wave AI +rules.fog = Мъгла на войната rules.fire = Огън rules.anyenv = -rules.explosions = Block/Unit Explosion Damage -rules.ambientlight = Светлина от Околната Среда +rules.explosions = Блокирай/Единици вреда от експлозия +rules.ambientlight = Светлина от околната среда rules.weather = Климат rules.weather.frequency = Честота: rules.weather.always = Винаги rules.weather.duration = Продължителност: -rules.randomwaveai.info = Makes units spawned in waves target random structures instead of directly attacking the core or power generators. -rules.placerangecheck.info = Prevents players from placing anything near enemy buildings. When trying to place a turret, the range is increased, so the turret will not be able to reach the enemy. -rules.onlydepositcore.info = Prevents units from depositing items into any buildings except cores. +rules.placerangecheck.info = Не позволява на играчите да поставят нещо в близост до вражеските сгради. Когато се опитват да поставят оръдие, обхватът е увеличен, за да не може оръдието да достигне врага. +rules.onlydepositcore.info = Не позволява на единиците да поставят предмети, в която и да е сграда, с изключение на ядро. + content.item.name = Предмети content.liquid.name = Течности content.unit.name = Единици -content.block.name = Блокчета -content.status.name = Статус-Ефекти +content.block.name = Блокове +content.status.name = Статус-ефекти content.sector.name = Сектори -content.team.name = Factions -wallore = (Wall) +content.team.name = Групировки +wallore = (Стена) item.copper.name = Мед item.lead.name = Олово @@ -1447,30 +1424,30 @@ item.thorium.name = Торий item.silicon.name = Силикон item.plastanium.name = Пластаний item.phase-fabric.name = Фазова тъкан -item.surge-alloy.name = Импулсна Сплав -item.spore-pod.name = Сгъстени Спори +item.surge-alloy.name = Импулсна сплав +item.spore-pod.name = Сгъстени спори item.sand.name = Пясък item.blast-compound.name = Взривно съединение item.pyratite.name = Пиратит -item.metaglass.name = Метастъкло +item.metaglass.name = Мета-стъкло item.scrap.name = Скрап -item.fissile-matter.name = Fissile Matter -item.beryllium.name = Beryllium -item.tungsten.name = Tungsten -item.oxide.name = Oxide -item.carbide.name = Carbide -item.dormant-cyst.name = Dormant Cyst +item.fissile-matter.name = Шистена материя +item.beryllium.name = Берилий +item.tungsten.name = Волфрам +item.oxide.name = Оксид +item.carbide.name = Карбид +item.dormant-cyst.name = Латентна циста liquid.water.name = Вода liquid.slag.name = Шлака liquid.oil.name = Нефт -liquid.cryofluid.name = Криофлуид -liquid.neoplasm.name = Neoplasm -liquid.arkycite.name = Arkycite -liquid.gallium.name = Gallium -liquid.ozone.name = Ozone -liquid.hydrogen.name = Hydrogen -liquid.nitrogen.name = Nitrogen -liquid.cyanogen.name = Cyanogen +liquid.cryofluid.name = Криотечност +liquid.neoplasm.name = Неоплазма +liquid.arkycite.name = Аркицид +liquid.gallium.name = Галий +liquid.ozone.name = Озон +liquid.hydrogen.name = Водород +liquid.nitrogen.name = Въглерод +liquid.cyanogen.name = Цианоген unit.dagger.name = Кинжал unit.mace.name = Боздуган @@ -1487,7 +1464,7 @@ unit.flare.name = Факел unit.horizon.name = Хоризонт unit.zenith.name = Зенит unit.antumbra.name = Антумбра -unit.eclipse.name = Еклипс +unit.eclipse.name = Затъмнение unit.mono.name = Моно unit.poly.name = Поли unit.mega.name = Мега @@ -1498,608 +1475,603 @@ unit.minke.name = Минке unit.bryde.name = Брайд unit.sei.name = Сей unit.omura.name = Омура -unit.retusa.name = Retusa -unit.oxynoe.name = Oxynoe -unit.cyerce.name = Cyerce -unit.aegires.name = Aegires -unit.navanax.name = Navanax +unit.retusa.name = Ретуза +unit.oxynoe.name = Оксиное +unit.cyerce.name = Цирсе +unit.aegires.name = Ежир +unit.navanax.name = Наванакс unit.alpha.name = Алфа unit.beta.name = Бета -unit.gamma.name = Гана +unit.gamma.name = Гама unit.scepter.name = Скиптър -unit.reign.name = Реиг +unit.reign.name = Власт unit.vela.name = Вела -unit.corvus.name = Корвус -unit.stell.name = Stell -unit.locus.name = Locus -unit.precept.name = Precept -unit.vanquish.name = Vanquish -unit.conquer.name = Conquer -unit.merui.name = Merui -unit.cleroi.name = Cleroi -unit.anthicus.name = Anthicus -unit.tecta.name = Tecta -unit.collaris.name = Collaris -unit.elude.name = Elude -unit.avert.name = Avert -unit.obviate.name = Obviate -unit.quell.name = Quell -unit.disrupt.name = Disrupt -unit.evoke.name = Evoke -unit.incite.name = Incite -unit.emanate.name = Emanate -unit.manifold.name = Manifold -unit.assembly-drone.name = Assembly Drone -unit.latum.name = Latum -unit.renale.name = Renale +unit.corvus.name = Гарван +unit.stell.name = Щел +unit.locus.name = Рояк +unit.precept.name = Правило +unit.vanquish.name = Победа +unit.conquer.name = Завоевание +unit.merui.name = Меруи +unit.cleroi.name = Клерой +unit.anthicus.name = Антик +unit.tecta.name = Текта +unit.collaris.name = Коларис +unit.elude.name = Бегач +unit.avert.name = Отклонение +unit.obviate.name = Заличител +unit.quell.name = Потушение +unit.disrupt.name = Възпиране +unit.evoke.name = Пробуждане +unit.incite.name = Подстрекател +unit.emanate.name = Еманация +unit.manifold.name = Разклонение +unit.assembly-drone.name = Дрон-строител +unit.latum.name = Латум +unit.renale.name = Ренал block.parallax.name = Паралакс block.cliff.name = Скала -block.sand-boulder.name = Пясъчен Камък -block.basalt-boulder.name = Базалтов Камък +block.sand-boulder.name = Пясъчен камък +block.basalt-boulder.name = Базалтов камък block.grass.name = Трева block.molten-slag.name = Шлака -block.pooled-cryofluid.name = Cryofluid +block.pooled-cryofluid.name = Криотечност block.space.name = Космос block.salt.name = Сол -block.salt-wall.name = Стена от Сол +block.salt-wall.name = Стена от сол block.pebbles.name = Камъчета block.tendrils.name = Пипала -block.sand-wall.name = Стена от Пясък -block.spore-pine.name = Топка от Спори -block.spore-wall.name = Стена от Спори +block.sand-wall.name = Стена от пясък +block.spore-pine.name = Топка от спори +block.spore-wall.name = Стена от спори block.boulder.name = Камък -block.snow-boulder.name = Снежна Скала +block.snow-boulder.name = Снежна скала block.snow-pine.name = Снежна топка block.shale.name = Глина -block.shale-boulder.name = Глинена Скала +block.shale-boulder.name = Глинена скала block.moss.name = Мъх block.shrubs.name = Храсти block.spore-moss.name = Спорест мъх -block.shale-wall.name = Стена от Храсти -block.scrap-wall.name = Стена от Скрап -block.scrap-wall-large.name = Голяма Стена от Скрап -block.scrap-wall-huge.name = Огромня Стена от Скрап -block.scrap-wall-gigantic.name = Гигантска Стена от Скрап +block.shale-wall.name = Стена от храсти +block.scrap-wall.name = Стена от скрап +block.scrap-wall-large.name = Голяма стена от скрап +block.scrap-wall-huge.name = Огромна стена от скрап +block.scrap-wall-gigantic.name = Гигантска стена от скрап block.thruster.name = Двигател block.kiln.name = Пещ -block.graphite-press.name = Графитна Преса -block.multi-press.name = Мулти-Преса -block.constructing = {0} [lightgray](конструиране) -block.spawn.name = Вражеска Начална Точка -block.remove-wall.name = Remove Wall -block.remove-ore.name = Remove Ore -block.core-shard.name = Ядро: Шард -block.core-foundation.name = Core: Фондация -block.core-nucleus.name = Core: Център -block.deep-water.name = Дълбока Вода +block.graphite-press.name = Графитна преса +block.multi-press.name = Мулти-преса +block.constructing = {0} [lightgray](изграждане) +block.spawn.name = Вражеска начална точка +block.core-shard.name = Ядро: Частица +block.core-foundation.name = Ядро: Фондация +block.core-nucleus.name = Ядро: Център +block.deep-water.name = Дълбока вода block.shallow-water.name = Вода -block.tainted-water.name = Замърсена Вода -block.deep-tainted-water.name = Deep Tainted Water -block.darksand-tainted-water.name = Тъмен Пясък - Замърсена Вода +block.tainted-water.name = Замърсена вода +block.deep-tainted-water.name = Дълбоко замърсена вода +block.darksand-tainted-water.name = Тъмен пясък - Замърсена вода block.tar.name = Катран block.stone.name = Камък block.sand-floor.name = Пясък -block.darksand.name = Тъмен Пясък +block.darksand.name = Тъмен пясък block.ice.name = Лед block.snow.name = Сняг block.crater-stone.name = Кратери block.sand-water.name = Пясък - Вода block.darksand-water.name = Тъмен Пясък - Вода -block.char.name = Овъглен Камък +block.char.name = Овъглен камък block.dacite.name = Дацит -block.rhyolite.name = Rhyolite -block.dacite-wall.name = Стена от Дацит -block.dacite-boulder.name = Скала от Дацит +block.rhyolite.name = Риолит +block.dacite-wall.name = Стена от дацит +block.dacite-boulder.name = Скала от дацит block.ice-snow.name = Лед - Сняг -block.stone-wall.name = Стена от Камък -block.ice-wall.name = Стена от Лед -block.snow-wall.name = Стена от Сняг -block.dune-wall.name = Стена от Дюна +block.stone-wall.name = Стена от камък +block.ice-wall.name = Стена от лед +block.snow-wall.name = Стена от сняг +block.dune-wall.name = Стена от дюна block.pine.name = Бор block.dirt.name = Пръст -block.dirt-wall.name = Стена от Пръст +block.dirt-wall.name = Стена от пръст block.mud.name = Кал -block.white-tree-dead.name = Мъртво Бяло Дърво -block.white-tree.name = Бяло Дърво -block.spore-cluster.name = Клъстер от спори -block.metal-floor.name = Метален Под 1 -block.metal-floor-2.name = Метален Под 2 -block.metal-floor-3.name = Метален Под 3 -block.metal-floor-4.name = Metal Floor 4 -block.metal-floor-5.name = Метален Под 4 -block.metal-floor-damaged.name = Увреден Метален Под -block.dark-panel-1.name = Тъмен Панел 1 -block.dark-panel-2.name = Тъмен Панел 2 -block.dark-panel-3.name = Тъмен Панел 3 -block.dark-panel-4.name = Тъмен Панел 4 -block.dark-panel-5.name = Тъмен Панел 5 -block.dark-panel-6.name = Тъмен Панел 6 -block.dark-metal.name = Тъмен Метал +block.white-tree-dead.name = Мъртво бяло дърво +block.white-tree.name = Бяло дърво +block.spore-cluster.name = Купчина спори +block.metal-floor.name = Метален под 1 +block.metal-floor-2.name = Метален под 2 +block.metal-floor-3.name = Метален под 3 +block.metal-floor-4.name = Метален под 4 +block.metal-floor-5.name = Метален под 4 +block.metal-floor-damaged.name = Повреден метален под +block.dark-panel-1.name = Тъмен панел 1 +block.dark-panel-2.name = Тъмен панел 2 +block.dark-panel-3.name = Тъмен панел 3 +block.dark-panel-4.name = Тъмен панел 4 +block.dark-panel-5.name = Тъмен панел 5 +block.dark-panel-6.name = Тъмен панел 6 +block.dark-metal.name = Тъмен метал block.basalt.name = Базалт -block.hotrock.name = Топла Скала -block.magmarock.name = Магмена Скала -block.copper-wall.name = Стена от Мед -block.copper-wall-large.name = Голяма Стена от Мед -block.titanium-wall.name = Стена от Титан -block.titanium-wall-large.name = Голяма Стена от Титан -block.plastanium-wall.name = Стена от Пластаний -block.plastanium-wall-large.name = Голяма Стена от Пластаний -block.phase-wall.name = Фазова Стена -block.phase-wall-large.name = Голяма Фазова Стена -block.thorium-wall.name = Стена от Торий -block.thorium-wall-large.name = Голяма Стена от Торий +block.hotrock.name = Топла скала +block.magmarock.name = Магмена скала +block.copper-wall.name = Стена от мед +block.copper-wall-large.name = Голяма стена от мед +block.titanium-wall.name = Стена от титан +block.titanium-wall-large.name = Голяма стена от титан +block.plastanium-wall.name = Стена от пластаний +block.plastanium-wall-large.name = Голяма стена от пластаний +block.phase-wall.name = Фазова стена +block.phase-wall-large.name = Голяма фазова стена +block.thorium-wall.name = Стена от торий +block.thorium-wall-large.name = Голяма стена от торий block.door.name = Врата -block.door-large.name = Голяма Врата +block.door-large.name = Голяма врата block.duo.name = Дуо block.scorch.name = Горелка block.scatter.name = Пръскач block.hail.name = Градушка block.lancer.name = Улан -block.conveyor.name = Конвейер -block.titanium-conveyor.name = Титаниев Конвейер -block.plastanium-conveyor.name = Пластаниев Конвейер -block.armored-conveyor.name = Брониран Конвейер +block.conveyor.name = Лента +block.titanium-conveyor.name = Титаниева лента +block.plastanium-conveyor.name = Пластаниева лента +block.armored-conveyor.name = Бронирана лента block.junction.name = Кръстовище block.router.name = Рутер block.distributor.name = Разпределител -block.sorter.name = Сортирач -block.inverted-sorter.name = Обърнат сортирач +block.sorter.name = Сортировач +block.inverted-sorter.name = Обърнат сортировач block.message.name = Съобщение -block.reinforced-message.name = Reinforced Message -block.world-message.name = World Message -block.world-switch.name = World Switch +block.reinforced-message.name = Подсилено съобщение +block.world-message.name = Глобално съобщение +block.world-switch.name = Глобален превключвател block.illuminator.name = Осветител -block.overflow-gate.name = Преливаща Порта -block.underflow-gate.name = Обратна Преливаща Порта -block.silicon-smelter.name = Силиконова Пещ -block.phase-weaver.name = Тъкач на Фазова тъкан +block.overflow-gate.name = Преливаща порта +block.underflow-gate.name = Обратна преливаща порта +block.silicon-smelter.name = Силиконова пещ +block.phase-weaver.name = Тъкач на фазова тъкан block.pulverizer.name = Пулверизатор -block.cryofluid-mixer.name = Криофлуид Миксер +block.cryofluid-mixer.name = Миксер за криотечност block.melter.name = Разтопител -block.incinerator.name = Инсинератор -block.spore-press.name = Преса за Спори +block.incinerator.name = Крематорий +block.spore-press.name = Преса за спори block.separator.name = Разделител -block.coal-centrifuge.name = Центрифуга за Въглища -block.power-node.name = Електрически Възел -block.power-node-large.name = Голям Електрически Възел +block.coal-centrifuge.name = Центрифуга за въглища +block.power-node.name = Електрически възел +block.power-node-large.name = Голям електрически възел block.surge-tower.name = Трафопост block.diode.name = Диод block.battery.name = Батерия -block.battery-large.name = Голяма Батерия -block.combustion-generator.name = Горивен Генератор -block.steam-generator.name = Парен Генератор -block.differential-generator.name = Диференциален Генератор +block.battery-large.name = Голяма батерия +block.combustion-generator.name = Горивен генератор +block.steam-generator.name = Парен генератор +block.differential-generator.name = Диференциален генератор block.impact-reactor.name = Ударен реактор -block.mechanical-drill.name = Механично Свредло -block.pneumatic-drill.name = Пневматично Свредло -block.laser-drill.name = Лазерно Свредло -block.water-extractor.name = Водна Сонда +block.mechanical-drill.name = Механично свредло +block.pneumatic-drill.name = Пневматично свредло +block.laser-drill.name = Лазерно свредло +block.water-extractor.name = Водна сонда block.cultivator.name = Култиватор block.conduit.name = Тръбопровод -block.mechanical-pump.name = Механична Помпа -block.item-source.name = Материализатор на Предмети -block.item-void.name = Дематериализатор на Предмети -block.liquid-source.name = Материализатор на Течности -block.liquid-void.name = Дематериализатор на Течности -block.power-void.name = Материализатор на Енергия -block.power-source.name = Дематериализатор на Енергия +block.mechanical-pump.name = Механична помпа +block.item-source.name = Материализатор на предмети +block.item-void.name = Дематериализатор на предмети +block.liquid-source.name = Материализатор на течности +block.liquid-void.name = Дематериализатор натТечности +block.power-void.name = Материализатор на енергия +block.power-source.name = Дематериализатор на енергия block.unloader.name = Разтоварващо устройство block.vault.name = Склад block.wave.name = Вълна block.tsunami.name = Цунами -block.swarmer.name = Ракетна Установка +block.swarmer.name = Ракетен рояк block.salvo.name = Салво block.ripple.name = Рипъл -block.phase-conveyor.name = Фазов Конвейер -block.bridge-conveyor.name = Мостов Конвейер -block.plastanium-compressor.name = Пластаниев Конвейер -block.pyratite-mixer.name = Смесител на Пиратит -block.blast-mixer.name = Смесител на Взривно съединение +block.phase-conveyor.name = Фазова лента +block.bridge-conveyor.name = Мостова лента +block.plastanium-compressor.name = Пластаниева лента +block.pyratite-mixer.name = Смесител на пиратит +block.blast-mixer.name = Смесител на взривно съединение block.solar-panel.name = Фотоволтаик -block.solar-panel-large.name = Голям Фотоволтаик -block.oil-extractor.name = Нефтена Сонда +block.solar-panel-large.name = Голям фотоволтаик +block.oil-extractor.name = Нефтена сонда block.repair-point.name = Точка за поправка -block.repair-turret.name = Repair Turret +block.repair-turret.name = Поправящо уръдие block.pulse-conduit.name = Импулсен тръбопровод block.plated-conduit.name = Тръбопровод с покритие -block.phase-conduit.name = Фазов Тръбопровод -block.liquid-router.name = Рутер за Течности -block.liquid-tank.name = Резервоар за Течности -block.liquid-container.name = Liquid Container -block.liquid-junction.name = Тръбопроводно Кръстовище -block.bridge-conduit.name = Мост за Течности +block.phase-conduit.name = Фазов тръбопровод +block.liquid-router.name = Рутер за течности +block.liquid-tank.name = Резервоар за течности +block.liquid-container.name = Контейнер за течности +block.liquid-junction.name = Тръбопроводно кръстовище +block.bridge-conduit.name = Мост за течности block.rotary-pump.name = Ротационна помпа block.thorium-reactor.name = Ториев реактор -block.mass-driver.name = Масов Преносител +block.mass-driver.name = Масов преносител block.blast-drill.name = Въздушно свредло -block.impulse-pump.name = Термична Помпа -block.thermal-generator.name = Термичен Генератор -block.surge-smelter.name = Претопител за Импулсна сплав +block.impulse-pump.name = Термична помпа +block.thermal-generator.name = Термичен генератор +block.surge-smelter.name = Претопител за импулсна сплав block.mender.name = Възстановител -block.mend-projector.name = Възстановяващ Проектор -block.surge-wall.name = Импулсна Стена -block.surge-wall-large.name = Голяма Импулсна Стена +block.mend-projector.name = Възстановяващ проектор +block.surge-wall.name = Импулсна стена +block.surge-wall-large.name = Голяма импулсна стена block.cyclone.name = Циклон block.fuse.name = Електрошок block.shock-mine.name = Мина -block.overdrive-projector.name = Ускоряващ Проектор -block.force-projector.name = Силов Проектор -block.arc.name = Волтова Дъга +block.overdrive-projector.name = Ускоряващ проектор +block.force-projector.name = Силов проектор +block.arc.name = Волтова дъга block.rtg-generator.name = RTG генератор block.spectre.name = Спектър block.meltdown.name = Разтопител block.foreshadow.name = Предвестител block.container.name = Контейнер -block.launch-pad.name = Изстрелваща Площадка -block.advanced-launch-pad.name = Launch Pad -block.landing-pad.name = Landing Pad +block.launch-pad.name = Изстрелваща площадка block.segment.name = Сегмент -block.ground-factory.name = Наземна Фабрика -block.air-factory.name = Въздушна Фабрика -block.naval-factory.name = Морска Фабрика -block.additive-reconstructor.name = Добавящ Реконструктор -block.multiplicative-reconstructor.name = Умножаващ Реконструктор -block.exponential-reconstructor.name = Експоненциален Реконструктор -block.tetrative-reconstructor.name = Тетративен Реконструктор -block.payload-conveyor.name = Товарен Конвейер -block.payload-router.name = Товарен Рутер -block.duct.name = Duct -block.duct-router.name = Duct Router -block.duct-bridge.name = Duct Bridge -block.large-payload-mass-driver.name = Large Payload Mass Driver -block.payload-void.name = Payload Void -block.payload-source.name = Payload Source +block.ground-factory.name = Наземна фабрика +block.air-factory.name = Въздушна фабрика +block.naval-factory.name = Морска фабрика +block.additive-reconstructor.name = Добавящ реконструктор +block.multiplicative-reconstructor.name = Умножаващ реконструктор +block.exponential-reconstructor.name = Експоненциален реконструктор +block.tetrative-reconstructor.name = Тетративен реконструктор +block.payload-conveyor.name = Товарна лента +block.payload-router.name = Товарен рутер +block.duct.name = Канал +block.duct-router.name = Канален рутер +block.duct-bridge.name = Канален мост +block.large-payload-mass-driver.name = Масиран доставчик на едър товар +block.payload-void.name = Товарна бездна +block.payload-source.name = Товарен източник block.disassembler.name = Разглобител -block.silicon-crucible.name = Силиконов Тигел -block.overdrive-dome.name = Ускоряващ Купол -block.interplanetary-accelerator.name = Междупланетен Ускорител -block.constructor.name = Constructor -block.constructor.description = Fabricates structures up to 2x2 tiles in size. -block.large-constructor.name = Large Constructor -block.large-constructor.description = Fabricates structures up to 4x4 tiles in size. -block.deconstructor.name = Deconstructor -block.deconstructor.description = Deconstructs structures and units. Returns 100% of build cost. -block.payload-loader.name = Payload Loader -block.payload-loader.description = Load liquids and items into blocks. -block.payload-unloader.name = Payload Unloader -block.payload-unloader.description = Unloads liquids and items from blocks. -block.heat-source.name = Heat Source -block.heat-source.description = A 1x1 block that gives virtualy infinite heat. -block.empty.name = Empty -block.rhyolite-crater.name = Rhyolite Crater -block.rough-rhyolite.name = Rough Rhyolite -block.regolith.name = Regolith -block.yellow-stone.name = Yellow Stone -block.carbon-stone.name = Carbon Stone -block.ferric-stone.name = Ferric Stone -block.ferric-craters.name = Ferric Craters -block.beryllic-stone.name = Beryllic Stone -block.crystalline-stone.name = Crystalline Stone -block.crystal-floor.name = Crystal Floor -block.yellow-stone-plates.name = Yellow Stone Plates -block.red-stone.name = Red Stone -block.dense-red-stone.name = Dense Red Stone -block.red-ice.name = Red Ice -block.arkycite-floor.name = Arkycite Floor -block.arkyic-stone.name = Arkyic Stone -block.rhyolite-vent.name = Rhyolite Vent -block.carbon-vent.name = Carbon Vent -block.arkyic-vent.name = Arkyic Vent -block.yellow-stone-vent.name = Yellow Stone Vent -block.red-stone-vent.name = Red Stone Vent -block.crystalline-vent.name = Crystalline Vent -block.redmat.name = Redmat -block.bluemat.name = Bluemat -block.core-zone.name = Core Zone -block.regolith-wall.name = Regolith Wall -block.yellow-stone-wall.name = Yellow Stone Wall -block.rhyolite-wall.name = Rhyolite Wall -block.carbon-wall.name = Carbon Wall -block.ferric-stone-wall.name = Ferric Stone Wall -block.beryllic-stone-wall.name = Beryllic Stone Wall -block.arkyic-wall.name = Arkyic Wall -block.crystalline-stone-wall.name = Crystalline Stone Wall -block.red-ice-wall.name = Red Ice Wall -block.red-stone-wall.name = Red Stone Wall -block.red-diamond-wall.name = Red Diamond Wall -block.redweed.name = Redweed -block.pur-bush.name = Pur Bush -block.yellowcoral.name = Yellowcoral -block.carbon-boulder.name = Carbon Boulder -block.ferric-boulder.name = Ferric Boulder -block.beryllic-boulder.name = Beryllic Boulder -block.yellow-stone-boulder.name = Yellow Stone Boulder -block.arkyic-boulder.name = Arkyic Boulder -block.crystal-cluster.name = Crystal Cluster -block.vibrant-crystal-cluster.name = Vibrant Crystal Cluster -block.crystal-blocks.name = Crystal Blocks -block.crystal-orbs.name = Crystal Orbs -block.crystalline-boulder.name = Crystalline Boulder -block.red-ice-boulder.name = Red Ice Boulder -block.rhyolite-boulder.name = Rhyolite Boulder -block.red-stone-boulder.name = Red Stone Boulder -block.graphitic-wall.name = Graphitic Wall -block.silicon-arc-furnace.name = Silicon Arc Furnace -block.electrolyzer.name = Electrolyzer -block.atmospheric-concentrator.name = Atmospheric Concentrator -block.oxidation-chamber.name = Oxidation Chamber -block.electric-heater.name = Electric Heater -block.slag-heater.name = Slag Heater -block.phase-heater.name = Phase Heater -block.heat-redirector.name = Heat Redirector -block.small-heat-redirector.name = Small Heat Redirector -block.heat-router.name = Heat Router -block.slag-incinerator.name = Slag Incinerator -block.carbide-crucible.name = Carbide Crucible -block.slag-centrifuge.name = Slag Centrifuge -block.surge-crucible.name = Surge Crucible -block.cyanogen-synthesizer.name = Cyanogen Synthesizer -block.phase-synthesizer.name = Phase Synthesizer -block.heat-reactor.name = Heat Reactor -block.beryllium-wall.name = Beryllium Wall -block.beryllium-wall-large.name = Large Beryllium Wall -block.tungsten-wall.name = Tungsten Wall -block.tungsten-wall-large.name = Large Tungsten Wall -block.blast-door.name = Blast Door -block.carbide-wall.name = Carbide Wall -block.carbide-wall-large.name = Large Carbide Wall -block.reinforced-surge-wall.name = Reinforced Surge Wall -block.reinforced-surge-wall-large.name = Large Reinforced Surge Wall -block.shielded-wall.name = Shielded Wall -block.radar.name = Radar -block.build-tower.name = Build Tower -block.regen-projector.name = Regen Projector -block.shockwave-tower.name = Shockwave Tower -block.shield-projector.name = Shield Projector -block.large-shield-projector.name = Large Shield Projector -block.armored-duct.name = Armored Duct -block.overflow-duct.name = Overflow Duct -block.underflow-duct.name = Underflow Duct -block.duct-unloader.name = Duct Unloader -block.surge-conveyor.name = Surge Conveyor -block.surge-router.name = Surge Router -block.unit-cargo-loader.name = Unit Cargo Loader -block.unit-cargo-unload-point.name = Unit Cargo Unload Point -block.reinforced-pump.name = Reinforced Pump -block.reinforced-conduit.name = Reinforced Conduit -block.reinforced-liquid-junction.name = Reinforced Liquid Junction -block.reinforced-bridge-conduit.name = Reinforced Bridge Conduit -block.reinforced-liquid-router.name = Reinforced Liquid Router -block.reinforced-liquid-container.name = Reinforced Liquid Container -block.reinforced-liquid-tank.name = Reinforced Liquid Tank -block.beam-node.name = Beam Node -block.beam-tower.name = Beam Tower -block.beam-link.name = Beam Link -block.turbine-condenser.name = Turbine Condenser -block.chemical-combustion-chamber.name = Chemical Combustion Chamber -block.pyrolysis-generator.name = Pyrolysis Generator +block.silicon-crucible.name = Силиконов тигел +block.overdrive-dome.name = Ускоряващ купол +block.interplanetary-accelerator.name = Междупланетен ускорител +block.constructor.name = Строител +block.constructor.description = Изработва сгради до размер 2х2 полета. +block.large-constructor.name = Едър строител +block.large-constructor.description = Изработва сгради до размер 4х4 полета. +block.deconstructor.name = Деконструктор +block.deconstructor.description = Разглабя сгради и единици. Възстановява 100% от разходите. +block.payload-loader.name = Товарител +block.payload-loader.description = Товари течности и предмети в блокове. +block.payload-unloader.name = Разтоварител +block.payload-unloader.description = Разтоварва течности и предмети от блокове. +block.heat-source.name = Топлинен източник +block.heat-source.description = Блок в размер 1х1. Отделя почти безкрайна топлина. +block.empty.name = Празно +block.rhyolite-crater.name = Риолитен кратер +block.rough-rhyolite.name = Суров риолит +block.regolith.name = Реголит +block.yellow-stone.name = Жълт камък +block.carbon-stone.name = Въглероден камък +block.ferric-stone.name = Железен камък +block.ferric-craters.name = Железни кратери +block.beryllic-stone.name = Камък от берил +block.crystalline-stone.name = Кристален камък +block.crystal-floor.name = Кристален под +block.yellow-stone-plates.name = Жълти каменни плочи +block.red-stone.name = Червен камък +block.dense-red-stone.name = Гъст червен камък +block.red-ice.name = Червен лед +block.arkycite-floor.name = Аркициден под +block.arkyic-stone.name = Аркичен камък +block.rhyolite-vent.name = Риолитен отвор +block.carbon-vent.name = Въглероден отвор +block.arkyic-vent.name = Аркичен отвор +block.yellow-stone-vent.name = Отвор за жълт камък +block.red-stone-vent.name = Отвор за червен камък +block.crystalline-vent.name = Кристален отвор +block.redmat.name = Червен килим +block.bluemat.name = Син килим +block.core-zone.name = Зона за ядро +block.regolith-wall.name = Реголитна стена +block.yellow-stone-wall.name = Стена от жълт камък +block.rhyolite-wall.name = Риолитна стена +block.carbon-wall.name = Въглеродна стена +block.ferric-stone-wall.name = Железна стена +block.beryllic-stone-wall.name = Стена от берил +block.arkyic-wall.name = Аркична стена +block.crystalline-stone-wall.name = Кристална стена +block.red-ice-wall.name = Стена от червен лед +block.red-stone-wall.name = Стена от червен камък +block.red-diamond-wall.name = Стена от червен диамант +block.redweed.name = Червена тръстика +block.pur-bush.name = Пур храст +block.yellowcoral.name = Жълт корал +block.carbon-boulder.name = Въглеродна скала +block.ferric-boulder.name = Желязна скала +block.beryllic-boulder.name = Скала от берил +block.yellow-stone-boulder.name = Скала от жълт камък +block.arkyic-boulder.name = Аркична скала +block.crystal-cluster.name = Куп кристали +block.vibrant-crystal-cluster.name = Куп от ярки кристали +block.crystal-blocks.name = Кристални блокове +block.crystal-orbs.name = Кристални кълба +block.crystalline-boulder.name = Кристални скали +block.red-ice-boulder.name = Скала от червен лед +block.rhyolite-boulder.name = Риолитна скала +block.red-stone-boulder.name = Скала от червен камък +block.graphitic-wall.name = Стена от графит +block.silicon-arc-furnace.name = Аркова фурна за силикон +block.electrolyzer.name = Електролизатор +block.atmospheric-concentrator.name = Концентратор на атмосфера +block.oxidation-chamber.name = Оксидационна камера +block.electric-heater.name = Електрически нагревател +block.slag-heater.name = Нагревател за слаг +block.phase-heater.name = Фазов нагревател +block.heat-redirector.name = Разпределител на топлина +block.heat-router.name = Топлинен рутер +block.slag-incinerator.name = Фурна за слаг +block.carbide-crucible.name = Тигел за карбид +block.slag-centrifuge.name = Центрифуга за слаг +block.surge-crucible.name = Импулсен тигел +block.cyanogen-synthesizer.name = Цианогенен синтезатор +block.phase-synthesizer.name = Фазов синтезатор +block.heat-reactor.name = Топлинен реактор +block.beryllium-wall.name = Стена от берилий +block.beryllium-wall-large.name = Голяма стена от берилий +block.tungsten-wall.name = Стена от волфрам +block.tungsten-wall-large.name = Голяма стена от волфрам +block.blast-door.name = Огнеупорна врата +block.carbide-wall.name = Стена от карбид +block.carbide-wall-large.name = Голяма стена от карбид +block.reinforced-surge-wall.name = Подсилена импулсна стена +block.reinforced-surge-wall-large.name = Голяма подсилена импулсна стена +block.shielded-wall.name = Енергийна стена +block.radar.name = Радар +block.build-tower.name = Построй кула +block.regen-projector.name = Прожектор за регенерация +block.shockwave-tower.name = Шокова кула +block.shield-projector.name = Щитов прожектор +block.large-shield-projector.name = Голям щитов прожектор +block.armored-duct.name = Брониран канал +block.overflow-duct.name = Преливащ канал +block.underflow-duct.name = Подливащ канал +block.duct-unloader.name = Разтоварващ канал +block.surge-conveyor.name = Импулсна лента +block.surge-router.name = Импулсен рутер +block.unit-cargo-loader.name = Товарител +block.unit-cargo-unload-point.name = Точка за разтоварване +block.reinforced-pump.name = Подсилена помпа +block.reinforced-conduit.name = Подсилена тръба +block.reinforced-liquid-junction.name = Подсилена свръзка за течности +block.reinforced-bridge-conduit.name = Подсилена мостова тръба +block.reinforced-liquid-router.name = Подсилен рутер за течности +block.reinforced-liquid-container.name = Подсилен контейнер за течности +block.reinforced-liquid-tank.name = Подсилен басейн за течности +block.beam-node.name = Лъчева точка +block.beam-tower.name = Лъчева кула +block.beam-link.name = Лъчева свръзка +block.turbine-condenser.name = Турбинен сгъстител +block.chemical-combustion-chamber.name = Химическа камера за горене +block.pyrolysis-generator.name = Пиролизен генератор block.vent-condenser.name = Vent Condenser -block.cliff-crusher.name = Cliff Crusher -block.large-cliff-crusher.name = Advanced Cliff Crusher -block.plasma-bore.name = Plasma Bore -block.large-plasma-bore.name = Large Plasma Bore -block.impact-drill.name = Impact Drill -block.eruption-drill.name = Eruption Drill -block.core-bastion.name = Core Bastion -block.core-citadel.name = Core Citadel -block.core-acropolis.name = Core Acropolis -block.reinforced-container.name = Reinforced Container -block.reinforced-vault.name = Reinforced Vault -block.breach.name = Breach -block.sublimate.name = Sublimate -block.titan.name = Titan -block.disperse.name = Disperse -block.afflict.name = Afflict -block.lustre.name = Lustre -block.scathe.name = Scathe -block.tank-refabricator.name = Tank Refabricator -block.mech-refabricator.name = Mech Refabricator -block.ship-refabricator.name = Ship Refabricator -block.tank-assembler.name = Tank Assembler -block.ship-assembler.name = Ship Assembler -block.mech-assembler.name = Mech Assembler -block.reinforced-payload-conveyor.name = Reinforced Payload Conveyor -block.reinforced-payload-router.name = Reinforced Payload Router -block.payload-mass-driver.name = Payload Mass Driver -block.small-deconstructor.name = Small Deconstructor -block.canvas.name = Canvas -block.world-processor.name = World Processor -block.world-cell.name = World Cell -block.tank-fabricator.name = Tank Fabricator -block.mech-fabricator.name = Mech Fabricator -block.ship-fabricator.name = Ship Fabricator -block.prime-refabricator.name = Prime Refabricator -block.unit-repair-tower.name = Unit Repair Tower -block.diffuse.name = Diffuse -block.basic-assembler-module.name = Basic Assembler Module -block.smite.name = Smite -block.malign.name = Malign -block.flux-reactor.name = Flux Reactor -block.neoplasia-reactor.name = Neoplasia Reactor +block.cliff-crusher.name = Трошачка за скали +block.plasma-bore.name = Плазмен свредел +block.large-plasma-bore.name = Голям плазмен свредел +block.impact-drill.name = Сблъсъчен свредел +block.eruption-drill.name = Взривен свредел +block.core-bastion.name = Ядро Убежище +block.core-citadel.name = Ядро Цитадела +block.core-acropolis.name = Ядро Акропол +block.reinforced-container.name = Подсилен контейнер +block.reinforced-vault.name = Подсилен трезор +block.breach.name = Пробив +block.sublimate.name = Сублимат +block.titan.name = Титан +block.disperse.name = Разпръсък +block.afflict.name = Мъчител +block.lustre.name = Блясък +block.scathe.name = Поражение +block.tank-refabricator.name = Рефабрикатор за танкове +block.mech-refabricator.name = Рефабрикатор за машини +block.ship-refabricator.name = Рефабрикатор за кораби +block.tank-assembler.name = Производител на танкове +block.ship-assembler.name = Производител на кораби +block.mech-assembler.name = Производител на кораби +block.reinforced-payload-conveyor.name = Подсилена лента за товар +block.reinforced-payload-router.name = Подсилен рутер за товар +block.payload-mass-driver.name = Масиран двигател за товари +block.small-deconstructor.name = Малък разглобител +block.canvas.name = Платно +block.world-processor.name = Световен процесор +block.world-cell.name = Световна клетка +block.tank-fabricator.name = Фабрикатор за танкове +block.mech-fabricator.name = Фабрикатор за роботи +block.ship-fabricator.name = Фабрикатор за кораби +block.prime-refabricator.name = Основен рефабрикатор +block.unit-repair-tower.name = Поправяща кула за единици +block.diffuse.name = Дифузия +block.basic-assembler-module.name = Основен сглабящ модул +block.smite.name = Небесен бич +block.malign.name = Зло +block.flux-reactor.name = Флюсов реактор +block.neoplasia-reactor.name = Реактор на неоплазия + block.switch.name = Превключвател block.micro-processor.name = Микропроцесор block.logic-processor.name = Логически процесор -block.hyper-processor.name = Хипер Процесор -block.logic-display.name = Логически Дисплей -block.large-logic-display.name = Голям Логически Дисплей -block.memory-cell.name = Клетка Памет -block.memory-bank.name = Банка Бамет -team.malis.name = Malis -team.crux.name = червен -team.sharded.name = оранжев -team.derelict.name = изоставен -team.green.name = зелен +block.hyper-processor.name = Хипер процесор +block.logic-display.name = Логически дисплей +block.large-logic-display.name = Голям логически дисплей +block.memory-cell.name = Клетка памет +block.memory-bank.name = Банка памет +team.malis.name = Малис +team.crux.name = Крукс +team.sharded.name = Откъснатите +team.derelict.name = Останки +team.green.name = Зелен -team.blue.name = син +team.blue.name = Син hint.skip = Прескочи -hint.desktopMove = Използвайте [accent][[WASD][] за да се придвижвате. +hint.desktopMove = Използвайте [accent][[WASD][], за да се придвижвате. hint.zoom = [accent]Скролирайте[] за увеличаване или намаляване на мащаба. -hint.desktopShoot = Задръжте [accent][[ляв клавиш][] за да стреляте. -hint.depositItems = За да пренесете ресурси, завлачете от вашия кораб то ядрото. +hint.desktopShoot = Задръжте [accent][[Ляв клавиш][], за да стреляте. +hint.depositItems = За да пренесете ресурси, върнете кораба си при ядрото. hint.respawn = За да се появите отново като кораб, натиснете [accent][[V][]. -hint.respawn.mobile = Вие активирахте режим на управление на единица/структура. За да се върнете във вашия кораб, [accent]докоснете аватара в горния ляв ъгъл[]. -hint.desktopPause = Натиснете [accent][[Интервал][] за да поставите играта на пауза или да я продължите. -hint.breaking = Натиснете с [accent]Десен клавиш[] и плъзнете за да унищожите блокове. +hint.respawn.mobile = Вие активирахте режим на управление на единица/структура. За да се върнете към Вашия кораб, [accent]докоснете аватара в горния ляв ъгъл[]. +hint.desktopPause = Натиснете [accent][[Интервал][], за да поставите играта на пауза или да я продължите. +hint.breaking = Натиснете с [accent]Десен клавиш[] и местете мишката, за да унищожавате блокове. hint.breaking.mobile = Активирайте \ue817 [accent]чука[] от долния десен ъгъл и натиснете за да унищожите блокове.\n\nЗадръжте за секунда и плъзнете за да унищожите всички блокове в избраната зона. -hint.blockInfo = View information of a block by selecting it in the [accent]build menu[], then selecting the [accent][[?][] button at the right. -hint.derelict = [accent]Derelict[] structures are broken remnants of old bases that no longer function.\n\nThese structures can be [accent]deconstructed[] for resources. -hint.research = Използвайте бутонът \ue875 [accent]Проучване[] за да изследвате нови технологии. -hint.research.mobile = Използвайте бутонът \ue875 [accent]Проучване[] в \ue88c [accent]Менюто[] за да изследвате нови технологии. -hint.unitControl = Задръжте [accent][[L-Ctrl][] и [accent]кликнете[] за да управлявате ваша единици или кули. -hint.unitControl.mobile = [accent][[Докоснете два пъти][] за да контролирате ваша единица или кула. -hint.unitSelectControl = To control units, enter [accent]command mode[] by holding [accent]L-shift.[]\nWhile in command mode, click and drag to select units. [accent]Right-click[] a location or target to command units there. -hint.unitSelectControl.mobile = To control units, enter [accent]command mode[] by pressing the [accent]command[] button in the bottom left.\nWhile in command mode, long-press and drag to select units. Tap a location or target to command units there. +hint.blockInfo = Вижте информация за даден блок, като го посочите в [accent]менюто за строителство[], а после цъкнете върху копчето [accent][[?][] вдясно. +hint.derelict = [accent]Изоставените[] сгради са порутените останки на стари бази, които вече не функционират.\n\nМожете да [accent]деконструирате[] тези сгради за ресурси. +hint.research = Използвайте бутона \ue875 [accent]Проучване[], за да изследвате нови технологии. +hint.research.mobile = Използвайте бутона \ue875 [accent]Проучване[] в \ue88c [accent]Менюто[], за да изследвате нови технологии. +hint.unitControl = Задръжте [accent][[L-Ctrl][] и [accent]кликнете[], за да управлявате Ваши единици или оръдия. +hint.unitControl.mobile = [accent][[Докоснете два пъти][], за да контролирате Ваша единица или оръдия. +hint.unitSelectControl = За да управлявате единици, влезте в [accent]командния режим[], като задържите [accent]L-shift.[]\nДокато сте в командния режим, цъкнете и влачете, за да избирате единици. Цъкнете с [accent]дясно копче[] върху земята или мишена, за да изпратите единиците си там. +hint.unitSelectControl.mobile = За да управлявате единици, влезте в [accent]командния режим[], като цъкнете копчето за [accent]команда[] долу вляво.\nДокато сте в командния режим, задръжте задълго, за да избирате единици, после може да натиснете върху земята или мишена, за да изпратите единиците си там. hint.launch = След като съберете достатъчно ресурси, можете да [accent]Изстреляте[] ядро като изберете близък сектор от \ue827 [accent]Глобуса[] в долния десен ъгъл. hint.launch.mobile = След като съберете достатъчно ресурси, можете да [accent]Изстреляте[] ядро като изберете близък сектор от \ue827 [accent]Глобуса[] в \ue88c [accent]Менюто[]. -hint.schematicSelect = Задръжте [accent][[F][] и плъзнете за да изберете/копирате група от блокчета.\n\n[accent][[Среден клик][] за да копирате едно блокче. -hint.rebuildSelect = Hold [accent][[B][] and drag to select destroyed block plans.\nThis will rebuild them automatically. -hint.rebuildSelect.mobile = Select the \ue874 copy button, then tap the \ue80f rebuild button and drag to select destroyed block plans.\nThis will rebuild them automatically. -hint.conveyorPathfind = Задръжте [accent][[L-Ctrl][] докато поставяте пътека от конвейери за да генерирате пътека автоматично. -hint.conveyorPathfind.mobile = Позволете \ue844 [accent]Диагонално Поставяне[] за автоматично намиране на пътека при поставяне на конвейери. -hint.boost = Задръжте [accent][[L-Shift][] за да прелетите над препятствия с тази единица.\n\nСамо някои наземни единици имат двигатели за летене. -hint.payloadPickup = Натиснете [accent][[[] за да вдигнете малки блокчета ил единици. -hint.payloadPickup.mobile = [accent]Докоснете и задръжте[] върху малко блокче или единица за да го вдигнете. -hint.payloadDrop = Натиснете [accent]][] за да оставите вашия товар. -hint.payloadDrop.mobile = [accent]Докоснете и задръжте[] върху празна позиция за да оставите вашия товар там. -hint.waveFire = Кулите [accent]Вълна[] заредени със вода ще действат и като пожарогасители. -hint.generator = \uf879 [accent]Горивните генератори[] горят въглища и зареждат с електроенергия съседни блокове.\n\nРазстоянието за предаване на енергия може да се увеличи чрез \uf87f [accent]Електрически Възли[]. -hint.guardian = [accent]Пазителите[] са единици с повече броня. Слаби боеприпаси като [accent]Мед[] и [accent]Олово[] са [scarlet]неефективни[] срещу тях.\n\nИзползвайте по - мощни кули или заредете ващите \uf861Дуо/\uf859Салво с \uf835 [accent]Графит[] за да ги повалите. -hint.coreUpgrade = Ядрата могат да бъдат подобрявани като [accent]поставите по - добро ядро върху тях[].\n\nПоставете \uf868 [accent]Фондация[] върху \uf869 [accent]Шард[] ядрото. Уверете се че няма други препятствия там, където поставяте ядрото. -hint.presetLaunch = Към сивите [accent]сектори за кацане[], какъвто е [accent]Замръзнала Гора[] можете да изстреляте ядро от всякъде. Не е необходимо да превземането на съседна територия.\n\n[accent]Номерираните сектори[], като този, са [accent]пожелателни[]. -hint.presetDifficulty = This sector has a [scarlet]high enemy threat level[].\nLaunching to such sectors is [accent]not recommended[] without proper technology and preparation. -hint.coreIncinerate = След като ядрото се препълни с конкретен тип ресурс, всички допълнителни доставени количества от него ще бъдат [accent]унищожени[]. -hint.factoryControl = To set a unit factory's [accent]output destination[], click a factory block while in command mode, then right-click a location.\nUnits produced by it will automatically move there. -hint.factoryControl.mobile = To set a unit factory's [accent]output destination[], tap a factory block while in command mode, then tap a location.\nUnits produced by it will automatically move there. -gz.mine = Move near the \uf8c4 [accent]copper ore[] on the ground and click to begin mining. -gz.mine.mobile = Move near the \uf8c4 [accent]copper ore[] on the ground and tap it to begin mining. -gz.research = Open the \ue875 tech tree.\nResearch the \uf870 [accent]Mechanical Drill[], then select it from the menu in the bottom right.\nClick on a copper patch to place it. -gz.research.mobile = Open the \ue875 tech tree.\nResearch the \uf870 [accent]Mechanical Drill[], then select it from the menu in the bottom right.\nTap on a copper patch to place it.\n\nPress the \ue800 [accent]checkmark[] at the bottom right to confirm. -gz.conveyors = Research and place \uf896 [accent]conveyors[] to move the mined resources\nfrom drills to the core.\n\nClick and drag to place multiple conveyors.\n[accent]Scroll[] to rotate. -gz.conveyors.mobile = Research and place \uf896 [accent]conveyors[] to move the mined resources\nfrom drills to the core.\n\nHold down your finger for a second and drag to place multiple conveyors. -gz.drills = Expand the mining operation.\nPlace more Mechanical Drills.\nMine 100 copper. -gz.lead = \uf837 [accent]Lead[] is another commonly used resource.\nSet up drills to mine lead. -gz.moveup = \ue804 Move up for further objectives. -gz.turrets = Research and place 2 \uf861 [accent]Duo[] turrets to defend the core.\nDuo turrets require \uf838 [accent]ammo[] from conveyors. -gz.duoammo = Supply the Duo turrets with [accent]copper[], using conveyors. -gz.walls = [accent]Walls[] can prevent oncoming damage from reaching buildings.\nPlace \uf8ae [accent]copper walls[] around the turrets. -gz.defend = Enemy incoming, prepare to defend. -gz.aa = Flying units cannot easily be dispatched with standard turrets.\n\uf860 [accent]Scatter[] turrets provide excellent anti-air, but require \uf837 [accent]lead[] as ammo. -gz.scatterammo = Supply the Scatter turret with [accent]lead[], using conveyors. -gz.supplyturret = [accent]Supply Turret -gz.zone1 = This is the enemy drop zone. -gz.zone2 = Anything built in the radius is destroyed when a wave starts. -gz.zone3 = A wave will begin now.\nGet ready. -gz.finish = Build more turrets, mine more resources,\nand defend against all the waves to [accent]capture the sector[]. -onset.mine = Click to mine \uf748 [accent]beryllium[] from walls.\n\nUse [accent][[WASD] to move. -onset.mine.mobile = Tap to mine \uf748 [accent]beryllium[] from walls. -onset.research = Open the \ue875 tech tree.\nResearch, then place a \uf73e [accent]turbine condenser[] on the vent.\nThis will generate [accent]power[]. -onset.bore = Research and place a \uf741 [accent]plasma bore[].\nThis automatically mines resources from walls. -onset.power = To [accent]power[] the plasma bore, research and place a \uf73d [accent]beam node[].\nConnect the turbine condenser to the plasma bore. -onset.ducts = Research and place \uf799 [accent]ducts[] to move the mined resources from the plasma bore to the core.\nClick and drag to place multiple ducts.\n[accent]Scroll[] to rotate. -onset.ducts.mobile = Research and place \uf799 [accent]ducts[] to move the mined resources from the plasma bore to the core.\n\nHold down your finger for a second and drag to place multiple ducts. -onset.moremine = Expand the mining operation.\nPlace more Plasma Bores and use beam nodes and ducts to support them.\nMine 200 beryllium. -onset.graphite = More complex blocks require \uf835 [accent]graphite[].\nSet up plasma bores to mine graphite. -onset.research2 = Begin researching [accent]factories[].\nResearch the \uf74d [accent]cliff crusher[] and \uf779 [accent]silicon arc furnace[]. -onset.arcfurnace = The arc furnace needs \uf834 [accent]sand[] and \uf835 [accent]graphite[] to create \uf82f [accent]silicon[].\n[accent]Power[] is also required. -onset.crusher = Use \uf74d [accent]cliff crushers[] to mine sand. -onset.fabricator = Use [accent]units[] to explore the map, defend buildings, and attack the enemy. Research and place a \uf6a2 [accent]tank fabricator[]. -onset.makeunit = Produce a unit.\nUse the "?" button to see selected factory requirements. -onset.turrets = Units are effective, but [accent]turrets[] provide better defensive capabilities if used effectively.\nPlace a \uf6eb [accent]Breach[] turret.\nTurrets require \uf748 [accent]ammo[]. -onset.turretammo = Supply the turret with [accent]beryllium ammo.[] -onset.walls = [accent]Walls[] can prevent oncoming damage from reaching buildings.\nPlace some \uf6ee [accent]beryllium walls[] around the turret. -onset.enemies = Enemy incoming, prepare to defend. -onset.defenses = [accent]Set up defenses:[lightgray] {0} -onset.attack = The enemy is vulnerable. Counter-attack. -onset.cores = New cores can be placed on [accent]core tiles[].\nNew cores function as forward bases and share a resource inventory with other cores.\nPlace a \uf725 core. -onset.detect = The enemy will be able to detect you in 2 minutes.\nSet up defenses, mining, and production. -onset.commandmode = Hold [accent]shift[] to enter [accent]command mode[].\n[accent]Left-click and drag[] to select units.\n[accent]Right-click[] to order selected units to move or attack. -onset.commandmode.mobile = Press the [accent]command button[] to enter [accent]command mode[].\nHold down a finger, then [accent]drag[] to select units.\n[accent]Tap[] to order selected units to move or attack. -aegis.tungsten = Tungsten can be mined using an [accent]impact drill[].\nThis structure requires [accent]water[] and [accent]power[]. -split.pickup = Some blocks can be picked up by the core unit.\nPick up this [accent]container[] and place it onto the [accent]payload loader[].\n(Default keys are [ and ] to pick up and drop) -split.pickup.mobile = Some blocks can be picked up by the core unit.\nPick up this [accent]container[] and place it onto the [accent]payload loader[].\n(To pick up or drop something, long-press it.) -split.acquire = You must acquire some tungsten to build units. -split.build = Units must be transported to the other side of the wall.\nPlace two [accent]Payload Mass Drivers[], one on each side of the wall.\nSet up the link by pressing one of them, then selecting the other. -split.container = Similar to the container, units can also be transported using a [accent]Payload Mass Driver[].\nPlace a unit fabricator adjacent to a mass driver to load them, then send them across the wall to attack the enemy base. +hint.schematicSelect = Задръжте [accent][[F][] и плъзнете за да изберете/копирате група от блокчета.\n\n[accent][[Среден клик][], за да копирате едно блокче. +hint.rebuildSelect = Задръжте [accent][[B][] и влачете, за да изберете унищожени блокове.\nТова ще ги застрои наново автоматично. +hint.rebuildSelect.mobile = Изберете копчето за \ue874 копиране, после натиснете копчето за \ue80f построяване и изтеглете, за да изберете унищожените блокове.\nТова ще ги застрои отново автоматично. +hint.conveyorPathfind = Задръжте [accent][[L-Ctrl][] докато поставяте пътека от ленти за да генерирате пътека автоматично. +hint.conveyorPathfind.mobile = Позволете \ue844 [accent]Диагонално поставяне[] за автоматично намиране на пътека при поставяне на конвейери. +hint.boost = Задръжте [accent][[L-Shift][], за да прелетите над препятствия с тази единица.\n\nСамо някои наземни единици имат двигатели за летене. +hint.payloadPickup = Натиснете [accent][[[], за да вдигнете малки блокчета или единици. +hint.payloadPickup.mobile = [accent]Докоснете и задръжте[] върху малко блокче или единица, за да го вдигнете. +hint.payloadDrop = Натиснете [accent]][], за да оставите товара си. +hint.payloadDrop.mobile = [accent]Докоснете и задръжте[] върху празна позиция, за да оставите товара си там. +hint.waveFire = Оръдията [accent]Вълна[] заредени със вода ще действат и като пожарогасители. +hint.generator = \uf879 [accent]Горивните генератори[] горят въглища и зареждат с електроенергия съседни блокове.\n\nРазстоянието за предаване на енергия може да се увеличи чрез \uf87f [accent]Електрически възли[]. +hint.guardian = [accent]Пазителите[] са единици с повече броня. Слаби боеприпаси като [accent]Мед[] и [accent]Олово[] са [scarlet]неподходящи[] срещу тях.\n\nИзползвайте по-мощни оръдия или заредете Вашите \uf861Дуо/\uf859Салво с \uf835 [accent]Графит[], за да ги повалите. +hint.coreUpgrade = Ядрата могат да бъдат подобрявани като [accent]поставите по-добро ядро върху тях[].\n\nПоставете \uf868 [accent]Фондация[] върху \uf869 ядрото [accent]Частица[]. Уверете се че няма други препятствия там, където поставяте ядрото. +hint.presetLaunch = Към сивите [accent]сектори за кацане[], какъвто е [accent]Замръзнала Гора[] можете да изстреляте ядро отвсякъде. Не е необходимо да превземате съседна територия.\n\n[accent]Номерираните сектори[], като този, са [accent]пожелателни[]. +hint.presetDifficulty = Този сектор има [scarlet]висока вражеска заплаха[].\nИзстрелването към такива сектори е [accent]нежелателно[] без нухната технология и подготовка. +hint.coreIncinerate = След като ядрото се препълни с конкретен тип ресурс, всички допълнителни доставени количества в него ще бъдат [accent]унищожени[]. +hint.factoryControl = За да поставите [accent]изходната точка [] на някоя единица, изберете фабричен блок, докато сте в команден режим, после цъкнете с дясно копче върху някое място.\nЕдиници, които се произвеждат оттам ще отидат автоматично до посоченото място. +hint.factoryControl.mobile = За да поставите [accent]изходната точка [] на някоя единица, изберете фабричен блок, докато сте в команден режим, после натиснете върху някое мяст.\nЕдиници, които се произвеждат оттам ще отидат автоматично до посоченото място. +gz.mine = Придвижете се близо до \uf8c4 [accent]медната руда[] на земята и цъкнете, за да започнете изкопаването. +gz.mine.mobile = Придвижете се близо до \uf8c4 [accent]медната руда[] на земята и натиснете върху земята, за да започнете изкопаването. +gz.research = Отворете \ue875 технологичния план.\nПроучете \uf870 [accent]Механичния свредел[], после го изберете от менюто долу вдясно.\nЦъкнете върху поле с мед, за да го поставите. +gz.research.mobile = Отворете \ue875 технологичния план.\nПроучете \uf870 [accent]Механичния свредел[], после го изберете от менюто долу вдясно.\nНатиснете върху поле с мед, за да го поставите.\n\nНатиснете върху \ue800 [accent]тикчето[] долу вдясно, за да потвърдите. +gz.conveyors = Проучете и поставете \uf896 [accent]ленти[], за да придвижите изкопани ресурси от \nсвредели към ядрото.\n\nЦъкнете и влачете, за да разположите множество ленти.\n[accent]Скролирайте[], за да завъртите. +gz.conveyors.mobile = Проучете и поставете \uf896 [accent]ленти[], за да придвижите изкопани ресурси от \nсвредели към ядрото.\n\nЗадръжте пръста си една секунда, за да разположите множество ленти. +gz.drills = Разришете изкопната дейност.\nПоставете повече механични свредели.\nИзкопайте 100 мед. +gz.lead = \uf837 [accent]Оловото[] е друг често използван ресурс.\nПоставете свредели, за да го изкопавате. +gz.moveup = \ue804 Придвижете се нагоре за следващите си задачи. +gz.turrets = Проучете и поставете 2 оръдия \uf861 [accent]Дуо[], за да защитите ядрото.\nДуо се нуждаят от \uf838 [accent]муниции[] чрез лентите. +gz.duoammo = Доставете [accent]мед[] на оръдията, като използвате ленти. +gz.walls = [accent]Стените[] попречват на вражеския огън да достигне до сградите Ви.\nРазположете медни \uf8ae [accent]медни стени[] около оръдията си. +gz.defend = Врагът наближава, пригответе се за отбрана. +gz.aa = На обикновените оръдия им е непосилно да се справят с летящи единици.\n\uf860 [accent]Пръскачките[] предоставят отлична противовъздушна сила, но се нуждаят от \uf837 [accent]Олово[], за да функционират. +gz.scatterammo = Снабдете Пръскачките с [accent]Олово[], използвайки ленти. +gz.supplyturret = [accent]Снабдете оръдие. +gz.zone1 = Това е вражеската начална зона. +gz.zone2 = Всичко построено в нейния радиус ще бъде унищожено, когато настъпи новата вълна. +gz.zone3 = Сега ще започне една такава вълна.\nПригответе се. +gz.finish = Издигнете още оръдия, изкопайте повече ресурси\nи се защитете от всички прииждащи вълни, за да [accent]завладеете този сектор[]. +onset.mine = Цъкнете, за да копаете \uf748 [accent]берилий[] от стените.\n\nИзползвайте [accent][[WASD], за да се придвижвате. +onset.mine.mobile = Натиснете, за да копаете \uf748 [accent]берилий[] от стените. +onset.research = Отворете \ue875 технологичния план.\nПроучете, после поставете \uf73e [accent]турбинен сгъстител[] върху отвора.\nТова ще генерира [accent]електричество[]. +onset.bore = Проучете и поставете \uf741 [accent]плазмена бургия[].\nТя ще копае ресурси от стените автоматично. +onset.power = За да [accent]задействате[] плазмената бургия, проучете и поставете \uf73d [accent]лъчева точка[].\nСвържете турбинния сгъстител към плазмената бургия. +onset.ducts = Проучете и поставете \uf799 [accent]тръби[], за да придвижване изкопаните ресурси от плазмената бургия към ядрото.\nЦъкнете и изтеглете, за да поставите множество тръби.\n[accent]Скролирайте[], за да завъртите. +onset.ducts.mobile = Проучете и поставете \uf799 [accent]тръби[], за да придвижване изкопаните ресурси от плазмената бургия към ядрото.\nЗадръжте пръста си за една секунда, за да поставите множество тръби. +onset.moremine = Разришете минната си операция.\nПоставете повече плазмени бургии и използвайте лъчеви точки и тръби, за да ги поддържате.\nИзкопайте 200 берилий. +onset.graphite = По-сложните блокове се нуждаят от \uf835 [accent]Графит[].\nПоставете плазмени бургии, за да копаете графит. +onset.research2 = Започнете проучването на [accent]фабрики[].\nПроучете \uf74d [accent]Скалотрошача[] и \uf779 [accent]Аркова фурна за силикон[]. +onset.arcfurnace = Арковата фурна се нуждае от \uf834 [accent]Пясък[] и \uf835 [accent]Графит[], за да произведе \uf82f [accent]Силикон[].\n[accent]Електричеството[] също е важно. +onset.crusher = Използвайте \uf74d [accent]Скалотрошачите[], за да копаете пясък. +onset.fabricator = Използвайте [accent]единици[], за да изследвате картата, да пазите сгради и да атакувате врага. Проучете и поставете \uf6a2 [accent]Фабрика за танкове[]. +onset.makeunit = Произведете единица.\nИзползвайте копчето "?", за да видите изискванията на избраната фабрика. +onset.turrets = Единиците са полезни, ала [accent]Оръдията[] предоставят повече защитни възможности, когато се използват правилно.\nПоставете \uf6eb [accent]Пробивно[] оръдие.\nОръдията се нуждаят от \uf748 [accent]муниции[]. +onset.turretammo = Снабдете оръдието с [accent]берилий.[] +onset.walls = [accent]Стените[] пазят сградите Ви от вражески огън.\nПоставете няколко \uf6ee [accent]стени от берилий[] около оръдието. +onset.enemies = Врагът приближава, пригответе се за защита. +onset.defenses = [accent]Поставяне на защити:[lightgray] {0} +onset.attack = Врагът е уязвим. Отвърнете на удара. +onset.cores = Можете да поставите нови ядра върху [accent]полета за ядро[].\nНовите ядра вършат работа като предни бази и споделят ресурсен инвентар с други ядра.\nПоставете \uf725 ядро. +onset.detect = Врагът ще Ви засече след 2 минути.\nРазположете защити, изкопна дейност и продукция. +onset.commandmode = Задръжте [accent]shift[], за да влезете в [accent]командния режим[].\n[accent]Цъкнете с ляво копче и влачете[], за да избирате единици.\n[accent]Дясно копче[] дава заповеди за придвижване или атака +onset.commandmode.mobile = Натиснете [accent]командното копче[], за да влезете в [accent]командния режим[].\nЗадръжте пръста си, после го [accent]придвижете[], за да изберете единици.\n[accent]Докоснете[], за да дадете заповед за придвижване или атака. +aegis.tungsten = Можете да копаете волфрам чрез [accent]сблъсъчен свредел[].\nТази сграда се нуждае от [accent]вода[] и [accent]електричество[]. +split.pickup = Някои блокове могат да бъдат вдигани от кораба.\nВдигнете този [accent]контейнер[] и го поставете върху [accent]товарителя[].\n(Основните копчета за вдигане и поставяне са [ и ]) +split.pickup.mobile = Някои блокове могат да бъдат вдигани от кораба.\nВдигнете този [accent]контейнер[] и го поставете върху [accent]товарителя[].\n(За да вдигнете или оставите нещо, задръжте задълго върху него.) +split.acquire = Нуждаете се от волфрам, за да строите единици. +split.build = Единиците трябва да бъдат пренасяни до другата страна на стената.\nПоставете два [accent]Масирани товарители[], върху всяка от страните на стената.\nСвържете ги, като натиснете върху единия, после върху другия. +split.container = Подобно на контейнерите, можете да пренасяте единици с [accent]масиран товарител[].\nПоставете фабрикатор за единици до масиран двигател, за да ги натоварите, после ги пратете зад стената, за да нападнат вражеската база. -item.copper.description = Използван във всякакви типове конструкции и боеприпаси. -item.copper.details = Мед. Copper. Необичайно изобилен метал на Serpulo. Структурно слаб, освен ако не е подсилен. -item.lead.description = Използван в транспорт на течности и електрически структури. -item.lead.details = Плътен. Инертен. Широко използван при изграждане на батерии.\nБележка: Вероятно токсичен за биологични форми на живот. Не че има много такива останали наоколо. +item.copper.description = Използва се във всякакви типове конструкции и боеприпаси. +item.copper.details = Мед. Необичайно изобилен метал на Серпул. Структурно слаб, освен ако бъде подсилен. +item.lead.description = Използва се за транспорт на течности и електрически структури. +item.lead.details = Плътен. Инертен. Широко използван при изграждане на батерии.\nБележка: Вероятно е токсичен за биологичните форми на живот. Не, че има много останали наоколо. item.metaglass.description = Използва се в структури за транспорт и съхранение на течности. item.graphite.description = Използва се в електрически компоненти и като боеприпас за някои видове кули. item.sand.description = Използва се за производство на други рафинирани материали. -item.coal.description = Използва се като гориво и за производство на радинирани материали. -item.coal.details = Изглежда като вкаменена растителна материя, образувана много преди разпръсването на спорите. -item.titanium.description = Използван в структури за транспорт, свредла и летящи технологии. -item.thorium.description = Използван в здрави конструкции или като ядрено гориво. -item.scrap.description = Използван в Разтопители и Пулверизатори за рафиниране в други материали. +item.coal.description = Използва се като гориво и за производство на рафинирани материали. +item.coal.details = Изглежда като вкаменена растителна материя, образувана много преди разпръскването на спорите. +item.titanium.description = Използва се в транспортни структури, свредели и летателни технологии. +item.thorium.description = Използва се в здрави конструкции или като ядрено гориво. +item.scrap.description = Използва се в Разтопители и Пулверизатори за преработване в други материали. item.scrap.details = Останки от стари структури и единици. -item.silicon.description = Използва се в фотоволтаици, сложни електроники и самонасочващи се боеприпаси. +item.silicon.description = Използва се във фотоволтаици, сложни електроники и самонасочващи се боеприпаси. item.plastanium.description = Използва се в усъвършенствани единици, като изолация и за фрагментационни боеприпаси. item.phase-fabric.description = Използва се в усъвършенствана електроника и възстановяващи структури. item.surge-alloy.description = Използва се в усъвършенствани оръжия и импулсни защитни структури. -item.spore-pod.description = Използва се за производство на нефт, експлозиви и гориво. -item.spore-pod.details = Спори. Вероятно синтетична форма на живот. Изпускат токсични за останалите биологични организми газове. Изключително инвазивни. Лесно запалими при определени условия. -item.blast-compound.description = Използва се в бомби и експлозивни боеприпаси. -item.pyratite.description = Използва се в подпалващи оръжия и горивни генератори. -item.beryllium.description = Used in many types of construction and ammunition on Erekir. -item.tungsten.description = Used in drills, armor and ammunition. Required in the construction of more advanced structures. -item.oxide.description = Used as a heat conductor and insulator for power. -item.carbide.description = Used in advanced structures, heavier units, and ammunition. +item.spore-pod.description = Използва се за производството на нефт, експлозиви и гориво. +item.spore-pod.details = Спори. Вероятно синтетична форма на живот. Изпускат газове, които са токсични за биологични организми. Изключително инвазивни. Лесно запалими при определени условия. +item.blast-compound.description = Използва се за бомби и експлозивни боеприпаси. +item.pyratite.description = Използва се за подпалващи оръжия и горивни генератори. +item.beryllium.description = Използва се в много видове строежи и муниции на Ерекир. +item.tungsten.description = Използва се от свредели, броня и муниции. Нужен е за строежа на по-сложни структури. +item.oxide.description = Използва се като топлопроводник и инсулатор за електричество. +item.carbide.description = Използва се в сложни структури, тежки единици и муниции. liquid.water.description = Използва се за охлаждане на машини и преработка на отпадъци. -liquid.slag.description = Може да се рафинира в Разделители до съставните ѝ метали или да се пръска върху врагове като оръжие. -liquid.oil.description = Използва се в напредналото производство на материали или като запалителен боеприпас. -liquid.cryofluid.description = Използва се като охладител в реактори, кули и фабрики. -liquid.arkycite.description = Used in chemical reactions for power generation and material synthesis. -liquid.ozone.description = Used as an oxidizing agent in material production, and as fuel. Moderately explosive. -liquid.hydrogen.description = Used in resource extraction, unit production and structure repair. Flammable. -liquid.cyanogen.description = Used for ammunition, construction of advanced units, and various reactions in advanced blocks. Highly flammable. -liquid.nitrogen.description = Used in resource extraction, gas creation and unit production. Inert. -liquid.neoplasm.description = A dangerous biological byproduct of the Neoplasia reactor. Quickly spreads to any adjacent water-containing block it touches, damaging them in the process. Viscous. -liquid.neoplasm.details = Neoplasm. An uncontrollable mass of rapidly-dividing synthetic cells with a sludge-like consistency. Heat-resistant. Extremely dangerous to any structures involving water.\n\nToo complex and unstable for standard analysis. Potential applications unknown. Incineration in slag pools is recommended. -block.derelict = \uf77e [lightgray]Derelict +liquid.slag.description = Може да се рафинира в Разделители до съставните си метали или да се използване за обливане на враговете. +liquid.oil.description = Използва се в напредналото производство на материали или като запалимо оръжие. +liquid.cryofluid.description = Използва се като охладител в реактори, оръдия и фабрики. +liquid.arkycite.description = Използва се в химическите реакции за производство на електричество и синтез на материали. +liquid.ozone.description = Използва се като окисляващ агент в производството на материал, както и за гориво. Относително експлозивен. +liquid.hydrogen.description = Използва се в извличането на ресурси, производството на единици и в ремонти. Запалимо вещество. +liquid.cyanogen.description = Използва се за муниции, строеж и напреднали единици, както и при различни реакции на по-сложните блокове. Силно запалим. +liquid.nitrogen.description = Използва се в извличането на ресурси, създаването на газ и производство на единици. Инертен газ. +liquid.neoplasm.description = Опасен биологичен страничен продукт от неоплазмения реактор. Бързо се разпростира до всеки съседен водосъдържащ блок и го поврежда. Леплив материал. +liquid.neoplasm.details = Нео-плазма. Неконтрелируема маса от бързо делящи се синтетични клетки с консистенция подобна на тиня. Устойчива на жега. Изключително опасна за всяка сграда, която използва вода.\n\nТвърде сложна и нестабилна за стандартен анализ. Потенциалните приложения са неизвестни. Препоръчва се изгарянето в басейни от слаг. +block.derelict = \uf77e [lightgray]Останки block.armored-conveyor.description = Придвижва предмети напред. Не приема вход от страни. block.illuminator.description = Излъчва светлина. block.message.description = Съхранява съобщение за комуникация между съюзници. -block.reinforced-message.description = Stores a message for communication between allies. -block.world-message.description = A message block for use in mapmaking. Cannot be destroyed. -block.graphite-press.description = Компресира въглища в графит. -block.multi-press.description = Компресира въглища в графит. Изисква вода като охладител. +block.reinforced-message.description = Съхранява съобщение за комуникация между съюзници. +block.world-message.description = Съобщителен блок. Използван при създаването на карти. Неунищожим. +block.graphite-press.description = Компресира въглища до графит. +block.multi-press.description = Компресира въглища до графит. Изисква вода като охладител. block.silicon-smelter.description = Рафинира силикон от пясък и въглища. -block.kiln.description = Претяпя пясък и олово в метастъкло. +block.kiln.description = Претапя пясък и олово в мета-стъкло. block.plastanium-compressor.description = Произвежда пластаний от нефт и титан. block.phase-weaver.description = Синтезира фазова тъкан от торий и пясък. -block.surge-smelter.description = Разтопява титан, олово, силиций и мед в импулсна сплав. -block.cryofluid-mixer.description = Смесва вода и фин титанов прах за производство на криофлуид. +block.surge-smelter.description = Разтопява титан, олово, силиций и мед до импулсна сплав. +block.cryofluid-mixer.description = Смесва вода и фин титаниев прах за производство на криотечност. block.blast-mixer.description = Произвежда взривно съединение от пиратит и сгъстени спори. block.pyratite-mixer.description = Смесва въглища, олово и пясък в пиратит. -block.melter.description = Претапя скрап в шлака. -block.separator.description = Разделя шлаката на нейните минерални компоненти. -block.spore-press.description = Компресира сгъстени спори в нефт. +block.melter.description = Претапя скрап до шлака. +block.separator.description = Раздробява шлаката до нейните минерални компоненти. +block.spore-press.description = Компресира сгъстени спори на нефт. block.pulverizer.description = Натрошава скрап до състояние на фин пясък. -block.coal-centrifuge.description = Преобразува нефт в въглища. +block.coal-centrifuge.description = Преобразува нефт във въглища. block.incinerator.description = Изпарява всеки предмет или течност, които получава. block.power-void.description = Неутрализира цялата енергия в мрежата. Достъпно само в Пясъчника. -block.power-source.description = Произвежда безкрайно енергия. Достъпно само в Пясъчника. +block.power-source.description = Произвежда безкрайна енергия. Достъпно само в Пясъчника. block.item-source.description = Извежда безкрайно количество предмети. Достъпно само в Пясъчника. block.item-void.description = Унищожава всякакви предмети. Достъпно само в Пясъчника. block.liquid-source.description = Извежда безкрайно количество течности. Достъпно само в Пясъчника. block.liquid-void.description = Унищожава всякакви течности. Достъпно само в Пясъчника. -block.payload-source.description = Infinitely outputs payloads. Sandbox only. -block.payload-void.description = Destroys any payloads. Sandbox only. +block.payload-source.description = Извежда безкрайни товари. Достъпно само в Пясъчника. +block.payload-void.description = Унищожава всеки товар. Достъпно само в Пясъчника. block.copper-wall.description = Защитава структури от вражески огън. block.copper-wall-large.description = Защитава структури от вражески огън. block.titanium-wall.description = Защитава структури от вражески огън. block.titanium-wall-large.description = Защитава структури от вражески огън. -block.plastanium-wall.description = Защитава структури от вражески огън. Абсорбира лазери и волтови дъги. Блокира автоматични електрически връзки. -block.plastanium-wall-large.description = Защитава структури от вражески огън. Абсорбира лазери и волтови дъги. Блокира автоматични електрически връзки. +block.plastanium-wall.description = Защитава структури от вражески огън. Поглъща лазери и волтови дъги. Блокира автоматични електрически връзки. +block.plastanium-wall-large.description = Защитава структури от вражески огън. Поглъща лазери и волтови дъги. Блокира автоматични електрически връзки. block.thorium-wall.description = Защитава структури от вражески огън. block.thorium-wall-large.description = Защитава структури от вражески огън. -block.phase-wall.description = Защитава структури от вражески огън, отразявайки повечето куршуми при удар. -block.phase-wall-large.description = Защитава структури от вражески огън, отразявайки повечето куршуми при удар. +block.phase-wall.description = Защитава структури от вражески огън, отразявайки повечето куршуми при контакт. +block.phase-wall-large.description = Защитава структури от вражески огън, отразявайки повечето куршуми при контакт. block.surge-wall.description = Защитава структури от вражески огън, периодично освобождавайки волтови дъги при контакт. block.surge-wall-large.description = Защитава структури от вражески огън, периодично освобождавайки волтови дъги при контакт. block.scrap-wall.description = Protects structures from enemy projectiles. @@ -2108,265 +2080,261 @@ block.scrap-wall-huge.description = Protects structures from enemy projectiles. block.scrap-wall-gigantic.description = Protects structures from enemy projectiles. block.door.description = Стена, която може да бъде отворена и затворена. block.door-large.description = Стена, която може да бъде отворена и затворена. -block.mender.description = Периодично поправя близки блокове.\nОпционално използва силикон за да увеличи обхвата и ефективността си. -block.mend-projector.description = Периодично поправя близки блокове.\nОпционално използва тъкан за да увеличи обхвата и ефективността си. -block.overdrive-projector.description = Ускорява близки постройки.\nОпционално използва тъкан за да увеличи обхвата и ефективността си. -block.force-projector.description = Създава шестоъгълно силово поле около себе си, предпазвайки сградите и единиците в него от повреда.\nПрегрява, ако претърпи твърде много щети. Можете да използвате охладителна течност за да предотвратите това. Можете да използвате фазова тъкан за да увеличите обхвата на силовото поле. +block.mender.description = Периодично поправя близки блокове.\nМоже да използва силикон, за да увеличи обхвата и ефективността си. +block.mend-projector.description = Периодично поправя близки блокове.\nМоже да използва силикон, за да увеличи обхвата и ефективността си. +block.overdrive-projector.description = Ускорява близки постройки.\nМоже да използва фазова тъкан, за да увеличи обхвата и ефективността си. +block.force-projector.description = Създава шестоъгълно силово поле около себе си, предпазвайки сградите и единиците в него от повреда.\nПрегрява, ако претърпи твърде много щети. Използвайте охладителна течност, за да предотвратите прегряване. Можете да използвате фазова тъкан, за да увеличите обхвата на силовото поле. block.shock-mine.description = Освобождава електрически дъги при контакт с вражески единици. block.conveyor.description = Пренася предмети напред. -block.titanium-conveyor.description = Пренася предмети напред. По - бърз от стандартния конвейер. -block.plastanium-conveyor.description = Пренася предмети напред на партиди. Приема предмети само в началото на веригата и ги разтоварва в края в 3 посоки. Изисква товарене и разтоварване от няколко страни за максимална ефективност. +block.titanium-conveyor.description = Пренася предмети напред. По-бърз от стандартната лента. +block.plastanium-conveyor.description = Пренася предмети напред на партиди. Приема предмети само в началото на веригата и ги разтоварва в 3 посоки. Изисква товарене и разтоварване от няколко страни за максимална ефективност. block.junction.description = Действа като мост за две кръстосани конвейерни линии. block.bridge-conveyor.description = Пренася предмети над терен или постройки. -block.phase-conveyor.description = Мигновенно пренася предмети над терен или постройки. Има по - голям обхват от мостовия конвейер, но се нуждае от електроенергия. +block.phase-conveyor.description = Мигновенно пренася предмети над терен или постройки. Има по-голям обхват от мостовата лента, но се нуждае от електроенергия. block.sorter.description = Ако предметът съвпада на избрания го пренася напред, иначе го изкарва настрани. -block.inverted-sorter.description = Подобно на стандартния сортирач, но извежда избрания предмет настрани. -block.router.description = Разпределя внесените предмети в до 3 посоки равномерно. +block.inverted-sorter.description = Подобно на стандартния сортировач, но извежда избраният предмет настрани. +block.router.description = Разпределя внесените предмети на до 3 посоки равномерно. block.router.details = Необходимо зло. Употребата му като вход на фабрики не се препоръчва, защото ще се запуши от изходните материали. block.distributor.description = Разпределя внесените предмети в до 7 посоки равномерно. -block.overflow-gate.description = Насочва предмети настрани само ако лентат отпред е препълнена или блокирана. +block.overflow-gate.description = Насочва предмети настрани само ако лентата отпред е препълнена или блокирана. block.underflow-gate.description = Насочва предмети напред само ако лентите отстрани са препълнени или блокирани. -block.mass-driver.description = Структура за пренасяне на предмети на далечни растояния. Събира партиди от предмети и ги изстрелва до други Масови Преносители. +block.mass-driver.description = Структура за пренасяне на предмети на далечни растояния. Събира партиди от предмети и ги изстрелва до други Масови преносители. block.mechanical-pump.description = Изпомпва течности. Не изисква електричество. block.rotary-pump.description = Изпомпва течности. Изисква електричество. block.impulse-pump.description = Изпомпва течности. block.conduit.description = Пренася течности еднопосочно. Използва се в комбинация с помпи и други тръбопроводи. -block.pulse-conduit.description = Пренася течности еднопосочно. Пренася по - бързо и съхранява повече от стандартния тръбопровод. -block.plated-conduit.description = Пренася течности еднопосочно. Не приема вход от страни. Не позволява течове. -block.liquid-router.description = Разпределя внесените течности в до 3 посоки равномерно. Също може да съхранява някакво количество течност. -block.liquid-container.description = Stores a sizeable amount of liquid. Outputs to all sides, similarly to a liquid router. +block.pulse-conduit.description = Пренася течности еднопосочно. Пренася по-бързо и съхранява повече от стандартния тръбопровод. +block.plated-conduit.description = Пренася течности еднопосочно. Не приема вход от страни. Не пропуска течове. +block.liquid-router.description = Разпределя внесените течности в до 3 посоки равномерно. Също може да съхранява малко количество течност. +block.liquid-container.description = Съхранява значително количество течност. Може да изкарва течност във всички посоки, подобно на рутер за течности. block.liquid-tank.description = Съхранява голямо количество течност. Може да изкарва течност във всички посоки, подобно на рутер за течности. block.liquid-junction.description = Действа като мост за два кръстосани тръбопровода. block.bridge-conduit.description = Транспортира течности над терен или сгради. -block.phase-conduit.description = TТранспортира течности над терен или сгради. Има по - голям обхват от мост за течности, но се нуждае от електроенергия. +block.phase-conduit.description = Транспортира течности над терен или сгради. Има по-голям обхват от моста за течности, но се нуждае от електроенергия. block.power-node.description = Пренася енергия между свързани или съседни структури. -block.power-node-large.description = Подобрена версия на електрическия възел с по - голям обхват. -block.surge-tower.description = Далекообхватен електрически възел, но може да се свърже само до две структури. +block.power-node-large.description = Подобрена версия на електрическия възел с по-голям обхват. +block.surge-tower.description = Далекообхватен електрически възел, но може да се свърже само две структури. block.diode.description = Пренася енергия между батерии само в една посока, само ако източника има повече съхранена енергия от целта. -block.battery.description = Съхранява мощност във времена на енергиен излишък. Извежда мощност по времена на енергиен дефицит. -block.battery-large.description = Съхранява мощност във времена на енергиен излишък. Извежда мощност по времена на енергиен дефицит. Има по - голям капацитет от нормалната батерия. -block.combustion-generator.description = Произвежда електроенергия като гори запалими материали, като въглища. -block.thermal-generator.description = Генерира енергия когато е поставен върху нагорещена повърхност. +block.battery.description = Съхранява мощност, когато има излишък. Извежда мощност по време на на дефицит. +block.battery-large.description = Съхранява мощност, когато има излишък. Извежда мощност по време на дефицит. Има по-голям капацитет от нормалната батерия. +block.combustion-generator.description = Произвежда електроенергия като гори запалими материали, например въглища. +block.thermal-generator.description = Генерира енергия, когато е поставен върху нагорещена повърхност. block.steam-generator.description = Генерира енергия като гори запалими материали и изпарява вода. block.differential-generator.description = Генерира енергия в големи количества. Използва температурната разлика между криофлуида и изгарящия пиратит. block.rtg-generator.description = Използва топлината на разлагащи се радиоактивни съединения, за да произвежда енергия с бавна скорост. block.solar-panel.description = Осигурява малко количество енергия от слънцето. -block.solar-panel-large.description = Осигурява малко количество енергия от слънцето. По - ефективен от стандартния фотоволтаик. -block.thorium-reactor.description = Генерира значителни количества енергия, използвайки торий. Изисква постоянно охлаждане. Избухва агресивно ако се доставят недостатъчни количества охлаждаща течност. -block.impact-reactor.description = Генерира огромни количества енергия при пикова ефективност. Изисква значителна входна мощност, за да стартира процеса. +block.solar-panel-large.description = Осигурява малко количество енергия от слънцето. По-ефективен от стандартния фотоволтаик. +block.thorium-reactor.description = Генерира значителни количества енергия, използвайки торий. Изисква постоянно охлаждане. Избухва агресивно ако се доставят недостатъчни количества охлаждане. +block.impact-reactor.description = Генерира огромни количества енергия с пикова ефективност. Изисква значителна входова мощност, за да стартира процеса. block.mechanical-drill.description = Когато се постави върху руда добива конкретния материал с бавно темпо за неопределено време. Може да добива само основни ресурси. -block.pneumatic-drill.description = Подобрено свредло, което може да добива титан. Работи с по - бързо темпо от механичното свредло. -block.laser-drill.description = Използва лазерна технология за да добива ресурси с още по - висока скорост, но консумира електроенергия. Може да добива торий. -block.blast-drill.description = Използва изключително усъвършенствана технология за да постигне невероятна скорост на добив. Консумира голямо количество електроенергия. -block.water-extractor.description = Извлича подземни води. Използва се на места без налична повърхностна вода. +block.pneumatic-drill.description = Подобрено свредло, което може да добива титан. Работи с по-бързо темпо от механичното свредло. +block.laser-drill.description = Използва лазерна технология, за да добива ресурси с още по-висока скорост, но консумира електроенергия. Може да добива торий. +block.blast-drill.description = Използва изключително усъвършенствана технология, за да постигне невероятна скорост на добив. Консумира голямо количество електроенергия. +block.water-extractor.description = Извлича подземни води. Използва се на места без повърхностна вода. block.cultivator.description = Култивира малки концентрации на атмосферни спори под формата на плътно биологично вещество. -block.cultivator.details = Възстановена технология. Използва се за да произвежда масивно количество биомаса с максимална ефективност. Вероятно първоначалният инкубатор на спорите, който сега покрива Серпуло. -block.oil-extractor.description = Използва голямо количество електроенергия, пясък и вода за да добива нефт. -block.core-shard.description = Ядро на базата. Веднъж унищожено, секторът се губи. -block.core-shard.details = Първата итерация. Компактно. Самовъзпроизвеждащо се.Оборудвано с едноктарни стартови двигатели. Не е предназначено за междупланетарни полети. -block.core-foundation.description = Ядро на базата. Добре бронирано. Съдържа повече ресурси от модел Шард. +block.cultivator.details = Възстановена технология. Използва се, за да произвежда масивно количество биомаса с максимална ефективност. Вероятно първоначалният инкубатор на спорите, който сега покрива Серпуло. +block.oil-extractor.description = Използва голямо количество електроенергия, пясък и вода, за да добива нефт. +block.core-shard.description = Ядро на базата. Ако бъде унищожено, секторът се губи. +block.core-shard.details = Първата итерация. Компактна. Самовъзпроизвежда се. Оборудвана с едноктарни стартови двигатели. Не е предназначена за междупланетарни полети. +block.core-foundation.description = Ядро на базата. Добре бронирано. Съдържа повече ресурси от модел Частица. block.core-foundation.details = Втората итерация. block.core-nucleus.description = Ядро на базата. Изключително добре бронирано. Съхранява огромни количества ресурси. block.core-nucleus.details = Третата и финална итерация. -block.vault.description = Съхранява голямо количество материали от всеки тип. Съдържанието може да бъде достъпено чрез разтоварач. -block.container.description = Съхранява малко количество материали от всеки тип. Съдържанието може да бъде достъпено чрез разтоварач. +block.vault.description = Съхранява голямо количество материали от всеки тип. Съдържанието може да бъде достъпено чрез разтоварител. +block.container.description = Съхранява малко количество материали от всеки тип. Съдържанието може да бъде достъпено чрез разтоварител. block.unloader.description = Разтоварва избран материал от близки блокове. block.launch-pad.description = Изстрелва патриди от елементи в избраните сектори. -block.advanced-launch-pad.description = Launches batches of items to selected sectors. Only accepts one item type at a time. -block.advanced-launch-pad.details = Sub-orbital system for point-to-point transportation of resources. -block.landing-pad.description = Receives items from launch pads in other sectors. Requires large amounts of water to protect against impacts of landings. +block.launch-pad.details = Суб-орбитална система за точка-до-точка транспорт на ресурс. Товарните съдове са чупливи и не са способни да оцелеят повторно влизане. block.duo.description = Изстрелва редуващи се куршуми по враговете. block.scatter.description = Изстрелва топки олово, скрап или метастъкло на съчми срещу вражески въздушни единици. block.scorch.description = Изгаря всички наземни врагове в близост. Висока ефективност от близко разстояние. block.hail.description = Изстрелва малки снаряди по наземни врагове на големи разстояния. -block.wave.description = Изстрелва потоци течност по враговете. Автоматично гаси пожари, когато е се снабдява с вода. +block.wave.description = Изстрелва потоци течност по враговете. Автоматично гаси пожари, когато се снабдява с вода. block.lancer.description = Зарежда и изстрелва мощни лъчи енергия по наземни цели. block.arc.description = Изстрелва волтови дъги по наземни цели. -block.swarmer.description = Изстрелва ракети с автоматично насочване по врагове. -block.salvo.description = Изстрелва бързи залпове от куршуми по врагове. +block.swarmer.description = Изстрелва ракети с автоматично насочване. +block.salvo.description = Изстрелва бързи залпове от куршуми. block.fuse.description = Изстрелва три пробиващи взрива по врагове на близко разстояние. block.ripple.description = Изстрелва клъстери от снаряди по наземни врагове на големи разстояния. block.cyclone.description = Изстрелва взривоопасни топки от съчми по близки врагове. block.spectre.description = Изстрелва големи бронепробивни куршуми по въздушни и наземни мишени. -block.meltdown.description = Зарежда и изстрелва продължителен лазерен лъч по близки врагове. Изисква охладител за да функционира. -block.foreshadow.description = Произвежда единични силни изстрели на дълго растояние. Приоритизира враговете с по - високи максимални точки живот. -block.repair-point.description = Непрекъснато ремонтира най - близката повредена единица в обхват. +block.meltdown.description = Зарежда и изстрелва продължителен лазерен лъч по близки врагове. Изисква охладител, за да функционира. +block.foreshadow.description = Произвежда единични силни изстрели на дълго растояние. Приоритизира враговете с повече точки живот. +block.repair-point.description = Непрекъснато ремонтира най-близката повредена единица в обхват. block.segment.description = Поврежда и унищожава вражески снаряди. Не действа на лазери. block.parallax.description = Активира прихващаш лъч, с който придърпва и уврежда въздушни единици. block.tsunami.description = Изстрелва мощни потоци течност по враговете. Автоматично гаси пожари, когато се снабдява с вода. -block.silicon-crucible.description = Рафинира силикон от пясък и въглища, използвайки пиратит като допълнителен източник на топлина. Действа по - ефективно върху топли повърхности. -block.disassembler.description = Бавно извлича редки минерални компоненти от шлаката. Има шанс да извлече и торий. -block.overdrive-dome.description = Повишава скоростта на близки сгради. Нуждае се от фазова тъкан и силикон за да оперира. +block.silicon-crucible.description = Рафинира силикон от пясък и въглища, използвайки пиратит като допълнителен източник на топлина. Работи по-ефективно върху топли повърхности. +block.disassembler.description = Бавно извлича редки минерални компоненти от шлака. Има шанс да извлече торий. +block.overdrive-dome.description = Повишава скоростта на близки сгради. Нуждае се от фазова тъкан и силикон, за да работи. block.payload-conveyor.description = Пренася големи товари, като единици от фабрика. block.payload-router.description = Разпределя натоварените единици в 3 различни посоки. -block.ground-factory.description = Произвежда наземни единици. Произведените единици могат да бъдат използвани директно или пренесени във Реконструктори за да бъдат подобрени. -block.air-factory.description = Произвежда въздушни единици. Произведените единици могат да бъдат използвани директно или пренесени във Реконструктори за да бъдат подобрени. -block.naval-factory.description = Произвежда морски единици. Произведените единици могат да бъдат използвани директно или пренесени във Реконструктори за да бъдат подобрени. +block.ground-factory.description = Произвежда наземни единици. Произведените единици могат да бъдат използвани директно или пренесени във Реконструктори за подобрение. +block.air-factory.description = Произвежда въздушни единици. Произведените единици могат да бъдат използвани директно или пренесени във Реконструктори за подобрение. +block.naval-factory.description = Произвежда морски единици. Произведените единици могат да бъдат използвани директно или пренесени във Реконструктори за подобрение. block.additive-reconstructor.description = Подобрява доставените единици до второ ниво. block.multiplicative-reconstructor.description = Подобрява доставените единици до трето ниво. block.exponential-reconstructor.description = Подобрява доставените единици до четвърто ниво. block.tetrative-reconstructor.description = Подобрява доставените единици до петото и последно ниво. block.switch.description = Превключвател. Може да се превключва ръчно и да се следи и управлява с процесор. block.micro-processor.description = Многократно изпълнява поредица от логически инструкции. Може да управлява единици и постройки. -block.logic-processor.description = Многократно изпълнява поредица от логически инструкции. Може да управлява единици и постройки. По - бърз от микропроцесор. -block.hyper-processor.description = Многократно изпълнява поредица от логически инструкции. Може да управлява единици и постройки. По - бърз от логически процесор. +block.logic-processor.description = Многократно изпълнява поредица от логически инструкции. Може да управлява единици и постройки. По-бърз от микропроцесор. +block.hyper-processor.description = Многократно изпълнява поредица от логически инструкции. Може да управлява единици и постройки. По-бърз от логически процесор. block.memory-cell.description = Съхранява информация, която може да се достъпва или променя от процесор. block.memory-bank.description = Съхранява информация, която може да се достъпва или променя от процесор. Има голям капацитет. block.logic-display.description = Позволява изобразяването на графика чрез процесор. block.large-logic-display.description = Позволява изобразяването на графика чрез процесор. -block.interplanetary-accelerator.description = Масивна електромагнитна релсова кула. Ускорява ядрата до необходимата скорост за междупланетно изстрелване. -block.repair-turret.description = Continuously repairs the closest damaged unit in its vicinity. Optionally accepts coolant. -block.core-bastion.description = Core of the base. Armored. Once destroyed, the sector is lost. -block.core-citadel.description = Core of the base. Very well armored. Stores more resources than a Bastion core. -block.core-acropolis.description = Core of the base. Exceptionally well armored. Stores more resources than a Citadel core. -block.breach.description = Fires piercing beryllium or tungsten ammunition at enemy targets. -block.diffuse.description = Fires a burst of bullets in a wide cone. Pushes enemy targets back. -block.sublimate.description = Fires a continuous jet of flame at enemy targets. Pierces armor. -block.titan.description = Fires a massive explosive artillery shell at ground targets. Requires hydrogen. -block.afflict.description = Fires a massive charged orb of fragmentary flak. Requires heating. -block.disperse.description = Fires bursts of flak at aerial targets. -block.lustre.description = Fires a slow-moving single-target laser at enemy targets. -block.scathe.description = Launches a powerful missile at ground targets over vast distances. -block.smite.description = Fires bursts of piercing, lightning-emitting bullets. -block.malign.description = Fires a barrage of homing laser charges at enemy targets. Requires extensive heating. -block.silicon-arc-furnace.description = Refines silicon from sand and graphite. -block.oxidation-chamber.description = Converts beryllium and ozone into oxide. Emits heat as a by-product. -block.electric-heater.description = Heats facing blocks. Requires large amounts of power. -block.slag-heater.description = Heats facing blocks. Requires slag. -block.phase-heater.description = Heats facing blocks. Requires phase fabric. -block.heat-redirector.description = Redirects accumulated heat to other blocks. -block.small-heat-redirector.description = Redirects accumulated heat to other blocks. -block.heat-router.description = Spreads accumulated heat in three output directions. -block.electrolyzer.description = Converts water into hydrogen and ozone gas. -block.atmospheric-concentrator.description = Concentrates nitrogen from the atmosphere. Requires heat. -block.surge-crucible.description = Forms surge alloy from slag and silicon. Requires heat. -block.phase-synthesizer.description = Synthesizes phase fabric from thorium, sand, and ozone. Requires heat. -block.carbide-crucible.description = Fuses graphite and tungsten into carbide. Requires heat. -block.cyanogen-synthesizer.description = Synthesizes cyanogen from arkycite and graphite. Requires heat. -block.slag-incinerator.description = Incinerates non-volatile items or liquids. Requires slag. -block.vent-condenser.description = Condenses vent gases into water. Consumes power. -block.plasma-bore.description = When placed facing an ore wall, outputs items indefinitely. Requires small amounts of power. -block.large-plasma-bore.description = A larger plasma bore. Capable of mining tungsten and thorium. Requires hydrogen and power. -block.cliff-crusher.description = Crushes walls, outputting sand indefinitely. Requires power. Efficiency varies based on type of wall. -block.large-cliff-crusher.description = Crushes walls, outputting sand indefinitely. Requires power and ozone. Efficiency varies based on type of wall. Optionally consumes tungsten to increase efficiency. -block.impact-drill.description = When placed on ore, outputs items in bursts indefinitely. Requires power and water. -block.eruption-drill.description = An improved impact drill. Capable of mining thorium. Requires hydrogen. -block.reinforced-conduit.description = Moves fluids forward. Doesn't accept non-conduit inputs to the sides. -block.reinforced-liquid-router.description = Distributes fluids equally to all sides. -block.reinforced-liquid-tank.description = Stores a large amount of fluids. -block.reinforced-liquid-container.description = Stores a sizeable amount of fluids. -block.reinforced-bridge-conduit.description = Transports fluids over structures and terrain. -block.reinforced-pump.description = Pumps and outputs liquids. Requires hydrogen. -block.beryllium-wall.description = Protects structures from enemy projectiles. -block.beryllium-wall-large.description = Protects structures from enemy projectiles. -block.tungsten-wall.description = Protects structures from enemy projectiles. -block.tungsten-wall-large.description = Protects structures from enemy projectiles. -block.carbide-wall.description = Protects structures from enemy projectiles. -block.carbide-wall-large.description = Protects structures from enemy projectiles. -block.reinforced-surge-wall.description = Protects structures from enemy projectiles, periodically launching electric arcs upon projectile contact. -block.reinforced-surge-wall-large.description = Protects structures from enemy projectiles, periodically launching electric arcs upon projectile contact. -block.shielded-wall.description = Protects structures from enemy projectiles. Deploys a shield that absorbs most projectiles when power is provided. Conducts power. -block.blast-door.description = A wall that opens when allied ground units are in range. Cannot be manually controlled. -block.duct.description = Moves items forward. Only capable of storing a single item. -block.armored-duct.description = Moves items forward. Does not accept non-duct inputs from the sides. -block.duct-router.description = Distributes items equally across three directions. Only accepts items from the back side. Can be configured as an item sorter. -block.overflow-duct.description = Only outputs items to the sides if the front path is blocked. -block.duct-bridge.description = Moves items over structures and terrain. -block.duct-unloader.description = Unloads the selected item from the block behind it. Cannot unload from cores. -block.underflow-duct.description = Opposite of an overflow duct. Outputs to the front if the left and right paths are blocked. -block.reinforced-liquid-junction.description = Acts as a junction between two crossing conduits. -block.surge-conveyor.description = Moves items in batches. Can be sped up with power. Conducts power. -block.surge-router.description = Equally distributes items in three directions from surge conveyors. Can be sped up with power. Conducts power. -block.unit-cargo-loader.description = Constructs cargo drones. Drones automatically distribute items to Cargo Unload Points with a matching filter. -block.unit-cargo-unload-point.description = Acts as an unloading point for cargo drones. Accepts items that match the selected filter. -block.beam-node.description = Transmits power to other blocks orthogonally. Stores a small amount of power. -block.beam-tower.description = Transmits power to other blocks orthogonally. Stores a large amount of power. Long-range. -block.turbine-condenser.description = Generates power when placed on vents. Produces a small amount of water. -block.chemical-combustion-chamber.description = Generates power from arkycite and ozone. -block.pyrolysis-generator.description = Generates large amounts of power from arkycite and slag. Produces water as a byproduct. -block.flux-reactor.description = Generates large amounts of power when heated. Requires cyanogen as a stabilizer. Power output and cyanogen requirements are proportional to heat input.\nExplodes if insufficient cyanogen is provided. -block.neoplasia-reactor.description = Uses arkycite, water and phase fabric to generate large amounts of power. Produces heat and dangerous neoplasm as a byproduct.\nExplodes violently if neoplasm is not removed from the reactor via conduits. -block.build-tower.description = Automatically rebuilds structures in range and assists other units in construction. -block.regen-projector.description = Slowly repairs allied structures in a square perimeter. Requires hydrogen. -block.reinforced-container.description = Stores a small amount of items. Contents can be retrieved via unloaders. Does not increase core storage capacity. -block.reinforced-vault.description = Stores a large amount of items. Contents can be retrieved via unloaders. Does not increase core storage capacity. -block.tank-fabricator.description = Constructs Stell units. Outputted units can be used directly, or moved into refabricators for upgrading. -block.ship-fabricator.description = Constructs Elude units. Outputted units can be used directly, or moved into refabricators for upgrading. -block.mech-fabricator.description = Constructs Merui units. Outputted units can be used directly, or moved into refabricators for upgrading. -block.tank-assembler.description = Assembles large tanks out of inputted blocks and units. Output tier may be increased by adding modules. -block.ship-assembler.description = Assembles large ships out of inputted blocks and units. Output tier may be increased by adding modules. -block.mech-assembler.description = Assembles large mechs out of inputted blocks and units. Output tier may be increased by adding modules. -block.tank-refabricator.description = Upgrades inputted tank units to the second tier. -block.ship-refabricator.description = Upgrades inputted ship units to the second tier. -block.mech-refabricator.description = Upgrades inputted mech units to the second tier. -block.prime-refabricator.description = Upgrades inputted units to the third tier. +block.interplanetary-accelerator.description = Масивна електромагнитна релсова кула. Ускорява ядрото до необходимата за междупланетно изстрелване скорост. +block.repair-turret.description = Непрекъснато ремонтира най-близката повредена единица в обхват. Може да приема охладител. +block.core-bastion.description = Ядро на базата. Добре бронирано. Ако бъде унищожено, секторът е загубен. +block.core-citadel.description = Ядро на базата. Много добре бронирано. Съхранява повече ресурси от ядро Убежище. +block.core-acropolis.description = Ядро на базата. Изключтилено бронирано. Съхранява повече ресурси от ядро Цитадела. +block.breach.description = Изстрелва пробождащи муниции от берилий или волфрам. +block.diffuse.description = Изстрелва облак от куршуми в широк конус. Изтласква враговете назад. +block.sublimate.description = Изпуска продължителна струя от пламък към врага. Пробожда брони. +block.titan.description = Изстрелва масивен артилерийски снаряд към наземни мишени. Нуждае се от водород. +block.afflict.description = Изстрелва масивна заредена сфера от фрагментарна противовъздушна сила. Нуждае се от нагряване. +block.disperse.description = Изстрелва противовъздушни снаряди към летящи мишени. +block.lustre.description = Изстрелва бавноподвижен лазер към една мишена. +block.scathe.description = Изстрелва могъща ракета към наземни мишени през огромни разстояния. +block.smite.description = Изстрелва серия от пробождащи, наелектризирани куршуми. +block.malign.description = Изстрелва порой от самонасочващи се лазерни заряди. Нуждае се от значително нагряване. +block.silicon-arc-furnace.description = Рефинира силикон от пясък и графит. +block.oxidation-chamber.description = Преобразува берилий и озон в оксид. Излъчва топлина като страничен продукт. +block.electric-heater.description = Нагрява срещуположни блокове. Нуждае се от големи количества електричество. +block.slag-heater.description = Нагрява срещуположни блокове. Нуждае се от слаг. +block.phase-heater.description = Нагрява срещуположни блокове. Нуждае се от фазова тъкан. +block.heat-redirector.description = Пренасочва натрупана топлина към други блокове. +block.heat-router.description = Разпределя натрупаната топлина в три изходящи посоки. +block.electrolyzer.description = Превръща вода във водород и озонов газ. +block.atmospheric-concentrator.description = Концентрира азот от атмосферата. Нуждае се от нагряване. +block.surge-crucible.description = Образува импулсна сплав от слаг и силикон. Нуждае се от нагряване. +block.phase-synthesizer.description = Синтезира фазова тъкан от торий, пясък и озон. Нуждае се от нагряване. +block.carbide-crucible.description = Слива графит и волфрам в карбид. Нуждае се от нагряване. +block.cyanogen-synthesizer.description = Синтезира цианоген от акрицид и графит. Нуждае се от нагряване. +block.slag-incinerator.description = Изгаря устойчиви предмети или течности. Нуждае се от слаг. +block.vent-condenser.description = Кондензира изпуснати газове във вода. Поглъща електричество. +block.plasma-bore.description = Когато се постави срещуположно на стена с руда, извежда предмети безкрайно. Нуждае се от малко електричество. +block.large-plasma-bore.description = По-голяма плазмена бургия. Способна е да изкопава волфрам и торий. Нуждае се от водород и електричество. +block.cliff-crusher.description = Натрошава стени, за да генерира безкрайно количество пясък. Нуждае се от ток. Ефикасността варира спрямо вида стена. +block.impact-drill.description = Когато се постави върху руда, извежда предмети безкрайно на тласъци. Нуждае се от ток и вода. +block.eruption-drill.description = Подобрен сблъсъчен свредел. Способен е да изкопава торий. Нуждае се от водород. +block.reinforced-conduit.description = Придвижва течности напред. Не приема непроводими материали от страни. +block.reinforced-liquid-router.description = Разпределя течности поравно на всички страни. +block.reinforced-liquid-tank.description = Съхранява голямо количество течности. +block.reinforced-liquid-container.description = Съхранява значително количество течности. +block.reinforced-bridge-conduit.description = Пренася течности над структури и над терен. +block.reinforced-pump.description = Изпомпва и изнася течности. Нуждае се от водород. +block.beryllium-wall.description = Защитава сградите от вражески огън. +block.beryllium-wall-large.description = Защитава сградите от вражески огън. +block.tungsten-wall.description = Защитава сградите от вражески огън. +block.tungsten-wall-large.description = Защитава сградите от вражески огън. +block.carbide-wall.description = Защитава сградите от вражески огън. +block.carbide-wall-large.description = Защитава сградите от вражески огън. +block.reinforced-surge-wall.description = Защитава структури от вражески огън, периодично освобождавайки електрически дъги при контакт. +block.reinforced-surge-wall-large.description = Защитава структури от вражески огън, периодично освобождавайки волтови дъги при контакт. +block.shielded-wall.description = Защитава структури от вражески огън. Пуска щит, който поглъща повечето снаряди, докато има електричество. Нуждае се от ток. +block.blast-door.description = Стена, която се отваря, когато в близост има приятелски наземни единици. Не може да се управлява ръчно. +block.duct.description = Придвижва предмети напред. Може да съхранява само по един предмет. +block.armored-duct.description = Придвижва предмети напред. Не приема чужди предмети от страни. +block.duct-router.description = Разпределя предмети поравно в три посоки. Приема предмети единствено от задната си страна. Може да се настрои като сортировач на предмети. +block.overflow-duct.description = Извежда предмети към стените единствено, ако предният път е възпрепятстван. +block.duct-bridge.description = Придвижва предмети над сгради и терен. +block.duct-unloader.description = Разтоварва избраният предмет от блока зад него. Не може да разтоварва от ядра. +block.underflow-duct.description = Обратното на преливащ тръбопровод. Извежда напред, когато левият и десният път са блокирани. +block.reinforced-liquid-junction.description = Действа като пресечна точка между два пресичащи се потока. +block.surge-conveyor.description = Придвижва предмети на партити. Може да се ускори с електричество. Електропроводим. +block.surge-router.description = Разпределя предмети в три посоки поравно от импулсни ленти. Може да се ускори с електричество. Електропроводим. +block.unit-cargo-loader.description = Построява товарителни дрони. Дроните автоматично разпределят предмети към Разтоварителни точки със съвпадащ филтър. +block.unit-cargo-unload-point.description = Действа като разтоварваща точка за товарителни дрони. Приема предмети, които съвпадат с посочения филтър. +block.beam-node.description = Предава електричество ортогонално към други блокове. Съхранява малко количество ток. +block.beam-tower.description = Предава електричество ортогонално към други блокове. Съхранява голямо количество ток. Висок обхват. +block.turbine-condenser.description = Създава ток, когато се постави върху отвори. Произвежда малко количество вода. +block.chemical-combustion-chamber.description = Създава ток от аркицид и озон. +block.pyrolysis-generator.description = Създава голямо количество ток от аркицид и слаг. Произвежда вода като страничен продукт. +block.flux-reactor.description = Когато се нагрее, създава големи количества електричество. Изисква цианоген, за да се стабилизира. Изходящият ток и нуждата от цианоген са пропорционални с подадената топлина.\nЕксплодира, ако не получи достатъчно цианоген. +block.neoplasia-reactor.description = Използва аркицид, вода и фазова тъкан, за да създава високи количества електричество. Произвежда топлина и опасна нео-плазма като странични продукти.\nЕкслодира жестоко, когато нео-плазмата не се извежда от реактора с тръбопроводи. +block.build-tower.description = Автоматично възстановява сгради в обхвата си и единици в производство. +block.regen-projector.description = Бавно поправя приятелски сгради в квадратен периметър. Нуждае се от водород. +block.reinforced-container.description = Съхранява малко количество предмети. Съдържанието може да бъде извеждано с разтоварители. Не увеличава размера на хранилището на ядрото. +block.reinforced-vault.description = Съхранява голямо количество предмети. Съдържанието може да бъде извеждано с разтоварители. Не увеличава размера на хранилището на ядрото. +block.tank-fabricator.description = Произвежда единици тип "Стел". Изведените единици могат да се управляват директно или да бъдат изпратени към рефабрикаторите за подобрение. +block.ship-fabricator.description = Произвежда единици тип "Елуд". Изведените единици могат да се управляват директно или да бъдат изпратени към рефабрикаторите за подобрение. +block.mech-fabricator.description = Произвежда единици тип "Меруи". Изведените единици могат да се управляват директно или да бъдат изпратени към рефабрикаторите за подобрение. +block.tank-assembler.description = Изгражда огромни танкове от въведени блокове и единици. Изходящиата единица може да бъде подобрен чрез модули. +block.ship-assembler.description = Изгражда огромни кораби от въведени блокове и единици. Изходящиата единица може да бъде подобрен чрез модули. +block.mech-assembler.description = Изгражда огромни машини от въведени блокове и единици. Изходящиата единица може да бъде подобрен чрез модули. +block.tank-refabricator.description = Подобрява въведените танкове до второ ниво. +block.ship-refabricator.description = Подобрява въведените кораби до второ ниво. +block.mech-refabricator.description = Подобрява въведените машини до второ ниво. +block.prime-refabricator.description = Подобрява въведените единици до трето ниво. block.basic-assembler-module.description = Increases assembler tier when placed next to a construction boundary. Requires power. Can be used as a payload input. -block.small-deconstructor.description = Deconstructs inputted structures and units. Returns 100% of the build cost. -block.reinforced-payload-conveyor.description = Moves payloads forward. -block.reinforced-payload-router.description = Distributes payloads into adjacent blocks. Functions as a sorter when a filter is set. -block.payload-mass-driver.description = Long-range payload transport structure. Shoots received payloads to linked payload mass drivers. -block.large-payload-mass-driver.description = Long-range payload transport structure. Shoots received payloads to linked payload mass drivers. -block.unit-repair-tower.description = Repairs all units in its vicinity. Requires ozone. -block.radar.description = Gradually uncovers terrain and enemy units in a large radius. Requires power. -block.shockwave-tower.description = Damages and destroys enemy projectiles in a radius. Requires cyanogen. -block.canvas.description = Displays a simple image with a pre-defined palette. Editable. +block.small-deconstructor.description = Деконструира въведени сгради и единици. Възвръща 100% от разхода им за производство. +block.reinforced-payload-conveyor.description = Придвижва товарите напред. +block.reinforced-payload-router.description = Разпределя товари в съседни блокове. Когато има посочен филтър, действа като сортировач. +block.payload-mass-driver.description = Далекообхватна сграда за транспорт на товари. Изстрелва получените товари към свързани масирани двигатели. +block.large-payload-mass-driver.description = Далекообхватна сграда за транспорт на товари. Изстрелва получените товари към свързани масирани двигатели. +block.unit-repair-tower.description = Поправя всички единици в своя обхват. Нуждае се от озон. +block.radar.description = Постепенно разкрива терена и вражески единици в широк радиус. Нуждае се от електричество. +block.shockwave-tower.description = Поврежда и унищожава вражески снаряди в обхвата си. Нуждае се от цианоген. +block.canvas.description = Показва просто изображение с предзададена палитра. Може да се редактира. unit.dagger.description = Изстрелва стандартни боеприпаси по всички близки врагове. unit.mace.description = Изстрелва поток от пламък по всички близки врагове. unit.fortress.description = Далекообхватна атака срещу наземни единици. unit.scepter.description = Изстрелва залп от заредени куршуми по всички близки врагове. unit.reign.description = Изстрелва залп от масивни пронизващи куршуми по всички близки врагове. -unit.nova.description = Изстрелва лазерни лъчи, които повреждат врагове и поправят приятелски структури. Може да лети. -unit.pulsar.description = Активира волтови дъги, които повреждат врагове и поправят приятелски структури. Може да лети. -unit.quasar.description = Изстрелва пронизващи лазерни лъчи, които повреждат врагове и поправят приятелски структури. Може да лети. Има защитно поле. -unit.vela.description = Изстрелва масивен продължителен лазерен лъч, който поврежда врагове, причинява пожари и поправя приятелски структури. Може да лети. -unit.corvus.description = Изстрелва масивен лазерен взрив, който поврежда врагове и поправя приятелски структури. Може да преминава над повечето терени. -unit.crawler.description = Бяга към врагове и се самоунищожава, причинявайки голяма експлозия. -unit.atrax.description = Изстрелва инвалидизиращи кълба от шлака по наземни цели. Може да прекрачи повечето терени. -unit.spiroct.description = Изстрелва пронизващи лазерни лъчи по враговете, като се самовъзстановява в процеса. Може да преминава над повечето терени. -unit.arkyid.description = Атакува врагове със големи източващи лазерни лъчи, самопоправяйки се в процеса. Може да преминава над повечето терени. -unit.toxopid.description = Изстрелва големи електрически клъстерни снаряди и пронизващи лазери по врагове. Може да преминава над повечето терени. +unit.nova.description = Изстрелва лазерни лъчи, които повреждат врагове и поправят приятелски сгради. Може да лети. +unit.pulsar.description = Активира волтови дъги, които повреждат врагове и поправят приятелски сгради. Може да лети. +unit.quasar.description = Изстрелва пронизващи лазерни лъчи, които повреждат врагове и поправят приятелски сгради. Може да лети. Има защитно поле. +unit.vela.description = Изстрелва масивен продължителен лазерен лъч, който поврежда врагове, причинява пожари и поправя приятелски сгради. Може да лети. +unit.corvus.description = Изстрелва масивен лазерен взрив, който поврежда врагове и поправя приятелски сгради. Може да преминава над повечето терени. +unit.crawler.description = Бяга към врагове и се самоунищожава, предизвиквайки голяма експлозия. +unit.atrax.description = Изстрелва обездвижващи кълба от шлака по наземни цели. Може да прекосява почти всякакъв терен. +unit.spiroct.description = Изстрелва пронизващи лазерни лъчи по враговете и се самовъзстановява. Може да прекосява почти всякакъв терен. +unit.arkyid.description = Атакува врагове с големи източващи лазерни лъчи и се самовъзстановява. Може да прекосява почти всякакъв терен. +unit.toxopid.description = Изстрелва големи електрически клъстерни снаряди и пронизващи лазери по врагове. Може да прекосява почти всякакъв терен. unit.flare.description = Изстрелва стандартни снаряди по близки наземни врагове. -unit.horizon.description = Пуска серии от бомби по наземни мишени. +unit.horizon.description = Пуска серия от бомби по наземни мишени. unit.zenith.description = Изстрелва залпове от ракети по всички близки врагове. -unit.antumbra.description = Изстрелва залп от боеприпаси по всички врагове в обхват. +unit.antumbra.description = Изстрелва залп от боеприпаси по всички врагове в обхвата си. unit.eclipse.description = Изстрелва два пробиващи лазера и залп от сачми по близки врагове. unit.mono.description = Автоматично добива мед и олово, след което ги пренася в ядрото. -unit.poly.description = Автоматично поправя или построява увредени и унищожени структури. Помага на други единици в строежи. -unit.mega.description = Автоматично поправя повредени структури. Може да пренася блокове и малки наземни единици. -unit.quad.description = Пуска големи бомби по земни мишени, поправяйки приятелски структури и повреждайки врагове. Може да пренася средни по размер наземни единици. +unit.poly.description = Автоматично поправя или построява увредени и унищожени сгради. Помага на други единици в строежи. +unit.mega.description = Автоматично поправя повредени сгради. Може да пренася блокове и малки наземни единици. +unit.quad.description = Пуска големи бомби по наземни мишени, поправя приятелски сгради и поврежда враговете. Може да пренася средни по размер наземни единици. unit.oct.description = Защитава приятелски единици чрез регенериращо защитно поле. Може да пренася повечето наземни единици. unit.risso.description = Изстрелва залпове от ракети и боеприпаси по всички близки врагове. unit.minke.description = Изстрелва сачми и стандартни муниции по наземни мишени. unit.bryde.description = Изстрелва далекообхватни боеприпаси и ракети по врагове. unit.sei.description = Изстрелва поредица от ракети и бронебойни куршуми по врагове. unit.omura.description = Изстрелва далечни пробивни релсови лазери по врагове. Изгражда единици модел Факел. -unit.alpha.description = Защитава ядро Шард от врагове. Строи структури. -unit.beta.description = Защитава ядро Фондация от врагове. Строи структури. -unit.gamma.description = Защитава ядро Център от врагове. Строи структури. -unit.retusa.description = Fires homing torpedoes at nearby enemies. Repairs allied units. -unit.oxynoe.description = Fires structure-repairing streams of flame at nearby enemies. Targets nearby enemy projectiles with a point defense turret. -unit.cyerce.description = Fires seeking cluster-missiles at enemies. Repairs allied units. -unit.aegires.description = Shocks all enemy units and structures that enter its energy field. Repairs all allies. -unit.navanax.description = Fires explosive EMP projectiles, dealing significant damage to enemy power networks and repairing allied structures. Melts nearby enemies with 4 autonomous laser turrets. -unit.stell.description = Fires standard bullets at enemy targets. -unit.locus.description = Fires alternating bullets at enemy targets. -unit.precept.description = Fires piercing cluster bullets at enemy targets. -unit.vanquish.description = Fires large piercing splitting bullets at enemy targets. -unit.conquer.description = Fires large piercing cascades of bullets at enemy targets. -unit.merui.description = Fires long-range artillery at enemy ground targets. Can step over most terrain. -unit.cleroi.description = Fires dual shells at enemy targets. Targets enemy projectiles with point defense turrets. Can step over most terrain. -unit.anthicus.description = Fires long-range homing missiles at enemy targets. Can step over most terrain. -unit.tecta.description = Fires homing plasma missiles at enemy targets. Protects itself with a directional shield. Can step over most terrain. -unit.collaris.description = Fires long-range fragmenting artillery at enemy targets. Can step over most terrain. -unit.elude.description = Fires pairs of homing bullets at enemy targets. Can float over bodies of liquid. -unit.avert.description = Fires twisting pairs of bullets at enemy targets. -unit.obviate.description = Fires twisting pairs of lightning orbs at enemy targets. -unit.quell.description = Fires long-range homing missiles at enemy targets. Suppresses enemy structure repair blocks. -unit.disrupt.description = Fires long-range homing suppression missiles at enemy targets. Suppresses enemy structure repair blocks. -unit.evoke.description = Builds structures to defend the Bastion core. Repairs structures with a beam. -unit.incite.description = Builds structures to defend the Citadel core. Repairs structures with a beam. -unit.emanate.description = Builds structures to defend the Acropolis core. Repairs structures with beams. +unit.alpha.description = Защитава ядро Частица от врагове. Строи сгради. +unit.beta.description = Защитава ядро Фондация от врагове. Строи сгради. +unit.gamma.description = Защитава ядро Център от врагове. Строи сгради. +unit.retusa.description = Изстрелва самонасочващи се торпеда към близки врагове. Поправя приятелски единици. +unit.oxynoe.description = Изстрелва потоци от огън, които вредят на враговете и поправят сгради. Насочва се към вражески снаряди с кула за точкова защита. +unit.cyerce.description = Изстрелва търсещи клъстерни ракети по враговете. Поправя приятелски единици. +unit.aegires.description = Шокира всички вражески единици и сгради в енергийното си поле. Поправя всички приятелски единици. +unit.navanax.description = Изстрелва експлозивни ЕМП снаряди, които нанасят значителна вреда на вражеските силови мрежи и поправя приятелски сгради. Разтопява близки врагове с 4 автономни лазерни оръдия. +unit.stell.description = Стреля със стандартни куршуми по вражески цели. +unit.locus.description = Стреля последователни куршуми по вражески цели. +unit.precept.description = Стреля с пронизващи клъстерни куршуми по вражески цели. +unit.vanquish.description = Стреля с едри пронизващи и разцепващи се куршуми по вражески цели. +unit.conquer.description = Стреля с едри пронизващи каскади от куршуми по вражески цели. +unit.merui.description = Стреля с далекообхватна артилерия по вражески наземни цели. Може да прекосява почти всякакъв терен. +unit.cleroi.description = Стреля с двойни снаряди по вражески цели. Насочва се към вражески снаряди с кули с точкова защита. Може да прекосява почти всякакъв терен. +unit.anthicus.description = Изстрелва далекообхватни самонасочващи се ракети по вражески цели. Може да прекосява почти всякакъв терен. +unit.tecta.description = Изстрелва самонасочващи се плазмени ракети по вражески цели. Защитава се с насочен щит. Може да прекосява почти всякакъв терен. +unit.collaris.description = Изстрелва далекообхватна фрагментарна артилерия по вражески цели. Може да прекосява почти всякакъв терен. +unit.elude.description = Изстрелва чифт самонасочващи се куршуми по вражески цели. Може да прелита над течни басейни. +unit.avert.description = Изстрелва усукващи се чифтове куршуми по вражески цели. +unit.obviate.description = Изстрелва усукващи се чифтове електрически сфери по вражески цели. +unit.quell.description = Изстрелва далекообхватни самонасочващи се ракети по вражески цели. Възпира поправките на вражески блокове. +unit.disrupt.description = Изстрелва далекообхватни самонасочващи се и възпиращи ракети по вражески цели. Възпира поправките на вражески блокове. +unit.evoke.description = Строи сгради, за да защитава ядро Убежище. Поправя сгради с лъч. +unit.incite.description = Строи сгради, за да защитава ядро Цитадела. Поправя сгради с лъч. +unit.emanate.description = Строи сгради, за да защитава ядро Акропол. Поправя сгради с лъч. lst.read = Прочети число от свързано хранилище за памет. lst.write = Запиши число в свързано хранилище за памет. @@ -2382,33 +2350,33 @@ lst.sensor = Взима информация от сграда или едини lst.set = Задава променлива. lst.operation = Изпълнява операция с 1 или 2 променливи. lst.end = Започва списъка с инструкции от начало. -lst.wait = Wait a certain number of seconds. -lst.stop = Halt execution of this processor. -lst.lookup = Look up an item/liquid/unit/block type by ID.\nTotal counts of each type can be accessed with:\n[accent]@unitCount[] / [accent]@itemCount[] / [accent]@liquidCount[] / [accent]@blockCount[] -lst.jump = Прескача до друга позиция в програмата ако дадено условие е изпълнено. +lst.wait = Изчаква определен брой секунди. +lst.stop = Спира изпълнението на този процесор. +lst.lookup = Търси предмет/течност/единица/вид блок чрез неговото ID.\nМожете да видите общият брой на всеки вид чрез:\n[accent]@unitCount[] / [accent]@itemCount[] / [accent]@liquidCount[] / [accent]@blockCount[] +lst.jump = Прескача до друга позиция в програмата, когато дадено условие бъде изпълнено. lst.unitbind = Поема контрол над следващата единица от избран тип и я записва в променливата [accent]@unit[]. lst.unitcontrol = Управлява контролираната в момента единица. lst.unitradar = Засича единици около контролираната единица. lst.unitlocate = Намира конкретен тип постройка/позиция на картата.\nНеобходимо е да контролирате единица за да го използвате. -lst.getblock = Get tile data at any location. -lst.setblock = Set tile data at any location. -lst.spawnunit = Spawn unit at a location. -lst.applystatus = Apply or clear a status effect from a uniut. +lst.getblock = Получаване на данни за повърхност от всяка локация. +lst.setblock = Задаване на данни за повърхност от всяка локация. +lst.spawnunit = Създава единица върху дадена повърхност. +lst.applystatus = Прилага или премахва определено състояние от единица. lst.weathersense = Check if a type of weather is active. lst.weatherset = Set the current state of a type of weather. -lst.spawnwave = Simulate a wave being spawned at a arbitrary location.\nWill not increment the wave counter. -lst.explosion = Create an explosion at a location. +lst.spawnwave = Симулира пусната вълна на произволно място.\nНяма да увеличи бройката на вълните. +lst.explosion = Създава експлозия на избрано място. lst.setrate = Set processor execution speed in instructions/tick. lst.fetch = Lookup units, cores, players or buildings by index.\nIndices start at 0 and end at their returned count. lst.packcolor = Pack [0, 1] RGBA components into a single number for drawing or rule-setting. -lst.setrule = Set a game rule. -lst.flushmessage = Display a message on the screen from the text buffer.\nWill wait until the previous message finishes. -lst.cutscene = Manipulate the player camera. -lst.setflag = Set a global flag that can be read by all processors. -lst.getflag = Check if a global flag is set. -lst.setprop = Sets a property of a unit or building. +lst.setrule = Поставяне на правило за игра. +lst.flushmessage = Извежда съобщение на екрана от текстовия буфер.\nИзчаква до приключването на предишното съобщение. +lst.cutscene = Манипулира камерата на играча. +lst.setflag = Поставяне на глобално знаме, което може да се разчете от всички процесори. +lst.getflag = Проверява дали е поставено глобално знаме. +lst.setprop = Поставя притежанието на единица или сграда. lst.effect = Create a particle effect. -lst.sync = Sync a variable across the network.\nOnly invoked 10 times a second at most. +lst.sync = Синхронизира променлива през мрежата.\nПредизвиква се най-много 10 пъти в секунда. lst.playsound = Plays a sound.\nVolume and pan can be a global value, or calculated based on position. lst.makemarker = Create a new logic marker in the world.\nAn ID to identify this marker must be provided.\nMarkers currently limited to 20,000 per world. lst.setmarker = Set a property for a marker.\nThe ID used must be the same as in the Make Marker instruction. @@ -2452,36 +2420,36 @@ lglobal.@clientMobile = True is the client running the code is on mobile, false logic.nounitbuild = [red]Действия за строене на единици не са позволени тук. -lenum.type = Тип сграда/единица\nНапример, за рутер това ще върне [accent]@router[].\nНе е текст. +lenum.type = Тип сграда/единица\nНапример, за рутер, това ще върне [accent]@router[].\nНе е текст. lenum.shoot = Стреля към позиция. lenum.shootp = Прицелва се в единица/сграда, изчислявайки нейната скорост. lenum.config = Building configuration, e.g. sorter item. lenum.enabled = Дали блокът е активиран или забранен. -laccess.currentammotype = Current ammo item/liquid of a turret. +laccess.currentammotype = Текущите муниции/течност на оръдието. laccess.color = Цвят на осветителя. -laccess.controller = Връща кой контролира единицата.\nАко е управляване от процесор, връща процесора.\nАко е във формация, връща лидера.\nИначе, връща самата единица. +laccess.controller = Показва кой контролира единицата.\nАко се управлява от процесор, показва него.\nАко е във формация, показва водача й.\nИначе ще покаже самата единица. laccess.dead = Дали дадена единица/сграда е била унищожена или вече е невалидна. -laccess.controlled = Връща:\n[accent]@ctrlProcessor[] ако единицата е контролирана от процесор\n[accent]@ctrlPlayer[] ако единицата/сградата е контролирана от играч\n[accent]@ctrlFormation[] ако единицата участва във формация\nИначе, връща 0. +laccess.controlled = Показва:\n[accent]@ctrlProcessor[] ако единицата е контролирана от процесор\n[accent]@ctrlPlayer[] ако единицата/сградата е контролирана от играч\n[accent]@ctrlFormation[] ако единицата участва във формация\nИначе, връща 0. laccess.progress = Action progress, 0 to 1.\nReturns production, turret reload or construction progress. -laccess.speed = Top speed of a unit, in tiles/sec. -laccess.id = ID of a unit/block/item/liquid.\nThis is the inverse of the lookup operation. -lcategory.unknown = Unknown -lcategory.unknown.description = Uncategorized instructions. -lcategory.io = Input & Output -lcategory.io.description = Modify contents of memory blocks and processor buffers. -lcategory.block = Block Control -lcategory.block.description = Interact with blocks. -lcategory.operation = Operations -lcategory.operation.description = Logical operations. -lcategory.control = Flow Control -lcategory.control.description = Manage execution order. -lcategory.unit = Unit Control -lcategory.unit.description = Give units commands. -lcategory.world = World -lcategory.world.description = Control how the world behaves. +laccess.speed = Най-висока скорост за единица, измерено в полета/секунда. +laccess.id = ID на единица/блок/предмет/течност.\nТази операция е обратната на търсенето. +lcategory.unknown = Неизвестно +lcategory.unknown.description = Некатегоризирани указания. +lcategory.io = Вход и изход +lcategory.io.description = Модифицира съдържанията на помнещи блокове и процесорни буфери. +lcategory.block = Контрол на блок +lcategory.block.description = Взаимодействие с блокове. +lcategory.operation = Операции +lcategory.operation.description = Логически операции. +lcategory.control = Контрол на течението +lcategory.control.description = Управление на изпълнителния ред. +lcategory.unit = Управление на единица +lcategory.unit.description = Управляване на единици. +lcategory.world = Свят +lcategory.world.description = Управлява поведението на света. -graphicstype.clear = Запълва с цвятr. +graphicstype.clear = Запълва с цвят. graphicstype.color = Задава цвят за следващи операции. graphicstype.col = Equivalent to color, but packed.\nPacked colors are written as hex codes with a [accent]%[] prefix.\nExample: [accent]%ff0000[] would be red. graphicstype.stroke = Задава дебелина на линията. @@ -2492,7 +2460,7 @@ graphicstype.poly = Запълва правилен многоъгълник. graphicstype.linepoly = Очертава правилен многоъгълник. graphicstype.triangle = Запълва триъгълник. graphicstype.image = Рисува изображение.\nНапример: [accent]@router[] или [accent]@dagger[]. -graphicstype.print = Draws text from the print buffer.\nClears the print buffer. +graphicstype.print = Чертае текст от принтеровия буфер.\nИзчиства буфера. lenum.always = Винаги вярно lenum.idiv = Деление с цели числа. @@ -2512,14 +2480,14 @@ lenum.xor = Побитово ИЗКЛЮЧВАЩО ИЛИ. lenum.min = Минимална стойност от 2 числа. lenum.max = Максимална стойност от 2 числа. lenum.angle = Ъгъл на вектор в градуси. -lenum.anglediff = Absolute distance between two angles in degrees. +lenum.anglediff = Абсолютното разстояние между два ъгъла в градуси. lenum.len = Дължина на вектор. lenum.sin = Синус, в градуси. lenum.cos = Косинус, в градуси. lenum.tan = Тангенс, в градуси. -lenum.asin = Arc sine, in degrees. -lenum.acos = Arc cosine, in degrees. -lenum.atan = Arc tangent, in degrees. +lenum.asin = Дъгов синус, в градуси. +lenum.acos = Дъгов косинус, в градуси. +lenum.atan = Дъгов тангенс, в градуси. #not a typo, look up 'range notation' lenum.rand = Случайно число в регион [0, стойност). lenum.log = Естествен логаритъм (ln). @@ -2548,20 +2516,20 @@ lenum.generator = Електрогенератор. lenum.factory = Сграда която обработва ресурси, фабрика. lenum.repair = Точка за ремонт. lenum.battery = Батерия. -lenum.resupply = Точка за снабдяване.\nИма смисъл само ако [accent]"Единиците се Нуждаят от Боеприпаси"[] е активирано. +lenum.resupply = Точка за снабдяване.\nИма смисъл само ако [accent]"Единиците се нуждаят от боеприпаси"[] е активирано. lenum.reactor = Ударен или Ториев реактор. lenum.turret = Всякаква кула. sensor.in = Сградата/единицата, от която да вземе информация. radar.from = Постройка от която да вземе информация.\nОбхватът е ограничен от обхвата за строене. -radar.target = Филтър за единици, които да усети. +radar.target = Филтър за единици, които ще засича. radar.and = Допълнителни филтри. radar.order = Ред на сортиране. 0 за обръщане. radar.sort = Показател за сортиране. -radar.output = Променлива в която да извете намерената единица. +radar.output = Променлива, в която да изведе намерената единица. -unitradar.target = Филтър за единици, които да усети. +unitradar.target = Филтър за единици, които ще засича. unitradar.and = Допълнителни филтри. unitradar.order = Ред на сортиране. 0 за обръщане. unitradar.sort = Показател за сортиране. @@ -2577,28 +2545,28 @@ unitlocate.building = Променлива в която да запише на unitlocate.outx = Резултатна X координата. unitlocate.outy = Резултатна Y координата. unitlocate.group = Група постройки за които да търси. -playsound.limit = If true, prevents this sound from playing\nif it has already been played in the same frame. +playsound.limit = Ако е вярно, предотвратява този звук,\nв случай, че вече е прозвучал в същия кадър. -lenum.idle = Не се движи, но продължи да строиш/добиваш ресурси.\nСтандартното поведение. +lenum.idle = Не се движи, но продължи да строиш/добиваш ресурси.\nСтандартно поведение. lenum.stop = Спри да се движиш/добиваш ресурси/строиш. -lenum.unbind = Completely disable logic control.\nResume standard AI. +lenum.unbind = Напълно изключва логически контрол.\nПродължава стандартно поведение. lenum.move = Премести се на конкретна позиция. lenum.approach = Доближи се до позиция на определено разстояние. lenum.pathfind = Намери пътека до вражеската начална точка. -lenum.autopathfind = Automatically pathfinds to the nearest enemy core or drop point.\nThis is the same as standard wave enemy pathfinding. +lenum.autopathfind = Автоматично намира пътя до най-близкото вражеско ядро или точка на кацане.\nТова е същото като обичайното ориентиране на вражеските вълни. lenum.target = Стреляй към позиция. lenum.targetp = Стреляй към цел, изчислявайки нейната скорост. lenum.itemdrop = Разтовари предмет(и). lenum.itemtake = Вземи предмет(и) от сграда. lenum.paydrop = Разтовари товар. lenum.paytake = Вземи товар от сегашната позиция. -lenum.payenter = Enter/land on the payload block the unit is on. +lenum.payenter = Влез/кацни на товарния блок, върху който се намира единицата. lenum.flag = Числов флаг на единица. lenum.mine = Добивай ресурси от позиция. lenum.build = Построй структура. -lenum.getblock = Fetch building, floor and block type at coordinates.\nUnit must be in range of the position, otherwise null is returned. +lenum.getblock = Провери типа на постройката на дадени координати.\nПозицията трябва да е в обхвата на единицата.\nСолидни не-сгради ще имат типа [accent]@solid[]. lenum.within = Проверете дали дадена позиция е в обхват на единицата. -lenum.boost = Започни/Спри ускорението. +lenum.boost = Започни/Спри ускорението lenum.flushtext = Flush print buffer's content to marker, if applicable.\nIf fetch is set to true, tries to fetch properties from map locale bundle or game's bundle. lenum.texture = Texture name straight from game's texture atlas (using kebab-case naming style).\nIf printFlush is set to true, consumes text buffer content as text argument. lenum.texturesize = Size of texture in tiles. Zero value scales marker width to original texture's size. From 43738d41955fe2af22145845bad1f9be9e6de738 Mon Sep 17 00:00:00 2001 From: Github Actions Date: Wed, 5 Feb 2025 00:34:51 +0000 Subject: [PATCH 164/460] Automatic bundle update --- core/assets/bundles/bundle_bg.properties | 65 +++++++++++++++++++----- core/assets/bundles/bundle_lt.properties | 1 + 2 files changed, 52 insertions(+), 14 deletions(-) diff --git a/core/assets/bundles/bundle_bg.properties b/core/assets/bundles/bundle_bg.properties index f6b3cd671e..2e1268f675 100644 --- a/core/assets/bundles/bundle_bg.properties +++ b/core/assets/bundles/bundle_bg.properties @@ -684,7 +684,7 @@ objective.destroycore.name = Унищожете ядро objective.commandmode.name = Команден режим objective.flag.name = Поставете флаг marker.shapetext.name = Оформяне на текст -marker.minimap.name = Мини-карта +marker.point.name = Point marker.shape.name = Форма marker.text.name = Текст marker.line.name = Линия @@ -740,7 +740,7 @@ error.bloom = Неуспешно инициализиране на Сияния. error.moddex = Mindustry is unable to load this mod.\nYour device is blocking import of Java mods due to recent changes in Android.\nThere is no known workaround to this issue. weather.rain.name = Дъжд -weather.snow.name = Сняг +weather.snowing.name = Snow weather.sandstorm.name = Пясъчна буря weather.sporestorm.name = Спорова буря weather.fog.name = Мъгла @@ -778,11 +778,11 @@ sector.curlost = Зоната е изгубена sector.missingresources = [scarlet]Недостатъчно ресурси в ядрото sector.attacked = Зона [accent]{0}[white] е под атака! sector.lost = Зона [accent]{0}[white] беше загубена! -#note: the missing space in the line below is intentional -sector.captured = Зона [accent]{0}[white]беше превзета! +sector.capture = Sector [accent]{0}[white] Captured! +sector.capture.current = Sector Captured! sector.changeicon = Промени икона sector.noswitch.title = Невъзможно е превключването на сектори -sector.noswitch = Не можете да смените секторите, докато вече съществуващ сектор е под нападение.\n\Сектор: [accent]{0}[] на [accent]{1}[] +sector.noswitch = Не можете да смените секторите, докато вече съществуващ сектор е под нападение.\nСектор: [accent]{0}[] на [accent]{1}[] sector.view = Виж сектор threat.low = Ниска @@ -850,6 +850,18 @@ sector.impact0078.description = Тук лежат останките от пър sector.planetaryTerminal.description = Крайна цел.\n\nТази крайбрежна база съдържа структура, създадена с цел междупланетарен транспорт на ядра, макар и само в рамките на локалната звездна система. Тази локация има изключително висока защита.\n\nИзползвайте военноморски единици. Елиминирайте врага възможно най-бързо. Проучете изстрелващата структура. sector.coastline.description = На това място са засечени останките от технология за производството на морски единици. Отблъснете вражеските атаки, завладейте този сектор и присвоете технологията. sector.navalFortress.description = Врагът е установил база на отдалечен, естествено укрепен остров. Унищожете базите им. Придобийте напредналата им морска технология и я проучете. +sector.cruxscape.name = Cruxscape +sector.geothermalStronghold.name = Geothermal Stronghold +sector.facility32m.description = WIP, map submission by Stormride_R +sector.taintedWoods.description = WIP, map submission by Stormride_R +sector.atolls.description = WIP, map submission by Stormride_R +sector.frontier.description = WIP, map submission by Stormride_R +sector.infestedCanyons.description = WIP, map submission by Skeledragon +sector.polarAerodrome.description = WIP, map submission by hhh i 17 +sector.testingGrounds.description = WIP, map submission by dnx2019 +sector.seaPort.description = WIP, map submission by inkognito626 +sector.weatheredChannels.description = WIP, map submission by Skeledragon +sector.mycelialBastion.description = WIP, map submission by Skeledragon sector.onset.name = Началото sector.aegis.name = Егида sector.lake.name = Езеро @@ -1047,6 +1059,7 @@ ability.liquidexplode = Разливане ability.liquidexplode.description = Разлива течността си, когато загине ability.stat.firingrate = [stat]{0}/в сек.[lightgray] скорост на огъня ability.stat.regen = [stat]{0}[lightgray] здраве/сек. +ability.stat.pulseregen = [stat]{0}[lightgray] health/pulse ability.stat.shield = [stat]{0}[lightgray] щит ability.stat.repairspeed = [stat]{0}/в сек.[lightgray] скорост на поправка ability.stat.slurpheal = [stat]{0}[lightgray] здраве/количество течност @@ -1061,6 +1074,7 @@ ability.stat.buildtime = [stat]{0} в сек.[lightgray] време за стр bar.onlycoredeposit = Доставянето е разрешено само до ядрото bar.drilltierreq = Необходимо е по-добро свредло +bar.nobatterypower = Insufficient Battery Power bar.noresources = Недостатъчно ресурси bar.corereq = Необходимо е ядро за основа bar.corefloor = Необходимо е поле за ядрото @@ -1080,6 +1094,7 @@ bar.capacity = Капацитет: {0} bar.unitcap = {0} {1}/{2} bar.liquid = Течност bar.heat = Топлина +bar.cooldown = Cooldown bar.instability = Нестабилност bar.heatamount = Горещина: {0} bar.heatpercent = Горещина: {0} ({1}%) @@ -1112,6 +1127,8 @@ bullet.healamount = [stat]{0}[lightgray] директна поправка bullet.multiplier = [stat]{0}[lightgray]x множител на боеприпаси bullet.reload = [stat]{0}[lightgray]x скорост на стрелба bullet.range = [stat]{0}[lightgray] обхват +bullet.notargetsmissiles = [stat] ignores missiles +bullet.notargetsbuildings = [stat] ignores buildings unit.blocks = блокове unit.blockssquared = блока² @@ -1173,12 +1190,6 @@ setting.fpscap.text = {0} FPS setting.uiscale.name = Размер на интерфейса[lightgray] (изисква рестарт)[] setting.uiscale.description = Нужен е рестарт, за да се приложат промените. setting.swapdiagonal.name = Винаги диагонално поставяне -setting.difficulty.training = Тренировка -setting.difficulty.easy = Лесна -setting.difficulty.normal = Нормална -setting.difficulty.hard = Трудна -setting.difficulty.insane = Безумна -setting.difficulty.name = Трудност: setting.screenshake.name = Клатене на екрана setting.bloomintensity.name = Интензитет на сиянията setting.bloomblur.name = Замъгляване на сияние @@ -1211,11 +1222,13 @@ setting.mutemusic.name = Заглуши музиката setting.sfxvol.name = Сила на звуковите ефекти setting.mutesound.name = Заглуши звука setting.crashreport.name = Изпращай анонимни отчети за сривове +setting.communityservers.name = Fetch Community Server List setting.savecreate.name = Автоматични записи -setting.publichost.name = Видимост на публичните игри +setting.steampublichost.name = Public Game Visibility setting.playerlimit.name = Лимит на играчи setting.chatopacity.name = Плътност на чата setting.lasersopacity.name = Плътност на енергийните лазери +setting.unitlaseropacity.name = Unit Mining Beam Opacity setting.bridgeopacity.name = Плътност на мостовете setting.playerchat.name = Показвай балончета за чата setting.showweather.name = Показвай графики за климата @@ -1268,6 +1281,7 @@ keybind.unit_command_load_units.name = Команда: Натовари един keybind.unit_command_load_blocks.name = Команда: Натовари блокове keybind.unit_command_unload_payload.name = Команда: Разтовари keybind.unit_command_enter_payload.name = Unit Command: Enter Payload +keybind.unit_command_loop_payload.name = Unit Command: Loop Unit Transfer keybind.rebuild_select.name = Възстановяване на региона keybind.schematic_select.name = Избери регион keybind.schematic_menu.name = Меню със схеми @@ -1321,6 +1335,7 @@ keybind.chat_mode.name = Смени режим на чат keybind.drop_unit.name = Остави единица keybind.zoom_minimap.name = Увеличи мини-карта mode.help.title = Описание на режими +mode.survival.name = Survival mode.survival.description = Нормалният режим на играта. Ограничени ресурси и автоматични вълни от нападатели.\n[gray]Картата трябва да съдържа начална точка за враговете. mode.sandbox.name = Пясъчник @@ -1345,12 +1360,16 @@ rules.wavetimer = Таймер за Вълни rules.wavesending = Изпращане на вълни rules.allowedit = Позволи е редактирането на правилата rules.allowedit.info = Когато включите тази опция, играчът може да променя правилата в играта чрез менюто Пауза и копчето в долният ляв ъгъл. +rules.alloweditworldprocessors = Allow Editing World Processors +rules.alloweditworldprocessors.info = When enabled, world logic blocks can be placed and edited even outside the editor. rules.waves = Вълни rules.airUseSpawns = Въздушните единици използват точки за поява rules.attack = Режим атака rules.buildai = ИИ на строителят на бази rules.buildaitier = Степен на ИИ строителя rules.rtsai = RTS AI +rules.rtsai.campaign = RTS Attack AI +rules.rtsai.campaign.info = In attack maps, makes units group up and attack player bases in a more intelligent manner. rules.rtsminsquadsize = Мин. размер на взводовете rules.rtsmaxsquadsize = Макс. размер на взводовете rules.rtsminattackweight = Мин. атакуваща тежест @@ -1366,6 +1385,7 @@ rules.unitcostmultiplier = Множител на цената за единиц rules.unithealthmultiplier = Множител на точките живот на единици rules.unitdamagemultiplier = Множител на щетите на единици rules.unitcrashdamagemultiplier = Множител на вредата от разбиващи се единици +rules.unitminespeedmultiplier = Unit Mine Speed Multiplier rules.solarmultiplier = Множител на слънчевата енергия rules.unitcapvariable = Ядрата увеличават максималния брой единици rules.unitpayloadsexplode = Носеният товар експлодира с единицата @@ -1394,6 +1414,12 @@ rules.title.teams = Отбори rules.title.planet = Планета rules.lighting = Светкавици rules.fog = Мъгла на войната +rules.invasions = Enemy Sector Invasions +rules.legacylaunchpads = Legacy Launch Pad Mechanics +rules.legacylaunchpads.info = Allows using launch pads without landing pads, as in 7.0. +landingpad.legacy.disabled = [scarlet]\ue815 Disabled[lightgray] (Legacy Launch Pads enabled) +rules.showspawns = Show Enemy Spawns +rules.randomwaveai = Unpredictable Wave AI rules.fire = Огън rules.anyenv = rules.explosions = Блокирай/Единици вреда от експлозия @@ -1402,6 +1428,7 @@ rules.weather = Климат rules.weather.frequency = Честота: rules.weather.always = Винаги rules.weather.duration = Продължителност: +rules.randomwaveai.info = Makes units spawned in waves target random structures instead of directly attacking the core or power generators. rules.placerangecheck.info = Не позволява на играчите да поставят нещо в близост до вражеските сгради. Когато се опитват да поставят оръдие, обхватът е увеличен, за да не може оръдието да достигне врага. rules.onlydepositcore.info = Не позволява на единиците да поставят предмети, в която и да е сграда, с изключение на ядро. @@ -1543,6 +1570,8 @@ block.graphite-press.name = Графитна преса block.multi-press.name = Мулти-преса block.constructing = {0} [lightgray](изграждане) block.spawn.name = Вражеска начална точка +block.remove-wall.name = Remove Wall +block.remove-ore.name = Remove Ore block.core-shard.name = Ядро: Частица block.core-foundation.name = Ядро: Фондация block.core-nucleus.name = Ядро: Център @@ -1706,6 +1735,8 @@ block.meltdown.name = Разтопител block.foreshadow.name = Предвестител block.container.name = Контейнер block.launch-pad.name = Изстрелваща площадка +block.advanced-launch-pad.name = Launch Pad +block.landing-pad.name = Landing Pad block.segment.name = Сегмент block.ground-factory.name = Наземна фабрика block.air-factory.name = Въздушна фабрика @@ -1800,6 +1831,7 @@ block.electric-heater.name = Електрически нагревател block.slag-heater.name = Нагревател за слаг block.phase-heater.name = Фазов нагревател block.heat-redirector.name = Разпределител на топлина +block.small-heat-redirector.name = Small Heat Redirector block.heat-router.name = Топлинен рутер block.slag-incinerator.name = Фурна за слаг block.carbide-crucible.name = Тигел за карбид @@ -1847,6 +1879,7 @@ block.chemical-combustion-chamber.name = Химическа камера за г block.pyrolysis-generator.name = Пиролизен генератор block.vent-condenser.name = Vent Condenser block.cliff-crusher.name = Трошачка за скали +block.large-cliff-crusher.name = Advanced Cliff Crusher block.plasma-bore.name = Плазмен свредел block.large-plasma-bore.name = Голям плазмен свредел block.impact-drill.name = Сблъсъчен свредел @@ -2144,7 +2177,9 @@ block.vault.description = Съхранява голямо количество block.container.description = Съхранява малко количество материали от всеки тип. Съдържанието може да бъде достъпено чрез разтоварител. block.unloader.description = Разтоварва избран материал от близки блокове. block.launch-pad.description = Изстрелва патриди от елементи в избраните сектори. -block.launch-pad.details = Суб-орбитална система за точка-до-точка транспорт на ресурс. Товарните съдове са чупливи и не са способни да оцелеят повторно влизане. +block.advanced-launch-pad.description = Launches batches of items to selected sectors. Only accepts one item type at a time. +block.advanced-launch-pad.details = Sub-orbital system for point-to-point transportation of resources. +block.landing-pad.description = Receives items from launch pads in other sectors. Requires large amounts of water to protect against impacts of landings. block.duo.description = Изстрелва редуващи се куршуми по враговете. block.scatter.description = Изстрелва топки олово, скрап или метастъкло на съчми срещу вражески въздушни единици. block.scorch.description = Изгаря всички наземни врагове в близост. Висока ефективност от близко разстояние. @@ -2205,6 +2240,7 @@ block.electric-heater.description = Нагрява срещуположни бл block.slag-heater.description = Нагрява срещуположни блокове. Нуждае се от слаг. block.phase-heater.description = Нагрява срещуположни блокове. Нуждае се от фазова тъкан. block.heat-redirector.description = Пренасочва натрупана топлина към други блокове. +block.small-heat-redirector.description = Redirects accumulated heat to other blocks. block.heat-router.description = Разпределя натрупаната топлина в три изходящи посоки. block.electrolyzer.description = Превръща вода във водород и озонов газ. block.atmospheric-concentrator.description = Концентрира азот от атмосферата. Нуждае се от нагряване. @@ -2217,6 +2253,7 @@ block.vent-condenser.description = Кондензира изпуснати га block.plasma-bore.description = Когато се постави срещуположно на стена с руда, извежда предмети безкрайно. Нуждае се от малко електричество. block.large-plasma-bore.description = По-голяма плазмена бургия. Способна е да изкопава волфрам и торий. Нуждае се от водород и електричество. block.cliff-crusher.description = Натрошава стени, за да генерира безкрайно количество пясък. Нуждае се от ток. Ефикасността варира спрямо вида стена. +block.large-cliff-crusher.description = Crushes walls, outputting sand indefinitely. Requires power and ozone. Efficiency varies based on type of wall. Optionally consumes tungsten to increase efficiency. block.impact-drill.description = Когато се постави върху руда, извежда предмети безкрайно на тласъци. Нуждае се от ток и вода. block.eruption-drill.description = Подобрен сблъсъчен свредел. Способен е да изкопава торий. Нуждае се от водород. block.reinforced-conduit.description = Придвижва течности напред. Не приема непроводими материали от страни. @@ -2248,7 +2285,7 @@ block.surge-router.description = Разпределя предмети в три block.unit-cargo-loader.description = Построява товарителни дрони. Дроните автоматично разпределят предмети към Разтоварителни точки със съвпадащ филтър. block.unit-cargo-unload-point.description = Действа като разтоварваща точка за товарителни дрони. Приема предмети, които съвпадат с посочения филтър. block.beam-node.description = Предава електричество ортогонално към други блокове. Съхранява малко количество ток. -block.beam-tower.description = Предава електричество ортогонално към други блокове. Съхранява голямо количество ток. Висок обхват. +block.beam-tower.description = Предава електричество ортогонално към други блокове. Съхранява голямо количество ток. Висок обхват. block.turbine-condenser.description = Създава ток, когато се постави върху отвори. Произвежда малко количество вода. block.chemical-combustion-chamber.description = Създава ток от аркицид и озон. block.pyrolysis-generator.description = Създава голямо количество ток от аркицид и слаг. Произвежда вода като страничен продукт. diff --git a/core/assets/bundles/bundle_lt.properties b/core/assets/bundles/bundle_lt.properties index 1a62390d7d..d5cdbe47e9 100644 --- a/core/assets/bundles/bundle_lt.properties +++ b/core/assets/bundles/bundle_lt.properties @@ -191,6 +191,7 @@ campaign.select = Pasirinkite pradinę kampanija campaign.none = [lightgray]Pasirinkite planetą ant kurios pradėti.\nTai gali būti pakeista bet kada. campaign.erekir = Naujesnis, patobulintas turinys. Daugiausia linijinė kampanijos eiga.\n\nAukštesnės kokybės žemėlapiai ir bendra patirtis. campaign.serpulo = Senesnis turinys; klasikinė versija. Atviresnis.\n\nPotencialiai nebalancuoti žemelapiai ir kampanijos mechanika. Mažiau tobulinta. +campaign.difficulty = Difficulty completed = [accent]Išrasta techtree = Technologijų Medis techtree.select = Technologijų Medį parinkti From 120876df56035f67c3d8d7f5b51e56b501d35fb9 Mon Sep 17 00:00:00 2001 From: Rodrigo Lopes <120063531+lopes143@users.noreply.github.com> Date: Wed, 5 Feb 2025 00:36:55 +0000 Subject: [PATCH 165/460] Update bundle_pt_PT.properties (#10238) Co-authored-by: Anuken --- core/assets/bundles/bundle_pt_PT.properties | 3454 ++++++++++--------- 1 file changed, 1759 insertions(+), 1695 deletions(-) diff --git a/core/assets/bundles/bundle_pt_PT.properties b/core/assets/bundles/bundle_pt_PT.properties index 5a8ad0a0b7..4c2043db33 100644 --- a/core/assets/bundles/bundle_pt_PT.properties +++ b/core/assets/bundles/bundle_pt_PT.properties @@ -1,30 +1,30 @@ credits.text = Criado por [royal]Anuken[] - [sky]anukendev@gmail.com[] credits = Créditos contributors = Tradutores e contribuidores -discord = Junte-se ao Discord do Mindustry! (Lá falamos inglês) -link.discord.description = O discord oficial do Mindustry -link.reddit.description = The Mindustry subreddit +discord = Junte-se ao Discord do Mindustry! (Lá falamos várias linguas) +link.discord.description = O Discord oficial do Mindustry +link.reddit.description = O subreddit do Minustry link.github.description = Código-fonte do jogo. link.changelog.description = Lista de mudanças da atualização -link.dev-builds.description = Desenvolvimentos Instáveis -link.trello.description = Trello Oficial para Atualizações Planejadas -link.itch.io.description = Pagina da Itch.io com os Descarregamentos -link.google-play.description = Listamento do google play store -link.f-droid.description = F-Droid catalogue listing +link.dev-builds.description = Versões instáves em desenvolvimento +link.trello.description = Trello Oficial para atualizações planeadas +link.itch.io.description = Pagina da Itch.io com as transferências +link.google-play.description = Página da Google Play Store +link.f-droid.description = Lista do F-Droid link.wiki.description = Wiki oficial do Mindustry link.suggestions.description = Sugerir novas funcionalidades -link.bug.description = Found one? Report it here -linkopen = This server has sent you a link. Are you sure you want to open it?\n\n[sky]{0} -linkfail = Falha ao abrir a ligação\nO Url foi copiado -screenshot = Screenshot gravado para {0} -screenshot.invalid = Mapa grande demais, Potencialmente sem memória suficiente para captura. +link.bug.description = Achou algum? Reporte-o aqui +linkopen = Este servidor enviou-lhe um link. Tem a certeza que o quer abrir?\n\n[sky]{0} +linkfail = Falha ao abrir a ligação\nO Url foi copiado para a área de transferência +screenshot = Captura de ecrã gravada em {0} +screenshot.invalid = Mapa grande demais, potencialmente sem memória suficiente para captura. gameover = O núcleo foi destruído. -gameover.disconnect = Disconnect -gameover.pvp = O time[accent] {0}[] ganhou! -gameover.waiting = [accent]Waiting for next map... +gameover.disconnect = Desconectar +gameover.pvp = A equipa [accent] {0}[] ganhou! +gameover.waiting = [accent]Aguardando pelo próximo mapa... highscore = [accent]Novo recorde! copied = Copiado. -indev.notready = This part of the game isn't ready yet +indev.notready = Esta parte do jogo ainda não esta pronta load.sound = Sons load.map = Mapas @@ -34,31 +34,32 @@ load.system = Sistema load.mod = Mods load.scripts = Scripts -be.update = Uma nova versão do Bleeding Edge está disponível: +be.update = Uma nova versão Bleeding Edge está disponível: be.update.confirm = Transferir e reiniciar agora? be.updating = A atualizar... -be.ignore = Ignora +be.ignore = Ignorar be.noupdates = Atualizações não encontradas. -be.check = A Verificar por atualizações -mods.browser = Mod Browser -mods.browser.selected = Selected mod -mods.browser.add = Install -mods.browser.reinstall = Reinstall -mods.browser.view-releases = View Releases -mods.browser.noreleases = [scarlet]No Releases Found\n[accent]Couldn't find any releases for this mod. Check if the mod's repository has any releases published. -mods.browser.latest = -mods.browser.releases = Releases -mods.github.open = Repo -mods.github.open-release = Release Page -mods.browser.sortdate = Sort by recent -mods.browser.sortstars = Sort by stars +be.check = Verificar por atualizações + +mods.browser = Navegador de mods +mods.browser.selected = Mod selecionado +mods.browser.add = Instalar +mods.browser.reinstall = Reinstalar +mods.browser.view-releases = Ver versões +mods.browser.noreleases = [scarlet]Nenhuma versão encontrada\n[accent]Não foi possível encontrar nenhuma versão do mod. Verifique se o repositório do mod tem alguma versão publicada. +mods.browser.latest = +mods.browser.releases = Versões +mods.github.open = Repositório +mods.github.open-release = Página da versão +mods.browser.sortdate = Ordenar por mais recente +mods.browser.sortstars = Ordenar por estrelas schematic = Esquema -schematic.add = Gravar Esquema... +schematic.add = Guardar Esquema... schematics = Esquemas -schematic.search = Search schematics... +schematic.search = Procurar esquemas... schematic.replace = Um esquema com esse nome já existe. Deseja substituí-lo? -schematic.exists = A schematic by that name already exists. +schematic.exists = Um esquema com esse nome já existe. schematic.import = Importar Esquema... schematic.exportfile = Exportar Ficheiro schematic.importfile = Importar Ficheiro @@ -71,221 +72,225 @@ schematic.saved = Esquema gravado. schematic.delete.confirm = Este esquema irá ser completamente apagado. schematic.edit = Edit Schematic schematic.info = {0}x{1}, {2} blocos -schematic.disabled = [scarlet]Schematics disabled[]\nYou are not allowed to use schematics on this [accent]map[] or [accent]server. -schematic.tags = Tags: -schematic.edittags = Edit Tags -schematic.addtag = Add Tag -schematic.texttag = Text Tag -schematic.icontag = Icon Tag -schematic.renametag = Rename Tag -schematic.tagged = {0} tagged -schematic.tagdelconfirm = Delete this tag completely? -schematic.tagexists = That tag already exists. -stats = Stats -stats.wave = Waves Defeated -stats.unitsCreated = Units Created -stats.enemiesDestroyed = Enemies Destroyed -stats.built = Buildings Built -stats.destroyed = Buildings Destroyed -stats.deconstructed = Buildings Deconstructed -stats.playtime = Time Played +schematic.disabled = [scarlet]Esquemas desativados[]\nNão tens permissão para usar esquemas nesse [accent]mapa[] ou [accent]servidor. +schematic.tags = Etiquetas: +schematic.edittags = Editar Etiquetas +schematic.addtag = Adicionar Etiqueta +schematic.texttag = Etiqueta de Texto +schematic.icontag = Etiqueta de Ícone +schematic.renametag = Alterar o nome da etiqueta +schematic.tagged = {0} Etiquetado/s +schematic.tagdelconfirm = Apagar esta etiqueta completamente? +schematic.tagexists = Essa etiqueta já existe. +stats = Estatísticas +stats.wave = Hordas Derrotadas +stats.unitsCreated = Unidades Criadas +stats.enemiesDestroyed = Inimigos destruídos +stats.built = Construções feitas +stats.destroyed = Construções destruídas +stats.deconstructed = Construções Desconstruídas +stats.playtime = Tempo de Jogo -globalitems = [accent]Global Items -map.delete = Certeza que quer deletar o mapa "[accent]{0}[]"? +globalitems = [accent]Itens Globais +map.delete = Tens a certeza que queres apagar o mapa "[accent]{0}[]"? level.highscore = Melhor\npontuação: [accent] {0} -level.select = Seleção de Fase +level.select = Seleção de Nível level.mode = Modo de Jogo: coreattack = < O núcleo está sobre ataque! > -nearpoint = [[ [scarlet]SAIA DO PONTO DE SPAWN IMEDIATAMENTE[] ]\nANIQUILAÇÃO IMINENTE -database = Banco do núcleo -database.button = Database -savegame = Gravar Jogo +nearpoint = [[ [scarlet]SAIA DO PONTO DE SPAWN IMEDIATAMENTE[] ]\nAniquilação iminente +database = Banco de Dados do núcleo +database.button = Banco de Dados +savegame = Salvar Jogo loadgame = Carregar Jogo joingame = Entrar no Jogo customgame = Jogo Customizado newgame = Novo Jogo none = -none.found = [lightgray] -none.inmap = [lightgray] +none.found = [lightgray] +none.inmap = [lightgray] minimap = Mini-Mapa position = Posição close = Fechar website = Site quit = Sair -save.quit = Gravar e sair +save.quit = Salvar e sair maps = Mapas -maps.browse = Pesquisar mapas +maps.browse = Pesquisar Mapas continue = Continuar maps.none = [lightgray]Nenhum Mapa Encontrado! invalid = Inválido pickcolor = Pick Color -preparingconfig = Preparando configuração -preparingcontent = Preparando conteúdo -uploadingcontent = Enviando conteúdo -uploadingpreviewfile = Enviando ficheiro de pré-visualização -committingchanges = Enviando mudanças +preparingconfig = A preparar a configuração +preparingcontent = A preparar o conteúdo +uploadingcontent = A enviar o conteúdo +uploadingpreviewfile = A enviar o ficheiro de pré-visualização +committingchanges = A enviar mudanças done = Feito -feature.unsupported = O teu dispositivos não suporta esta característica. -mods.initfailed = [red]⚠[] The previous Mindustry instance failed to initialize. This was likely caused by misbehaving mods.\n\nTo prevent a crash loop, [red]all mods have been disabled.[] +feature.unsupported = O teu dispositivo não suporta este recurso. + +mods.initfailed = [red]⚠[] A instância anterior do Mindustry falhou ao inicializar. Provavelmente causado por mods com problema.\n\nPara previnir um loop de crash, [red]todos os mods foram desativados.[] mods = Mods -mods.none = [lightgray]Mods não encontrados! +mods.none = [lightgray]Nenhum mod encontrado! mods.guide = Guia de mods mods.report = Reportar Bug mods.openfolder = Abrir pasta de Mods -mods.viewcontent = View Content -mods.reload = Reload -mods.reloadexit = The game will now exit, to reload mods. -mod.installed = [[Installed] +mods.viewcontent = Ver Conteúdo +mods.reload = Recarregar +mods.reloadexit = O jogo vai fechar, para recarregar os mods. +mod.installed = [[Instalado] mod.display = [gray]Mod:[orange] {0} mod.enabled = [lightgray]Ativado mod.disabled = [scarlet]Desativado -mod.multiplayer.compatible = [gray]Multiplayer Compatible +mod.multiplayer.compatible = [gray]Compatível com Multiplayer mod.disable = Desativar -mod.version = Version: -mod.content = Content: -mod.delete.error = Incapaz de apagar o mod. Ficheiro já em uso. -mod.incompatiblegame = [red]Outdated Game -mod.incompatiblemod = [red]Incompatible -mod.blacklisted = [red]Unsupported -mod.unmetdependencies = [red]Unmet Dependencies -mod.erroredcontent = [scarlet]Erros de conteudo -mod.circulardependencies = [red]Circular Dependencies -mod.incompletedependencies = [red]Incomplete Dependencies -mod.requiresversion.details = Requires game version: [accent]{0}[]\nYour game is outdated. This mod requires a newer version of the game (possibly a beta/alpha release) to function. -mod.outdatedv7.details = This mod is incompatible with the latest version of the game. The author must update it, and add [accent]minGameVersion: 136[] to its [accent]mod.json[] file. -mod.blacklisted.details = This mod has been manually blacklisted for causing crashes or other issues with this version of the game. Do not use it. -mod.missingdependencies.details = This mod is missing dependencies: {0} -mod.erroredcontent.details = This game caused errors when loading. Ask the mod author to fix them. -mod.circulardependencies.details = This mod has dependencies that depends on each other. -mod.incompletedependencies.details = This mod is unable to be loaded due to invalid or missing dependencies: {0}. -mod.requiresversion = Requires game version: [red]{0} +mod.version = Versão: +mod.content = Conteúdo: +mod.delete.error = Incapaz de apagar o mod. O ficheiro pode estar em uso. +mod.incompatiblegame = [red]Jogo Desatualizado +mod.incompatiblemod = [red]Incompatível +mod.blacklisted = [red]Não suportado +mod.unmetdependencies = [red]Dependências não satisfeitas +mod.erroredcontent = [scarlet]Erros no conteúdo +mod.circulardependencies = [red]Dependências redundantes +mod.incompletedependencies = [red]Dependências incompletas +mod.requiresversion.details = Requer a versão do jogo: [accent]{0}[]\nO teu jogo está desatualizado. Este mod requer uma versão mais recente do jogo (possivelmente uma versão beta/alfa) para funcionar. +mod.outdatedv7.details = Este mod é incompatível com a versão mais recente do jogo. O autor deve atualizá-lo e adicionar [accent]minGameVersion: 136[] ao seu arquivo [accent]mod.json[]. +mod.blacklisted.details = Este mod foi manualmente colocado na Lista Negra por causar falhas ou outros problemas com esta versão do jogo. Não o use. +mod.missingdependencies.details = Este mod tem dependências em falta: {0} +mod.erroredcontent.details = Este jogo causou erros ao carregar. Peça ao autor do mod para corrigi-los. +mod.circulardependencies.details = Este mod tem dependências que dependem umas das outras. +mod.incompletedependencies.details = Este mod não pôde ser carregado devido a dependências inválidas ou ausentes: {0}. +mod.requiresversion = Requer a versão do jogo: [red]{0} mod.errors = Ocorreram erros ao carregar o conteúdo. -mod.noerrorplay = [scarlet]Tens mods com erros.[] Desative os mods afetados ou corrija os erros antes de jogar. -mod.nowdisabled = [scarlet]Mod '{0}' está faltando dependências:[accent] {1}\n[lightgray]Esses mods precisam ser baixados primeiro. NEste mod será automaticamente desativado +mod.noerrorplay = [scarlet]Tens mods com erros.[] Desativa os mods afetados ou corrije os erros antes de jogar. +mod.nowdisabled = [scarlet]Mod '{0}' tem dependências em falta:[accent] {1}\n[lightgray]Estes mods precisam de ser baixados primeiro. Este mod será automaticamente desativado mod.enable = Ativar -mod.requiresrestart = O jogo será fechado agora para aplicar as alterações no mod. +mod.requiresrestart = O jogo irá fechar para aplicar as alterações do mod. mod.reloadrequired = [scarlet]É necessario recarregar mod.import = Importar Mod -mod.import.file = Import File +mod.import.file = Importar Ficheiro mod.import.github = Importar Mod pelo GitHub -mod.jarwarn = [scarlet]JAR mods are inherently unsafe.[]\nMake sure you're importing this mod from a trustworthy source! -mod.item.remove = Este item faz parte do [accent] '{0}'[] mod. Para lhe remover, desinstala o mod. -mod.remove.confirm = Este mod irá ser apagado. +mod.jarwarn = [scarlet]Mods JAR são por natureza inseguros.[]\nTem a certeza de que estás a importar este mod de uma fonte confiável! +mod.item.remove = Este item faz parte do [accent] '{0}'[] mod. Para removê-lo, desinstala o mod. +mod.remove.confirm = Este mod será apagado. mod.author = [lightgray]Autor:[] {0} -mod.missing = Este save contém mods que foram recentemente atualizados ou que não estão mais instalados. Ao guardar pode ocorreu corrupção. Tem certeza de que deseja carregá-lo?\n[lightgray]Mods:\n{0} -mod.preview.missing = Antes de publicar este mod no workshop, você deve adicionar uma visualização da imagem.\nNome da imagem -> [accent] preview.png[] na pasta de mods e tenta outra vez. -mod.folder.missing = Apenas mods na pasta podem ser publicados no Workshop.\nPara converter qualquer mod para uma pasta, simplesmentes descomprime os ficheiros para a pasta e apague o ficheiro zip antigo, e depois reinicia o jogo ou os teus mods. -mod.scripts.disable = Your device does not support mods with scripts. You must disable these mods to play the game. +mod.missing = Este jogo salvo contém mods que foram recentemente atualizados ou que não estão mais instalados. Pode ocorrer corrupção ao guardar. Tens a certeza de que desejas carregá-lo?\n[lightgray]Mods:\n{0} +mod.preview.missing = Antes de publicar este mod na Workshop, você deve adicionar uma visualização da imagem.\nNome da imagem -> [accent] preview.png[] na pasta de mods e tentar outra vez. +mod.folder.missing = Apenas mods no formato de pasta podem ser publicados na Workshop.\nPara converter qualquer mod para uma pasta, simplesmente descomprime os ficheiros para a pasta e apague o ficheiro ZIP antigo, e depois reinicia o jogo ou recarrega os teus mods. +mod.scripts.disable = O teu dispositivo não suporta mods com scripts. Deves desativar estes mods para conseguir jogar. about.button = Sobre name = Nome: noname = Escolha[accent] um nome[] primeiro. -search = Search: -planetmap = Planet Map -launchcore = Launch Core -filename = Nome do ficheiro: -unlocked = Novo bloco Desbloqueado! -available = New research available! -unlock.incampaign = < Unlock in campaign for details > -campaign.select = Select Starting Campaign -campaign.none = [lightgray]Select a planet to start on.\nThis can be switched at any time. -campaign.erekir = Newer, more polished content. Mostly linear campaign progression.\n\nHigher quality maps and overall experience. -campaign.serpulo = Older content; the classic experience. More open-ended.\n\nPotentially unbalanced maps and campaign mechanics. Less polished. -campaign.difficulty = Difficulty + +search = Procurar: +planetmap = Mapa do Planeta +launchcore = Lançar Núcleo +filename = Nome do Ficheiro: +unlocked = Novo conteúdo desbloqueado! +available = Nova pesquisa disponível! +unlock.incampaign = < Desbloqueie na campanha para mais detalhes > +campaign.select = Selecione a campanha inicial +campaign.none = [lightgray]Selecione um planeta para onde começar.\nIsto pode ser mudado a qualquer momento. +campaign.erekir = Novo, conteúdo aperfeiçoado. Progresso de campanha quase linear.\n\nMapas e experiência geral de melhor qualidade. +campaign.serpulo = Conteúdo antigo, a experiência clássica. Mais amplo.\n\nMapas e mecânicas da campanha potencialmente desbalanceados. Menos aperfeiçoado. +campaign.difficulty = Dificuldade + completed = [accent]Completado -techtree = Árvore de tecnologia -techtree.select = Tech Tree Selection +techtree = Árvore da Tecnologia +techtree.select = Árvore da Tecnologia techtree.serpulo = Serpulo techtree.erekir = Erekir -research.load = Load -research.discard = Discard +research.load = Carregar +research.discard = Descartar research.list = [lightgray]Pesquise: research = Pesquisa researched = [lightgray]{0} pesquisado. -research.progress = {0}% complete +research.progress = {0}% completo players = {0} Jogadores Ativos players.single = {0} Jogador Ativo -players.search = search -players.notfound = [gray]no players found -server.closing = [accent]Fechando servidor... -server.kicked.kick = Voce foi expulso do servidor! -server.kicked.whitelist = Você não está na lista branca do servidor. +players.search = Pesquisar +players.notfound = [gray]nenhum jogador encontrado +server.closing = [accent]A fechar servidor... +server.kicked.kick = Foste expulso do servidor! +server.kicked.whitelist = Não estás na lista branca do servidor. server.kicked.serverClose = Servidor Fechado. -server.kicked.vote = Você foi expulso desse servidor. Adeus. -server.kicked.clientOutdated = Cliente desatualizado! Atualize seu jogo! +server.kicked.vote = Foste expulso desse servidor por votação. Adeus. +server.kicked.clientOutdated = Cliente desatualizado! Atualiza o teu jogo! server.kicked.serverOutdated = Servidor desatualiado! Peça ao dono para atualizar! -server.kicked.banned = Você foi banido do servidor. -server.kicked.typeMismatch = Este servidor não é compatível com a sua versão. -server.kicked.playerLimit = Este servidor está cheio. Espere por uma vaga. -server.kicked.recentKick = Voce foi expulso recentemente.\nEspere para conectar de novo. -server.kicked.nameInUse = Este nome já está sendo usado\nneste servidor. -server.kicked.nameEmpty = Você deve ter pelo menos uma letra ou número no nome. -server.kicked.idInUse = Você ja está neste servidor! Conectar com duas contas não é permitido. -server.kicked.customClient = Este servidor não suporta versões customizadas. Baixe a versão original. -server.kicked.gameover = Fim de jogo! -server.kicked.serverRestarting = The server is restarting. -server.versions = Sua versão:[accent] {0}[]\nVersão do servidor:[accent] {1}[] -host.info = O [accent]Hospedar[]Botão Hospeda um servidor no Host[scarlet]6567[] e [scarlet]6568.[]\nQualquer um no [lightgray]Wi-fi Ou Internet local[] Pode ver este servidor na lista de servidores.\n\nSe voce quer poder entrar em qualquer servidor em seu ip, [accent]port forwarding[] é requerido.\n\n[lightgray]Note: Se alguem esta com problemas em conectar no seu servidor lan, Tenha certeza que deixou mindustry Acessar sua internet local nas configurações de firewall -join.info = Aqui, você pode entar em um [accent]IP de servidor[] para conectar, ou descobrir [accent]servidores[] da rede local.\nAmbos os servidores LAN e WAN são suportados.\n\n[lightgray]Note: Não há uma lista de servidores automáticos; Se você quer conectar ao IP de alguém, você precisa pedir o IP ao anfitrião. -hostserver = Hospedar servidor +server.kicked.banned = Foste banido do servidor. +server.kicked.typeMismatch = Este servidor não é compatível com o teu tipo de versão. +server.kicked.playerLimit = Este servidor está cheio. Espera por uma vaga. +server.kicked.recentKick = Foste expulso recentemente.\nEspera para conectar de novo. +server.kicked.nameInUse = Este nome já está a ser usado\nneste servidor. +server.kicked.nameEmpty = O nome escolhido é inválido. +server.kicked.idInUse = Já estás conectado neste servidor! Conectar com duas contas não é permitido. +server.kicked.customClient = Este servidor não suporta versões customizadas. Transfere uma versão original. +server.kicked.gameover = Fim do jogo! +server.kicked.serverRestarting = O seridor está a reiniciar. +server.versions = A tua versão:[accent] {0}[]\nVersão do servidor:[accent] {1}[] +host.info = O botão de [accent]Hospedar[] hospeda um servidor na porta [scarlet]6567[] e [scarlet]6568.[]\nQualquer jogador na mesma [lightgray]Wi-Fi ou rede local[] pode ver este servidor na lista de servidores.\n\nSe você quiser que os jogadores entrem de qualquer sítio através do seu IP, [accent]port forwarding[] é necessário.\n\n[lightgray]Nota: Se alguém está com problemas a conectar ao seu servidor LAN, tenha a certeza que o Mindustry tem acesso à sua internet local nas configurações do seu firewall. Nota que nem todas as redes públicas permitem a deteção do servidor na rede. +join.info = Aqui podes inserir um [accent]IP de servidor[] para conectar, ou descobrir [accent]servidores[] da rede local or [accent]servidores[] no mundo.\nAmbos os servidores LAN e WAN são suportados.\n\n[lightgray]Se quiseres conectar ao servidor de alguém por IP, precisas de pedir ao anfitrião o IP, que pode ser descoberto ao pesquisar "meu IP" na Internet. invitefriends = Convidar amigos hostserver.mobile = Hospedar\nJogo host = Hospedar -hosting = [accent]Abrindo servidor... +hosting = [accent]A abrir servidor... hosts.refresh = Atualizar -hosts.discovering = Descobrindo jogos em lan -hosts.discovering.any = Descobrindo jogos +hosts.discovering = A descobrir jogos em LAN +hosts.discovering.any = A descobrir jogos server.refreshing = A atualizar servidor -hosts.none = [lightgray]Nenhum jogo lan encontrado! -host.invalid = [scarlet]Não foi possivel Hospedar. +hosts.none = [lightgray]Nenhum jogo local encontrado! +host.invalid = [scarlet]Não foi possivel conectar. servers.local = Servidores Locais -servers.local.steam = Open Games & Local Servers +servers.local.steam = Jogos públicos e Servidores locais servers.remote = Servidores Remotos -servers.global = Servidores Globais -servers.disclaimer = Community servers are [accent]not[] owned or controlled by the developer.\n\nServers may contain user-generated content that is not appropriate for all ages. -servers.showhidden = Show Hidden Servers -server.shown = Shown -server.hidden = Hidden -viewplayer = Viewing Player: [accent]{0} +servers.global = Servidores da Comunidade -trace = Traçar jogador +servers.disclaimer = Servidores da comunidade [accent]não[] são controlados pelo desenvolvedor.\n\nOs servidores podem conter conteúdo não apropriado para todas as idades. +servers.showhidden = Mostrar servidores escondidos +server.shown = Mostrar +server.hidden = Esconder + +viewplayer = A assistir Jogador: [accent]{0} +trace = Rastrear jogador trace.playername = Nome do jogador: [accent]{0} trace.ip = IP: [accent]{0} -trace.id = ID unico: [accent]{0} -trace.language = Language: [accent]{0} +trace.id = ID: [accent]{0} +trace.language = Idioma: [accent]{0} trace.mobile = Cliente móvel: [accent]{0} -trace.modclient = Cliente Customizado: [accent]{0} -trace.times.joined = Times Joined: [accent]{0} -trace.times.kicked = Times Kicked: [accent]{0} +trace.modclient = Cliente customizado: [accent]{0} +trace.times.joined = Vezes que entrou: [accent]{0} +trace.times.kicked = Vezes que foi expulso: [accent]{0} trace.ips = IPs: -trace.names = Names: -invalidid = ID do cliente invalido! Reporte o bug. -player.ban = Ban -player.kick = Kick -player.trace = Trace -player.admin = Toggle Admin -player.team = Change Team -server.bans = Banidos +trace.names = Nomes: +invalidid = ID do cliente inválido! Reporte o bug. + +player.ban = Banir +player.kick = Expulsar +player.trace = Rastrear +player.admin = Alterar Admin +player.team = Trocar de Equipa +server.bans = Banimentos server.bans.none = Nenhum jogador banido encontrado! server.admins = Administradores server.admins.none = Nenhum administrador encontrado! server.add = Adicionar servidor -server.delete = Certeza que quer deletar o servidor? +server.delete = Tens a certeza que queres apagar o servidor? server.edit = Editar servidor server.outdated = [crimson]Servidor desatualizado![] server.outdated.client = [crimson]Cliente desatualizado![] server.version = [lightgray]Versão: {0} server.custombuild = [accent]Versão customizada -confirmban = Certeza que quer banir este jogador? -confirmkick = Certeza que quer expulsar o jogador? -confirmunban = Certeza que quer desbanir este jogador? -confirmadmin = Certeza que quer fazer este jogador um administrador? +confirmban = Tens a certeza de que queres banir "{0}[white]"? +confirmkick = Tens a certeza de que queres expulsar "{0}[white]"? +confirmunban = Tens a certeza de que queres desbanir este jogador? +confirmadmin = Tens a certeza de que queres fazer este jogador um administrador? confirmunadmin = Certeza que quer remover o estatus de adminstrador deste jogador? -votekick.reason = Vote-Kick Reason -votekick.reason.message = Are you sure you want to vote-kick "{0}[white]"?\nIf yes, please enter the reason: +votekick.reason = Razão de expulsão por votação +votekick.reason.message = Tens a certeza que queres expular "{0}[white]" por votação?\nSe sim, escreva o motivo: joingame.title = Entrar no jogo -joingame.ip = IP: +joingame.ip = Endereço IP: disconnect = Desconectado. disconnect.error = Erro de conexão. disconnect.closed = Conexão fechada. @@ -293,125 +298,127 @@ disconnect.timeout = Tempo esgotado. disconnect.data = Falha ao abrir os dados do mundo! disconnect.snapshottimeout = Timed out while receiving UDP snapshots.\nThis may be caused by an unstable network or connection. cantconnect = Impossível conectar ([accent]{0}[]). -connecting = [accent]Conectando... -reconnecting = [accent]Reconnecting... -connecting.data = [accent]Carregando dados do mundo... -server.port = Porte: -server.invalidport = Numero de porta invalido! -server.error.addressinuse = [scarlet]Failed to open server on port 6567.[]\n\nMake sure no other Mindustry servers are running on your device or network! +connecting = [accent]A conectar... +reconnecting = [accent]A reconectar... +connecting.data = [accent]A carregar o dados do mundo... +server.port = Porta: +server.addressinuse = Endereço em uso! +server.invalidport = Número de porta inválido! +server.error.addressinuse = [scarlet]Falhou ao iniciar o servidor na porta 6567.[]\n\nCertifica-te que não existem outros servidores do Mindustry em funcionamento no teu dispositivo ou rede local! server.error = [crimson]Erro ao hospedar o servidor: [accent]{0} -save.new = Novo gravamento -save.overwrite = Você tem certeza que quer sobrescrever este gravamento? -save.nocampaign = Individual save files from the campaign cannot be imported. -overwrite = Gravar sobre -save.none = Nenhum gravamento encontrado! -savefail = Falha ao gravar jogo! -save.delete.confirm = Certeza que quer deletar este gravamento? -save.delete = Deletar +save.new = Novo save +save.overwrite = Tens a certeza que queres sobrescrever\neste save? +save.nocampaign = Arquivos salvos individuais da campanha não podem ser importados. +overwrite = Sobrescrever +save.none = Nenhum save encontrado! +savefail = Falha ao salvar jogo! +save.delete.confirm = Tens a certeza que queres apagar este save? +save.delete = Apagar save.export = Exportar save -save.import.invalid = [accent]Este gravamento é inválido! -save.import.fail = [crimson]Falha ao importar gravamento: [accent]{0} -save.export.fail = [crimson]Falha ao exportar gravamento: [accent]{0} -save.import = Importar gravamento -save.newslot = Nome do gravamento: +save.import.invalid = [accent]Este save é inválido! +save.import.fail = [crimson]Falha ao importar o save: [accent]{0} +save.export.fail = [crimson]Falha ao exportar o save: [accent]{0} +save.import = Importar save +save.newslot = Nome do save: save.rename = Renomear save.rename.text = Novo jogo: -selectslot = Selecione um lugar para gravar. +selectslot = Selecione um lugar para salvar. slot = [accent]Slot {0} editmessage = Edit Message save.corrupted = [accent]Ficheiro corrompido ou inválido! empty = on = Ligado off = Desligado -save.search = Search saved games... -save.autosave = Autogravar: {0} +save.search = Procurar jogos salvos... +save.autosave = Gravar automaticamente: {0} save.map = Mapa: {0} save.wave = Horda {0} -save.mode = Gamemode: {0} -save.date = Último gravamento: {0} -save.playtime = Tempo De Jogo: {0} +save.mode = Modo de jogo: {0} +save.date = Último save: {0} +save.playtime = Tempo de Jogo: {0} warning = Aviso. confirm = Confirmar -delete = Excluir -view.workshop = Ver na oficina -workshop.listing = Edit Workshop Listing +delete = Apagar +view.workshop = Ver na Workshop +workshop.listing = Editar a lista da Workshop ok = OK open = Abrir customize = Customizar cancel = Cancelar -command = Command +command = Comando command.queue = [lightgray][Queuing] -command.mine = Mine -command.repair = Repair -command.rebuild = Rebuild -command.assist = Assist Player -command.move = Move -command.boost = Boost -command.enterPayload = Enter Payload Block -command.loadUnits = Load Units -command.loadBlocks = Load Blocks -command.unloadPayload = Unload Payload -command.loopPayload = Loop Unit Transfer -stance.stop = Cancel Orders -stance.shoot = Stance: Shoot -stance.holdfire = Stance: Hold Fire -stance.pursuetarget = Stance: Pursue Target -stance.patrol = Stance: Patrol Path -stance.ram = Stance: Ram\n[lightgray]Straight line movement, no pathfinding + +command.mine = Minerar +command.repair = reparar +command.rebuild = Reconstruir +command.assist = Assistir jogador +command.move = Mover +command.boost = Impulsionar +command.enterPayload = Inserir bloco de carga +command.loadUnits = Carrgar Unidades +command.loadBlocks = Carregar Blocos +command.unloadPayload = Descarregar Carga +stance.stop = Cancelar Pedidos +stance.shoot = Stance: Atirar +stance.holdfire = Stance: Não disparar +stance.pursuetarget = Stance: Perseguir alvo +stance.patrol = Stance: Caminho de Patrulha +stance.ram = Stance: Ram\n[lightgray]Movimento em linha reta, sem trajetória + openlink = Abrir Ligação copylink = Copiar ligação back = Voltar -max = Max -objective = Map Objective -crash.export = Export Crash Logs -crash.none = No crash logs found. -crash.exported = Crash logs exported. +max = Máximo +objective = Objetivo do Mapa +crash.export = Exportar registos de erros +crash.none = Não foram encontrados registos de erros. +crash.exported = Registos de erros exportados. data.export = Exportar dados data.import = Importar dados data.openfolder = Abrir pasta de dados data.exported = Dados exportados. data.invalid = Estes dados de jogo não são válidos. -data.import.confirm = Importar dados externos irá deletar[scarlet] todos[] os seus dados atuais.\n[accent]Isso não pode ser desfeito![]\n\nQuando sua data é importada, seu jogo ira sair imediatamente. -quit.confirm = Você tem certeza que quer sair? -loading = [accent]Carregando... -downloading = [accent]Downloading... -saving = [accent]Gravando... -respawn = [accent][[{0}][] to respawn in core -cancelbuilding = [accent][[{0}][] para apagar o plano -selectschematic = [accent][[{0}][] para selecionar+copy -pausebuilding = [accent][[{0}][] para pausar construção -resumebuilding = [scarlet][[{0}][] para resumir construção -enablebuilding = [scarlet][[{0}][] to enable building -showui = UI hidden.\nPress [accent][[{0}][] to show UI. -commandmode.name = [accent]Command Mode -commandmode.nounits = [no units] +data.import.confirm = Importar dados externos irá sobescrever[scarlet] todos[] os seus dados atuais.\n[accent]Não pode ser revertido![]\n\nQuando os dados forem importados, seu jogo irá fechar imediatamente. +quit.confirm = Tens a certeza que queres sair? +loading = [accent]A carregar... +downloading = [accent]A transferir... +saving = [accent]A gravar... +respawn = [accent][[{0}][] para renascer +cancelbuilding = [accent][[{0}][] para cancelar a construção +selectschematic = [accent][[{0}][] para selecionar+copiar +pausebuilding = [accent][[{0}][] para pausar a construção +resumebuilding = [scarlet][[{0}][] para retomar a construção +enablebuilding = [scarlet][[{0}][] para ativar a construção +showui = Interface ocultada.\nPressiona [accent][[{0}][] para mostrá-la. +commandmode.name = [accent]Modo de comando +commandmode.nounits = [sem unidades] wave = [accent]Horda {0} -wave.cap = [accent]Wave {0}/{1} +wave.cap = [accent]Horda {0}/{1} wave.waiting = Horda em {0} -wave.waveInProgress = [lightgray]Horda Em Progresso -waiting = Aguardando... -waiting.players = Esperando por jogadores... +wave.waveInProgress = [lightgray]Horda em progresso +waiting = A aguardar... +waiting.players = À espera de jogadores... wave.enemies = [lightgray]{0} inimigos restantes -wave.enemycores = [accent]{0}[lightgray] Enemy Cores -wave.enemycore = [accent]{0}[lightgray] Enemy Core -wave.enemy = [lightgray]{0} inimigo restante -wave.guardianwarn = Guardian approaching in [accent]{0}[] waves. -wave.guardianwarn.one = Guardian approaching in [accent]{0}[] wave. +wave.enemycores = [accent]{0}[lightgray] Núcleos inimigos +wave.enemycore = [accent]{0}[lightgray] Núcleo inimigo +wave.enemy = [lightgray]{0} Inimigo restante +wave.guardianwarn = Guardião aproximando-se em [accent]{0}[] hordas. +wave.guardianwarn.one = Guardião aproximando-se em [accent]{0}[] horda. loadimage = Carregar\nimagem -saveimage = Gravarr\nimagem +saveimage = Salvar\nimagem unknown = Desconhecido custom = Customizado builtin = Embutido -map.delete.confirm = Certeza que quer deletar este mapa? Isto não pode ser desfeito! +map.delete.confirm = Tens a certeza que queres apagar este mapa? Esta ação não pode ser desfeita! map.random = [accent]Mapa aleatório -map.nospawn = Este mapa não possui nenhum núcleo para o jogador nascer! Adicione um núcleo {0} para este mapa no editor. -map.nospawn.pvp = Esse mapa não tem núcleos inimigos para os jogadores nascerem! Adicione núcleos [scarlet]vermelhos[] no mapa no editor. -map.nospawn.attack = Esse mapa não tem nenhum núcleo inimigo para o jogador atacar! Adicione núcleos {0} no mapa no editor. -map.invalid = Erro ao carregar o mapa: Ficheiro de mapa invalido ou corrupto. +map.nospawn = Este mapa não possui nenhum núcleo para o jogador nascer! Adicione um {0} núcleo ao mapa no editor. +map.nospawn.pvp = Esse mapa não tem núcleos inimigos para os jogadores nascerem! Adicione núcleos [scarlet]vermelhos[] ao mapa no editor. +map.nospawn.attack = Esse mapa não tem nenhum núcleo inimigo para o jogador atacar! Adicione {0} núcleos ao mapa no editor. +map.invalid = Erro ao carregar o mapa: Ficheiro de mapa inválido ou corrompido. workshop.update = Atualizar Item -workshop.error = Error fetching workshop details: {0} -map.publish.confirm = Você tem certeza de que quer publicar este mapa?\n\n[lightgray]Tenha certeza de que você concorda com o EULA da oficina primeiro, ou seus mapas não serão mostrados! -workshop.menu = Seleciona o que tu gostarias de fazer com este item. +workshop.error = Erro ao buscar os detalhes da Workshop: {0} +map.publish.confirm = Tens a certeza que queres publicar este mapa?\n\n[lightgray]Certifica-te que concordas com o EULA da Workshop, ou os teus mapas não serão mostrados! +workshop.menu = Seleciona o que gostarias de fazer com este item. workshop.info = Item Info changelog = Changelog (optional): updatedesc = Overwrite Title & Description @@ -421,10 +428,11 @@ publishing = [accent]A publicar... publish.confirm = Tens a certeza que queres publicar isto?\n\n[lightgray]Certifique-se de concordar com o EULA do workshpop primeiro, ou seus itens não aparecerão! publish.error = Erro ao publicao os items: {0} steam.error = Falha ao iniciar os serviços da Steam.\nError: {0} -editor.planet = Planet: -editor.sector = Sector: -editor.seed = Seed: -editor.cliffs = Walls To Cliffs + +editor.planet = Planeta: +editor.sector = Setor: +editor.seed = Semente: +editor.cliffs = Paredes para Penhascos editor.brush = Pincel editor.openin = Abrir no Editor @@ -437,118 +445,119 @@ editor.nodescription = Um mapa deve ter uma descrição de no mínimo 4 caracter editor.waves = Hordas: editor.rules = Regras: editor.generation = Geração: -editor.objectives = Objectives -editor.locales = Locale Bundles -editor.worldprocessors = World Processors -editor.worldprocessors.editname = Edit Name -editor.worldprocessors.none = [lightgray]No world processor blocks found!\nAdd one in the map editor, or use the \ue813 Add button below. -editor.worldprocessors.nospace = No free space to place a world processor!\nDid you fill the map with structures? Why would you do this? -editor.worldprocessors.delete.confirm = Are you sure you want to delete this world processor?\n\nIf it is surrounded by walls, it will be replaced by an environmental wall. +editor.objectives = Objectivos +editor.locales = Pacotes Locais +editor.worldprocessors = Processadores Globais +editor.worldprocessors.editname = Mudar Nome +editor.worldprocessors.none = [lightgray]Nenhum bloco de processadr global encontrado!\nAdiciona um no Editor, ou usa o botão \ue813 Adicionar abaixo. +editor.worldprocessors.nospace = Sem espaço disponível para colocar um processador global!\nPreencheste o mapa com estruturas? Porque farias isso? +editor.worldprocessors.delete.confirm = Tens a certeza que queres apagar este processador global?\n\nSe esiver rodeado de paredes, vai ser substituído por uma parede natural. editor.ingame = Editar em jogo -editor.playtest = Playtest -editor.publish.workshop = Publicar na oficina +editor.playtest = Testar +editor.publish.workshop = Publicar na Workshop editor.newmap = Novo mapa -editor.center = Center -editor.search = Search maps... -editor.filters = Filter Maps -editor.filters.mode = Gamemodes: -editor.filters.type = Map Type: -editor.filters.search = Search In: -editor.filters.author = Author -editor.filters.description = Description -editor.shiftx = Shift X -editor.shifty = Shift Y -workshop = Oficina +editor.center = Centrar +editor.search = Procurar mapas... +editor.filters = Filtrar Mapas +editor.filters.mode = Modos de jogo: +editor.filters.type = Tipo de Mapa: +editor.filters.search = Procurar em: +editor.filters.author = Autor +editor.filters.description = Descrição +editor.shiftx = Mover no eixo X +editor.shifty = Mover no eixo Y +workshop = Workshop waves.title = Hordas waves.remove = Remover waves.every = a cada -waves.waves = Hordas(s) -waves.health = health: {0}% +waves.waves = hordas(s) +waves.health = vida: {0}% waves.perspawn = por spawn -waves.shields = shields/wave +waves.shields = escudos/horda waves.to = para waves.spawn = spawn: waves.spawn.all = -waves.spawn.select = Spawn Select -waves.spawn.none = [scarlet]no spawns found in map -waves.max = max units -waves.guardian = Guardian -waves.preview = Pré visualizar +waves.spawn.select = Seletor de spawn +waves.spawn.none = [scarlet]nenhum spawn encontrado no mapa +waves.max = quantidade máxima de unidades +waves.guardian = Guardião +waves.preview = Pré-visualizar waves.edit = Editar... -waves.random = Random +waves.random = Aleatório waves.copy = Copiar para área de transferência waves.load = Carregar da área de transferência waves.invalid = Hordas inválidas na área de transferência. waves.copied = Hordas copiadas. -waves.none = Sem hordas definidas.\nNote que layouts vazios de hordas serão automaticamente substituídos pelo layout padrão. -waves.sort = Sort By -waves.sort.reverse = Reverse Sort -waves.sort.begin = Begin -waves.sort.health = Health -waves.sort.type = Type -waves.search = Search waves... -waves.filter = Unit Filter -waves.units.hide = Hide All -waves.units.show = Show All +waves.none = Sem hordas definidas.\nNote que esquemas de hordas vazios serão automaticamente substituídos pelo esquema padrão. +waves.sort = Ordenar por +waves.sort.reverse = Inverter ordem +waves.sort.begin = Coneçar +waves.sort.health = Vida +waves.sort.type = Tipo +waves.search = Procurar hordas... +waves.filter = Filtro de Unidades +waves.units.hide = Ocultar Tudo +waves.units.show = Mostrar Tudo -wavemode.counts = counts -wavemode.totals = totals -wavemode.health = health -all = All +#these are intentionally in lower case +wavemode.counts = quantidade +wavemode.totals = total +wavemode.health = vida -editor.default = [lightgray] +all = Tudo +editor.default = [lightgray] details = Detalhes... edit = Editar... -variables = Vars -logic.clear.confirm = Are you sure you want to clear all code from this processor? -logic.globals = Built-in Variables +variables = Variáveis +logic.clear.confirm = Tens a certeza que querea apagar todo o código deste procesador? +logic.globals = Variáveis Embutidas editor.name = Nome: -editor.spawn = Criar unidade -editor.removeunit = Remover unidade -editor.teams = Times +editor.spawn = Criar Unidade +editor.removeunit = Remover Unidade +editor.teams = Equipas editor.errorload = Erro ao carregar o ficheiro:\n[accent]{0} -editor.errorsave = Erro ao gravar o ficheiro:\n[accent]{0} -editor.errorimage = Isso é uma imagem, não um mapa. Não vá por aí mudando extensões esperando que funcione.\n\nSe você quer importar um mapa legacy, Use o botão 'Importar mapa legacy'no editor. -editor.errorlegacy = Esse mapa é velho demais, E usa um formato de mapa legacy que não é mais suportado. -editor.errornot = Este não é um ficheiro de mapa. -editor.errorheader = Este ficheiro de mapa não é mais válido ou está corrompido. -editor.errorname = O mapa não tem nome definido. -editor.errorlocales = Error reading invalid locale bundles. +editor.errorsave = Erro ao salvar o ficheiro:\n[accent]{0} +editor.errorimage = Isto é uma imagem, não um mapa. +editor.errorlegacy = Este mapa é antigo demais, e usa um formato antigo que não é mais suportado. +editor.errornot = Isto não é um ficheiro de mapa. +editor.errorheader = Este ficheiro de mapa não está mais válido ou está corrompido. +editor.errorname = O mapa não tem nome definido. Estás a tentar carregar um ficheiro de save? +editor.errorlocales = Erro ao ler pacotes locais inválidos. editor.update = Atualizar editor.randomize = Aleatorizar -editor.moveup = Move Up -editor.movedown = Move Down -editor.copy = Copy +editor.moveup = Mover para Cima +editor.movedown = Mover para Baixo +editor.copy = Copiar editor.apply = Aplicar editor.generate = Gerar -editor.sectorgenerate = Sector Generate +editor.sectorgenerate = Geração de Setor editor.resize = Redimen-\nsionar editor.loadmap = Carregar\nmapa editor.savemap = Gravar\nmapa -editor.savechanges = [scarlet]You have unsaved changes!\n\n[]Do you want to save them? +editor.savechanges = [scarlet]Tens modificações não gravadas!\n\n[]Queres gravá-las? editor.saved = Gravado! -editor.save.noname = Seu mapa não tem um nome! Coloque um no menu de "Informação do mapa" -editor.save.overwrite = O seu mapa substitui um mapa já construído! Coloque um nome diferente no menu "Informação do mapa" -editor.import.exists = [scarlet]Não foi possivel importar:[] Um mapa construído chamado '{0}' Já existe! +editor.save.noname = O teu mapa não tem um nome! Coloca um no menu de "Informação do mapa" +editor.save.overwrite = O teu mapa substitui um mapa incorporado no jogo! Coloca um nome diferente no menu "Informação do mapa" +editor.import.exists = [scarlet]Não foi possivel importar:[] Um mapa incorporado chamado '{0}' já existe! editor.import = Importar... editor.importmap = Importar Mapa -editor.importmap.description = Importar um mapa existente +editor.importmap.description = Importar um mapa já existente editor.importfile = Importar ficheiro editor.importfile.description = Importar um ficheiro externo -editor.importimage = Importar imagem do terreno -editor.importimage.description = Importar uma imagem de terreno externa +editor.importimage = Importar Imagem de terreno +editor.importimage.description = Importar um ficheiro de imagem externo editor.export = Exportar... -editor.exportfile = Exportar ficheiro +editor.exportfile = Exportar Ficheiro editor.exportfile.description = Exportar um ficheiro de mapa -editor.exportimage = Exportar imagem de terreno -editor.exportimage.description = Exportar um ficheiro de imagem de mapa -editor.loadimage = Carregar\nImagem -editor.saveimage = Gravar\nImagem -editor.unsaved = [scarlet]Você tem alterações não gradavas![]\nTem certeza que quer sair? +editor.exportimage = Exportar Imagem de terreno +editor.exportimage.description = Exportar uma imagem com topografia básica apenas +editor.loadimage = Importar Terreno +editor.saveimage = Exportar Terreno +editor.unsaved = [scarlet]Tens alterações não gravadas![]\nTens a certeza que queres sair? editor.resizemap = Redimensionar Mapa editor.mapname = Nome do Mapa: -editor.overwrite = [accent]Aviso!\nIsso Substitui um mapa existente. -editor.overwrite.confirm = [scarlet]Aviso![] Um mapa com esse nome já existe. Tem certeza que deseja substituir? +editor.overwrite = [accent]Aviso!\nIsto sobesvreve um mapa já existente. +editor.overwrite.confirm = [scarlet]Aviso![] Um mapa com este nome já existe. Tens a certeza que desejas substituí-lo? editor.exists = Já existe um mapa com este nome. editor.selectmap = Selecione uma mapa para carregar: @@ -558,25 +567,28 @@ toolmode.replaceall = Substituir tudo toolmode.replaceall.description = Substituir todos os blocos no mapa toolmode.orthogonal = Linha reta toolmode.orthogonal.description = Desenha apenas linhas retas. -toolmode.square = Square +toolmode.square = Quadrado toolmode.square.description = Pincel quadrado. -toolmode.eraseores = Apagar minérios +toolmode.eraseores = Apagar Minérios toolmode.eraseores.description = Apaga apenas minérios. -toolmode.fillteams = Encher times -toolmode.fillteams.description = Muda o time do qual todos os blocos pertencem. -toolmode.fillerase = Fill Erase -toolmode.fillerase.description = Erase blocks of the same type. -toolmode.drawteams = Desenhar times -toolmode.drawteams.description = Muda o time do qual o bloco pertence. -toolmode.underliquid = Under Liquids -toolmode.underliquid.description = Draw floors under liquid tiles. +toolmode.fillteams = Preencher Equipas +toolmode.fillteams.description = Muda a equipa da qual todos os blocos pertencem. +toolmode.fillerase = Preencher Apagar +toolmode.fillerase.description = Apaga blocos do mesmo tipo. +toolmode.drawteams = Desenhar Euipas +toolmode.drawteams.description = Muda a equipa da qual o bloco pertence. -filters.empty = [lightgray]Sem filtro! Adicione um usando o botão abaixo. -filter.distort = Distorcedor +#unused +toolmode.underliquid = Debaixo de Líquidos +toolmode.underliquid.description = Desenha o fundo de poças de líquidos. + +filters.empty = [lightgray]Sem filtros! Adicione um com o botão abaixo. + +filter.distort = Distorcer filter.noise = Geração aleatória -filter.enemyspawn = Enemy Spawn Select -filter.spawnpath = Path To Spawn -filter.corespawn = Core Select +filter.enemyspawn = Selecionar Spawn inimigo +filter.spawnpath = Caminho para o Spawn +filter.corespawn = Selecionar Núcleo filter.median = Mediano filter.oremedian = Minério Mediano filter.blend = Misturar @@ -584,11 +596,11 @@ filter.defaultores = Minérios padrão filter.ore = Minério filter.rivernoise = Geração aleatória de rios filter.mirror = Espelhar -filter.clear = Excluir +filter.clear = Apagar filter.option.ignore = Ignorar filter.scatter = Dispersão filter.terrain = Terreno -filter.logic = Logic +filter.logic = Lógica filter.option.scale = Escala filter.option.chance = Chance filter.option.mag = Magnitude @@ -597,45 +609,45 @@ filter.option.circle-scale = Escala de círculo filter.option.octaves = Oitavas filter.option.falloff = Caída filter.option.angle = Ângulo -filter.option.tilt = Tilt -filter.option.rotate = Rotate -filter.option.amount = Amount +filter.option.tilt = Inclinação +filter.option.rotate = Rodar +filter.option.amount = Quantidade filter.option.block = Bloco filter.option.floor = Chão filter.option.flooronto = Chão alvo -filter.option.target = Target -filter.option.replacement = Replacement +filter.option.target = Alvo +filter.option.replacement = Substituto filter.option.wall = Parede filter.option.ore = Minério filter.option.floor2 = Chão secundário filter.option.threshold2 = Margem secundária filter.option.radius = Raio filter.option.percentile = Percentual -filter.option.code = Code +filter.option.code = Código filter.option.loop = Loop -locales.info = Here, you can add locale bundles for specific languages to your map. In locale bundles, each property has a name and a value. These properties can be used by world processors and objectives using their names. They support text formatting (replacing placeholders with actual values).\n\n[cyan]Example property:\n[]name: [accent]timer[]\nvalue: [accent]Example timer, time left: {0}[]\n\n[cyan]Usage:\n[]Set it as objective's text: [accent]@timer\n\n[]Print it in a world processor:\n[accent]localeprint "timer"\nformat time\n[gray](where time is a separately calculated variable) -locales.deletelocale = Are you sure you want to delete this locale bundle? -locales.applytoall = Apply Changes To All Locales -locales.addtoother = Add To Other Locales -locales.rollback = Rollback to last applied -locales.filter = Property filter -locales.searchname = Search name... -locales.searchvalue = Search value... -locales.searchlocale = Search locale... -locales.byname = By name -locales.byvalue = By value -locales.showcorrect = Show properties that are present in all locales and have unique values everywhere -locales.showmissing = Show properties that are missing in some locales -locales.showsame = Show properties that have same values in different locales -locales.viewproperty = View in all locales -locales.viewing = Viewing property "{0}" -locales.addicon = Add Icon +locales.info = Aqui podes adicionar pacotes locais para idiomas específicos no teu mapa. Nos pacotes locais, cada propriedade tem um nome e um valor. Estas propriedades podem ser usadas por processadroes globais ou objetivos que usem os seus nomes. Suportam formatação de texto (substituir espaços por valores atuais).\n\n[cyan]Example property:\n[]name: [accent]timer[]\nvalue: [accent]Example timer, time left: {0}[]\n\n[cyan]Usage:\n[]Set it as objective's text: [accent]@timer\n\n[]Print it in a world processor:\n[accent]localeprint "timer"\nformat time\n[gray](where time is a separately calculated variable) +locales.deletelocale = Tens a certeza que queres apagar este pacote local? +locales.applytoall = Aplicar Modificações a Todos os Locais +locales.addtoother = Adicionar a Outros Locais +locales.rollback = Reverter para último aplicado +locales.filter = Filtro de propriedade +locales.searchname = Procurar nome... +locales.searchvalue = Provurar valor... +locales.searchlocale = Procurar local... +locales.byname = Por nome +locales.byvalue = Por valor +locales.showcorrect = Mostrar propriedades que estão presentes em todos os locais e têm valores únicos em todo o lado +locales.showmissing = Mostrar propriedades que estão em falta em alguns locais +locales.showsame = Mostrar propriedades que têm valores iguais em locais diferentes +locales.viewproperty = Ver em todos os locais +locales.viewing = A ver propriedade "{0}" +locales.addicon = Adicionar Ícone width = Largura: height = Altura: menu = Menu play = Jogar -campaign = Campannha +campaign = Campanha load = Carregar save = Gravar fps = FPS: {0} @@ -643,7 +655,7 @@ ping = Ping: {0}ms tps = TPS: {0} memory = Mem: {0}mb memory2 = Mem:\n {0}mb +\n {1}mb -language.restart = Por favor, reinicie seu jogo para a tradução tomar efeito. +language.restart = Por favor, reinicia o teu jogo para aplicar a atradução. settings = Configurações tutorial = Tutorial tutorial.retake = Refazer Tutorial @@ -651,150 +663,158 @@ editor = Editor mapeditor = Editor de mapa abandon = Abandonar -abandon.text = Esta zona e todos os seus recursos serão perdidos para o inimigo. -locked = Trancado +abandon.text = Este setor e todos os seus recursos serão perdidos para o inimigo. +locked = Bloqueado complete = [lightgray]Completo: -requirement.wave = Ronda alcançada {0} / {1} +requirement.wave = Horda alcançada {0} / {1} requirement.core = Destruir Núcleo Inimigo em {0} -requirement.research = Research {0} -requirement.produce = Produce {0} +requirement.research = Investigue {0} +requirement.produce = Produza {0} requirement.capture = Capture {0} -requirement.onplanet = Control Sector On {0} -requirement.onsector = Land On Sector: {0} -launch.text = Launch -map.multiplayer = Only the host can view sectors. +requirement.onplanet = Controlar setor em {0} +requirement.onsector = Aterrar no setor: {0} +launch.text = Lançar +#research.multiplayer = Apenas o anfitrião pode pesquisar itens +map.multiplayer = Apenas o anfitrião pode ver os setores + uncover = Descobrir -configure = Configurar carregamento -objective.research.name = Research -objective.produce.name = Obtain -objective.item.name = Obtain Item -objective.coreitem.name = Core Item -objective.buildcount.name = Build Count -objective.unitcount.name = Unit Count -objective.destroyunits.name = Destroy Units -objective.timer.name = Timer -objective.destroyblock.name = Destroy Block -objective.destroyblocks.name = Destroy Blocks -objective.destroycore.name = Destroy Core -objective.commandmode.name = Command Mode -objective.flag.name = Flag -marker.shapetext.name = Shape Text -marker.point.name = Point -marker.shape.name = Shape -marker.text.name = Text -marker.line.name = Line -marker.quad.name = Quad -marker.texture.name = Texture -marker.background = Background -marker.outline = Outline -objective.research = [accent]Research:\n[]{0}[lightgray]{1} -objective.produce = [accent]Obtain:\n[]{0}[lightgray]{1} -objective.destroyblock = [accent]Destroy:\n[]{0}[lightgray]{1} -objective.destroyblocks = [accent]Destroy: [lightgray]{0}[white]/{1}\n{2}[lightgray]{3} -objective.item = [accent]Obtain: [][lightgray]{0}[]/{1}\n{2}[lightgray]{3} -objective.coreitem = [accent]Move into Core:\n[][lightgray]{0}[]/{1}\n{2}[lightgray]{3} -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}[] -objective.enemyescelating = [accent]Enemy production escalating in [lightgray]{0}[] -objective.enemyairunits = [accent]Enemy air unit production beginning in [lightgray]{0}[] -objective.destroycore = [accent]Destroy Enemy Core -objective.command = [accent]Command Units -objective.nuclearlaunch = [accent]⚠ Nuclear launch detected: [lightgray]{0} -announce.nuclearstrike = [red]⚠ NUCLEAR STRIKE INBOUND ⚠ -loadout = Loadout -resources = Resources -resources.max = Max +configure = Configurar Carregamento + +objective.research.name = Pesquisa +objective.produce.name = Obter +objective.item.name = Obter o Item +objective.coreitem.name = Item do Núcleo +objective.buildcount.name = Quantidade de Construções +objective.unitcount.name = Quantidade de Unidades +objective.destroyunits.name = Destruir Unidades +objective.timer.name = Temporizador +objective.destroyblock.name = Destruir Bloco +objective.destroyblocks.name = Destruir Blocos +objective.destroycore.name = Destruir o Núcleo +objective.commandmode.name = Modo de Comando +objective.flag.name = Etiqueta + +marker.shapetext.name = Forma do Texto +marker.point.name = Ponto +marker.shape.name = Forma +marker.text.name = Texto +marker.line.name = Linha +marker.quad.name = Quandrado +marker.texture.name = Textura +marker.background = Fundo +marker.outline = Rebordo + +objective.research = [accent]Pesquisa:\n[]{0}[lightgray]{1} +objective.produce = [accent]Obtém:\n[]{0}[lightgray]{1} +objective.destroyblock = [accent]Destrói:\n[]{0}[lightgray]{1} +objective.destroyblocks = [accent]Destrói: [lightgray]{0}[white]/{1}\n{2}[lightgray]{3} +objective.item = [accent]Obtém: [][lightgray]{0}[]/{1}\n{2}[lightgray]{3} +objective.coreitem = [accent]Move para o Núcleo:\n[][lightgray]{0}[]/{1}\n{2}[lightgray]{3} +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}[] +objective.enemyescelating = [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.destroycore = [accent]Destrói o Núcleo Inimigo +objective.command = [accent]Comandar Unidades +objective.nuclearlaunch = [accent]⚠ Lançamento Nuclear detetado: [lightgray]{0} + +announce.nuclearstrike = [red]\u26A0 ATAQUE NUCLEAR APROXIMANDO-SE \u26A0\n[lightgray]constrói núcleos de reserva imediatamente + +loadout = Carregamento +resources = Recursos +resources.max = Máximo bannedblocks = Blocos banidos -objectives = Objectives -bannedunits = Banned Units -bannedunits.whitelist = Banned Units As Whitelist -bannedblocks.whitelist = Banned Blocks As Whitelist -addall = Adiciona tudo -launch.from = Launching From: [accent]{0} -launch.capacity = Launching Item Capacity: [accent]{0} -launch.destination = Destination: {0} -landing.sources = Source Sectors: [accent]{0}[] -landing.import = Max Total Import: {0}[accent]{1}[lightgray]/min +objectives = Objectivos +bannedunits = Unidades banidas +bannedunits.whitelist = Unidades banidas como Lista branca +bannedblocks.whitelist = Blocos banidos como Lista branca +addall = Adicionar tudo +launch.from = A lançar de: [accent]{0} +launch.capacity = Capacidade de Itens de Lançamento: [accent]{0} +launch.destination = Destino: {0} configure.invalid = A quantidade deve ser um número entre 0 e {0}. add = Adicionar... -guardian = Guardian +guardian = Guardião connectfail = [crimson]Falha ao entrar no servidor: [accent]{0} -error.unreachable = Servidor inalcançável. +error.unreachable = Servidor inalcançável.\nO endereço está certo? error.invalidaddress = Endereço inválido. -error.timedout = Desconectado!\nTenha certeza que o anfitrião tenha feito redirecionamento de portas e que o endereço esteja correto! -error.mismatch = Erro de pacote:\nPossivel incompatibilidade com a versão do cliente/servidor.\nTenha certeza que você e o anfitrião tenham a última versão! +error.timedout = Desconectado!\nTem a certeza que o anfitrião configurou o port forwarding e que o endereço está correto! +error.mismatch = Erro de pacote:\nPossível incompatibilidade com a versão do cliente/servidor.\nTem a certeza que tu e o anfitrião têm a última versão! error.alreadyconnected = Já conectado. error.mapnotfound = Ficheiro de mapa não encontrado! error.io = Erro I/O de internet. error.any = Erro de rede desconhecido. -error.bloom = Falha ao inicializar bloom.\nSeu aparelho talvez não o suporte. -error.moddex = Mindustry is unable to load this mod.\nYour device is blocking import of Java mods due to recent changes in Android.\nThere is no known workaround to this issue. +error.bloom = Falha ao inicializar bloom.\nTalvez o seu dispositivo não o suporte. +error.moddex = O Mindustry não consegue carregar este mod.\nO seu dispositivo está a bloquear a importação de mods Java devido a implementações do Android.\nAinda não foi encontrada uma solução. -weather.rain.name = Rain -weather.snowing.name = Snow -weather.sandstorm.name = Sandstorm -weather.sporestorm.name = Sporestorm -weather.fog.name = Fog -campaign.playtime = \uf129 [lightgray]Sector Playtime: {0} -campaign.complete = [accent]Congratulations.\n\nThe enemy on {0} has been defeated.\n[lightgray]The final sector has been conquered. -sectorlist = Sectors -sectorlist.attacked = {0} under attack +weather.rain.name = Chuva +weather.snowing.name = Neve +weather.sandstorm.name = Tempestade de Areia +weather.sporestorm.name = Tempestade de Esporos +weather.fog.name = Nevoeiro + +campaign.playtime = \uf129 [lightgray]Tempo de Jogo do setor: {0} +campaign.complete = [accent]Parabéns.\n\nO Inimigo em {0} foi derrotado.\n[lightgray]O setor final foi conquistado. + +sectorlist = Setores +sectorlist.attacked = {0} sob ataque + +sectors.unexplored = [lightgray]Não explorado +sectors.resources = Recursos: +sectors.production = Produção: +sectors.export = Exportar: +sectors.import = Importar: +sectors.time = Tempo: +sectors.threat = Ameaça: +sectors.wave = Horda: +sectors.stored = Armazenado: +sectors.resume = Continuar +sectors.launch = Lançar +sectors.select = Selecionar +sectors.nonelaunch = [lightgray]nenhum (sun) +sectors.rename = Renomear Setor +sectors.enemybase = [scarlet]Base Inimiga +sectors.vulnerable = [scarlet]Vulnerável +sectors.underattack = [scarlet]Sob ataque! [accent]{0}% danificado +sectors.underattack.nodamage = [scarlet]Não Capturado +sectors.survives = [accent]Sobrevive {0} hordas +sectors.go = ir +sector.abandon = Abandonar +sector.abandon.confirm = O(s) núcleo(s) deste setor irão autodestruir-se.\nContinuar? +sector.curcapture = Setor Capturado +sector.curlost = Sector Perdido +sector.missingresources = [scarlet]Recursos Insuficientes no Núcleo +sector.attacked = Setor [accent]{0}[white] sob ataque! +sector.lost = Setor [accent]{0}[white] perdido! +sector.capture = Setor [accent]{0}[white]Capturado! +sector.capture.current = Setor Capturado! +sector.changeicon = Mudar ícone +sector.noswitch.title = Não foi possivel mudar de Setores +sector.noswitch = Não deves trocar de setores quando existe um sobre ataque.\n\nSetor: [accent]{0}[] em [accent]{1}[] +sector.view = Ver Setor + +threat.low = Baixo +threat.medium = Médio +threat.high = Alto +threat.extreme = Extremo +threat.eradication = Erradicação -sectors.unexplored = [lightgray]Unexplored -sectors.resources = Resources: -sectors.production = Production: -sectors.export = Export: -sectors.import = Import: -sectors.time = Time: -sectors.threat = Threat: -sectors.wave = Wave: -sectors.stored = Stored: -sectors.resume = Resume -sectors.launch = Launch -sectors.select = Select -sectors.launchselect = Select Launch Destination -sectors.nonelaunch = [lightgray]none (sun) -sectors.redirect = Redirect Launch Pads -sectors.rename = Rename Sector -sectors.enemybase = [scarlet]Enemy Base -sectors.vulnerable = [scarlet]Vulnerable -sectors.underattack = [scarlet]Under attack! [accent]{0}% damaged -sectors.underattack.nodamage = [scarlet]Uncaptured -sectors.survives = [accent]Survives {0} waves -sectors.go = Go -sector.abandon = Abandon -sector.abandon.confirm = This sector's core(s) will self-destruct.\nContinue? -sector.curcapture = Sector Captured -sector.curlost = Sector Lost -sector.missingresources = [scarlet]Insufficient Core Resources -sector.attacked = Sector [accent]{0}[white] under attack! -sector.lost = Sector [accent]{0}[white] lost! -sector.capture = Sector [accent]{0}[white]Captured! -sector.capture.current = Sector Captured! -sector.changeicon = Change Icon -sector.noswitch.title = Unable to Switch Sectors -sector.noswitch = You may not switch sectors while an existing sector is under attack.\n\nSector: [accent]{0}[] on [accent]{1}[] -sector.view = View Sector -threat.low = Low -threat.medium = Medium -threat.high = High -threat.extreme = Extreme -threat.eradication = Eradication difficulty.casual = Casual -difficulty.easy = Easy +difficulty.easy = Fácil difficulty.normal = Normal -difficulty.hard = Hard -difficulty.eradication = Eradication -planets = Planets +difficulty.hard = Difícil +difficulty.eradication = Erradicação + +planets = Planetas planet.serpulo.name = Serpulo planet.erekir.name = Erekir -planet.sun.name = Sun -sector.impact0078.name = Impact 0078 +planet.sun.name = Sol +sector.impact0078.name = Impact 0078 sector.groundZero.name = Ground Zero sector.craters.name = The Craters sector.frozenForest.name = Frozen Forest @@ -823,31 +843,33 @@ sector.weatheredChannels.name = Weathered Channels sector.mycelialBastion.name = Mycelial Bastion sector.frontier.name = Frontier -sector.groundZero.description = The optimal location to begin once more. Low enemy threat. Few resources.\nGather as much lead and copper as possible.\nMove on. -sector.frozenForest.description = Even here, closer to mountains, the spores have spread. The frigid temperatures cannot contain them forever.\n\nBegin the venture into power. Build combustion generators. Learn to use menders. -sector.saltFlats.description = On the outskirts of the desert lie the Salt Flats. Few resources can be found in this location.\n\nThe enemy has erected a resource storage complex here. Eradicate their core. Leave nothing standing. -sector.craters.description = Water has accumulated in this crater, relic of the old wars. Reclaim the area. Collect sand. Smelt metaglass. Pump water to cool turrets and drills. -sector.ruinousShores.description = Past the wastes, is the shoreline. Once, this location housed a coastal defense array. Not much of it remains. Only the most basic defense structures have remained unscathed, everything else reduced to scrap.\nContinue the expansion outwards. Rediscover the technology. -sector.stainedMountains.description = Further inland lie the mountains, yet untainted by spores.\nExtract the abundant titanium in this area. Learn how to use it.\n\nThe enemy presence is greater here. Do not give them time to send their strongest units. -sector.overgrowth.description = This area is overgrown, closer to the source of the spores.\nThe enemy has established an outpost here. Build Titan units. Destroy it. Reclaim that which was lost. -sector.tarFields.description = The outskirts of an oil production zone, between the mountains and desert. One of the few areas with usable tar reserves.\nAlthough abandoned, this area has some dangerous enemy forces nearby. Do not underestimate them.\n\n[lightgray]Research oil processing technology if possible. -sector.desolateRift.description = An extremely dangerous zone. Plentiful resources, but little space. High risk of destruction. Leave as soon as possible. Do not be fooled by the long spacing between enemy attacks. -sector.nuclearComplex.description = A former facility for the production and processing of thorium, reduced to ruins.\n[lightgray]Research the thorium and its many uses.\n\nThe enemy is present here in great numbers, constantly scouting for attackers. -sector.fungalPass.description = A transition area between high mountains and lower, spore-ridden lands. A small enemy reconnaissance base is located here.\nDestroy it.\nUse Dagger and Crawler units. Take out the two cores. -sector.biomassFacility.description = The origin of spores. This is the facility in which they were researched and initially produced.\nResearch the technology contained within. Cultivate spores for the production of fuel and plastics.\n\n[lightgray]Upon this facility's demise, the spores were released. Nothing in the local ecosystem could compete with such an invasive organism. -sector.windsweptIslands.description = Further past the shoreline is this remote chain of islands. Records show they once had [accent]Plastanium[]-producing structures.\n\nFend off the enemy's naval units. Establish a base on the islands. Research these factories. -sector.extractionOutpost.description = A remote outpost, constructed by the enemy for the purpose of launching resources to other sectors.\n\nCross-sector transport technology is essential for further conquest. Destroy the base. Research their Launch Pads. -sector.impact0078.description = Here lie remnants of the interstellar transport vessel that first entered this system.\n\nSalvage as much as possible from the wreckage. Research any intact technology. -sector.planetaryTerminal.description = The final target.\n\nThis coastal base contains a structure capable of launching Cores to local planets. It is extremely well guarded.\n\nProduce naval units. Eliminate the enemy as quickly as possible. Research the launch structure. -sector.coastline.description = Remnants of naval unit technology have been detected at this location. Repel the enemy attacks, capture this sector, and acquire the technology. -sector.navalFortress.description = The enemy has established a base on a remote, naturally-fortified island. Destroy this outpost. Acquire their advanced naval craft technology, and research it. +sector.groundZero.description = Um bom lugar para recomeçar. Baixa ameaça inimiga. Poucos recursos.\nConsegue o máximo possível de chumbo e cobre.\nContinua. +sector.frozenForest.description = Mesmo aqui, perto das montanhas, os esporos espalharam-se. As temperaturas baixas não os podem conter para sempre.\n\nComeça a aventura com energia. Constrói geradores a combustão. Aprende a usar reparadores. +sector.saltFlats.description = Nos arredores do deserto ficam as planícies de sal. Poucos recursos podem ser encontrados neste local.\n\nO inimigo construiu um complexo de armazenamento de recursos aqui. Destrói o núcleo deles. Não deixes nada de sobra. +sector.craters.description = A água se acumulou nesta cratera, relíquia das guerras antigas. Reconquista a área. Recolhe areia. Faz metavidro. Usa a água para arrefecer brocas e torres. +sector.ruinousShores.description = Para além dos resíduos, está a linha costeira. Antigamente, este local abrigava uma rede de defesa costeira. Não restou muita coisa. Apenas as estruturas de defesas básicas permaneceram ilesas, o resto foi reduzido a sucata.\nContinua a expandir os teus territórios, redescobre a tecnologia. +sector.stainedMountains.description = Mais para o interior estão as montanhas, ainda não contaminadas pelos esporos.\nExtrai o titânio que é abundante nesta área. Aprende a usá-lo.\n\nA presença inimiga é maior aqui. Não lhes dês tempo de trazerem unidades mais fortes. +sector.overgrowth.description = Esta área coberta por vegetação, próxima ao local de origem dos esporos.\nO inimigo estabeleceu um posto de controlo aqui. Produz unidades Mace. Destrói-o. +sector.tarFields.description = A periferia de uma zona de produção de petróleo, entre as montanhas e o deserto. Uma das poucas áreas com reservas de alcatrão utilizáveis.\nMesmo abandonada, esta área tem forças inimigas perigosas por perto. Não os subestimes.\n\n[lightgray]Pesquisa a tecnologia de processamento de petróleo se possível. +sector.desolateRift.description = Uma zona extremamente perigosa. Recursos abundantes, mas pouco espaço. Grande risco de destruição. Constrói defesas aéreas e terrestres o mais rápido possível. Não te deixes levar pelo tempo entre os ataques inimigos. +sector.nuclearComplex.description = Uma antiga instalação de produção e processamento de tório, reduzida a ruínas.\n[lightgray]Investiga o tório e os seus vários usos.\n\nO inimigo está presente aqui em grande número, constantemente à procura por atacantes. +sector.fungalPass.description = Uma área de transição entre altas montanhas e terras baixas, repletas de esporos. Uma pequena base de reconhecimento inimiga está aqui.\nDestrua-a. Usa as unidades Dagger e Crawler. Desfaz os dois núcleos. +sector.biomassFacility.description = A origem dos esporos. Esta é a instalação onde eles foram pesquisados e produzidos inicialmente.\nPesquisa a tecnologia contida na instalação. Cultiva os esporos para a produção de combustíveis e plásticos.\n\n[lightgray]No falecimento da instalação, os esporos foram libertados. Nada no ecossistema local conseguia competir com um organismo tão invasivo. +sector.windsweptIslands.description = Um pouco depois do literal está esta série remota de ilhas. Registos mostram que haviam estruturas de produção de [accent]Plastânio[].\n\nDefende-te das unidades navais inimigas. Estabelece uma base nas ilhas. Pesquisa estas fábricas. +sector.extractionOutpost.description = Um posto avançado remoto, construído pelo inimigo com o objetivo de lançar recursos para outros setores.\n\nA tecnologia de transporte entre setores é essencial para conquistas de território posteriores. Destrói a base. Pesquisa as Plataformas de Lançamento deles. +sector.impact0078.description = Aqui repousam restos de uma nave de transporte interestelar que entrou pela primeira vez neste sistema.\nRecupera o máximo possível dos destroços. Pesquisa qualquer tecnologia intacta. +sector.planetaryTerminal.description = O último alvo.\n\nEssa base costeira contém a estrutura capaz de lançar Núcleos para planetas locais. Está extremamente bem protegida.\n\nProduz unidades navais. Elimina o inimigo o mais rápido possível. Pesquisa a estrutura de lançamento. +sector.coastline.description = Restos de tecnologia de unidades navais foram detetados nesta localização. Repele os ataques inimigos, captura o setor, e adquire a tecnologia. +sector.navalFortress.description = O inimigo estabeleceu uma base numa ilha remota e naturalmente fortificada. Destrói este posto. Adquire a tecnologia avançada de construção naval deles, e desenvolve-a. sector.cruxscape.name = Cruxscape sector.geothermalStronghold.name = Geothermal Stronghold + sector.facility32m.description = WIP, map submission by Stormride_R sector.taintedWoods.description = WIP, map submission by Stormride_R sector.atolls.description = WIP, map submission by Stormride_R sector.frontier.description = WIP, map submission by Stormride_R sector.infestedCanyons.description = WIP, map submission by Skeledragon + sector.polarAerodrome.description = WIP, map submission by hhh i 17 sector.testingGrounds.description = WIP, map submission by dnx2019 sector.seaPort.description = WIP, map submission by inkognito626 @@ -870,564 +892,569 @@ sector.siege.name = Siege sector.crossroads.name = Crossroads sector.karst.name = Karst sector.origin.name = Origin -sector.onset.description = Commence the conquest of Erekir. Gather resources, produce units, and begin researching technology. -sector.aegis.description = This sector contains deposits of tungsten.\nResearch the [accent]Impact Drill[] to mine this resource, and destroy the enemy base in the area. -sector.lake.description = This sector's slag lake greatly limits viable units. A hover unit is the only option.\nResearch the [accent]ship fabricator[] and produce an [accent]elude[] unit as soon as possible. -sector.intersect.description = Scans suggest that this sector will be attacked from multiple sides soon after landing.\nSet up defenses quickly and expand as soon as possible.\n[accent]Mech[] units will be required for the area's rough terrain. -sector.atlas.description = This sector contains varied terrain and will require a variety of units to attack effectively.\nUpgraded units may also be necessary to get past some of the tougher enemy bases detected here.\nResearch the [accent]Electrolyzer[] and the [accent]Tank Refabricator[]. -sector.split.description = The minimal enemy presence in this sector makes it perfect for testing new transport tech. -sector.basin.description = Large enemy presence detected in this sector.\nBuild units quickly and capture enemy cores to gain a foothold. -sector.marsh.description = This sector has an abundance of arkycite, but has limited vents.\nBuild [accent]Chemical Combustion Chambers[] to generate power. -sector.peaks.description = The mountainous terrain in this sector make most units useless. Flying units will be required.\nBe aware of enemy anti-air installations. It may be possible to disable some of these installations by targeting their supporting buildings. -sector.ravine.description = No enemy cores detected in the sector, although it's an important transportation route for the enemy. Expect variety of enemy forces.\nProduce [accent]surge alloy[]. Construct [accent]Afflict[] turrets. -sector.caldera-erekir.description = The resources detected in this sector are scattered across several islands.\nResearch and deploy drone-based transportation. -sector.stronghold.description = The large enemy encampment in this sector guards significant deposits of [accent]thorium[].\nUse it to develop higher tier units and turrets. -sector.crevice.description = The enemy will send fierce attack forces to take out your base in this sector.\nDeveloping [accent]carbide[] and the [accent]Pyrolysis Generator[] may be imperative for survival. -sector.siege.description = This sector features two parallel canyons that will force a two-pronged attack.\nResearch [accent]cyanogen[] to gain the capability to create even stronger tank units.\nCaution: enemy long-range missiles have been detected. The missiles may be shot down before impact. -sector.crossroads.description = The enemy bases in this sector have been established in varying terrain. Research different units to adapt.\nAdditionally, some bases are protected by shields. Figure out how they are powered. -sector.karst.description = This sector is rich in resources, but will be attacked by the enemy once a new core lands.\nTake advantage of the resources and research [accent]phase fabric[]. -sector.origin.description = The final sector with a significant enemy presence.\nNo probable research opportunities remain - focus solely on destroying all enemy cores. -status.burning.name = Burning -status.freezing.name = Freezing -status.wet.name = Wet -status.muddy.name = Muddy -status.melting.name = Melting -status.sapped.name = Sapped -status.electrified.name = Electrified -status.spore-slowed.name = Spore Slowed +sector.onset.description = Inicia a conquista de Erekir. Reúne recursos, produz unidades e começa a pesquisar tecnologia. +sector.aegis.description = Este setor contém depósitos de tungsténio.\nDesenvolve a [accent]Broca de Impacto[] para minerar este recurso, e destrói a base inimiga nesta área. +sector.lake.description = O lago de escória neste setor limita muito as unidades viáveis. Uma unidade flutuante é a única opção.\nPesquisa o [accent]Construtor de Naves[] e produza uma unidade [accent]Elude[] o mais rápido possível. +sector.intersect.description = Scans sugerem que este setor será atacado de vários lados logo após a aterragem.\nPrepara defesas rapidamente e expande o mais rápido possível.\nSerão necessárias unidades [accent]Mech[] para o terreno acidentado da área. +sector.atlas.description = Este setor contém terreno variado e exigirá uma variedade de unidades para atacar eficazmente.\nUnidades melhoradas também podem ser necessárias para passar por algumas das bases inimigas mais difíceis detectadas aqui.\nPesquisa o [accent]Eletrolisador[] e o [accent]Refrabicador de Tanques[]. +sector.split.description = A presença mínima de inimigos neste setor torna-o perfeito para testar novas tecnologias de transporte. +sector.basin.description = Grande presença inimiga detetada neste setor.\nConstrói unidades rapidamente e captura os núcleos inimigos para ganhar terreno. +sector.marsh.description = Este setor tem abundância de arquicita, mas tem respiradouros limitados.\nConstrói [accent]Câmaras de Combustão Química[] para gerar energia. +sector.peaks.description = O terreno montanhoso neste setor torna a maioria das unidades inúteis. Unidades voadoras serão necessárias.\nEsteja atento das instalações anti-aéreas inimigas. Pode ser possível desativar algumas dessas instalações ao atacar as suas construções de suporte. +sector.ravine.description = Nenhum núcleo inimigo detetado no setor, embora seja uma importante rota de transporte para o inimigo. Espera uma variedade de forças inimigas.\nProduz [accent]liga de surto[]. Constrói torres [accent]Afflict[]. +sector.caldera-erekir.description = Os recursos detetados neste setor estão espalhados por várias ilhas.\nPesquisa e implanta transporte baseado em drones. +sector.stronghold.description = O grande acampamento inimigo neste setor guarda depósitos significativos de [accent]tório[].\nUse-o para desenvolver unidades e torres de nível superior. +sector.crevice.description = O inimigo enviará forças de ataque ferozes para destruir a tua base neste setor.\nDesenvolver [accent]carbide[] e o [accent]Gerador de Pirólise[] pode ser indispensável para sobreviver. +sector.siege.description = Este setor apresenta dois desfiladeiros paralelos que forçarão um ataque em duas frentes.\nPesquisa o [accent]cianogénio[] para obter a capacidade de criar unidades de tanques ainda mais fortes.\nCuidado: mísseis inimigos de longo alcance foram detectados. Os mísseis podem ser derrubados antes do impacto. +sector.crossroads.description = As bases inimigas neste setor foram estabelecidas em terrenos variados. Pesquisa diferentes unidades para adaptar.\nAlém disso, algumas bases estão protegidas por escudos. Descobre como eles são alimentados. +sector.karst.description = Este setor é rico em recursos, mas será atacado pelo inimigo assim que um novo núcleo chegar.\nAproveita os recursos e pesquisa o [accent]tecido de fase[]. +sector.origin.description = O setor final com uma presença inimiga significativa.\nNenhuma oportunidade de pesquisa provável permanece - foca-te apenas em destruir todos os núcleos inimigos. + +status.burning.name = Queimar +status.freezing.name = Congelar +status.wet.name = Molhado +status.muddy.name = Lama +status.melting.name = Derreter +status.sapped.name = Enfraquecer +status.electrified.name = Eletrificar +status.spore-slowed.name = Lentidão de Esporos status.tarred.name = Tarred -status.overdrive.name = Overdrive +status.overdrive.name = Sobrecarga status.overclock.name = Overclock -status.shocked.name = Shocked -status.blasted.name = Blasted -status.unmoving.name = Unmoving -status.boss.name = Guardian +status.shocked.name = Choque +status.blasted.name = Explosão +status.unmoving.name = Parado +status.boss.name = Guardião -settings.language = Linguagem +settings.language = Idioma settings.data = Dados do jogo settings.reset = Restaurar Padrões settings.rebind = Religar -settings.resetKey = Reset -settings.controls = Controles +settings.resetKey = Repor +settings.controls = Controlos settings.game = Jogo settings.sound = Som settings.graphics = Gráficos settings.cleardata = Apagar dados... -settings.clear.confirm = Certeza que quer limpar a os dados?\nOque é feito não pode ser desfeito! -settings.clearall.confirm = [scarlet]Aviso![]\nIsso vai limpar toda a data, Incluindo saves, mapas, Keybinds e desbloqueados.\nQuando apertar 'ok' Vai apagar toda a data e sair automaticamente. -settings.clearsaves.confirm = Are you sure you want to clear all your saves? -settings.clearsaves = Clear Saves -settings.clearresearch = Clear Research -settings.clearresearch.confirm = Are you sure you want to clear all of your campaign research? -settings.clearcampaignsaves = Clear Campaign Saves -settings.clearcampaignsaves.confirm = Are you sure you want to clear all of your campaign saves? -paused = Pausado +settings.clear.confirm = Tens a certeza que queres limpar os dados?\nOque é feito não pode ser desfeito! +settings.clearall.confirm = [scarlet]AVISO![]\nIsto vai limpar todos os dados, incluindo saves, mapas, keybinds e desbloqueios.\nQuando apertar 'ok' o jogo vai apagar todos os dados e fechar automaticamente. +settings.clearsaves.confirm = Tens a certeza que queres apagar todos os teus saves? +settings.clearsaves = Apagar Saves +settings.clearresearch = Limpar Pesquisa +settings.clearresearch.confirm = Tens a certeza que queres apagar toda a tua pesquisa na campanha? +settings.clearcampaignsaves = Limpar Saves da Campanha +settings.clearcampaignsaves.confirm = Tens a certeza que queres limpar todos os teus saves da campanha? +paused = < Pausado > clear = Limpar banned = [scarlet]Banido -unsupported.environment = [scarlet]Unsupported Environment +unsupported.environment = [scarlet]Ambiente Não Suportado yes = Sim no = Não info.title = [accent]Informação error.title = [crimson]Ocorreu um Erro. error.crashtitle = Ocorreu um Erro -unit.nobuild = [scarlet]Unit can't build -lastaccessed = [lightgray]Last Accessed: {0} -lastcommanded = [lightgray]Last Commanded: {0} +unit.nobuild = [scarlet]Unidade não pode construir +lastaccessed = [lightgray]Último Acesso: {0} +lastcommanded = [lightgray]Último comando: {0} block.unknown = [lightgray]??? -stat.showinmap = -stat.description = Purpose +stat.showinmap = +stat.description = Finalidade stat.input = Entrada stat.output = Saida -stat.maxefficiency = Max Efficiency +stat.maxefficiency = Eficiência Máxima stat.booster = Booster -stat.tiles = Telhas Requeridas +stat.tiles = Blocos Necessários stat.affinities = Afinidades -stat.opposites = Opposites +stat.opposites = Opostos stat.powercapacity = Capacidade de Energia stat.powershot = Energia/tiro stat.damage = Dano -stat.targetsair = Mirar no ar -stat.targetsground = Mirar no chão +stat.targetsair = Mirar no Ar +stat.targetsground = Mirar no Chão stat.itemsmoved = Velocidade de movimento -stat.launchtime = Tempo entre tiros -stat.shootrange = Alcance +stat.launchtime = Tempo entre Tiros +stat.shootrange = Alcance de Tiro stat.size = Tamanho -stat.displaysize = Display Size +stat.displaysize = Mostrar Tamanho stat.liquidcapacity = Capacidade de Líquido stat.powerrange = Alcance da Energia -stat.linkrange = Link Range -stat.instructions = Instructions -stat.powerconnections = Max Connections -stat.poweruse = Uso de energia +stat.linkrange = Alcance do Link +stat.instructions = Instruções +stat.powerconnections = Conexões Máximas +stat.poweruse = Uso de Energia stat.powerdamage = Dano/Poder stat.itemcapacity = Capacidade de Itens -stat.memorycapacity = Memory Capacity -stat.basepowergeneration = Geração de poder base -stat.productiontime = Tempo de produção -stat.repairtime = Tempo de reparo total do bloco -stat.repairspeed = Repair Speed -stat.weapons = Weapons -stat.bullet = Bullet -stat.moduletier = Module Tier -stat.unittype = Unit Type -stat.speedincrease = Aumento de velocidade -stat.range = Distância -stat.drilltier = Furáveis -stat.drillspeed = Velocidade da broca base +stat.memorycapacity = Capacidade de Memória +stat.basepowergeneration = Geração de Poder Base +stat.productiontime = Tempo de Produção +stat.repairtime = Tempo de Reparo Total do Bloco +stat.repairspeed = Velocidade de Reparação +stat.weapons = Armas +stat.bullet = Bala +stat.moduletier = Nível do Módulo +stat.unittype = Tipo de Unidade +stat.speedincrease = Aumento de Velocidade +stat.range = Alcance +stat.drilltier = Brocas +stat.drillspeed = Velocidade base da Broca stat.boosteffect = Efeito do Boost -stat.maxunits = Máximo de unidades ativas +stat.maxunits = Máximo de Unidades Ativas stat.health = Saúde stat.armor = Armor -stat.buildtime = Tempo de construção -stat.maxconsecutive = Max Consecutive -stat.buildcost = Custo de construção +stat.buildtime = Tempo de Construção +stat.maxconsecutive = Máximo Consecutivo +stat.buildcost = Custo de Construção stat.inaccuracy = Imprecisão stat.shots = Tiros -stat.reload = Tiros por segundo +stat.reload = Tiros por Segundo stat.ammo = Munição -stat.shieldhealth = Shield Health -stat.cooldowntime = Cooldown Time -stat.explosiveness = Explosiveness -stat.basedeflectchance = Base Deflect Chance -stat.lightningchance = Lightning Chance -stat.lightningdamage = Lightning Damage -stat.flammability = Flammability -stat.radioactivity = Radioactivity -stat.charge = Charge -stat.heatcapacity = HeatCapacity -stat.viscosity = Viscosity -stat.temperature = Temperature -stat.speed = Speed -stat.buildspeed = Build Speed -stat.minespeed = Mine Speed -stat.minetier = Mine Tier -stat.payloadcapacity = Payload Capacity -stat.abilities = Abilities -stat.canboost = Can Boost -stat.flying = Flying -stat.ammouse = Ammo Use -stat.ammocapacity = Ammo Capacity -stat.damagemultiplier = Damage Multiplier -stat.healthmultiplier = Health Multiplier -stat.speedmultiplier = Speed Multiplier -stat.reloadmultiplier = Reload Multiplier -stat.buildspeedmultiplier = Build Speed Multiplier -stat.reactive = Reacts -stat.immunities = Immunities -stat.healing = Healing +stat.shieldhealth = Vida do Escudo +stat.cooldowntime = Tempo de Espera +stat.explosiveness = Explosividade +stat.basedeflectchance = Probabilidade Base de Esquiva +stat.lightningchance = Probabilidade de Raio +stat.lightningdamage = Dano de Raio +stat.flammability = Inflamabilidade +stat.radioactivity = Radioatividade +stat.charge = Carga de Eletricidade +stat.heatcapacity = Capacidade de Calor +stat.viscosity = Viscosidade +stat.temperature = Temperatura +stat.speed = Velocidade +stat.buildspeed = Velocidade de Construção +stat.minespeed = Velocidade de Mineração +stat.minetier = Nível de Mineração +stat.payloadcapacity = Capacidade da Carga +stat.abilities = Habilidades +stat.canboost = Pode Impulsionar +stat.flying = Voar +stat.ammouse = Consumo de Munição +stat.ammocapacity = Capacidade de Munição +stat.damagemultiplier = Multiplicador de Dano +stat.healthmultiplier = Multiplicador de Vida +stat.speedmultiplier = Multiplicador de Velocidade +stat.reloadmultiplier = Multiplicador de Recarga +stat.buildspeedmultiplier = Multiplicador de Velocidade de COnstrução +stat.reactive = Reações +stat.immunities = Imunidade +stat.healing = Reparação -ability.forcefield = Force Field -ability.forcefield.description = Projects a force shield that absorbs bullets -ability.repairfield = Repair Field -ability.repairfield.description = Repairs nearby units -ability.statusfield = Status Field -ability.statusfield.description = Applies a status effect to nearby units -ability.unitspawn = Factory -ability.unitspawn.description = Constructs units -ability.shieldregenfield = Shield Regen Field -ability.shieldregenfield.description = Regenerates shields of nearby units -ability.movelightning = Movement Lightning -ability.movelightning.description = Releases lightning while moving -ability.armorplate = Armor Plate -ability.armorplate.description = Reduces damage taken while shooting -ability.shieldarc = Shield Arc -ability.shieldarc.description = Projects a force shield in an arc that absorbs bullets -ability.suppressionfield = Regen Suppression Field -ability.suppressionfield.description = Stops nearby repair buildings -ability.energyfield = Energy Field -ability.energyfield.description = Zaps nearby enemies -ability.energyfield.healdescription = Zaps nearby enemies and heals allies -ability.regen = Regeneration -ability.regen.description = Regenerates own health over time -ability.liquidregen = Liquid Absorption -ability.liquidregen.description = Absorbs liquid to heal itself -ability.spawndeath = Death Spawns -ability.spawndeath.description = Releases units on death -ability.liquidexplode = Death Spillage -ability.liquidexplode.description = Spills liquid on death -ability.stat.firingrate = [stat]{0}/sec[lightgray] firing rate -ability.stat.regen = [stat]{0}[lightgray] health/sec -ability.stat.pulseregen = [stat]{0}[lightgray] health/pulse -ability.stat.shield = [stat]{0}[lightgray] shield -ability.stat.repairspeed = [stat]{0}/sec[lightgray] repair speed -ability.stat.slurpheal = [stat]{0}[lightgray] health/liquid unit -ability.stat.cooldown = [stat]{0} sec[lightgray] cooldown -ability.stat.maxtargets = [stat]{0}[lightgray] max targets -ability.stat.sametypehealmultiplier = [stat]{0}%[lightgray] same type repair amount -ability.stat.damagereduction = [stat]{0}%[lightgray] damage reduction -ability.stat.minspeed = [stat]{0} tiles/sec[lightgray] min speed -ability.stat.duration = [stat]{0} sec[lightgray] duration -ability.stat.buildtime = [stat]{0} sec[lightgray] build time +ability.forcefield = Campo de Força +ability.forcefield.description = Cria um campo de força que absorve as balas +ability.repairfield = Campo de Reparação +ability.repairfield.description = Repara unidades próximas +ability.statusfield = Campo de Estado +ability.statusfield.description = Aplica um estado a unidades próximas +ability.unitspawn = Fábrica +ability.unitspawn.description = Constrói unidades +ability.shieldregenfield = Campo de regeneração do escudo +ability.shieldregenfield.description = Regenera o escudo de unidades próximas +ability.movelightning = Raio de Movimento +ability.movelightning.description = Liberta raios enquanto se move +ability.armorplate = Placa de Armadura +ability.armorplate.description = Reduz o dano sofrido ao disparar +ability.shieldarc = Arco de Escudo +ability.shieldarc.description = Projeta um campo de escudo em forma de arco que absorve as balas +ability.suppressionfield = Supressão de Reparo +ability.suppressionfield.description = Pára reparações de estruturas próximas +ability.energyfield = Campo de Energia +ability.energyfield.description = Eletrocuta inimigos próximos +ability.energyfield.healdescription = Eletrocuta inimigos próximos e cura aliados +ability.regen = Regeneração +ability.regen.description = Regenera a própria vida com o tempo +ability.liquidregen = Absorção de Líquidos +ability.liquidregen.description = Absorve líquidos para curar-se a si próprio +ability.spawndeath = Spawns de Morte +ability.spawndeath.description = Liberta unidades aquando a morte +ability.liquidexplode = Derrame de morte +ability.liquidexplode.description = Derrama líquidos aquando a morte +ability.stat.firingrate = [stat]{0}/seg.[lightgray] taxa de disparo +ability.stat.regen = [stat]{0}[lightgray] vida/sec +ability.stat.pulseregen = [stat]{0}[lightgray] vida/pulso +ability.stat.shield = [stat]{0}[lightgray] escudo +ability.stat.repairspeed = [stat]{0}/seg.[lightgray] velocidade de reparação +ability.stat.slurpheal = [stat]{0}[lightgray] unidade de vida/líquido +ability.stat.cooldown = [stat]{0} seg.[lightgray] espera +ability.stat.maxtargets = [stat]{0}[lightgray] alvos máximos +ability.stat.sametypehealmultiplier = [stat]{0}%[lightgray] quantidade de reparação do mesmo tipo +ability.stat.damagereduction = [stat]{0}%[lightgray] redução de dano +ability.stat.minspeed = [stat]{0} blocos/seg.[lightgray] velocidade mínima +ability.stat.duration = [stat]{0} seg.[lightgray] duração +ability.stat.buildtime = [stat]{0} seg.[lightgray] tempo de construção -bar.onlycoredeposit = Only Core Depositing Allowed - -bar.drilltierreq = Broca melhor necessária. -bar.nobatterypower = Insufficieny Battery Power -bar.noresources = Missing Resources -bar.corereq = Core Base Required -bar.corefloor = Core Zone Tile Required -bar.cargounitcap = Cargo Unit Cap Reached -bar.drillspeed = Velocidade da broca: {0}/s -bar.pumpspeed = Pump Speed: {0}/s +bar.onlycoredeposit = Depósito no núcleo permitido apenas +bar.drilltierreq = Melhor broca necessária +bar.noresources = Recursos Insuficientes +bar.corereq = Base de Núcleo Necessária +bar.corefloor = Chão de colocação do Núcleo Necessária +bar.cargounitcap = Limite de Carga Atingido +bar.drillspeed = Velocidade da Broca: {0}/s +bar.pumpspeed = Velocidade da Bomba: {0}/s bar.efficiency = Eficiência: {0}% -bar.boost = Boost: +{0}% -bar.powerbuffer = Battery Power: {0}/{1} -bar.powerbalance = Energia: {0} +bar.boost = Impulso: +{0}% +bar.powerbalance = Energia: {0}/s + bar.powerstored = Armazenada: {0}/{1} bar.poweramount = Energia: {0} bar.poweroutput = Saída de energia: {0} -bar.powerlines = Connections: {0}/{1} +bar.powerlines = Conexões: {0}/{1} bar.items = Itens: {0} bar.capacity = Capacidade: {0} bar.unitcap = {0} {1}/{2} -bar.liquid = Liquido -bar.heat = Aquecimento -bar.cooldown = Cooldown -bar.instability = Instability -bar.heatamount = Heat: {0} -bar.heatpercent = Heat: {0} ({1}%) -bar.power = Poder -bar.progress = Progresso da construção -bar.loadprogress = Progress -bar.launchcooldown = Launch Cooldown -bar.input = Input -bar.output = Output -bar.strength = [stat]{0}[lightgray]x strength +bar.liquid = Líquido +bar.heat = Calor +bar.instability = Instabilidade +bar.heatamount = Calor: {0} +bar.heatpercent = Calor: {0} ({1}%) -units.processorcontrol = [lightgray]Processor Controlled +bar.power = Poder +bar.progress = Progresso da Construção +bar.loadprogress = Progreso +bar.launchcooldown = Cooldown de Lançamento +bar.input = Entrada +bar.output = Saída +bar.strength = [stat]{0}[lightgray]x força + +units.processorcontrol = [lightgray]Controlado por Processador bullet.damage = [stat]{0}[lightgray] dano -bullet.splashdamage = [stat]{0}[lightgray] Dano em área ~[stat] {1}[lightgray] Blocos -bullet.incendiary = [stat]Incendiário -bullet.homing = [stat]Guiado -bullet.armorpierce = [stat]armor piercing -bullet.maxdamagefraction = [stat]{0}%[lightgray] damage limit -bullet.suppression = [stat]{0} sec[lightgray] repair suppression ~ [stat]{1}[lightgray] tiles -bullet.interval = [stat]{0}/sec[lightgray] interval bullets: -bullet.frags = [stat]{0}[lightgray]x frag bullets: -bullet.lightning = [stat]{0}[lightgray]x lightning ~ [stat]{1}[lightgray] damage -bullet.buildingdamage = [stat]{0}%[lightgray] building damage -bullet.knockback = [stat]{0}[lightgray]Impulso -bullet.pierce = [stat]{0}[lightgray]x pierce -bullet.infinitepierce = [stat]pierce -bullet.healpercent = [stat]{0}[lightgray]% healing -bullet.healamount = [stat]{0}[lightgray] direct repair +bullet.splashdamage = [stat]{0}[lightgray] Dano em área ~[stat] {1}[lightgray] Bloco(s) +bullet.incendiary = [stat]incendiário +bullet.homing = [stat]guiado +bullet.armorpierce = [stat]perfuração de armadura +bullet.maxdamagefraction = [stat]{0}%[lightgray] limite de dano +bullet.suppression = [stat]{0} seg.[lightgray] supressão de reparação ~ [stat]{1}[lightgray] blocos +bullet.interval = [stat]{0}/seg.[lightgray] balas de intervalo: +bullet.frags = [stat]{0}[lightgray]x fragmentos de balas: +bullet.lightning = [stat]{0}[lightgray]x raio ~ [stat]{1}[lightgray] dano +bullet.buildingdamage = [stat]{0}%[lightgray] dano em construções +bullet.knockback = [stat]{0}[lightgray] impulso +bullet.pierce = [stat]{0}[lightgray]x perfuração +bullet.infinitepierce = [stat]perfuração +bullet.healpercent = [stat]{0}[lightgray]% cura +bullet.healamount = [stat]{0}[lightgray] reparo direto bullet.multiplier = [stat]{0}[lightgray]x multiplicador de munição bullet.reload = [stat]{0}[lightgray]x cadência de tiro -bullet.range = [stat]{0}[lightgray] tiles range -bullet.notargetsmissiles = [stat] ignores buildings -bullet.notargetsbuildings = [stat] ignores missiles +bullet.range = [stat]{0}[lightgray] alcance de blocos +bullet.notargetsmissiles = [stat] ignora construções +bullet.notargetsbuildings = [stat] ignora mísseis unit.blocks = Blocos -unit.blockssquared = blocks² -unit.powersecond = Unidades de energia/segundo -unit.tilessecond = tiles/second -unit.liquidsecond = Unidades de líquido/segundo -unit.itemssecond = itens/segundo -unit.liquidunits = Unidades de liquido +unit.blockssquared = Blocos² +unit.powersecond = Unidades de energia/seg. +unit.tilessecond = Blocos/seg. +unit.liquidsecond = Unidades de líquido/seg. +unit.itemssecond = Itens/seg. +unit.liquidunits = Unidades de líquido unit.powerunits = Unidades de energia -unit.heatunits = heat units +unit.heatunits = Unidades de calor unit.degrees = Graus unit.seconds = segundos -unit.minutes = mins -unit.persecond = por segundo +unit.minutes = minutos +unit.persecond = /seg. unit.perminute = /min -unit.timesspeed = x Velocidade -unit.multiplier = x +unit.timesspeed = x velocidade + unit.percent = % -unit.shieldhealth = shield health +unit.shieldhealth = saúde do escudo unit.items = itens -unit.thousands = k -unit.millions = mil -unit.billions = b -unit.shots = shots -unit.pershot = /shot -category.purpose = Purpose +unit.thousands = m +unit.millions = M +unit.billions = B +unit.shots = disparos +unit.pershot = /dispasro + +category.purpose = Propósito category.general = Geral category.power = Poder category.liquids = Líquidos category.items = Itens -category.crafting = Construindo -category.function = Function -category.optional = Melhoras opcionais -setting.alwaysmusic.name = Always Play Music -setting.alwaysmusic.description = When enabled, music will always play on loop in-game.\nWhen disabled, it only plays at random intervals. -setting.skipcoreanimation.name = Skip Core Launch/Land Animation -setting.landscape.name = Travar panorama +category.crafting = Entrada/Saída +category.function = Função +category.optional = Melhorias opcionais +setting.alwaysmusic.name = Tocar Música Sempre +setting.alwaysmusic.description = Quando ativado, a música vai ser tocada sempre em loop durante o jogo.\nQUando desativado, só toca em intervalos aleatórios. +setting.skipcoreanimation.name = Passar Animação de Lançamento/Aterragem do Núcleo +setting.landscape.name = Bloquear Orientação setting.shadows.name = Sombras -setting.blockreplace.name = Automatic Block Suggestions +setting.blockreplace.name = Sugestões Automáticas de Blocos setting.linear.name = Filtragem linear -setting.hints.name = Hints -setting.logichints.name = Logic Hints -setting.backgroundpause.name = Pause In Background -setting.buildautopause.name = Auto-Pause Building -setting.doubletapmine.name = Double-Tap to Mine -setting.commandmodehold.name = Hold For Command Mode -setting.distinctcontrolgroups.name = Limit One Control Group Per Unit -setting.modcrashdisable.name = Disable Mods On Startup Crash -setting.animatedwater.name = Água animada -setting.animatedshields.name = Escudos animados -setting.playerindicators.name = Player Indicators -setting.indicators.name = Indicador de aliados -setting.autotarget.name = Alvo automatico -setting.keyboard.name = Controles de mouse e teclado -setting.touchscreen.name = Controles de Touchscreen -setting.fpscap.name = FPS Máximo +setting.hints.name = Dicas +setting.logichints.name = Dicas de Lógica +setting.backgroundpause.name = Pausar Jogo em Segundo Plano +setting.buildautopause.name = Auto-Pausar Construções +setting.doubletapmine.name = Duplo Toque para Minerar +setting.commandmodehold.name = Segurar para Modo de Comando +setting.distinctcontrolgroups.name = Limitar um Grupo de Controlo por Unidade +setting.modcrashdisable.name = Desativar Mods em Crash de Início do Jogo +setting.animatedwater.name = Água Animada +setting.animatedshields.name = Escudos Animados +setting.playerindicators.name = Indicador de Jogadores +setting.indicators.name = Indicador de inimigos +setting.autotarget.name = Alvo Automático +setting.keyboard.name = Controlos de Rato e Teclado +setting.touchscreen.name = Controlos de Touchscreen +setting.fpscap.name = Limite de FPS setting.fpscap.none = Nenhum setting.fpscap.text = {0} FPS -setting.uiscale.name = Escala da IU[lightgray] (reinicialização requerida)[] -setting.uiscale.description = Restart required to apply changes. -setting.swapdiagonal.name = Sempre colocação diagnoal -setting.screenshake.name = Balanço do Ecrã -setting.bloomintensity.name = Bloom Intensity + +setting.uiscale.name = Escala da IU[lightgray] (reinicío requerida)[] +setting.uiscale.description = Reinicío necessário para aplicar as alterações. +setting.swapdiagonal.name = Colocação Diagonal Sempre +setting.screenshake.name = Vibração do Ecrã +setting.bloomintensity.name = Intensidade do Bloom + setting.bloomblur.name = Bloom Blur setting.effects.name = Efeitos -setting.destroyedblocks.name = Mostrar Blocos Destruidos -setting.blockstatus.name = Display Block Status -setting.conveyorpathfinding.name = Localização do caminho do transportador -setting.sensitivity.name = Sensibilidade do Controle -setting.saveinterval.name = Intervalo de autogravamento -setting.seconds = {0} Segundos +setting.destroyedblocks.name = Mostrar Blocos Destruídos +setting.blockstatus.name = Mostrar Estado do Bloco +setting.conveyorpathfinding.name = Trajetória de Colocação de Tapetes Rolantes +setting.sensitivity.name = Sensibilidade dos Controlos +setting.saveinterval.name = Intervalo de auto-salvamento do jogo +setting.seconds = {0} segundos setting.milliseconds = {0} milissegundos -setting.fullscreen.name = Ecrã inteiro -setting.borderlesswindow.name = Janela sem borda[lightgray] (Pode precisar reiniciar) -setting.borderlesswindow.name.windows = Borderless Fullscreen -setting.borderlesswindow.description = Restart may be required to apply changes. -setting.fps.name = Mostrar FPS -setting.console.name = Enable Console -setting.smoothcamera.name = Smooth Camera -setting.vsync.name = VSync -setting.pixelate.name = Pixelizado [lightgray](Pode diminuir a performace) -setting.minimap.name = Mostrar minimapa -setting.coreitems.name = Display Core Items -setting.position.name = Show Player Position -setting.mouseposition.name = Show Mouse Position +setting.fullscreen.name = Ecrã Inteiro +setting.borderlesswindow.name = Janela sem Bordas +setting.borderlesswindow.name.windows = Ecrã sem Bordas +setting.borderlesswindow.description = Pode ser necessário reiniciar para aplicar as alterações. +setting.fps.name = Mostrar FPS e Ping +setting.console.name = Ativar Consola +setting.smoothcamera.name = Câmara Suave +setting.vsync.name = Sincronização Vertical (VSync) +setting.pixelate.name = Pixelização +setting.minimap.name = Mostrar Minimapa +setting.coreitems.name = Mostrar Itens do Núcleo +setting.position.name = Mostrar Posição do Jogador +setting.mouseposition.name = Mostrar Posição do Rato setting.musicvol.name = Volume da Música -setting.atmosphere.name = Show Planet Atmosphere -setting.drawlight.name = Draw Darkness/Lighting -setting.ambientvol.name = Volume do ambiente +setting.atmosphere.name = Mostrar Atmosfera do Planeta +setting.drawlight.name = Renderizar Iluminação/Escuro +setting.ambientvol.name = Volume do Ambiente setting.mutemusic.name = Desligar Música -setting.sfxvol.name = Volume de Efeitos +setting.sfxvol.name = Volume dos Efeitos setting.mutesound.name = Desligar Som -setting.crashreport.name = Enviar denuncias de crash anonimas -setting.communityservers.name = Fetch Community Server List -setting.savecreate.name = Criar gravamentos automaticamente +setting.crashreport.name = Enviar Relatórios de Crash Anónimos +setting.savecreate.name = Criar Gravações Automaticamente setting.steampublichost.name = Public Game Visibility setting.playerlimit.name = Limite de Jogadores -setting.chatopacity.name = Opacidade do chat -setting.lasersopacity.name = Opacidade do Power Laser -setting.unitlaseropacity.name = Unit Mining Beam Opacity -setting.bridgeopacity.name = Opacidade da Ponte -setting.playerchat.name = Mostrar chat em jogo -setting.showweather.name = Show Weather Graphics -setting.hidedisplays.name = Hide Logic Displays +setting.chatopacity.name = Opacidade do Chat +setting.lasersopacity.name = Opacidade do Poder do Laser +setting.bridgeopacity.name = Opacidade das Pontes +setting.playerchat.name = Mostrar Chat em Jogo +setting.showweather.name = Mostrar Gráficos do Clima +setting.hidedisplays.name = Ocultar Ecrãs Lógicos + setting.macnotch.name = Adaptar a interface para exibir o entalhe setting.macnotch.description = É necessário reiniciar para aplicar as alterações -steam.friendsonly = Friends Only -steam.friendsonly.tooltip = Whether only Steam friends will be able to join your game.\nUnchecking this box will make your game public - anyone can join. -public.beta = Observe que as versões beta do jogo não podem criar lobbies públicos. -uiscale.reset = A escala da IU foi mudada.\nPressione "OK" para confirmar esta escala.\n[scarlet]Revertendo e saindo em[accent] {0}[] settings... +steam.friendsonly = Amigos Apenas +steam.friendsonly.tooltip = Define se apenas amigos da Steam podem juntar-se ao teu jogo.\nDesativar esta opção fará o teu jogo público - qualquer um pode-se juntar ao teu mapa. +public.beta = Observa que as versões beta do jogo não podem criar lobbies públicos. +uiscale.reset = A escala da IU foi mudada.\nPressiona "OK" para confirmar esta escala.\n[scarlet]Revertendo e saindo em[accent] {0}[] segundos... uiscale.cancel = Cancelar e sair setting.bloom.name = Bloom -keybind.title = Refazer teclas -keybinds.mobile = [scarlet]A maior parte das teclas aqui não são funcionais em aparelhos móveis. Apenas movimento básico é suportado. +keybind.title = Revincular teclas +keybinds.mobile = [scarlet]A maior parte das teclas aqui não funcionam em dispositivos móveis. Apenas é suportado movimento básico. category.general.name = Geral category.view.name = Ver -category.command.name = Unit Command +category.command.name = Comando de Unidades category.multiplayer.name = Multijogador -category.blocks.name = Block Select -placement.blockselectkeys = \n[lightgray]Key: [{0}, -keybind.respawn.name = Respawn -keybind.control.name = Control Unit -keybind.clear_building.name = Limpar Edificio -keybind.press = Pressione uma tecla... -keybind.press.axis = Pressione uma Axis ou tecla... -keybind.screenshot.name = Captura do mapa -keybind.toggle_power_lines.name = Toggle Power Lasers -keybind.toggle_block_status.name = Toggle Block Statuses -keybind.move_x.name = mover_x -keybind.move_y.name = mover_y -keybind.mouse_move.name = Follow Mouse -keybind.pan.name = Pan View -keybind.boost.name = Boost -keybind.command_mode.name = Command Mode -keybind.command_queue.name = Unit Command Queue -keybind.create_control_group.name = Create Control Group -keybind.cancel_orders.name = Cancel Orders -keybind.unit_stance_shoot.name = Unit Stance: Shoot -keybind.unit_stance_hold_fire.name = Unit Stance: Hold Fire -keybind.unit_stance_pursue_target.name = Unit Stance: Pursue Target -keybind.unit_stance_patrol.name = Unit Stance: Patrol -keybind.unit_stance_ram.name = Unit Stance: Ram -keybind.unit_command_move.name = Unit Command: Move -keybind.unit_command_repair.name = Unit Command: Repair -keybind.unit_command_rebuild.name = Unit Command: Rebuild -keybind.unit_command_assist.name = Unit Command: Assist -keybind.unit_command_mine.name = Unit Command: Mine -keybind.unit_command_boost.name = Unit Command: Boost -keybind.unit_command_load_units.name = Unit Command: Load Units -keybind.unit_command_load_blocks.name = Unit Command: Load Blocks -keybind.unit_command_unload_payload.name = Unit Command: Unload Payload -keybind.unit_command_enter_payload.name = Unit Command: Enter Payload + +category.blocks.name = Selecionador de Blocos +placement.blockselectkeys = \n[lightgray]Tecla: [{0}, +keybind.respawn.name = Renascer +keybind.control.name = Controlar Unidade +keybind.clear_building.name = Limpar Construção +keybind.press = Prime uma tecla... +keybind.press.axis = Prime um eixo ou uma tecla... +keybind.screenshot.name = Captura de Ecrã do Mapa +keybind.toggle_power_lines.name = Ativar Lasers de Energia +keybind.toggle_block_status.name = Ativar Estado de Blocos +keybind.move_x.name = Mover no Eixo X +keybind.move_y.name = Mover no Eixo Y +keybind.mouse_move.name = Seguir Rato +keybind.pan.name = Vista Panorâmica +keybind.boost.name = Impulso +keybind.command_mode.name = Modo de Comando +keybind.command_queue.name = Fila de Comando de Unidades +keybind.create_control_group.name = Criar Grupo de Controlo +keybind.cancel_orders.name = Cancelar Pedidos + +keybind.unit_stance_shoot.name = Postura de Unidade: Disparar +keybind.unit_stance_hold_fire.name = Postura de Unidade: Não Disparar +keybind.unit_stance_pursue_target.name = Postura de Unidade: Perseguir Alvo +keybind.unit_stance_patrol.name = Postura de Unidade: Patrulha +keybind.unit_stance_ram.name = Postura de Unidade: Forçar +keybind.unit_command_move.name = Controlo de Unidade: Mover +keybind.unit_command_repair.name = Controlo de Unidade: Reparar +keybind.unit_command_rebuild.name = Controlo de Unidade: Reconstruir +keybind.unit_command_assist.name = Controlo de Unidade: Assistir +keybind.unit_command_mine.name = Controlo de Unidade: Minerar +keybind.unit_command_boost.name = Controlo de Unidade: Impulsionar +keybind.unit_command_load_units.name = Controlo de Unidade: Carregar Unidades +keybind.unit_command_load_blocks.name = Controlo de Unidade: Carregar Blocos +keybind.unit_command_unload_payload.name = Controlo de Unidade: Descarregar Carga +keybind.unit_command_enter_payload.name = Controlo de Unidade: Inserir Carga keybind.unit_command_loop_payload.name = Unit Command: Loop Unit Transfer -keybind.rebuild_select.name = Rebuild Region -keybind.schematic_select.name = Selecionar região -keybind.schematic_menu.name = Menu esquemático -keybind.schematic_flip_x.name = Rodar esquema X -keybind.schematic_flip_y.name = Rodar esquema Y -keybind.category_prev.name = Previous Category -keybind.category_next.name = Next Category -keybind.block_select_left.name = Block Select Left -keybind.block_select_right.name = Block Select Right -keybind.block_select_up.name = Block Select Up -keybind.block_select_down.name = Block Select Down -keybind.block_select_01.name = Category/Block Select 1 -keybind.block_select_02.name = Category/Block Select 2 -keybind.block_select_03.name = Category/Block Select 3 -keybind.block_select_04.name = Category/Block Select 4 -keybind.block_select_05.name = Category/Block Select 5 -keybind.block_select_06.name = Category/Block Select 6 -keybind.block_select_07.name = Category/Block Select 7 -keybind.block_select_08.name = Category/Block Select 8 -keybind.block_select_09.name = Category/Block Select 9 -keybind.block_select_10.name = Category/Block Select 10 -keybind.fullscreen.name = Alterar ecrã inteiro -keybind.select.name = Selecionar -keybind.diagonal_placement.name = Colocação diagonal -keybind.pick.name = Pegar bloco -keybind.break_block.name = Quebrar bloco -keybind.select_all_units.name = Select All Units -keybind.select_all_unit_factories.name = Select All Unit Factories -keybind.deselect.name = Deselecionar -keybind.pickupCargo.name = Pickup Cargo -keybind.dropCargo.name = Drop Cargo + +keybind.rebuild_select.name = Reconstruir Região +keybind.schematic_select.name = Selecionar Região +keybind.schematic_menu.name = Menu de Esquemas +keybind.schematic_flip_x.name = Rodar Esquema pelo eixo X +keybind.schematic_flip_y.name = Rodar Esquema pelo eixo Y +keybind.category_prev.name = Categoria Anterior +keybind.category_next.name = Próxima Categoria +keybind.block_select_left.name = Selecionar Bloco à Esquerda +keybind.block_select_right.name = Selecionar Bloco à Direita +keybind.block_select_up.name = Selecionar Bloco Acima +keybind.block_select_down.name = Seleconar Bloco Abaixo +keybind.block_select_01.name = Categoria/Seleção de Bloco 1 +keybind.block_select_02.name = Categoria/Seleção de Bloco 2 +keybind.block_select_03.name = Categoria/Seleção de Bloco 3 +keybind.block_select_04.name = Categoria/Seleção de Bloco 4 +keybind.block_select_05.name = Categoria/Seleção de Bloco 5 +keybind.block_select_06.name = Categoria/Seleção de Bloco 6 +keybind.block_select_07.name = Categoria/Seleção de Bloco 7 +keybind.block_select_08.name = Categoria/Seleção de Bloco 8 +keybind.block_select_09.name = Categoria/Seleção de Bloco 9 +keybind.block_select_10.name = Categoria/Seleção de Bloco 10 +keybind.fullscreen.name = Ativar/Desativar Ecrã Inteiro +keybind.select.name = Selecionar/Atirar +keybind.diagonal_placement.name = Colocação na Diagonal +keybind.pick.name = Pegar Bloco +keybind.break_block.name = Partir Bloco +keybind.select_all_units.name = Selecionar Todas as Unidades +keybind.select_all_unit_factories.name = Selecionar Todas as Fábricas +keybind.deselect.name = Desselecionar +keybind.pickupCargo.name = Pegar Carga +keybind.dropCargo.name = Largar Carga + keybind.shoot.name = Atirar keybind.zoom.name = Zoom keybind.menu.name = Menu keybind.pause.name = Pausar -keybind.pause_building.name = Pausar/Resumir construção +keybind.pause_building.name = Pausar/Resumir Construção keybind.minimap.name = Minimapa -keybind.planet_map.name = Planet Map -keybind.research.name = Research -keybind.block_info.name = Block Info -keybind.chat.name = Conversa -keybind.player_list.name = Lista_de_jogadores -keybind.console.name = console -keybind.rotate.name = Girar -keybind.rotateplaced.name = Rodar existente (Hold) -keybind.toggle_menus.name = Ativar menus -keybind.chat_history_prev.name = Histórico do chat anterior -keybind.chat_history_next.name = Histórico do proximo chat -keybind.chat_scroll.name = Rolar chat -keybind.chat_mode.name = Change Chat Mode -keybind.drop_unit.name = Soltar unidade -keybind.zoom_minimap.name = Zoom do minimapa +keybind.planet_map.name = Mapa do Planeta +keybind.research.name = Pesquisa +keybind.block_info.name = Informação do Bloco +keybind.chat.name = Chat +keybind.player_list.name = Lista de Jogadores +keybind.console.name = Consola +keybind.rotate.name = Rodar +keybind.rotateplaced.name = Rodar Existente (Manter) +keybind.toggle_menus.name = Ativar/Desativar Menus +keybind.chat_history_prev.name = Histórico do Chat Anterior +keybind.chat_history_next.name = Próximo Histórico do Chat +keybind.chat_scroll.name = Percorrer Chat +keybind.chat_mode.name = Mudar Modo de Chat +keybind.drop_unit.name = Largar Unidade +keybind.zoom_minimap.name = Zoom do Minimapa mode.help.title = Descrição dos mods -mode.survival.name = Sobrevivência -mode.survival.description = O modo normal. Recursos limitados e hordas automáticas. -mode.sandbox.name = Sandbox -mode.sandbox.description = Recursos infinitos e sem tempo para ataques. -mode.editor.name = Editor -mode.pvp.name = JXJ -mode.pvp.description = Lutar contra outros jogadores locais. -mode.attack.name = Ataque -mode.attack.description = Sem hordas, com o objetivo de destruir a base inimiga. -mode.custom = Regras personalizadas -rules.invaliddata = Invalid clipboard data. -rules.hidebannedblocks = Hide Banned Blocks -rules.infiniteresources = Recursos infinitos -rules.onlydepositcore = Only Allow Core Depositing -rules.derelictrepair = Allow Derelict Block Repair -rules.reactorexplosions = Reactor Explosions -rules.coreincinerates = Core Incinerates Overflow -rules.disableworldprocessors = Disable World Processors -rules.schematic = Schematics Allowed -rules.wavetimer = Tempo de horda -rules.wavesending = Wave Sending -rules.allowedit = Allow Editing Rules -rules.allowedit.info = When enabled, the player can edit rules in-game via the button in the bottom left corner of the Pause menu. -rules.alloweditworldprocessors = Allow Editing World Processors -rules.alloweditworldprocessors.info = When enabled, world logic blocks can be placed and edited even outside the editor. +mode.survival.name = Sobrevivência +mode.survival.description = O modo padrão. Recursos limitados e hordas automáticas. +mode.sandbox.name = Sandbox +mode.sandbox.description = Recursos infinitos e sem temporizador para ataques. +mode.editor.name = Editor +mode.pvp.name = PvP +mode.pvp.description = Luta contra outros jogadores locais.\n[gray]Necessita de pelo menos 2 núcleos de cores diferentes para jogar. +mode.attack.name = Ataque +mode.attack.description = Destrói a base inimiga.\n[gray]Requer um núcleo de cor vermelha no mapa para jogar. +mode.custom = Regras personalizadas + +rules.invaliddata = Dados na área de transferência Inválidos +rules.hidebannedblocks = Ocultar Blocos Banidos + +rules.infiniteresources = Recursos Infinitos +rules.onlydepositcore = Permitir Apenas Depósito no Núcleo +rules.derelictrepair = Permitir Reparação de Blocos Derelict +rules.reactorexplosions = Esploções de Reatores +rules.coreincinerates = Núcleo destrói Itens em Excesso +rules.disableworldprocessors = Desativar Processadores Globais +rules.schematic = Esquemas Permitidos +rules.wavetimer = Tempo de Horda +rules.wavesending = Envio de Hordas +rules.allowedit = Permitir Edição de Regras +rules.allowedit.info = Quando ativado, o jogador pode editar as regras em jogo através do botão no canto sup. esq. nop menu de Pausa. + rules.waves = Hordas -rules.airUseSpawns = Air units use spawn points -rules.attack = Modo de ataque -rules.buildai = Base Builder AI -rules.buildaitier = Builder AI Tier -rules.rtsai = RTS AI + +rules.airUseSpawns = Unidades Aéreas usam os Pontos de Spawn +rules.attack = Modo de Ataque +rules.buildai = Construtor de Base por IA +rules.buildaitier = Nível de Construtor IA +rules.rtsai = RTS AI [red](WIP) rules.rtsai.campaign = RTS Attack AI rules.rtsai.campaign.info = In attack maps, makes units group up and attack player bases in a more intelligent manner. -rules.rtsminsquadsize = Min Squad Size -rules.rtsmaxsquadsize = Max Squad Size -rules.rtsminattackweight = Min Attack Weight -rules.cleanupdeadteams = Clean Up Defeated Team Buildings (PvP) -rules.corecapture = Capture Core On Destruction -rules.polygoncoreprotection = Polygonal Core Protection -rules.placerangecheck = Placement Range Check -rules.enemyCheat = Recursos de IA Infinitos -rules.blockhealthmultiplier = Block Health Multiplier -rules.blockdamagemultiplier = Block Damage Multiplier -rules.unitbuildspeedmultiplier = Multiplicador de velocidade de criação de unidade -rules.unitcostmultiplier = Unit Cost Multiplier -rules.unithealthmultiplier = Multiplicador de vida de unidade -rules.unitdamagemultiplier = Multiplicador de dano de Unidade -rules.unitcrashdamagemultiplier = Unit Crash Damage Multiplier -rules.unitminespeedmultiplier = Unit Mine Speed Multiplier -rules.solarmultiplier = Solar Power Multiplier -rules.unitcapvariable = Cores Contribute To Unit Cap -rules.unitpayloadsexplode = Carried Payloads Explode With The Unit -rules.unitcap = Base Unit Cap -rules.limitarea = Limit Map Area -rules.enemycorebuildradius = Raio de "Não-criação" de core inimigo:[lightgray] (blocos) -rules.wavespacing = Espaço entre hordas:[lightgray] (seg) -rules.initialwavespacing = Initial Wave Spacing:[lightgray] (sec) -rules.buildcostmultiplier = Multiplicador de custo de construção -rules.buildspeedmultiplier = Multiplicador de velocidade de construção -rules.deconstructrefundmultiplier = Deconstruct Refund Multiplier -rules.waitForWaveToEnd = hordas esperam inimigos -rules.wavelimit = Map Ends After Wave -rules.dropzoneradius = Raio da zona de spawn:[lightgray] (blocos) -rules.unitammo = Units Require Ammo -rules.enemyteam = Enemy Team -rules.playerteam = Player Team +rules.rtsminsquadsize = Tamanho Mínimo de Esquadrão +rules.rtsmaxsquadsize = Tamanho Máximo de Esquadrão +rules.rtsminattackweight = Peso Mínimo de Ataque +rules.cleanupdeadteams = Limpar Construções Inimigas quando derrotadas (PvP) +rules.corecapture = Capturar Núcleo na Cestruição +rules.polygoncoreprotection = Proteção do Núcleo Poligonal +rules.placerangecheck = Verificação do intervalo de colocação +rules.enemyCheat = Recursos Infinitos para a Equipa Inimiga +rules.blockhealthmultiplier = Multiplicador de Vida do Bloco +rules.blockdamagemultiplier = Multiplicador de Dano do Bloco +rules.unitbuildspeedmultiplier = Multiplicador de Velocidade de Criação de Unidades +rules.unitcostmultiplier = Multiplicador de Custo de Unidades +rules.unithealthmultiplier = Multiplicador de Vida de Unidades +rules.unitdamagemultiplier = Multiplicador de Dano de Unidades +rules.unitcrashdamagemultiplier = Multiplicador de Dano de Unidades quando Destruídas. +rules.solarmultiplier = Multiplicador de Energia Solar +rules.unitcapvariable = Núcleos Contribuem para o Limite de Unidades +rules.unitpayloadsexplode = Cargas carregadas explodem junto com a Unidade +rules.unitcap = Limite básico de Unidades +rules.limitarea = Limitar Área do Mapa +rules.enemycorebuildradius = Raio de Proteção Contra Construções do Núcleo Inimigo :[lightgray] (blocos) +rules.wavespacing = Tempo entre Hordas:[lightgray] (seg.) +rules.initialwavespacing = Intervalo da Primeira Horda:[lightgray] (seg.) +rules.buildcostmultiplier = Multiplicador do Custo de Construção +rules.buildspeedmultiplier = Multiplicador do Velocidade de Construção +rules.deconstructrefundmultiplier = Multiplicador do Reemboso de Desconstrução +rules.waitForWaveToEnd = Hordas Esperam a Anterior Acabar +rules.wavelimit = Mapa Acaba após a Horda +rules.dropzoneradius = Raio da Zona de Spawn:[lightgray] (blocos) +rules.unitammo = UNidades Requerem Munição [red](pode ser removido) +rules.enemyteam = Equipa Inimiga +rules.playerteam = Equipa do jogador + rules.title.waves = Hordas rules.title.resourcesbuilding = Recursos e Construções rules.title.enemy = Inimigos rules.title.unit = Unidades rules.title.experimental = Experimental -rules.title.environment = Environment -rules.title.teams = Teams -rules.title.planet = Planet -rules.lighting = Lighting -rules.fog = Fog of War -rules.invasions = Enemy Sector Invasions -rules.legacylaunchpads = Legacy Launch Pad Mechanics -rules.legacylaunchpads.info = Allows using launch pads without landing pads, as in 7.0. -landingpad.legacy.disabled = [scarlet]\ue815 Disabled[lightgray] (Legacy Launch Pads enabled) -rules.showspawns = Show Enemy Spawns -rules.randomwaveai = Unpredictable Wave AI -rules.fire = Fire -rules.anyenv = -rules.explosions = Block/Unit Explosion Damage -rules.ambientlight = Ambient Light +rules.title.environment = Ambiente +rules.title.teams = Equipas +rules.title.planet = Planeta +rules.lighting = Iluminação +rules.fog = Névoa de guerra +rules.invasions = Invasões de Setores Inimigos +rules.showspawns = Mostrar Spawn de Inimigos +rules.randomwaveai = IA de hordas imprevisível +rules.fire = Fogo +rules.anyenv = +rules.explosions = Dano de Explosão a Bloco/Unidade +rules.ambientlight = Luz Ambiente + rules.weather = Weather -rules.weather.frequency = Frequency: -rules.weather.always = Always -rules.weather.duration = Duration: -rules.randomwaveai.info = Makes units spawned in waves target random structures instead of directly attacking the core or power generators. -rules.placerangecheck.info = Prevents players from placing anything near enemy buildings. When trying to place a turret, the range is increased, so the turret will not be able to reach the enemy. -rules.onlydepositcore.info = Prevents units from depositing items into any buildings except cores. +rules.weather.frequency = Frequência: +rules.weather.always = Sempre +rules.weather.duration = Duração: +rules.randomwaveai.info = As unidades spawnadas por hordas atacam estruturas aleatórias em vez atacarem diretamente o núcleo ou geradores de energia. +rules.placerangecheck.info = Previne os jogadores de colocarem qualquer coisa perto de construções inimigas. Ao tentar colocar uma torre, o raio é aumentado, por isso a torre não conseguirá alcançar o inimigo. +rules.onlydepositcore.info = Previne as unidades de depositarem itens em qualquer construção excepto núcleos. content.item.name = Itens -content.liquid.name = Liquidos +content.liquid.name = Líquidos content.unit.name = Unidades content.block.name = Blocos -content.status.name = Status Effects -content.sector.name = Sectors -content.team.name = Factions -wallore = (Wall) +content.status.name = Efeitos de Estado +content.sector.name = Setores +content.team.name = Equipas +wallore = (Muro) item.copper.name = Cobre item.lead.name = Chumbo @@ -1437,35 +1464,36 @@ item.titanium.name = Titânio item.thorium.name = Urânio item.silicon.name = Sílicio item.plastanium.name = Plastânio -item.phase-fabric.name = Tecido de fase -item.surge-alloy.name = Liga de surto -item.spore-pod.name = Cápsula de esporos +item.phase-fabric.name = Tecido de Fase +item.surge-alloy.name = Liga de Surto +item.spore-pod.name = Cápsula de Esporos item.sand.name = Areia -item.blast-compound.name = Composto de explosão +item.blast-compound.name = Composto de Explosão item.pyratite.name = Piratita item.metaglass.name = Metavidro item.scrap.name = Sucata -item.fissile-matter.name = Fissile Matter -item.beryllium.name = Beryllium -item.tungsten.name = Tungsten -item.oxide.name = Oxide +item.fissile-matter.name = Matéria Físsil +item.beryllium.name = Berílio +item.tungsten.name = Tungsténio +item.oxide.name = Óxido item.carbide.name = Carbide item.dormant-cyst.name = Dormant Cyst + liquid.water.name = Água liquid.slag.name = Escória liquid.oil.name = Petróleo -liquid.cryofluid.name = Crio Fluido -liquid.neoplasm.name = Neoplasm -liquid.arkycite.name = Arkycite -liquid.gallium.name = Gallium -liquid.ozone.name = Ozone -liquid.hydrogen.name = Hydrogen -liquid.nitrogen.name = Nitrogen -liquid.cyanogen.name = Cyanogen +liquid.cryofluid.name = Criofluido +liquid.neoplasm.name = Neoplasma +liquid.arkycite.name = Arquicite +liquid.gallium.name = Gálio +liquid.ozone.name = Ozono +liquid.hydrogen.name = Hidrogénio +liquid.nitrogen.name = Nitrogénio +liquid.cyanogen.name = Cianogénio unit.dagger.name = Dagger unit.mace.name = Mace -unit.fortress.name = Fortaleza +unit.fortress.name = Fortress unit.nova.name = Nova unit.pulsar.name = Pulsar unit.quasar.name = Quasar @@ -1520,105 +1548,105 @@ unit.evoke.name = Evoke unit.incite.name = Incite unit.emanate.name = Emanate unit.manifold.name = Manifold -unit.assembly-drone.name = Assembly Drone +unit.assembly-drone.name = Drone de Montagem unit.latum.name = Latum unit.renale.name = Renale block.parallax.name = Parallax block.cliff.name = Cliff -block.sand-boulder.name = Pedregulho de areia -block.basalt-boulder.name = Basalt Boulder -block.grass.name = Grama -block.molten-slag.name = Slag -block.pooled-cryofluid.name = Cryofluid -block.space.name = Space +block.sand-boulder.name = Pedregulho de Areia +block.basalt-boulder.name = Pedregulho de Basalto +block.grass.name = Relva +block.molten-slag.name = Escória +block.pooled-cryofluid.name = Criofluido +block.space.name = Espaço block.salt.name = Sal -block.salt-wall.name = Salt Wall +block.salt-wall.name = Parede de Sal block.pebbles.name = Pedrinhas block.tendrils.name = Gavinhas -block.sand-wall.name = Sand Wall -block.spore-pine.name = Pinheiro de esporo -block.spore-wall.name = Spore Wall -block.boulder.name = Boulder -block.snow-boulder.name = Snow Boulder -block.snow-pine.name = Pinheiro com neve +block.sand-wall.name = Parede de Areia +block.spore-pine.name = Pinheiro de Esporos +block.spore-wall.name = Parede de Esporos +block.boulder.name = Pedregulho +block.snow-boulder.name = Bola de Neve +block.snow-pine.name = Pinheiro com Neve block.shale.name = Xisto -block.shale-boulder.name = Pedra de xisto +block.shale-boulder.name = Pedra de Xisto block.moss.name = Musgo block.shrubs.name = Arbusto -block.spore-moss.name = Musgo de esporos -block.shale-wall.name = Shale Wall -block.scrap-wall.name = Muro de sucata -block.scrap-wall-large.name = Muro grande de sucata -block.scrap-wall-huge.name = Muro enorme de sucata -block.scrap-wall-gigantic.name = Muro gigante de sucata +block.spore-moss.name = Musgo de Esporos +block.shale-wall.name = Muro de Xisto +block.scrap-wall.name = Muro de Sucata +block.scrap-wall-large.name = Muro Grande de Sucata +block.scrap-wall-huge.name = Muro Enorme de Ducata +block.scrap-wall-gigantic.name = Muro Gigante de Sucata block.thruster.name = Propulsor -block.kiln.name = Forno para metavidro -block.graphite-press.name = Prensa de grafite +block.kiln.name = Forno para Metavidro +block.graphite-press.name = Prensa de Grafite block.multi-press.name = Multi-Prensa -block.constructing = {0}\n[lightgray](Construindo) -block.spawn.name = Spawn dos inimigos -block.remove-wall.name = Remove Wall -block.remove-ore.name = Remove Ore -block.core-shard.name = Fragmento do núcleo -block.core-foundation.name = Fundação do núcleo -block.core-nucleus.name = Núcleo do núcleo -block.deep-water.name = Água profunda +block.constructing = {0}\n[lightgray](A construir) +block.spawn.name = Spawn dos Inimigos +block.remove-wall.name = Remover Parede +block.remove-ore.name = Remover Minério +block.core-shard.name = Pedaço do Núcleo +block.core-foundation.name = Fundação do Núcleo +block.core-nucleus.name = Núcleo do Núcleo +block.deep-water.name = Águas Profundas block.shallow-water.name = Água -block.tainted-water.name = Água contaminada -block.deep-tainted-water.name = Deep Tainted Water -block.darksand-tainted-water.name = Água contaminada sobre areia escura -block.tar.name = Piche +block.tainted-water.name = Água Contaminada +block.deep-tainted-water.name = Água Contaminada Profunda +block.darksand-tainted-water.name = Água Contaminada sobre Areia Escura +block.tar.name = Alcatrão block.stone.name = Pedra block.sand-floor.name = Areia -block.darksand.name = Areia escura +block.darksand.name = Areia Escura block.ice.name = Gelo block.snow.name = Neve block.crater-stone.name = Crateras -block.sand-water.name = Água sobre areia -block.darksand-water.name = Água sobre areia escura +block.sand-water.name = Água sobre Areia +block.darksand-water.name = Água sobre Areia Escura block.char.name = Char block.dacite.name = Dacite -block.rhyolite.name = Rhyolite -block.dacite-wall.name = Dacite Wall -block.dacite-boulder.name = Dacite Boulder -block.ice-snow.name = Gelo de neve -block.stone-wall.name = Stone Wall -block.ice-wall.name = Ice Wall -block.snow-wall.name = Snow Wall -block.dune-wall.name = Dune Wall +block.rhyolite.name = Riolite +block.dacite-wall.name = Parede de Dacite +block.dacite-boulder.name = Pedreculho de Dacite +block.ice-snow.name = Gelo de Neve +block.stone-wall.name = Parede de Pedra +block.ice-wall.name = Parede de Gelo +block.snow-wall.name = Parede de Neve +block.dune-wall.name = Parede de Duna block.pine.name = Pinheiro -block.dirt.name = Dirt -block.dirt-wall.name = Dirt Wall -block.mud.name = Mud -block.white-tree-dead.name = Árvore branca morta -block.white-tree.name = Árvore branca -block.spore-cluster.name = Aglomerado de esporos -block.metal-floor.name = Chão de metal -block.metal-floor-2.name = Chão de metal 2 -block.metal-floor-3.name = Chão de metal 3 -block.metal-floor-4.name = Metal Floor 4 -block.metal-floor-5.name = Chão de metal 5 -block.metal-floor-damaged.name = Chão de metal danificado -block.dark-panel-1.name = Painel escuro 1 -block.dark-panel-2.name = Painel escuro 2 -block.dark-panel-3.name = Painel escuro 3 -block.dark-panel-4.name = Painel escuro 4 -block.dark-panel-5.name = Painel escuro 5 -block.dark-panel-6.name = Painel escuro 6 -block.dark-metal.name = Metal escuro -block.basalt.name = Basalt -block.hotrock.name = Rocha quente -block.magmarock.name = Rocha de magma +block.dirt.name = Terra +block.dirt-wall.name = Parede de Terra +block.mud.name = Lama +block.white-tree-dead.name = Árvore Branca Morta +block.white-tree.name = Árvore Branca +block.spore-cluster.name = Aglomerado de Esporos +block.metal-floor.name = Chão de Metal +block.metal-floor-2.name = Chão de Metal 2 +block.metal-floor-3.name = Chão de Metal 3 +block.metal-floor-4.name = Chão de Metal 4 +block.metal-floor-5.name = Chão de Metal 5 +block.metal-floor-damaged.name = Chão de Metal Danificado +block.dark-panel-1.name = Painel Escuro 1 +block.dark-panel-2.name = Painel Escuro 2 +block.dark-panel-3.name = Painel Escuro 3 +block.dark-panel-4.name = Painel Escuro 4 +block.dark-panel-5.name = Painel Escuro 5 +block.dark-panel-6.name = Painel Escuro 6 +block.dark-metal.name = Metal eEscuro +block.basalt.name = Basalto +block.hotrock.name = Rocha Quente +block.magmarock.name = Rocha de Magma block.copper-wall.name = Parede de Cobre -block.copper-wall-large.name = Parede de Cobre Grande -block.titanium-wall.name = Parede de titânio -block.titanium-wall-large.name = Parede de titânio grande -block.plastanium-wall.name = Plastanium Wall -block.plastanium-wall-large.name = Large Plastanium Wall -block.phase-wall.name = Parede de fase -block.phase-wall-large.name = Parde de fase grande -block.thorium-wall.name = Parede de tório -block.thorium-wall-large.name = Parede de tório grande +block.copper-wall-large.name = Parede Grande de Cobre +block.titanium-wall.name = Parede de Titânio +block.titanium-wall-large.name = Parede Grande de Titânio +block.plastanium-wall.name = Parede de Plastânio +block.plastanium-wall-large.name = Parede Grande de Plastânio +block.phase-wall.name = Parede de Fase +block.phase-wall-large.name = Parde Grande de Fase +block.thorium-wall.name = Parede de Tório +block.thorium-wall-large.name = Parede Grande de tório block.door.name = Porta block.door-large.name = Porta Grande block.duo.name = Dupla @@ -1626,40 +1654,40 @@ block.scorch.name = Queimada block.scatter.name = Dispersão block.hail.name = Granizo block.lancer.name = Lançador -block.conveyor.name = Esteira -block.titanium-conveyor.name = Esteira de Titânio -block.plastanium-conveyor.name = Plastanium Conveyor -block.armored-conveyor.name = Esteira Armadurada +block.conveyor.name = Tapete Rolante +block.titanium-conveyor.name = Tapete de Titânio +block.plastanium-conveyor.name = Tapete de Plastânio +block.armored-conveyor.name = Tapete Blindado block.junction.name = Junção block.router.name = Roteador block.distributor.name = Distribuidor block.sorter.name = Ordenador -block.inverted-sorter.name = Inverted Sorter +block.inverted-sorter.name = Ordenador Invertido block.message.name = Mensagem -block.reinforced-message.name = Reinforced Message -block.world-message.name = World Message -block.world-switch.name = World Switch -block.illuminator.name = Illuminator +block.reinforced-message.name = Mensagem Reforçada +block.world-message.name = Mensagem Global +block.world-switch.name = Interruptor Global +block.illuminator.name = Iluminador block.overflow-gate.name = Portão Sobrecarregado block.underflow-gate.name = Portão Desobrecarregado -block.silicon-smelter.name = Fundidora de silicio +block.silicon-smelter.name = Fundidora de Silício block.phase-weaver.name = Palheta de fase block.pulverizer.name = Pulverizador -block.cryofluid-mixer.name = Misturador de Crio Fluido -block.melter.name = Aparelho de fusão +block.cryofluid-mixer.name = Misturador de Criofluido +block.melter.name = Fundidor block.incinerator.name = Incinerador -block.spore-press.name = Prensa de Esporo +block.spore-press.name = Prensa de Esporos block.separator.name = Separador -block.coal-centrifuge.name = Centrifuga de carvão -block.power-node.name = Célula de energia -block.power-node-large.name = Célula de energia Grande -block.surge-tower.name = Torre de surto -block.diode.name = Battery Diode +block.coal-centrifuge.name = Centrifugadora de Carvão +block.power-node.name = Célula de Energia +block.power-node-large.name = Célula de Energia Grande +block.surge-tower.name = Torre de Surto +block.diode.name = Díodo de bateria block.battery.name = Bateria block.battery-large.name = Bateria Grande -block.combustion-generator.name = Gerador a combustão +block.combustion-generator.name = Gerador a Combustão block.steam-generator.name = Gerador de Turbina -block.differential-generator.name = Gerador diferencial +block.differential-generator.name = Gerador Diferencial block.impact-reactor.name = Reator De Impacto block.mechanical-drill.name = Broca Mecânica block.pneumatic-drill.name = Broca Pneumática @@ -1668,12 +1696,12 @@ block.water-extractor.name = Extrator de água block.cultivator.name = Cultivador block.conduit.name = Cano block.mechanical-pump.name = Bomba Mecânica -block.item-source.name = Criador de itens -block.item-void.name = Destruidor de itens -block.liquid-source.name = Criador de líquidos -block.liquid-void.name = Liquid Void -block.power-void.name = Anulador de energia -block.power-source.name = Criador de energia +block.item-source.name = Criador de Itens +block.item-void.name = Destruidor de Itens +block.liquid-source.name = Criador de Líquidos +block.liquid-void.name = Destruidor de Líquidos +block.power-void.name = Destruidor de Energia +block.power-source.name = Criador de Energia block.unloader.name = Descarregador block.vault.name = Cofre block.wave.name = Onda @@ -1681,82 +1709,83 @@ block.tsunami.name = Tsunami block.swarmer.name = Enxame block.salvo.name = Salvo block.ripple.name = Ondulação -block.phase-conveyor.name = Esteira de Fases -block.bridge-conveyor.name = Esteira-Ponte +block.phase-conveyor.name = Tapete de Fase +block.bridge-conveyor.name = Tapete-Ponte block.plastanium-compressor.name = Compressor de Plastânio block.pyratite-mixer.name = Misturador de Piratita block.blast-mixer.name = Misturador de Explosão block.solar-panel.name = Painel Solar block.solar-panel-large.name = Painel Solar Grande -block.oil-extractor.name = Extrator de petróleo -block.repair-point.name = Ponto de Reparo -block.repair-turret.name = Repair Turret +block.oil-extractor.name = Extrator de Petróleo +block.repair-point.name = Ponto de Reparação +block.repair-turret.name = Torre de Reparação block.pulse-conduit.name = Cano de Pulso -block.plated-conduit.name = Plated Conduit +block.plated-conduit.name = Cano Revestido block.phase-conduit.name = Cano de Fase block.liquid-router.name = Roteador de Líquido block.liquid-tank.name = Tanque de Líquido -block.liquid-container.name = Liquid Container +block.liquid-container.name = Contentor de Líquido block.liquid-junction.name = Junção de Líquido -block.bridge-conduit.name = Cano Ponte -block.rotary-pump.name = Bomba Rotatória +block.bridge-conduit.name = Cano-Ponte +block.rotary-pump.name = Bomba Rotativa block.thorium-reactor.name = Reator a Tório block.mass-driver.name = Drive de Massa block.blast-drill.name = Broca de Explosão -block.impulse-pump.name = Bomba térmica +block.impulse-pump.name = Bomba Térmica block.thermal-generator.name = Gerador Térmico block.surge-smelter.name = Fundidora de Liga block.mender.name = Reparador -block.mend-projector.name = Projetor de reparo -block.surge-wall.name = Parede de liga de surto -block.surge-wall-large.name = Parede de liga de surto grande +block.mend-projector.name = Projetor de Reparo +block.surge-wall.name = Parede de Liga de Surto +block.surge-wall-large.name = Parede Grande de Liga de Surto block.cyclone.name = Ciclone -block.fuse.name = Fundir +block.fuse.name = Fusível block.shock-mine.name = Mina de Choque -block.overdrive-projector.name = Projetor de sobrecarga -block.force-projector.name = Projetor de campo de força +block.overdrive-projector.name = Projetor de Sobrecarga +block.force-projector.name = Projetor de Campo de Força block.arc.name = Arco Elétrico block.rtg-generator.name = Gerador GTR -block.spectre.name = Espectro +block.spectre.name = Espetro block.meltdown.name = Fusão block.foreshadow.name = Foreshadow -block.container.name = Contâiner -block.launch-pad.name = Plataforma de lançamento -block.advanced-launch-pad.name = Launch Pad -block.landing-pad.name = Landing Pad +block.container.name = Contentor +block.launch-pad.name = Plataforma de Lançamento + block.segment.name = Segment -block.ground-factory.name = Ground Factory -block.air-factory.name = Air Factory -block.naval-factory.name = Naval Factory -block.additive-reconstructor.name = Additive Reconstructor -block.multiplicative-reconstructor.name = Multiplicative Reconstructor -block.exponential-reconstructor.name = Exponential Reconstructor -block.tetrative-reconstructor.name = Tetrative Reconstructor -block.payload-conveyor.name = Mass Conveyor -block.payload-router.name = Payload Router -block.duct.name = Duct -block.duct-router.name = Duct Router -block.duct-bridge.name = Duct Bridge +block.ground-factory.name = Fábrica Terrestre +block.air-factory.name = Fábrica Aérea +block.naval-factory.name = Fábrica Naval +block.additive-reconstructor.name = Reconstrutor Aditivo +block.multiplicative-reconstructor.name = Reconstrutor Multiplicador +block.exponential-reconstructor.name = Reconstrutor Exponencial +block.tetrative-reconstructor.name = Reconstrutor Tetrativo +block.payload-conveyor.name = Tapete de Carga +block.payload-router.name = Roteador de Carga +block.duct.name = Conduta +block.duct-router.name = Roteador de Conduta +block.duct-bridge.name = Ponte de Conduta block.large-payload-mass-driver.name = Large Payload Mass Driver -block.payload-void.name = Payload Void -block.payload-source.name = Payload Source -block.disassembler.name = Disassembler +block.payload-void.name = Destruidor de Carga +block.payload-source.name = Criador de Carga +block.disassembler.name = Desmontador block.silicon-crucible.name = Silicon Crucible -block.overdrive-dome.name = Overdrive Dome -block.interplanetary-accelerator.name = Interplanetary Accelerator -block.constructor.name = Constructor -block.constructor.description = Fabricates structures up to 2x2 tiles in size. -block.large-constructor.name = Large Constructor -block.large-constructor.description = Fabricates structures up to 4x4 tiles in size. -block.deconstructor.name = Deconstructor -block.deconstructor.description = Deconstructs structures and units. Returns 100% of build cost. -block.payload-loader.name = Payload Loader -block.payload-loader.description = Load liquids and items into blocks. -block.payload-unloader.name = Payload Unloader -block.payload-unloader.description = Unloads liquids and items from blocks. -block.heat-source.name = Heat Source -block.heat-source.description = A 1x1 block that gives virtualy infinite heat. -block.empty.name = Empty +block.overdrive-dome.name = Domo de Sobrecarga +block.interplanetary-accelerator.name = Acelerador Interplanetário +block.constructor.name = Construtor +block.constructor.description = Produz estruturas com tamanho até 2x2 blocos. +block.large-constructor.name = Construtor Grande +block.large-constructor.description = Produz estruturas com tamanho até 4x4 blocos. +block.deconstructor.name = Desconstrutor +block.deconstructor.description = Desconstrói estruturas e unidades. Recupera 100% do custo de produção. +block.payload-loader.name = Carregador de Carga +block.payload-loader.description = Carrega itens e líquidos em blocos. +block.payload-unloader.name = Descarregador de Carga +block.payload-unloader.description = Descarrega líquidos e itens de blocos. +block.heat-source.name = Fonte de Calor +block.heat-source.description = Um bloco de tamanho 1x1 que gera virtualmente calor infinito. +block.empty.name = Vazio + +#Erekir block.rhyolite-crater.name = Rhyolite Crater block.rough-rhyolite.name = Rough Rhyolite block.regolith.name = Regolith @@ -1781,7 +1810,7 @@ block.red-stone-vent.name = Red Stone Vent block.crystalline-vent.name = Crystalline Vent block.redmat.name = Redmat block.bluemat.name = Bluemat -block.core-zone.name = Core Zone +block.core-zone.name = Zona de Núcleo block.regolith-wall.name = Regolith Wall block.yellow-stone-wall.name = Yellow Stone Wall block.rhyolite-wall.name = Rhyolite Wall @@ -1811,71 +1840,71 @@ block.rhyolite-boulder.name = Rhyolite Boulder block.red-stone-boulder.name = Red Stone Boulder block.graphitic-wall.name = Graphitic Wall block.silicon-arc-furnace.name = Silicon Arc Furnace -block.electrolyzer.name = Electrolyzer -block.atmospheric-concentrator.name = Atmospheric Concentrator -block.oxidation-chamber.name = Oxidation Chamber -block.electric-heater.name = Electric Heater -block.slag-heater.name = Slag Heater -block.phase-heater.name = Phase Heater -block.heat-redirector.name = Heat Redirector -block.small-heat-redirector.name = Small Heat Redirector -block.heat-router.name = Heat Router -block.slag-incinerator.name = Slag Incinerator +block.electrolyzer.name = Electrolizador +block.atmospheric-concentrator.name = Concentrador Atmosférico +block.oxidation-chamber.name = Câmara de Oxidação +block.electric-heater.name = Aquecedor Elétrico +block.slag-heater.name = Aquededor de Escória +block.phase-heater.name = Aquecedor de Fase +block.heat-redirector.name = Redirecionador de Calor +block.small-heat-redirector.name = Redirecionador de Calor Pequeno +block.heat-router.name = Roteador de Calor +block.slag-incinerator.name = Incinerador de Escória block.carbide-crucible.name = Carbide Crucible -block.slag-centrifuge.name = Slag Centrifuge +block.slag-centrifuge.name = Centrifugador de Escória block.surge-crucible.name = Surge Crucible -block.cyanogen-synthesizer.name = Cyanogen Synthesizer -block.phase-synthesizer.name = Phase Synthesizer -block.heat-reactor.name = Heat Reactor -block.beryllium-wall.name = Beryllium Wall -block.beryllium-wall-large.name = Large Beryllium Wall -block.tungsten-wall.name = Tungsten Wall -block.tungsten-wall-large.name = Large Tungsten Wall +block.cyanogen-synthesizer.name = Sintetizador de Cianogénio +block.phase-synthesizer.name = Sintetizador de Fase +block.heat-reactor.name = Reator de Calor +block.beryllium-wall.name = Parede de Berílio +block.beryllium-wall-large.name = Parede Grande de Berílio +block.tungsten-wall.name = Parede de Tungsténio +block.tungsten-wall-large.name = Parede Grande de Tungsténio block.blast-door.name = Blast Door -block.carbide-wall.name = Carbide Wall -block.carbide-wall-large.name = Large Carbide Wall -block.reinforced-surge-wall.name = Reinforced Surge Wall -block.reinforced-surge-wall-large.name = Large Reinforced Surge Wall -block.shielded-wall.name = Shielded Wall +block.carbide-wall.name = Parede de Carbide +block.carbide-wall-large.name = Parede Grande de Carbide +block.reinforced-surge-wall.name = Parede de Surto Reforçadd +block.reinforced-surge-wall-large.name = Parede Grande de Surto Reforçado +block.shielded-wall.name = Parede Blindada block.radar.name = Radar -block.build-tower.name = Build Tower -block.regen-projector.name = Regen Projector -block.shockwave-tower.name = Shockwave Tower -block.shield-projector.name = Shield Projector -block.large-shield-projector.name = Large Shield Projector -block.armored-duct.name = Armored Duct -block.overflow-duct.name = Overflow Duct -block.underflow-duct.name = Underflow Duct -block.duct-unloader.name = Duct Unloader -block.surge-conveyor.name = Surge Conveyor -block.surge-router.name = Surge Router -block.unit-cargo-loader.name = Unit Cargo Loader -block.unit-cargo-unload-point.name = Unit Cargo Unload Point -block.reinforced-pump.name = Reinforced Pump -block.reinforced-conduit.name = Reinforced Conduit -block.reinforced-liquid-junction.name = Reinforced Liquid Junction -block.reinforced-bridge-conduit.name = Reinforced Bridge Conduit -block.reinforced-liquid-router.name = Reinforced Liquid Router -block.reinforced-liquid-container.name = Reinforced Liquid Container -block.reinforced-liquid-tank.name = Reinforced Liquid Tank -block.beam-node.name = Beam Node -block.beam-tower.name = Beam Tower -block.beam-link.name = Beam Link -block.turbine-condenser.name = Turbine Condenser -block.chemical-combustion-chamber.name = Chemical Combustion Chamber -block.pyrolysis-generator.name = Pyrolysis Generator -block.vent-condenser.name = Vent Condenser -block.cliff-crusher.name = Cliff Crusher -block.large-cliff-crusher.name = Advanced Cliff Crusher -block.plasma-bore.name = Plasma Bore -block.large-plasma-bore.name = Large Plasma Bore -block.impact-drill.name = Impact Drill -block.eruption-drill.name = Eruption Drill -block.core-bastion.name = Core Bastion -block.core-citadel.name = Core Citadel -block.core-acropolis.name = Core Acropolis -block.reinforced-container.name = Reinforced Container -block.reinforced-vault.name = Reinforced Vault +block.build-tower.name = Torre de Construção +block.regen-projector.name = Projetor de Regeneração +block.shockwave-tower.name = Torre de Ondas de Choque +block.shield-projector.name = Projetor de Escudo +block.large-shield-projector.name = Projetor de Escudo Grande +block.armored-duct.name = Conduta Blindada +block.overflow-duct.name = Conduta de Sobrecarga +block.underflow-duct.name = Conduta de Desobrecarga +block.duct-unloader.name = Descarregador de Conduta +block.surge-conveyor.name = Tapete de Surto +block.surge-router.name = Roteador de Surto +block.unit-cargo-loader.name = Carregador de Carga de Unidades +block.unit-cargo-unload-point.name = Ponto de Descarregamento de Carga de Unidades +block.reinforced-pump.name = Bomba Reforçada +block.reinforced-conduit.name = Conduta Reforçada +block.reinforced-liquid-junction.name = Junção de Líquido Reforçada +block.reinforced-bridge-conduit.name = Ponte de Conduta Reforçada +block.reinforced-liquid-router.name = Roteador de Líquido Reforçado +block.reinforced-liquid-container.name = Contentor de Líquido Reforçado +block.reinforced-liquid-tank.name = Tanque de Líquido Reforçado +block.beam-node.name = Nó de Feixe +block.beam-tower.name = Torre de Feixe +block.beam-link.name = Conector de Feixe +block.turbine-condenser.name = Condensador de Turbina +block.chemical-combustion-chamber.name = Câmara de Combustão Química +block.pyrolysis-generator.name = Gerador de Pirólise +block.vent-condenser.name = Condensador de Ventilação +block.cliff-crusher.name = Destruidor de Arribas +block.large-cliff-crusher.name = Destruidor de Arribas Grande +block.plasma-bore.name = Mineradora de Plasma +block.large-plasma-bore.name = Mineradora Grande de Plasma +block.impact-drill.name = Broca de Impacto +block.eruption-drill.name = Broca de Erupção +block.core-bastion.name = Bastião do Núcleo +block.core-citadel.name = Citadela do Núcleo +block.core-acropolis.name = Acrópole do Núcleo +block.reinforced-container.name = Contentor Reforçado +block.reinforced-vault.name = Cofre Reforçado block.breach.name = Breach block.sublimate.name = Sublimate block.titan.name = Titan @@ -1883,176 +1912,188 @@ block.disperse.name = Disperse block.afflict.name = Afflict block.lustre.name = Lustre block.scathe.name = Scathe -block.tank-refabricator.name = Tank Refabricator -block.mech-refabricator.name = Mech Refabricator -block.ship-refabricator.name = Ship Refabricator -block.tank-assembler.name = Tank Assembler -block.ship-assembler.name = Ship Assembler -block.mech-assembler.name = Mech Assembler -block.reinforced-payload-conveyor.name = Reinforced Payload Conveyor -block.reinforced-payload-router.name = Reinforced Payload Router +block.tank-refabricator.name = Refabricador de Tanque +block.mech-refabricator.name = Refabricador de Mech +block.ship-refabricator.name = Refabricador de Nave +block.tank-assembler.name = Montador de Tanque +block.ship-assembler.name = Montador de Nave +block.mech-assembler.name = Montador de Mech +block.reinforced-payload-conveyor.name = Tapete de Carga Reforçado +block.reinforced-payload-router.name = Roteador de Carga Reforçado block.payload-mass-driver.name = Payload Mass Driver -block.small-deconstructor.name = Small Deconstructor -block.canvas.name = Canvas -block.world-processor.name = World Processor -block.world-cell.name = World Cell -block.tank-fabricator.name = Tank Fabricator -block.mech-fabricator.name = Mech Fabricator -block.ship-fabricator.name = Ship Fabricator -block.prime-refabricator.name = Prime Refabricator -block.unit-repair-tower.name = Unit Repair Tower -block.diffuse.name = Diffuse -block.basic-assembler-module.name = Basic Assembler Module +block.small-deconstructor.name = Desconstrutor Pequeno +block.canvas.name = Tela +block.world-processor.name = Processador Global +block.world-cell.name = Célula Global +block.tank-fabricator.name = Fabricador de Tanque +block.mech-fabricator.name = Fabricador de Mech +block.ship-fabricator.name = Fabricador de Nave +block.prime-refabricator.name = Refabricador Princial +block.unit-repair-tower.name = Torre de Reparação de Unidades +block.diffuse.name = Difusor +block.basic-assembler-module.name = Módulo Básico de Montagem block.smite.name = Smite block.malign.name = Malign -block.flux-reactor.name = Flux Reactor -block.neoplasia-reactor.name = Neoplasia Reactor +block.flux-reactor.name = Reator de Fluxo +block.neoplasia-reactor.name = Reator de Neoplasma -block.switch.name = Switch -block.micro-processor.name = Micro Processor -block.logic-processor.name = Logic Processor -block.hyper-processor.name = Hyper Processor -block.logic-display.name = Logic Display -block.large-logic-display.name = Large Logic Display -block.memory-cell.name = Memory Cell -block.memory-bank.name = Memory Bank +block.switch.name = Interruptor +block.micro-processor.name = Microprocessador +block.logic-processor.name = Processador Lógico +block.hyper-processor.name = Hiper-processador +block.logic-display.name = Ecrã Lógico +block.large-logic-display.name = Ecrã Lógico Grande +block.memory-cell.name = Célula de Memória +block.memory-bank.name = Banco de Memória team.malis.name = Malis -team.crux.name = Vermelho -team.sharded.name = orange -team.derelict.name = derelict +team.crux.name = Vermelho (Crux) +team.sharded.name = Laranja (Sharded) +team.derelict.name = Derelict team.green.name = Verde - team.blue.name = Azul -hint.skip = Skip -hint.desktopMove = Use [accent][[WASD][] to move. -hint.zoom = [accent]Scroll[] to zoom in or out. -hint.desktopShoot = [accent][[Left-click][] to shoot. -hint.depositItems = To transfer items, drag from your ship to the core. -hint.respawn = To respawn as a ship, press [accent][[V][]. -hint.respawn.mobile = You have switched control to a unit/structure. To respawn as a ship, [accent]tap the avatar in the top left.[] -hint.desktopPause = Press [accent][[Space][] to pause and unpause the game. -hint.breaking = [accent]Right-click[] and drag to break blocks. -hint.breaking.mobile = Activate the \ue817 [accent]hammer[] in the bottom right and tap to break blocks.\n\nHold down your finger for a second and drag to break in a selection. -hint.blockInfo = View information of a block by selecting it in the [accent]build menu[], then selecting the [accent][[?][] button at the right. -hint.derelict = [accent]Derelict[] structures are broken remnants of old bases that no longer function.\n\nThese structures can be [accent]deconstructed[] for resources. + +hint.skip = Saltar +hint.desktopMove = Usa [accent][[WASD][] para mover. +hint.zoom = [accent]Scroll[] para aumentar/diminuir zoom. +hint.desktopShoot = [accent][[Botão esquerdo do rato][] para atirar. +hint.depositItems = Para transferir itens, arrasta da tua nave para o núcleo. +hint.respawn = Para renascer como nave, pressiona [accent][[V][]. +hint.respawn.mobile = Trocaste os controlos para uma unidade/estrutura. Para renascer como nave, [accent]toca no avatr no canto sup. esq.[] +hint.desktopPause = Pressiona [accent][[Espaço][] para pausar/retomar o jogo. +hint.breaking = Usa o [accent]botão direito do rato[] e arrasta. +hint.breaking.mobile = Ativa o \ue817 [accent]martelo[] em baixo à direita e clica para partir blocos.\n\nMantém o teu dedo permido por um seg. e arrasta para partir uma seleção. +hint.blockInfo = Vê as informações sobre um bloco ao selecioná-lo no [accent]menu de construção[], e depois selecionar o botão [accent][[?][] à direita. +hint.derelict = Estruturas [accent]Derelict[] são restos quebrados de bases antigas que já não funcionam.\n\nEssas estruturas podem ser [accent]desconstruídas[] para ganhar recursos. hint.research = Use the \ue875 [accent]Research[] button to research new technology. -hint.research.mobile = Use the \ue875 [accent]Research[] button in the \ue88c [accent]Menu[] to research new technology. -hint.unitControl = Hold [accent][[L-ctrl][] and [accent]click[] to control friendly units or turrets. -hint.unitControl.mobile = [accent][[Double-tap][] to control friendly units or turrets. -hint.unitSelectControl = To control units, enter [accent]command mode[] by holding [accent]L-shift.[]\nWhile in command mode, click and drag to select units. [accent]Right-click[] a location or target to command units there. -hint.unitSelectControl.mobile = To control units, enter [accent]command mode[] by pressing the [accent]command[] button in the bottom left.\nWhile in command mode, long-press and drag to select units. Tap a location or target to command units there. -hint.launch = Once enough resources are collected, you can [accent]Launch[] by selecting nearby sectors from the \ue827 [accent]Map[] in the bottom right. -hint.launch.mobile = Once enough resources are collected, you can [accent]Launch[] by selecting nearby sectors from the \ue827 [accent]Map[] in the \ue88c [accent]Menu[]. -hint.schematicSelect = Hold [accent][[F][] and drag to select blocks to copy and paste.\n\n[accent][[Middle Click][] to copy a single block type. -hint.rebuildSelect = Hold [accent][[B][] and drag to select destroyed block plans.\nThis will rebuild them automatically. -hint.rebuildSelect.mobile = Select the \ue874 copy button, then tap the \ue80f rebuild button and drag to select destroyed block plans.\nThis will rebuild them automatically. -hint.conveyorPathfind = Hold [accent][[L-Ctrl][] while dragging conveyors to automatically generate a path. -hint.conveyorPathfind.mobile = Enable \ue844 [accent]diagonal mode[] and drag conveyors to automatically generate a path. -hint.boost = Hold [accent][[L-Shift][] to fly over obstacles with your current unit.\n\nOnly a few ground units have boosters. -hint.payloadPickup = Press [accent][[[] to pick up small blocks or units. -hint.payloadPickup.mobile = [accent]Tap and hold[] a small block or unit to pick it up. -hint.payloadDrop = Press [accent]][] to drop a payload. -hint.payloadDrop.mobile = [accent]Tap and hold[] an empty location to drop a payload there. -hint.waveFire = [accent]Wave[] turrets with water as ammunition will automatically put out nearby fires. -hint.generator = \uf879 [accent]Combustion Generators[] burn coal and transmit power to adjacent blocks.\n\nPower transmission range can be extended with \uf87f [accent]Power Nodes[]. -hint.guardian = [accent]Guardian[] units are armored. Weak ammo such as [accent]Copper[] and [accent]Lead[] is [scarlet]not effective[].\n\nUse higher tier turrets or \uf835 [accent]Graphite[] \uf861Duo/\uf859Salvo ammunition to take Guardians down. -hint.coreUpgrade = Cores can be upgraded by [accent]placing higher-tier cores over them[].\n\nPlace a \uf868 [accent]Foundation[] core over the \uf869 [accent]Shard[] core. Make sure it is free from nearby obstructions. -hint.presetLaunch = Gray [accent]landing zone sectors[], such as [accent]Frozen Forest[], can be launched to from anywhere. They do not require capture of nearby territory.\n\n[accent]Numbered sectors[], such as this one, are [accent]optional[]. -hint.presetDifficulty = This sector has a [scarlet]high enemy threat level[].\nLaunching to such sectors is [accent]not recommended[] without proper technology and preparation. -hint.coreIncinerate = After the core is filled to capacity with an item, any extra items of that type it receives will be [accent]incinerated[]. -hint.factoryControl = To set a unit factory's [accent]output destination[], click a factory block while in command mode, then right-click a location.\nUnits produced by it will automatically move there. -hint.factoryControl.mobile = To set a unit factory's [accent]output destination[], tap a factory block while in command mode, then tap a location.\nUnits produced by it will automatically move there. -gz.mine = Move near the \uf8c4 [accent]copper ore[] on the ground and click to begin mining. -gz.mine.mobile = Move near the \uf8c4 [accent]copper ore[] on the ground and tap it to begin mining. -gz.research = Open the \ue875 tech tree.\nResearch the \uf870 [accent]Mechanical Drill[], then select it from the menu in the bottom right.\nClick on a copper patch to place it. -gz.research.mobile = Open the \ue875 tech tree.\nResearch the \uf870 [accent]Mechanical Drill[], then select it from the menu in the bottom right.\nTap on a copper patch to place it.\n\nPress the \ue800 [accent]checkmark[] at the bottom right to confirm. -gz.conveyors = Research and place \uf896 [accent]conveyors[] to move the mined resources\nfrom drills to the core.\n\nClick and drag to place multiple conveyors.\n[accent]Scroll[] to rotate. -gz.conveyors.mobile = Research and place \uf896 [accent]conveyors[] to move the mined resources\nfrom drills to the core.\n\nHold down your finger for a second and drag to place multiple conveyors. -gz.drills = Expand the mining operation.\nPlace more Mechanical Drills.\nMine 100 copper. -gz.lead = \uf837 [accent]Lead[] is another commonly used resource.\nSet up drills to mine lead. -gz.moveup = \ue804 Move up for further objectives. -gz.turrets = Research and place 2 \uf861 [accent]Duo[] turrets to defend the core.\nDuo turrets require \uf838 [accent]ammo[] from conveyors. -gz.duoammo = Supply the Duo turrets with [accent]copper[], using conveyors. -gz.walls = [accent]Walls[] can prevent oncoming damage from reaching buildings.\nPlace \uf8ae [accent]copper walls[] around the turrets. -gz.defend = Enemy incoming, prepare to defend. -gz.aa = Flying units cannot easily be dispatched with standard turrets.\n\uf860 [accent]Scatter[] turrets provide excellent anti-air, but require \uf837 [accent]lead[] as ammo. -gz.scatterammo = Supply the Scatter turret with [accent]lead[], using conveyors. -gz.supplyturret = [accent]Supply Turret -gz.zone1 = This is the enemy drop zone. -gz.zone2 = Anything built in the radius is destroyed when a wave starts. -gz.zone3 = A wave will begin now.\nGet ready. -gz.finish = Build more turrets, mine more resources,\nand defend against all the waves to [accent]capture the sector[]. -onset.mine = Click to mine \uf748 [accent]beryllium[] from walls.\n\nUse [accent][[WASD] to move. -onset.mine.mobile = Tap to mine \uf748 [accent]beryllium[] from walls. -onset.research = Open the \ue875 tech tree.\nResearch, then place a \uf73e [accent]turbine condenser[] on the vent.\nThis will generate [accent]power[]. -onset.bore = Research and place a \uf741 [accent]plasma bore[].\nThis automatically mines resources from walls. -onset.power = To [accent]power[] the plasma bore, research and place a \uf73d [accent]beam node[].\nConnect the turbine condenser to the plasma bore. -onset.ducts = Research and place \uf799 [accent]ducts[] to move the mined resources from the plasma bore to the core.\nClick and drag to place multiple ducts.\n[accent]Scroll[] to rotate. -onset.ducts.mobile = Research and place \uf799 [accent]ducts[] to move the mined resources from the plasma bore to the core.\n\nHold down your finger for a second and drag to place multiple ducts. -onset.moremine = Expand the mining operation.\nPlace more Plasma Bores and use beam nodes and ducts to support them.\nMine 200 beryllium. -onset.graphite = More complex blocks require \uf835 [accent]graphite[].\nSet up plasma bores to mine graphite. -onset.research2 = Begin researching [accent]factories[].\nResearch the \uf74d [accent]cliff crusher[] and \uf779 [accent]silicon arc furnace[]. -onset.arcfurnace = The arc furnace needs \uf834 [accent]sand[] and \uf835 [accent]graphite[] to create \uf82f [accent]silicon[].\n[accent]Power[] is also required. -onset.crusher = Use \uf74d [accent]cliff crushers[] to mine sand. -onset.fabricator = Use [accent]units[] to explore the map, defend buildings, and attack the enemy. Research and place a \uf6a2 [accent]tank fabricator[]. -onset.makeunit = Produce a unit.\nUse the "?" button to see selected factory requirements. -onset.turrets = Units are effective, but [accent]turrets[] provide better defensive capabilities if used effectively.\nPlace a \uf6eb [accent]Breach[] turret.\nTurrets require \uf748 [accent]ammo[]. -onset.turretammo = Supply the turret with [accent]beryllium ammo.[] -onset.walls = [accent]Walls[] can prevent oncoming damage from reaching buildings.\nPlace some \uf6ee [accent]beryllium walls[] around the turret. -onset.enemies = Enemy incoming, prepare to defend. +hint.research.mobile = Usa o botão de \ue875 [accent]Pesquisa[] para pesquisar novas tecnologias. +hint.unitControl = Segura a tecla [accent][[ctrl esq.][] e [accent]click[] para controlar unidades ou torres aliadas. +hint.unitControl.mobile = [accent][[Toca duas vezes][] para controlar unidades ou torres aliadas. +hint.unitSelectControl = Para controlar unidades, entra no [accent]modo de comando[] segurando [accent]Shift esquerdo.[]\nEnquanto no modo de comando, clica e segura pra selecionar unidades. Clica com o [accent]Botão direito[] nalgum lugar ou alvo para mandar as unidades para lá. +hint.unitSelectControl.mobile = Para controlar unidades, entra no [accent]modo de comando[] segurando o botão de [accent]comando[] no canto inf. esq.\nEnquanto no modo de comando, segura e arrasta pra selecionar unidades. Toque nalgum lugar ou alvo para mandar as unidades para lá. +hint.launch = Quando forem recolhidos recursos suficientes, podes [accent]Lançar[] ao selecionar setores próximos a partir do \ue827 [accent]Mapa[] no canto inferior direito. +hint.launch.mobile = Quando forem recolhidos recursos suficientes, podes [accent]Lançar[] ao selecionar setores próximos a partir do \ue827 [accent]Mapa[] no \ue88c [accent]Menu[]. +hint.schematicSelect = Segura a tecla [accent][[F][] e arrasta para selecionar blocos para copiar e colar.\n\n[accent][[Clique do meiro][] para copiar um bloco só. +hint.rebuildSelect = Segura a tecla [accent][[B][] e arrasta para selecionar blocos destruídos.\nIsto irá reconstruí-los automaticamente. +hint.rebuildSelect.mobile = Prime o \ue874 botão de copiar, e depois o botão de \ue80f reonstruir e arrasta para selecionar os planos de blocos destruídos.\nIsto irá reconstruí-los automaticamente. +hint.conveyorPathfind = Segura a tecla [accent][[Ctrl Esq][] enquanto desenhas os tapetes para gerar automaticamente um caminho. +hint.conveyorPathfind.mobile = Ativa o \ue844 [accent]modo diagonal[] e desenha os tapetes para gerar automaticamente um caminho. +hint.boost = Segura a tecla [accent][Shift Esq][] para voar sobre obstáculos com a tua unidade.\n\nApenas algumas unidades terrestres têm propulsores. +hint.payloadPickup = Prime [accent][[[] para pegar pequenos blocos e unidades. +hint.payloadPickup.mobile = [accent]Toca e segura[] para pegar pequenos blocos ou unidades. +#Translations beyond this point is pt_BR. When I'll have time I will rewrite them to pt_PT +hint.payloadDrop = Pressione [accent]][] para soltar a carga. +hint.payloadDrop.mobile = [accent]Toque e segure[] em um local vazio para soltar ali a carga. +hint.waveFire = Torretas [accent]Onda[] com munição de água vão apagar automaticamente incêndios próximos. +hint.generator = \uf879 [accent]Geradores a Combustão[] queimam carvão e transmitem energia aos blocos ao lado.\n\nO alcance da transmissão de energia pode ser aumentado com \uf87f [accent]Células de Energia[]. +hint.guardian = Unidades [accent]Guardião[] são blindadas. Munições fracas como [accent]Cobre[] e [accent]Chumbo[] são [scarlet]não efetivas[].\n\nUse torretas melhores ou \uf835 [accent]Grafite[] \uf861Duo/\uf859Salvo como munição para derrotar Guardiões. +hint.coreUpgrade = Núcleos podem ser melhorados [accent]colocando núcelos melhores sobre eles[].\n\nColoque uma \uf868 [accent]Fundação do Núcleo[] sobre o \uf869 [accent]Fragmento do Núcleo[]. Tenha certeza de que está livre de obstruções próximas. +hint.presetLaunch = [accent]Zona de setores[] cinzas, como a [accent]Floresta Congelada[], podem ser lançadas de qualquer lugar. Elas não precisam da captura de território próximo.\n\n[accent]Setores numerados[], como esse aqui, são [accent]opcionais[]. +hint.presetDifficulty = Esse setor tem um [scarlet]alto nível de ameaça inimiga[].\nIr para esse setores [accent]não é recomendado[] sem ter tecnologia e preparação adequadas. +hint.coreIncinerate = Depois que o núcleo ter recebido até a capacidade máxima de um item, qualquer item do mesmo tipo que ele receber será [accent]incinerado[]. +hint.factoryControl = Para definir a [accent]o local de saída[] de uma fábrica de unidades, clique em uma fábrica enquanto estiver no modo de comando, depois clique com o botão direito em um local.\nAs unidades produzidas por ela se moverão automaticamente para lá. +hint.factoryControl.mobile = Para definir a [accent]o local de saída[] de uma fábrica de unidades, toque em uma fábrica enquanto estiver no modo de comando, depois toque em um local.\nAs unidades produzidas por ela se moverão automaticamente para lá. + +gz.mine = Vá para perto do \uf8c4 [accent]minério de cobre[] no chão e clique para começar a minerar. +gz.mine.mobile = Vá para perto do \uf8c4 [accent]minério de cobre[] no chão e toque nele para começar a minerar. +gz.research = Abra a \ue875 árvore tecnológica.\nPesquise a \uf870 [accent]Broca mecânica[], Depois selecione-a pelo menu no canto inferior direito.\nClique no cobre para coloca-la. +gz.research.mobile = Abra a \ue875 árvore tecnológica.\nPesquise a \uf870 [accent]Broca mecânica[], Depois selecione-a pelo menu no canto inferior direito.\nClique no cobre para colocá-la.\n\nPressione a \ue800 [accent]confirmação[] no canto inferior direito para confirmar. +gz.conveyors = Pesquise e coloque \uf896 [accent]esteiras[] para mover os recursos minerados\ndas brocas para o núcleo.\n\nClique e arraste para pôr multiplas esteiras.\n[accent]Scroll[] para rotacionar. +gz.conveyors.mobile = Pesquise e coloque \uf896 [accent]esteiras[] para mover os recursos minerados\ndas brocas para o núcleo.\n\nSegure por um segundo e arraste para colocar múltiplas esteiras. +gz.drills = Expanda a mineração.\nColoque mais Brocas Mecânicas.\nMinere 100 cobres. +gz.lead = \uf837 [accent]Chumbo[] é outro recurso comumente usado.\nColoque brocas para minerar chumbo. +gz.moveup = \ue804 Vá para cima para outros objetivos. +gz.turrets = Pesquise e coloque 2 torretas \uf861 [accent]Duo[] para defender o núcleo.\ntorretas Duo requerem \uf838 [accent]munição[] de esteiras. +gz.duoammo = Abasteça as torretas Duo com [accent]cobre[], usando esteiras. +gz.walls = [accent]Muros[] podem previnir danos recebidos de atingir as construções.\nColoque \uf8ae [accent]muros de cobre[] em volta das torretas. +gz.defend = Inimigos vindo, prepare-se para defender. +gz.aa = Unidades flutuantes não podem ser destruidas facilmente por torretas comuns.\nTorretas\uf860 [accent]Scatter[] Proveem ótima defesa aérea, mas requerem \uf837 [accent]chumbo[] como munição. +gz.scatterammo = Abasteça a torreta Scatter com [accent]chumbo[], usando esteiras. +gz.supplyturret = [accent]Abasteça a torreta +gz.zone1 = Essa é a zona de spawn inimigo. +gz.zone2 = Qualquer coisa construida nesta área será destruida quando uma horda começar. +gz.zone3 = Uma horda vai começar agora\nSe prepare. +gz.finish = Construa mais torretas, minere mais recursos,\ne se defenda de todas as hordas para [accent]capturar o setor[]. + +onset.mine = Clique para minerar \uf748 [accent]berílio[] das paredes.\n\nUse [accent][[WASD] para se mover. +onset.mine.mobile = Toque para minerar \uf748 [accent]berílio[] das paredes. +onset.research = Abra a \ue875 árvore tecnológica.\nPesquise, e então coloque um \uf73e [accent]Condensador de Turbina[] na ventilação.\nIsso vai gerar [accent]energia[]. +onset.bore = Pesquise e coloque uma \uf741 [accent]Mineradora de Plasma[].\nEla minera recursos das paredes automaticamente. +onset.power = Para[accent]alimentar[] a Mineradora de Plasma, pesquise e coloque uma \uf73d [accent]Célula de Feixe[].\nConecte o condensador de turbina ao minerador de plasma. +onset.ducts = Pesquise e coloque \uf799 [accent]dutos[] para mover recursos minerados da mineradora de plasma para o núcleo.\nClique e segure para colocar múltiplos dutos.\n[accent]Scroll[] para rotacionar. +onset.ducts.mobile = Pesquise e coloque \uf799 [accent]dutos[] para mover recursos minerados da mineradora de plasma para o núcleo.\n\nSegure por um segundo e arraste para colocar múltiplos dutos. +onset.moremine = Expanda a mineração.\nColoque mais Mineradoras de Plasma, use as Células de Feixe e dutos para isso.\nMinere 200 berílios. +onset.graphite = Blocos mais complexos requerem \uf835 [accent]grafite[].\nColoque Mineradoras de Plasma para minerar grafite. +onset.research2 = Comece a pesquisar [accent]fábricas[].\nPesquise o \uf74d [accent]Esmagador de Penhasco[] e o \uf779 [accent]silicon arc furnace[]. +onset.arcfurnace = O arc furnace precisa de \uf834 [accent]areia[] e \uf835 [accent]grafite[] para criar \uf82f [accent]silício[].\n[accent]Energia[] também é necessária. +onset.crusher = Use o \uf74d [accent]Esmagador de Areia[] para minerar areia. +onset.fabricator = Use [accent]unidades[] para explorar o mapa, defender construções e atacar o inimigo. Pesquise e coloque um \uf6a2 [accent]Fabricador de Tanques[]. +onset.makeunit = Produza uma unidade.\nUse o botão "?" para ver os requisitos da fábrica selecionada. +onset.turrets = Unidades são efetivas, mas [accent]torretas[] proveem melhores capacidades defensivas se usadas efetivamente.\nColoque uma torreta \uf6eb [accent]Breach[].\nTorretas requerem \uf748 [accent]munição[]. +onset.turretammo = Abasteça a torreta com [accent]munição de berílio.[] +onset.walls = [accent]Muros[] podem previnir danos recebidos de atingir as construções.\nColoque \uf6ee [accent]muros de berílio[] em volta das torretas. +onset.enemies = Inimigo vindo, se prepare. onset.defenses = [accent]Set up defenses:[lightgray] {0} -onset.attack = The enemy is vulnerable. Counter-attack. -onset.cores = New cores can be placed on [accent]core tiles[].\nNew cores function as forward bases and share a resource inventory with other cores.\nPlace a \uf725 core. -onset.detect = The enemy will be able to detect you in 2 minutes.\nSet up defenses, mining, and production. +onset.attack = O inimigo está vulnerável. Contra ataque. +onset.cores = Novos núcleos podem ser colocados em [accent]ladrilhos de núcleo[].\nNovos núcleos funcionam como bases avançadas e compartilham seus recursos com outros núcleos.\nColoque um \uf725 núcleo. +onset.detect = O inimigo poderá te detectar em 2 minutos.\nConstrua defesas, mineração e produção. onset.commandmode = Hold [accent]shift[] to enter [accent]command mode[].\n[accent]Left-click and drag[] to select units.\n[accent]Right-click[] to order selected units to move or attack. onset.commandmode.mobile = Press the [accent]command button[] to enter [accent]command mode[].\nHold down a finger, then [accent]drag[] to select units.\n[accent]Tap[] to order selected units to move or attack. aegis.tungsten = Tungsten can be mined using an [accent]impact drill[].\nThis structure requires [accent]water[] and [accent]power[]. + split.pickup = Some blocks can be picked up by the core unit.\nPick up this [accent]container[] and place it onto the [accent]payload loader[].\n(Default keys are [ and ] to pick up and drop) split.pickup.mobile = Some blocks can be picked up by the core unit.\nPick up this [accent]container[] and place it onto the [accent]payload loader[].\n(To pick up or drop something, long-press it.) split.acquire = You must acquire some tungsten to build units. split.build = Units must be transported to the other side of the wall.\nPlace two [accent]Payload Mass Drivers[], one on each side of the wall.\nSet up the link by pressing one of them, then selecting the other. split.container = Similar to the container, units can also be transported using a [accent]Payload Mass Driver[].\nPlace a unit fabricator adjacent to a mass driver to load them, then send them across the wall to attack the enemy base. +#Serpulo item.copper.description = O material mais básico. Usado em todos os tipos de blocos. -item.copper.details = Copper. Abnormally abundant metal on Serpulo. Structurally weak unless reinforced. +item.copper.details = Cobre. Metal anormalmente abundante em Serpulo. Estruturalmente fraco a não ser que seja reforçado. item.lead.description = Material de começo basico. usado extensivamente em blocos de transporte de líquidos e eletrônicos. -item.lead.details = Dense. Inert. Extensively used in batteries.\nNote: Likely toxic to biological life forms. Not that there are many left here. +item.lead.details = Denso. Inerte. Extensivamente usado em baterias.\nObservação: Provavelmente tóxico para formas de vida biológica. Não que tenha muito restando aqui. item.metaglass.description = Composto de vidro super resistente. Extensivamente usado para distribuição e armazenagem de líquidos. item.graphite.description = Carbono mineralizado, usado como munição e para isolação elétrica. item.sand.description = Um material comum que é usado extensivamente em derretimento, tanto em ligas como em fluxo. item.coal.description = Matéria vegetal fossilizada, formada muito depois de semeada. Usado extensivamente para produção de combustível e recursos. -item.coal.details = Appears to be fossilized plant matter, formed long before the seeding event. +item.coal.details = Parece ser matéria vegetal fossilizada, formada muito antes do evento da semeadura. item.titanium.description = Um material raro super leve usado extensivamente no transporte de líquidos, em brocas e drones aéreos. item.thorium.description = Um metal denso e radioativo, Usado como suporte material e combustivel nuclear. item.scrap.description = Pedaços remanescentes de estruturas e unidades destruidas. Contem traços de diferentes metais. -item.scrap.details = Leftover remnants of old structures and units. +item.scrap.details = Pedaços restantes de estruturas e unidades destruidas. Contém traços de diferentes metais. item.silicon.description = Condutor extremamente importante, com aplicação em paineis solares e aparelhos complexos. item.plastanium.description = Material leve e maleável usado em drones aéreos avançados e como munição de fragmentação. item.phase-fabric.description = Uma substância quase sem peso usada em eletrônica avançada e tecnologia de auto-reparo. item.surge-alloy.description = Uma liga avançada com propriedades elétricas únicas. item.spore-pod.description = Uma cápsula de esporos sintéticos, sintetizada de concentrações atmosféricas para propósitos industriais. Usada para conversão em petróleo, explosivos e combustíveis. -item.spore-pod.details = Spores. Likely a synthetic life form. Emit gases toxic to other biological life. Extremely invasive. Highly flammable in certain conditions. +item.spore-pod.details = Esporos. Provavelmente uma forma de vida sintética. Emite gases tóxicos para outras formas de vida biológica. Extremamente invasivo. Altamente inflamável em certas condições. item.blast-compound.description = Um composto instável usado em bombas e em explosivos. Sintetizado de cápsulas de esporos e outras substâncias voláteis. Uso como combustível não é recomendado. item.pyratite.description = Substância extremamente inflamável usada em armas incendiárias. -item.beryllium.description = Used in many types of construction and ammunition on Erekir. -item.tungsten.description = Used in drills, armor and ammunition. Required in the construction of more advanced structures. -item.oxide.description = Used as a heat conductor and insulator for power. -item.carbide.description = Used in advanced structures, heavier units, and ammunition. + +#Erekir +item.beryllium.description = Usado em muitos tipos de construção e munição em Erekir. +item.tungsten.description = Utilizado em brocas, armaduras e munições. Necessário na construção de estruturas mais avançadas. +item.oxide.description = Utilizado como condutor de calor e isolante para energia. +item.carbide.description = Utilizado em estruturas avançadas, unidades mais pesadas e munições. + +#Serpulo liquid.water.description = O líquido mais útil, comumente usado em resfriamento de máquinas e no processamento de lixo. Dá pra beber, também. liquid.slag.description = Vários metais derretidos misturados juntos. Pode ser separado em seus minerais constituentes, ou jogado nas unidades inimigas como uma arma. liquid.oil.description = Um líquido usado na produção de materias avançados. Pode ser convertido em carvão como combustível, ou pulverizado e incendiado como arma. liquid.cryofluid.description = A maneira mais eficiente de resfriar qualquer coisa, até seu corpo quando está calor, mas não faça isto. -liquid.arkycite.description = Used in chemical reactions for power generation and material synthesis. -liquid.ozone.description = Used as an oxidizing agent in material production, and as fuel. Moderately explosive. -liquid.hydrogen.description = Used in resource extraction, unit production and structure repair. Flammable. -liquid.cyanogen.description = Used for ammunition, construction of advanced units, and various reactions in advanced blocks. Highly flammable. -liquid.nitrogen.description = Used in resource extraction, gas creation and unit production. Inert. -liquid.neoplasm.description = A dangerous biological byproduct of the Neoplasia reactor. Quickly spreads to any adjacent water-containing block it touches, damaging them in the process. Viscous. -liquid.neoplasm.details = Neoplasm. An uncontrollable mass of rapidly-dividing synthetic cells with a sludge-like consistency. Heat-resistant. Extremely dangerous to any structures involving water.\n\nToo complex and unstable for standard analysis. Potential applications unknown. Incineration in slag pools is recommended. + +#Erekir +liquid.arkycite.description = Utilizado em reações químicas para geração de energia e síntese de materiais. +liquid.ozone.description = Utilizado como agente oxidante na produção de material e como combustível. Moderadamente explosivo. +liquid.hydrogen.description = Utilizado na extração de recursos, produção de unidades e reparo de estruturas. Inflamável. +liquid.cyanogen.description = Utilizado para munição, construção de unidades avançadas e várias reações em blocos avançados. Altamente inflamável. +liquid.nitrogen.description = Utilizado na extração de recursos, criação de gás e produção de unidades. Inerte. +liquid.neoplasm.description = Um subproduto biológico perigoso do reator de Neoplasia. Espalha-se rapidamente para qualquer bloco adjacente contendo água que ele toque, danificando-os no processo. Viscoso. +liquid.neoplasm.details = Neoplasma. Uma massa incontrolável de células sintéticas de rápida divisão com uma consistência semelhante à de lama. Resistente ao calor. Extremamente perigoso para qualquer estrutura que envolva água.\n\nMuito complexo e instável para análise padrão. Potenciais aplicações desconhecidas. Recomenda-se a incineração em piscinas de escória. + +#Serpulo block.derelict = \uf77e [lightgray]Derelict block.armored-conveyor.description = Move os itens com a mesma velocidade das esteiras de titânio, mas tem mais armadura. Não aceita itens dos lados de nada além de outras esteiras. -block.illuminator.description = A small, compact, configurable light source. Requires power to function. - +block.illuminator.description = Uma fonte de luz pequena, configurável e compacta. Precisa de energia para funcionar. block.message.description = Armazena uma mensagem. Usado para comunicação entre aliados. block.reinforced-message.description = Stores a message for communication between allies. block.world-message.description = A message block for use in mapmaking. Cannot be destroyed. @@ -2077,15 +2118,15 @@ block.power-source.description = Infinitivamente da energia. Apenas caixa de are block.item-source.description = Infinivamente da itens. Apenas caixa de areia. block.item-void.description = Destroi qualquer item que entre sem requerir energia. Apenas caixa de areia. block.liquid-source.description = Infinitivamente da Liquidos. Apenas caixa de areia. -block.liquid-void.description = Removes any liquids. Sandbox only. -block.payload-source.description = Infinitely outputs payloads. Sandbox only. -block.payload-void.description = Destroys any payloads. Sandbox only. +block.liquid-void.description = Destrói qualquer líquido que entrar. Apenas no modo sandbox. +block.payload-source.description = Produz cargas infinitamete. Apenas sandbox. +block.payload-void.description = Destrói qualquer carga. Apenas. block.copper-wall.description = Um bloco defensivo e barato.\nUtil para proteger o núcleo e torretas no começo. block.copper-wall-large.description = Um bloco defensivo e barato.\nUtil para proteger o núcleo e torretas no começo.\nOcupa múltiplos blocos. block.titanium-wall.description = Um bloco defensivo moderadamente forte.\nProvidencia defesa moderada contra inimigos. block.titanium-wall-large.description = Um bloco defensivo moderadamente forte.\nProvidencia defesa moderada contra inimigos.\nOcupa múltiplos blocos. -block.plastanium-wall.description = A special type of wall that absorbs electric arcs and blocks automatic power node connections. -block.plastanium-wall-large.description = A special type of wall that absorbs electric arcs and blocks automatic power node connections.\nSpans multiple tiles. +block.plastanium-wall.description = Um tipo especial de muro que absorve arcos elétricos e bloqueia conexões automáticas de células de energia. +block.plastanium-wall-large.description = Um tipo especial de muro que absorve arcos elétricos e bloqueia conexões automáticas de células de energia.\nOcupa múltiplos blocos. block.thorium-wall.description = Um bloco defensivo forte.\nBoa proteção contra inimigos. block.thorium-wall-large.description = Um bloco grande e defensivo.\nBoa proteção contra inimigos.\nOcupa multiplos blocos. block.phase-wall.description = Um muro revestido com um composto especial baseado em tecido de fase. Desvia a maioria das balas no impacto. @@ -2105,14 +2146,14 @@ block.force-projector.description = Cria um campo de forca hexagonal em volta de block.shock-mine.description = Danifica inimigos em cima da mina. Quase invisivel ao inimigo. block.conveyor.description = Bloco de transporte de item basico. Move os itens a frente e os deposita automaticamente em torretas ou construtores. Rotacionavel. block.titanium-conveyor.description = Bloco de transporte de item avançado. Move itens mais rapidos que esteiras padrões. -block.plastanium-conveyor.description = Moves items in batches.\nAccepts items at the back, and unloads them in three directions at the front. +block.plastanium-conveyor.description = Transporta os itens para frente em lotes. Aceita itens na parte de trás, e os descarrega em três direções na frente. Requer múltiplos pontos de carga e descarga para o pico de produção. block.junction.description = Funciona como uma ponte Para duas esteiras que estejam se cruzando. Util em situações que tenha duas esteiras diferentes carregando materiais diferentes para lugares diferentes. block.bridge-conveyor.description = Bloco de transporte de itens avancado. Possibilita o transporte de itens acima de 3 blocos de construção ou paredes. block.phase-conveyor.description = Bloco de transporte de item avançado. Usa energia para teleportar itens a uma esteira de fase sobre uma severa distancia. -block.sorter.description = [interact]Aperte no bloco para configurar[] -block.inverted-sorter.description = Processes items like a standard sorter, but outputs selected items to the sides instead. +block.sorter.description = Se um item de entrada corresponde à seleção, ele passa para frente. Caso contrário, o item é enviado para a esquerda ou para a direita. +block.inverted-sorter.description = Semelhante a um ordenador padrão, mas os itens selecionados vão para os lados. block.router.description = Aceita itens de uma direção e os divide em 3 direções igualmente. Util para espalhar materiais da fonte para multiplos alvos. -block.router.details = A necessary evil. Using next to production inputs is not advised, as they will get clogged by output. +block.router.details = Um mal necessário. Usar próximo de entradas de produção não é recomendado, pois ele vai entupir a saída de itens. block.distributor.description = Um roteador avancada que espalhas os itens em 7 outras direções igualmente. block.overflow-gate.description = Uma combinação de roteador e divisor Que apenas manda para a esquerda e Direita se a frente estiver bloqueada. block.underflow-gate.description = O oposto de um portão de transbordamento. Saídas para a frente se os caminhos esquerdo e direito estiverem bloqueados. @@ -2122,9 +2163,9 @@ block.rotary-pump.description = Uma bomba avançada. Bombeia mais líquido, mas block.impulse-pump.description = A bomba final. block.conduit.description = Bloco básico de transporte de líquidos. Move líquidos para a frente. Usado em conjunto com bombas e outros canos. block.pulse-conduit.description = Bloco avancado de transporte de liquido. Transporta liquidos mais rápido e armazena mais que os canos padrões. -block.plated-conduit.description = Moves liquids at the same rate as pulse conduits, but possesses more armor. Does not accept fluids from the sides by anything other than conduits.\nLeaks less. +block.plated-conduit.description = Move líquidos na mesma velocidade que canos de pulso, mas possui blindagem. Não aceita entradas dos lados. Não vaza. block.liquid-router.description = Aceita liquidos de uma direcão e os joga em 3 direções igualmente. Pode armazenar uma certa quantidade de liquido. Util para espalhar liquidos de uma fonte para multiplos alvos. -block.liquid-container.description = Stores a sizeable amount of liquid. Outputs to all sides, similarly to a liquid router. +block.liquid-container.description = Armazena uma grande quantidade de líquido. Joga para todos os lados, de forma semelhante a um roteador de líquido. block.liquid-tank.description = Armazena grandes quantidades de liquido. Use quando a demanda de materiais não for constante ou para guardar itens para resfriar blocos vitais. block.liquid-junction.description = Age como uma ponte para dois canos que se cruzam. Útil em situações em que há dois cano carregando liquidos diferentes até localizações diferentes. block.bridge-conduit.description = Bloco de transporte de liquidos avancados. Possibilita o transporte de liquido sobre 3 blocos acima de construções ou paredes @@ -2132,39 +2173,38 @@ block.phase-conduit.description = Bloco avancado de transporte de liquido. Usa e block.power-node.description = Transmite energia para células conectadas. A célula vai receber energia ou alimentar qualquer bloco adjacente. block.power-node-large.description = Uma célula de energia avançada com maior alcance e mais conexões. block.surge-tower.description = Uma célula de energia com um extremo alcance mas com menos conexões disponíveis. -block.diode.description = Battery power can flow through this block in only one direction, but only if the other side has less power stored. +block.diode.description = Movimenta a energia da bateria em uma direção, mas somente se o outro lado tiver menos energia armazenada. block.battery.description = Armazena energia em tempos de energia excedente. Libera energia em tempos de déficit. block.battery-large.description = Guarda muito mais energia que uma beteria comum. block.combustion-generator.description = Gera energia usando combustível ou petróleo. block.thermal-generator.description = Gera uma quantidade grande de energia usando lava. block.steam-generator.description = Mais eficiente que o gerador de Combustão, Mas requer agua adicional. -block.differential-generator.description = Generates large amounts of energy. Utilizes the temperature difference between cryofluid and burning pyratite. +block.differential-generator.description = Gera grandes quantidades de energia. Utiliza a diferença de temperatura entre o criofluido e a piratita. block.rtg-generator.description = Um Gerador termoelétrico de radioisótopos Que não precisa de refriamento Mas da muito menos energia que o reator de torio. block.solar-panel.description = Gera pequenas quantidades de energia do sol. block.solar-panel-large.description = Da muito mais energia que o painel solar comum, Mas sua produção é mais cara. block.thorium-reactor.description = Gera altas quantidades de energia do torio radioativo. Requer resfriamento constante. Vai explodir violentamente Se resfriamento insuficiente for fornecido. -block.impact-reactor.description = An advanced generator, capable of creating massive amounts of power at peak efficiency. Requires a significant power input to kickstart the process. +block.impact-reactor.description = Um gerador avançado, capaz de criar quantidades enormes de energia em seu poder total. Requer uma entrada significativa de energia ao iniciar. block.mechanical-drill.description = Uma broca barata. Quando posto em blocos apropriados, retira itens em um ritmo lento e indefinitavamente. block.pneumatic-drill.description = Uma broca improvisada que é mais rápida e capaz de processar materiais mais duros usando a pressão do ar block.laser-drill.description = Possibilita a mineração ainda mais rapida usando tecnologia a laser, Mas requer poder adcionalmente torio radioativo pode ser recuperado com essa mineradora block.blast-drill.description = A melhor mineradora. Requer muita energia. block.water-extractor.description = Extrai água do chão. Use quando não tive nenhum lago proximo block.cultivator.description = Cultiva o solo com agua para pegar bio materia. -block.cultivator.details = Recovered technology. Used to produce massive amounts of biomass as efficiently as possible. Likely the initial incubator of the spores now covering Serpulo. +block.cultivator.details = Tecnologia recuperada. Costumava produzir quantidades massivas de biomassa o mais eficiente o possível. Provavelmente o primeiro incubador de esporos cobrindo Serpulo agora. block.oil-extractor.description = Usa altas quantidades de energia Para extrair oleo da areia. Use quando não tiver fontes de oleo por perto block.core-shard.description = Primeira iteração da cápsula do núcleo. Uma vez destruida, o controle da região inteira é perdido. Não deixe isso acontecer. -block.core-shard.details = The first iteration. Compact. Self-replicating. Equipped with single-use launch thrusters. Not designed for interplanetary travel. +block.core-shard.details = A primeira interação. Compacto. Auto-replicante. Equipado com propulsores de lançamento de uso único. Não projetado para viagens interplanetárias. block.core-foundation.description = A segunda versão do núcleo. Melhor armadura. Guarda mais recursos. -block.core-foundation.details = The second iteration. +block.core-foundation.details = A segunda versão. block.core-nucleus.description = A terceira e ultima iteração do núcleo. Extremamente bem armadurada. Guarda quantidades massivas de recursos. -block.core-nucleus.details = The third and final iteration. +block.core-nucleus.details = A terceira e última versão. block.vault.description = Carrega uma alta quantidade de itens. Usado para criar fontes Quando não tem uma necessidade constante de materiais. Um[lightgray] Descarregador[] pode ser usado para recuperar esses itens do container. block.container.description = Carrega uma baixa quantidade de itens. Usado para criar fontes Quando não tem uma necessidade constante de materiais. Um[lightgray] Descarregador[] pode ser usado para recuperar esses itens do container. block.unloader.description = Descarrega itens de um container, Descarrega em uma esteira ou diretamente em um bloco adjacente. O tipo de item que pode ser descarregado pode ser mudado clicando no descarregador. block.launch-pad.description = Lança montes de itens sem qualquer necessidade de um lançamento de núcleo. -block.advanced-launch-pad.description = Launches batches of items to selected sectors. Only accepts one item type at a time. -block.advanced-launch-pad.details = Sub-orbital system for point-to-point transportation of resources. -block.landing-pad.description = Receives items from launch pads in other sectors. Requires large amounts of water to protect against impacts of landings. +block.launch-pad.details = Sistema sub-orbital para transporte ponto-a-ponto de recursos. As cápsulas de carga são frágeis e incapazes de sobreviver à reentrada. + block.duo.description = Uma torre pequena e barata. block.scatter.description = Uma torre anti aerea media. Joga montes de cobre ou sucata aos inimigos. block.scorch.description = Queima qualquer inimigo terrestre próximo. Altamente efetivo a curta distncia. @@ -2179,228 +2219,232 @@ block.ripple.description = Uma grande torre que atira simultaneamente. block.cyclone.description = Uma grande torre de tiro rapido. block.spectre.description = Uma grande torre que da dois tiros poderosos ao mesmo tempo. block.meltdown.description = Uma grande torre que atira dois raios poderosos ao mesmo tempo. -block.foreshadow.description = Fires a large single-target bolt over long distances. Prioritizes enemies with higher max health. +block.foreshadow.description = Dispara um feixe gigante de único alvo a grandes distâncias. Prioriza inimigos com maior vida máxima. block.repair-point.description = Continuamente repara a unidade danificada mais proxima. -block.segment.description = Damages and destroys incoming projectiles. Laser projectiles are not targeted. -block.parallax.description = Fires a tractor beam that pulls in air targets, damaging them in the process. -block.tsunami.description = Fires powerful streams of liquid at enemies. Automatically extinguishes fires when supplied with water. -block.silicon-crucible.description = Refines silicon from sand and coal, using pyratite as an additional heat source. More efficient in hot locations. -block.disassembler.description = Separates slag into trace amounts of exotic mineral components at low efficiency. Can produce thorium. -block.overdrive-dome.description = Increases the speed of nearby buildings. Requires phase fabric and silicon to operate. -block.payload-conveyor.description = Moves large payloads, such as units from factories. -block.payload-router.description = Splits input payloads into 3 output directions. -block.ground-factory.description = Produces ground units. Output units can be used directly, or moved into reconstructors for upgrading. -block.air-factory.description = Produces air units. Output units can be used directly, or moved into reconstructors for upgrading. -block.naval-factory.description = Produces naval units. Output units can be used directly, or moved into reconstructors for upgrading. -block.additive-reconstructor.description = Upgrades inputted units to the second tier. -block.multiplicative-reconstructor.description = Upgrades inputted units to the third tier. -block.exponential-reconstructor.description = Upgrades inputted units to the fourth tier. -block.tetrative-reconstructor.description = Upgrades inputted units to the fifth and final tier. -block.switch.description = A toggleable switch. State can be read and controlled with logic processors. -block.micro-processor.description = Runs a sequence of logic instructions in a loop. Can be used to control units and buildings. -block.logic-processor.description = Runs a sequence of logic instructions in a loop. Can be used to control units and buildings. Faster than the micro processor. -block.hyper-processor.description = Runs a sequence of logic instructions in a loop. Can be used to control units and buildings. Faster than the logic processor. -block.memory-cell.description = Stores information for a logic processor. -block.memory-bank.description = Stores information for a logic processor. High capacity. -block.logic-display.description = Displays arbitrary graphics from a logic processor. -block.large-logic-display.description = Displays arbitrary graphics from a logic processor. -block.interplanetary-accelerator.description = A massive electromagnetic railgun tower. Accelerates cores to escape velocity for interplanetary deployment. -block.repair-turret.description = Continuously repairs the closest damaged unit in its vicinity. Optionally accepts coolant. -block.core-bastion.description = Core of the base. Armored. Once destroyed, the sector is lost. -block.core-citadel.description = Core of the base. Very well armored. Stores more resources than a Bastion core. -block.core-acropolis.description = Core of the base. Exceptionally well armored. Stores more resources than a Citadel core. -block.breach.description = Fires piercing beryllium or tungsten ammunition at enemy targets. -block.diffuse.description = Fires a burst of bullets in a wide cone. Pushes enemy targets back. -block.sublimate.description = Fires a continuous jet of flame at enemy targets. Pierces armor. -block.titan.description = Fires a massive explosive artillery shell at ground targets. Requires hydrogen. -block.afflict.description = Fires a massive charged orb of fragmentary flak. Requires heating. -block.disperse.description = Fires bursts of flak at aerial targets. -block.lustre.description = Fires a slow-moving single-target laser at enemy targets. -block.scathe.description = Launches a powerful missile at ground targets over vast distances. -block.smite.description = Fires bursts of piercing, lightning-emitting bullets. -block.malign.description = Fires a barrage of homing laser charges at enemy targets. Requires extensive heating. -block.silicon-arc-furnace.description = Refines silicon from sand and graphite. -block.oxidation-chamber.description = Converts beryllium and ozone into oxide. Emits heat as a by-product. -block.electric-heater.description = Heats facing blocks. Requires large amounts of power. -block.slag-heater.description = Heats facing blocks. Requires slag. -block.phase-heater.description = Heats facing blocks. Requires phase fabric. -block.heat-redirector.description = Redirects accumulated heat to other blocks. -block.small-heat-redirector.description = Redirects accumulated heat to other blocks. -block.heat-router.description = Spreads accumulated heat in three output directions. -block.electrolyzer.description = Converts water into hydrogen and ozone gas. -block.atmospheric-concentrator.description = Concentrates nitrogen from the atmosphere. Requires heat. -block.surge-crucible.description = Forms surge alloy from slag and silicon. Requires heat. -block.phase-synthesizer.description = Synthesizes phase fabric from thorium, sand, and ozone. Requires heat. -block.carbide-crucible.description = Fuses graphite and tungsten into carbide. Requires heat. -block.cyanogen-synthesizer.description = Synthesizes cyanogen from arkycite and graphite. Requires heat. -block.slag-incinerator.description = Incinerates non-volatile items or liquids. Requires slag. -block.vent-condenser.description = Condenses vent gases into water. Consumes power. -block.plasma-bore.description = When placed facing an ore wall, outputs items indefinitely. Requires small amounts of power. -block.large-plasma-bore.description = A larger plasma bore. Capable of mining tungsten and thorium. Requires hydrogen and power. -block.cliff-crusher.description = Crushes walls, outputting sand indefinitely. Requires power. Efficiency varies based on type of wall. -block.large-cliff-crusher.description = Crushes walls, outputting sand indefinitely. Requires power and ozone. Efficiency varies based on type of wall. Optionally consumes tungsten to increase efficiency. -block.impact-drill.description = When placed on ore, outputs items in bursts indefinitely. Requires power and water. -block.eruption-drill.description = An improved impact drill. Capable of mining thorium. Requires hydrogen. -block.reinforced-conduit.description = Moves fluids forward. Doesn't accept non-conduit inputs to the sides. -block.reinforced-liquid-router.description = Distributes fluids equally to all sides. -block.reinforced-liquid-tank.description = Stores a large amount of fluids. -block.reinforced-liquid-container.description = Stores a sizeable amount of fluids. -block.reinforced-bridge-conduit.description = Transports fluids over structures and terrain. -block.reinforced-pump.description = Pumps and outputs liquids. Requires hydrogen. -block.beryllium-wall.description = Protects structures from enemy projectiles. -block.beryllium-wall-large.description = Protects structures from enemy projectiles. -block.tungsten-wall.description = Protects structures from enemy projectiles. -block.tungsten-wall-large.description = Protects structures from enemy projectiles. -block.carbide-wall.description = Protects structures from enemy projectiles. -block.carbide-wall-large.description = Protects structures from enemy projectiles. -block.reinforced-surge-wall.description = Protects structures from enemy projectiles, periodically launching electric arcs upon projectile contact. -block.reinforced-surge-wall-large.description = Protects structures from enemy projectiles, periodically launching electric arcs upon projectile contact. -block.shielded-wall.description = Protects structures from enemy projectiles. Deploys a shield that absorbs most projectiles when power is provided. Conducts power. -block.blast-door.description = A wall that opens when allied ground units are in range. Cannot be manually controlled. -block.duct.description = Moves items forward. Only capable of storing a single item. -block.armored-duct.description = Moves items forward. Does not accept non-duct inputs from the sides. -block.duct-router.description = Distributes items equally across three directions. Only accepts items from the back side. Can be configured as an item sorter. -block.overflow-duct.description = Only outputs items to the sides if the front path is blocked. -block.duct-bridge.description = Moves items over structures and terrain. -block.duct-unloader.description = Unloads the selected item from the block behind it. Cannot unload from cores. -block.underflow-duct.description = Opposite of an overflow duct. Outputs to the front if the left and right paths are blocked. -block.reinforced-liquid-junction.description = Acts as a junction between two crossing conduits. -block.surge-conveyor.description = Moves items in batches. Can be sped up with power. Conducts power. -block.surge-router.description = Equally distributes items in three directions from surge conveyors. Can be sped up with power. Conducts power. -block.unit-cargo-loader.description = Constructs cargo drones. Drones automatically distribute items to Cargo Unload Points with a matching filter. -block.unit-cargo-unload-point.description = Acts as an unloading point for cargo drones. Accepts items that match the selected filter. -block.beam-node.description = Transmits power to other blocks orthogonally. Stores a small amount of power. -block.beam-tower.description = Transmits power to other blocks orthogonally. Stores a large amount of power. Long-range. -block.turbine-condenser.description = Generates power when placed on vents. Produces a small amount of water. -block.chemical-combustion-chamber.description = Generates power from arkycite and ozone. -block.pyrolysis-generator.description = Generates large amounts of power from arkycite and slag. Produces water as a byproduct. -block.flux-reactor.description = Generates large amounts of power when heated. Requires cyanogen as a stabilizer. Power output and cyanogen requirements are proportional to heat input.\nExplodes if insufficient cyanogen is provided. -block.neoplasia-reactor.description = Uses arkycite, water and phase fabric to generate large amounts of power. Produces heat and dangerous neoplasm as a byproduct.\nExplodes violently if neoplasm is not removed from the reactor via conduits. -block.build-tower.description = Automatically rebuilds structures in range and assists other units in construction. -block.regen-projector.description = Slowly repairs allied structures in a square perimeter. Requires hydrogen. -block.reinforced-container.description = Stores a small amount of items. Contents can be retrieved via unloaders. Does not increase core storage capacity. -block.reinforced-vault.description = Stores a large amount of items. Contents can be retrieved via unloaders. Does not increase core storage capacity. -block.tank-fabricator.description = Constructs Stell units. Outputted units can be used directly, or moved into refabricators for upgrading. -block.ship-fabricator.description = Constructs Elude units. Outputted units can be used directly, or moved into refabricators for upgrading. -block.mech-fabricator.description = Constructs Merui units. Outputted units can be used directly, or moved into refabricators for upgrading. -block.tank-assembler.description = Assembles large tanks out of inputted blocks and units. Output tier may be increased by adding modules. -block.ship-assembler.description = Assembles large ships out of inputted blocks and units. Output tier may be increased by adding modules. -block.mech-assembler.description = Assembles large mechs out of inputted blocks and units. Output tier may be increased by adding modules. -block.tank-refabricator.description = Upgrades inputted tank units to the second tier. -block.ship-refabricator.description = Upgrades inputted ship units to the second tier. -block.mech-refabricator.description = Upgrades inputted mech units to the second tier. -block.prime-refabricator.description = Upgrades inputted units to the third tier. -block.basic-assembler-module.description = Increases assembler tier when placed next to a construction boundary. Requires power. Can be used as a payload input. -block.small-deconstructor.description = Deconstructs inputted structures and units. Returns 100% of the build cost. -block.reinforced-payload-conveyor.description = Moves payloads forward. -block.reinforced-payload-router.description = Distributes payloads into adjacent blocks. Functions as a sorter when a filter is set. -block.payload-mass-driver.description = Long-range payload transport structure. Shoots received payloads to linked payload mass drivers. +block.segment.description = Destrói projéteis inimigos que se aproximam. Projéteis a laser não serão detectados. +block.parallax.description = Dispara um feixe de energia que puxa unidades aéreas, danificando-as no processo. +block.tsunami.description = Lança poderosos jatos de líquido em inimigos. Automaticamente apaga incêndios se for abastecido com água ou criofluido. +block.silicon-crucible.description = Refina silício com carvão e areia, usando piratita como uma fonte de calor adicional. Mais eficiente em locais quentes. +block.disassembler.description = Separa escória em traços de minerais componentes exóticos. Pode produzir tório. +block.overdrive-dome.description = Aumenta a velocidade de construções vizinhas. Requer tecido de fase e silício para operar. +block.payload-conveyor.description = Movimenta grandes cargas ,como unidades saindo das fábricas. +block.payload-router.description = Separa cargas recebidas em 3 direções de saída. +block.ground-factory.description = Produz unidades terrestres. Unidades produzidas podem ser usadas diretamente, ou movido em reconstrutores para melhorar. +block.air-factory.description = Produz unidades aéreas. Unidades produzidas podem ser usadas diretamente, ou movido em reconstrutores para melhorar. +block.naval-factory.description = Produz unidades navais. Unidades produzidas podem ser usadas diretamente, ou movido em reconstrutores para melhorar. +block.additive-reconstructor.description = Melhora unidades recebidas para o seu segundo nível. +block.multiplicative-reconstructor.description = Melhora unidades recebidas para o seu terceiro nível. +block.exponential-reconstructor.description = Melhora unidades recebidas para o seu quarto nível. +block.tetrative-reconstructor.description = Melhora unidades recebidas para o seu quinto e último nível. +block.switch.description = Uma alavanca alternável. O seu estado pode ser lido e controlado com processadores lógicos. +block.micro-processor.description = Executa uma sequência de instruções lógicas em um loop. Pode ser usado para controlar unidades e construções. +block.logic-processor.description = Executa uma sequência de instruções lógicas em um loop. Pode ser usado para controlar unidades e construções. Mais rápido que um micro processador. +block.hyper-processor.description = Executa uma sequência de instruções lógicas em um loop. Pode ser usado para controlar unidades e construções. Mais rápido que um processador lógico. +block.memory-cell.description = Guarda informações para um processador lógico. +block.memory-bank.description = Guarda informações para um processador lógico. Capacidade alta. +block.logic-display.description = Exibe gráficos arbitrários de um processador lógico. +block.large-logic-display.description = Exibe gráficos arbitrários de um processador lógico. +block.interplanetary-accelerator.description = Uma enorme torre eletromagnética. Acelera a velocidade de fuga dos núcleos para o desdobramento interplanetário. +block.repair-turret.description = Conserta continuamente a unidade danificada mais próxima a ela. Opcionalmente, aceita líquido refrigerante. + +#Erekir +block.core-bastion.description = O núcleo da base. Blindado. Uma vez destruído, o setor é perdido. +block.core-citadel.description = O núcleo da base. Muito bem blindado. Armazena mais recursos do que um Bastião do Núcleo. +block.core-acropolis.description = O núcleo da base. Excepcionalmente bem blindado. Armazena mais recursos do que a Cidadela do Núcleo. +block.breach.description = Dispara munições perfurantes de berílio ou tungstênio em alvos inimigos. +block.diffuse.description = Dispara balas em um cone largo. Empurra os alvos inimigos de volta. +block.sublimate.description = Dispara um jato contínuo de chamas sobre alvos inimigos. Penetra armadura. +block.titan.description = Dispara um enorme projétil de artilharia explosiva em alvos terrestres. Requer hidrogênio. +block.afflict.description = Dispara uma esfera maciça e carregada de fragmentos. Requer aquecimento. +block.disperse.description = Dispara projéteis em alvos aéreos. +block.lustre.description = Dispara um laser de movimento lento de alvo único em alvos inimigos. +block.scathe.description = Lança um poderoso míssil em alvos terrestres a grandes distâncias. +block.smite.description = Dispara balas perfurantes e emissoras de raios. +block.malign.description = Dispara uma barragem de cargas de laser teleguiadas em alvos inimigos. Exige aquecimento extensivo. +block.silicon-arc-furnace.description = Refina Silício a partir de areia e grafite. +block.oxidation-chamber.description = Converte Berílio e Ozono em Óxido. Emite calor como um subproduto. +block.electric-heater.description = Aquece blocos a frente. Requer grandes quantidades de energia. +block.slag-heater.description = Aquece blocos a frente. Requer Escória. +block.phase-heater.description = Aquece blocos a frente. Requer Tecido de Fase +block.heat-redirector.description = Redireciona o calor acumulado para outros blocos. +block.small-heat-redirector.description = Redireciona o calor acumulado para outros blocos. +block.heat-router.description = Espalha o calor acumulado em 3 direções. +block.electrolyzer.description = Converte Água em Hidrogénio e gás de Ozono. +block.atmospheric-concentrator.description = Concentra o Nitrogénio da atmosfera. Requer calor. +block.surge-crucible.description = Forma Liga de Surto a partir de Escória e Silício. Requer calor. +block.phase-synthesizer.description = Sintetiza Tecido de Fase a partir do Tório, Areia e Ozono. Requer calor. +block.carbide-crucible.description = Funde Grafite e Tungsténio em Carboneto. Requer calor. +block.cyanogen-synthesizer.description = Sintetiza Cianogénio a partir de Arkycite e Grafite. Requer calor. +block.slag-incinerator.description = Incinera itens ou líquidos não voláteis. Requer escória. +block.vent-condenser.description = Condensa os gases de ventilação em água. Consome energia. +block.plasma-bore.description = Quando colocado de frente para uma parede de minério, produz itens por tempo indeterminado. Requer pequenas quantidades de energia. +block.large-plasma-bore.description = Uma Broca de Plasma maior. Capaz de extrair tungsténio e tório. Requer hidrogénio e energia. +block.cliff-crusher.description = Esmaga as paredes, produzindo areia indefinidamente. Requer energia. A eficiência varia de acordo com o tipo de parede. +block.impact-drill.description = Quando colocados sobre minério, os itens saem em rajadas indefinidamente. Requer energia e água. +block.eruption-drill.description = Uma Broca de Impacto melhorada. Capaz de minerar Tório. Requer Hidrogénio. +block.reinforced-conduit.description = Movimenta fluidos para frente. Não aceita entradas de outros blocos, a não ser canos, dos lados. +block.reinforced-liquid-router.description = Distribui fluidos igualmente para todos os lados. +block.reinforced-liquid-tank.description = Armazena uma grande quantidade de fluidos. +block.reinforced-liquid-container.description = Armazena uma quantidade considerável de fluidos. +block.reinforced-bridge-conduit.description = Transporta fluidos sobre estruturas e terrenos. +block.reinforced-pump.description = Bombeia e produz líquidos. Requer hidrogênio. +block.beryllium-wall.description = Protege estruturas contra projéteis inimigos. +block.beryllium-wall-large.description = Protege estruturas contra projéteis inimigos. +block.tungsten-wall.description = Protege estruturas contra projéteis inimigos. +block.tungsten-wall-large.description = Protege estruturas contra projéteis inimigos. +block.carbide-wall.description = Protege estruturas contra projéteis inimigos. +block.carbide-wall-large.description = Protege estruturas contra projéteis inimigos. +block.reinforced-surge-wall.description = Protege estruturas contra projéteis inimigos, lançando periodicamente arcos elétricos em contato com o projétil. +block.reinforced-surge-wall-large.description = Protege estruturas contra projéteis inimigos, lançando periodicamente arcos elétricos em contato com o projétil. +block.shielded-wall.description = Protege estruturas contra projéteis inimigos. Implanta um escudo que absorve a maioria dos projéteis quando energia é fornecida. Conduz energia. +block.blast-door.description = Uma parede que se abre quando as unidades terrestres aliadas estão no alcance. Não pode ser controlada manualmente. +block.duct.description = Move itens para frente. Só é capaz de armazenar um único item. +block.armored-duct.description = Move itens para frente. Não aceita entradas de blocos não-dutos dos lados. +block.duct-router.description = Distribui os itens igualmente em três direções. Aceita somente itens pela parte de trás. Pode ser configurado como um ordenador de itens. +block.overflow-duct.description = Só libera itens para os lados se a frente estiver bloqueada. +block.duct-bridge.description = Move itens sobre estruturas e terrenos. +block.duct-unloader.description = Descarrega o item selecionado do bloco atrás dele. Não pode descarregar do núcleo. +block.underflow-duct.description = O contrário de um duto de sobrecarga. Libera itens para a frente se os caminhos esquerdo e direito estiverem bloqueados. +block.reinforced-liquid-junction.description = Atua como uma junção entre dois canos se cruzando. +block.surge-conveyor.description = Move itens em lotes. Pode ser acelerado com energia. Conduz energia. +block.surge-router.description = Distribui igualmente os itens em três direções a partir de Esteiras de Liga de Surto. Podem ser acelerados com energia. Conduz energia. +block.unit-cargo-loader.description = Constrói drones de carga. Os drones distribuem automaticamente os itens aos pontos de descarga de carga com um filtro correspondente. +block.unit-cargo-unload-point.description = Atua como um ponto de descarga de drones de carga. Aceita itens que combinam com o filtro selecionado. +block.beam-node.description = Transmite energia para outros blocos ortogonalmente. Armazena uma pequena quantidade de energia. +block.beam-tower.description = Transmite energia para outros blocos ortogonalmente. Armazena uma grande quantidade de energia. Longo alcance. +block.turbine-condenser.description = Gera energia quando colocado em ventilações. Produz uma pequena quantidade de água. +block.chemical-combustion-chamber.description = Gera energia a partir de arkycite e ozônio. +block.pyrolysis-generator.description = Gera grandes quantidades de energia a partir de arkycite e escória. Produz água como subproduto. +block.flux-reactor.description = Gera grandes quantidades de energia quando aquecido. Requer cianogênio como estabilizador. A saída de energia e os requisitos de cianogênio são proporcionais à entrada de calor.\nExplode se o cianogênio for insuficiente. +block.neoplasia-reactor.description = Utiliza arkycite, água e tecido de fase para gerar grandes quantidades de energia. Produz calor e neoplasma perigoso como subproduto.\nExplode violentamente se o neoplasma não for removido do reator através de canos. +block.build-tower.description = Reconstrói automaticamente estruturas em alcance e auxilia outras unidades na construção. +block.regen-projector.description = Lentamente repara estruturas aliadas em um perímetro quadrado. Requer hidrogênio. +block.reinforced-container.description = Armazena uma pequena quantidade de itens. O conteúdo pode ser recuperado através de descarregadores. Não aumenta a capacidade de armazenamento do núcleo. +block.reinforced-vault.description = Armazena uma grande quantidade de itens. O conteúdo pode ser recuperado através de descarregadores. Não aumenta a capacidade de armazenamento do núcleo. +block.tank-fabricator.description = Constrói unidades Stell. As unidades produzidas podem ser usadas diretamente, ou movidas para refabricadores para atualização. +block.ship-fabricator.description = Constrói unidades Elude. As unidades produzidas podem ser usadas diretamente, ou movidas para refabricadores para atualização. +block.mech-fabricator.description = Constrói unidades Merui. As unidades produzidas podem ser usadas diretamente, ou movidas para refabricadores para atualização. +block.tank-assembler.description = Monta grandes tanques a partir dos blocos e unidades inseridos. O tier pode ser aumentado com a adição de módulos. +block.ship-assembler.description = Monta grandes naves a partir de blocos e unidades inseridos. O tier pode ser aumentado com a adição de módulos. +block.mech-assembler.description = Monta grandes mechs a partir de blocos e unidades inseridos. O tier pode ser aumentado com a adição de módulos. +block.tank-refabricator.description = Atualiza as unidades tanques inseridas para o segundo tier. +block.ship-refabricator.description = Atualiza as unidades naves inseridas para o segundo tier. +block.mech-refabricator.description = Atualiza as unidades mech inseridas para o segundo tier. +block.prime-refabricator.description = Atualiza as unidades inseridas para o terceiro tier. +block.basic-assembler-module.description = Aumenta o tier do montador quando colocado próximo a um limite de construção. Requer energia. Pode ser usado como entrada de carga. +block.small-deconstructor.description = Desconstrói as estruturas e unidades inseridos. Devolve 100% do custo de construção. +block.reinforced-payload-conveyor.description = Movimenta cargas para frente. +block.reinforced-payload-router.description = Distribui cargas em blocos adjacentes. Funciona como um ordenador quando um filtro é configurado. +block.payload-mass-driver.description = = Estrutura de transporte de carga útil de longo alcance. Atira cargas recebidas para Catapultas de Carga Eletromagnéticas conectadas. block.large-payload-mass-driver.description = Long-range payload transport structure. Shoots received payloads to linked payload mass drivers. -block.unit-repair-tower.description = Repairs all units in its vicinity. Requires ozone. -block.radar.description = Gradually uncovers terrain and enemy units in a large radius. Requires power. -block.shockwave-tower.description = Damages and destroys enemy projectiles in a radius. Requires cyanogen. +block.unit-repair-tower.description = Repara todas as unidades em sua proximidade. Requer ozônio. +block.radar.description = Gradualmente descobre o terreno e as unidades inimigas em um grande raio. Requer energia. +block.shockwave-tower.description = Danifica e destrói projéteis inimigos em um raio. Requer cianogênio. block.canvas.description = Displays a simple image with a pre-defined palette. Editable. -unit.dagger.description = Fires standard bullets at all nearby enemies. -unit.mace.description = Fires streams of flame at all nearby enemies. -unit.fortress.description = Fires long-range artillery at ground targets. -unit.scepter.description = Fires a barrage of charged bullets at all nearby enemies. -unit.reign.description = Fires a barrage of massive piercing bullets at all nearby enemies. -unit.nova.description = Fires laser bolts that damage enemies and repair allied structures. Capable of flight. -unit.pulsar.description = Fires arcs of electricity that damage enemies and repair allied structures. Capable of flight. -unit.quasar.description = Fires piercing laser beams that damage enemies and repair allied structures. Capable of flight. Shielded. -unit.vela.description = Fires a massive continuous laser beam that damages enemies, causes fires and repairs allied structures. Capable of flight. -unit.corvus.description = Fires a massive laser blast that damages enemies and repairs allied structures. Can step over most terrain. -unit.crawler.description = Runs toward enemies and self-destructs, causing a large explosion. -unit.atrax.description = Fires debilitating orbs of slag at ground targets. Can step over most terrain. -unit.spiroct.description = Fires sapping laser beams at enemies, repairing itself in the process. Can step over most terrain. -unit.arkyid.description = Fires large sapping laser beams at enemies, repairing itself in the process. Can step over most terrain. -unit.toxopid.description = Fires large electric cluster-shells and piercing lasers at enemies. Can step over most terrain. -unit.flare.description = Fires standard bullets at nearby ground targets. -unit.horizon.description = Drops clusters of bombs on ground targets. -unit.zenith.description = Fires salvos of missiles at all nearby enemies. -unit.antumbra.description = Fires a barrage of bullets at all nearby enemies. -unit.eclipse.description = Fires two piercing lasers and a barrage of flak at all nearby enemies. -unit.mono.description = Automatically mines copper and lead, depositing it into the core. -unit.poly.description = Automatically rebuilds destroyed structures and assists other units in construction. -unit.mega.description = Automatically repairs damaged structures. Capable of carrying blocks and small ground units. -unit.quad.description = Drops large bombs on ground targets, repairing allied structures and damaging enemies. Capable of carrying medium-sized ground units. -unit.oct.description = Protects nearby allies with its regenerating shield. Capable of carrying most ground units. -unit.risso.description = Fires a barrage of missiles and bullets at all nearby enemies. -unit.minke.description = Fires shells and standard bullets at nearby ground targets. -unit.bryde.description = Fires long-range artillery shells and missiles at enemies. -unit.sei.description = Fires a barrage of missiles and armor-piercing bullets at enemies. -unit.omura.description = Fires a long-range piercing railgun bolt at enemies. Constructs flare units. -unit.alpha.description = Defends the Shard core from enemies. Builds structures. -unit.beta.description = Defends the Foundation core from enemies. Builds structures. -unit.gamma.description = Defends the Nucleus core from enemies. Builds structures. -unit.retusa.description = Fires homing torpedoes at nearby enemies. Repairs allied units. + +unit.dagger.description = Dispara projéteis padrões em todos os inimigos em volta. +unit.mace.description = Dispara corrents de chamas em todos os inimigos em volta. +unit.fortress.description = Dispara artilharia de longo alcance em alvos terrestres. +unit.scepter.description = Dispara uma barragem de projéteis carregados em todos os inimigos em volta. +unit.reign.description = Dispara uma barragem de projéteis perfuradoes massivos em todos os inimigos em volta. +unit.nova.description = Dispara raios-lasers que danificam inimigos e repara estruturas aliadas. Capaz de voar. +unit.pulsar.description = Dispara arcos de eletricidade que danificam inimigos e repara estruturas aliadas. Capaz de voar. +unit.quasar.description = Dispara feixes penetradores de lasers que danificam inimigos e repara estruturas aliadas. Capaz de voar. Possui um escudo. +unit.vela.description = Dispara um massivo feixe de laser massivo que danificam inimigos, causa fogo e repara estruturas aliadas. Capaz de voar. +unit.corvus.description = Dispara um massivo laser que danificam inimigos e repara estruturas aliadas. Pode pisar em cima da maioria do terreno. +unit.crawler.description = Corre atrás de inimigos e se destrói, causando uma grande explosão. +unit.atrax.description = Dispara orbes debilitantes de escória em alvos terrestres. Pode pisar em cima da maioria do terreno. +unit.spiroct.description = Dispara lasers enfraquecedores em inimigos, se reparando no processo. Pode pisar em cima da maioria do terreno. +unit.arkyid.description = Dispara grandes lasers enfraquecedores em inimigos, se reparando no processo. Pode pisar em cima da maioria do terreno. +unit.toxopid.description = Dispara grande granadas agrupadas elétricas e lasers penetradoes em inimigos. Pode pisar em cima da maioria do terreno. +unit.flare.description = Dispara projéteis padrões em alvos terrestres. +unit.horizon.description = Larga aglomerados de bombas em alvos terrestres. +unit.zenith.description = Dispara salvos de mísseis em todos os inimigos em volta. +unit.antumbra.description = Dispara uma barragem de projéteis em todos os inimigos em volta. +unit.eclipse.description = Dispara dois lasers penetradores e uma barragem de fogo antiaéreo em todos os inimigos em volta. +unit.mono.description = Automaticamente minera cobre e chumbo, depositando-os no núcleo. +unit.poly.description = Automaticamente reconstrói estruturas destruídas e ajuda outras unidades em construção. +unit.mega.description = Automaticamente repara estruturas danificadas. Capaz de carregar blocos e unidades de chão pequenas. +unit.quad.description = Larga grandes bombas em alvos terrestres, reparando estruturas aliadas e danificando inimigos. Capaz de carregar unidades terrestres de tamanho médio. +unit.oct.description = Protege aliados em volta com o seu escudo regenerador. Capaz de carregar a maioria das unidades terrestres. +unit.risso.description = Dispara uma barragem de mísseis e projéteis em todos os inimigos em volta. +unit.minke.description = Dispara granadas e projéteis padrões em alvos terrestres. +unit.bryde.description = Dispara granadas de artilharia de longo alcance e mísseis em todos os inimigos em volta. +unit.sei.description = Dispara uma barragem de mísseis e projéteis penetradoras de armadura em inimigos. +unit.omura.description = Dispara um raio de longo alcance atravessador em inimigos. Constrói unidades flare. +unit.alpha.description = Defende o Fragmento do Núcleo de inimigos. Constrói estruturas. +unit.beta.description = Defende a Fundação do Núcleo de inimigos. Constrói estruturas. +unit.gamma.description = Defende o Centro do Núcleo de inimigos. Constrói estruturas. +unit.retusa.description = Atira torpedos teleguiados em inimigos próximos. Repara unidades aliadas. unit.oxynoe.description = Fires structure-repairing streams of flame at nearby enemies. Targets nearby enemy projectiles with a point defense turret. -unit.cyerce.description = Fires seeking cluster-missiles at enemies. Repairs allied units. -unit.aegires.description = Shocks all enemy units and structures that enter its energy field. Repairs all allies. -unit.navanax.description = Fires explosive EMP projectiles, dealing significant damage to enemy power networks and repairing allied structures. Melts nearby enemies with 4 autonomous laser turrets. -unit.stell.description = Fires standard bullets at enemy targets. -unit.locus.description = Fires alternating bullets at enemy targets. -unit.precept.description = Fires piercing cluster bullets at enemy targets. -unit.vanquish.description = Fires large piercing splitting bullets at enemy targets. -unit.conquer.description = Fires large piercing cascades of bullets at enemy targets. -unit.merui.description = Fires long-range artillery at enemy ground targets. Can step over most terrain. -unit.cleroi.description = Fires dual shells at enemy targets. Targets enemy projectiles with point defense turrets. Can step over most terrain. -unit.anthicus.description = Fires long-range homing missiles at enemy targets. Can step over most terrain. -unit.tecta.description = Fires homing plasma missiles at enemy targets. Protects itself with a directional shield. Can step over most terrain. -unit.collaris.description = Fires long-range fragmenting artillery at enemy targets. Can step over most terrain. -unit.elude.description = Fires pairs of homing bullets at enemy targets. Can float over bodies of liquid. -unit.avert.description = Fires twisting pairs of bullets at enemy targets. -unit.obviate.description = Fires twisting pairs of lightning orbs at enemy targets. -unit.quell.description = Fires long-range homing missiles at enemy targets. Suppresses enemy structure repair blocks. -unit.disrupt.description = Fires long-range homing suppression missiles at enemy targets. Suppresses enemy structure repair blocks. -unit.evoke.description = Builds structures to defend the Bastion core. Repairs structures with a beam. -unit.incite.description = Builds structures to defend the Citadel core. Repairs structures with a beam. -unit.emanate.description = Builds structures to defend the Acropolis core. Repairs structures with beams. -lst.read = Read a number from a linked memory cell. -lst.write = Write a number to a linked memory cell. -lst.print = Add text to the print buffer.\nDoes not display anything until [accent]Print Flush[] is used. +unit.cyerce.description = Dispara fragmentos de mísseis em inimigos. Repara unidades aliadas. +unit.aegires.description = Causa choque a todas as unidades e estruturas inimigas que entram em seu campo de enrgia. Repara todos os aliados. +unit.navanax.description = Dispara projéteis de PEM explosivos, causando danos significativos às redes de energia inimigas e reparando as estruturas aliadas. Derrete os inimigos próximos com 4 torres laser autônomas. +unit.stell.description = Dispara balas padrão em alvos inimigos. +unit.locus.description = Dispara balas alternadas em alvos inimigos. +unit.precept.description = Atira balas de fragmentação perfurantes em alvos inimigos. +unit.vanquish.description = Dispara grandes balas de fragmentação perfurantes em alvos inimigos. +unit.conquer.description = Dispara grandes cascatas de balas perfurantes em alvos inimigos. +unit.merui.description = Dispara artilharia de longo alcance em alvos terrestres inimigos. Pode pisar sobre a maioria dos terrenos. +unit.cleroi.description = Dispara projéteis duplos em alvos inimigos. Ataca projéteis inimigos com torretas de defesa de ponto. Pode pisar sobre a maioria dos terrenos. +unit.anthicus.description = Atira mísseis teleguiados de longo alcance em alvos inimigos. Pode pisar sobre a maioria dos terrenos. +unit.tecta.description = Atira mísseis teleguiados de plasma em direção a alvos inimigos. Protege-se com um escudo direcional. Pode pisar sobre a maioria dos terrenos. +unit.collaris.description = Dispara artilharia de fragmentação de longo alcance em alvos inimigos. Pode pisar sobre a maioria dos terrenos. +unit.elude.description = Dispara pares de balas teleguiadas em alvos inimigos. Pode flutuar sobre regiões de líquido. +unit.avert.description = Dispara pares de balas em alvos inimigos. +unit.obviate.description = Dispara pares de orbes de relâmpagos em alvos inimigos. +unit.quell.description = Atira mísseis de longo alcance em alvos inimigos. Suprime os blocos de reparo de estruturas inimigas. +unit.disrupt.description = Dispara mísseis teleguiados de supressão de longo alcance em alvos inimigos. Suprime os blocos de reparo de estruturas inimigas. +unit.evoke.description = Constrói estruturas para defender o Bastião do Núcleo. Conserta estruturas com um feixe. +unit.incite.description = Constrói estruturas para defender a Cidadela do Núcleo. Repara estruturas com um feixe. +unit.emanate.description = Constrói estruturas para defender o Núcelo Acrópole. Repara estruturas com feixes. + +lst.read = Ler um número de uma célula de memória vinculada. +lst.write = Escrever um número de uma célula de memória vinculada. +lst.print = Adiciona texto ao buffer de impressão.\nNão exibe nada até [accent]Print Flush[] ser usado. lst.format = Replace next placeholder in text buffer with a value.\nDoes not do anything if placeholder pattern is invalid.\nPlaceholder pattern: "{[accent]number 0-9[]}"\nExample:\n[accent]print "test {0}"\nformat "example" -lst.draw = Add an operation to the drawing buffer.\nDoes not display anything until [accent]Draw Flush[] is used. -lst.drawflush = Flush queued [accent]Draw[] operations to a display. -lst.printflush = Flush queued [accent]Print[] operations to a message block. -lst.getlink = Get a processor link by index. Starts at 0. -lst.control = Control a building. -lst.radar = Locate units around a building with range. -lst.sensor = Get data from a building or unit. -lst.set = Set a variable. -lst.operation = Perform an operation on 1-2 variables. -lst.end = Jump to the top of the instruction stack. -lst.wait = Wait a certain number of seconds. -lst.stop = Halt execution of this processor. -lst.lookup = Look up an item/liquid/unit/block type by ID.\nTotal counts of each type can be accessed with:\n[accent]@unitCount[] / [accent]@itemCount[] / [accent]@liquidCount[] / [accent]@blockCount[] -lst.jump = Conditionally jump to another statement. -lst.unitbind = Bind to the next unit of a type, and store it in [accent]@unit[]. -lst.unitcontrol = Control the currently bound unit. -lst.unitradar = Locate units around the currently bound unit. -lst.unitlocate = Locate a specific type of position/building anywhere on the map.\nRequires a bound unit. -lst.getblock = Get tile data at any location. -lst.setblock = Set tile data at any location. -lst.spawnunit = Spawn unit at a location. -lst.applystatus = Apply or clear a status effect from a uniut. +lst.draw = Adicionar uma operação ao buffer de desenho.\nNão exibe nada até [accent]Draw Flush[] ser usado. +lst.drawflush = Liberar operações [accent]Draw[] enfileiradas para um display. +lst.printflush = Liberar operações [accent]Print[] enfileiradas para um bloco de mensagem. +lst.getlink = Obtenha um link de processador por índice. Começa em 0. +lst.control = Controle uma construção. +lst.radar = Localize unidades ao redor de um prédio com alcance. +lst.sensor = Obtenha dados de um edifício ou unidade. +lst.set = Defina uma variável. +lst.operation = Execute uma operação em 1-2 variáveis. +lst.end = Pule para o topo da pilha de instruções. +lst.wait = Aguarde um determinado número de segundos. +lst.stop = Interrompa a execução deste processador. +lst.lookup = Pesquise um tipo de item/líquido/unidade/bloco por ID.\nAs contagens totais de cada tipo podem ser acessadas com:\n[accent]@unitCount[] / [accent]@itemCount[] / [accent]@liquidCount[] / [accent]@blockCount[] +lst.jump = Salte condicionalmente para outra instrução. +lst.unitbind = Vincule à próxima unidade de um tipo e armazene-a em [accent]@unit[]. +lst.unitcontrol = Controle a unidade atualmente vinculada. +lst.unitradar = Localize as unidades ao redor da unidade atualmente vinculada. +lst.unitlocate = Localize um tipo específico de posição/construção em qualquer lugar do mapa.\nRequer uma unidade vinculada. +lst.getblock = Obtenha dados de blocos em qualquer local. +lst.setblock = Defina os dados do bloco em qualquer local. +lst.spawnunit = Gere uma unidade em um local. +lst.applystatus = Aplique ou elimine um efeito de status de uma unidade. lst.weathersense = Check if a type of weather is active. lst.weatherset = Set the current state of a type of weather. -lst.spawnwave = Simulate a wave being spawned at a arbitrary location.\nWill not increment the wave counter. -lst.explosion = Create an explosion at a location. -lst.setrate = Set processor execution speed in instructions/tick. -lst.fetch = Lookup units, cores, players or buildings by index.\nIndices start at 0 and end at their returned count. -lst.packcolor = Pack [0, 1] RGBA components into a single number for drawing or rule-setting. -lst.setrule = Set a game rule. -lst.flushmessage = Display a message on the screen from the text buffer.\nWill wait until the previous message finishes. -lst.cutscene = Manipulate the player camera. -lst.setflag = Set a global flag that can be read by all processors. -lst.getflag = Check if a global flag is set. -lst.setprop = Sets a property of a unit or building. +lst.spawnwave = Gerar uma onda. +lst.explosion = Crie uma explosão em um local. +lst.setrate = Defina a velocidade de execução do processador em instruções/tick. +lst.fetch = Pesquise unidades, núcleos, jogadores ou edifícios por índice.\nOs índices começam em 0 e terminam na contagem retornada. +lst.packcolor = Empacote [0, 1] componentes RGBA em um único número para desenho ou configuração de regra. +lst.setrule = Defina uma regra do jogo. +lst.flushmessage = Exibe uma mensagem na tela do buffer de texto.\nAguardará até que a mensagem anterior termine. +lst.cutscene = Manipule a câmera do jogador. +lst.setflag = Defina um sinalizador global que possa ser lido por todos os processadores. +lst.getflag = Verifique se um sinalizador global está definido. +lst.setprop = Define uma propriedade de uma unidade ou edifício. lst.effect = Create a particle effect. lst.sync = Sync a variable across the network.\nOnly invoked 10 times a second at most. lst.playsound = Plays a sound.\nVolume and pan can be a global value, or calculated based on position. lst.makemarker = Create a new logic marker in the world.\nAn ID to identify this marker must be provided.\nMarkers currently limited to 20,000 per world. lst.setmarker = Set a property for a marker.\nThe ID used must be the same as in the Make Marker instruction. lst.localeprint = Add map locale property value to the text buffer.\nTo set map locale bundles in map editor, check [accent]Map Info > Locale Bundles[].\nIf client is a mobile device, tries to print a property ending in ".mobile" first. + lglobal.false = 0 lglobal.true = 1 lglobal.null = null @@ -2437,140 +2481,160 @@ lglobal.@clientUnit = Unit of client running the code lglobal.@clientName = Player name of client running the code lglobal.@clientTeam = Team ID of client running the code lglobal.@clientMobile = True is the client running the code is on mobile, false otherwise -logic.nounitbuild = [red]Unit building logic is not allowed here. -lenum.type = Type of building/unit.\ne.g. for any router, this will return [accent]@router[].\nNot a string. -lenum.shoot = Shoot at a position. -lenum.shootp = Shoot at a unit/building with velocity prediction. -lenum.config = Building configuration, e.g. sorter item. -lenum.enabled = Whether the block is enabled. + +logic.nounitbuild = [red]Lógica de construção de unidades não é permitida aqui. + +lenum.type = Tipo de edifício/unidade.\ne.g. para qualquer roteador, isso retornará [accent]@router[].\não uma string. +lenum.shoot = Atire em uma posição. +lenum.shootp = Atire em uma unidade/edifício com previsão de velocidade. +lenum.config = Configuração do edifício, por ex. item classificador. +lenum.enabled = Se o bloco está ativado. + laccess.currentammotype = Current ammo item/liquid of a turret. -laccess.color = Illuminator color. -laccess.controller = Unit controller. If processor controlled, returns processor.\nIf in a formation, returns leader.\nOtherwise, returns the unit itself. -laccess.dead = Whether a unit/building is dead or no longer valid. -laccess.controlled = Returns:\n[accent]@ctrlProcessor[] if unit controller is processor\n[accent]@ctrlPlayer[] if unit/building controller is player\n[accent]@ctrlFormation[] if unit is in formation\nOtherwise, 0. -laccess.progress = Action progress, 0 to 1.\nReturns production, turret reload or construction progress. -laccess.speed = Top speed of a unit, in tiles/sec. +laccess.color = Cor do iluminador. +laccess.controller = Controlador de unidade. Se controlado pelo processador, retorna o processador.\nCaso contrário, retorna a própria unidade. +laccess.dead = Se uma unidade/edifício está morta ou não é mais válida. +laccess.controlled = Retorna:\n[accent]@ctrlProcessor[] se o controlador da unidade for o processador\n[accent]@ctrlPlayer[] se o controlador da unidade/edifício for o player\n[accent]@ctrlCommand[] se o controlador da unidade for um comando do player\nCaso contrário , 0. +laccess.progress = Progresso da ação, 0 a 1.\nRetorna a produção, a recarga da torre ou o progresso da construção. +laccess.speed = Velocidade máxima de uma unidade, em ladrilhos/seg. laccess.id = ID of a unit/block/item/liquid.\nThis is the inverse of the lookup operation. -lcategory.unknown = Unknown -lcategory.unknown.description = Uncategorized instructions. -lcategory.io = Input & Output -lcategory.io.description = Modify contents of memory blocks and processor buffers. -lcategory.block = Block Control -lcategory.block.description = Interact with blocks. -lcategory.operation = Operations -lcategory.operation.description = Logical operations. -lcategory.control = Flow Control -lcategory.control.description = Manage execution order. -lcategory.unit = Unit Control -lcategory.unit.description = Give units commands. -lcategory.world = World -lcategory.world.description = Control how the world behaves. -graphicstype.clear = Fill the display with a color. -graphicstype.color = Set color for next drawing operations. -graphicstype.col = Equivalent to color, but packed.\nPacked colors are written as hex codes with a [accent]%[] prefix.\nExample: [accent]%ff0000[] would be red. -graphicstype.stroke = Set line width. -graphicstype.line = Draw line segment. -graphicstype.rect = Fill a rectangle. -graphicstype.linerect = Draw a rectangle outline. -graphicstype.poly = Fill a regular polygon. -graphicstype.linepoly = Draw a regular polygon outline. -graphicstype.triangle = Fill a triangle. -graphicstype.image = Draw an image of some content.\nex: [accent]@router[] or [accent]@dagger[]. + +lcategory.unknown = Desconhecido +lcategory.unknown.description = Instruções não categorizadas. +lcategory.io = Entrada e Saída +lcategory.io.description = Modifica o conteúdo dos blocos de memória e buffers do processador. +lcategory.block = Controle de bloco +lcategory.block.description = Interaja com os blocos. +lcategory.operation = Operações +lcategory.operation.description = Operações lógicas. +lcategory.control = Controle de fluxo +lcategory.control.description = Gerencia ordem de execução. +lcategory.unit = Unidade de controle +lcategory.unit.description = Dá comandos às unidades. +lcategory.world = Mundo +lcategory.world.description = Controla como o mundo se comporta. + +graphicstype.clear = Preenche o visor com uma cor. +graphicstype.color = Define a cor para as próximas operações de desenho. +graphicstype.col = Equivalente à cor, mas agrupada.\nAs cores agrupadas são escritas como códigos hexadecimais com um prefixo [accent]%[].\nExemplo: [accent]%ff0000[] seria vermelho. +graphicstype.stroke = Define a largura da linha. +graphicstype.line = Desenha o segmento de linha. +graphicstype.rect = Preenche um retângulo. +graphicstype.linerect = Desenha um contorno retangular. +graphicstype.poly = Preenche um polígono regular. +graphicstype.linepoly = Desenha um contorno de polígono regular. +graphicstype.triangle = Preenche um triângulo. +graphicstype.image = Desenha uma imagem de algum conteúdo.\nex: [accent]@router[] ou [accent]@dagger[]. graphicstype.print = Draws text from the print buffer.\nClears the print buffer. -lenum.always = Always true. -lenum.idiv = Integer division. -lenum.div = Division.\nReturns [accent]null[] on divide-by-zero. + +lenum.always = Sempre verdade. +lenum.idiv = Divisão inteira. +lenum.div = Divisão.\nRetorna [accent]null[] na divisão por zero. lenum.mod = Modulo. -lenum.equal = Equal. Coerces types.\nNon-null objects compared with numbers become 1, otherwise 0. -lenum.notequal = Not equal. Coerces types. -lenum.strictequal = Strict equality. Does not coerce types.\nCan be used to check for [accent]null[]. -lenum.shl = Bit-shift left. -lenum.shr = Bit-shift right. -lenum.or = Bitwise OR. -lenum.land = Logical AND. -lenum.and = Bitwise AND. -lenum.not = Bitwise flip. -lenum.xor = Bitwise XOR. -lenum.min = Minimum of two numbers. -lenum.max = Maximum of two numbers. -lenum.angle = Angle of vector in degrees. -lenum.anglediff = Absolute distance between two angles in degrees. -lenum.len = Length of vector. -lenum.sin = Sine, in degrees. -lenum.cos = Cosine, in degrees. -lenum.tan = Tangent, in degrees. -lenum.asin = Arc sine, in degrees. -lenum.acos = Arc cosine, in degrees. -lenum.atan = Arc tangent, in degrees. -lenum.rand = Random decimal in range [0, value). -lenum.log = Natural logarithm (ln). -lenum.log10 = Base 10 logarithm. -lenum.noise = 2D simplex noise. -lenum.abs = Absolute value. -lenum.sqrt = Square root. -lenum.any = Any unit. -lenum.ally = Ally unit. -lenum.attacker = Unit with a weapon. -lenum.enemy = Enemy unit. -lenum.boss = Guardian unit. -lenum.flying = Flying unit. +lenum.equal = Igual. Coage tipos.\nObjetos não nulos comparados com números tornam-se 1, caso contrário, 0. +lenum.notequal = Não igual. Tipos de coerção. +lenum.strictequal = Igualdade estrita. Não coage tipos.Pode ser usado para verificar [accent]null[]. +lenum.shl = Deslocamento de bit para a esquerda. +lenum.shr = Deslocamento de bits para a direita. +lenum.or = OU bit a bit. +lenum.land = Lógico E. +lenum.and = E bit a bit. +lenum.not = Virar bit a bit. +lenum.xor = XOR bit a bit. + +lenum.min = Mínimo de dois números. +lenum.max = Máximo de dois números. +lenum.angle = Ângulo do vetor em graus. +lenum.anglediff = Distância absoluta entre dois ângulos em graus. +lenum.len = Comprimento do vetor. + +lenum.sin = Seno, em graus. +lenum.cos = Cosseno, em graus. +lenum.tan = Tangente, em graus. + +lenum.asin = Arco seno, em graus. +lenum.acos = Arco cosseno, em graus. +lenum.atan = Arco tangente, em graus. + +#not a typo, look up 'range notation' +lenum.rand = Decimal aleatório no intervalo [0, valor). +lenum.log = Logaritmo natural (ln). +lenum.log10 = Logaritmo de base 10. +lenum.noise = Ruído simplex 2D. +lenum.abs = Valor absoluto. +lenum.sqrt = Raiz quadrada. + +lenum.any = Qualquer unidade. +lenum.ally = Unidade aliada. +lenum.attacker = Unidade com uma arma. +lenum.enemy = Unidade inimiga. +lenum.boss = Unidade Guardiã. +lenum.flying = Unidade voadora. lenum.ground = Ground unit. -lenum.player = Unit controlled by a player. -lenum.ore = Ore deposit. -lenum.damaged = Damaged ally building. -lenum.spawn = Enemy spawn point.\nMay be a core or a position. -lenum.building = Building in a specific group. -lenum.core = Any core. -lenum.storage = Storage building, e.g. Vault. -lenum.generator = Buildings that generate power. -lenum.factory = Buildings that transform resources. -lenum.repair = Repair points. -lenum.battery = Any battery. -lenum.resupply = Resupply points.\nOnly relevant when [accent]"Unit Ammo"[] is enabled. -lenum.reactor = Impact/Thorium reactor. -lenum.turret = Any turret. -sensor.in = The building/unit to sense. -radar.from = Building to sense from.\nSensor range is limited by building range. -radar.target = Filter for units to sense. -radar.and = Additional filters. -radar.order = Sorting order. 0 to reverse. -radar.sort = Metric to sort results by. -radar.output = Variable to write output unit to. -unitradar.target = Filter for units to sense. -unitradar.and = Additional filters. -unitradar.order = Sorting order. 0 to reverse. -unitradar.sort = Metric to sort results by. -unitradar.output = Variable to write output unit to. -control.of = Building to control. -control.unit = Unit/building to aim at. -control.shoot = Whether to shoot. -unitlocate.enemy = Whether to locate enemy buildings. -unitlocate.found = Whether the object was found. -unitlocate.building = Output variable for located building. -unitlocate.outx = Output X coordinate. -unitlocate.outy = Output Y coordinate. -unitlocate.group = Building group to look for. +lenum.player = Unidade controlada por um jogador. + +lenum.ore = Depósito de minério. +lenum.damaged = Edifício aliado danificado. +lenum.spawn = Ponto de geração do inimigo.\nPode ser um núcleo ou uma posição. +lenum.building = Construção em um grupo específico. + +lenum.core = Qualquer núcleo. +lenum.storage = Edifício de armazenamento, por ex. Cofre. +lenum.generator = Edifícios que geram energia. +lenum.factory = Edifícios que transformam recursos. +lenum.repair = Pontos de reparo. +lenum.battery = Qualquer bateria. +lenum.resupply = Pontos de reabastecimento.\nRelevante apenas quando [accent]"Unit Ammo"[] está habilitado. +lenum.reactor = Reator de impacto/tório. +lenum.turret = Qualquer torre. + +sensor.in = O edifício/unidade para sentir. + +radar.from = Construir para detectar.\nO alcance do sensor é limitado pelo alcance do edifício. +radar.target = Filtre as unidades a serem detectadas. +radar.and = Filtros adicionais. +radar.order = Ordem de classificação. 0 para inverter. +radar.sort = Métrica pela qual classificar os resultados. +radar.output = Variável para gravar a unidade de saída. + +unitradar.target = Filtre as unidades a serem detectadas. +unitradar.and = Filtros adicionais. +unitradar.order = Ordem de classificação. 0 para inverter. +unitradar.sort = Métrica pela qual classificar os resultados. +unitradar.output = Variável para gravar a unidade de saída. + +control.of = Construir para controlar. +control.unit = Unidade/edifício a visar. +control.shoot = Se atirar. + +unitlocate.enemy = Se deve localizar edifícios inimigos. +unitlocate.found = Se o objeto foi encontrado. +unitlocate.building = Variável de saída para edifício localizado. +unitlocate.outx = Coordenada X de saída. +unitlocate.outy = Coordenada Y de saída. +unitlocate.group = Grupo de construção para procurar. playsound.limit = If true, prevents this sound from playing\nif it has already been played in the same frame. -lenum.idle = Don't move, but keep building/mining.\nThe default state. -lenum.stop = Stop moving/mining/building. -lenum.unbind = Completely disable logic control.\nResume standard AI. -lenum.move = Move to exact position. -lenum.approach = Approach a position with a radius. -lenum.pathfind = Pathfind to the enemy spawn. + +lenum.idle = Não se mova, mas continue construindo/minerando.\nO estado padrão. +lenum.stop = Pare de mover/mineração/construção. +lenum.unbind = Desabilite completamente o controle lógico.\nRetome AI padrão. +lenum.move = Mover para a posição exata. +lenum.approach = Aproxime-se de uma posição com um raio. +lenum.pathfind = Pathfind para o spawn inimigo. lenum.autopathfind = Automatically pathfinds to the nearest enemy core or drop point.\nThis is the same as standard wave enemy pathfinding. -lenum.target = Shoot a position. -lenum.targetp = Shoot a target with velocity prediction. -lenum.itemdrop = Drop an item. -lenum.itemtake = Take an item from a building. -lenum.paydrop = Drop current payload. -lenum.paytake = Pick up payload at current location. -lenum.payenter = Enter/land on the payload block the unit is on. -lenum.flag = Numeric unit flag. -lenum.mine = Mine at a position. -lenum.build = Build a structure. +lenum.target = Atire em uma posição. +lenum.targetp = Atire em um alvo com previsão de velocidade. +lenum.itemdrop = Solte um item. +lenum.itemtake = Pegue um item de um edifício. +lenum.paydrop = Solte a carga útil atual. +lenum.paytake = Pegue a carga no local atual. +lenum.payenter = Entre/pouse no bloco de carga em que a unidade está. +lenum.flag = Sinalizador de unidade numérica. +lenum.mine = Mina em uma posição. +lenum.build = Construa uma estrutura. lenum.getblock = Fetch building, floor and block type at coordinates.\nUnit must be in range of the position, otherwise null is returned. -lenum.within = Check if unit is near a position. -lenum.boost = Start/stop boosting. +lenum.within = Verifique se a unidade está perto de uma posição. +lenum.boost = Iniciar/parar o reforço. lenum.flushtext = Flush print buffer's content to marker, if applicable.\nIf fetch is set to true, tries to fetch properties from map locale bundle or game's bundle. lenum.texture = Texture name straight from game's texture atlas (using kebab-case naming style).\nIf printFlush is set to true, consumes text buffer content as text argument. lenum.texturesize = Size of texture in tiles. Zero value scales marker width to original texture's size. From fbd2944663ca8375d46fec7b4522546dc9294885 Mon Sep 17 00:00:00 2001 From: Github Actions Date: Wed, 5 Feb 2025 00:37:42 +0000 Subject: [PATCH 166/460] Automatic bundle update --- core/assets/bundles/bundle_pt_PT.properties | 29 ++++++++++++++++++--- 1 file changed, 25 insertions(+), 4 deletions(-) diff --git a/core/assets/bundles/bundle_pt_PT.properties b/core/assets/bundles/bundle_pt_PT.properties index 4c2043db33..89b11b9cdc 100644 --- a/core/assets/bundles/bundle_pt_PT.properties +++ b/core/assets/bundles/bundle_pt_PT.properties @@ -231,6 +231,7 @@ server.kicked.serverRestarting = O seridor está a reiniciar. server.versions = A tua versão:[accent] {0}[]\nVersão do servidor:[accent] {1}[] host.info = O botão de [accent]Hospedar[] hospeda um servidor na porta [scarlet]6567[] e [scarlet]6568.[]\nQualquer jogador na mesma [lightgray]Wi-Fi ou rede local[] pode ver este servidor na lista de servidores.\n\nSe você quiser que os jogadores entrem de qualquer sítio através do seu IP, [accent]port forwarding[] é necessário.\n\n[lightgray]Nota: Se alguém está com problemas a conectar ao seu servidor LAN, tenha a certeza que o Mindustry tem acesso à sua internet local nas configurações do seu firewall. Nota que nem todas as redes públicas permitem a deteção do servidor na rede. join.info = Aqui podes inserir um [accent]IP de servidor[] para conectar, ou descobrir [accent]servidores[] da rede local or [accent]servidores[] no mundo.\nAmbos os servidores LAN e WAN são suportados.\n\n[lightgray]Se quiseres conectar ao servidor de alguém por IP, precisas de pedir ao anfitrião o IP, que pode ser descoberto ao pesquisar "meu IP" na Internet. +hostserver = Host Multiplayer Game invitefriends = Convidar amigos hostserver.mobile = Hospedar\nJogo host = Hospedar @@ -302,7 +303,6 @@ connecting = [accent]A conectar... reconnecting = [accent]A reconectar... connecting.data = [accent]A carregar o dados do mundo... server.port = Porta: -server.addressinuse = Endereço em uso! server.invalidport = Número de porta inválido! server.error.addressinuse = [scarlet]Falhou ao iniciar o servidor na porta 6567.[]\n\nCertifica-te que não existem outros servidores do Mindustry em funcionamento no teu dispositivo ou rede local! server.error = [crimson]Erro ao hospedar o servidor: [accent]{0} @@ -358,6 +358,7 @@ command.enterPayload = Inserir bloco de carga command.loadUnits = Carrgar Unidades command.loadBlocks = Carregar Blocos command.unloadPayload = Descarregar Carga +command.loopPayload = Loop Unit Transfer stance.stop = Cancelar Pedidos stance.shoot = Stance: Atirar stance.holdfire = Stance: Não disparar @@ -720,7 +721,7 @@ objective.destroycore = [accent]Destrói o Núcleo Inimigo objective.command = [accent]Comandar Unidades objective.nuclearlaunch = [accent]⚠ Lançamento Nuclear detetado: [lightgray]{0} -announce.nuclearstrike = [red]\u26A0 ATAQUE NUCLEAR APROXIMANDO-SE \u26A0\n[lightgray]constrói núcleos de reserva imediatamente +announce.nuclearstrike = [red]⚠ ATAQUE NUCLEAR APROXIMANDO-SE ⚠\n[lightgray]constrói núcleos de reserva imediatamente loadout = Carregamento resources = Recursos @@ -734,6 +735,8 @@ addall = Adicionar tudo launch.from = A lançar de: [accent]{0} launch.capacity = Capacidade de Itens de Lançamento: [accent]{0} launch.destination = Destino: {0} +landing.sources = Source Sectors: [accent]{0}[] +landing.import = Max Total Import: {0}[accent]{1}[lightgray]/min configure.invalid = A quantidade deve ser um número entre 0 e {0}. add = Adicionar... guardian = Guardião @@ -774,7 +777,9 @@ sectors.stored = Armazenado: sectors.resume = Continuar sectors.launch = Lançar sectors.select = Selecionar +sectors.launchselect = Select Launch Destination sectors.nonelaunch = [lightgray]nenhum (sun) +sectors.redirect = Redirect Launch Pads sectors.rename = Renomear Setor sectors.enemybase = [scarlet]Base Inimiga sectors.vulnerable = [scarlet]Vulnerável @@ -910,7 +915,6 @@ sector.siege.description = Este setor apresenta dois desfiladeiros paralelos que sector.crossroads.description = As bases inimigas neste setor foram estabelecidas em terrenos variados. Pesquisa diferentes unidades para adaptar.\nAlém disso, algumas bases estão protegidas por escudos. Descobre como eles são alimentados. sector.karst.description = Este setor é rico em recursos, mas será atacado pelo inimigo assim que um novo núcleo chegar.\nAproveita os recursos e pesquisa o [accent]tecido de fase[]. sector.origin.description = O setor final com uma presença inimiga significativa.\nNenhuma oportunidade de pesquisa provável permanece - foca-te apenas em destruir todos os núcleos inimigos. - status.burning.name = Queimar status.freezing.name = Congelar status.wet.name = Molhado @@ -1086,6 +1090,7 @@ ability.stat.buildtime = [stat]{0} seg.[lightgray] tempo de construção bar.onlycoredeposit = Depósito no núcleo permitido apenas bar.drilltierreq = Melhor broca necessária +bar.nobatterypower = Insufficient Battery Power bar.noresources = Recursos Insuficientes bar.corereq = Base de Núcleo Necessária bar.corefloor = Chão de colocação do Núcleo Necessária @@ -1094,6 +1099,7 @@ bar.drillspeed = Velocidade da Broca: {0}/s bar.pumpspeed = Velocidade da Bomba: {0}/s bar.efficiency = Eficiência: {0}% bar.boost = Impulso: +{0}% +bar.powerbuffer = Batteries: {0}/{1} bar.powerbalance = Energia: {0}/s bar.powerstored = Armazenada: {0}/{1} @@ -1105,6 +1111,7 @@ bar.capacity = Capacidade: {0} bar.unitcap = {0} {1}/{2} bar.liquid = Líquido bar.heat = Calor +bar.cooldown = Cooldown bar.instability = Instabilidade bar.heatamount = Calor: {0} bar.heatpercent = Calor: {0} ({1}%) @@ -1156,6 +1163,7 @@ unit.minutes = minutos unit.persecond = /seg. unit.perminute = /min unit.timesspeed = x velocidade +unit.multiplier = x unit.percent = % unit.shieldhealth = saúde do escudo @@ -1236,11 +1244,13 @@ setting.mutemusic.name = Desligar Música setting.sfxvol.name = Volume dos Efeitos setting.mutesound.name = Desligar Som setting.crashreport.name = Enviar Relatórios de Crash Anónimos +setting.communityservers.name = Fetch Community Server List setting.savecreate.name = Criar Gravações Automaticamente setting.steampublichost.name = Public Game Visibility setting.playerlimit.name = Limite de Jogadores setting.chatopacity.name = Opacidade do Chat setting.lasersopacity.name = Opacidade do Poder do Laser +setting.unitlaseropacity.name = Unit Mining Beam Opacity setting.bridgeopacity.name = Opacidade das Pontes setting.playerchat.name = Mostrar Chat em Jogo setting.showweather.name = Mostrar Gráficos do Clima @@ -1378,6 +1388,8 @@ rules.wavetimer = Tempo de Horda rules.wavesending = Envio de Hordas rules.allowedit = Permitir Edição de Regras rules.allowedit.info = Quando ativado, o jogador pode editar as regras em jogo através do botão no canto sup. esq. nop menu de Pausa. +rules.alloweditworldprocessors = Allow Editing World Processors +rules.alloweditworldprocessors.info = When enabled, world logic blocks can be placed and edited even outside the editor. rules.waves = Hordas @@ -1403,6 +1415,7 @@ rules.unitcostmultiplier = Multiplicador de Custo de Unidades rules.unithealthmultiplier = Multiplicador de Vida de Unidades rules.unitdamagemultiplier = Multiplicador de Dano de Unidades rules.unitcrashdamagemultiplier = Multiplicador de Dano de Unidades quando Destruídas. +rules.unitminespeedmultiplier = Unit Mine Speed Multiplier rules.solarmultiplier = Multiplicador de Energia Solar rules.unitcapvariable = Núcleos Contribuem para o Limite de Unidades rules.unitpayloadsexplode = Cargas carregadas explodem junto com a Unidade @@ -1432,6 +1445,9 @@ rules.title.planet = Planeta rules.lighting = Iluminação rules.fog = Névoa de guerra rules.invasions = Invasões de Setores Inimigos +rules.legacylaunchpads = Legacy Launch Pad Mechanics +rules.legacylaunchpads.info = Allows using launch pads without landing pads, as in 7.0. +landingpad.legacy.disabled = [scarlet]\ue815 Disabled[lightgray] (Legacy Launch Pads enabled) rules.showspawns = Mostrar Spawn de Inimigos rules.randomwaveai = IA de hordas imprevisível rules.fire = Fogo @@ -1750,6 +1766,8 @@ block.meltdown.name = Fusão block.foreshadow.name = Foreshadow block.container.name = Contentor block.launch-pad.name = Plataforma de Lançamento +block.advanced-launch-pad.name = Launch Pad +block.landing-pad.name = Landing Pad block.segment.name = Segment block.ground-factory.name = Fábrica Terrestre @@ -2203,7 +2221,9 @@ block.vault.description = Carrega uma alta quantidade de itens. Usado para criar block.container.description = Carrega uma baixa quantidade de itens. Usado para criar fontes Quando não tem uma necessidade constante de materiais. Um[lightgray] Descarregador[] pode ser usado para recuperar esses itens do container. block.unloader.description = Descarrega itens de um container, Descarrega em uma esteira ou diretamente em um bloco adjacente. O tipo de item que pode ser descarregado pode ser mudado clicando no descarregador. block.launch-pad.description = Lança montes de itens sem qualquer necessidade de um lançamento de núcleo. -block.launch-pad.details = Sistema sub-orbital para transporte ponto-a-ponto de recursos. As cápsulas de carga são frágeis e incapazes de sobreviver à reentrada. +block.advanced-launch-pad.description = Launches batches of items to selected sectors. Only accepts one item type at a time. +block.advanced-launch-pad.details = Sub-orbital system for point-to-point transportation of resources. +block.landing-pad.description = Receives items from launch pads in other sectors. Requires large amounts of water to protect against impacts of landings. block.duo.description = Uma torre pequena e barata. block.scatter.description = Uma torre anti aerea media. Joga montes de cobre ou sucata aos inimigos. @@ -2280,6 +2300,7 @@ block.vent-condenser.description = Condensa os gases de ventilação em água. C block.plasma-bore.description = Quando colocado de frente para uma parede de minério, produz itens por tempo indeterminado. Requer pequenas quantidades de energia. block.large-plasma-bore.description = Uma Broca de Plasma maior. Capaz de extrair tungsténio e tório. Requer hidrogénio e energia. block.cliff-crusher.description = Esmaga as paredes, produzindo areia indefinidamente. Requer energia. A eficiência varia de acordo com o tipo de parede. +block.large-cliff-crusher.description = Crushes walls, outputting sand indefinitely. Requires power and ozone. Efficiency varies based on type of wall. Optionally consumes tungsten to increase efficiency. block.impact-drill.description = Quando colocados sobre minério, os itens saem em rajadas indefinidamente. Requer energia e água. block.eruption-drill.description = Uma Broca de Impacto melhorada. Capaz de minerar Tório. Requer Hidrogénio. block.reinforced-conduit.description = Movimenta fluidos para frente. Não aceita entradas de outros blocos, a não ser canos, dos lados. From c4e25e312f36b1dfaa4dc48fbc080960c7a1ff56 Mon Sep 17 00:00:00 2001 From: 1ue999 <106450442+1ue999@users.noreply.github.com> Date: Wed, 5 Feb 2025 01:39:33 +0100 Subject: [PATCH 167/460] Printchar (#10451) * Added PrintChar operation * Added 1ue999 to contributors * Added PrintChar description, and improved the design of it. * Ok intellij, removing the int cast * Added capability to print content icons (@flare or @router) https://github.com/Anuken/Mindustry/pull/10451#discussion_r1941282280 * Formatting changes (hopefully all of them) * Update core/src/mindustry/logic/LStatements.java * Update core/src/mindustry/logic/LStatements.java --------- Co-authored-by: Anuken --- core/assets/bundles/bundle.properties | 1 + core/assets/contributors | 1 + core/src/mindustry/logic/LExecutor.java | 23 +++++++++++++ core/src/mindustry/logic/LStatements.java | 40 +++++++++++++++++++++++ 4 files changed, 65 insertions(+) diff --git a/core/assets/bundles/bundle.properties b/core/assets/bundles/bundle.properties index 1cf83ddd7e..f8dfa94312 100644 --- a/core/assets/bundles/bundle.properties +++ b/core/assets/bundles/bundle.properties @@ -2415,6 +2415,7 @@ unit.emanate.description = Builds structures to defend the Acropolis core. Repai lst.read = Read a number from a linked memory cell. lst.write = Write a number to a linked memory cell. lst.print = Add text to the print buffer.\nDoes not display anything until [accent]Print Flush[] is used. +lst.printchar = Add a UTF-16 character or content icon to the print buffer.\nDoes not display anything until [accent]Print Flush[] is used. lst.format = Replace next placeholder in text buffer with a value.\nDoes not do anything if placeholder pattern is invalid.\nPlaceholder pattern: "{[accent]number 0-9[]}"\nExample:\n[accent]print "test {0}"\nformat "example" lst.draw = Add an operation to the drawing buffer.\nDoes not display anything until [accent]Draw Flush[] is used. lst.drawflush = Flush queued [accent]Draw[] operations to a display. diff --git a/core/assets/contributors b/core/assets/contributors index f939b3c30f..22293a89c4 100644 --- a/core/assets/contributors +++ b/core/assets/contributors @@ -171,3 +171,4 @@ hexagon-recursion JasonP01 BlueTheCube sasha0552 +1ue999 diff --git a/core/src/mindustry/logic/LExecutor.java b/core/src/mindustry/logic/LExecutor.java index d1e0d95b5a..d3a949d34e 100644 --- a/core/src/mindustry/logic/LExecutor.java +++ b/core/src/mindustry/logic/LExecutor.java @@ -988,6 +988,29 @@ public class LExecutor{ } } + public static class PrintCharI implements LInstruction{ + public LVar value; + + public PrintCharI(LVar value){ + this.value = value; + } + + PrintCharI(){} + + @Override + public void run(LExecutor exec){ + + if(exec.textBuffer.length() >= maxTextBuffer) return; + if(value.isobj){ + if(!(value.objval instanceof UnlockableContent cont)) return; + exec.textBuffer.append((char)cont.emojiChar()); + return; + } + + exec.textBuffer.append((char)Math.floor(value.numval)); + } + } + public static class FormatI implements LInstruction{ public LVar value; diff --git a/core/src/mindustry/logic/LStatements.java b/core/src/mindustry/logic/LStatements.java index 1daafcdb45..223b1a7079 100644 --- a/core/src/mindustry/logic/LStatements.java +++ b/core/src/mindustry/logic/LStatements.java @@ -312,6 +312,46 @@ public class LStatements{ } } + @RegisterStatement("printchar") + public static class PrintCharStatement extends LStatement{ + public String value = "65"; + + @Override + public void build(Table table){ + table.add(" char "); + TextField field = field(table, value, str -> value = str).get(); + table.button(b -> { + b.image(Icon.pencilSmall); + b.clicked(() -> showSelectTable(b, (t, hide) -> { + t.row(); + t.table(i -> { + i.left(); + int c = 0; + for(char j = 32; j < 127; j++){ + final int chr = j; + i.button(String.valueOf(j), Styles.flatt, () -> { + value = Integer.toString(chr); + field.setText(value); + hide.run(); + }).size(32f); + if(++c % 8 == 0) i.row(); + } + }); + })); + }, Styles.logict, () -> {}).size(40f).padLeft(-2).color(table.color); + } + + @Override + public LInstruction build(LAssembler builder){ + return new PrintCharI(builder.var(value)); + } + + @Override + public LCategory category(){ + return LCategory.io; + } + } + @RegisterStatement("format") public static class FormatStatement extends LStatement{ public String value = "\"frog\""; From add68af941d8d7a1cf8b8be1d53fc5d3670b5abb Mon Sep 17 00:00:00 2001 From: Github Actions Date: Wed, 5 Feb 2025 00:40:18 +0000 Subject: [PATCH 168/460] Automatic bundle update --- core/assets/bundles/bundle_be.properties | 1 + core/assets/bundles/bundle_bg.properties | 1 + core/assets/bundles/bundle_ca.properties | 1 + core/assets/bundles/bundle_cs.properties | 1 + core/assets/bundles/bundle_da.properties | 1 + core/assets/bundles/bundle_de.properties | 1 + core/assets/bundles/bundle_es.properties | 1 + core/assets/bundles/bundle_et.properties | 1 + core/assets/bundles/bundle_eu.properties | 1 + core/assets/bundles/bundle_fi.properties | 1 + core/assets/bundles/bundle_fil.properties | 1 + core/assets/bundles/bundle_fr.properties | 1 + core/assets/bundles/bundle_hu.properties | 1 + core/assets/bundles/bundle_id_ID.properties | 1 + core/assets/bundles/bundle_it.properties | 1 + core/assets/bundles/bundle_ja.properties | 1 + core/assets/bundles/bundle_ko.properties | 1 + core/assets/bundles/bundle_lt.properties | 1 + core/assets/bundles/bundle_nl.properties | 1 + core/assets/bundles/bundle_nl_BE.properties | 1 + core/assets/bundles/bundle_pl.properties | 1 + core/assets/bundles/bundle_pt_BR.properties | 1 + core/assets/bundles/bundle_pt_PT.properties | 1 + core/assets/bundles/bundle_ro.properties | 1 + core/assets/bundles/bundle_ru.properties | 1 + core/assets/bundles/bundle_sr.properties | 1 + core/assets/bundles/bundle_sv.properties | 1 + core/assets/bundles/bundle_th.properties | 1 + core/assets/bundles/bundle_tk.properties | 1 + core/assets/bundles/bundle_tr.properties | 1 + core/assets/bundles/bundle_uk_UA.properties | 1 + core/assets/bundles/bundle_vi.properties | 1 + core/assets/bundles/bundle_zh_CN.properties | 1 + core/assets/bundles/bundle_zh_TW.properties | 1 + 34 files changed, 34 insertions(+) diff --git a/core/assets/bundles/bundle_be.properties b/core/assets/bundles/bundle_be.properties index 8391022138..5b8ce1118a 100644 --- a/core/assets/bundles/bundle_be.properties +++ b/core/assets/bundles/bundle_be.properties @@ -2357,6 +2357,7 @@ unit.emanate.description = Builds structures to defend the Acropolis core. Repai lst.read = Read a number from a linked memory cell. lst.write = Write a number to a linked memory cell. lst.print = Add text to the print buffer.\nDoes not display anything until [accent]Print Flush[] is used. +lst.printchar = Add a UTF-16 character or content icon to the print buffer.\nDoes not display anything until [accent]Print Flush[] is used. lst.format = Replace next placeholder in text buffer with a value.\nDoes not do anything if placeholder pattern is invalid.\nPlaceholder pattern: "{[accent]number 0-9[]}"\nExample:\n[accent]print "test {0}"\nformat "example" lst.draw = Add an operation to the drawing buffer.\nDoes not display anything until [accent]Draw Flush[] is used. lst.drawflush = Flush queued [accent]Draw[] operations to a display. diff --git a/core/assets/bundles/bundle_bg.properties b/core/assets/bundles/bundle_bg.properties index 2e1268f675..7b03332eb6 100644 --- a/core/assets/bundles/bundle_bg.properties +++ b/core/assets/bundles/bundle_bg.properties @@ -2376,6 +2376,7 @@ unit.emanate.description = Строи сгради, за да защитава lst.read = Прочети число от свързано хранилище за памет. lst.write = Запиши число в свързано хранилище за памет. lst.print = Добави текст в буфера за изписване.\nНе визуализира нищо докато не използвате [accent]Print Flush[]. +lst.printchar = Add a UTF-16 character or content icon to the print buffer.\nDoes not display anything until [accent]Print Flush[] is used. lst.format = Replace next placeholder in text buffer with a value.\nDoes not do anything if placeholder pattern is invalid.\nPlaceholder pattern: "{[accent]number 0-9[]}"\nExample:\n[accent]print "test {0}"\nformat "example" lst.draw = Добавя операция в буфера за изображение.\nНе показва нищо докато не използвате [accent]Draw Flush[]. lst.drawflush = Изпълнява операции, поискани с команда [accent]Draw[] върху посочен дисплей. diff --git a/core/assets/bundles/bundle_ca.properties b/core/assets/bundles/bundle_ca.properties index 1a7ac3601f..56f1202c29 100644 --- a/core/assets/bundles/bundle_ca.properties +++ b/core/assets/bundles/bundle_ca.properties @@ -2381,6 +2381,7 @@ unit.emanate.description = Construeix estructures per defensar el nucli Acròpol lst.read = Llegeix un nombre des d’una cel·la de memòria connectada. lst.write = Escriu un nombre en una cel·la de memòria connectada. lst.print = Afegeix un text a la cua d’impressió.\nEl text no es mostrarà fins que s’apliqui «[accent]Print Flush[]». +lst.printchar = Add a UTF-16 character or content icon to the print buffer.\nDoes not display anything until [accent]Print Flush[] is used. lst.format = Reemplaça el següent marcador de posició a la cua d’impressió amb un valor.\nNo fa res si el patró del marcador no és vàlid.\nPatró del marcador: "{[accent]número 0-9[]}"\nExemple:\n[accent]print "test {0}"\nformat "example" lst.draw = Afegeix una instrucció de dibuix a la cua corresponent.\nEl resultat no es mostrarà fins que s’apliqui «[accent]Draw Flush[]». lst.drawflush = Executa les operacions de la cua de dibuix al monitor lògic. diff --git a/core/assets/bundles/bundle_cs.properties b/core/assets/bundles/bundle_cs.properties index 62d8684be3..b6bd6fdd0b 100644 --- a/core/assets/bundles/bundle_cs.properties +++ b/core/assets/bundles/bundle_cs.properties @@ -2376,6 +2376,7 @@ unit.emanate.description = Builds structures to defend the Acropolis core. Repai lst.read = Přečte číslo z připojené paměti. lst.write = Zapíše číslo do připojené paměti. lst.print = Přídá text do vypisovacího buferu.\nNezobrazí nic dokud [accent]Print Flush[] je použít. +lst.printchar = Add a UTF-16 character or content icon to the print buffer.\nDoes not display anything until [accent]Print Flush[] is used. lst.format = Replace next placeholder in text buffer with a value.\nDoes not do anything if placeholder pattern is invalid.\nPlaceholder pattern: "{[accent]number 0-9[]}"\nExample:\n[accent]print "test {0}"\nformat "example" lst.draw = Přídá operaci do vykreslovacího buferu.\nNezobrazí nic dokud [accent]Draw Flush[] je použít. lst.drawflush = Provede všechny [accent]Draw[] operace na zobrazovač logiky. Pak vyčistí vykreslovací bufer. diff --git a/core/assets/bundles/bundle_da.properties b/core/assets/bundles/bundle_da.properties index 96efe6520c..32725e1cae 100644 --- a/core/assets/bundles/bundle_da.properties +++ b/core/assets/bundles/bundle_da.properties @@ -2357,6 +2357,7 @@ unit.emanate.description = Builds structures to defend the Acropolis core. Repai lst.read = Read a number from a linked memory cell. lst.write = Write a number to a linked memory cell. lst.print = Add text to the print buffer.\nDoes not display anything until [accent]Print Flush[] is used. +lst.printchar = Add a UTF-16 character or content icon to the print buffer.\nDoes not display anything until [accent]Print Flush[] is used. lst.format = Replace next placeholder in text buffer with a value.\nDoes not do anything if placeholder pattern is invalid.\nPlaceholder pattern: "{[accent]number 0-9[]}"\nExample:\n[accent]print "test {0}"\nformat "example" lst.draw = Add an operation to the drawing buffer.\nDoes not display anything until [accent]Draw Flush[] is used. lst.drawflush = Flush queued [accent]Draw[] operations to a display. diff --git a/core/assets/bundles/bundle_de.properties b/core/assets/bundles/bundle_de.properties index f3b953a5fc..23d26e949e 100644 --- a/core/assets/bundles/bundle_de.properties +++ b/core/assets/bundles/bundle_de.properties @@ -2406,6 +2406,7 @@ unit.emanate.description = Baut Blöcke, um den Akropolis-Kern zu beschützen. H lst.read = Liest einen Wert aus einer verbundenen Speicherzelle. lst.write = Schreibt eine Zahl in einer verbundene Speicherzelle. lst.print = Fügt Text zum Textspeicher hinzu.\nZeigt nichts an, bis [accent]Print Flush[] verwendet wird. +lst.printchar = Add a UTF-16 character or content icon to the print buffer.\nDoes not display anything until [accent]Print Flush[] is used. lst.format = Replace next placeholder in text buffer with a value.\nDoes not do anything if placeholder pattern is invalid.\nPlaceholder pattern: "{[accent]number 0-9[]}"\nExample:\n[accent]print "test {0}"\nformat "example" lst.draw = Fügt eine [accent]Draw[]-Aufgabe zum Bildspeicher hinzu.\nZeigt nichts an, bis [accent]Draw Flush[] verwendet wird. lst.drawflush = Druckt [accent]Draw[]-Aufgaben aus dem Bildspeicher auf einen Bildschirm. diff --git a/core/assets/bundles/bundle_es.properties b/core/assets/bundles/bundle_es.properties index bce716f0b4..711be62ab8 100644 --- a/core/assets/bundles/bundle_es.properties +++ b/core/assets/bundles/bundle_es.properties @@ -2399,6 +2399,7 @@ unit.emanate.description = Construye estructuras para defender el núcleo Acropo lst.read = Lee un número desde una unidad de memoria conectada. lst.write = Escribe un número en una unidad de memoria conectada. lst.print = Añade texto a la cola para imprimir texto.\nNo mostrará nada hasta que se use [accent]Print Flush[]. +lst.printchar = Add a UTF-16 character or content icon to the print buffer.\nDoes not display anything until [accent]Print Flush[] is used. lst.format = Replace next placeholder in text buffer with a value.\nDoes not do anything if placeholder pattern is invalid.\nPlaceholder pattern: "{[accent]number 0-9[]}"\nExample:\n[accent]print "test {0}"\nformat "example" lst.draw = Añade una operación a la cola para dibujar.\nNo mostrará nada hasta que se use [accent]Draw Flush[]. lst.drawflush = Muestra los datos en cola de operaciones [accent]Draw[] en un monitor gráfico. diff --git a/core/assets/bundles/bundle_et.properties b/core/assets/bundles/bundle_et.properties index b081b166f8..47ab3a7027 100644 --- a/core/assets/bundles/bundle_et.properties +++ b/core/assets/bundles/bundle_et.properties @@ -2359,6 +2359,7 @@ unit.emanate.description = Builds structures to defend the Acropolis core. Repai lst.read = Read a number from a linked memory cell. lst.write = Write a number to a linked memory cell. lst.print = Add text to the print buffer.\nDoes not display anything until [accent]Print Flush[] is used. +lst.printchar = Add a UTF-16 character or content icon to the print buffer.\nDoes not display anything until [accent]Print Flush[] is used. lst.format = Replace next placeholder in text buffer with a value.\nDoes not do anything if placeholder pattern is invalid.\nPlaceholder pattern: "{[accent]number 0-9[]}"\nExample:\n[accent]print "test {0}"\nformat "example" lst.draw = Add an operation to the drawing buffer.\nDoes not display anything until [accent]Draw Flush[] is used. lst.drawflush = Flush queued [accent]Draw[] operations to a display. diff --git a/core/assets/bundles/bundle_eu.properties b/core/assets/bundles/bundle_eu.properties index 25308df198..9d31b681f4 100644 --- a/core/assets/bundles/bundle_eu.properties +++ b/core/assets/bundles/bundle_eu.properties @@ -2361,6 +2361,7 @@ unit.emanate.description = Builds structures to defend the Acropolis core. Repai lst.read = Read a number from a linked memory cell. lst.write = Write a number to a linked memory cell. lst.print = Add text to the print buffer.\nDoes not display anything until [accent]Print Flush[] is used. +lst.printchar = Add a UTF-16 character or content icon to the print buffer.\nDoes not display anything until [accent]Print Flush[] is used. lst.format = Replace next placeholder in text buffer with a value.\nDoes not do anything if placeholder pattern is invalid.\nPlaceholder pattern: "{[accent]number 0-9[]}"\nExample:\n[accent]print "test {0}"\nformat "example" lst.draw = Add an operation to the drawing buffer.\nDoes not display anything until [accent]Draw Flush[] is used. lst.drawflush = Flush queued [accent]Draw[] operations to a display. diff --git a/core/assets/bundles/bundle_fi.properties b/core/assets/bundles/bundle_fi.properties index 1d5dbd0e6e..97507f51b9 100644 --- a/core/assets/bundles/bundle_fi.properties +++ b/core/assets/bundles/bundle_fi.properties @@ -2362,6 +2362,7 @@ unit.emanate.description = Builds structures to defend the Acropolis core. Repai lst.read = Lue numero yhdistetystä muistisolusta. lst.write = Kirjoita numero yhdistettyyn muistisoluun. lst.print = Lisää tekstiä tekstipuskuriin.\nEi näytä mitään, kunnes [accent]Painosyötettä[] käytetään. +lst.printchar = Add a UTF-16 character or content icon to the print buffer.\nDoes not display anything until [accent]Print Flush[] is used. lst.format = Replace next placeholder in text buffer with a value.\nDoes not do anything if placeholder pattern is invalid.\nPlaceholder pattern: "{[accent]number 0-9[]}"\nExample:\n[accent]print "test {0}"\nformat "example" lst.draw = Lisää operaation piirtopuskuriin.\nEi näytä mitään, kunnes [accent]Piirtosyötettä[] käytetään. lst.drawflush = Syöttää jonottavat [accent]Piirto[]-operaatiot näyttöön. diff --git a/core/assets/bundles/bundle_fil.properties b/core/assets/bundles/bundle_fil.properties index b69c12f5b4..b1b9cf2f2c 100644 --- a/core/assets/bundles/bundle_fil.properties +++ b/core/assets/bundles/bundle_fil.properties @@ -2358,6 +2358,7 @@ unit.emanate.description = Builds structures to defend the Acropolis core. Repai lst.read = Read a number from a linked memory cell. lst.write = Write a number to a linked memory cell. lst.print = Add text to the print buffer.\nDoes not display anything until [accent]Print Flush[] is used. +lst.printchar = Add a UTF-16 character or content icon to the print buffer.\nDoes not display anything until [accent]Print Flush[] is used. lst.format = Replace next placeholder in text buffer with a value.\nDoes not do anything if placeholder pattern is invalid.\nPlaceholder pattern: "{[accent]number 0-9[]}"\nExample:\n[accent]print "test {0}"\nformat "example" lst.draw = Add an operation to the drawing buffer.\nDoes not display anything until [accent]Draw Flush[] is used. lst.drawflush = Flush queued [accent]Draw[] operations to a display. diff --git a/core/assets/bundles/bundle_fr.properties b/core/assets/bundles/bundle_fr.properties index b8e6a3d4fe..7122cdc48e 100644 --- a/core/assets/bundles/bundle_fr.properties +++ b/core/assets/bundles/bundle_fr.properties @@ -2406,6 +2406,7 @@ unit.emanate.description = Construit des structures pour défendre le Noyau acro lst.read = Lit un nombre depuis un bloc de mémoire relié au processeur. lst.write = Écrit un nombre dans un bloc de mémoire relié au processeur. lst.print = Ajoute du texte dans la mémoire tampon de l'imprimante.\nNe montrera aucun texte tant que [accent]Print Flush[] ne sera pas utilisé. +lst.printchar = Add a UTF-16 character or content icon to the print buffer.\nDoes not display anything until [accent]Print Flush[] is used. lst.format = Replace next placeholder in text buffer with a value.\nDoes not do anything if placeholder pattern is invalid.\nPlaceholder pattern: "{[accent]number 0-9[]}"\nExample:\n[accent]print "test {0}"\nformat "example" lst.draw = Ajoute une opération dans la mémoire tampon de dessin.\nNe montrera aucune image tant que [accent]Draw Flush[] ne sera pas utilisé. lst.drawflush = Affiche les opérations [accent]Draw[] en file d'attente vers un écran. diff --git a/core/assets/bundles/bundle_hu.properties b/core/assets/bundles/bundle_hu.properties index d234f4ab85..45f55965d5 100644 --- a/core/assets/bundles/bundle_hu.properties +++ b/core/assets/bundles/bundle_hu.properties @@ -2414,6 +2414,7 @@ unit.emanate.description = Az Akropolisz védelmére szolgáló építményeket lst.read = Szám kiolvasása egy összekapcsolt memóriacellából. lst.write = Szám beírása egy összekapcsolt memóriacellába. lst.print = Szöveg hozzáadása a kiírási pufferhez.\nA [accent]Print Flush[] használatáig nem jelenít meg semmit. +lst.printchar = Add a UTF-16 character or content icon to the print buffer.\nDoes not display anything until [accent]Print Flush[] is used. lst.format = A szövegpufferben lévő következő helyőrző cseréje egy értékre.\nNem csinál semmit, ha a helyőrzőminta érvénytelen.\nHelyőrzőminta: „{[accent]number 0-9[]}”\nPélda:\n[accent]print „test {0}”\nformat „example” lst.draw = Művelet hozzáadása a rajzpufferhez.\nA [accent]Draw Flush[] használatáig nem jelenít meg semmit. lst.drawflush = Sorba állított [accent]Draw[] műveletek megjelenítése a kijelzőn. diff --git a/core/assets/bundles/bundle_id_ID.properties b/core/assets/bundles/bundle_id_ID.properties index 452a3ad2ee..cd954991a3 100644 --- a/core/assets/bundles/bundle_id_ID.properties +++ b/core/assets/bundles/bundle_id_ID.properties @@ -2410,6 +2410,7 @@ unit.emanate.description = Membangun struktur untuk melindungi inti Acropolis. M lst.read = Membaca angka dari memori sel yang dihubungkan. lst.write = Menulis angka ke memori sel yang dihubungkan. lst.print = Menambahkan teks ke daftar cetak.\nTidak dapat menampilkan apapun sampai [accent]Print Flush[] dipakai. +lst.printchar = Add a UTF-16 character or content icon to the print buffer.\nDoes not display anything until [accent]Print Flush[] is used. 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.drawflush = Mengeluarkan perintah [accent]Draw[] dari daftar antrean untuk ditampilkan. diff --git a/core/assets/bundles/bundle_it.properties b/core/assets/bundles/bundle_it.properties index 82aae1013d..6b3c930041 100644 --- a/core/assets/bundles/bundle_it.properties +++ b/core/assets/bundles/bundle_it.properties @@ -2371,6 +2371,7 @@ unit.emanate.description = Costruisce strutture per difendere il nucleo dell'Acr lst.read = Leggi un numero da una cella di memoria collegata. lst.write = Scrivi un numero in una cella di memoria collegata. lst.print = Add text to the print buffer.\nDoes not display anything until [accent]Print Flush[] is used. +lst.printchar = Add a UTF-16 character or content icon to the print buffer.\nDoes not display anything until [accent]Print Flush[] is used. lst.format = Replace next placeholder in text buffer with a value.\nDoes not do anything if placeholder pattern is invalid.\nPlaceholder pattern: "{[accent]number 0-9[]}"\nExample:\n[accent]print "test {0}"\nformat "example" lst.draw = Add an operation to the drawing buffer.\nDoes not display anything until [accent]Draw Flush[] is used. lst.drawflush = Flush queued [accent]Draw[] operations to a display. diff --git a/core/assets/bundles/bundle_ja.properties b/core/assets/bundles/bundle_ja.properties index f166d59478..81ff4def97 100644 --- a/core/assets/bundles/bundle_ja.properties +++ b/core/assets/bundles/bundle_ja.properties @@ -2375,6 +2375,7 @@ unit.emanate.description = アクロポリスコアを敵から守ります。\n lst.read = リンクされたメモリセルから数値を読み取ります。 lst.write = リンクされたメモリセルに数値を書き込みます。 lst.print = メッセージブロックにテキストを追加します。[accent]Print Flush[] を使用するまで何も表示しません。 +lst.printchar = Add a UTF-16 character or content icon to the print buffer.\nDoes not display anything until [accent]Print Flush[] is used. lst.format = Replace next placeholder in text buffer with a value.\nDoes not do anything if placeholder pattern is invalid.\nPlaceholder pattern: "{[accent]number 0-9[]}"\nExample:\n[accent]print "test {0}"\nformat "example" lst.draw = ロジックディスプレイに操作を追加します。[accent]Draw Flush[] を使用するまで何も表示しません。 lst.drawflush = キューに入れられた [accent]Draw[] 操作をディスプレイにフラッシュします。 diff --git a/core/assets/bundles/bundle_ko.properties b/core/assets/bundles/bundle_ko.properties index 17383dfa23..b44e339067 100644 --- a/core/assets/bundles/bundle_ko.properties +++ b/core/assets/bundles/bundle_ko.properties @@ -2413,6 +2413,7 @@ unit.emanate.description = 코어: 도심을 지켜내기 위해 구조물을 lst.read = 연결된 메모리 셀에서 숫자를 읽습니다. lst.write = 연결된 메모리 셀에 숫자를 작성합니다. lst.print = 프린트 버퍼에 텍스트를 추가합니다.\n[accent]Print Flush[]가 사용되기 전까진 아무것도 보여주지 않습니다. +lst.printchar = Add a UTF-16 character or content icon to the print buffer.\nDoes not display anything until [accent]Print Flush[] is used. lst.format = 텍스트 버퍼의 다음 플레이스홀더를 값으로 바꿉니다.\n자리 표시자 패턴이 유효하지 않은 경우 아무것도 하지 않습니다.\n플레이스홀더 패턴: "{[accent]number 0-9[]}"\n예:\n[accent]print "test {0}"\nformat "example" lst.draw = 드로잉 버퍼에 실행문을 추가합니다.\n[accent]Draw Flush[]가 사용되기 전까진 아무것도 보여주지 않습니다. lst.drawflush = 대기중인 [accent]Draw[]실행문을 디스플레이에 출력합니다. diff --git a/core/assets/bundles/bundle_lt.properties b/core/assets/bundles/bundle_lt.properties index d5cdbe47e9..9a94770619 100644 --- a/core/assets/bundles/bundle_lt.properties +++ b/core/assets/bundles/bundle_lt.properties @@ -2359,6 +2359,7 @@ unit.emanate.description = Builds structures to defend the Acropolis core. Repai lst.read = Read a number from a linked memory cell. lst.write = Write a number to a linked memory cell. lst.print = Add text to the print buffer.\nDoes not display anything until [accent]Print Flush[] is used. +lst.printchar = Add a UTF-16 character or content icon to the print buffer.\nDoes not display anything until [accent]Print Flush[] is used. lst.format = Replace next placeholder in text buffer with a value.\nDoes not do anything if placeholder pattern is invalid.\nPlaceholder pattern: "{[accent]number 0-9[]}"\nExample:\n[accent]print "test {0}"\nformat "example" lst.draw = Add an operation to the drawing buffer.\nDoes not display anything until [accent]Draw Flush[] is used. lst.drawflush = Flush queued [accent]Draw[] operations to a display. diff --git a/core/assets/bundles/bundle_nl.properties b/core/assets/bundles/bundle_nl.properties index defc3e09b8..186e08fc8b 100644 --- a/core/assets/bundles/bundle_nl.properties +++ b/core/assets/bundles/bundle_nl.properties @@ -2372,6 +2372,7 @@ unit.emanate.description = Builds structures to defend the Acropolis core. Repai lst.read = Read a number from a linked memory cell. lst.write = Write a number to a linked memory cell. lst.print = Add text to the print buffer.\nDoes not display anything until [accent]Print Flush[] is used. +lst.printchar = Add a UTF-16 character or content icon to the print buffer.\nDoes not display anything until [accent]Print Flush[] is used. lst.format = Replace next placeholder in text buffer with a value.\nDoes not do anything if placeholder pattern is invalid.\nPlaceholder pattern: "{[accent]number 0-9[]}"\nExample:\n[accent]print "test {0}"\nformat "example" lst.draw = Add an operation to the drawing buffer.\nDoes not display anything until [accent]Draw Flush[] is used. lst.drawflush = Flush queued [accent]Draw[] operations to a display. diff --git a/core/assets/bundles/bundle_nl_BE.properties b/core/assets/bundles/bundle_nl_BE.properties index 08ee9bd989..51ed4e28d1 100644 --- a/core/assets/bundles/bundle_nl_BE.properties +++ b/core/assets/bundles/bundle_nl_BE.properties @@ -2359,6 +2359,7 @@ unit.emanate.description = Builds structures to defend the Acropolis core. Repai lst.read = Read a number from a linked memory cell. lst.write = Write a number to a linked memory cell. lst.print = Add text to the print buffer.\nDoes not display anything until [accent]Print Flush[] is used. +lst.printchar = Add a UTF-16 character or content icon to the print buffer.\nDoes not display anything until [accent]Print Flush[] is used. lst.format = Replace next placeholder in text buffer with a value.\nDoes not do anything if placeholder pattern is invalid.\nPlaceholder pattern: "{[accent]number 0-9[]}"\nExample:\n[accent]print "test {0}"\nformat "example" lst.draw = Add an operation to the drawing buffer.\nDoes not display anything until [accent]Draw Flush[] is used. lst.drawflush = Flush queued [accent]Draw[] operations to a display. diff --git a/core/assets/bundles/bundle_pl.properties b/core/assets/bundles/bundle_pl.properties index 2b6dca0aca..8b34224701 100644 --- a/core/assets/bundles/bundle_pl.properties +++ b/core/assets/bundles/bundle_pl.properties @@ -2393,6 +2393,7 @@ unit.emanate.description = Lotnicza jednostka aministracyjna zdolna do wydobycia lst.read = Wczytuje liczbę z połączonej komórki pamięci. lst.write = Zapisuje liczbę do połączonej komórki pamięci. lst.print = Dodaje tekst do buforu drukującego.\nNie wyświetla niczego dopóki [accent]Print Flush[] nie jest użyte. +lst.printchar = Add a UTF-16 character or content icon to the print buffer.\nDoes not display anything until [accent]Print Flush[] is used. lst.format = Replace next placeholder in text buffer with a value.\nDoes not do anything if placeholder pattern is invalid.\nPlaceholder pattern: "{[accent]number 0-9[]}"\nExample:\n[accent]print "test {0}"\nformat "example" lst.draw = Dodaje operacje do buforu rysującego.\nNie wyświetla niczego dopóki [accent]Draw Flush[] nie jest użyte. lst.drawflush = Wyświetla oczekujące operacje z funkcji [accent]Draw[] na wyświetlaczu. diff --git a/core/assets/bundles/bundle_pt_BR.properties b/core/assets/bundles/bundle_pt_BR.properties index 28c69ab00d..fc913d8f69 100644 --- a/core/assets/bundles/bundle_pt_BR.properties +++ b/core/assets/bundles/bundle_pt_BR.properties @@ -2392,6 +2392,7 @@ unit.emanate.description = Constrói estruturas para defender o Núcelo Acrópol lst.read = Ler um número de uma célula de memória vinculada. lst.write = Escrever um número de uma célula de memória vinculada. lst.print = Adiciona texto ao buffer de impressão.\nNão exibe nada até [accent]Print Flush[] ser usado. +lst.printchar = Add a UTF-16 character or content icon to the print buffer.\nDoes not display anything until [accent]Print Flush[] is used. lst.format = Replace next placeholder in text buffer with a value.\nDoes not do anything if placeholder pattern is invalid.\nPlaceholder pattern: "{[accent]number 0-9[]}"\nExample:\n[accent]print "test {0}"\nformat "example" lst.draw = Adicionar uma operação ao buffer de desenho.\nNão exibe nada até [accent]Draw Flush[] ser usado. lst.drawflush = Liberar operações [accent]Draw[] enfileiradas para um display. diff --git a/core/assets/bundles/bundle_pt_PT.properties b/core/assets/bundles/bundle_pt_PT.properties index 89b11b9cdc..55506c09f5 100644 --- a/core/assets/bundles/bundle_pt_PT.properties +++ b/core/assets/bundles/bundle_pt_PT.properties @@ -2423,6 +2423,7 @@ unit.emanate.description = Constrói estruturas para defender o Núcelo Acrópol lst.read = Ler um número de uma célula de memória vinculada. lst.write = Escrever um número de uma célula de memória vinculada. lst.print = Adiciona texto ao buffer de impressão.\nNão exibe nada até [accent]Print Flush[] ser usado. +lst.printchar = Add a UTF-16 character or content icon to the print buffer.\nDoes not display anything until [accent]Print Flush[] is used. lst.format = Replace next placeholder in text buffer with a value.\nDoes not do anything if placeholder pattern is invalid.\nPlaceholder pattern: "{[accent]number 0-9[]}"\nExample:\n[accent]print "test {0}"\nformat "example" lst.draw = Adicionar uma operação ao buffer de desenho.\nNão exibe nada até [accent]Draw Flush[] ser usado. lst.drawflush = Liberar operações [accent]Draw[] enfileiradas para um display. diff --git a/core/assets/bundles/bundle_ro.properties b/core/assets/bundles/bundle_ro.properties index 4cee1988ef..e45dee5ea5 100644 --- a/core/assets/bundles/bundle_ro.properties +++ b/core/assets/bundles/bundle_ro.properties @@ -2376,6 +2376,7 @@ unit.emanate.description = Builds structures to defend the Acropolis core. Repai lst.read = Citește un număr dintr-o celulă de memorie conectată. lst.write = Scrie un număr într-o celulă de memorie conectată. lst.print = Adaugă text în bufferul de tipărire.\nNu tipărește decât când se execută [accent]Print Flush[]. +lst.printchar = Add a UTF-16 character or content icon to the print buffer.\nDoes not display anything until [accent]Print Flush[] is used. lst.format = Replace next placeholder in text buffer with a value.\nDoes not do anything if placeholder pattern is invalid.\nPlaceholder pattern: "{[accent]number 0-9[]}"\nExample:\n[accent]print "test {0}"\nformat "example" lst.draw = Adaugă o operație în bufferul de desenare.\nNu afișează decât când se execută [accent]Draw Flush[]. lst.drawflush = Afișează pe un monitor instrucțiunile [accent]Draw[] aflate în așteptare. diff --git a/core/assets/bundles/bundle_ru.properties b/core/assets/bundles/bundle_ru.properties index e846304538..10490a64d1 100644 --- a/core/assets/bundles/bundle_ru.properties +++ b/core/assets/bundles/bundle_ru.properties @@ -2378,6 +2378,7 @@ unit.emanate.description = Защищает ядро «Акрополь» от lst.read = Считывает число из соединённой ячейки памяти. lst.write = Записывает число в соединённую ячейку памяти. lst.print = Добавляет текст в текстовый буфер. Ничего не отображает, пока не будет вызван [accent]Print Flush[]. +lst.printchar = Add a UTF-16 character or content icon to the print buffer.\nDoes not display anything until [accent]Print Flush[] is used. lst.format = Replace next placeholder in text buffer with a value.\nDoes not do anything if placeholder pattern is invalid.\nPlaceholder pattern: "{[accent]number 0-9[]}"\nExample:\n[accent]print "test {0}"\nformat "example" lst.draw = Добавляет операцию в буфер отрисовки. Ничего не отображает, пока не будет вызван [accent]Draw Flush[]. lst.drawflush = Сбрасывает буфер [accent]Draw[] операций на дисплей. diff --git a/core/assets/bundles/bundle_sr.properties b/core/assets/bundles/bundle_sr.properties index efbe41352c..c424a5bb57 100644 --- a/core/assets/bundles/bundle_sr.properties +++ b/core/assets/bundles/bundle_sr.properties @@ -2379,6 +2379,7 @@ unit.emanate.description = Gradi građevine da odbrani Veliki Grad jezgro. Popra lst.read = Čita broj iz povezane memorijske ćelije. lst.write = Piše broj u povezanu memorijsku ćeliju. lst.print = Add text to the print buffer.\nDoes not display anything until [accent]Print Flush[] is used. +lst.printchar = Add a UTF-16 character or content icon to the print buffer.\nDoes not display anything until [accent]Print Flush[] is used. lst.format = Replace next placeholder in text buffer with a value.\nDoes not do anything if placeholder pattern is invalid.\nPlaceholder pattern: "{[accent]number 0-9[]}"\nExample:\n[accent]print "test {0}"\nformat "example" lst.draw = Add an operation to the drawing buffer.\nDoes not display anything until [accent]Draw Flush[] is used. lst.drawflush = Flush queued [accent]Draw[] operations to a display. diff --git a/core/assets/bundles/bundle_sv.properties b/core/assets/bundles/bundle_sv.properties index 9eabb3ec2c..cdf950fc3e 100644 --- a/core/assets/bundles/bundle_sv.properties +++ b/core/assets/bundles/bundle_sv.properties @@ -2359,6 +2359,7 @@ unit.emanate.description = Builds structures to defend the Acropolis core. Repai lst.read = Read a number from a linked memory cell. lst.write = Write a number to a linked memory cell. lst.print = Add text to the print buffer.\nDoes not display anything until [accent]Print Flush[] is used. +lst.printchar = Add a UTF-16 character or content icon to the print buffer.\nDoes not display anything until [accent]Print Flush[] is used. lst.format = Replace next placeholder in text buffer with a value.\nDoes not do anything if placeholder pattern is invalid.\nPlaceholder pattern: "{[accent]number 0-9[]}"\nExample:\n[accent]print "test {0}"\nformat "example" lst.draw = Add an operation to the drawing buffer.\nDoes not display anything until [accent]Draw Flush[] is used. lst.drawflush = Flush queued [accent]Draw[] operations to a display. diff --git a/core/assets/bundles/bundle_th.properties b/core/assets/bundles/bundle_th.properties index ced7b5098e..8207d0e70f 100644 --- a/core/assets/bundles/bundle_th.properties +++ b/core/assets/bundles/bundle_th.properties @@ -2393,6 +2393,7 @@ unit.emanate.description = สร้างสิ่งต่างๆ เพื lst.read = อ่านเลขจากเซลล์ความจำที่เชื่อมต่อไว้ lst.write = เขียนเลขไปยังเซลล์ความจำที่เชื่อมต่อไว้ lst.print = เพิ่มข้อความไปยังคิวข้อความ\nข้อความจะยังไม่แสดงจนกว่าจะใช้คำสั่ง [accent]Print Flush[] +lst.printchar = Add a UTF-16 character or content icon to the print buffer.\nDoes not display anything until [accent]Print Flush[] is used. lst.format = แทนที่ข้อความตัวแทนถัดไปในบัฟเฟอร์ข้อความด้วยค่า\nจะไม่ทำอะไรหากรูปแบบข้อความแทนที่นั้นไม่ถูกต้อง\nรูปแบบข้อความแทนที่: "{[accent]ตัวเลข 0-9[]}"\nตัวอย่าง:\n[accent]print "ทดสอบ {0}"\nformat "สวัสดี" lst.draw = เพิ่มรูปไปยังคิวการวาด\nภาพจะยังไม่แสดงจนกว่าจะใช้คำสั่ง [accent]Draw Flush[] lst.drawflush = ปล่อยคิว [accent]Draw[] ไปยังหน้าจอลอจิกที่เชื่อมต่อไว้ diff --git a/core/assets/bundles/bundle_tk.properties b/core/assets/bundles/bundle_tk.properties index 4ab70450ea..2fd905c84f 100644 --- a/core/assets/bundles/bundle_tk.properties +++ b/core/assets/bundles/bundle_tk.properties @@ -2359,6 +2359,7 @@ unit.emanate.description = Builds structures to defend the Acropolis core. Repai lst.read = Read a number from a linked memory cell. lst.write = Write a number to a linked memory cell. lst.print = Add text to the print buffer.\nDoes not display anything until [accent]Print Flush[] is used. +lst.printchar = Add a UTF-16 character or content icon to the print buffer.\nDoes not display anything until [accent]Print Flush[] is used. lst.format = Replace next placeholder in text buffer with a value.\nDoes not do anything if placeholder pattern is invalid.\nPlaceholder pattern: "{[accent]number 0-9[]}"\nExample:\n[accent]print "test {0}"\nformat "example" lst.draw = Add an operation to the drawing buffer.\nDoes not display anything until [accent]Draw Flush[] is used. lst.drawflush = Flush queued [accent]Draw[] operations to a display. diff --git a/core/assets/bundles/bundle_tr.properties b/core/assets/bundles/bundle_tr.properties index 931526a0ac..eb63b20c74 100644 --- a/core/assets/bundles/bundle_tr.properties +++ b/core/assets/bundles/bundle_tr.properties @@ -2376,6 +2376,7 @@ unit.emanate.description = Akropolis Merkezini korumak için binalar inşa eder. lst.read = Bağlı hafıza kutusundaki numarayı okur. lst.write = Bağlı hafıza kutuaundaki numaraya yazar. lst.print = Yazı yazar. +lst.printchar = Add a UTF-16 character or content icon to the print buffer.\nDoes not display anything until [accent]Print Flush[] is used. lst.format = Replace next placeholder in text buffer with a value.\nDoes not do anything if placeholder pattern is invalid.\nPlaceholder pattern: "{[accent]number 0-9[]}"\nExample:\n[accent]print "test {0}"\nformat "example" lst.draw = Ekrana Çizer. lst.drawflush = Ekrana Çizimi Aktarır. diff --git a/core/assets/bundles/bundle_uk_UA.properties b/core/assets/bundles/bundle_uk_UA.properties index 6225820c44..efd52e19e1 100644 --- a/core/assets/bundles/bundle_uk_UA.properties +++ b/core/assets/bundles/bundle_uk_UA.properties @@ -2403,6 +2403,7 @@ unit.emanate.description = Англійська назва: Emanate\nБудує lst.read = Зчитує число із з’єднаної комірки пам’яті. lst.write = Записує числу у з’єднану комірку пам’яті. lst.print = Додайте текст до буфера друку.\nНічого не відображає, поки [accent]Print Flush[] використовується. +lst.printchar = Add a UTF-16 character or content icon to the print buffer.\nDoes not display anything until [accent]Print Flush[] is used. lst.format = Замінити наступний замінник у текстовому буфері значенням.\nНе робить нічого, якщо шаблон заповнювача є недійсним.\nШаблон заповнювача: "{[accent]number 0-9[]}"\nПриклад:\n[accent]print "test {0}"\nformat "example" lst.draw = Додає операцію до буфера рисунка.\nНічого не відображає, поки [accent]Draw Flush[] використовується. lst.drawflush = Скидає буфер операцій [accent]Draw[] на дисплей. diff --git a/core/assets/bundles/bundle_vi.properties b/core/assets/bundles/bundle_vi.properties index d6d45d4add..5b5b887d03 100644 --- a/core/assets/bundles/bundle_vi.properties +++ b/core/assets/bundles/bundle_vi.properties @@ -2414,6 +2414,7 @@ unit.emanate.description = Xây công trình để phòng thủ lõi Đại đô lst.read = Đọc một số từ bộ nhớ được liên kết. lst.write = Ghi một số vào bộ nhớ được liên kết. lst.print = Thêm văn bản vào bộ đệm in.\nKhông hiển thị gì cho đến khi [accent]Print Flush[] được sử dụng. +lst.printchar = Add a UTF-16 character or content icon to the print buffer.\nDoes not display anything until [accent]Print Flush[] is used. lst.format = Thay thế từ giữ chỗ tiếp theo trong bộ đệm văn bản bằng giá trị.\nKhông làm gì nếu khuôn mẫu từ giữ chỗ không hợp lệ.\nKhuôn mẫu từ giữ chỗ: "{[accent]số 0-9[]}"\nVí dụ:\n[accent]print "ví dụ {0}"\nformat "mẫu" lst.draw = Thêm một thao tác vào bộ đệm vẽ.\nKhông hiển thị gì cho đến khi [accent]Draw Flush[] được sử dụng. lst.drawflush = Đẩy các thao tác [accent]Draw[] theo trình tự đến màn hình. diff --git a/core/assets/bundles/bundle_zh_CN.properties b/core/assets/bundles/bundle_zh_CN.properties index 2a2d397d1c..e6edaeab3b 100644 --- a/core/assets/bundles/bundle_zh_CN.properties +++ b/core/assets/bundles/bundle_zh_CN.properties @@ -2403,6 +2403,7 @@ unit.emanate.description = 保护卫城核心,可建造建筑。 使用一对 lst.read = 从连接的内存读取数字 lst.write = 向连接的内存写入数字 lst.print = 添加文字到打印缓存\n使用[accent]Print Flush[]后才会真正显示 +lst.printchar = Add a UTF-16 character or content icon to the print buffer.\nDoes not display anything until [accent]Print Flush[] is used. lst.format = Replace next placeholder in text buffer with a value.\nDoes not do anything if placeholder pattern is invalid.\nPlaceholder pattern: "{[accent]number 0-9[]}"\nExample:\n[accent]print "test {0}"\nformat "example" lst.draw = 添加绘图操作到绘图缓存\n使用[accent]Draw Flush[]后才会真正显示 lst.drawflush = 将绘图缓存中的[accent]Draw[]队列刷新到显示屏 diff --git a/core/assets/bundles/bundle_zh_TW.properties b/core/assets/bundles/bundle_zh_TW.properties index cb2d507882..b66f15782b 100644 --- a/core/assets/bundles/bundle_zh_TW.properties +++ b/core/assets/bundles/bundle_zh_TW.properties @@ -2388,6 +2388,7 @@ unit.emanate.description = Builds structures to defend the Acropolis core. Repai lst.read = [accent]讀取[]記憶體中的一項數值 lst.write = [accent]寫入[]一項數值到記憶體中 lst.print = 將文字加入輸出的暫存中,搭配[accent]Print Flush[], [accent]Flush message[]使用 +lst.printchar = Add a UTF-16 character or content icon to the print buffer.\nDoes not display anything until [accent]Print Flush[] is used. lst.format = Replace next placeholder in text buffer with a value.\nDoes not do anything if placeholder pattern is invalid.\nPlaceholder pattern: "{[accent]number 0-9[]}"\nExample:\n[accent]print "test {0}"\nformat "example" lst.draw = 將圖形加入顯示的暫存中,搭配[accent]Draw Flush[]使用 lst.drawflush = 將所有暫存的[accent]Draw[]指令推到顯示器上 From 59b58f1645ae719061796cb074b9030abb6c8447 Mon Sep 17 00:00:00 2001 From: Frolonov <81882506+Frolonov@users.noreply.github.com> Date: Tue, 4 Feb 2025 19:42:05 -0500 Subject: [PATCH 169/460] Malign balancing (#10449) * Malign balancing Significantly reduce resources to build to maintain Malign's value ( build time remains long enough ) while units and turrets with new ammo could be much more cost effective than building Malign with its original requirement. Slightly reduce heat consumption & offset by increasing power consumption because power would be more than abundant in late game but heat cannot be further condensed into smaller space, Malign need to gain some space efficiency. Reload & range improvement to match turrets with new ammo in terms of space efficiency. Much quicker warm up, less spread by shootSummon pattern to offer better missile defense ability. * Update Blocks.java --- core/src/mindustry/content/Blocks.java | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/core/src/mindustry/content/Blocks.java b/core/src/mindustry/content/Blocks.java index f5770b55e7..935fafce0f 100644 --- a/core/src/mindustry/content/Blocks.java +++ b/core/src/mindustry/content/Blocks.java @@ -5502,7 +5502,7 @@ public class Blocks{ }}; malign = new PowerTurret("malign"){{ - requirements(Category.turret, with(Items.carbide, 400, Items.beryllium, 2000, Items.silicon, 800, Items.graphite, 800, Items.phaseFabric, 300)); + requirements(Category.turret, with(Items.carbide, 200, Items.beryllium, 1000, Items.silicon, 500, Items.graphite, 500, Items.phaseFabric, 200)); var haloProgress = PartProgress.warmup; Color haloColor = Color.valueOf("d370d3"), heatCol = Color.purple; @@ -5810,26 +5810,26 @@ public class Blocks{ }}; velocityRnd = 0.15f; - heatRequirement = 90f; + heatRequirement = 72f; maxHeatEfficiency = 2f; warmupMaintainTime = 120f; - consumePower(10f); - - shoot = new ShootSummon(0f, 0f, circleRad, 48f); + consumePower(40f); + unitSort = UnitSorts.strongest; + shoot = new ShootSummon(0f, 0f, circleRad, 20f); minWarmup = 0.96f; - shootWarmupSpeed = 0.03f; + shootWarmupSpeed = 0.08f; shootY = circleY - 5f; outlineColor = Pal.darkOutline; envEnabled |= Env.space; - reload = 9f; - range = 370; + reload = 7f; + range = 380; trackingRange = range * 1.4f; shootCone = 100f; scaledHealth = 370; - rotateSpeed = 2f; + rotateSpeed = 2.6f; recoil = 0.5f; recoilTime = 30f; shake = 3f; From 574ae0bfb1e8e3a0f20a34a6676b69b0926a4f87 Mon Sep 17 00:00:00 2001 From: Anuken Date: Tue, 4 Feb 2025 20:40:31 -0500 Subject: [PATCH 170/460] Make liquid production blocks dump as much output as possible --- .../mindustry/entities/comp/BuildingComp.java | 60 +++++++++++++++---- .../world/blocks/liquid/LiquidBridge.java | 2 +- .../world/blocks/liquid/LiquidRouter.java | 4 +- .../blocks/production/GenericCrafter.java | 2 +- 4 files changed, 53 insertions(+), 15 deletions(-) diff --git a/core/src/mindustry/entities/comp/BuildingComp.java b/core/src/mindustry/entities/comp/BuildingComp.java index 722fad3542..408e357c83 100644 --- a/core/src/mindustry/entities/comp/BuildingComp.java +++ b/core/src/mindustry/entities/comp/BuildingComp.java @@ -52,7 +52,7 @@ abstract class BuildingComp implements Posc, Teamc, Healthc, Buildingc, Timerc, //region vars and initialization static final float timeToSleep = 60f * 1, recentDamageTime = 60f * 5f; static final ObjectSet tmpTiles = new ObjectSet<>(); - static final Seq tempBuilds = new Seq<>(); + static final Seq tempBuilds = new Seq<>(Building.class); static final BuildTeamChangeEvent teamChangeEvent = new BuildTeamChangeEvent(); static final BuildDamageEvent bulletDamageEvent = new BuildDamageEvent(); static int sleepingEntities = 0; @@ -827,26 +827,66 @@ abstract class BuildingComp implements Posc, Teamc, Healthc, Buildingc, Timerc, //TODO entire liquid system is awful public void dumpLiquid(Liquid liquid){ - dumpLiquid(liquid, 2f); - } - - public void dumpLiquid(Liquid liquid, float scaling){ - dumpLiquid(liquid, scaling, -1); + dumpLiquid(liquid, -1); } /** @param outputDir output liquid direction relative to rotation, or -1 to use any direction. */ - public void dumpLiquid(Liquid liquid, float scaling, int outputDir){ - int dump = this.cdump; + public void dumpLiquid(Liquid liquid, int outputDir){ + float amount = liquids.get(liquid); + if(amount <= 0.0001f) return; + + if(!net.client() && state.isCampaign() && team == state.rules.defaultTeam) liquid.unlock(); + + float sum = 0f; + tempBuilds.clear(); + + for(int i = 0; i < proximity.size; i++){ + Building other = proximity.get(i); + + if(outputDir != -1 && (outputDir + rotation) % 4 != relativeTo(other)) continue; + + other = other.getLiquidDestination(self(), liquid); + + if(other != null && other.liquids != null && canDumpLiquid(other, liquid) && other.acceptLiquid(self(), liquid)){ + //I don't want huge-capacity blocks hogging all the output, so cap their 'weight' by the amount. + sum += Math.min(amount, other.block.liquidCapacity - other.liquids.get(liquid)); + + tempBuilds.add(other); + } + } + + //nothing to output. + if(sum <= 0.00001f){ + return; + } + + var outputs = tempBuilds.items; + int outputSize = tempBuilds.size; + for(int i = 0; i < outputSize; i++){ + Building other = outputs[i]; + + float maxOutput = Math.min(amount, other.block.liquidCapacity - other.liquids.get(liquid)); + //fraction of total possible output that this block represents. + float fraction = maxOutput / sum; + + //note: transferLiquid already clamps the amount by capacity. + transferLiquid(other, fraction * amount, liquid); + } + } + + /** Tries to evenly distribute the specified liquid to nearby blocks. This method will likely be removed in the future! */ + public void distributeLiquid(Liquid liquid){ if(liquids.get(liquid) <= 0.0001f) return; + int dump = this.cdump; + if(!net.client() && state.isCampaign() && team == state.rules.defaultTeam) liquid.unlock(); for(int i = 0; i < proximity.size; i++){ incrementDump(proximity.size); Building other = proximity.get((i + dump) % proximity.size); - if(outputDir != -1 && (outputDir + rotation) % 4 != relativeTo(other)) continue; other = other.getLiquidDestination(self(), liquid); @@ -854,7 +894,7 @@ abstract class BuildingComp implements Posc, Teamc, Healthc, Buildingc, Timerc, float ofract = other.liquids.get(liquid) / other.block.liquidCapacity; float fract = liquids.get(liquid) / block.liquidCapacity; - if(ofract < fract) transferLiquid(other, (fract - ofract) * block.liquidCapacity / scaling, liquid); + if(ofract < fract) transferLiquid(other, (fract - ofract) * block.liquidCapacity, liquid); } } } diff --git a/core/src/mindustry/world/blocks/liquid/LiquidBridge.java b/core/src/mindustry/world/blocks/liquid/LiquidBridge.java index 984688a468..16d84058c9 100644 --- a/core/src/mindustry/world/blocks/liquid/LiquidBridge.java +++ b/core/src/mindustry/world/blocks/liquid/LiquidBridge.java @@ -27,7 +27,7 @@ public class LiquidBridge extends ItemBridge{ @Override public void doDump(){ - dumpLiquid(liquids.current(), 1f); + dumpLiquid(liquids.current()); } } } diff --git a/core/src/mindustry/world/blocks/liquid/LiquidRouter.java b/core/src/mindustry/world/blocks/liquid/LiquidRouter.java index d0b000739d..3926e11d8a 100644 --- a/core/src/mindustry/world/blocks/liquid/LiquidRouter.java +++ b/core/src/mindustry/world/blocks/liquid/LiquidRouter.java @@ -23,9 +23,7 @@ public class LiquidRouter extends LiquidBlock{ public class LiquidRouterBuild extends LiquidBuild{ @Override public void updateTile(){ - if(liquids.currentAmount() > 0.01f){ - dumpLiquid(liquids.current()); - } + distributeLiquid(liquids.current()); } @Override diff --git a/core/src/mindustry/world/blocks/production/GenericCrafter.java b/core/src/mindustry/world/blocks/production/GenericCrafter.java index 03a7b867bc..1528cf2207 100644 --- a/core/src/mindustry/world/blocks/production/GenericCrafter.java +++ b/core/src/mindustry/world/blocks/production/GenericCrafter.java @@ -312,7 +312,7 @@ public class GenericCrafter extends Block{ for(int i = 0; i < outputLiquids.length; i++){ int dir = liquidOutputDirections.length > i ? liquidOutputDirections[i] : -1; - dumpLiquid(outputLiquids[i].liquid, 2f, dir); + dumpLiquid(outputLiquids[i].liquid, dir); } } } From 54b0bd0b46b8de9b3b1380e50232b19d27554247 Mon Sep 17 00:00:00 2001 From: Anuken Date: Tue, 4 Feb 2025 20:45:55 -0500 Subject: [PATCH 171/460] oops --- core/src/mindustry/entities/comp/BuildingComp.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/core/src/mindustry/entities/comp/BuildingComp.java b/core/src/mindustry/entities/comp/BuildingComp.java index 408e357c83..da8274ce4c 100644 --- a/core/src/mindustry/entities/comp/BuildingComp.java +++ b/core/src/mindustry/entities/comp/BuildingComp.java @@ -878,6 +878,7 @@ abstract class BuildingComp implements Posc, Teamc, Healthc, Buildingc, Timerc, /** Tries to evenly distribute the specified liquid to nearby blocks. This method will likely be removed in the future! */ public void distributeLiquid(Liquid liquid){ if(liquids.get(liquid) <= 0.0001f) return; + float scaling = 2f; int dump = this.cdump; @@ -894,7 +895,7 @@ abstract class BuildingComp implements Posc, Teamc, Healthc, Buildingc, Timerc, float ofract = other.liquids.get(liquid) / other.block.liquidCapacity; float fract = liquids.get(liquid) / block.liquidCapacity; - if(ofract < fract) transferLiquid(other, (fract - ofract) * block.liquidCapacity, liquid); + if(ofract < fract) transferLiquid(other, (fract - ofract) * block.liquidCapacity / scaling, liquid); } } } From 8f0ce318b2eaf6dfd0e6d4f9f55369a9b29b3164 Mon Sep 17 00:00:00 2001 From: Anuken Date: Tue, 4 Feb 2025 22:17:59 -0500 Subject: [PATCH 172/460] Increased capacity for most liquid transport blocks --- core/src/mindustry/content/Blocks.java | 21 +++++++++++++-------- 1 file changed, 13 insertions(+), 8 deletions(-) diff --git a/core/src/mindustry/content/Blocks.java b/core/src/mindustry/content/Blocks.java index 935fafce0f..48ef9d80df 100644 --- a/core/src/mindustry/content/Blocks.java +++ b/core/src/mindustry/content/Blocks.java @@ -2120,13 +2120,14 @@ public class Blocks{ mechanicalPump = new Pump("mechanical-pump"){{ requirements(Category.liquid, with(Items.copper, 15, Items.metaglass, 10)); pumpAmount = 7f / 60f; + liquidCapacity = 20f; }}; rotaryPump = new Pump("rotary-pump"){{ requirements(Category.liquid, with(Items.copper, 70, Items.metaglass, 50, Items.silicon, 20, Items.titanium, 35)); pumpAmount = 0.2f; consumePower(0.3f); - liquidCapacity = 30f; + liquidCapacity = 80f; hasPower = true; size = 2; }}; @@ -2135,33 +2136,34 @@ public class Blocks{ requirements(Category.liquid, with(Items.copper, 80, Items.metaglass, 90, Items.silicon, 30, Items.titanium, 40, Items.thorium, 35)); pumpAmount = 0.22f; consumePower(1.3f); - liquidCapacity = 40f; + liquidCapacity = 200f; hasPower = true; size = 3; }}; conduit = new Conduit("conduit"){{ requirements(Category.liquid, with(Items.metaglass, 1)); + liquidCapacity = 20f; health = 45; }}; pulseConduit = new Conduit("pulse-conduit"){{ requirements(Category.liquid, with(Items.titanium, 2, Items.metaglass, 1)); - liquidCapacity = 16f; + liquidCapacity = 40f; liquidPressure = 1.025f; health = 90; }}; platedConduit = new ArmoredConduit("plated-conduit"){{ requirements(Category.liquid, with(Items.thorium, 2, Items.metaglass, 1, Items.plastanium, 1)); - liquidCapacity = 16f; + liquidCapacity = 50f; liquidPressure = 1.025f; health = 220; }}; liquidRouter = new LiquidRouter("liquid-router"){{ requirements(Category.liquid, with(Items.graphite, 4, Items.metaglass, 2)); - liquidCapacity = 20f; + liquidCapacity = 120f; underBullets = true; solid = false; }}; @@ -2192,6 +2194,7 @@ public class Blocks{ arrowSpacing = 6f; range = 4; hasPower = false; + liquidCapacity = 100f; }}; phaseConduit = new LiquidBridge("phase-conduit"){{ @@ -2202,6 +2205,7 @@ public class Blocks{ hasPower = true; canOverdrive = false; pulse = true; + liquidCapacity = 100f; consumePower(0.30f); }}; @@ -2220,7 +2224,7 @@ public class Blocks{ requirements(Category.liquid, with(Items.beryllium, 2)); botColor = Pal.darkestMetal; leaks = true; - liquidCapacity = 20f; + liquidCapacity = 50f; liquidPressure = 1.03f; health = 250; researchCostMultiplier = 3; @@ -2243,6 +2247,7 @@ public class Blocks{ requirements(Category.liquid, with(Items.graphite, 8, Items.beryllium, 20)); range = 4; hasPower = false; + liquidCapacity = 120f; researchCostMultiplier = 1; underBullets = true; @@ -2251,7 +2256,7 @@ public class Blocks{ reinforcedLiquidRouter = new LiquidRouter("reinforced-liquid-router"){{ requirements(Category.liquid, with(Items.graphite, 8, Items.beryllium, 4)); - liquidCapacity = 30f; + liquidCapacity = 150f; liquidPadding = 3f/4f; researchCostMultiplier = 3; underBullets = true; @@ -2434,7 +2439,7 @@ public class Blocks{ itemDuration = 140f; ambientSound = Sounds.pulse; ambientSoundVolume = 0.07f; - liquidCapacity = 60f; + liquidCapacity = 80f; consumePower(25f); consumeItem(Items.blastCompound); From fbe071832fe39d5edb85f65d6549d9b871c5811d Mon Sep 17 00:00:00 2001 From: Anuken Date: Tue, 4 Feb 2025 22:31:55 -0500 Subject: [PATCH 173/460] More liquid capacity adjustments --- core/src/mindustry/content/Blocks.java | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/core/src/mindustry/content/Blocks.java b/core/src/mindustry/content/Blocks.java index 48ef9d80df..167eb92247 100644 --- a/core/src/mindustry/content/Blocks.java +++ b/core/src/mindustry/content/Blocks.java @@ -1007,7 +1007,7 @@ public class Blocks{ outputsLiquid = true; envEnabled = Env.any; drawer = new DrawMulti(new DrawRegion("-bottom"), new DrawLiquidTile(Liquids.water), new DrawLiquidTile(Liquids.cryofluid){{drawLiquidLight = true;}}, new DrawDefault()); - liquidCapacity = 24f; + liquidCapacity = 36f; craftTime = 120; lightLiquid = Liquids.cryofluid; @@ -1238,7 +1238,7 @@ public class Blocks{ researchCostMultiplier = 1.1f; itemCapacity = 0; - liquidCapacity = 40f; + liquidCapacity = 60f; consumePower(2f); ambientSound = Sounds.extractLoop; ambientSoundVolume = 0.06f; @@ -1296,7 +1296,7 @@ public class Blocks{ drawer = new DrawMulti(new DrawRegion("-bottom"), new DrawLiquidTile(Liquids.slag), new DrawDefault(), new DrawHeatOutput()); size = 3; itemCapacity = 0; - liquidCapacity = 40f; + liquidCapacity = 120f; rotateDraw = false; regionRotated1 = 1; ambientSound = Sounds.hum; @@ -2721,7 +2721,7 @@ public class Blocks{ result = Liquids.water; pumpAmount = 0.11f; size = 2; - liquidCapacity = 30f; + liquidCapacity = 40f; rotateSpeed = 1.4f; attribute = Attribute.water; envRequired |= Env.groundWater; @@ -2737,6 +2737,7 @@ public class Blocks{ hasLiquids = true; hasPower = true; hasItems = true; + liquidCapacity = 80f; craftEffect = Fx.none; envRequired |= Env.spores; @@ -2763,7 +2764,7 @@ public class Blocks{ updateEffectChance = 0.05f; pumpAmount = 0.25f; size = 3; - liquidCapacity = 30f; + liquidCapacity = 40f; attribute = Attribute.oil; baseEfficiency = 0f; itemUseTime = 60f; From 389195074c6fe65d742ae315a749a76e2933d0bb Mon Sep 17 00:00:00 2001 From: Anuken Date: Tue, 4 Feb 2025 22:41:05 -0500 Subject: [PATCH 174/460] Erekir liquid block health increase --- core/src/mindustry/content/Blocks.java | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/core/src/mindustry/content/Blocks.java b/core/src/mindustry/content/Blocks.java index 167eb92247..ccfa1a5d61 100644 --- a/core/src/mindustry/content/Blocks.java +++ b/core/src/mindustry/content/Blocks.java @@ -2231,12 +2231,10 @@ public class Blocks{ underBullets = true; }}; - //TODO is this necessary? junctions are not good design - //TODO make it leak reinforcedLiquidJunction = new LiquidJunction("reinforced-liquid-junction"){{ requirements(Category.liquid, with(Items.graphite, 4, Items.beryllium, 8)); buildCostMultiplier = 3f; - health = 260; + health = 250; ((Conduit)reinforcedConduit).junctionReplacement = this; researchCostMultiplier = 1; solid = false; @@ -2250,6 +2248,7 @@ public class Blocks{ liquidCapacity = 120f; researchCostMultiplier = 1; underBullets = true; + health = 250; ((Conduit)reinforcedConduit).rotBridgeReplacement = this; }}; @@ -2261,6 +2260,7 @@ public class Blocks{ researchCostMultiplier = 3; underBullets = true; solid = false; + health = 250; }}; reinforcedLiquidContainer = new LiquidRouter("reinforced-liquid-container"){{ @@ -2270,6 +2270,7 @@ public class Blocks{ liquidPadding = 6f/4f; researchCostMultiplier = 4; solid = true; + health = 600; }}; reinforcedLiquidTank = new LiquidRouter("reinforced-liquid-tank"){{ @@ -2278,6 +2279,7 @@ public class Blocks{ solid = true; liquidCapacity = 2700f; liquidPadding = 2f; + health = 1200; }}; //endregion From c08ebc149a53802e70d2eedc6637328eb7832250 Mon Sep 17 00:00:00 2001 From: Anuken Date: Wed, 5 Feb 2025 10:24:44 -0500 Subject: [PATCH 175/460] Revert "Make liquid production blocks dump as much output as possible" This reverts commit 574ae0bf --- core/src/mindustry/content/Blocks.java | 4 +- .../mindustry/entities/comp/BuildingComp.java | 61 +++---------------- .../world/blocks/liquid/LiquidBridge.java | 2 +- .../world/blocks/liquid/LiquidRouter.java | 2 +- .../blocks/production/GenericCrafter.java | 2 +- 5 files changed, 15 insertions(+), 56 deletions(-) diff --git a/core/src/mindustry/content/Blocks.java b/core/src/mindustry/content/Blocks.java index ccfa1a5d61..3da006d056 100644 --- a/core/src/mindustry/content/Blocks.java +++ b/core/src/mindustry/content/Blocks.java @@ -2270,7 +2270,7 @@ public class Blocks{ liquidPadding = 6f/4f; researchCostMultiplier = 4; solid = true; - health = 600; + health = 400; }}; reinforcedLiquidTank = new LiquidRouter("reinforced-liquid-tank"){{ @@ -2279,7 +2279,7 @@ public class Blocks{ solid = true; liquidCapacity = 2700f; liquidPadding = 2f; - health = 1200; + health = 900; }}; //endregion diff --git a/core/src/mindustry/entities/comp/BuildingComp.java b/core/src/mindustry/entities/comp/BuildingComp.java index da8274ce4c..722fad3542 100644 --- a/core/src/mindustry/entities/comp/BuildingComp.java +++ b/core/src/mindustry/entities/comp/BuildingComp.java @@ -52,7 +52,7 @@ abstract class BuildingComp implements Posc, Teamc, Healthc, Buildingc, Timerc, //region vars and initialization static final float timeToSleep = 60f * 1, recentDamageTime = 60f * 5f; static final ObjectSet tmpTiles = new ObjectSet<>(); - static final Seq tempBuilds = new Seq<>(Building.class); + static final Seq tempBuilds = new Seq<>(); static final BuildTeamChangeEvent teamChangeEvent = new BuildTeamChangeEvent(); static final BuildDamageEvent bulletDamageEvent = new BuildDamageEvent(); static int sleepingEntities = 0; @@ -827,67 +827,26 @@ abstract class BuildingComp implements Posc, Teamc, Healthc, Buildingc, Timerc, //TODO entire liquid system is awful public void dumpLiquid(Liquid liquid){ - dumpLiquid(liquid, -1); + dumpLiquid(liquid, 2f); + } + + public void dumpLiquid(Liquid liquid, float scaling){ + dumpLiquid(liquid, scaling, -1); } /** @param outputDir output liquid direction relative to rotation, or -1 to use any direction. */ - public void dumpLiquid(Liquid liquid, int outputDir){ - float amount = liquids.get(liquid); - - if(amount <= 0.0001f) return; - - if(!net.client() && state.isCampaign() && team == state.rules.defaultTeam) liquid.unlock(); - - float sum = 0f; - tempBuilds.clear(); - - for(int i = 0; i < proximity.size; i++){ - Building other = proximity.get(i); - - if(outputDir != -1 && (outputDir + rotation) % 4 != relativeTo(other)) continue; - - other = other.getLiquidDestination(self(), liquid); - - if(other != null && other.liquids != null && canDumpLiquid(other, liquid) && other.acceptLiquid(self(), liquid)){ - //I don't want huge-capacity blocks hogging all the output, so cap their 'weight' by the amount. - sum += Math.min(amount, other.block.liquidCapacity - other.liquids.get(liquid)); - - tempBuilds.add(other); - } - } - - //nothing to output. - if(sum <= 0.00001f){ - return; - } - - var outputs = tempBuilds.items; - int outputSize = tempBuilds.size; - for(int i = 0; i < outputSize; i++){ - Building other = outputs[i]; - - float maxOutput = Math.min(amount, other.block.liquidCapacity - other.liquids.get(liquid)); - //fraction of total possible output that this block represents. - float fraction = maxOutput / sum; - - //note: transferLiquid already clamps the amount by capacity. - transferLiquid(other, fraction * amount, liquid); - } - } - - /** Tries to evenly distribute the specified liquid to nearby blocks. This method will likely be removed in the future! */ - public void distributeLiquid(Liquid liquid){ - if(liquids.get(liquid) <= 0.0001f) return; - float scaling = 2f; - + public void dumpLiquid(Liquid liquid, float scaling, int outputDir){ int dump = this.cdump; + if(liquids.get(liquid) <= 0.0001f) return; + if(!net.client() && state.isCampaign() && team == state.rules.defaultTeam) liquid.unlock(); for(int i = 0; i < proximity.size; i++){ incrementDump(proximity.size); Building other = proximity.get((i + dump) % proximity.size); + if(outputDir != -1 && (outputDir + rotation) % 4 != relativeTo(other)) continue; other = other.getLiquidDestination(self(), liquid); diff --git a/core/src/mindustry/world/blocks/liquid/LiquidBridge.java b/core/src/mindustry/world/blocks/liquid/LiquidBridge.java index 16d84058c9..984688a468 100644 --- a/core/src/mindustry/world/blocks/liquid/LiquidBridge.java +++ b/core/src/mindustry/world/blocks/liquid/LiquidBridge.java @@ -27,7 +27,7 @@ public class LiquidBridge extends ItemBridge{ @Override public void doDump(){ - dumpLiquid(liquids.current()); + dumpLiquid(liquids.current(), 1f); } } } diff --git a/core/src/mindustry/world/blocks/liquid/LiquidRouter.java b/core/src/mindustry/world/blocks/liquid/LiquidRouter.java index 3926e11d8a..020b651060 100644 --- a/core/src/mindustry/world/blocks/liquid/LiquidRouter.java +++ b/core/src/mindustry/world/blocks/liquid/LiquidRouter.java @@ -23,7 +23,7 @@ public class LiquidRouter extends LiquidBlock{ public class LiquidRouterBuild extends LiquidBuild{ @Override public void updateTile(){ - distributeLiquid(liquids.current()); + dumpLiquid(liquids.current()); } @Override diff --git a/core/src/mindustry/world/blocks/production/GenericCrafter.java b/core/src/mindustry/world/blocks/production/GenericCrafter.java index 1528cf2207..03a7b867bc 100644 --- a/core/src/mindustry/world/blocks/production/GenericCrafter.java +++ b/core/src/mindustry/world/blocks/production/GenericCrafter.java @@ -312,7 +312,7 @@ public class GenericCrafter extends Block{ for(int i = 0; i < outputLiquids.length; i++){ int dir = liquidOutputDirections.length > i ? liquidOutputDirections[i] : -1; - dumpLiquid(outputLiquids[i].liquid, dir); + dumpLiquid(outputLiquids[i].liquid, 2f, dir); } } } From 8c49fc8f11020d1ed1efe3e15906edac57859966 Mon Sep 17 00:00:00 2001 From: SAMBUYYA <83904969+SAMBUYYA@users.noreply.github.com> Date: Wed, 5 Feb 2025 22:34:41 +0700 Subject: [PATCH 176/460] Update bundle_id_ID.properties (#10370) * Update bundle_id_ID.properties Perbaikan bebrapa kata dan perubahan inggris ke indonesia * Update bundle_id_ID.properties * Update bundle_id_ID.properties * Update bundle_id_ID.properties * Update bundle_id_ID.properties * Update bundle_id_ID.properties Change description snapshottimeout * Update bundle_id_ID.properties change no targets missiles and building and other some word * Update bundle_id_ID.properties change word notargetbuildings and missiles * Update bundle_id_ID.properties * Update bundle_id_ID.properties Memperbaiki beberapa kata kapital dan lainnya * Update bundle_id_ID.properties * arkycite and other changes revert to 'arkisit', time shortener (per-detik (/dtk), per-menit (/mnt)), English plural to Indonesian plural, 'Casual' to 'Kasual', tidying up some lines here and there * Update bundle_id_ID.properties repair conflict * Update bundle_id_ID.properties back before --------- Co-authored-by: Thomas Widyantoko <40286070+DaGamerFiles@users.noreply.github.com> --- core/assets/bundles/bundle_id_ID.properties | 314 ++++++++++---------- 1 file changed, 160 insertions(+), 154 deletions(-) diff --git a/core/assets/bundles/bundle_id_ID.properties b/core/assets/bundles/bundle_id_ID.properties index cd954991a3..05fdf74870 100644 --- a/core/assets/bundles/bundle_id_ID.properties +++ b/core/assets/bundles/bundle_id_ID.properties @@ -144,7 +144,7 @@ mod.enabled = [lightgray]Aktif mod.disabled = [red]Nonaktif mod.multiplayer.compatible = [gray]Kompatibel dalam Multipemain mod.disable = Nonaktifkan -mod.version = Version: +mod.version = Versi: mod.content = Konten: mod.delete.error = Tidak dapat menghapus mod. File mungkin sedang digunakan. @@ -198,7 +198,7 @@ campaign.select = Pilih untuk Memulai Kampanye campaign.none = [lightgray]Pilih planet untuk memulai.\nPilihan ini dapat diubah setiap saat. campaign.erekir = Konten baru yang disempurnakan. Kemajuan kampanye lebih linier.\n\nKualitas peta yang tinggi dan pengalaman lebih mantap. campaign.serpulo = Konten lawas; pengalaman klasik. Lebih terbuka dan banyak konten.\n\nPeta dan mekanisme kampanye yang berpotensi tidak seimbang. Kurang halus -campaign.difficulty = Difficulty +campaign.difficulty = Kesulitan completed = [accent]Terselesaikan techtree = Pohon Teknologi techtree.select = Pemilihan Pohon Teknologi @@ -299,16 +299,16 @@ joingame.ip = Alamat: disconnect = Terputus. disconnect.error = Sambungan bermasalah. disconnect.closed = Sambungan ditutup. -disconnect.timeout = Waktu koneksi habis. disconnect.data = Gagal memuat data dunia! -disconnect.snapshottimeout = Timed out while receiving UDP snapshots.\nThis may be caused by an unstable network or connection. +disconnect.timeout = Waktu koneksi telah habis. +disconnect.snapshottimeout = Waktu koneksi habis selama menerima snapshot UDP.\nIni mungkin disebabkan oleh jaringan atau koneksi yang tidak stabil. cantconnect = Gagal tersambung ke permainan ([accent]{0}[]). connecting = [accent]Menghubungkan... reconnecting = [accent]Menghubungkan kembali... connecting.data = [accent]Memuat data dunia... server.port = Port: server.invalidport = Nomor port tidak valid! -server.error.addressinuse = [scarlet]Failed to open server on port 6567.[]\n\nMake sure no other Mindustry servers are running on your device or network! +server.error.addressinuse = [scarlet]Gagal membuka server di port 6567.[]\n\nPastikan tidak ada server Mindustry lain yang berjalan di perangkat atau jaringan Anda! server.error = [scarlet]Terjadi kesalahan saat menghosting server: [accent]{0} save.new = Simpanan Baru save.overwrite = Anda yakin ingin menimpa \nsimpanan ini? @@ -361,7 +361,7 @@ command.enterPayload = Masukkan Muatan Blok command.loadUnits = Muat Unit command.loadBlocks = Muat Blok command.unloadPayload = Turunkan Muatan -command.loopPayload = Loop Unit Transfer +command.loopPayload = Perulangan Transfer Unit stance.stop = Batalkan Perintah stance.shoot = Posisi Unit: Menembak stance.holdfire = Posisi Unit: Gencatan Senjata @@ -477,7 +477,7 @@ waves.health = darah: {0}% waves.perspawn = per muncul waves.shields = perisai/gelombang waves.to = sampai -waves.spawn = muncul: +waves.spawn = Titik Pendaratan: waves.spawn.all = waves.spawn.select = Pilih Tempat Pendaratan Musuh waves.spawn.none = [scarlet]tidak ada tempat pendaratan musuh di peta @@ -505,12 +505,12 @@ waves.units.show = Perlihatkan Semua wavemode.counts = jumlah wavemode.totals = total wavemode.health = darah -all = All +all = Semua editor.default = [lightgray] details = Detail... edit = Sunting -variables = Vars +variables = Variabel logic.clear.confirm = Apakah Anda yakin ingin menghapus semua kode dari prosesor ini? logic.globals = Variabel Bawaan @@ -588,8 +588,8 @@ filters.empty = [lightgray]Tidak ada penyaring! Tambahkan dengan tombol di bawah filter.distort = Kerusakkan filter.noise = Kebisingan -filter.enemyspawn = Pilih Munculnya Musuh -filter.spawnpath = Jalur ke Titik Muncul +filter.enemyspawn = Pilih Titik Pendaratan Musuh +filter.spawnpath = Jalur ke Titik Pendaratan Musuh filter.corespawn = Pilih Inti filter.median = Median filter.oremedian = Median Bijih @@ -737,8 +737,8 @@ addall = Tambah Semua launch.from = Meluncurkan Dari: [accent]{0} launch.capacity = Kapasitas Barang yang Diluncurkan: [accent]{0} launch.destination = Destinasi: {0} -landing.sources = Source Sectors: [accent]{0}[] -landing.import = Max Total Import: {0}[accent]{1}[lightgray]/min +landing.sources = Sumber Sektor: [accent]{0}[] +landing.import = Total Impor Maksimum: {0}[accent]{1}[lightgray]/mnt configure.invalid = Jumlah harus berupa angka di antara 0 dan {0}. add = Tambahkan... guardian = Penjaga @@ -753,7 +753,7 @@ error.mapnotfound = File peta tidak ditemaukan! error.io = Terjadi kesalahan jaringan I/O. error.any = Terjadi kesalahan Jaringan tidak diketahui. error.bloom = Gagal untuk menjalankan efek bloom.\nPerangkat Anda mungkin tidak mendukung fitur ini. -error.moddex = Mindustry is unable to load this mod.\nYour device is blocking import of Java mods due to recent changes in Android.\nThere is no known workaround to this issue. +error.moddex = Mindustry tidak dapat memuat mod ini.\nPerangkat Anda memblokir impor mod Java karena perubahan terbaru dari Android akhir akhir ini.\nIni tidak akan diperbaiki. Tidak ada solusi yang diketahui untuk masalah ini. weather.rain.name = Hujan weather.snowing.name = Salju @@ -778,9 +778,9 @@ sectors.stored = Terisi: sectors.resume = Lanjutkan sectors.launch = Luncurkan sectors.select = Pilih -sectors.launchselect = Select Launch Destination -sectors.nonelaunch = [lightgray]nihil (matahari) -sectors.redirect = Redirect Launch Pads +sectors.launchselect = Pilih Destinasi Peluncuran +sectors.nonelaunch = [lightgray]tidak ada (matahari) +sectors.redirect = Arahkan Ulang Alas Peluncur sectors.rename = Ganti Nama Sektor sectors.enemybase = [scarlet]Markas Musuh sectors.vulnerable = [scarlet]Rawan diserang @@ -807,11 +807,12 @@ threat.medium = Sedang threat.high = Tinggi threat.extreme = Berbahaya threat.eradication = Pemusnahan -difficulty.casual = Casual -difficulty.easy = Easy + +difficulty.casual = Kasual +difficulty.easy = Mudah difficulty.normal = Normal -difficulty.hard = Hard -difficulty.eradication = Eradication +difficulty.hard = Susah +difficulty.eradication = Pemusnahan planets = Planet @@ -833,7 +834,7 @@ sector.saltFlats.name = Dataran Garam sector.fungalPass.name = Lintasan Spora sector.biomassFacility.name = Pabrik Sintesis Biomassa sector.windsweptIslands.name = Pulau Bersemilir -sector.extractionOutpost.name = Pos Ekstraksi Terdepan +sector.extractionOutpost.name = Pos Ekstraksi sector.facility32m.name = Facility 32 M sector.taintedWoods.name = Tainted Woods sector.infestedCanyons.name = Infested Canyons @@ -861,13 +862,15 @@ sector.nuclearComplex.description = Sebuah fasilitas untuk memproduksi dan mempr sector.fungalPass.description = Area ini terdapat di antara pegunungan yang lebih tinggi dengan yang lebih rendah, juga daerah yang dipenuhi spora. Musuh membangun markas pengintaian kecil di sini.\nHancurkan itu.\nGunakan unit Dagger dan Crawler. Hancurkan dua inti mereka. sector.biomassFacility.description = Asal dari semua spora di planet ini. Tempat ini adalah fasilitas dimana spora dipelajari dan diproduksi.\nPelajari teknologi yang terkait dengannya. Budi dayakan spora untuk memproduksi bahan bakar dan plastik.\n\n[lightgray]Setelah fasilitas ini hancur, spora menyebar. Tidak ada di ekosistem lokal yang dapat bersaing dengan organisme invasif seperti itu. sector.windsweptIslands.description = Jauh dari pantai terdapat sekumpulan pulau. Catatan yang ada mengatakan bahwa mereka memiliki struktur untuk memproduksi [accent]Plastanium[].\n\nKalahkan unit laut musuh. Bangun markas di kepulauan ini. Pelajari pabriknya. -sector.extractionOutpost.description = Sebuah pos jarak jauh, dibangun musuh untuk meluncurkan sumber daya ke sektor yang lain.\n\nTeknologi transportasi antar sektor dapat memudahkan untuk menaklukan lebih banyak sektor. Hancurkan markasnya . Pelajari Alas Peluncur mereka. +sector.extractionOutpost.description = Sebuah pos jarak jauh, dibangun musuh untuk meluncurkan sumber daya ke sektor yang lain.\n\nTeknologi transportasi antar sektor dapat memudahkan untuk menaklukan lebih banyak sektor. Hancurkan markasnya. Pelajari Alas Peluncur mereka. sector.impact0078.description = Di sini terletak sisa-sisa pesawat antarbintang yang pertama kali memasuki sistem ini.\n\nSelamatkan apapun yang ada dari sisa-sisa pesawat. Pelajari teknologi apa pun yang utuh. sector.planetaryTerminal.description = Target terakhir.\n\nMarkas pesisir pantai ini memiliki struktur yang dapat meluncurkan inti ke planet di sekitarnya. Memiliki pertahanan yang sangat bagus.\n\nProduksi unit laut. Hancurkan musuh secepat mungkin. Pelajari struktur peluncuran mereka. sector.coastline.description = Sisa-sisa teknologi Unit Laut telah terdeteksi di lokasi ini. Tolak serangan musuh, rebut sektor ini, dan dapatkan teknologinya. sector.navalFortress.description = Musuh telah mendirikan markas di sebuah pulau terpencil, dibentengi secara alami. Hancurkan pangkalan ini. Dapatkan teknologi Unit Laut mereka yang canggih, dan telitilah sector.cruxscape.name = Cruxscape sector.geothermalStronghold.name = Geothermal Stronghold + +#do not translate sector.facility32m.description = WIP, map submission by Stormride_R sector.taintedWoods.description = WIP, map submission by Stormride_R sector.atolls.description = WIP, map submission by Stormride_R @@ -898,21 +901,21 @@ sector.karst.name = Kars sector.origin.name = Origin sector.onset.description = Permulaan Penaklukan Erekir. Kumpulkan sumber daya, produksi unit, dan mulailah meneliti teknologi. -sector.aegis.description = Sektor ini mengandung deposit Tungsten.\nRiset [accent]Bor Tumbukan[] untuk menambang sumber daya ini, dan hancurkan markas musuh di area tersebut. -sector.lake.description = Danau lava di sektor ini sangat membatasi pilihan unit yang kita gunakan. Unit Kapal adalah satu-satunya pilihan.\nRiset [accent]fabrikator kapal[] dan produksi unit [accent]elude[] secepat mungkin. -sector.intersect.description = Pemindai menunjukkan bahwa sektor ini akan diserang dari berbagai arah setelah kita mendarat.\nSegera siapkan pertahanan dan perluas wilayah secepat mungkin.\nUnit [accent]mech[] akan dibutuhkan untuk dataran yang sulit dilalui. -sector.atlas.description = Sektor ini memiliki dataran yang unik dan akan membutuhkan beraneka ragam unit untuk menyerang secara efektif.\nUnit yang ditingkatkan mungkin dibutuhkan untuk melewati beberapa markas musuh yang kuat di sekitar sini.\nRiset [accent]Elektroliser[] dan [accent]Refabrikator Tank[]. +sector.aegis.description = Sektor ini mengandung deposit tungsten.\nRiset [accent]Bor Tumbukan[] untuk menambang sumber daya ini, dan hancurkan markas musuh di area tersebut. +sector.lake.description = Danau lava di sektor ini sangat membatasi pilihan unit yang kita gunakan. Unit Kapal adalah satu-satunya pilihan.\nRiset [accent]pabrikator kapal[] dan produksi unit [accent]elude[] secepat mungkin. +sector.intersect.description = Pemindai menunjukkan bahwa sektor ini akan diserang dari berbagai arah setelah kita mendarat.\nSegera siapkan pertahanan dan perluas wilayah secepat mungkin.\nUnit [accent]Mech[] akan dibutuhkan untuk dataran yang sulit dilalui. +sector.atlas.description = Sektor ini memiliki dataran yang unik dan akan membutuhkan beraneka ragam unit untuk menyerang secara efektif.\nUnit yang ditingkatkan mungkin dibutuhkan untuk melewati beberapa markas musuh yang kuat di sekitar sini.\nRiset [accent]Elektroliser[] dan [accent]Pabrikator Ulang Tank[]. sector.split.description = Keberadaan musuh yang minim di sektor ini sangat bagus untuk menguji coba teknologi transportasi baru. -sector.basin.description = Kehadiran musuh dalam jumlah besar terdeteksi di sektor ini.\nBangun unit dengan cepat dan Kuasai inti musuh untuk mendapatkan pijakan +sector.basin.description = Kehadiran musuh dalam jumlah besar terdeteksi di sektor ini.\nBangun unit dengan cepat dan kuasai inti musuh untuk mendapatkan pijakan sector.marsh.description = Sektor ini memiliki kelimpahan arkisit, namun memiliki ventilasi yang terbatas.\nBangun [accent]Ruang Pembakaran Kimia[] untuk menghasilkan tenaga. sector.peaks.description = Medan pegunungan di sektor ini membuat sebagian besar unit tidak berguna. Unit terbang akan dibutuhkan.\nWaspadai instalasi anti-udara yang dimiliki musuh. Beberapa instalasi ini mungkin dapat dinonaktifkan dengan menargetkan bangunan pendukungnya. -sector.ravine.description = Jalur transportasi penting bagi musuh. Tidak ada inti musuh yang ditemukan di sini, namun hati-hati terhadap berbagai jenis musuh.\nProduksi [accent]Paduan Logam[]. Bangun menara [accent]Afflict[]. +sector.ravine.description = Jalur transportasi penting bagi musuh. Tidak ada inti musuh yang ditemukan di sini, namun hati-hati terhadap berbagai jenis musuh.\nProduksi [accent]paduan logam[]. Bangun menara [accent]Afflict[]. sector.caldera-erekir.description = Sumber daya yang terdeteksi di sektor ini tersebar di beberapa pulau.\nRiset dan sebarkan transportasi berbasis drone. sector.stronghold.description = Markas musuh yang besar di sektor ini menjaga simpanan [accent]torium[] dalam jumlah besar .\nGunakan itu untuk mengembangkan unit dan menara ke tingkat yang lebih tinggi. sector.crevice.description = Musuh akan mengirimkan pasukan serangan yang hebat untuk menghancurkan markasmu di sektor ini.\nKembangkan [accent]karbit[] dan [accent]Generator Pirolisis[] mungkin imperatif untuk bertahan hidup. sector.siege.description = Sektor ini memiliki dua ngarai paralel yang akan memaksa serangan dari dua arah.\nRiset [accent]sianogen[] untuk mendapatkan kemampuan untuk membuat unit tank yang lebih kuat.\nPeringatan: Rudal jarak jauh milik musuh telah terdeteksi. Rudal tersebut mungkin ditembak jatuh sebelum terjadi benturan. sector.crossroads.description = Pangkalan musuh di sektor ini telah didirikan di berbagai medan. Riset unit yang berbeda untuk beradaptasi.\nSelain itu, beberapa markas telah dilindungi oleh perisai. Cari tahu bagaimana mereka diberi daya. -sector.karst.description = Sektor ini kaya akan sumber daya, namun akan diserang oleh musuh begitu inti baru mendarat.\nManfaatkan sumber daya dan riset [accent]Phase Fabric[]. +sector.karst.description = Sektor ini kaya akan sumber daya, namun akan diserang oleh musuh begitu inti baru mendarat.\nManfaatkan sumber daya dan riset [accent]phase fabric[]. sector.origin.description = Sektor terakhir dengan kehadiran musuh yang signifikan.\nTidak ada peluang penelitian yang tersisa - fokuslah pada menghancurkan semua inti musuh. status.burning.name = Terbakar @@ -989,7 +992,7 @@ stat.instructions = Instruksi stat.powerconnections = Batas Sambungan stat.poweruse = Penggunaan Tenaga stat.powerdamage = Tenaga/Tembakan -stat.itemcapacity = Kapasitas Bahan +stat.itemcapacity = Kapasitas Item stat.memorycapacity = Kapasitas Memori stat.basepowergeneration = Dasar Generasi Tenaga stat.productiontime = Waktu Produksi @@ -1010,7 +1013,7 @@ stat.armor = Pelindung stat.buildtime = Waktu Pembuatan stat.maxconsecutive = Batas Konsekutif stat.buildcost = Biaya Bangunan -stat.inaccuracy = Jarak Melenceng +stat.inaccuracy = Melenceng stat.shots = Tembakan stat.reload = Kecepatan Penembakan stat.ammo = Amunisi @@ -1077,7 +1080,7 @@ ability.liquidexplode.description = Menumpahkan cairan saat mati ability.stat.firingrate = [stat]{0}/sec[lightgray] laju penembakan ability.stat.regen = [stat]{0}[lightgray] darah/detik -ability.stat.pulseregen = [stat]{0}[lightgray] health/pulse +ability.stat.pulseregen = [stat]{0}[lightgray] darah/denyut ability.stat.shield = [stat]{0}[lightgray] perisai ability.stat.repairspeed = [stat]{0}/sec[lightgray] kecepatan perbaikan ability.stat.slurpheal = [stat]{0}[lightgray] darah/unit cair @@ -1091,7 +1094,7 @@ ability.stat.buildtime = [stat]{0} sec[lightgray] waktu membangun bar.onlycoredeposit = Hanya Penyetoran Inti yang Diizinkan bar.drilltierreq = Membutuhkan Bor yang Lebih Baik -bar.nobatterypower = Insufficieny Battery Power +bar.nobatterypower = Daya Baterai Tidak Mencukupi bar.noresources = Sumber Daya Tidak Cukup bar.corereq = Membutuhkan Inti Markas bar.corefloor = Ubin Zona Inti Dibutuhkan @@ -1100,25 +1103,25 @@ bar.drillspeed = Kecepatan Bor: {0}/s bar.pumpspeed = Kecepatan Pompa: {0}/s bar.efficiency = Efisiensi: {0}% bar.boost = Pendorongan: +{0}% -bar.powerbuffer = Battery Power: {0}/{1} +bar.powerbuffer = Tenaga Baterai: {0}/{1} bar.powerbalance = Tenaga: {0}/s bar.powerstored = Disimpan: {0}/{1} bar.poweramount = Tenaga: {0} bar.poweroutput = Pengeluaran Tenaga: {0} bar.powerlines = Sambungan: {0}/{1} -bar.items = Bahan: {0} +bar.items = Item: {0} bar.capacity = Kapasitas: {0} bar.unitcap = {0} {1}/{2} bar.liquid = Zat Cair bar.heat = Panas -bar.cooldown = Cooldown +bar.cooldown = Pendinginan bar.instability = Instabilitas bar.heatamount = Panas: {0} bar.heatpercent = Panas: {0} ({1}%) bar.power = Tenaga bar.progress = Proses Pembangunan bar.loadprogress = Proses Muatan -bar.launchcooldown = Waktu Jeda Peluncuran +bar.launchcooldown = Jeda Peluncuran bar.input = Masukan bar.output = Keluaran bar.strength = [stat]{0}[lightgray]x penguatan @@ -1144,32 +1147,32 @@ bullet.healamount = [stat]{0}[lightgray] perbaikan langsung bullet.multiplier = [stat]{0}[lightgray]x penggandaan amunisi bullet.reload = [stat]{0}[lightgray]x laju tembakan bullet.range = [stat]{0}[lightgray] jarak ubin -bullet.notargetsmissiles = [stat] ignores buildings -bullet.notargetsbuildings = [stat] ignores missiles +bullet.notargetsmissiles = [stat] mengabaikan misil +bullet.notargetsbuildings = [stat] mengabaikan bangunan unit.blocks = blok unit.blockssquared = blok² unit.powersecond = unit tenaga/detik unit.tilessecond = ubin/detik unit.liquidsecond = unit zat cair/detik -unit.itemssecond = bahan/detik +unit.itemssecond = item/detik unit.liquidunits = unit zat cair unit.powerunits = unit tenaga unit.heatunits = unit panas unit.degrees = derajat unit.seconds = detik unit.minutes = menit -unit.persecond = /detik -unit.perminute = /menit +unit.persecond = /dtk +unit.perminute = /mnt unit.timesspeed = x kecepatan unit.multiplier = x unit.percent = % unit.shieldhealth = darah perisai -unit.items = bahan +unit.items = item unit.thousands = rb unit.millions = jt unit.billions = m -unit.shots = shots +unit.shots = tembakan unit.pershot = /tembakan category.purpose = Kegunaan category.general = Umum @@ -1178,7 +1181,7 @@ category.liquids = Zat Cair category.items = Barang category.crafting = Pemasukan/Pengeluaran category.function = Fungsi -category.optional = Peningkatan Opsional +category.optional = Pilihan Peningkatan setting.alwaysmusic.name = Selalu Putar Musik setting.alwaysmusic.description = Saat diaktifkan, musik akan selalu diputar berulang-ulang di dalam game. Saat dinonaktifkan, musik hanya diputar secara acak. setting.skipcoreanimation.name = Lewati Animasi Peluncuran atau Pendaratan Inti @@ -1239,13 +1242,13 @@ setting.mutemusic.name = Bisukan Musik setting.sfxvol.name = Volume Suara Efek setting.mutesound.name = Bisukan Suara setting.crashreport.name = Laporkan Masalah Secara Anonim -setting.communityservers.name = Fetch Community Server List +setting.communityservers.name = Ambil Daftar Server Komunitas setting.savecreate.name = Otomatis Menyimpan setting.steampublichost.name = Visibilitas Game Publik setting.playerlimit.name = Batas pemain setting.chatopacity.name = Jelas-Beningnya Pesan setting.lasersopacity.name = Jelas-Beningnya Laser Tenaga -setting.unitlaseropacity.name = Unit Mining Beam Opacity +setting.unitlaseropacity.name = Jelas-Beningnya Laser Unit Menambang setting.bridgeopacity.name = Jelas-Beningnya Jembatan setting.playerchat.name = Tunjukkan Pesan Pemain setting.showweather.name = Perlihatkan Cuaca @@ -1289,17 +1292,18 @@ keybind.unit_stance_hold_fire.name = Posisi Unit: Tahan Tembakan keybind.unit_stance_pursue_target.name = Posisi Unit: Mengejar Target keybind.unit_stance_patrol.name = Posisi Unit: Patroli keybind.unit_stance_ram.name = Posisi Unit: Tabrak -keybind.unit_command_move.name = Unit Command: Move -keybind.unit_command_repair.name = Unit Command: Repair -keybind.unit_command_rebuild.name = Unit Command: Rebuild -keybind.unit_command_assist.name = Unit Command: Assist -keybind.unit_command_mine.name = Unit Command: Mine -keybind.unit_command_boost.name = Unit Command: Boost -keybind.unit_command_load_units.name = Unit Command: Load Units -keybind.unit_command_load_blocks.name = Unit Command: Load Blocks -keybind.unit_command_unload_payload.name = Unit Command: Unload Payload + +keybind.unit_command_move.name = Perintah Unit: Bergerak +keybind.unit_command_repair.name = Perintah Unit: Perbaiki +keybind.unit_command_rebuild.name = Perintah Unit: Bangun kembali +keybind.unit_command_assist.name = Perintah Unit: Ikuti Player +keybind.unit_command_mine.name = Perintah Unit: Menambang +keybind.unit_command_boost.name = Perintah Unit: Mendorong +keybind.unit_command_load_units.name = Perintah Unit: Muat Unit +keybind.unit_command_load_blocks.name = Perintah Unit: Muat Blok +keybind.unit_command_unload_payload.name = Perintah Unit: Bongkar Muatan keybind.unit_command_enter_payload.name = Perintah Unit: Masuk ke Muatan -keybind.unit_command_loop_payload.name = Unit Command: Loop Unit Transfer +keybind.unit_command_loop_payload.name = Perintah Unit: Perulangan Transfer Unit keybind.rebuild_select.name = Membangun Wilayah Kembali keybind.schematic_select.name = Pilih Daerah @@ -1378,16 +1382,16 @@ rules.wavetimer = Pengaturan Waktu Gelombang rules.wavesending = Pengiriman Gelombang rules.allowedit = Izinkan Aturan Pengeditan rules.allowedit.info = Ketika diaktifkan, pemain dapat mengedit aturan dalam game melalui tombol di sudut kiri bawah pada menu Jeda. -rules.alloweditworldprocessors = Allow Editing World Processors -rules.alloweditworldprocessors.info = When enabled, world logic blocks can be placed and edited even outside the editor. +rules.alloweditworldprocessors = Izinkan Pengeditan Prosesor Dunia +rules.alloweditworldprocessors.info = Ketika diaktifkan, blok logika dunia dapat ditempatkan dan diedit bahkan di luar penyunting. rules.waves = Gelombang -rules.airUseSpawns = Unit udara menggunakan titik muncul +rules.airUseSpawns = Unit udara menggunakan titik pendaratan rules.attack = Mode Penyerangan rules.buildai = A.I. Pembangun Markas rules.buildaitier = Tingkat A.I. Pembangun rules.rtsai = A.I. RTS [red](WIP) -rules.rtsai.campaign = RTS Attack AI -rules.rtsai.campaign.info = In attack maps, makes units group up and attack player bases in a more intelligent manner. +rules.rtsai.campaign = A.I. Serangan RTS +rules.rtsai.campaign.info = Dalam peta serangan, membuat unit berkelompok dan menyerang markas pemain dengan cara yang lebih cerdas. rules.rtsminsquadsize = Ukuran Regu Minimum rules.rtsmaxsquadsize = Ukuran Regu Maksimum rules.rtsminattackweight = Berat Serangan Minimum @@ -1398,12 +1402,12 @@ rules.placerangecheck = Pemeriksaan Jarak Penempatan rules.enemyCheat = Sumber Daya Musuh Tak Terbatas rules.blockhealthmultiplier = Penggandaan Darah Blok rules.blockdamagemultiplier = Penggandaan Kekuatan Blok -rules.unitbuildspeedmultiplier = Penggandaan Kecepatan Munculnya Unit +rules.unitbuildspeedmultiplier = Penggandaan Kecepatan Pembuatan Unit rules.unitcostmultiplier = Penggandaan Bahan Pembuatan Unit rules.unithealthmultiplier = Penggandaan Darah Unit rules.unitdamagemultiplier = Penggandaan Kekuatan Unit rules.unitcrashdamagemultiplier = Penggandaan Kerusakan Jatuhnya Unit -rules.unitminespeedmultiplier = Unit Mine Speed Multiplier +rules.unitminespeedmultiplier = Penggandaan Kecepatan Unit Menambang rules.solarmultiplier = Penggandaan Tenaga Surya rules.unitcapvariable = Inti Memengaruhi Batas Unit rules.unitpayloadsexplode = Muatan yang Dibawa Meledak Bersama Unit @@ -1431,12 +1435,12 @@ rules.title.teams = Tim rules.title.planet = Planet rules.lighting = Penerangan rules.fog = Kabut Perang -rules.invasions = Enemy Sector Invasions -rules.legacylaunchpads = Legacy Launch Pad Mechanics -rules.legacylaunchpads.info = Allows using launch pads without landing pads, as in 7.0. -landingpad.legacy.disabled = [scarlet]\ue815 Disabled[lightgray] (Legacy Launch Pads enabled) -rules.showspawns = Show Enemy Spawns -rules.randomwaveai = Unpredictable Wave AI +rules.invasions = Invasi Sektor Musuh +rules.legacylaunchpads = Mekanisme Alas Peluncur Warisan +rules.legacylaunchpads.info = Mengizinkan penggunaan alas peluncur tanpa alas pendaratan, seperti pada versi 7.0. +landingpad.legacy.disabled = [scarlet]\ue815 Nonaktifkan[lightgray] (Alas Peluncur Warisan diaktifkan) +rules.showspawns = Tampilkan Titik Pendaratan Musuh +rules.randomwaveai = Gelombang AI yang Tak Terduga rules.fire = Api rules.anyenv = rules.explosions = Kekuatan Ledakan Blok/Unit @@ -1445,8 +1449,8 @@ rules.weather = Cuaca rules.weather.frequency = Frekuensi: rules.weather.always = Selalu rules.weather.duration = Durasi: -rules.randomwaveai.info = Makes units spawned in waves target random structures instead of directly attacking the core or power generators. +rules.randomwaveai.info = Membuat unit yang muncul dalam gelombang menargetkan struktur bangunan secara acak alih-alih menyerang inti atau generator pembangkit listrik secara langsung. rules.placerangecheck.info = Mencegah pemain menempatkan apa pun di dekat bangunan musuh. Ketika mencoba memasang menara, jangkauannya akan ditingkatkan sehingga menara tidak akan bisa menjangkau musuh. rules.onlydepositcore.info = Mencegah unit menyimpan bahan ke dalam bangunan apa pun kecuali inti. @@ -1488,7 +1492,7 @@ liquid.slag.name = Lava liquid.oil.name = Minyak liquid.cryofluid.name = Kriogenik liquid.neoplasm.name = Neoplasma -liquid.arkycite.name = Arkycite +liquid.arkycite.name = Arkisit liquid.gallium.name = Galium liquid.ozone.name = Ozon liquid.hydrogen.name = Hidrogen @@ -1562,7 +1566,7 @@ block.cliff.name = Bukit block.sand-boulder.name = Batu Pasir Besar block.basalt-boulder.name = Batu Basal Besar block.grass.name = Rumput -block.molten-slag.name = Lahar +block.molten-slag.name = Lava block.pooled-cryofluid.name = Kriogenik block.space.name = Luar Angkasa block.salt.name = Garam @@ -1590,9 +1594,9 @@ block.kiln.name = Pembakar block.graphite-press.name = Pencetak Grafit block.multi-press.name = Multi-Cetak block.constructing = {0} [lightgray](Membangun) -block.spawn.name = Titik Musuh Muncul -block.remove-wall.name = Remove Wall -block.remove-ore.name = Remove Ore +block.spawn.name = Titik Pendaratan Musuh +block.remove-wall.name = Hapus Dinding +block.remove-ore.name = Hapus Bijih block.core-shard.name = Inti: Shard block.core-foundation.name = Inti: Foundation block.core-nucleus.name = Inti: Nucleus @@ -1642,7 +1646,7 @@ block.dark-panel-6.name = Panel Gelap 6 block.dark-metal.name = Besi Gelap block.basalt.name = Basal block.hotrock.name = Batu Panas -block.magmarock.name = Batu Lahar +block.magmarock.name = Batu Magma block.copper-wall.name = Dinding Tembaga block.copper-wall-large.name = Dinding Tembaga Besar block.titanium-wall.name = Dinding Titanium @@ -1674,8 +1678,8 @@ block.reinforced-message.name = Pesan yang Diperkuat block.world-message.name = Pesan Dunia block.world-switch.name = Saklar Dunia block.illuminator.name = Lampu -block.overflow-gate.name = Gerbang Luap -block.underflow-gate.name = Gerbang Luap Terbalik +block.overflow-gate.name = Gerbang Luapan +block.underflow-gate.name = Gerbang Luapan Terbalik block.silicon-smelter.name = Pelebur Silikon block.phase-weaver.name = Pengerajut Phase block.pulverizer.name = Penghancur @@ -1755,9 +1759,10 @@ block.spectre.name = Spectre block.meltdown.name = Meltdown block.foreshadow.name = Foreshadow block.container.name = Kontainer -block.launch-pad.name = Alas Peluncur -block.advanced-launch-pad.name = Launch Pad -block.landing-pad.name = Landing Pad +block.launch-pad.name = Alas Peluncur (Warisan) +block.advanced-launch-pad.name = Alas Peluncur +block.landing-pad.name = Alas Pendaratan + block.segment.name = Segment block.ground-factory.name = Pabrik Unit Darat block.air-factory.name = Pabrik Unit Udara @@ -1783,11 +1788,11 @@ block.constructor.description = Membuat bangunan hingga ubin berukuran 2x2. block.large-constructor.name = Konstruktor Besar block.large-constructor.description = Membuat bangunan hingga ubin berukuran 4x4. block.deconstructor.name = Dekonstruktor Besar -block.deconstructor.description = Mendekonstruksi bangunan dan unit. Mengembalikan 100% dari biaya bahan. +block.deconstructor.description = Mendekonstruksi bangunan dan unit. Mengembalikan 100% dari biaya pembuatan. block.payload-loader.name = Pemuat Muatan -block.payload-loader.description = Memuat cairan dan bahan ke dalam blok. +block.payload-loader.description = Memuat cairan dan item ke dalam blok. block.payload-unloader.name = Pembongkar Muatan -block.payload-unloader.description = Membongkar cairan dan bahan dari blok. +block.payload-unloader.description = Membongkar muatan cairan dan item dari blok. block.heat-source.name = Sumber Panas block.heat-source.description = Blok ukuran 1x1 yang memberikan panas tak terhingga. @@ -1854,7 +1859,7 @@ block.electric-heater.name = Pemanas Listrik block.slag-heater.name = Pemanas Lava block.phase-heater.name = Pemanas Phase block.heat-redirector.name = Pengalih Panas -block.small-heat-redirector.name = Small Heat Redirector +block.small-heat-redirector.name = Pengalih Panas Kecil block.heat-router.name = Pengarah Panas block.slag-incinerator.name = Insinerator Lava block.carbide-crucible.name = Tungku Peleburan Karbit @@ -1881,7 +1886,7 @@ block.shield-projector.name = Proyektor Perisai block.large-shield-projector.name = Proyektor Perisai Besar block.armored-duct.name = Pipa Lapis Baja block.overflow-duct.name = Pipa Luapan -block.underflow-duct.name = Pipa Arus Bawah +block.underflow-duct.name = Pipa Luapan Terbalik block.duct-unloader.name = Pipa Pembongkar Muatan block.surge-conveyor.name = Konveyor Berbahan Logam block.surge-router.name = Pengarah Berbahan Logam @@ -1890,7 +1895,7 @@ block.unit-cargo-unload-point.name = Titik Bongkar Muatan Unit Kargo block.reinforced-pump.name = Pompa yang Diperkuat block.reinforced-conduit.name = Saluran yang Diperkuat block.reinforced-liquid-junction.name = Persimpangan Cairan yang Diperkuat -block.reinforced-bridge-conduit.name = Saluran Jembatan yang Diperkuat +block.reinforced-bridge-conduit.name = Jembatan Saluran yang Diperkuat block.reinforced-liquid-router.name = Pengarah Cairan yang Diperkuat block.reinforced-liquid-container.name = Kontainer Cairan yang Diperkuatkan block.reinforced-liquid-tank.name = Tangki Cairan yang Diperkuatkan @@ -1902,9 +1907,9 @@ block.chemical-combustion-chamber.name = Ruang Pembakaran Kimia block.pyrolysis-generator.name = Generator Pirolisis block.vent-condenser.name = Kondensor Ventilasi block.cliff-crusher.name = Penghancur Tebing -block.large-cliff-crusher.name = Advanced Cliff Crusher +block.large-cliff-crusher.name = Penghancur Tebing Canggih block.plasma-bore.name = Bor Plasma -block.large-plasma-bore.name = Bor Plasma Besar +block.large-plasma-bore.name = Bor Plasma Canggih block.impact-drill.name = Bor Tumbukan block.eruption-drill.name = Bor Erupsi block.core-bastion.name = Inti: Bastion @@ -1970,10 +1975,10 @@ hint.respawn.mobile = Anda telah mengambil alih kendali dari sebuah unit atau ba hint.desktopPause = Tekan [accent][[Spasi][] untuk menjeda dan menghentikan jeda permainan. hint.breaking = [accent]Klik kanan[] dan tarik untuk menghancurkan blok. hint.breaking.mobile = Aktifkan \ue817 [accent]palu[] di kanan bawah dan ketuk untuk menghancurkan blok.\n\nTahan jari Anda untuk beberapa saat lalu seret pada bagian yang dipilih untuk menghancurkannya. -hint.blockInfo = Lihat informasi dari sebuah blok dengan memilihnya di [accent]menu bangun[], lalu pilih tombol [accent][[?][] di sebelah kanan. +hint.blockInfo = Lihat informasi dari sebuah blok dengan memilihnya di [accent]menu bangunan[], lalu pilih tombol [accent][[?][] di sebelah kanan. hint.derelict = Bangunan berwarna [accent]abu-abu[] adalah sisa-sisa dari markas lama yang hancur dan tidak dapat berfungsi kembali.\n\nBangunan tersebut dapat [accent]didekonstruksi[] menjadi sumber daya. hint.research = Gunakan tombol \ue875 [accent]Penelitian[] untuk mempelajari teknologi baru. -hint.research.mobile = Gunakan tombol \ue875 [accent]Riset[] di \ue88c [accent]Menu[] untuk mempelajari teknologi baru. +hint.research.mobile = Gunakan tombol \ue875 [accent]Penelitian[] di \ue88c [accent]Menu[] untuk mempelajari teknologi baru. hint.unitControl = Tekan dan Tahan [accent][[L-ctrl][] dan [accent]klik[] untuk mengendalikan unit atau turret sekutu. hint.unitControl.mobile = [accent][Ketuk dua kali[] untuk mengendalikan unit atau turret sekutu. hint.unitSelectControl = Untuk mengendalikan unit, masuki [accent]mode perintah[] dengan menahan tombol [accent]L-shift.[]\nDalam mode perintah, klik dan seret untuk memilih unit. [accent]Klik Kanan[] pada suatu lokasi atau target untuk memerintahkan unit. @@ -1994,7 +1999,7 @@ hint.waveFire = [accent]Wave[] yang terisi dengan air akan memadamkan air dalam hint.generator = \uf879 [accent]Generator Pembakar[] membakar batu bara dan menghasilkan energi ke blok yang berdekatan.\n\nTransmisi energi dapat diperluas dengan \uf87f [accent]Simpul Daya[]. hint.guardian = Unit [accent]Penjaga[] adalah unit yang diperkuat. Amunisi lemah seperti [accent]Tembaga[] dan [accent]Timah[] [scarlet]tidak efektif[].\n\nGunakan menara yang lebih bagus atau amunisi yang lebih kuat seperti \uf835 [accent]Grafit[] \uf861Duo/\uf859Salvo untuk menghancurkan Penjaga. hint.coreUpgrade = Inti dapat ditingkatkan dengan cara [accent]meletakkan Inti yang lebih besar di atasnya[].\n\nLetakan sebuah inti \uf868 [accent]Foundation[] diatas inti \uf869 [accent]Shard[]. Pastikan terdapat ruang kosong dari bangunan yang lain. -hint.presetLaunch = [accent]Zona pendaratan[] yang berwarna abu-abu, seperti [accent]Hutan yang Beku[], dapat diluncurkan dari mana saja. Sektor seperti ini tidak perlu diluncurkan dari sektor terdekat milik Anda.\n\n[accent]Sektor yang bernomor[], seperti yang ini, bersifat [accent]opsional[]. +hint.presetLaunch = [accent]Zona pendaratan[] yang berwarna abu-abu, seperti [accent]Hutan Beku[], dapat diluncurkan dari mana saja. Sektor seperti ini tidak perlu diluncurkan dari sektor terdekat milik Anda.\n\n[accent]Sektor yang bernomor[], seperti yang ini, bersifat [accent]opsional[]. hint.presetDifficulty = Sektor ini memiliki [scarlet]tingkat ancaman musuh yang tinggi[].\nMeluncurkan ke sektor tersebut [accent]tidak disarankan[] tanpa teknologi yang sesuai dan persiapan yang matang. hint.coreIncinerate = Setelah inti penuh dengan suatu barang, barang yang sejenis akan [accent]dihanguskan[]. hint.factoryControl = Untuk menentukan [accent]tempat keluar[] unit pabrik, klik blok pabrik ketika dalam mode perintah, lalu klik kanan lokasi yang diinginkan.\nUnit yang diproduksi akan langsung bergerak ke tempat yang ditentukan. @@ -2002,27 +2007,27 @@ hint.factoryControl.mobile = Untuk menentukan [accent]tempat keluar[] unit pabri gz.mine = Bergerak di dekat \uf8c4 [accent]bijih tembaga[] di tanah dan klik untuk mulai menambang. gz.mine.mobile = Bergerak di dekat \uf8c4 [accent]bijih tembaga[] di tanah dan ketuk untuk mulai menambang. -gz.research = Buka \ue875 pohon teknologi.\nRiset \uf870 [accent]Bor Mekanik[], lalu pilih dari menu di kanan bawah.\nKlik pada tambalan tembaga untuk menempatkannya. -gz.research.mobile = Buka \ue875 pohon teknologi.\nRiset \uf870 [accent]Bor Mekanik[], lalu pilih dari menu di kanan bawah.\nKetuk pada tambalan tembaga untuk menempatkannya.\n\nKetuk \ue800 [accent]tanda centang[] di kanan bawah untuk mengonfirmasi. +gz.research = Buka \ue875 pohon teknologi.\nRiset \uf870 [accent]Bor Mekanis[], lalu pilih dari menu di kanan bawah.\nKlik pada tambalan tembaga untuk menempatkannya. +gz.research.mobile = Buka \ue875 pohon teknologi.\nRiset \uf870 [accent]Bor Mekanis[], lalu pilih dari menu di kanan bawah.\nKetuk pada tambalan tembaga untuk menempatkannya.\n\nKetuk \ue800 [accent]tanda centang[] di kanan bawah untuk mengonfirmasi. gz.conveyors = Riset dan tempatkan \uf896 [accent]konveyor[] untuk memindahkan sumber daya yang ditambang\ndari bor ke inti.\n\nKlik dan seret untuk menempatkan beberapa konveyor.\n[accent]Gulir[] untuk memutar arah konveyor gz.conveyors.mobile = Riset dan tempatkan \uf896 [accent]konveyor[] untuk memindahkan sumber daya yang ditambang\ndari bor ke inti.\n\nTahan jari Anda sebentar dan seret untuk menempatkan beberapa konveyor. -gz.drills = Perluas operasi penambangan.\ntempatkan lebih banyak Bor Mekanik.\nTambang 100 tembaga. +gz.drills = Perluas operasi penambangan.\ntempatkan lebih banyak Bor Mekanis.\nTambang 100 tembaga. gz.lead = \uf837 [accent]Timah[] adalah sumber daya lain yang umum digunakan.\nSiapkan bor untuk menambang timah. gz.moveup = \ue804 Bergerak ke atas untuk objektif lebih lanjut. -gz.turrets = Riset dan tempatkan 2 menara \uf861 [accent]Duo[] untuk mempertahankan inti.\nMenara Duo membutuhkan \uf838 [accent]amunisi[] dari konveyor. +gz.turrets = Riset dan tempatkan 2 menara \uf861 [accent]Duo[] untuk mempertahankan inti.\nMenara Duo membutuhkan amunisi \uf838 [accent]tembaga[] dari konveyor. gz.duoammo = Suplai menara Duo dengan [accent]tembaga[], menggunakan konveyor. gz.walls = [accent]Dinding[] dapat menahan kerusakan yang mencapai bangunan.\nTempatkan \uf8ae [accent]dinding tembaga[] di sekitar menara. gz.defend = Musuh datang, bersiaplah untuk bertahan. -gz.aa = Unit terbang tidak dapat dengan mudah dibunuh dengan menara standar.Menara\n\uf860 [accent]Scatter[] memberikan anti-udara yang sangat baik, tetapi membutuhkan \uf837 [accent]timah[] sebagai amunisi. +gz.aa = Unit terbang tidak dapat dengan mudah dibunuh dengan menara standar.\nMenara \uf860 [accent]Scatter[] memberikan anti-udara yang sangat baik, tetapi membutuhkan \uf837 [accent]timah[] sebagai amunisi. gz.scatterammo = Suplai Menara Scatter dengan [accent]timah[], menggunakan konveyor. gz.supplyturret = [accent]Suplai Menara gz.zone1 = Ini adalah zona pendaratan musuh. -gz.zone2 = Apa pun yang dibangun dalam radius tersebut akan hancur ketika gelombang mulai. -gz.zone3 = Gelombang akan dimulai sekarang.Bersiap. -gz.finish = Bangun lebih banyak menara, tambang lebih banyak sumber daya,\ndan bertahan melawan semua gelombang [accent]untuk menaklukkan sektor[]. +gz.zone2 = Apa pun yang dibangun dalam radius tersebut \nakan hancur ketika gelombang mulai. +gz.zone3 = Gelombang akan dimulai sekarang. Bersiap. +gz.finish = Bangun lebih banyak menara, tambang lebih banyak sumber daya,\ndan bertahanlah terhadap semua gelombang untuk [accent]menaklukkan sektor[]. -onset.mine = Klik untuk menambang \uf748 [accent]berillium[] dari dinding.\n\nGunakan tombol [accent][[WASD] untuk bergerak. -onset.mine.mobile = Ketuk untuk menambang \uf748 [accent]berillium[] dari dinding. +onset.mine = Klik untuk menambang \uf748 [accent]berilium[] dari dinding.\n\nGunakan tombol [accent][[WASD] untuk bergerak. +onset.mine.mobile = Ketuk untuk menambang \uf748 [accent]berilium[] dari dinding. onset.research = Buka \ue875 pohon teknologi.\nRiset, dan tempatkan \uf73e [accent]kondensor turbin[] di ventilasi.\nIni akan menghasilkan [accent]tenaga[]. onset.bore = Riset dan tempatkan \uf741 [accent]bor plasma[].\nIni secara otomatis mengekstraksi sumber daya dari dinding. onset.power = Untuk [accent]menyalakan[] bor plasma, riset dan tempatkan \uf73d [accent]simpul sinar[].\nHubungkan kondensor turbin ke bor plasma. @@ -2033,9 +2038,9 @@ onset.graphite = Blok yang lebih kompleks membutuhkan \uf835 [accent]grafit[].\n onset.research2 = Mulailah meneliti [accent]bangunan pabrik[].\nRiset \uf74d [accent]penghancur tebing[] dan \uf779 [accent]tungku listrik silikon[]. onset.arcfurnace = Tungku Listrik Silikon membutuhkan \uf834 [accent]pasir[] dan \uf835 [accent]grafit[] untuk membuat \uf82f [accent]silikon[].\n[accent]Tenaga[] juga dibutuhkan. onset.crusher = Gunakan \uf74d [accent]penghancur tebing[] untuk menambang pasir. -onset.fabricator = Gunakan [accent]unit[] untuk menjelajah peta, mempertahakan bangunan, dan menyerang musuh. Riset dan tempatkan \uf6a2 [accent]fabricator tank[]. +onset.fabricator = Gunakan [accent]unit[] untuk menjelajah peta, mempertahakan bangunan, dan menyerang musuh. Riset dan tempatkan \uf6a2 [accent]pabricator tank[]. onset.makeunit = Produksi sebuah unit.\nGunakan tombol "?" untuk melihat persyaratan pabrik yang dipilih. -onset.turrets = Unit sangatlah efektif, namun [accent]menara[] memberikan kemampuan pertahanan yang lebih baik jika digunakan secara efektif.\nTempatkan menara \uf6eb [accent]Breach[].\nMenara membutuhkan \uf748 [accent]amunisi[]. +onset.turrets = Unit sangatlah efektif, namun [accent]menara[] memberikan kemampuan pertahanan yang lebih baik jika digunakan secara efektif.\nTempatkan menara \uf6eb [accent]Breach[].\nMenara membutuhkan amunisi \uf748 [accent]berilium[]. onset.turretammo = Suplai menara dengan [accent]amunisi berillium.[] onset.walls = [accent]Dinding[] dapat mencegah kerusakan yang datang pada bangunan.\nTempatkan beberapa \uf6ee [accent]dinding berillium[] di sekitar menara. onset.enemies = Musuh datang, bersiaplah untuk bertahan. @@ -2116,7 +2121,7 @@ block.separator.description = Memisahkan komponen mineral dari lava. block.spore-press.description = Menekan polong spora menjadi minyak. block.pulverizer.description = Menghancurkan kepingan menjadi pasir. block.coal-centrifuge.description = Memadatkan minyak menjadi bongkahan batu bara. -block.incinerator.description = Menghancurkan bahan atau zat cair yang masuk. +block.incinerator.description = Menghancurkan item atau zat cair yang masuk. block.power-void.description = Menghilangkan semua tenaga yang masuk ke dalamnya. Khusus mode sandbox. block.power-source.description = Menghasilkan tenaga tak terhingga. Khusus mode sandbox. block.item-source.description = Mengeluarkan bahan tak terhingga. Khusus mode sandbox. @@ -2137,17 +2142,17 @@ block.phase-wall.description = Melindungi bangunan dari tembakan musuh, dan dapa block.phase-wall-large.description = Melindungi bangunan dari tembakan musuh, dan dapat memantulkan beberapa jenis peluru senjata. block.surge-wall.description = Melindungi bangunan dari tembakan musuh, dan dapat mengeluarkan setruman listrik. block.surge-wall-large.description = Melindungi bangunan dari tembakan musuh, dan dapat mengeluarkan setruman listrik. -block.scrap-wall.description = Protects structures from enemy projectiles. -block.scrap-wall-large.description = Protects structures from enemy projectiles. -block.scrap-wall-huge.description = Protects structures from enemy projectiles. -block.scrap-wall-gigantic.description = Protects structures from enemy projectiles. +block.scrap-wall.description = Melindungi bangunan dari tembakan musuh. +block.scrap-wall-large.description = Melindungi bangunan dari tembakan musuh. +block.scrap-wall-huge.description = Melindungi bangunan dari tembakan musuh. +block.scrap-wall-gigantic.description = Melindungi bangunan dari tembakan musuh. block.door.description = Dinding yang bisa dibuka dan ditutup. block.door-large.description = Dinding yang bisa dibuka dan ditutup. block.mender.description = Menyembuhkan blok di sekelilingnya secara berkala.\nGunakan silikon untuk meningkatkan jangkauan dan efisiensi (Opsional). block.mend-projector.description = Menyembuhkan blok di sekelilingnya secara berkala.\nGunakan phase fabric untuk meningkatkan jangkauan dan efisiensi (Opsional). -block.overdrive-projector.description = Menambah kecepatan bangunan sekitar.\nGunakan phase fabric untuk meningkatkan jangkauan dan efisiensi (Opsional). +block.overdrive-projector.description = Menambah kecepatan bangunan sekitar.\nGunakan phase fabric untuk meningkatkan jangkauan dan efisiensi (Opsional). Efek Pemercepat tidak dapat ditumpuk. block.force-projector.description = Menciptakan medan gaya heksagonal di sekelilingnya, melindungi bangunan dan unit di dalamnya dari kerusakan. Terlalu panas jika menerima banyak kerusakan. Gunakan cairan pendingin untuk mencegah panas berlebih (Opsional). Phase fabric meningkatkan ukuran perisai. -block.shock-mine.description = Mengeluarkan setruman listrik setelah di injak musuh. +block.shock-mine.description = Mengeluarkan setruman listrik setelah diinjak musuh. block.conveyor.description = Memindahkan barang ke depan. block.titanium-conveyor.description = Memindahkan barang ke depan. Lebih cepat daripada konveyor biasa. block.plastanium-conveyor.description = Memindahkan barang secara bertumpuk. Menerima barang dari belakang, dan membaginya ke tiga arah di depan. Membutuhkan beberapa titik pemuat dan pembongkar untuk hasil yang maksimal. @@ -2160,8 +2165,8 @@ block.router.description = Mendistribusikan barang ke 3 arah secara merata. block.router.details = Bisa sangat menggangu. Jangan meletakannya disamping bangunan pabrik, karena laju pengeluaran barang dapat tersumbat. block.distributor.description = Mendistribusikan barang ke 7 arah secara merata. block.overflow-gate.description = Hanya mengeluarkan barang ke kiri dan ke kanan jika bagian depan tertutup. -block.underflow-gate.description = Kebalikan dari gerbang luap. Mengeluarkan barang ke depan jika bagian kiri dan kanan tertutup. -block.mass-driver.description = Blok transportasi barang jarak jauh. Membawa beberapa barang dan menembaknya ke penembak massal lainnya. +block.underflow-gate.description = Kebalikan dari gerbang luapan. Mengeluarkan barang ke depan jika bagian kiri dan kanan tertutup. +block.mass-driver.description = Blok transportasi barang jarak jauh. Mengumpulkan sejumlah barang dan menembakkannya ke penembak massal lainnya. block.mechanical-pump.description = Memompa dan mengeluarkan cairan. Tidak membutuhkan tenaga. block.rotary-pump.description = Memompa dan mengeluarkan cairan. Membutuhkan tenaga. block.impulse-pump.description = Memompa dan mengeluarkan cairan. @@ -2174,8 +2179,8 @@ block.liquid-tank.description = Menyimpan jumlah cairan yang sangat banyak. Meng block.liquid-junction.description = Bertindak sebagai jembatan untuk dua saluran yang bersimpangan. block.bridge-conduit.description = Memindahkan cairan melewati tanah atau bangunan. block.phase-conduit.description = Memindahkan cairan melewati tanah atau bangunan. Memiliki jarak yang lebih jauh daripada jembatan cairan, namun membutuhkan tenaga. -block.power-node.description = Membawa tenaga ke simpul tersambung. Simpul akan menerima atau memberi tenaga ke atau dari blok yang disambung. -block.power-node-large.description = Mempunyai radius lebih besar dari simpul listrik biasa dan bisa menyambung hingga enam sumber listrik, sambungan atau simpul lainnya. +block.power-node.description = Mentransmisikan tenaga ke simpul tersambung. Simpul akan menerima atau memberi tenaga ke atau dari blok yang disambung. +block.power-node-large.description = Mempunyai radius yang lebih besar dari simpul listrik biasa. Dapat tersambung ke 15 simpul lainnya. block.surge-tower.description = Sebuah menara listrik dengan jangkauan sangat jauh dengan sambungan yang sedikit. block.diode.description = Tenaga baterai dapat mengalir hanya dari satu arah, tetapi hanya jika tenaga di sebelah lebih sedikit. block.battery.description = Menyimpan tenaga pada saat tenaga berlebih. Memberikan tenaga pada saat tenaga berkurang. @@ -2190,7 +2195,7 @@ block.solar-panel-large.description = Menghasilkan sedikit tenaga dari sinar mat block.thorium-reactor.description = Menghasilkan tenaga yang besar dari konsumsi torium. Membutuhkan pendinginan konstan. Akan meledak jika jumlah cairan pendingin yang disediakan tidak mencukupi block.impact-reactor.description = Menghasilkan tenaga dengan jumlah yang sangat banyak secara efisien. Membutuhkan banyak tenaga agar dapat menyalakan reaktor. block.mechanical-drill.description = Ketika ditempatkan pada bijih, mengeluarkan bahan dengan kecepatan lambat tanpa batas. Hanya mampu menambang sumber daya dasar. -block.pneumatic-drill.description = Bor yang ditingkatkan, mampu menambang titanium. Menambang dengan kecepatan lebih cepat daripada bor mekanik. +block.pneumatic-drill.description = Bor yang ditingkatkan, mampu menambang titanium. Menambang dengan kecepatan lebih cepat daripada bor mekanis. block.laser-drill.description = Mengebor lebih cepat lewat teknologi laser, tapi membutuhkan tenaga. Dapat menambang torium. block.blast-drill.description = Bor tercanggih. Membutuhkan banyak tenaga. block.water-extractor.description = Memompa air dari tanah. Gunakan jika tidak ada sumber air di sekitar. @@ -2207,9 +2212,9 @@ block.vault.description = Menyimpan semua tipe bahan dalam jumlah besar. Bahan d block.container.description = Menyimpan semua tipe bahan dalam jumlah kecil. Bahan dapat dikeluarkan dengan pembongkar muatan. block.unloader.description = Mengeluarkan bahan yang ditentukan dari bangunan. block.launch-pad.description = Meluncurkan muatan bahan ke sektor yang dipilih. -block.advanced-launch-pad.description = Launches batches of items to selected sectors. Only accepts one item type at a time. -block.advanced-launch-pad.details = Sub-orbital system for point-to-point transportation of resources. -block.landing-pad.description = Receives items from launch pads in other sectors. Requires large amounts of water to protect against impacts of landings. +block.advanced-launch-pad.description = Meluncurkan muatan bahan ke sektor yang dipilih. Hanya menerima satu jenis item dalam satu waktu. +block.advanced-launch-pad.details = Sistem sub-orbital untuk transportasi sumber daya point-to-point. +block.landing-pad.description = Menerima muatan bahan dari alas peluncur di sektor lain. Membutuhkan air dalam jumlah besar untuk melindungi alas dari dampak pendaratan. block.duo.description = Menembakkan peluru bergantian ke musuh. block.scatter.description = Menembakkan gumpalan timah, rongsokan atau metaglass ke target udara. block.scorch.description = Membakar musuh darat yang dekat dengannya. Sangat efektif dalam jarak dekat. @@ -2223,7 +2228,7 @@ block.fuse.description = Menembakkan tiga penusuk tajam jarak dekat ke musuh ter block.ripple.description = Menembakkan gugusan peluru ke musuh darat dari jarak jauh. block.cyclone.description = Menembakkan gumpalan peledak ke musuh terdekat. block.spectre.description = Menembakkan peluru besar yang menembus pelindung ke target udara dan darat. -block.meltdown.description = Mengisi dan menembakkan sinar laser yang terus-menerus ke musuh di sekitar. Membutuhkan pendingin untuk beroperasi. +block.meltdown.description = Mengisi dan menembakkan sinar laser secara terus-menerus ke musuh di sekitar. Membutuhkan pendingin untuk beroperasi. block.foreshadow.description = Menembakkan baut besar jarak jauh yang hanya menembak satu target. Mengutamakan musuh dengan batas darah tertinggi. block.repair-point.description = Memulihkan unit yang terluka di sekitar secara terus-menerus. block.segment.description = Merusakkan dan menghancurkan proyektil yang datang. Proyektil laser tidak akan ditargetkan. @@ -2231,7 +2236,7 @@ block.parallax.description = Menembakkan laser yang menarik target udara, juga m block.tsunami.description = Menembakkan cairan dalam jumlah dan tekanan besar ke arah musuh. Dapat memadamkan api secara otomatis jika diisi dengan air. block.silicon-crucible.description = Memurnikan silikon dari pasir dan batu bara, menggunakan pyratit sebagai sumber panas tambahan. Lebih efesien jika diletakkan di area yang panas. block.disassembler.description = Memisahkan lava menjadi mineral langka dalam efesiensi rendah. Bisa memproduksi torium. -block.overdrive-dome.description = Menambahkan kecepatan pada bangunan di sekitarnya. Membutuhkan phase fabric dan silikon untuk bekerja. +block.overdrive-dome.description = Menambahkan kecepatan pada bangunan di sekitarnya. Membutuhkan phase fabric dan silikon untuk bekerja. Efek Pemercepat tidak dapat ditumpuk. block.payload-conveyor.description = Memindahkan muatan yang besar, seperti unit dari pabrik. block.payload-router.description = Membagi muatan masukan menjadi 3 arah keluaran. block.ground-factory.description = Memproduksi unit darat. Hasil unit dapat digunakan secara langsung, atau dipindahkan ke rekonstruktor untuk ditingkatkan. @@ -2256,7 +2261,7 @@ block.repair-turret.description = Memulihkan unit terdekat yang sekarat dalam ja block.core-bastion.description = Inti markas. Terlindungi. Jika hancur, sektor jatuh ke tangan musuh. block.core-citadel.description = Inti markas. Sangat terlindungi. Menyimpan lebih banyak sumber daya dari pada Inti Bastion. block.core-acropolis.description = Inti markas. Sangat amat terlindungi. Menyimpan lebih banyak sumber daya dari pada Inti Citadel. -block.breach.description = Menembakkan amunisi berilium atau tungsten yang menusuk ke arah musuh. +block.breach.description = Menembakkan amunisi yang menusuk ke arah musuh. block.diffuse.description = Menembakkan semburan peluru dalam kerucut yang lebar. Mendorong musuh kebelakang. block.sublimate.description = Menembakkan pancaran api terus menerus ke arah musuh. Menembus pelindung. block.titan.description = Menembakkan peluru artileri eksplosif besar ke target darat. Membutuhkan hidrogen. @@ -2272,27 +2277,27 @@ block.electric-heater.description = Pemanas yang menghadap ke arah blok. Membutu block.slag-heater.description = Pemanas yang menghadap ke arah blok. Membutuhkan lava. block.phase-heater.description = Pemanas yang menghadap ke arah blok. Membutuhkan phase fabric. block.heat-redirector.description = Mengalihkan akumulasi panas ke blok lain. -block.small-heat-redirector.description = Redirects accumulated heat to other blocks. +block.small-heat-redirector.description = Mengalihkan akumulasi panas ke blok lain. block.heat-router.description = Menyebarkan akumulasi panas ke tiga arah. block.electrolyzer.description = Mengubah air menjadi gas hidrogen dan ozon. block.atmospheric-concentrator.description = Mengkonsentrasikan nitrogen dari atmosfer. Membutuhkan panas. block.surge-crucible.description = Membentuk Paduan Logam dari lava dan silikon. Membutuhkan panas. block.phase-synthesizer.description = Mensintesis phase fabric dari torium, pasir, dan ozon. Membutuhkan panas. block.carbide-crucible.description = Memadukan grafit dan tungsten menjadi karbida. Membutuhkan panas. -block.cyanogen-synthesizer.description = Mensintesis sianogen dari arkycite dan grafit. Membutuhkan panas. +block.cyanogen-synthesizer.description = Mensintesis sianogen dari arkisit dan grafit. Membutuhkan panas. block.slag-incinerator.description = Membakar benda atau cairan yang tidak mudah menguap. Membutuhkan lava. block.vent-condenser.description = Mengondensasi gas ventilasi ke dalam air. Membutuhkan tenaga. block.plasma-bore.description = Saat ditempatkan menghadap dinding bijih, mengeluarkan bahan tanpa batas. Membutuhkan daya dalam jumlah kecil. -block.large-plasma-bore.description = Bor plasma yang lebih besar. Mampu menambang tungsten dan thorium. Membutuhkan hidrogen dan tenaga. +block.large-plasma-bore.description = Bor plasma yang lebih besar. Mampu menambang tungsten dan torium. Membutuhkan hidrogen dan tenaga. block.cliff-crusher.description = Menghancurkan dinding, mengeluarkan pasir tanpa batas. Membutuhkan tenaga. Efisiensi bervariasi berdasarkan jenis dinding. -block.large-cliff-crusher.description = Crushes walls, outputting sand indefinitely. Requires power and ozone. Efficiency varies based on type of wall. Optionally consumes tungsten to increase efficiency. +block.large-cliff-crusher.description = Menghancurkan dinding, mengeluarkan pasir tanpa batas. Membutuhkan tenaga dan ozon. Efisiensi bervariasi berdasarkan jenis dinding. Gunakan Tungsten untuk meningkatkan efisiensi (Opsional). block.impact-drill.description = Saat ditempatkan pada bijih, mengeluarkan bahan dalam ledakan tanpa batas. Membutuhkan listrik dan air. -block.eruption-drill.description = Bor tumbukan yang ditingkatkan. Mampu menambang thorium. Membutuhkan hidrogen. +block.eruption-drill.description = Bor tumbukan yang ditingkatkan. Mampu menambang torium. Membutuhkan hidrogen. block.reinforced-conduit.description = Memindahkan cairan ke depan. Tidak menerima masukkan ke samping. block.reinforced-liquid-router.description = Mendistribusikan cairan secara merata ke semua sisi. block.reinforced-liquid-tank.description = Menyimpan sejumlah besar cairan. block.reinforced-liquid-container.description = Menyimpan jumlah cairan yang cukup besar. -block.reinforced-bridge-conduit.description = Memindahkan cairan melintasi bangunan dan medan. +block.reinforced-bridge-conduit.description = Memindahkan cairan melintasi medan dan bangunan block.reinforced-pump.description = Memompa dan mengeluarkan cairan. Membutuhkan hidrogen. block.beryllium-wall.description = Melindungi bangunan dari proyektil musuh. block.beryllium-wall-large.description = Melindungi bangunan dari proyektil musuh. @@ -2308,19 +2313,19 @@ block.duct.description = Memindahkan barang ke depan. Hanya mampu menyimpan satu block.armored-duct.description = Memindahkan barang ke depan. Tidak menerima masukan dari samping. block.duct-router.description = Mendistribusikan barang secara merata ke tiga arah. Hanya menerima barang dari sisi belakang. Dapat dikonfigurasi sebagai penyortir barang. block.overflow-duct.description = Hanya mengeluarkan barang ke samping jika jalur depan diblokir. -block.duct-bridge.description = Memindahkan barang di atas bangunan dan medan. +block.duct-bridge.description = Memindahkan barang di atas medan dan bangunan block.duct-unloader.description = Membongkarkan barang yang dipilih dari blok di belakangnya. Tidak dapat membongkar dari inti. -block.underflow-duct.description = Di seberang saluran pelimpah. Keluaran ke depan jika jalur kiri dan kanan terhalang. -block.reinforced-liquid-junction.description = Bertindak sebagai persimpangan antara dua saluran yang bersilangan. +block.underflow-duct.description = Kebalikan dari pipa luapan. Mengeluarkan barang ke depan jika jalur kiri dan kanan terblokir. +block.reinforced-liquid-junction.description = Bertindak sebagai persimpangan antara dua saluran penyeberangan. block.surge-conveyor.description = Memindahkan barang secara berkelompok. Dapat dipercepat dengan tenaga. Menghantarkan tenaga. block.surge-router.description = Mendistribusikan barang secara merata ke tiga arah dari konveyor lonjakan. Dapat dipercepat dengan tenaga. Menghantarkan tenaga. -block.unit-cargo-loader.description = Membuat drone kargo. Drone secara otomatis mendistribusikan barang ke Titik Bongkar muatan Kargo dengan filter yang cocok. -block.unit-cargo-unload-point.description = Bertindak sebagai titik bongkar muatan drone kargo. Menerima barang yang cocok dengan filter yang dipilih. +block.unit-cargo-loader.description = Membuat unit kargo. Unit kargo secara otomatis mendistribusikan barang ke titik bongkar muatan unit kargo dengan filter yang cocok. +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 daya ke blok lain secara ortogonal. Menyimpan sejumlah kecil daya. block.beam-tower.description = Mentransmisikan daya ke blok lain secara ortogonal. Menyimpan sejumlah besar daya. Jarak jauh. block.turbine-condenser.description = Menghasilkan tenaga ketika ditempatkan pada ventilasi. Menghasilkan sedikit air. -block.chemical-combustion-chamber.description = Menghasilkan tenaga dari arkycite dan ozon. -block.pyrolysis-generator.description = Menghasilkan tenaga dalam jumlah besar dari arkisit dan terak. Menghasilkan air sebagai produk sampingan. +block.chemical-combustion-chamber.description = Menghasilkan tenaga dari arkisit dan ozon. +block.pyrolysis-generator.description = Menghasilkan tenaga dalam jumlah besar dari arkisit dan lava. Menghasilkan air sebagai produk sampingan. block.flux-reactor.description = Menghasilkan daya dalam jumlah besar ketika dipanaskan. Membutuhkan sianogen sebagai penstabil. Daya yang dihasilkan dan kebutuhan sianogen sebanding dengan panas yang masuk.\nMeledak jika sianogen yang disediakan tidak mencukupi. block.neoplasia-reactor.description = Menggunakan arkisit, air, dan phase fabric untuk menghasilkan daya dalam jumlah besar. Menghasilkan panas dan neoplasma yang berbahaya sebagai produk sampingan.\nMeledak hebat jika neoplasma tidak dikeluarkan dari reaktor melalui saluran. block.build-tower.description = Secara otomatis membangun kembali bangunan dalam jangkauan dan membantu unit lain dalam konstruksi. @@ -2356,7 +2361,7 @@ unit.reign.description = Menembak semua musuh terdekat dengan rentetan peluru ta unit.nova.description = Menembak baut laser yang dapat merusak musuh dan memperbaiki bangunan sekutu. Dapat terbang. unit.pulsar.description = Menembak petir yang dapat merusak musuh dan memperbaiki bangunan sekutu. Dapat terbang. unit.quasar.description = Menembak sinar laser yang dapat menembus bangunan yang dapat merusak musuh dan memperbaiki bangunan sekutu. Dapat terbang. Memiliki perisai. -unit.vela.description = Menembak sinar laser besar dan kontinu yang dapat merusak musuh, membakarnya dan memperbaiki bangunan sekutu. Dapat terbang. +unit.vela.description = Menembak sinar laser besar secara terus menerus yang dapat merusak musuh, membakarnya dan memperbaiki bangunan sekutu. Dapat terbang. unit.corvus.description = Menembak sinar laser besar yang dapat merusak musuh dan memperbaiki bangunan sekutu. Dapat berjalan diatas hampir semua medan. unit.crawler.description = Berlari menuju musuh dan menghancurkan dirinya, yang dapat menghasilkan ledakan besar. unit.atrax.description = Menembak musuh dengan cairan lava kepada target darat. Dapat berjalan diatas hampir semua medan. @@ -2368,7 +2373,7 @@ unit.horizon.description = Menjatuhkan gugusan bom kepada musuh darat. unit.zenith.description = Menembak misil kepada musuh terdekat. unit.antumbra.description = Menembak rentetan peluru kepada musuh terdekat. unit.eclipse.description = Menembak dua sinar laser dan rentetan peluru kepada musuh terdekat. -unit.mono.description = Menambang tembaga dan timah secara otomatis, membawanya menuju inti. +unit.mono.description = Menambang tembaga dan timah secara otomatis, menyimpannya ke dalam inti. unit.poly.description = Membangun kembali bangunan yang hancur secara otomatis dan membantu unit lain dalam pembangunan. unit.mega.description = Memperbaiki bangunan secara otomatis. Dapat membawa bangunan dan unit darat kecil. unit.quad.description = Menjatuhkan bom besar kepada target darat, yang bisa memberbaiki bangunan sekutu dan merusak musuh. Dapat membawa unit darat berukuran sedang. @@ -2377,10 +2382,10 @@ unit.risso.description = Menembak rentetan misil dan peluru kepada semua musuh t unit.minke.description = Menembak cangkang pembakar dan peluru standar kepada musuh darat terdekat. unit.bryde.description = Menembak artileri jarak jauh dan misil kepada musuh. unit.sei.description = Menembak rentetan misil dan peluru yang dapat menembus pelindung kepada musuh. -unit.omura.description = Menembak railgun jarak jauh kepada musuh. Dapat memproduksi unit flare. -unit.alpha.description = Melindungi Inti Bagian dari musuh. Dapat membangun struktur. -unit.beta.description = Melindungi Inti Fondasi dari musuh. Dapat membangun struktur. -unit.gamma.description = Melindungi Inti Nukleus dari musuh. Dapat membangun struktur. +unit.omura.description = Menembak senapan rel jarak jauh penembus kepada musuh. Dapat memproduksi unit Flare. +unit.alpha.description = Melindungi Inti Shard dari musuh. Dapat membangun struktur. +unit.beta.description = Melindungi Inti Foundation dari musuh. Dapat membangun struktur. +unit.gamma.description = Melindungi Inti Nucleus dari musuh. Dapat membangun struktur. unit.retusa.description = Menembak torpedo pelacak. Memperbaiki unit sekutu. unit.oxynoe.description = Menembak aliran api pada musuh terdekat. Menargetkan proyektil musuh terdekat dengan titik menara pertahanan. unit.cyerce.description = Menembak misil yang membidik otomatis secara beruntun pada musuh. Memperbaiki unit sekutu. @@ -2403,14 +2408,14 @@ unit.avert.description = Menembak sepasang peluru yang memutar pada musuh. unit.obviate.description = Menembak sepasang bola listrik yang memutar pada musuh. unit.quell.description = Menembak misil pelacak jarak jauh pada musuh. Menahan bangunan perbaikan musuh. unit.disrupt.description = Menembak misil pelacak penekanan jarak jauh pada musuh. Menahan bangunan perbaikan musuh. -unit.evoke.description = Membangun struktur untuk melindungi inti Bastion. Memperbaiki bangunan dengan sebuah sinar. Dapat membawa bangunan hingga ukuran 2x2. -unit.incite.description = Membangun struktur untuk melindungi inti Citadel. Memperbaiki bangunan dengan sebuah sinar. Dapat membawa bangunan hingga ukuran 2x2. -unit.emanate.description = Membangun struktur untuk melindungi inti Acropolis. Memperbaiki bangunan dengan sebuah sinar. Dapat membawa bangunan hingga ukuran 2x2 +unit.evoke.description = Membangun struktur untuk melindungi Inti Bastion. Memperbaiki bangunan dengan sebuah sinar. Dapat membawa bangunan hingga ukuran 2x2. +unit.incite.description = Membangun struktur untuk melindungi Inti Citadel. Memperbaiki bangunan dengan sebuah sinar. Dapat membawa bangunan hingga ukuran 2x2. +unit.emanate.description = Membangun struktur untuk melindungi Inti Acropolis. Memperbaiki bangunan dengan sebuah sinar. Dapat membawa bangunan hingga ukuran 2x2 lst.read = Membaca angka dari memori sel yang dihubungkan. lst.write = Menulis angka ke memori sel yang dihubungkan. lst.print = Menambahkan teks ke daftar cetak.\nTidak dapat menampilkan apapun sampai [accent]Print Flush[] dipakai. -lst.printchar = Add a UTF-16 character or content icon to the print buffer.\nDoes not display anything until [accent]Print Flush[] is used. +lst.printchar = Tambahkan karakter UTF-16 atau ikon konten ke buffer cetak.\nTidak menampilkan apa pun sampai [accent]Print Flush[] digunakan. 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.drawflush = Mengeluarkan perintah [accent]Draw[] dari daftar antrean untuk ditampilkan. @@ -2452,7 +2457,7 @@ lst.sync = Sinkronkan variabel di seluruh jaringan.\nHanya dipanggil paling bany lst.playsound = Memutar suara. \nVolume dan kontrol suara dapat berupa nilai global, atau dihitung berdasarkan posisi. lst.makemarker = Buat penanda logika baru di dunia.\nSebuah ID untuk mengidentifikasi penanda ini harus disediakan.\nPenanda saat ini dibatasi hingga 20.000 per dunia. lst.setmarker = Tetapkan properti untuk penanda.\nID yang digunakan harus sama dengan instruksi Membuat Marker. -lst.localeprint = Tambahkan nilai properti peta lokal ke buffer teks.\nUntuk menyetel paket peta lokal di editor peta, cek [accent]Info Peta > Paket Local[].\nJika klien adalah perangkat seluler, coba cetak properti yang diakhiri dengan ".mobile" terlebih dahulu. +lst.localeprint = Tambahkan nilai properti peta lokal ke buffer teks.\nUntuk menyetel paket peta lokal di penyunting peta, cek [accent]Info Peta > Paket Lokal[].\nJika klien adalah perangkat seluler, coba cetak properti yang diakhiri dengan ".mobile" terlebih dahulu. lglobal.false = 0 lglobal.true = 1 @@ -2463,7 +2468,7 @@ lglobal.@degToRad = Mengalikan dengan angka ini untuk mengubah derajat ke radian lglobal.@radToDeg = Mengalikan dengan angka ini untuk mengubah radian ke derajat lglobal.@time = Waktu main dari simpanan saat ini, dalam milidetik -lglobal.@tick = Waktu main dari simpanan saat ini, dalam tick (1 detik = 60 ticks) +lglobal.@tick = Waktu main dari simpanan saat ini, dalam tick (1 detik = 60 tick) lglobal.@second = Waktu main dari simpanan saat ini, dalam detik lglobal.@minute = Waktu main dari simpanan saat ini, dalam menit lglobal.@waveNumber = Angka gelombang saat ini, jika gelombang diaktifkan @@ -2590,7 +2595,7 @@ lenum.player = Unit yang dikendalikan oleh pemain. lenum.ore = Bahan tambang. lenum.damaged = Bangunan sekutu yang rusak. -lenum.spawn = Titik munculnya musuh.\nDapat berupa inti atau suatu posisi. +lenum.spawn = Titik mendaratnya musuh.\nDapat berupa inti atau suatu posisi. lenum.building = Bangunan dalam suatu kumpulan. lenum.core = Inti apapun. @@ -2628,6 +2633,7 @@ unitlocate.building = Mengeluarkan variabel untuk bangunan yang terlihat. unitlocate.outx = Mengeluarkan koordinat X. unitlocate.outy = Mengeluarkan koordinat Y. unitlocate.group = Kumpulan bangunan yang akan dicari. + playsound.limit = Jika benar, cegah suara ini diputar \njika sudah diputar pada frame yang sama. lenum.idle = Tidak bergerak, namun tetap membangun/menambang.\nSifat awalan. @@ -2635,21 +2641,21 @@ lenum.stop = Berhenti bergerak/menambang/membangun. lenum.unbind = Mematikan kendali logika.\nLanjutkan A.I. standar. lenum.move = Bergerak ke posisi yang ditentukan. lenum.approach = Mendekati posisi dalam radius. -lenum.pathfind = Mencari arah ke tempat munculnya musuh. +lenum.pathfind = Mencari arah ke tempat pendaratan musuh. lenum.autopathfind = Secara otomatis menemukan jalur ke inti atau zona pendaratan musuh terdekat.\nIni sama dengan pathfinding musuh pada gelombang standar. lenum.target = Menembak pada posisi. lenum.targetp = Menembak target dengan perkiraan kecepatan. lenum.itemdrop = Menjatuhkan bahan. lenum.itemtake = Mengambil bahan dari suatu bangunan. lenum.paydrop = Menurunkan muatan yang ada. -lenum.paytake = Mengangkut muatan pada lokasi ini. +lenum.paytake = Membawa muatan pada lokasi ini. lenum.payenter = Masuk/mendarat pada blok muatan yang saat ini unit sedang berdiri. lenum.flag = Tanda numerik unit. lenum.mine = Menambang pada sebuah posisi. -lenum.build = Membangun sebuah sttruktur. +lenum.build = Membangun sebuah struktur. lenum.getblock = Ambil tipe bangunan, lantai dan blok pada koordinat.\nUnit harus berada dalam jangkauan posisinya, jika tidak maka null akan dikembalikan. lenum.within = Memeriksa apakah unit di dekat suatu posisi. -lenum.boost = Mulai/berhenti memdorong. +lenum.boost = Mulai/berhenti pendorong. lenum.flushtext = Flush cetak konten buffer ke penanda, jika ada.\nJika pengambilan disetel ke true, coba ambil properti dari paket peta lokal atau paket game. lenum.texture = Nama tekstur langsung dari atlas tekstur game (menggunakan gaya penamaan kebab-case).\nJika printFlush disetel ke true, gunakan konten buffer teks sebagai argumen teks. From 75720d444c71b7a01cdefea65920ee3e9fe59982 Mon Sep 17 00:00:00 2001 From: SITUVNgcd <44901211+SITUVNgcd@users.noreply.github.com> Date: Wed, 5 Feb 2025 22:35:02 +0700 Subject: [PATCH 177/460] Update Vietnamese translation (#10405) * Update Vietnamese translation https://github.com/Anuken/Mindustry/commit/b4c88bc06c73295acd0f7b70c138dd68be98b710 - Translate new strings. - Update modified strings. * Breach description * UDP snapshots timed out. https://github.com/Anuken/Mindustry/commit/c98a539b07ab6c29c30cdb287fd6c9c7901264fe * "This will not be fixed." * Interplanetary Accelerator re-added * Launch pad (Legacy) rules * Strings from PRs --- core/assets/bundles/bundle_vi.properties | 69 ++++++++++++------------ 1 file changed, 35 insertions(+), 34 deletions(-) diff --git a/core/assets/bundles/bundle_vi.properties b/core/assets/bundles/bundle_vi.properties index 5b5b887d03..8a4b7cdb90 100644 --- a/core/assets/bundles/bundle_vi.properties +++ b/core/assets/bundles/bundle_vi.properties @@ -144,7 +144,7 @@ mod.enabled = [lightgray]Đã bật mod.disabled = [red]Đã tắt mod.multiplayer.compatible = [gray]Tương thích với chế độ nhiều người chơi mod.disable = Tắt -mod.version = Version: +mod.version = Phiên bản: mod.content = Nội dung: mod.delete.error = Không thể xóa mod. Tệp có thể đang được sử dụng. @@ -301,7 +301,7 @@ disconnect.error = Lỗi kết nối. disconnect.closed = Kết nối đã bị đóng. disconnect.timeout = Hết thời gian chờ. disconnect.data = Không tải được dữ liệu thế giới! -disconnect.snapshottimeout = Timed out while receiving UDP snapshots.\nThis may be caused by an unstable network or connection. +disconnect.snapshottimeout = Đã hết thời gian trong khi nhận ảnh chụp nhanh UDP.\nĐiều này xảy ra do mạng hoặc kết nối không ổn định. cantconnect = Không thể tham gia trò chơi ([accent]{0}[]). connecting = [accent]Đang kết nối... reconnecting = [accent]Đang kết nối lại... @@ -735,10 +735,10 @@ bannedunits.whitelist = Chỉ dùng các đơn vị bị cấm bannedblocks.whitelist = Chỉ dùng các khối bị cấm addall = Thêm tất cả launch.from = Đang phóng từ: [accent]{0} -launch.capacity = Sức chứa vật phẩm khi phóng: [accent]{0} +launch.capacity = Trữ lượng vật phẩm khi phóng: [accent]{0} launch.destination = Đích đến: {0} -landing.sources = Source Sectors: [accent]{0}[] -landing.import = Max Total Import: {0}[accent]{1}[lightgray]/min +landing.sources = Khu vực nguồn: [accent]{0}[] +landing.import = Tổng nhập tối đa: {0}[accent]{1}[lightgray]/phút configure.invalid = Số lượng phải là số trong khoảng 0 đến {0}. add = Thêm... guardian = Trùm @@ -753,7 +753,7 @@ error.mapnotfound = Không tìm thấy tệp bản đồ! error.io = Lỗi mạng đầu vào/ra. error.any = Lỗi mạng không xác định. error.bloom = Không khởi tạo được hiệu ứng phát sáng.\nThiết bị của bạn có thể không hỗ trợ. -error.moddex = Mindustry không thể nạp bản mod này.\nThiết bị của bạn đang chặn nhập mod Java do thay đổi gần đây trong Android.\nKhông có giải pháp tạm thời nào cho vấn đề này. +error.moddex = Mindustry không thể nạp bản mod này.\nThiết bị của bạn đang chặn nhập mod Java do thay đổi gần đây trong Android.\nVấn đề này không thể sửa được. Không có giải pháp tạm thời nào cho vấn đề này. weather.rain.name = Mưa weather.snowing.name = Tuyết @@ -778,9 +778,9 @@ sectors.stored = Lưu trữ: sectors.resume = Tiếp tục sectors.launch = Phóng sectors.select = Chọn -sectors.launchselect = Select Launch Destination +sectors.launchselect = Chọn đích phóng sectors.nonelaunch = [lightgray]không có (mặt trời) -sectors.redirect = Redirect Launch Pads +sectors.redirect = Chuyển hướng bệ phóng sectors.rename = Đổi tên khu vực sectors.enemybase = [scarlet]Căn cứ địch sectors.vulnerable = [scarlet]Dễ bị tổn thất @@ -1094,7 +1094,7 @@ ability.stat.buildtime = thời gian xây [stat]{0} giây[lightgray] bar.onlycoredeposit = Chỉ được phép đưa vào lõi bar.drilltierreq = Cần máy khoan tốt hơn -bar.nobatterypower = Insufficieny Battery Power +bar.nobatterypower = Thiếu năng lượng pin bar.noresources = Thiếu tài nguyên bar.corereq = Yêu cầu lõi cơ bản bar.corefloor = Yêu cầu ô nền lõi @@ -1103,7 +1103,7 @@ bar.drillspeed = Tốc độ khoan: {0}/giây bar.pumpspeed = Tốc độ bơm: {0}/giây bar.efficiency = Hiệu suất: {0}% bar.boost = Tăng tốc: +{0}% -bar.powerbuffer = Battery Power: {0}/{1} +bar.powerbuffer = Pin: {0}/{1} bar.powerbalance = Năng lượng: {0}/giây bar.powerstored = Lưu trữ: {0}/{1} bar.poweramount = Năng lượng: {0} @@ -1114,7 +1114,7 @@ bar.capacity = Sức chứa: {0} bar.unitcap = {0} {1}/{2} bar.liquid = Chất lỏng bar.heat = Nhiệt lượng -bar.cooldown = Cooldown +bar.cooldown = Hồi phục bar.instability = Bất ổn định bar.heatamount = Nhiệt lượng: {0} bar.heatpercent = Nhiệt lượng: {0} ({1}%) @@ -1147,8 +1147,8 @@ bullet.healamount = [stat]{0}[lightgray] sửa chữa trực tiếp bullet.multiplier = [stat]{0}[lightgray] đạn/vật phẩm bullet.reload = [stat]{0}%[lightgray] tốc độ bắn bullet.range = [stat]{0}[lightgray] ô phạm vi -bullet.notargetsmissiles = [stat] ignores buildings -bullet.notargetsbuildings = [stat] ignores missiles +bullet.notargetsmissiles = [stat] phớt lờ tên lửa +bullet.notargetsbuildings = [stat] phớt lờ công trình unit.blocks = khối unit.blockssquared = khối² @@ -1242,13 +1242,13 @@ setting.mutemusic.name = Tắt nhạc setting.sfxvol.name = Âm lượng hiệu ứng âm thanh (SFX) setting.mutesound.name = Tắt âm setting.crashreport.name = Gửi báo cáo sự cố ẩn danh -setting.communityservers.name = Fetch Community Server List +setting.communityservers.name = Lấy danh sách máy chủ cộng đồng setting.savecreate.name = Tự động tạo bản lưu setting.steampublichost.name = Hiển thị trò chơi công khai setting.playerlimit.name = Giới hạn người chơi setting.chatopacity.name = Độ mờ trò chuyện setting.lasersopacity.name = Độ mờ kết nối năng lượng -setting.unitlaseropacity.name = Unit Mining Beam Opacity +setting.unitlaseropacity.name = Độ mờ tia khai khoáng của đơn vị setting.bridgeopacity.name = Độ mờ cầu setting.playerchat.name = Hiển thị bong bóng trò chuyện của người chơi setting.showweather.name = Hiện đồ họa thời tiết @@ -1407,7 +1407,7 @@ rules.unitcostmultiplier = Hệ Số Chi Phí Sản Xuất Đơn Vị rules.unithealthmultiplier = Hệ Số Độ Bền Của Đơn Vị rules.unitdamagemultiplier = Hệ Số Sát Thương Của Đơn Vị rules.unitcrashdamagemultiplier = Hệ Số Sát Thương Của Đơn Vị Khi Bị Bắn Rơi -rules.unitminespeedmultiplier = Unit Mine Speed Multiplier +rules.unitminespeedmultiplier = Hệ Số Tốc Độ Khai Khoáng Đơn Vị rules.solarmultiplier = Hệ Số Năng Lượng Mặt Trời rules.unitcapvariable = Lõi Tăng Giới Hạn Đơn Vị rules.unitpayloadsexplode = Khối Hàng Mang Theo Phát Nổ Cùng Đơn Vị @@ -1436,9 +1436,9 @@ rules.title.planet = Hành Tinh rules.lighting = Ánh Sáng rules.fog = Sương Mù Chiến Tranh rules.invasions = Kẻ Địch Xâm Lược Khu Vực -rules.legacylaunchpads = Legacy Launch Pad Mechanics -rules.legacylaunchpads.info = Allows using launch pads without landing pads, as in 7.0. -landingpad.legacy.disabled = [scarlet]\ue815 Disabled[lightgray] (Legacy Launch Pads enabled) +rules.legacylaunchpads = Cơ chế bệ phóng di sản +rules.legacylaunchpads.info = Cho phép dùng bệ phóng mà không cần bệ đáp, như trong bản 7.0. +landingpad.legacy.disabled = [scarlet]\ue815 Đã tắt[lightgray] (Bệ phóng di sản được bật) rules.showspawns = Hiện Khu Kẻ Địch Xuất Hiện rules.randomwaveai = Đợt Tấn Công AI Không Đoán Trước rules.fire = Lửa @@ -1759,9 +1759,10 @@ block.spectre.name = Spectre block.meltdown.name = Meltdown block.foreshadow.name = Foreshadow block.container.name = Thùng chứa -block.launch-pad.name = Bệ phóng -block.advanced-launch-pad.name = Launch Pad -block.landing-pad.name = Landing Pad +block.launch-pad.name = Bệ phóng [lightgray](Di sản) +block.advanced-launch-pad.name = Bệ phóng +block.landing-pad.name = Bệ đáp + block.segment.name = Segment block.ground-factory.name = Nhà máy Bộ binh block.air-factory.name = Nhà máy Không quân @@ -1858,7 +1859,7 @@ block.electric-heater.name = Máy nhiệt từ điện block.slag-heater.name = Máy nhiệt từ xỉ block.phase-heater.name = Máy nhiệt từ lượng tử block.heat-redirector.name = Khối điều hướng nhiệt -block.small-heat-redirector.name = Small Heat Redirector +block.small-heat-redirector.name = Khối điều hướng nhiệt nhỏ block.heat-router.name = Khối phân phát nhiệt block.slag-incinerator.name = Lò xỉ huỷ vật phẩm block.carbide-crucible.name = Máy nấu Carbide @@ -1906,9 +1907,9 @@ block.chemical-combustion-chamber.name = Bể điện hoá block.pyrolysis-generator.name = Máy phát điện nhiệt phân block.vent-condenser.name = Máy ngưng tụ hơi nước block.cliff-crusher.name = Máy nghiền vách đá -block.large-cliff-crusher.name = Advanced Cliff Crusher +block.large-cliff-crusher.name = Máy nghiền vách đá cao cấp block.plasma-bore.name = Khoan plasma -block.large-plasma-bore.name = Khoan plasma lớn +block.large-plasma-bore.name = Khoan plasma cao cấp block.impact-drill.name = Máy khoan động lực block.eruption-drill.name = Máy khoan siêu động lực block.core-bastion.name = Lõi: Pháo đài @@ -2149,7 +2150,7 @@ block.door.description = Một bức tường có thể mở và đóng. block.door-large.description = Một bức tường có thể mở và đóng. block.mender.description = Sửa chữa định kỳ các khối trong vùng lân cận.\nTùy chọn sử dụng silicon để tăng phạm vi và hiệu quả. block.mend-projector.description = Sửa chữa các khối lân cận.\nTùy chọn sử dụng sợi lượng tử để tăng phạm vi và hiệu quả. -block.overdrive-projector.description = Tăng tốc độ làm việc của các công trình gần đó.\nTùy chọn sử dụng sợi lượng tử để tăng phạm vi và hiệu quả. +block.overdrive-projector.description = Tăng tốc độ làm việc của các công trình gần đó.\nTùy chọn sử dụng sợi lượng tử để tăng phạm vi và hiệu quả. Không cộng dồn. block.force-projector.description = Tạo ra một trường lực lục giác xung quanh nó, bảo vệ các công trình và đơn vị bên trong khỏi bị hư hại.\nQuá nóng nếu chịu quá nhiều sát thương. Tùy chọn sử dụng chất làm mát để chống quá nhiệt. Sử dụng sợi lượng tử để tăng kích thước lá chắn. block.shock-mine.description = Giải phóng tia điện khi tiếp xúc với đơn vị đối phương. block.conveyor.description = Vận chuyển vật phẩm về phía trước. @@ -2211,9 +2212,9 @@ block.vault.description = Lưu trữ lượng lớn vật phẩm mỗi loại. M block.container.description = Lưu trữ lượng nhỏ vật phẩm mỗi loại. Mở rộng kho lưu trữ khi đặt kế bên một lõi. Nội dung có thể được lấy ra với điểm dỡ hàng. block.unloader.description = Lấy các vật phẩm được chọn từ các khối gần đó. block.launch-pad.description = Phóng lô vật phẩm vào khu vực được chọn. -block.advanced-launch-pad.description = Launches batches of items to selected sectors. Only accepts one item type at a time. -block.advanced-launch-pad.details = Sub-orbital system for point-to-point transportation of resources. -block.landing-pad.description = Receives items from launch pads in other sectors. Requires large amounts of water to protect against impacts of landings. +block.advanced-launch-pad.description = Phóng lô vật phẩm vào khu vực được chọn. Chỉ nhận một kiểu vật phẩm một lúc. +block.advanced-launch-pad.details = Hệ thống tiểu quỹ đạo để vận chuyển tài nguyên từ điểm này đến điểm khác. +block.landing-pad.description = Nhận vật phẩm từ bệ phóng ở khu vực khác. Cần một lượng nước lớn để bảo vệ chống lại va chạm khi đáp. block.duo.description = Bắn xen kẽ đạn vào kẻ địch. block.scatter.description = Bắn khối chì, phế liệu hoặc thuỷ tinh vào kẻ địch trên không. block.scorch.description = Đốt mọi kẻ địch trên mặt đất ở gần. Hiệu quả cao ở tầm gần. @@ -2235,7 +2236,7 @@ block.parallax.description = Bắn một tia kéo mục tiêu trên không và l block.tsunami.description = Phóng một tia chất lỏng mạnh vào kẻ địch. Tự chữa cháy nếu được cung cấp nước hoặc chất làm mát. block.silicon-crucible.description = Tinh chế silicon từ cát và than, sử dụng nhiệt thạch làm nguồn nhiệt phụ. Có hiệu quả cao hơn khi ở nơi nóng. block.disassembler.description = Tách xỉ thành lượng nhỏ các thành phần khoáng chất lạ với hiệu suất thấp. Có thể sản xuất thori. -block.overdrive-dome.description = Tăng tốc độ làm việc của các công trình lân cận. Sử dụng sợi lượng tử và silicon để hoạt động. +block.overdrive-dome.description = Tăng tốc độ làm việc của các công trình lân cận. Sử dụng sợi lượng tử và silicon để hoạt động. Không cộng dồn. block.payload-conveyor.description = Di chuyển những khối hàng lớn, chẳng hạn như các đơn vị từ nhà máy. Từ tính. Sử dụng ở những môi trường không trọng lực. block.payload-router.description = Tách những khối hàng đầu vào thành 3 hướng đầu ra. Hoạt động như một bộ lọc khi được thiết lập. Từ tính. Sử dụng ở những môi trường không trọng lực. block.ground-factory.description = Sản xuất đơn vị bộ binh. Các đơn vị đầu ra có thể được sử dụng trực tiếp, hoặc đưa vào máy tái thiết để nâng cấp. @@ -2260,7 +2261,7 @@ block.repair-turret.description = Sửa chữa những đơn vị bị hư hỏn block.core-bastion.description = Trung tâm của căn cứ. Bọc giáp. Một khi bị phá hủy, khu vực sẽ mất. block.core-citadel.description = Trung tâm của căn cứ. Bọc giáp tốt hơn. Lưu trữ nhiều vật phẩm hơn lõi Pháo đài. block.core-acropolis.description = Trung tâm của căn cứ. Được bọc giáp rất tốt. Lưu trữ nhiều vật phẩm hơn lõi Thủ Phủ. -block.breach.description = Bắn đạn beryl hoặc tungsten xuyên thấu vào kẻ địch. +block.breach.description = Bắn các loại đạn xuyên thấu vào kẻ địch. block.diffuse.description = Bắn một loạt đạn mảnh theo hình nón. Đẩy kẻ địch về phía sau. block.sublimate.description = Thổi tia lửa mạnh liên tục vào kẻ địch. Xuyên giáp. block.titan.description = Bắn đạn pháo nổ khổng lồ vào các mục tiêu trên mặt đất. Yêu cầu hy-đrô lỏng. @@ -2276,7 +2277,7 @@ block.electric-heater.description = Làm nóng công trình. Yêu cầu một l block.slag-heater.description = Làm nóng công trinh. Yêu cầu xỉ. block.phase-heater.description = Làm nóng công trình. Yêu cầu sợi lượng tử. block.heat-redirector.description = Chuyển lượng nhiệt nhận được sang các khối khác. -block.small-heat-redirector.description = Redirects accumulated heat to other blocks. +block.small-heat-redirector.description = Chuyển lượng nhiệt nhận được sang các khối khác. block.heat-router.description = Phân phát nhiệt nhận được sang ba hướng đầu ra. block.electrolyzer.description = Chuyển đổi nước thành hy-đrô lỏng và khí ô-zôn. Các khí xuất hai hướng đối nhau, được đánh dấu bằng các màu tương ứng. block.atmospheric-concentrator.description = Cô đặc ni-tơ từ khí quyển. Yêu cầu nhiệt. @@ -2289,7 +2290,7 @@ block.vent-condenser.description = Ngưng tụ khí từ lỗ hơi nước để block.plasma-bore.description = Khi được đặt đối diện với một bức tường quặng, sản xuất vô hạn vật phẩm. Yêu cầu một lượng điện nhỏ.\nTùy chọn sử dụng hy-đrô lỏng để tăng hiệu suất. block.large-plasma-bore.description = Một máy khoan plasma lớn hơn. Có thể khoan tungsten và thori. Yêu cầu hy-đrô lỏng và điện.\nTùy chọn sử dụng ni-tơ lỏng để tăng hiệu suất. block.cliff-crusher.description = Nghiền vách đá, xuất ra cát vô hạn. Yêu cầu năng lượng. Hiệu quả thay đổi dựa theo loại vách đá. -block.large-cliff-crusher.description = Crushes walls, outputting sand indefinitely. Requires power and ozone. Efficiency varies based on type of wall. Optionally consumes tungsten to increase efficiency. +block.large-cliff-crusher.description = Nghiền vách đá, xuất ra cát vô hạn. Yêu cầu năng lượng và ôzôn. Hiệu quả thay đổi dựa theo loại vách đá. Tùy chọn tiêu thụ tungsten để gia tăng hiệu suất. block.impact-drill.description = Khi được đặt lên một loại quặng, sản xuất vô hạn vật phẩm. Yêu cầu điện và nước. block.eruption-drill.description = Phiên bản cải tiến của máy khoan động lực. Có thể khoan thori. Yêu cầu hy-đrô lỏng. block.reinforced-conduit.description = Di chuyển chất lỏng về phía trước. Không nhận đầu vào nếu không phải ống dẫn từ các bên. @@ -2414,7 +2415,7 @@ unit.emanate.description = Xây công trình để phòng thủ lõi Đại đô lst.read = Đọc một số từ bộ nhớ được liên kết. lst.write = Ghi một số vào bộ nhớ được liên kết. lst.print = Thêm văn bản vào bộ đệm in.\nKhông hiển thị gì cho đến khi [accent]Print Flush[] được sử dụng. -lst.printchar = Add a UTF-16 character or content icon to the print buffer.\nDoes not display anything until [accent]Print Flush[] is used. +lst.printchar = Thêm một ký tự UTF-16 hoặc biểu tượng nội dung vào bộ đệm in.\nKhông hiển thị gì cho đến khi [accent]Print Flush[] được sử dụng. lst.format = Thay thế từ giữ chỗ tiếp theo trong bộ đệm văn bản bằng giá trị.\nKhông làm gì nếu khuôn mẫu từ giữ chỗ không hợp lệ.\nKhuôn mẫu từ giữ chỗ: "{[accent]số 0-9[]}"\nVí dụ:\n[accent]print "ví dụ {0}"\nformat "mẫu" lst.draw = Thêm một thao tác vào bộ đệm vẽ.\nKhông hiển thị gì cho đến khi [accent]Draw Flush[] được sử dụng. lst.drawflush = Đẩy các thao tác [accent]Draw[] theo trình tự đến màn hình. From ccaa79c3f1a667ef522fc28ec23b522f28a54d15 Mon Sep 17 00:00:00 2001 From: summoner001 Date: Wed, 5 Feb 2025 16:35:24 +0100 Subject: [PATCH 178/460] Update bundle_hu.properties (#10361) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Update bundle_hu.properties Translating new string. * Combining words because in Hungarian they have to be written together * Update achievements.vdf minor mispell fixes * Update bundle_hu.properties Replace ... with … * Update bundle_hu.properties Fix the „default” word -> alapértelemezett * Update bundle_hu.properties Improve the style of some text * Update bundle_hu.properties Improve the style of some text * Update bundle_hu.properties minor text fix * Update bundle_hu.properties I improve the mission description text to make it fit better with the rest of the game's description text. I'm a bit off, from the original text „Move up for further objectives.”, but it means the same thing, but I use mission and sector words. * Update bundle_hu.properties translate new strings * Update bundle_hu.properties fix a typo * Update bundle_hu.properties fixing inverted lines * Update bundle_hu.properties The word „Technológia fa” to be written as one in hungarian language rules. = Technológiafa Capitalise the new sentences * Update bundle_hu.properties translate new strings * Update bundle_hu.properties correcting capitalised words between sentences * Translating new string * Fix space * Fixing mistake * Delete extra line on the end of the bundle * Update bundle_hu.properties Translate new string * Update bundle_hu.properties Translate new strings * Update bundle_hu.properties follow the changes of the english bundle * Update bundle_hu.properties Translating new strings * Update bundle_hu.properties Fixing descriptions. * Update bundle_hu.properties Translating new strings * Update bundle_hu.properties fix a mistake :( --- core/assets/bundles/bundle_hu.properties | 193 +++++++++--------- .../metadata/steam/hungarian/achievements.vdf | 32 +-- 2 files changed, 113 insertions(+), 112 deletions(-) diff --git a/core/assets/bundles/bundle_hu.properties b/core/assets/bundles/bundle_hu.properties index 45f55965d5..9952170ae6 100644 --- a/core/assets/bundles/bundle_hu.properties +++ b/core/assets/bundles/bundle_hu.properties @@ -17,11 +17,11 @@ link.bug.description = Találtál egy szoftverhibát? Itt jelentheted linkopen = Ez a kiszolgáló egy hivatkozást küldött. Biztosan megnyitod?\nAkár kártékony is lehet!\n\n[sky]{0} linkfail = Nem sikerült megnyitni a hivatkozást!\nA webcím a vágólapra lett másolva. screenshot = Képernyőkép mentve ide: {0} -screenshot.invalid = Túl nagy a pálya, nincs elég memória a képernyőképhez. +screenshot.invalid = A pálya túl nagy és nem áll rendelkezésre elegendő memória a képernyőkép elkészítéséhez. gameover = A játéknak vége gameover.disconnect = A kapcsolat megszakadt gameover.pvp = A(z)[accent] {0}[] csapat nyert! -gameover.waiting = [accent]Várakozás a következő pályára... +gameover.waiting = [accent]Várakozás a következő pályára… highscore = [accent]Új rekord! copied = Másolva. indev.notready = A játéknak ez a része még nincs kész @@ -36,7 +36,7 @@ load.scripts = Parancsfájlok be.update = Új Bleeding Edge verzió áll rendelkezésre: be.update.confirm = Letöltöd és frissíted a játékot?\n\nAmint kész a frissítés, a játék automatikusan újraindul. -be.updating = Frissítés... +be.updating = Frissítés… be.ignore = Most nem be.noupdates = Nem található frissítés. be.check = Frissítések keresése @@ -55,12 +55,12 @@ mods.browser.sortdate = Rendezés dátum szerint mods.browser.sortstars = Rendezés értékelés szerint schematic = Vázlat -schematic.add = Vázlat mentése... +schematic.add = Vázlat mentése… schematics = Vázlatok -schematic.search = Vázlat keresése... +schematic.search = Vázlat keresése… schematic.replace = Már van ilyen nevű vázlat. Lecseréled? schematic.exists = Már van ilyen nevű vázlat. -schematic.import = Vázlat importálása... +schematic.import = Vázlat importálása… schematic.exportfile = Exportálás fájlba schematic.importfile = Importálás fájlból schematic.browseworkshop = Steam Műhely megtekintése @@ -144,7 +144,7 @@ mod.enabled = [lightgray]Aktív mod.disabled = [red]Inaktív mod.multiplayer.compatible = [gray]Többjátékos kompatibilis mod.disable = Letiltás -mod.version = Version: +mod.version = Verzió: mod.content = Tartalom: mod.delete.error = Nem lehet törölni a modot. Lehet, hogy egy másik folyamat használja. @@ -200,8 +200,8 @@ campaign.erekir = Újabb, csiszoltabb tartalom. Többnyire lineáris játékmene campaign.serpulo = Régebbi tartalom. A klasszikus élmény. Nyíltabb végű, több tartalommal.\n\nPotenciálisan kiegyensúlyozatlan pályák és hadjárat. Kevésbé csiszolt. campaign.difficulty = Nehézségi szint completed = [accent]Kifejlesztve -techtree = Technológia fa -techtree.select = Technológia fa kiválasztása +techtree = Technológiafa +techtree.select = Technológiafa kiválasztása techtree.serpulo = Serpulo techtree.erekir = Erekir research.load = Betöltés @@ -214,7 +214,7 @@ players = {0} játékos players.single = {0} játékos players.search = Keresés players.notfound = [gray]Nem található játékos -server.closing = [accent]Kiszolgáló bezárása... +server.closing = [accent]Kiszolgáló bezárása… server.kicked.kick = Ki lettél rúgva a kiszolgálóról! server.kicked.whitelist = Nem vagy az engedélyezési listán. server.kicked.serverClose = A kiszolgáló be lett zárva. @@ -238,7 +238,7 @@ hostserver = Többjátékos játék invitefriends = Barátok meghívása hostserver.mobile = Többjátékos játék host = Kiszolgáló nyitása -hosting = [accent]Kiszolgáló megnyitása... +hosting = [accent]Kiszolgáló megnyitása… hosts.refresh = Frissítés hosts.discovering = LAN játékok felderítése hosts.discovering.any = Játékok felderítése @@ -301,11 +301,11 @@ disconnect.error = Kapcsolódási hiba. disconnect.closed = Kapcsolat lezárva. disconnect.timeout = Időtúllépés. disconnect.data = Nem sikerült betölteni a világ adatait! -disconnect.snapshottimeout = Timed out while receiving UDP snapshots.\nThis may be caused by an unstable network or connection. +disconnect.snapshottimeout = Időtúllépés történt az UDP-pillanatképek fogadása közben.\nEzt instabil hálózat vagy -kapcsolat okozhatja. cantconnect = Nem sikerült kapcsolódni a(z) ([accent]{0}[]) játékhoz. -connecting = [accent]Kapcsolódás... -reconnecting = [accent]Újrakapcsolódás... -connecting.data = [accent]Világadatok betöltése... +connecting = [accent]Kapcsolódás… +reconnecting = [accent]Újrakapcsolódás… +connecting.data = [accent]Világadatok betöltése… server.port = Port: server.invalidport = Érvénytelen port! server.error.addressinuse = [scarlet]Nem sikerült megnyitni a kiszolgálót a 6567-es porton.[]\n\nGyőződj meg arról, hogy nem fut más Mindustry-kiszolgáló az eszközön vagy a hálózaton! @@ -333,7 +333,7 @@ save.corrupted = A mentési fájl sérült vagy érvénytelen! empty = <üres> on = Be off = Ki -save.search = Keresés a mentett játékok között... +save.search = Keresés a mentett játékok között… save.autosave = Automatikus mentés: {0} save.map = Pálya: {0} save.wave = Hullám: {0} @@ -383,9 +383,9 @@ data.exported = Adatok exportálva. data.invalid = Ezek érvénytelen játékadatok. data.import.confirm = A külső adatok importálása felülírja[scarlet] minden[] jelenlegi játékadatodat.\n[accent]Ezt a műveletet nem lehet visszavonni![]\n\nAmint kész az importálás, a játék automatikusan kilép. quit.confirm = Biztosan kilépsz? -loading = [accent]Betöltés... -downloading = [accent]Letöltés... -saving = [accent]Mentés... +loading = [accent]Betöltés… +downloading = [accent]Letöltés… +saving = [accent]Mentés… respawn = [accent][[{0}][] az újraéledéshez cancelbuilding = [accent][[{0}][] a tervrajz törléséhez selectschematic = [accent][[{0}][] a kijelöléshez és másoláshoz @@ -399,8 +399,8 @@ wave = [accent]{0}. hullám wave.cap = [accent]{0}./{1} hullám wave.waiting = [lightgray]A következő hullám elkezdődik: {0} mp múlva wave.waveInProgress = [lightgray]Hullám folyamatban -waiting = [lightgray]Várakozás... -waiting.players = Várakozás a játékosokra... +waiting = [lightgray]Várakozás… +waiting.players = Várakozás a játékosokra… wave.enemies = [lightgray]{0} ellenség maradt wave.enemycores = [accent]{0}[lightgray] ellenséges támaszpont wave.enemycore = [accent]{0}[lightgray] ellenséges támaszpont @@ -427,7 +427,7 @@ changelog = Változáslista (nem kötelező): updatedesc = Cím és leírás felülírása eula = Steam EULA missing = Ezt az elemet törölték vagy áthelyezték.\n[lightgray]A Steam Műhely adatai automatikusan le lettek választva. -publishing = [accent]Közzététel... +publishing = [accent]Közzététel… publish.confirm = Biztosan közzéteszed ezt az elemet?\n\n[lightgray]Győződj meg arról, hogy elfogadtad a Steam Műhely EULA-t, különben az elemeid nem jelennek meg! publish.error = Hiba az elem közzétételekor: {0} steam.error = Nem sikerült előkészíteni a Steam szolgáltatásokat.\nHiba: {0} @@ -459,7 +459,7 @@ editor.playtest = Teszt a játékban editor.publish.workshop = Közzététel a Steam Műhelyben editor.newmap = Új pálya editor.center = Ugrás középre -editor.search = Pályák keresése... +editor.search = Pályák keresése… editor.filters = Pályák szűrése editor.filters.mode = Játékmódok: editor.filters.type = Pályatípus: @@ -484,7 +484,7 @@ waves.spawn.none = [scarlet]nem találhatók kezdőpontok a pályán waves.max = egységkorlát waves.guardian = Őrző waves.preview = Előnézet -waves.edit = Szerkesztés... +waves.edit = Szerkesztés… waves.random = Véletlenszerű waves.copy = Másolás a vágólapra waves.load = Betöltés a vágólapról @@ -496,7 +496,7 @@ waves.sort.reverse = Rendezés visszafelé waves.sort.begin = Kezdés waves.sort.health = Élet waves.sort.type = Típus -waves.search = Hullám keresése... +waves.search = Hullám keresése… waves.filter = Egységszűrő waves.units.hide = Összes elrejtése waves.units.show = Összes megjelenítése @@ -507,8 +507,8 @@ wavemode.totals = összesítés wavemode.health = életpontok all = Összes -editor.default = [lightgray] -details = Részletek... +editor.default = [lightgray] +details = Részletek… edit = Szerkesztés variables = Változók logic.clear.confirm = Biztosan törölni akarod az összes kódot ebből a processzorból? @@ -542,14 +542,14 @@ editor.saved = Mentve! editor.save.noname = A pályádnak nincs neve! Állíts be egyet a „pályainformációk” menüben. editor.save.overwrite = A pályád felülír egy beépített pályát! Válassz egy másik nevet a „pályainformációk” menüben. editor.import.exists = [scarlet]Nem lehet importálni:[] Már létezik a(z) „{0}” nevű beépített pálya! -editor.import = Importálás... +editor.import = Importálás… editor.importmap = Pálya importálása editor.importmap.description = Létező pálya importálása editor.importfile = Fájl importálása editor.importfile.description = Egy külső pályafájl importálása editor.importimage = Képfájl importálása editor.importimage.description = Egy külső pályaképfájl importálása -editor.export = Exportálás... +editor.export = Exportálás… editor.exportfile = Fájl exportálása editor.exportfile.description = Exportálás egy pályafájlba editor.exportimage = Domborzati kép exportálása @@ -635,9 +635,9 @@ locales.applytoall = Változások alkalmazása az összes nyelvi csomagra locales.addtoother = Hozzáadás más nyelvi csomagokhoz locales.rollback = Visszaállítás az utoljára elfogadottra locales.filter = Tulajdonságszűrő -locales.searchname = Név keresése... -locales.searchvalue = Érték keresése... -locales.searchlocale = Nyelvi csomag keresése... +locales.searchname = Név keresése… +locales.searchvalue = Érték keresése… +locales.searchlocale = Nyelvi csomag keresése… locales.byname = Név szerint locales.byvalue = Érték szerint locales.showcorrect = Azon tulajdonságok megjelenítése, amelyek mindenhol egyedi értékekkel rendelkeznek és jelen vannak minden nyelvi csomagban. @@ -737,10 +737,10 @@ addall = Összes hozzáadása launch.from = Kilövés a(z) [accent]{0} szektorból launch.capacity = Nyersanyag-kapacitás a kilövéskor: [accent]{0} launch.destination = Úti cél: {0} -landing.sources = Source Sectors: [accent]{0}[] -landing.import = Max Total Import: {0}[accent]{1}[lightgray]/min +landing.sources = Forrásszektorok: [accent]{0}[] +landing.import = Maximális összmennyiség: {0}[accent]{1}[lightgray]/perc configure.invalid = A mennyiségnek 0 és {0} között kell lennie. -add = Hozzáadás... +add = Hozzáadás… guardian = Őrző connectfail = [scarlet]Kapcsolódási hiba:\n\n[accent]{0} @@ -753,7 +753,7 @@ error.mapnotfound = A pályafájl nem található! error.io = Internet I/O hiba. error.any = Ismeretlen hálózati hiba. error.bloom = A bloom hatás előkészítése nem sikerült.\nElőfordulhat, hogy az eszköz nem támogatja. -error.moddex = A Mindustry nem tudja betölteni ezt a modot.\nAz eszközöd blokkolja a Java modok importálását az Android legújabb változásai miatt.\nNincs ismert megoldás erre a problémára. +error.moddex = A Mindustry nem tudja betölteni ezt a modot.\nAz eszközöd blokkolja a Java modok importálását az Android legújabb változásai miatt.\nEz a hiba nem lesz javítva, mert nincs ismert megoldás erre a problémára. weather.rain.name = Eső weather.snowing.name = Hóesés @@ -778,9 +778,9 @@ sectors.stored = Tárolt nyersanyagok: sectors.resume = Folytatás sectors.launch = Kilövés sectors.select = Kiválasztás -sectors.launchselect = Select Launch Destination +sectors.launchselect = Célállomás kiválasztása sectors.nonelaunch = [lightgray]semmi (nap) -sectors.redirect = Redirect Launch Pads +sectors.redirect = Kilövőállások átirányítása sectors.rename = Szektor átnevezése sectors.enemybase = [scarlet]Ellenséges bázis sectors.vulnerable = [scarlet]Sebezhető @@ -832,7 +832,7 @@ sector.overgrowth.name = Túlburjánzás sector.tarFields.name = Kátránymezők sector.saltFlats.name = Sós síkságok sector.fungalPass.name = Gombahágó -sector.biomassFacility.name = Biomassza szintetizáló létesítmény +sector.biomassFacility.name = Biomassza-szintetizáló-létesítmény sector.windsweptIslands.name = Szélfútta szigetek sector.extractionOutpost.name = Kivonási helyőrség sector.facility32m.name = 32M-es létesítmény @@ -849,22 +849,22 @@ sector.weatheredChannels.name = Viharvert csatornák sector.mycelialBastion.name = Micéliumbástya sector.frontier.name = Frontvidék -sector.groundZero.description = Az ideális helyszín, hogy ismét belekezdjünk. Alacsony ellenséges fenyegetés. Kevés nyersanyag.\nGyűjts annyi rezet és ólmot, amennyit csak tudsz.\nHaladj tovább. -sector.frozenForest.description = Még itt, a hegyekhez közel is elterjedtek a spórák. A fagypont alatti hőmérséklet nem tudja örökké fogva tartani őket.\n\nFedezd fel az elektromosság erejét! Építs égetőerőműveket! Tanuld meg a foltozók használatát! +sector.groundZero.description = Az ideális helyszín, hogy ismét belekezdjünk. Alacsony ellenséges fenyegetés. Kevés nyersanyag.\nGyűjts annyi rezet és ólmot, amennyit csak tudsz.\nFolytasd a küldetést! +sector.frozenForest.description = Még itt, a hegyekhez közel is elterjedtek a spórák. A fagypont alatti hőmérséklet nem tudja örökké fogva tartani őket.\n\nFedezd fel az elektromosság erejét! Építs égetőerőműveket! Tanuld meg, hogyan használd a foltozókat! sector.saltFlats.description = A sivatag peremén terülnek el a Sós síkságok. Kevés nyersanyag található errefelé.\n\nAz ellenség egy raktárkomplexumot létesített itt. Pusztítsd el a támaszpontjukat! Kő kövön ne maradjon! -sector.craters.description = Víz gyűlt össze ebben a kráterben, amely régi háborúk emlékét őrzi. Szerezd vissza a területet. Gyűjts homokot! Olvassz üveget! Szivattyúzz vizet, hogy lehűtsd a fúróidat és lövegtornyaidat. +sector.craters.description = Víz gyűlt össze ebben a kráterben, amely régi háborúk emlékét őrzi. Szerezd vissza a területet. Gyűjts homokot! Olvassz üveget, és szivattyúzz vizet a fúróid és lövegtornyaid hűtéséhez! sector.ruinousShores.description = A pusztaság mögött a partvonal húzódik. Valaha ezen a helyen egy partvédelmi rendszer állt. Nem sok minden maradt belőle. Csak a legalapvetőbb védelmi szerkezetek maradtak érintetlenül, minden más csak törmelék lett.\nFolytasd a terjeszkedést! Fedezd fel újra a technológiát! -sector.stainedMountains.description = Mélyebben a szárazföldön fekszenek a hegyek, a spóráktól még érintetlenül.\nTermeld ki a bőséges titán készleteket a körzetben. Tanuld meg felhasználni!.\n\nAz ellenség itt nagyobb létszámban van jelen. Ne hagyj nekik időt, hogy a legerősebb egységeiket hadba állíthassák! +sector.stainedMountains.description = Mélyebben a szárazföldön fekszenek a hegyek, a spóráktól még érintetlenül.\nTermeld ki a bőséges titán készleteket a körzetben. Tanuld meg felhasználni!\n\nAz ellenség itt nagyobb létszámban van jelen. Ne hagyj nekik időt, hogy a legerősebb egységeiket hadba állíthassák! sector.overgrowth.description = Ez a terület közelebb esik a spórák forrásához, a spórák már kinőtték.\nAz ellenség egy helyőrséget létesített itt. Építs Mace egységeket! Pusztítsd el a bázist! -sector.tarFields.description = Egy olajtermelő övezet peremvidéke a hegyek és a sivatag között. Egy azon kevés szektorok közül, ahol még hasznosítható kátránykészletek találhatók.\nBár a terület elhagyatott, veszélyes ellenséges erők fészkelnek a közelben. Ne becsüld alá őket!\n\n[lightgray]Fedezd fel az olajfeldolgozási lehetőségeket, ha tudod! -sector.desolateRift.description = Egy extrém veszélyes zóna. Nyersanyagokban gazdag, de szűkös a hely. Magas a kockázat. Építs szárazföldi és légvédelmet, amint csak tudsz. Ne tévesszen meg a hosszú szünet az ellenség támadásai között. +sector.tarFields.description = Egy olajtermelő övezet peremvidéke a hegyek és a sivatag határán. Egy azon kevés szektorok közül, ahol még hasznosítható kátránykészletek találhatók.\nBár a terület elhagyatott, veszélyes ellenséges erők fészkelnek a közelben. Ne becsüld alá őket!\n\n[lightgray]Fedezd fel az olajfeldolgozási lehetőségeket, ha tudod! +sector.desolateRift.description = Ez egy rendkívül veszélyes zóna. Bár nyersanyagokban gazdag, kevés hely áll rendelkezésre. Magas a kockázat. Építs szárazföldi és légvédelmet, amint csak tudsz. Ne tévesszen meg a hosszú szünet az ellenség támadásai között. sector.nuclearComplex.description = Egy néhai tóriumkitermelő és feldolgozó létesítmény, romokban.\n[lightgray]Fedezd fel a tóriumot és a sokrétű felhasználását!\n\nAz ellenség nagy létszámban van jelen, és folyamatosan megfigyelés alatt tartják a környéket. sector.fungalPass.description = Átmeneti terület a magas hegyek és a mélyebben fekvő, spórák uralta lapály között. Egy kisebb ellenséges megfigyelő állomás található itt.\nSemmisítsd meg!\nHasználj Dagger és Crawler egységeket! Pusztítsd el a két támaszpontot! -sector.biomassFacility.description = A spórák származási helye. Ebben a létesítményben fejlesztették ki őket, és eredetileg itt is gyártották őket.\nFedezd fel az itt található technológiákat. Tenyészd ki a spórákat üzemanyag és műanyagok gyártásához.\n\n[lightgray]A létesítmény pusztulása nyomán a spórák elszabadultak és szétszóródtak a légkörben. A helyi ökoszisztémában semmi sem tudta felvenni a versenyt egy ennyire invazív életformával. +sector.biomassFacility.description = A spórák származási helye. Ebben a létesítményben fejlesztették ki őket, és eredetileg itt is gyártották őket.\nFedezd fel az itt található technológiákat. Tenyészd ki a spórákat, és használd őket üzemanyagok vagy műanyagok gyártásához.\n\n[lightgray]A létesítmény pusztulása nyomán a spórák elszabadultak és szétszóródtak a légkörben. A helyi ökoszisztémában semmi sem tudta felvenni a versenyt egy ennyire invazív életformával. sector.windsweptIslands.description = Távolabb, a partvonalon túl fekszik ez az elszigetelt szigetcsoport. A feljegyzések szerint egykor [accent]műanyagot[] gyártottak itt.\n\nVerd vissza az ellenség vízi egységeit! Állíts fel egy bázist a szigeteken! Fedezd fel az itt talált gyárakat! sector.extractionOutpost.description = Egy távoli ellenséges támaszpont, amelyet az ellenség azért épített, hogy nyersanyagokat juttasson el más szektorokba.\n\nA szektorok közötti szállítási technológia elengedhetetlen a további hódításhoz. Pusztítsd el a bázist. Fejleszd ki a kilövőállást. -sector.impact0078.description = Itt nyugszanak az ebbe a csillagrendszerbe érkező első csillagközi űrhajó maradványai.\n\nMents ki a romok alól mindent amit csak tudsz. Fedezd fel az épen maradt technológiákat. -sector.planetaryTerminal.description = A végső célpont.\n\nEzen a vízparti bázison egy olyan építmény található, amely képes támaszpontokat kilőni a közeli bolygókra. Rendkívül jól őrzik.\n\nGyárts vízi egységeket! Ártalmatlanítsd az ellenséget, amilyen gyorsan csak tudod! Találd meg a kilövőszerkezetet! +sector.impact0078.description = Itt nyugszanak az ebbe a csillagrendszerbe érkező első csillagközi űrhajó maradványai.\n\nMents ki mindent a romok alól, amit csak lehet. Fedezd fel az épségben maradt technológiákat. +sector.planetaryTerminal.description = A végső célpont.\n\nEzen a vízparti bázison egy olyan építmény található, amely képes támaszpontokat kilőni a közeli bolygókra. Rendkívül jól őrzik.\n\nGyárts vízi egységeket, és semmisítsd meg az ellenséget a lehető leggyorsabban! Találd meg a kilövőszerkezetet! sector.coastline.description = Ezen a helyen egy haditengerészeti egység technológiájának maradványait azonosították. Verd vissza az ellenséges támadásokat, foglald el ezt a szektort, és szerezd meg a technológiát. sector.navalFortress.description = Az ellenség bázist létesített egy távoli, természetes erődítményes szigeten. Pusztítsd el ezt az előőrsöt. Szerezd meg a fejlett hadihajó-technológiájukat, és fejleszd ki te is. sector.cruxscape.name = Zord vidék @@ -943,7 +943,7 @@ settings.controls = Irányítás settings.game = Játék settings.sound = Hangok settings.graphics = Grafika -settings.cleardata = Játékadatok törlése... +settings.cleardata = Játékadatok törlése… settings.clear.confirm = Biztosan törlöd ezeket az adatokat?\nEzt a műveletet nem lehet visszavonni! settings.clearall.confirm = [scarlet]FIGYELEM![]\nEz törli az összes adatot, beleértve a mentéseket, pályákat, felfedezéseket és a billentyűbeállításokat.\nAz „OK” gomb megnyomásával a játék minden adatot töröl, és automatikusan kilép. settings.clearsaves.confirm = Biztosan törlöd az összes mentést? @@ -1094,7 +1094,7 @@ ability.stat.buildtime = [stat]{0} mp[lightgray] építési idő bar.onlycoredeposit = Nyersanyagtárolás csak a támaszpontban. bar.drilltierreq = Erősebb fúró szükséges -bar.nobatterypower = Insufficieny Battery Power +bar.nobatterypower = Alacsony akkumulátor-töltöttség bar.noresources = Hiányzó nyersanyagok bar.corereq = Támaszpont szükséges bar.corefloor = Támaszpont-zónamező szükséges @@ -1103,7 +1103,7 @@ bar.drillspeed = Termelés: {0}/mp bar.pumpspeed = Termelés: {0}/mp bar.efficiency = Hatásfok: {0}% bar.boost = Erősítés: +{0}% -bar.powerbuffer = Battery Power: {0}/{1} +bar.powerbuffer = Akkumulátorok: {0}/{1} bar.powerbalance = Áram: {0}/mp bar.powerstored = Eltárolva: {0}/{1} bar.poweramount = Kapacitás: {0} @@ -1114,7 +1114,7 @@ bar.capacity = Tárhely: {0} bar.unitcap = {0} {1}/{2} bar.liquid = Folyadék bar.heat = Hő -bar.cooldown = Cooldown +bar.cooldown = Lehűlés bar.instability = Instabilitás bar.heatamount = Hő: {0} bar.heatpercent = Hő: {0} ({1}%) @@ -1147,8 +1147,8 @@ bullet.healamount = [stat]{0}[lightgray] közvetlen javítás bullet.multiplier = [stat]{0}[lightgray] lőszer/nyersanyag bullet.reload = [stat]{0}%[lightgray] tüzelési sebesség bullet.range = [stat]{0}[lightgray] mezős hatótávolság -bullet.notargetsmissiles = [stat] ignores buildings -bullet.notargetsbuildings = [stat] ignores missiles +bullet.notargetsmissiles = [stat] Nem veszi célba a rakétákat +bullet.notargetsbuildings = [stat] Nem veszi célba az épületeket unit.blocks = blokk unit.blockssquared = blokk² @@ -1258,7 +1258,7 @@ setting.macnotch.description = A változtatások érvénybe lépéséhez újrain steam.friendsonly = Csak barátok steam.friendsonly.tooltip = Csak a Steam-barátok tudnak kapcsolódni a játékodhoz.\nHa nem jelölöd be ezt a négyzetet, a játékod nyilvános lesz – bárki kapcsolódhat hozzá. public.beta = Ne feledd, hogy a játék béta verziójában nem tudsz nyilvános szobát nyitni. -uiscale.reset = A felület mérete megváltozott.\nAz „OK” gombbal megerősítheted ezt a méretet.\n[scarlet]Automatikus visszavonás és kilépés [accent] {0}[] másodperc múlva... +uiscale.reset = A felület mérete megváltozott.\nAz „OK” gombbal megerősítheted ezt a méretet.\n[scarlet]Automatikus visszavonás és kilépés [accent] {0}[] másodperc múlva… uiscale.cancel = Mégse és kilépés setting.bloom.name = Bloom keybind.title = Billentyűk átállítása @@ -1272,8 +1272,8 @@ placement.blockselectkeys = \n[lightgray]Kulcs: [{0}, keybind.respawn.name = Újraéledés keybind.control.name = Egység irányítása keybind.clear_building.name = Épület törlése -keybind.press = Nyomj meg egy gombot... -keybind.press.axis = Nyomj meg egy kart vagy gombot... +keybind.press = Nyomj meg egy gombot… +keybind.press.axis = Nyomj meg egy kart vagy gombot… keybind.screenshot.name = Pálya képernyőképe keybind.toggle_power_lines.name = Villanyvezetékek be/ki keybind.toggle_block_status.name = Blokkállapotok be/ki @@ -1436,9 +1436,9 @@ rules.title.planet = Bolygó rules.lighting = Világítás rules.fog = A háború köde rules.invasions = Ellenséges szektorokból érkező inváziók -rules.legacylaunchpads = Legacy Launch Pad Mechanics -rules.legacylaunchpads.info = Allows using launch pads without landing pads, as in 7.0. -landingpad.legacy.disabled = [scarlet]\ue815 Disabled[lightgray] (Legacy Launch Pads enabled) +rules.legacylaunchpads = Hagyományos kilövőállás-mechanizmus +rules.legacylaunchpads.info = Lehetővé teszi a kilövőállások használatát landolóállások nélkül, mint a v7.0-ban. +landingpad.legacy.disabled = [scarlet]\ue815 Letiltva[lightgray] (Hagyományos kilövőállás engedélyezve) rules.showspawns = Ellenséges kezdőpontok megjelenítése a minitérképen rules.randomwaveai = Kiszámíthatatlan ellenséges támadások (MI) rules.fire = Tűz @@ -1759,9 +1759,10 @@ block.spectre.name = Spectre block.meltdown.name = Meltdown block.foreshadow.name = Foreshadow block.container.name = Konténer -block.launch-pad.name = Kilövőállás -block.advanced-launch-pad.name = Launch Pad -block.landing-pad.name = Landing Pad +block.launch-pad.name = Kilövőállás [lightgray](Hagyományos) +block.advanced-launch-pad.name = Kilövőállás +block.landing-pad.name = Landolóállás + block.segment.name = Segment block.ground-factory.name = Földiegységgyár block.air-factory.name = Repülőgépgyár @@ -1858,7 +1859,7 @@ block.electric-heater.name = Elektromos fűtőtest block.slag-heater.name = Salakos fűtőtest block.phase-heater.name = Tóritkvarcos fűtőtest block.heat-redirector.name = Hőelvezető -block.small-heat-redirector.name = Small Heat Redirector +block.small-heat-redirector.name = Kis hőelvezető block.heat-router.name = Hőelosztó block.slag-incinerator.name = Salakos égetőkamra block.carbide-crucible.name = Karbidolvasztó @@ -1906,9 +1907,9 @@ block.chemical-combustion-chamber.name = Kémiai égetőkamra block.pyrolysis-generator.name = Pirolízis-erőmű block.vent-condenser.name = Vízleválasztó block.cliff-crusher.name = Sziklazúzó -block.large-cliff-crusher.name = Advanced Cliff Crusher +block.large-cliff-crusher.name = Fejlett sziklazúzó block.plasma-bore.name = Plazmafúró -block.large-plasma-bore.name = Nagy plazmafúró +block.large-plasma-bore.name = Fejlett plazmafúró block.impact-drill.name = Ütvefúró block.eruption-drill.name = Kitöréses fúró block.core-bastion.name = Bástya @@ -1976,8 +1977,8 @@ hint.breaking = [accent]Jobb egérgombbal[] és húzással lebonthatod a blokkok hint.breaking.mobile = Használd a jobb alsó sarokban lévő \ue817 [accent]kalapács[] gombot a blokkok törléséhez.\n\nTartsd lenyomva az ujjad és húzd, hogy nagyobb területet tudj kijelölni. hint.blockInfo = Egy blokk információinak megtekintéséhez válaszd ki az épületet az [accent]építési menüben[], majd válaszd a [accent][[?][] gomb jobb oldalt. hint.derelict = Az [accent]elhagyatott[] szerkezetek régi bázisok maradványai, amelyek már nem működnek.\n\nEzeket az épületeket le lehet [accent]bontani[] nyersanyagokért, vagy meg is lehet javítani őket. -hint.research = Használd a \ue875 [accent]technológia fa[] gombot, hogy új technológiákat fedezz fel. -hint.research.mobile = Használd a \ue875 [accent]technológia fa[] gombot a \ue88c [accent]menüben[], hogy új technológiákat fedezz fel. +hint.research = Használd a \ue875 [accent]technológiafa[] gombot, hogy új technológiákat fedezz fel. +hint.research.mobile = Használd a \ue875 [accent]technológiafa[] gombot a \ue88c [accent]menüben[], hogy új technológiákat fedezz fel. hint.unitControl = Nyomd le a [accent][[bal Ctrl][] gombot, és kattints [accent]jobb egérgombbal[] a baráti egység vagy lövegtorony irányításához. hint.unitControl.mobile = [accent][[Dupla koppintással][] a szövetséges egységek vagy lövegtornyok kézileg irányíthatók. hint.unitSelectControl = Az egységek irányításához lépj be [accent]parancs módba[] a [accent]bal shift[] lenyomva tartásával.\nParancs módban az egységek kijelöléséhez kattints, és húzd az egeret. A [accent]jobb egérgombbal[] küldd az egységeket a helyszínre vagy a célponthoz. @@ -1997,7 +1998,7 @@ hint.payloadDrop.mobile = [accent]Koppints és tartsd lenyomva az ujjad[] egy ü hint.waveFire = A vizet lőszerként használó [accent]Wave[] lövegtornyok automatikusan eloltják a közeli tüzeket. hint.generator = Az \uf879 [accent]égetőerőmű[] szenet éget, és áramot ad át a vele érintkező épületeknek.\n\nAz áramszállítás távolsága további \uf87f [accent]villanyoszlopokkal[] növelhető. hint.guardian = Az [accent]őrzők[] páncélozottak. A gyenge lövedékek, mint a [accent]réz[] vagy az [accent]ólom[] [scarlet]nem hatásosak[] az Őrző páncéljával szemben.\n\nHasználj magasabb szintű lövegtornyokat, vagy juttass \uf835 [accent]grafitot[] a \uf861 Duo / \uf859 Salvo lövegtornyokba, hogy leszedd az őrzőket. -hint.coreUpgrade = A támaszpont úgy fejleszthető, hogy [accent]magasabb szintű támaszpontot teszel rá[].\n\nHelyezz egy \uf868 [accent]Alapítvány[] támaszpontot a \uf869 [accent]Szilánk[] támaszpontra. Figyelj rá, hogy ne legyenek az új támaszpont területén épületek. +hint.coreUpgrade = A támaszpont úgy fejleszthető, hogy [accent]magasabb szintű támaszpontot teszel rá[].\n\nHelyezz egy \uf868 [accent]alapítvány[] támaszpontot a \uf869 [accent]szilánk[] támaszpontra. Figyelj rá, hogy ne legyenek az új támaszpont területén épületek. hint.presetLaunch = A szürke [accent]landolási zónát tartalmazó szektorokba[], amilyen például a [accent]Fagyott erdő[], bárhonnan kilőhetsz. Nem szükséges hozzá szomszédos területet elfoglalnod.\n\nA [accent]számozott szektorokat[], mint ez is, a játékmenet szempontjából [accent]nem fontos[] elfoglalni. hint.presetDifficulty = Ebben a szektorban [scarlet]magas az ellenséges fenyegetettségi szint[].\nAz ilyen szektorokba való indulás [accent]nem ajánlott[] megfelelő technológia és felkészülés nélkül. hint.coreIncinerate = Ha a támaszpont egy nyersanyagból elérte a maximumot, a beérkező további nyersanyagok azonnal [accent]megsemmisítésre kerülnek[]. @@ -2012,7 +2013,7 @@ gz.conveyors = Fejleszd ki, és építs \uf896 [accent]szállítsszalagokat[], h gz.conveyors.mobile = Fejleszd ki, és építs \uf896 [accent]Szállítószalagokat[], hogy a kitermelt\nnyersanyagokat eljuttasd a fúróktól a támaszpontba.\n\nTartsd lenyomva az ujjad és húzd el, hogy több szállítószalagot helyezz el. gz.drills = Bővítsd a bányászati kapacitást.\nÉpíts több mechanikus fúrót.\nBányássz 100 rezet. gz.lead = Az \uf837 [accent]ólom[] egy másik gyakran használt nyersanyag.\nÉpíts fúrókat az ólom kitermelésére. -gz.moveup = \ue804 Menj tovább a további utasításokért. +gz.moveup = \ue804 Fedezd fel a szektort, hogy megtaláld a küldetés további utasításait! gz.turrets = Fejleszd ki, és építs két \uf861 [accent]Duo[] lövegtornyot, hogy megvédd a támaszpontot.\nA Duo lövegtornyoknak \uf838 [accent]lőszerre[] van szükségük, amelyet szállítószalaggal juttathatsz el hozzájuk. gz.duoammo = Szállítószalagok segítségével lásd el [accent]rézzel[] a Duo lövegtornyokat. gz.walls = A [accent]falak[] megakadályozhatják, hogy az épületekben károk keletkezzenek.\nÉpíts \uf8ae [accent]Rézfalakat[] a lövegtornyok köré. @@ -2162,7 +2163,7 @@ block.sorter.description = Csak a kiválasztott nyersanyagot engedi tovább egye block.inverted-sorter.description = Hasonló a szokásos válogatóhoz, de a kiválasztott nyersanyagot oldalra adja ki. block.router.description = Egyenletesen háromfelé osztja szét a beérkező nyersanyagokat. block.router.details = Egy szükséges rossz. Nem ajánlott termelőegységek mellett használni, mert a kimenet eltömíti. -block.distributor.description = Egyenletesen hétfelé osztja szét a beérkező nyersanyagokat. +block.distributor.description = Egyenletesen, hétfelé osztja szét a beérkező nyersanyagokat. block.overflow-gate.description = Csak akkor ad ki nyersanyagot oldalra, ha előrefelé már nem tud. block.underflow-gate.description = A túlcsorduló kapu ellentettje. Csak akkor ad ki nyersanyagot előrefelé, ha oldalra már nem tud. block.mass-driver.description = Nagy hatótávolságú nyersanyagszállító eszköz. Rakományokat gyűjt össze, és átlövi egy másik, hozzákapcsolt tömegmozgatónak. @@ -2203,17 +2204,17 @@ block.cultivator.details = Visszaszerzett technológia. Hatalmas tömegű biomas block.oil-extractor.description = Nagy mennyiségű áramot fogyaszt, továbbá homokot és vizet igényel az olajfúráshoz. block.core-shard.description = Támaszpont. Ha elpusztul, a szektor elveszett. block.core-shard.details = Az első modell. Kompakt. Önsokszorosító. Egyszer használatos gyorsítórakétákkal van felszerelve, nem bolygóközi utazásra tervezték. -block.core-foundation.description = Támaszpont. Jól páncélozott. Több nyersanyagot tárol, mint a Szilánk. +block.core-foundation.description = Támaszpont. Jól páncélozott. Több nyersanyagot tárol, mint a szilánk. block.core-foundation.details = A második modell. block.core-nucleus.description = Támaszpont. Rendkívül jól páncélozott. Hatalmas mennyiségű nyersanyag tárolására képes. block.core-nucleus.details = A harmadik, végső modell. block.vault.description = Nagy mennyiséget tárol minden nyersanyagtípusból. Növeli a támaszpont tárolókapacitását, ha egy támaszpont mellé van helyezve. A tartalma kirakodó segítségével nyerhető ki. block.container.description = Kis mennyiséget tárol minden nyersanyagtípusból. Növeli a támaszpont tárolókapacitását, ha egy támaszpont mellé van helyezve. A tartalma kirakodó segítségével nyerhető ki. block.unloader.description = Kirakodja a szomszédos épületekből a kiválasztott nyersanyagot. -block.launch-pad.description = Nyersanyagokat juttat el más szektorokba. -block.advanced-launch-pad.description = Launches batches of items to selected sectors. Only accepts one item type at a time. -block.advanced-launch-pad.details = Sub-orbital system for point-to-point transportation of resources. -block.landing-pad.description = Receives items from launch pads in other sectors. Requires large amounts of water to protect against impacts of landings. +block.launch-pad.description = Nyersanyagokat juttat el a kiválasztott szektorokba. +block.advanced-launch-pad.description = Nyersanyagokat juttat el a kiválasztott szektorokba. Egyszerre csak egy nyersanyagtípust fogad el. +block.advanced-launch-pad.details = Szuborbitális rendszer a nyersanyagok szektorok között történő szállítására. +block.landing-pad.description = Fogadja a más szektorok kilövőállásaiból érkező nyersanyagokat. Nagy mennyiségű vízet igényel a landolások okozta hatásokkal szembeni védekezéshez. block.duo.description = Változatos lövedékekkel lő az ellenségre. block.scatter.description = Ólom-, törmelék- vagy ólomüvegdarabokat lő az ellenséges légi egységekre. block.scorch.description = Megégeti az ellenség közeli földi egységeit. Kis távolságra nagyon hatékony. @@ -2258,9 +2259,9 @@ block.repair-turret.description = Folyamatosan javítja a hatósugarában lévő #Erekir block.core-bastion.description = Támaszpont. Páncélozott. Ha elpusztul, a szektor elveszett. -block.core-citadel.description = Támaszpont. Nagyon jól páncélozott. Több nyersanyagot tárol, mint a Bástya. -block.core-acropolis.description = Támaszpont. Kivételesen jól páncélozott. Több nyersanyagot tárol, mint a Citadella. -block.breach.description = Átütő erejű berillium- vagy volfrámlövedéket lő az ellenséges célpontokra. +block.core-citadel.description = Támaszpont. Nagyon jól páncélozott. Több nyersanyagot tárol, mint a bástya. +block.core-acropolis.description = Támaszpont. Kivételesen jól páncélozott. Több nyersanyagot tárol, mint a citadella. +block.breach.description = Átütő erejű berillium-, volfrám- vagy karbidlövedéket lő az ellenséges célpontokra. block.diffuse.description = Széles kúpban lő ki lövedékeket. Visszalöki az ellenséges célpontokat. block.sublimate.description = Folyamatos lángcsóvát lő az ellenséges célpontokra. Átüti a páncélt. block.titan.description = Hatalmas robbanóanyagú tüzérségi lövedéket lő földi célpontokra. Hidrogént igényel. @@ -2275,9 +2276,9 @@ block.oxidation-chamber.description = A berilliumot és az ózont oxiddá alakí block.electric-heater.description = Fűti a vele szemben álló épületeket. Nagy mennyiségű áramot fogyaszt. block.slag-heater.description = Fűti a vele szemben álló épületeket. Salakot igényel. block.phase-heater.description = Fűti a vele szemben álló épületeket. Tóritkvarcot igényel. -block.heat-redirector.description = Más blokkokba irányítja a felgyülemlett hőt. -block.small-heat-redirector.description = Redirects accumulated heat to other blocks. -block.heat-router.description = A felgyülemlett hőt három kimeneti irányba osztja. +block.heat-redirector.description = Más blokkokba irányítja át a felgyülemlett hőt. +block.small-heat-redirector.description = Más blokkokba irányítja át a felgyülemlett hőt. +block.heat-router.description = A felgyülemlett hőt három kimeneti irányba osztja szét. block.electrolyzer.description = A vizet hidrogénné és ózonná alakítja. A keletkező gázokat két ellentétes irányba adja ki, amelyek a megfelelő színnel vannak jelölve. block.atmospheric-concentrator.description = Koncentrálja a légkörben lévő nitrogént. Hőt igényel. block.surge-crucible.description = Salakból és szilíciumból elektrometált olvaszt. Hőt igényel. @@ -2289,7 +2290,7 @@ block.vent-condenser.description = A kürtőkből kiáramló gázokat vízzé ko block.plasma-bore.description = Ércfallal szemben elhelyezve, korlátlanul termel nyersanyagokat. Kis mennyiségű áramot fogyaszt.\nHidrogén felhasználásával növelhető a hatékonysága. block.large-plasma-bore.description = Egy nagyobb plazmafúró. Képes a volfrám és a tórium bányászatára. Hidrogént igényel és áramot fogyaszt.\nNitrogén felhasználásával növelhető a hatékonysága. block.cliff-crusher.description = Felőrli a falakat, és korlátlan mennyiségű homokot termel. Áramot fogyaszt. A hatékonysága a fal típusától függően változik. -block.large-cliff-crusher.description = Crushes walls, outputting sand indefinitely. Requires power and ozone. Efficiency varies based on type of wall. Optionally consumes tungsten to increase efficiency. +block.large-cliff-crusher.description = Felőrli a falakat, és korlátlan mennyiségű homokot termel. Áramot fogyaszt, és ózont igényel. A hatékonysága a fal típusától függően változik, de volfrámmal növelhető. block.impact-drill.description = Ha ércre helyezik, korlátlan ideig, sorozatokban termeli ki a nyersanyagokat. Áramot fogyaszt és vizet igényel. block.eruption-drill.description = Továbbfejlesztett ütvefúró. Képes tóriumot bányászni. Hidrogént igényel. block.reinforced-conduit.description = Előre szállítja a folyadékokat. Nem fogad nem csővezetékes bemeneteket oldalról. @@ -2318,7 +2319,7 @@ block.underflow-duct.description = A túlcsorduló kapu ellentettje. Csak akkor block.reinforced-liquid-junction.description = Csomópontként működik két egymást keresztező csővezeték között. block.surge-conveyor.description = A nyersanyagokat rakományokban mozgatja. Árammal felgyorsítható. Vezeti az áramot. block.surge-router.description = Egyenletesen osztja el a nyersanyagokat három irányba az elektrometál-szállítószalagról. Árammal felgyorsítható. Vezeti az áramot. -block.unit-cargo-loader.description = Teherszállító drónokat épít. A drónok automatikusan szétosztják a nyersanyagokat a megfelelő szűrővel rendelkező kirakodási pontokra. +block.unit-cargo-loader.description = Teherszállító drónokat épít. A drónok automatikusan eljuttatják a nyersanyagokat a megfelelő szűrővel rendelkező kirakodási pontokra. block.unit-cargo-unload-point.description = A teherszállító drónok kirakodási pontjaként működik. Csak a kiválasztott szűrőnek megfelelő nyersanyagokat fogadja be. block.beam-node.description = Merőlegesen áramot vezet a többi blokkhoz. Kis mennyiségű áramot tárol. block.beam-tower.description = Merőlegesen áramot vezet a többi blokkhoz. Nagy mennyiségű áramot tárol. Nagy hatótávolságú. @@ -2328,7 +2329,7 @@ block.pyrolysis-generator.description = Nagy mennyiségű áramot termel arkicit block.flux-reactor.description = Fűtés hatására nagy mennyiségű áramot termel. Stabilizátorként diciánt igényel. Az áramtermelés és a diciánigény arányos a hőbevitellel.\nFelrobban, ha nem áll rendelkezésre elegendő dicián. block.neoplasia-reactor.description = Arkicit, víz és tóritkvarc felhasználásával nagy mennyiségű áramot termel. Melléktermékként hőt és veszélyes neoplazmát termel.\nFelrobban, ha a neoplazmát nem távolítják el a reaktorból csővezetékeken keresztül. block.build-tower.description = Automatikusan újjáépíti a hatósugarában lévő építményeket, és segíti a többi egységet az építkezésben. -block.regen-projector.description = Lassan javítja a szövetséges építményeket egy négyzet alakú területen. Hidrogént igényel.\nTóritkvarc felhasználásával növelhető a hatékonysága. +block.regen-projector.description = Lassan javítja a szövetséges építményeket egy négyzet alakú területen. Hidrogént igényel.\nTóritkvarccal növelhető a hatékonysága. block.reinforced-container.description = Kis mennyiségű nyersanyagot tud tárolni. A tartalma kirakodók segítségével nyerhető ki. Nem növeli a támaszpont tárolókapacitását. block.reinforced-vault.description = Nagy mennyiségű nyersanyagot tud tárolni. A tartalma kirakodók segítségével nyerhető ki. Nem növeli a támaszpont tárolókapacitását. block.tank-fabricator.description = Stell egységeket épít. Az elkészült egységek azonnal hadra foghatók, vagy újratervezőkben továbbfejleszthetők. @@ -2344,9 +2345,9 @@ block.prime-refabricator.description = Hármas szintre fejleszti a beérkező ta block.basic-assembler-module.description = Növeli az összeszerelő szintjét, ha annak az építési határvonala mellé helyezik. Áramot fogyaszt. Használható nyersanyagrakomány-bemenetként. block.small-deconstructor.description = Lebontja a beadott építményeket és egységeket. Visszaadja az építési költség 100%-át. block.reinforced-payload-conveyor.description = Előre mozgatja a rakományokat. -block.reinforced-payload-router.description = A rakományokat szomszédos a blokkokba osztja szét. Szűrő beállítása esetén válogatóként működik. -block.payload-mass-driver.description = Nagy hatótávolságú rakományszállító épület. A kapott rakományokat egy másik, hozzákapcsolt rakomány-tömegmozgatónak lövi át. -block.large-payload-mass-driver.description = Nagy hatótávolságú rakományszállító épület. A kapott rakományokat egy másik, hozzákapcsolt rakomány-tömegmozgatónak lövi át. +block.reinforced-payload-router.description = A rakományokat a szomszédos blokkokba osztja szét. A megfelelő szűrő beállítása esetén rakomány-válogatóként is beállítható. +block.payload-mass-driver.description = Nagy hatótávolságú rakományszállító eszköz. A kapott rakományokat egy másik, hozzákapcsolt rakomány-tömegmozgatónak lövi át. +block.large-payload-mass-driver.description = Nagyobb hatótávolságú rakományszállító eszköz, mint rakomány-tömegmozgató. A kapott rakományokat egy másik, hozzákapcsolt nagy rakomány-tömegmozgatónak lövi át. block.unit-repair-tower.description = Javítja a közelében lévő összes egységet. Ózont igényel. block.radar.description = Fokozatosan feltárja a terepet és az ellenséges egységeket egy nagy sugarú körben. Áramot fogyaszt. block.shockwave-tower.description = Sérülést okoz és megsemmisíti az ellenséges lövedékeket egy körön belül. Diciánt igényel. @@ -2382,9 +2383,9 @@ unit.minke.description = Tüzérségi és szokásos lövedékeket lő közeli f unit.bryde.description = Nagy távolságú tüzérségi lövedékeket és rakétákat lő az ellenségre. unit.sei.description = Rakéták és páncéltörő lövedékek záporát zúdítja az ellenségre. unit.omura.description = Nagy hatótávolságú átütő erejű lövedékeket lő az ellenségre. Flare egységeket gyárt. -unit.alpha.description = Megvédi a Szilánk támaszpontot az ellenségtől. Épületeket épít. -unit.beta.description = Megvédi az Alapítvány támaszpontot az ellenségtől. Épületeket épít. -unit.gamma.description = Megvédi az Atommag támaszpontot az ellenségtől. Épületeket épít. +unit.alpha.description = Megvédi a szilánk támaszpontot az ellenségtől. Épületeket épít. +unit.beta.description = Megvédi az alapítvány támaszpontot az ellenségtől. Épületeket épít. +unit.gamma.description = Megvédi az atommag támaszpontot az ellenségtől. Épületeket épít. unit.retusa.description = Célkövető torpedókat lő ki minden közeli ellenségre. Javítja a szövetséges egységeket. unit.oxynoe.description = Épületjavító lángcsóvát lő az ellenséges célpontokra. Célba veszi az ellenséges lövedékeket egy pontvédelmi toronnyal. unit.cyerce.description = Célkereső kazettás rakétákat lő ki az ellenségre. Javítja a szövetséges egységeket. @@ -2407,9 +2408,9 @@ unit.avert.description = Forgó lövedékpárokat lő ki az ellenséges célpont unit.obviate.description = Forgó, páros villámgömböket lő ki az ellenséges célpontokra. unit.quell.description = Nagy hatótávolságú célkövető rakétát lő ki az ellenséges célpontokra. Elnyomja az ellenséges szerkezetjavító épületeket. Csak földi célpontokat támad. unit.disrupt.description = Nagy hatótávolságú célkövető elnyomó rakétát lő ki az ellenséges célpontokra. Elnyomja az ellenséges szerkezetjavító épületeket. Csak földi célpontokat támad. -unit.evoke.description = A Bástya védelmére szolgáló építményeket épít. Sugárral javítja az építményeket. 2×2-es épületek szállítására is alkalmas. -unit.incite.description = A Citadella védelmére szolgáló építményeket épít. Sugárral javítja az építményeket. 2×2-es épületek szállítására is alkalmas. -unit.emanate.description = Az Akropolisz védelmére szolgáló építményeket épít. Sugárral javítja az építményeket. 2×2-es épületek szállítására is alkalmas. +unit.evoke.description = A bástya védelmére szolgáló építményeket épít. Sugárral javítja az építményeket. 2×2-es épületek szállítására is alkalmas. +unit.incite.description = A citadella védelmére szolgáló építményeket épít. Sugárral javítja az építményeket. 2×2-es épületek szállítására is alkalmas. +unit.emanate.description = Az akropolisz védelmére szolgáló építményeket épít. Sugárral javítja az építményeket. 2×2-es épületek szállítására is alkalmas. lst.read = Szám kiolvasása egy összekapcsolt memóriacellából. lst.write = Szám beírása egy összekapcsolt memóriacellába. @@ -2461,8 +2462,8 @@ lst.localeprint = Hozzáadja a pálya nyelvi csomagjainak tulajdonságértékét lglobal.false = 0 lglobal.true = 1 lglobal.null = null -lglobal.@pi = A pi matematikai állandó (3.141...) -lglobal.@e = Az e matematikai állandó (2.718...) +lglobal.@pi = A pi matematikai állandó (3.141…) +lglobal.@e = Az e matematikai állandó (2.718…) lglobal.@degToRad = Ezzel a számmal szoroz a fok radiánra való átalakításához lglobal.@radToDeg = Ezzel a számmal szoroz a radián fokra való átalakításához diff --git a/fastlane/metadata/steam/hungarian/achievements.vdf b/fastlane/metadata/steam/hungarian/achievements.vdf index 5a98182a26..6dd1226554 100644 --- a/fastlane/metadata/steam/hungarian/achievements.vdf +++ b/fastlane/metadata/steam/hungarian/achievements.vdf @@ -14,15 +14,15 @@ "NEW_ACHIEVEMENT_20_7_NAME" "Bajnok" "NEW_ACHIEVEMENT_20_7_DESC" "Nyerj meg 10 többjátékos PvP mérkőzést." "NEW_ACHIEVEMENT_20_8_NAME" "Villám" - "NEW_ACHIEVEMENT_20_8_DESC" "Semmisítsd meg egy ellenséges támaszpontot egy támadási zónában 5, vagy annál kevesebb hullámban." - "NEW_ACHIEVEMENT_20_9_NAME" "Támaszpont eső" + "NEW_ACHIEVEMENT_20_8_DESC" "Semmisíts meg egy ellenséges támaszpontot egy támadási zónában 5 vagy annál kevesebb hullámban." + "NEW_ACHIEVEMENT_20_9_NAME" "Támaszponteső" "NEW_ACHIEVEMENT_20_9_DESC" "Indítsd el a támaszpontot 30-szor." "NEW_ACHIEVEMENT_20_10_NAME" "Kitartó" "NEW_ACHIEVEMENT_20_10_DESC" "Élj túl 100 hullámot." "NEW_ACHIEVEMENT_20_12_NAME" "Fejlesztő" "NEW_ACHIEVEMENT_20_12_DESC" "Fejlessz ki mindent." "NEW_ACHIEVEMENT_20_14_NAME" "Túlterhelés" - "NEW_ACHIEVEMENT_20_14_DESC" "Üss meg egy vízzel borított ellenséget árammal." + "NEW_ACHIEVEMENT_20_14_DESC" "Csapj meg árammal egy vízzel borított ellenséget." "NEW_ACHIEVEMENT_20_15_NAME" "Eltérítés" "NEW_ACHIEVEMENT_20_15_DESC" "Pusztíts el egy egységet a saját visszavert lövedékével." "NEW_ACHIEVEMENT_20_17_NAME" "Egy végzetes hiba" @@ -68,7 +68,7 @@ "NEW_ACHIEVEMENT_21_12_NAME" "Tömeg" "NEW_ACHIEVEMENT_21_12_DESC" "Indíts egy kiszolgálót 10 játékossal." "NEW_ACHIEVEMENT_21_13_NAME" "Sebezhetetlen" - "NEW_ACHIEVEMENT_21_13_DESC" "Építs Meltdown, Spectre és Foreshadow lövegtornyokat." + "NEW_ACHIEVEMENT_21_13_DESC" "Építs Meltdown-, Spectre- és Foreshadow-lövegtornyokat." "NEW_ACHIEVEMENT_21_14_NAME" "Felszállás" "NEW_ACHIEVEMENT_21_14_DESC" "Használd a kilövőállást." "NEW_ACHIEVEMENT_21_16_NAME" "Eretnekség" @@ -78,24 +78,24 @@ "NEW_ACHIEVEMENT_21_18_NAME" "Hamvasztás" "NEW_ACHIEVEMENT_21_18_DESC" "Használd a piratitot bármelyik lövegtoronyban." "NEW_ACHIEVEMENT_21_19_NAME" "Hatásfok" - "NEW_ACHIEVEMENT_21_19_DESC" "Hűts le egy lövegtornyot vízzel, vagy hűtőfolyadékkal." + "NEW_ACHIEVEMENT_21_19_DESC" "Hűts le egy lövegtornyot vízzel vagy hűtőfolyadékkal." "NEW_ACHIEVEMENT_21_20_NAME" "Klasszikus mód" "NEW_ACHIEVEMENT_21_20_DESC" "Kapcsold be a pixeles módot." "NEW_ACHIEVEMENT_21_21_NAME" "Tudós" - "NEW_ACHIEVEMENT_21_21_DESC" "Nyisd meg a Wiki-t a játékból." + "NEW_ACHIEVEMENT_21_21_DESC" "Nyisd meg a Wikit a játékból." "NEW_ACHIEVEMENT_21_22_NAME" "Erős kezdés" - "NEW_ACHIEVEMENT_21_22_DESC" "Indítsd el a támaszpontot bármely zónába 10 000, vagy több nyersanyaggal konfigurálva." + "NEW_ACHIEVEMENT_21_22_DESC" "Indítsd el a támaszpontot bármely zónába 10 000 vagy több nyersanyaggal konfigurálva." "NEW_ACHIEVEMENT_21_23_NAME" "Begyújtás" "NEW_ACHIEVEMENT_21_23_DESC" "Indíts be egy ütközéses erőművet." "NEW_ACHIEVEMENT_21_25_NAME" "A spirál" - "NEW_ACHIEVEMENT_21_25_DESC" "Csak körbe-körbe szállít..." + "NEW_ACHIEVEMENT_21_25_DESC" "Csak körbe-körbe szállít… "NEW_ACHIEVEMENT_21_26_NAME" "Fokozás" "NEW_ACHIEVEMENT_21_26_DESC" "Építs egy 5-ös szintű egységet." "NEW_ACHIEVEMENT_21_27_NAME" "Építész" "NEW_ACHIEVEMENT_21_27_DESC" "Készíts 20 vázlatot." "NEW_ACHIEVEMENT_21_28_NAME" "Globális dominancia" "NEW_ACHIEVEMENT_21_28_DESC" "Foglald el a Serpulo minden szektorát." - "NEW_ACHIEVEMENT_21_29_NAME" "Légiszállítás" + "NEW_ACHIEVEMENT_21_29_NAME" "Légi szállítás" "NEW_ACHIEVEMENT_21_29_DESC" "Vegyél fel egy 5-ös szintű egységet egy Oct egységszállítóba." "NEW_ACHIEVEMENT_21_30_NAME" "A tökéletes forma" "NEW_ACHIEVEMENT_21_30_DESC" "Csatlakozz hozzájuk." @@ -123,12 +123,12 @@ "NEW_ACHIEVEMENT_26_9_DESC" "Mérj gyilkos csapást egy Eclipse egységre egy Duo toronnyal." "NEW_ACHIEVEMENT_26_10_NAME" "Erekir befejezése" "NEW_ACHIEVEMENT_26_10_DESC" "Foglald el az Erekir utolsó szektorát." - "NEW_ACHIEVEMENT_26_11_NAME" "Serpulo Befejezése" + "NEW_ACHIEVEMENT_26_11_NAME" "Serpulo befejezése" "NEW_ACHIEVEMENT_26_11_DESC" "Foglald el a Serpulo utolsó szektorát." "NEW_ACHIEVEMENT_26_12_NAME" "Rakomány" "NEW_ACHIEVEMENT_26_12_DESC" "Indítsd el a támaszpontot a Serpulo egyik szektorába egy saját egyéni támaszpontvázlatot használva." "NEW_ACHIEVEMENT_26_13_NAME" "Túlságosan felkészült" - "NEW_ACHIEVEMENT_26_13_DESC" "Fejleszd a Becsapódási Pont szektorban lévő támaszpontot Magnumra." + "NEW_ACHIEVEMENT_26_13_DESC" "Fejleszd a Becsapódási pont szektorban lévő támaszpontot Magnumra." "NEW_ACHIEVEMENT_26_14_NAME" "Kitörés" "NEW_ACHIEVEMENT_26_14_DESC" "A neoplazma terjedjen át bármely víztartalmú blokkra." "NEW_ACHIEVEMENT_26_15_NAME" "Törékeny" @@ -143,7 +143,7 @@ "NEW_ACHIEVEMENT_26_19_DESC" "Fejleszd ki a mikroprocesszort." "NEW_ACHIEVEMENT_26_20_NAME" "Árnyékolás" "NEW_ACHIEVEMENT_26_20_DESC" "Negatív 10k/mp teljesítmény elérése egy hálózatban." - "NEW_ACHIEVEMENT_26_21_NAME" "Teljesítmény túltengés" + "NEW_ACHIEVEMENT_26_21_NAME" "Teljesítmény-túltengés" "NEW_ACHIEVEMENT_26_21_DESC" "Pozitív 100k/mp teljesítmény elérése egy hálózatban." "NEW_ACHIEVEMENT_26_22_NAME" "Magas kapacitás" "NEW_ACHIEVEMENT_26_22_DESC" "Legyen 1 millió tárolt energia az akkumulátorokban egy hálózatban." @@ -156,7 +156,7 @@ "NEW_ACHIEVEMENT_26_26_NAME" "Elosztó" "NEW_ACHIEVEMENT_26_26_DESC" "Elosztó." "NEW_ACHIEVEMENT_26_27_NAME" "A teljes élmény" - "NEW_ACHIEVEMENT_26_27_DESC" "Csatlakozz egy közösségi szerverhez." + "NEW_ACHIEVEMENT_26_27_DESC" "Csatlakozz egy közösségi kiszolgálóhoz." "NEW_ACHIEVEMENT_26_28_NAME" "Hackerman" "NEW_ACHIEVEMENT_26_28_DESC" "Nyisd meg a szkript-konzolt." "NEW_ACHIEVEMENT_26_29_NAME" "Közvetlen irányítás" @@ -164,7 +164,7 @@ "NEW_ACHIEVEMENT_26_30_NAME" "Ellenséges vonalak mögött" "NEW_ACHIEVEMENT_26_30_DESC" "Dobj le egységeket egy ellenséges támaszpont építési tilalmi zónájába." "NEW_ACHIEVEMENT_26_31_NAME" "Bosszú" - "NEW_ACHIEVEMENT_26_31_DESC" "Pusztíts el egy Scatter lövegtornyot egy Flare egységgel." + "NEW_ACHIEVEMENT_26_31_DESC" "Pusztíts el egy Scatter-lövegtornyot egy Flare egységgel." "NEW_ACHIEVEMENT_29_0_NAME" "Légierő" "NEW_ACHIEVEMENT_29_0_DESC" "Használd egy földi egység erősítés funkcióját." "NEW_ACHIEVEMENT_29_1_NAME" "Légpárnás" @@ -176,8 +176,8 @@ "NEW_ACHIEVEMENT_29_4_NAME" "Globális takarítás" "NEW_ACHIEVEMENT_29_4_DESC" "Törj össze 10 000 sziklát." "NEW_ACHIEVEMENT_29_5_NAME" "Semlegesítve" - "NEW_ACHIEVEMENT_29_5_DESC" "Használj egy Shockwave lövegtornyot, hogy semlegesítsd a beérkező lövedékeket." + "NEW_ACHIEVEMENT_29_5_DESC" "Használj egy Shockwave-lövegtornyot, hogy semlegesítsd a beérkező lövedékeket." "NEW_ACHIEVEMENT_29_6_NAME" "Sajnos" - "NEW_ACHIEVEMENT_29_6_DESC" "Használd az :alphachan: emojit a többjátékos csevegésben, vagy ne, te döntesz." + "NEW_ACHIEVEMENT_29_6_DESC" "Használd az :alphachan: hangulatjelet a többjátékos csevegésben vagy ne, te döntesz." } } From 6093cace848f15b4365b728eaea53bd6dff2b36b Mon Sep 17 00:00:00 2001 From: Github Actions Date: Wed, 5 Feb 2025 15:36:20 +0000 Subject: [PATCH 179/460] Automatic bundle update --- core/assets/bundles/bundle_id_ID.properties | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/assets/bundles/bundle_id_ID.properties b/core/assets/bundles/bundle_id_ID.properties index 05fdf74870..d54837913c 100644 --- a/core/assets/bundles/bundle_id_ID.properties +++ b/core/assets/bundles/bundle_id_ID.properties @@ -299,8 +299,8 @@ joingame.ip = Alamat: disconnect = Terputus. disconnect.error = Sambungan bermasalah. disconnect.closed = Sambungan ditutup. -disconnect.data = Gagal memuat data dunia! disconnect.timeout = Waktu koneksi telah habis. +disconnect.data = Gagal memuat data dunia! disconnect.snapshottimeout = Waktu koneksi habis selama menerima snapshot UDP.\nIni mungkin disebabkan oleh jaringan atau koneksi yang tidak stabil. cantconnect = Gagal tersambung ke permainan ([accent]{0}[]). connecting = [accent]Menghubungkan... From a05756dc53c9fa43f249ddfeb78242241828c18e Mon Sep 17 00:00:00 2001 From: RTOmega <62565267+RebornTrack970@users.noreply.github.com> Date: Wed, 5 Feb 2025 18:42:51 +0300 Subject: [PATCH 180/460] TR Bundle Update (#10409) Co-authored-by: Anuken --- core/assets/bundles/bundle_tr.properties | 104 +++++++++++------------ 1 file changed, 50 insertions(+), 54 deletions(-) diff --git a/core/assets/bundles/bundle_tr.properties b/core/assets/bundles/bundle_tr.properties index eb63b20c74..fa6e72a3ee 100644 --- a/core/assets/bundles/bundle_tr.properties +++ b/core/assets/bundles/bundle_tr.properties @@ -194,7 +194,7 @@ campaign.select = Başlangıç Mücadelesi Seç campaign.none = [lightgray]Başlamak için bir gezegen seç.\nBu seçim herhangi bir zamanda değiştirlebilir. campaign.erekir = Daha yeni ve cilalanmış içerikler. Genellikle kararlı ilerleme.\n\nDaha kaliteli haritalar ve deneyim (herhalde). campaign.serpulo = Eski içerik; klasik deneyim. Daha serbest.\n\nDaha dengesiz harita ve deneyim. Cilayı unutmuşlar işte... -campaign.difficulty = Difficulty +campaign.difficulty = Zorluk completed = [accent]Tamamlandı techtree = Teknoloji Ağacı techtree.select = Teknoloji Ağacı Seç @@ -262,7 +262,7 @@ trace.mobile = Mobil Sürüm: [accent]{0} trace.modclient = Özel Sürüm: [accent]{0} trace.times.joined = Girme Sayısı: [accent]{0} trace.times.kicked = Atılma Sayısı: [accent]{0} -trace.ips = IPs: +trace.ips = IPler: trace.names = İsimler: invalidid = Geçersiz Sürüm Kimliği! Bir hata raporu gönder. player.ban = Yasakla @@ -302,7 +302,7 @@ reconnecting = [accent]Yeniden Bağlanılıyor... connecting.data = [accent]Dünya verisi yükleniyor... server.port = Port: server.invalidport = Geçersiz port sayısı! -server.error.addressinuse = [scarlet]Failed to open server on port 6567.[]\n\nMake sure no other Mindustry servers are running on your device or network! +server.error.addressinuse = [scarlet]Port 6567 açılamadı.[]\n\nCihaz ve internetinde başka bir Mindustry sunucusu açık olmadığından emin ol! server.error = [crimson]Sunucu kurulamadı: [accent]{0} save.new = Yeni kayıt save.overwrite = Bu kaydın üstüne yazmak istediğine\nemin misin? @@ -355,7 +355,7 @@ command.enterPayload = Kargo Bloğu Seç command.loadUnits = Birim Yükle command.loadBlocks = Blok Yükle command.unloadPayload = Birim Bırak -command.loopPayload = Loop Unit Transfer +command.loopPayload = Birim Transferini Döngüye Sok stance.stop = Emri İptal Et stance.shoot = Duruş: Saldırı stance.holdfire = Duruş: Hazır Ol @@ -499,7 +499,7 @@ waves.units.show = Hepsini Göster wavemode.counts = miktarlar wavemode.totals = toplamlar wavemode.health = can -all = All +all = Tüm editor.default = [lightgray] details = Detaylar... @@ -686,7 +686,7 @@ objective.destroycore.name = Merkezi Yok Et objective.commandmode.name = Komuta Et objective.flag.name = Bayrak marker.shapetext.name = Şekilli Yazı -marker.point.name = Point +marker.point.name = Nokta marker.shape.name = Şekil marker.text.name = Yazı marker.line.name = Hat @@ -739,7 +739,7 @@ error.mapnotfound = Harita dosyası bulunamadı! error.io = Ağ I/O hatası. error.any = Bilinmeyen ağ hatası. error.bloom = Kamaşma başlatılamadı.\nCihazınız bu özelliği desteklemiyor olabilir. -error.moddex = Mindustry is unable to load this mod.\nYour device is blocking import of Java mods due to recent changes in Android.\nThere is no known workaround to this issue. +error.moddex = Mindustry bu modu yükleyemedi.\nAndroid'de son değişimlerden dolayı cihazın Java modlarını yükleyemiyor.\nBu sorunun bilinen bir çözümü yok, zaten oyunu git pc de oyna, mobil kontroller kanser... weather.rain.name = Yağmur weather.snowing.name = Kar @@ -792,11 +792,11 @@ threat.medium = Orta threat.high = Yüksek threat.extreme = Aşırı threat.eradication = İmkansız -difficulty.casual = Casual -difficulty.easy = Easy +difficulty.casual = Sakin +difficulty.easy = Kolay difficulty.normal = Normal -difficulty.hard = Hard -difficulty.eradication = Eradication +difficulty.hard = Zor +difficulty.eradication = Absürd planets = Gezegenler @@ -819,19 +819,19 @@ sector.fungalPass.name = Mantar Geçidi sector.biomassFacility.name = Sentetik BioMadde Santrali sector.windsweptIslands.name = Rüzgarlı Adalar sector.extractionOutpost.name = Kazı Üssü -sector.facility32m.name = Facility 32 M -sector.taintedWoods.name = Tainted Woods -sector.infestedCanyons.name = Infested Canyons +sector.facility32m.name = 32 M Üssü +sector.taintedWoods.name = İsli Orman +sector.infestedCanyons.name = İstila Edilmiş Canyon sector.planetaryTerminal.name = Gezegenler Arası Terminal sector.coastline.name = Kıyı Şeridi sector.navalFortress.name = Deniz Kalesi -sector.polarAerodrome.name = Polar Aerodrome -sector.atolls.name = Atolls -sector.testingGrounds.name = Testing Grounds -sector.seaPort.name = Sea Port -sector.weatheredChannels.name = Weathered Channels -sector.mycelialBastion.name = Mycelial Bastion -sector.frontier.name = Frontier +sector.polarAerodrome.name = Polar Havaalanı +sector.atolls.name = Atoller +sector.testingGrounds.name = Test Arazisi +sector.seaPort.name = Deniz Limanı +sector.weatheredChannels.name = Erezyonlu Kanallar +sector.mycelialBastion.name = Mantar Kale +sector.frontier.name = Öncü Üs sector.groundZero.description = Yeniden başlamak için ideal bölge. Düşük düşman tehlikesi ve az miktarda kaynak mevcut. Mümkün olduğunca çok bakır ve kurşun topla.\nİlerle. sector.frozenForest.description = Burada, dağlara yakın bölgelerde bile sporlar etrafa yayıldı. Dondurucu soğuk onları sonsuza dek durduramaz.\n\nEnerji kullanmaya başla. Termik jeneratörler inşa et. Tamircileri kullanmayı öğren. @@ -851,8 +851,8 @@ sector.impact0078.description = Burası, eskiden buraya düşmüş bir yıldızl sector.planetaryTerminal.description = Son aşama.\n\nBu üs, başka gezegenlere gitmeyi sağlayan teknolojiyi barıdırıyor. Aşırı iyi bir şekilde korunuyor.\n\nOlabildiğince hızlı bir şekilde gemi üret ve düşman üssü elegeçir. Gezegenler Arası Hızladırıcıyı aç! sector.coastline.description = Bu bölgede denizel birim teknoloji kalıntıları tespit edildi. Düşman saldırılarını püskürt, sektörü ele geçir ve teknolojiyi kurtar. sector.navalFortress.description = Düşman bu uzak adaya doğal olarak korunan bir üs kurmuş. Bu üssü yok et. Onların gelişmiş savaş gemisi teknolojilerini elde et ve araştır. -sector.cruxscape.name = Cruxscape -sector.geothermalStronghold.name = Geothermal Stronghold +sector.cruxscape.name = Crux Düzlüğü +sector.geothermalStronghold.name = Jeotermal Sığınağı sector.facility32m.description = WIP, map submission by Stormride_R sector.taintedWoods.description = WIP, map submission by Stormride_R sector.atolls.description = WIP, map submission by Stormride_R @@ -924,7 +924,7 @@ settings.game = Oyun settings.sound = Ses settings.graphics = Grafikler settings.cleardata = ⚠ Tüm Oyun Verisini Sil ⚠ -settings.clear.confirm = Verileri silmek istediğinizden emin misiniz?\nBu işlemi geri alamazsınız! +settings.clear.confirm = Verileri silmek istediğinizden emin misiniz?\nBu işlemi geri alamazsınız!!! settings.clearall.confirm = [scarlet]Uyarı![]\nBu işlem kayıtlar, haritalar açılan bloklar ve tuş atamaları dahil bütün verileri silecektir.\n"Tamam" tuşuna bastığınızda bütün verileriniz silinecek ve oyun kapanacaktır. settings.clearsaves.confirm = Tüm kayıtlarınızı silmek istediğinizden emin misiniz? settings.clearsaves = Kayıtları Sil @@ -1126,8 +1126,8 @@ bullet.healamount = [stat]{0}[lightgray] direkt tamir bullet.multiplier = [stat]{0}[lightgray]x mermi çarpanı bullet.reload = [stat]{0}[lightgray]x atış hızı bullet.range = [stat]{0}[lightgray] blok menzil -bullet.notargetsmissiles = [stat] ignores buildings -bullet.notargetsbuildings = [stat] ignores missiles +bullet.notargetsmissiles = [stat] binaları görmezden gelir +bullet.notargetsbuildings = [stat] füzeleri görmezden gelir unit.blocks = blok unit.blockssquared = blok² @@ -1356,18 +1356,18 @@ rules.disableworldprocessors = Evrensel İşlemcileri Devredışı Bırak rules.schematic = Şema Kullanılabilir rules.wavetimer = Dalga Zamanlayıcısı rules.wavesending = Dalga Gönderiliyor -rules.allowedit = Allow Editing Rules -rules.allowedit.info = When enabled, the player can edit rules in-game via the button in the bottom left corner of the Pause menu. -rules.alloweditworldprocessors = Allow Editing World Processors -rules.alloweditworldprocessors.info = When enabled, world logic blocks can be placed and edited even outside the editor. +rules.allowedit = Ayaraları Düzenlemeye İzin Ver +rules.allowedit.info = Açıldığında, oyuncular durdurma tuşunun altındaki bir tuş ile ayarları düzenleyebilir. +rules.alloweditworldprocessors = Evrensel İşlemcileri Düzenlemeye İzin Ver +rules.alloweditworldprocessors.info = Açıldığında, oyuncular evren işlemcileri oyun içinde düzenleyebilir. rules.waves = Dalgalar rules.airUseSpawns = Hava Birimleri doğuş bölgelerini kullanır rules.attack = Saldırı Modu rules.buildai = Üs inşa edici YZ rules.buildaitier = İnşaatçı YZ sınıfı rules.rtsai = RTS YZ -rules.rtsai.campaign = RTS Attack AI -rules.rtsai.campaign.info = In attack maps, makes units group up and attack player bases in a more intelligent manner. +rules.rtsai.campaign = RTS Saldırı YZ +rules.rtsai.campaign.info = Saldırı Haritalarında, yapay zekayı daha 'zeki' yapar. rules.rtsminsquadsize = Asgari Gurup Boyutu rules.rtsmaxsquadsize = Azami Gurup Boyutu rules.rtsminattackweight = Asgari Saldırı Boyutu @@ -1375,7 +1375,7 @@ rules.cleanupdeadteams = Kaybeden Takımın Bloklarını Temizle (PvP) rules.corecapture = Yıkımda Çekirdeği Elegeçir rules.polygoncoreprotection = Çokgenli Merkez Koruması rules.placerangecheck = İnşa Menzilini Doğrula -rules.enemyCheat = Sınırsız AI (Düşman Takım) Kaynakları +rules.enemyCheat = Sınırsız YZ (Düşman Takım) Kaynakları rules.blockhealthmultiplier = Blok Can Çarpanı rules.blockdamagemultiplier = Blok Hasar Çarpanı rules.unitbuildspeedmultiplier = Birim Üretim Hız Çarpanı @@ -1411,12 +1411,9 @@ rules.title.teams = Takımlar rules.title.planet = Gezegen rules.lighting = Işıklandırma rules.fog = Savaş Sisi -rules.invasions = Enemy Sector Invasions -rules.legacylaunchpads = Legacy Launch Pad Mechanics -rules.legacylaunchpads.info = Allows using launch pads without landing pads, as in 7.0. -landingpad.legacy.disabled = [scarlet]\ue815 Disabled[lightgray] (Legacy Launch Pads enabled) -rules.showspawns = Show Enemy Spawns -rules.randomwaveai = Unpredictable Wave AI +rules.invasions = Düşman Sektör Saldırıları +rules.showspawns = Düşman Doğuş Noktalarını Göster +rules.randomwaveai = Tahmin Edilemez Dalgalar rules.fire = Ateş rules.anyenv = rules.explosions = Blok/Birlik Patlama Hasarı @@ -1425,7 +1422,7 @@ rules.weather = Hava Durumu rules.weather.frequency = Sıklık: rules.weather.always = Her zaman rules.weather.duration = Süreklilik: -rules.randomwaveai.info = Makes units spawned in waves target random structures instead of directly attacking the core or power generators. +rules.randomwaveai.info = Düşman Birimler Rastgele Saldırır ve direkt çekirdeğe veya enerji kaynaklarına gitmezler. rules.placerangecheck.info = Oyuncuların düşman üssüne yakın inşa etmesini engeller. Bu, silah kurarken daha da fazla. rules.onlydepositcore.info = Birimlerin Merkez dışında malzeme aktarmasını engeller. @@ -1568,8 +1565,8 @@ block.graphite-press.name = Grafit Ezici block.multi-press.name = Çoklu-Ezici block.constructing = {0} [lightgray](İnşa Ediliyor) block.spawn.name = Düşman Doğum Noktası -block.remove-wall.name = Remove Wall -block.remove-ore.name = Remove Ore +block.remove-wall.name = Duvar Kaldır +block.remove-ore.name = Maden Kaldır block.core-shard.name = Merkez: Parçacık block.core-foundation.name = Merkez: Temel block.core-nucleus.name = Merkez: Çekirdek @@ -2045,7 +2042,7 @@ item.plastanium.description = Gelişmiş uçak ve parçalama için kullanılan h item.phase-fabric.description = Gelişmiş elektronik ve kendi kendini tamir etme teknolojisınde kullanılan neredeyse ağırlıksız bir madde. item.surge-alloy.description = Kendine özgü elektriksel özelliklere sahip gelişmiş bir alaşım. item.spore-pod.description = Endüstriyel kullanım için atmosferik partiküllerden üretilen sentetik sporlarla dolu bir kapsül. Yağ, patlayıcı ve yakıt yapımı için kullanılır. -item.spore-pod.details = Spor.Büyük ihtimalle sentetik bir yaşam formu. Tokisk bir gaz yayıyor. Aşırı istilacı. Aşırı yanıcı. +item.spore-pod.details = Spor. Büyük ihtimalle sentetik bir yaşam formu. Tokisk bir gaz yayıyor. Aşırı istilacı. Aşırı yanıcı. item.blast-compound.description = Bomba ve patlayıcılarda kullanılan dengesiz bir bileşim. Spor kapsülleri ve diğer uçucu maddelerden sentezlenir. Yakıt olarak tavsiye edilmez. item.pyratite.description = Yakıcı silahlarda kullanılan son derece yanıcı bir madde. item.beryllium.description = Erekirde mermi olarak kullanılır. @@ -2107,10 +2104,10 @@ block.phase-wall.description = Özel faz örgüsü bazlı yansıtıcı materyal block.phase-wall-large.description = Özel faz bazlı yansıtıcı bileşik ile kaplanmış bir duvar. Çoğu mermi çarpma anında geri sektirir.\nBirçok blok alan kaplar. block.surge-wall.description = Son derece dayanıklı bir savunma bloğu.\nMermi temasıyla yükü toplar ve bu yükü rastgele serbest bırakır. block.surge-wall-large.description = Son derece dayanıklı bir savunma bloğu.\nMermi temasıyla yükü toplar ve bu yükü rastgele serbest bırakır.\nBirçok blok alan kaplar. -block.scrap-wall.description = Protects structures from enemy projectiles. -block.scrap-wall-large.description = Protects structures from enemy projectiles. -block.scrap-wall-huge.description = Protects structures from enemy projectiles. -block.scrap-wall-gigantic.description = Protects structures from enemy projectiles. +block.scrap-wall.description = Binaları düşman mermilerinden korur. +block.scrap-wall-large.description = Binaları düşman mermilerinden korur. +block.scrap-wall-huge.description = Binaları düşman mermilerinden korur. +block.scrap-wall-gigantic.description = Binaları düşman mermilerinden korur. block.door.description = Küçük bir kapı. Dokunarak açılabilir veya kapatılabilir. block.door-large.description = Büyük bir kapı. Dokunarak açılabilir veya kapatılabilir.\nBirçok blok alan kaplar. block.mender.description = Çevresindeki blokları periyodik olarak tamir eder. Savunmaları dalgalar arasında tamir eder.\nİsteğe bağlı olarak menzili ve verimi arttırmak için silikon kullanılabilir. @@ -2376,8 +2373,7 @@ unit.emanate.description = Akropolis Merkezini korumak için binalar inşa eder. lst.read = Bağlı hafıza kutusundaki numarayı okur. lst.write = Bağlı hafıza kutuaundaki numaraya yazar. lst.print = Yazı yazar. -lst.printchar = Add a UTF-16 character or content icon to the print buffer.\nDoes not display anything until [accent]Print Flush[] is used. -lst.format = Replace next placeholder in text buffer with a value.\nDoes not do anything if placeholder pattern is invalid.\nPlaceholder pattern: "{[accent]number 0-9[]}"\nExample:\n[accent]print "test {0}"\nformat "example" +lst.format = Yazı Haznesindeki son değeri başka bir değerle değiştirir.\nYerleştiricek değer boş ise hiç bir şey yapmaz.\nÖrnek Değer: "{[accent]sayı 0-9[]}"\nÖrnek:\n[accent]print "test {0}"\nformat "örnek" lst.draw = Ekrana Çizer. lst.drawflush = Ekrana Çizimi Aktarır. lst.printflush = Mesaj bloğuna metnini aktarır, @@ -2400,8 +2396,8 @@ lst.getblock = Herhangi bir yerdeki blok bilgisini al. lst.setblock = Herhangi bir yerdeki blok bilgisini değiştir. lst.spawnunit = Herhangi bir yerde birim var et. lst.applystatus = Bir Birime Durum Etkisi ekle. -lst.weathersense = Check if a type of weather is active. -lst.weatherset = Set the current state of a type of weather. +lst.weathersense = Hava durumunu kontrol et. +lst.weatherset = Hava durumunu değiştir. lst.spawnwave = Bellir bir noktada dalga başlat.\nDalga Zamanlayıcı Oluşturmaz! lst.explosion = Bir Noktada Patlama oluştur. lst.setrate = İşlemci Hızını Ayarla (işlem/tick) @@ -2415,7 +2411,7 @@ lst.getflag = Evrensel İşaretli Numara Oku. lst.setprop = Bir bina veya birime nitelik atar. lst.effect = Parçacık efekti oluştur. lst.sync = Ağ boyunca bir değişkeni senkronize et.\nSaniyede en fazla 10 kere yapılabilir. -lst.playsound = Plays a sound.\nVolume and pan can be a global value, or calculated based on position. +lst.playsound = Bir ses çal.\nSes şiddeti bir küresel değer olabilir veya konuma göre belirlenebilir. lst.makemarker = Dünyada yeni bir İşlemci İşareti koy.\nBu İşarete bir Kimlik adamalısın.\nDünya başına 20.000 limit bulunmakta. lst.setmarker = Bir İşlemci İşareti için bir arazi seç.\nKimlik, İşaret Koyucudaki ile aynı olmalı. lst.localeprint = Harita yerel paket özellik değerini metin arabelleğine ekleyin.\nHarita düzenleyicide harita yerel ayar paketlerini ayarlamak için şunu işaretleyin: [accent]Harita Bilgisi > Yerel Paketler[].\nİstemci bir mobil cihazsa, önce ".mobile" ile biten bir özelliği yazdırmaya çalışır. @@ -2463,7 +2459,7 @@ lenum.shoot = Bir konuma ateş et. lenum.shootp = Belli bir birim veya binaya ateş et. lenum.config = Bina yapılandırması, örnek: Ayıklayıcı Türü lenum.enabled = Blok aktif mi? -laccess.currentammotype = Current ammo item/liquid of a turret. +laccess.currentammotype = Bir turretin içindeki şuanki mermi/sıvı. laccess.color = Aydınlatıcı Rengi laccess.controller = Birim Kontrol edici. Eğer işlemci kontrol ediyorsa işlemci döner. \nFormasyon durumundaysa, lider döner.\nDiğer şekilde, birimi kendi döner. @@ -2590,7 +2586,7 @@ playsound.limit = If true, prevents this sound from playing\nif it has already b lenum.idle = Hareket etmez ancak kazmaya ve inşa etmeye devam eder. lenum.stop = Dur! -lenum.unbind = Logic Kontrolü tamaman devre dışı bırak.\nNormal AI'ı devreye sok. +lenum.unbind = Mantık Kontrolü tamaman devre dışı bırak.\nNormal YZ'yı devreye sok. lenum.move = Tam konuma git. lenum.approach = Bir Konuma yaklaş. lenum.pathfind = Düşman Doğuş noktasına git. From 8c0ef5f2476ace9df8a497b8b0d7afbe90a29be3 Mon Sep 17 00:00:00 2001 From: Github Actions Date: Wed, 5 Feb 2025 15:43:40 +0000 Subject: [PATCH 181/460] Automatic bundle update --- core/assets/bundles/bundle_tr.properties | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/core/assets/bundles/bundle_tr.properties b/core/assets/bundles/bundle_tr.properties index fa6e72a3ee..bd32a69c92 100644 --- a/core/assets/bundles/bundle_tr.properties +++ b/core/assets/bundles/bundle_tr.properties @@ -1412,6 +1412,9 @@ rules.title.planet = Gezegen rules.lighting = Işıklandırma rules.fog = Savaş Sisi rules.invasions = Düşman Sektör Saldırıları +rules.legacylaunchpads = Legacy Launch Pad Mechanics +rules.legacylaunchpads.info = Allows using launch pads without landing pads, as in 7.0. +landingpad.legacy.disabled = [scarlet]\ue815 Disabled[lightgray] (Legacy Launch Pads enabled) rules.showspawns = Düşman Doğuş Noktalarını Göster rules.randomwaveai = Tahmin Edilemez Dalgalar rules.fire = Ateş @@ -2373,6 +2376,7 @@ unit.emanate.description = Akropolis Merkezini korumak için binalar inşa eder. lst.read = Bağlı hafıza kutusundaki numarayı okur. lst.write = Bağlı hafıza kutuaundaki numaraya yazar. lst.print = Yazı yazar. +lst.printchar = Add a UTF-16 character or content icon to the print buffer.\nDoes not display anything until [accent]Print Flush[] is used. lst.format = Yazı Haznesindeki son değeri başka bir değerle değiştirir.\nYerleştiricek değer boş ise hiç bir şey yapmaz.\nÖrnek Değer: "{[accent]sayı 0-9[]}"\nÖrnek:\n[accent]print "test {0}"\nformat "örnek" lst.draw = Ekrana Çizer. lst.drawflush = Ekrana Çizimi Aktarır. From d5e525502d104f6d7f8c12ea5b8440894bce5631 Mon Sep 17 00:00:00 2001 From: MonoChronos <85042666+mdlcgithub@users.noreply.github.com> Date: Wed, 5 Feb 2025 23:44:00 +0800 Subject: [PATCH 182/460] Update bundle_fil.properties (#10408) added more filipino translations --- core/assets/bundles/bundle_fil.properties | 212 +++++++++++----------- 1 file changed, 106 insertions(+), 106 deletions(-) diff --git a/core/assets/bundles/bundle_fil.properties b/core/assets/bundles/bundle_fil.properties index b1b9cf2f2c..a368ae99a8 100644 --- a/core/assets/bundles/bundle_fil.properties +++ b/core/assets/bundles/bundle_fil.properties @@ -1,27 +1,27 @@ credits.text = Ginawa ni [royal]Anuken[] - [sky]anukendev@gmail.com[] -credits = Credits -contributors = Mga Tagasalin at Contributor -discord = Sumali sa Mindustry Discord! +credits = Mga Kredito +contributors = Mga Tagasalin at Tagapagkontributo +discord = Sumali sa Discord Server ng Mindustry! link.discord.description = Ang opisyal na Mindustry Discord chatroom. link.reddit.description = Ang Mindustry subreddit -link.github.description = Source code ng Mindustry +link.github.description = Pinagmulang kodigo ng Mindustry link.changelog.description = Listahan ng mga pagbabagong ginawa -link.dev-builds.description = Unstable development builds +link.dev-builds.description = Builds na masirain at iginagawa. link.trello.description = Opisyal na Trello board para sa mga nakalatag na features -link.itch.io.description = itch.io page na may PC download +link.itch.io.description = itch.io page na may download para sa personal na kompyuter link.google-play.description = Listing sa Google Play Store link.f-droid.description = Catalogue listing sa F-Droid -link.wiki.description = Opsiyal na Mindustry wiki +link.wiki.description = Opsiyal na ensiklopedya ng Mindustry link.suggestions.description = Magmungkahi ng mga bagong feature -link.bug.description = Nakahanap ng isa? I-report dito! -linkopen = This server has sent you a link. Are you sure you want to open it?\n\n[sky]{0} -linkfail = 'Di mabuksan ang link!\nKinopya na sa 'yong clipboard ang URL. +link.bug.description = Nakahanap ng isang sira? Ipaulat dito! +linkopen = Ang server na ito ay nagbigay ng isang link. Gusto mo ba na ibukas?\n\n[sky]{0} +linkfail = Hindi mabuksan ang link!\nKinopya na sa iyong clipboard ang URL. screenshot = Ini-adya na ang screenshot sa {0} screenshot.invalid = Masiyadong malaki ang mapa; maaaring kulang ang memory para sa screenshot. -gameover = Tapos na ang Laro -gameover.disconnect = Na-disconnect -gameover.pvp = Ang[accent] {0}[] team ay nanalo! -gameover.waiting = [accent]Hintayin ang bagong map... +gameover = Ang laro ay natapos. +gameover.disconnect = Nawalan ka ng koneksyon. +gameover.pvp = Ang[accent] {0}[] na grupo ay nanalo! +gameover.waiting = [accent]Hintayin ang bagong mapa... highscore = [accent]Panibagong mataas na Iskor! copied = Kinopya. indev.notready = Ang bahaging ito ng laro ay hindi pa handa @@ -30,84 +30,84 @@ load.sound = Mga Tunog load.map = Mga Mapa load.image = Mga Litrato load.content = Nilalaman -load.system = System +load.system = Sistema load.mod = Mga Mod load.scripts = Mga Iskrip -be.update = Mayroong baong Bleeding Edge build na makukuha: +be.update = Mayroong bagong Bleeding Edge build na makukuha: be.update.confirm = I-download at i-restart? be.updating = I-na-update... be.ignore = Huwag Pansinin be.noupdates = Walang nahanap na update. be.check = Tignan kung may mga update. -mods.browser = Browser ng mga Mod +mods.browser = Hanapan ng mga Mod mods.browser.selected = Mga selektadong mod mods.browser.add = I-install -mods.browser.reinstall = I-Reinstall -mods.browser.view-releases = View Releases -mods.browser.noreleases = [scarlet]No Releases Found\n[accent]Couldn't find any releases for this mod. Check if the mod's repository has any releases published. -mods.browser.latest = -mods.browser.releases = Releases +mods.browser.reinstall = I-install ulit +mods.browser.view-releases = Tingan ang mga ipinalabas na bersyon +mods.browser.noreleases = [scarlet]Walang ipinalabas na bersyon na nahanap.\n[accent]Hindi makahanap ng bersyon sa mod na ito. Tingan kung may ipinalabas na bersyon ang repositoryo ng mod nito. +mods.browser.latest = +mods.browser.releases = Ipinalabas na bersyon mods.github.open = Repositoryo -mods.github.open-release = Release Page -mods.browser.sortdate = Sort by recent -mods.browser.sortstars = Sort by stars +mods.github.open-release = Pahina ng mga ipinalabas na bersyon +mods.browser.sortdate = Uriin sa pinakabago +mods.browser.sortstars = Uriin sa kasikatan -schematic = Schematic -schematic.add = I-adya ang Schematic... -schematics = Mga Schematic -schematic.search = Search schematics... -schematic.replace = Ang schematic na ito ay magkaparehas ang pangalan. Gusto mo bang palitan ito? -schematic.exists = Ang schematic na ito ay magkaparehas ang pangalan. -schematic.import = I-angkat ang Schematic... +schematic = Eskematiko +schematic.add = I-adya ang Eskematiko... +schematics = Mga Eskematiko +schematic.search = Search eskematiko... +schematic.replace = Ang eskematiko na ito ay magkaparehas ang pangalan. Gusto mo bang palitan ito? +schematic.exists = Ang eskematiko na ito ay magkaparehas ang pangalan. +schematic.import = I-angkat ang eskematiko... schematic.exportfile = Mag-export ng File schematic.importfile = Mag-angkat ng File schematic.browseworkshop = Maghanap sa Workshop schematic.copy = Kopyahin sa Clipboard schematic.copy.import = I-angkat mula sa Clipboard schematic.shareworkshop = Ibahagi sa Workshop -schematic.flip = [accent][[{0}][]/[accent][[{1}][]: Baligtarin ang Schematic -schematic.saved = Na-i-adya na ang schematic. -schematic.delete.confirm = Ang schematic na'to ay tuluyang mawawala. -schematic.edit = Edit Schematic -schematic.info = {0}x{1}, {2} blocks -schematic.disabled = [scarlet]Ang mga schematics ay pinagbabawalan.[]\nBawal ka gumamit gang schematics sa [accent]mapa[] or [accent]server[] na ito. +schematic.flip = [accent][[{0}][]/[accent][[{1}][]: Baligtarin ang eskematiko +schematic.saved = Na-i-adya na ang eskematiko. +schematic.delete.confirm = Ang eskematiko na'to ay tuluyang mawawala. +schematic.edit = I-edit ang Eskematiko +schematic.info = {0}x{1}, {2} na tipak +schematic.disabled = [scarlet]Ang mga eskematiko ay pinagbabawalan.[]\nBawal ka gumamit ng eskematiko sa [accent]mapa[] or [accent]server[] na ito. schematic.tags = Mga Tag: schematic.edittags = Mag-edit ng Tag schematic.addtag = Mag-dagdag ng Tag -schematic.texttag = Text Tag -schematic.icontag = Icon Tag +schematic.texttag = Tag sa teksto +schematic.icontag = Tag sa larawan schematic.renametag = Palitan ang pangalan ng Tag -schematic.tagged = {0} tagged +schematic.tagged = {0} na na-tag schematic.tagdelconfirm = I-delete itong tag? schematic.tagexists = Meron nang tag na ganito. stats = Mga Statistiko stats.wave = Mga Wave na nalagpasan stats.unitsCreated = Mga Unit na nagawa -stats.enemiesDestroyed = Mga kalabang nasira +stats.enemiesDestroyed = Mga kalabang napasira stats.built = Mga Building na napatayo stats.destroyed = Mga Building na nasira stats.deconstructed = Mga Building na binaklas stats.playtime = Oras ng paglalaro -globalitems = [accent]Mga Pangkalahatang Aytem +globalitems = [accent]Mga Pangkalahatang Gamit map.delete = Sigurado ka bang buburahin ang mapang "[accent]{0}[]"? level.highscore = Pinakamataas na Iskor: [accent]{0} level.select = Mamili ng Lebel level.mode = Paraan ng Paglalaro: coreattack = < Ang core ay inaatake! > -nearpoint = [[ [scarlet]UMALIS KAAGAD SA DROP POINT[] ]\nnaghihintay si kamatayan… +nearpoint = [[ [scarlet]UMALIS KAAGAD SA DROP POINT[] ]\npagkamatay ay palapit database = Database ng Core database.button = Database savegame = I-save ang Laro -loadgame = I-Load Game +loadgame = I-Load ang Laro joingame = Sumali sa Laro -customgame = Custom na Laro +customgame = Hindi-karaniwan na Laro newgame = Bagong Laro none = none.found = [lightgray] -none.inmap = [lightgray] -minimap = Minimap +none.inmap = [lightgray] +minimap = Maliit na mapa position = Posisyon close = Isara website = Website @@ -125,7 +125,7 @@ uploadingcontent = Ini-a-upload ang Nilalaman uploadingpreviewfile = Ini-a-upload ang Preview File committingchanges = Gumagawa ng mga Pagbabago done = Tapos Na -feature.unsupported = Hindi suportado ng 'yong device ang feature na'to. +feature.unsupported = Hindi suportado ng iyong device ang feature na ito. mods.initfailed = [red]⚠[] Nabigong masimulan ang nakaraang instance ng Mindustry. Malamang na sanhi ito ng maling pagkilos ng mga mod.\n\nPara maiwasan ang crash loop, [red]lahat ng mga mod ay pinahinto.[] mods = Mga Mod mods.none = [lightgray]Walang mga mod na nahanap! @@ -144,14 +144,14 @@ mod.disable = 'Wag Paganahin mod.version = Version: mod.content = Nilalaman: mod.delete.error = 'Di matanggal ang mod. Maaaring ginagamit pa 'to. -mod.incompatiblegame = [red]Outdated Game -mod.incompatiblemod = [red]Incompatible -mod.blacklisted = [red]Unsupported -mod.unmetdependencies = [red]Unmet Dependencies -mod.erroredcontent = [scarlet]Mga Error sa Nilalaman +mod.incompatiblegame = [red]Larong luma na +mod.incompatiblemod = [red]Hindi magkatugma +mod.blacklisted = [red]Hindi pwede +mod.unmetdependencies = [red]Pagpapaasa ay hindi magkatulad +mod.erroredcontent = [scarlet]Mga sira sa Nilalaman mod.circulardependencies = [red]Circular Dependencies -mod.incompletedependencies = [red]Incomplete Dependencies -mod.requiresversion.details = Requires game version: [accent]{0}[]\nYour game is outdated. This mod requires a newer version of the game (possibly a beta/alpha release) to function. +mod.incompletedependencies = [red]Pagpapaasa ay hindi kompleto +mod.requiresversion.details = Kailangan ng bersyon: [accent]{0}[]\nAng iyong laro ay hindi bago. Ang mod na ito ay kailangan ng bagong bersyon ng larong ito (pwedeng beta o alpha na bersyon) para gumana. mod.outdatedv7.details = This mod is incompatible with the latest version of the game. The author must update it, and add [accent]minGameVersion: 136[] to its [accent]mod.json[] file. mod.blacklisted.details = This mod has been manually blacklisted for causing crashes or other issues with this version of the game. Do not use it. mod.missingdependencies.details = This mod is missing dependencies: {0} @@ -341,27 +341,27 @@ customize = I-customize ang Mga Panuntunan cancel = Cancel command = Command command.queue = [lightgray][Queuing] -command.mine = Mine -command.repair = Repair -command.rebuild = Rebuild -command.assist = Assist Player -command.move = Move -command.boost = Boost -command.enterPayload = Enter Payload Block +command.mine = Mina +command.repair = Ipagawa +command.rebuild = Itayo +command.assist = Asistahan ang maglalaro +command.move = Galaw +command.boost = Magpabilis +command.enterPayload = Pumasok sa payload na tipak command.loadUnits = Load Units command.loadBlocks = Load Blocks command.unloadPayload = Unload Payload command.loopPayload = Loop Unit Transfer -stance.stop = Cancel Orders -stance.shoot = Stance: Shoot -stance.holdfire = Stance: Hold Fire -stance.pursuetarget = Stance: Pursue Target -stance.patrol = Stance: Patrol Path -stance.ram = Stance: Ram\n[lightgray]Straight line movement, no pathfinding -openlink = Open Link -copylink = Copy Link -back = Back -max = Max +stance.stop = Tigilan ang mga sunurin +stance.shoot = Paninindigan: Barilan +stance.holdfire = Paninindigan: Huwag Bumaril +stance.pursuetarget = Paninindigan: Habulin ang Target +stance.patrol = Paninindigan: Patrolyang Lakarin +stance.ram = Paninindigan: Daan\n[lightgray]Tuwid na linyang paggalaw, walang paghanag ng path +openlink = Buksan Link +copylink = Koypa Link +back = Balik +max = Pinakarami objective = Objective sa Map crash.export = I-Export Crash Logs crash.none = Walang nahanap na crash logs. @@ -494,7 +494,7 @@ waves.units.show = Ipakita lahat wavemode.counts = counts wavemode.totals = totals wavemode.health = health -all = All +all = Lahat editor.default = [lightgray] details = Details... @@ -796,25 +796,25 @@ planet.sun.name = Araw sector.impact0078.name = Impact 0078 sector.groundZero.name = Ground Zero -sector.craters.name = The Craters -sector.frozenForest.name = Frozen Forest +sector.craters.name = Mga Bunganga +sector.frozenForest.name = Kagubatang Nagyelo sector.ruinousShores.name = Ruinous Shores sector.stainedMountains.name = Stained Mountains sector.desolateRift.name = Desolate Rift -sector.nuclearComplex.name = Nuclear Production Complex -sector.overgrowth.name = Overgrowth +sector.nuclearComplex.name = Complex para sa Nuklear na Produksyon +sector.overgrowth.name = Labis ng paglalaki 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.facility32m.name = Pasilidad 32 M sector.taintedWoods.name = Tainted Woods sector.infestedCanyons.name = Infested Canyons sector.planetaryTerminal.name = Planetary Launch Terminal sector.coastline.name = Coastline -sector.navalFortress.name = Naval Fortress +sector.navalFortress.name = Kutang Pantubig sector.polarAerodrome.name = Polar Aerodrome sector.atolls.name = Atolls sector.testingGrounds.name = Testing Grounds @@ -855,21 +855,21 @@ sector.weatheredChannels.description = WIP, map submission by Skeledragon sector.mycelialBastion.description = WIP, map submission by Skeledragon sector.onset.name = The Onset sector.aegis.name = Aegis -sector.lake.name = Lake +sector.lake.name = Lawa sector.intersect.name = Intersect sector.atlas.name = Atlas -sector.split.name = Split +sector.split.name = Hati sector.basin.name = Basin sector.marsh.name = Marsh -sector.peaks.name = Peaks +sector.peaks.name = Itaas sector.ravine.name = Ravine sector.caldera-erekir.name = Caldera sector.stronghold.name = Stronghold sector.crevice.name = Crevice sector.siege.name = Siege -sector.crossroads.name = Crossroads +sector.crossroads.name = Sangang Daanan sector.karst.name = Karst -sector.origin.name = Origin +sector.origin.name = Pinaggalingan sector.onset.description = Ang tutorial sector. Ang objective ay hindi pa nagawa. Maghintay para sa kinabukasang impormasyon. sector.aegis.description = This sector contains deposits of tungsten.\nResearch the [accent]Impact Drill[] to mine this resource, and destroy the enemy base in the area. sector.lake.description = This sector's slag lake greatly limits viable units. A hover unit is the only option.\nResearch the [accent]ship fabricator[] and produce an [accent]elude[] unit as soon as possible. @@ -887,23 +887,23 @@ sector.siege.description = This sector features two parallel canyons that will f sector.crossroads.description = The enemy bases in this sector have been established in varying terrain. Research different units to adapt.\nAdditionally, some bases are protected by shields. Figure out how they are powered. sector.karst.description = This sector is rich in resources, but will be attacked by the enemy once a new core lands.\nTake advantage of the resources and research [accent]phase fabric[]. sector.origin.description = The final sector with a significant enemy presence.\nNo probable research opportunities remain - focus solely on destroying all enemy cores. -status.burning.name = Burning -status.freezing.name = Freezing -status.wet.name = Wet -status.muddy.name = Muddy -status.melting.name = Melting -status.sapped.name = Sapped -status.electrified.name = Electrified -status.spore-slowed.name = Spore Slowed +status.burning.name = Nasusunog +status.freezing.name = Nayeyelo +status.wet.name = Basa +status.muddy.name = Naputikan +status.melting.name = Natutunaw +status.sapped.name = Napahina +status.electrified.name = Napakuryente +status.spore-slowed.name = Binagalan ng Spore status.tarred.name = Tarred status.overdrive.name = Overdrive status.overclock.name = Overclock status.shocked.name = Shocked status.blasted.name = Blasted -status.unmoving.name = Unmoving -status.boss.name = Guardian +status.unmoving.name = Di-magalaw +status.boss.name = Namumuno -settings.language = Language +settings.language = Wika settings.data = Game Data settings.reset = Reset to Defaults settings.rebind = Rebind @@ -1428,7 +1428,7 @@ content.sector.name = Sectors content.team.name = Factions wallore = (Wall) -item.copper.name = Copper +item.copper.name = Tanso item.lead.name = Lead item.coal.name = Coal item.graphite.name = Graphite @@ -1436,10 +1436,10 @@ item.titanium.name = Titanium item.thorium.name = Thorium item.silicon.name = Silicon item.plastanium.name = Plastanium -item.phase-fabric.name = Phase Fabric +item.phase-fabric.name = Phase Pabriko item.surge-alloy.name = Surge Alloy item.spore-pod.name = Spore Pod -item.sand.name = Sand +item.sand.name = Buhangin item.blast-compound.name = Blast Compound item.pyratite.name = Pyratite item.metaglass.name = Metaglass @@ -1450,10 +1450,10 @@ item.tungsten.name = Tungsten item.oxide.name = Oxide item.carbide.name = Carbide item.dormant-cyst.name = Dormant Cyst -liquid.water.name = Water +liquid.water.name = Tubig liquid.slag.name = Slag liquid.oil.name = Oil -liquid.cryofluid.name = Cryofluid +liquid.cryofluid.name = Lamigtubig liquid.neoplasm.name = Neoplasm liquid.arkycite.name = Arkycite liquid.gallium.name = Gallium @@ -1519,7 +1519,7 @@ unit.evoke.name = Evoke unit.incite.name = Incite unit.emanate.name = Emanate unit.manifold.name = Manifold -unit.assembly-drone.name = Assembly Drone +unit.assembly-drone.name = Drone sa Paggagawa unit.latum.name = Latum unit.renale.name = Renale block.parallax.name = Parallax @@ -1562,15 +1562,15 @@ block.core-shard.name = Core: Shard block.core-foundation.name = Core: Foundation block.core-nucleus.name = Core: Nucleus block.deep-water.name = Deep Water -block.shallow-water.name = Water +block.shallow-water.name = Tubig block.tainted-water.name = Tainted Water block.deep-tainted-water.name = Deep Tainted Water block.darksand-tainted-water.name = Dark Sand Tainted Water block.tar.name = Tar block.stone.name = Stone -block.sand-floor.name = Sand -block.darksand.name = Dark Sand -block.ice.name = Ice +block.sand-floor.name = Buhangin +block.darksand.name = Maitim na Buhangin +block.ice.name = Yelo block.snow.name = Snow block.crater-stone.name = Craters block.sand-water.name = Sand water From d01bc95c05ef55e56f31c9dfccdf332d606be34a Mon Sep 17 00:00:00 2001 From: Anuken Date: Wed, 5 Feb 2025 11:54:07 -0500 Subject: [PATCH 183/460] Allow team lookup --- core/src/mindustry/game/Team.java | 11 +++++++++-- core/src/mindustry/logic/GlobalVars.java | 11 ++++++++--- 2 files changed, 17 insertions(+), 5 deletions(-) diff --git a/core/src/mindustry/game/Team.java b/core/src/mindustry/game/Team.java index affcbe525c..f27f099eca 100644 --- a/core/src/mindustry/game/Team.java +++ b/core/src/mindustry/game/Team.java @@ -8,12 +8,13 @@ import arc.util.*; import mindustry.game.Rules.*; import mindustry.game.Teams.*; import mindustry.graphics.*; +import mindustry.logic.*; import mindustry.world.blocks.storage.CoreBlock.*; import mindustry.world.modules.*; import static mindustry.Vars.*; -public class Team implements Comparable{ +public class Team implements Comparable, Senseable{ public final int id; public final Color color; public final Color[] palette; @@ -138,7 +139,7 @@ public class Team implements Comparable{ public String localized(){ return Core.bundle.get("team." + name + ".name", name); } - + public String coloredName(){ return emoji + "[#" + color + "]" + localized() + "[]"; } @@ -152,4 +153,10 @@ public class Team implements Comparable{ public String toString(){ return name; } + + @Override + public double sense(LAccess sensor){ + if(sensor == LAccess.id) return id; + return 0; + } } diff --git a/core/src/mindustry/logic/GlobalVars.java b/core/src/mindustry/logic/GlobalVars.java index e1a57959cd..b4f5a59467 100644 --- a/core/src/mindustry/logic/GlobalVars.java +++ b/core/src/mindustry/logic/GlobalVars.java @@ -22,7 +22,7 @@ import static mindustry.Vars.*; /** Stores global logic variables for logic processors. */ public class GlobalVars{ public static final int ctrlProcessor = 1, ctrlPlayer = 2, ctrlCommand = 3; - public static final ContentType[] lookableContent = {ContentType.block, ContentType.unit, ContentType.item, ContentType.liquid}; + public static final ContentType[] lookableContent = {ContentType.block, ContentType.unit, ContentType.item, ContentType.liquid, ContentType.team}; /** Global random state. */ public static final Rand rand = new Rand(); @@ -220,8 +220,13 @@ public class GlobalVars{ return varEntries; } - /** @return a piece of content based on its logic ID. This is not equivalent to content ID. */ - public @Nullable Content lookupContent(ContentType type, int id){ + /** @return a piece of content based on its logic ID. This is not equivalent to content ID. In the case of teams, the return value may not be Content. */ + public @Nullable Object lookupContent(ContentType type, int id){ + //teams are a special case; they are not technically content, but can be looked up + if(type == ContentType.team){ + return id >= 0 && id < 256 ? Team.all[id] : null; + } + var arr = logicIdToContent[type.ordinal()]; return arr != null && id >= 0 && id < arr.length ? arr[id] : null; } From f888c001ca70b7e5ed61d1d1c69f733437402f3e Mon Sep 17 00:00:00 2001 From: "[xya]" <119150618+strxya@users.noreply.github.com> Date: Thu, 6 Feb 2025 00:58:18 +0800 Subject: [PATCH 184/460] Update Filipino Language (bundle_fil.properties) (#10111) * Update Filipino Language (bundle_fil.properties) More things changed here for Filipino language * Update bundle_fil.properties --------- Co-authored-by: vzii6 <119150618+vzii6@users.noreply.github.com> Co-authored-by: Anuken --- core/assets/bundles/bundle_fil.properties | 630 +++++++++++----------- 1 file changed, 315 insertions(+), 315 deletions(-) diff --git a/core/assets/bundles/bundle_fil.properties b/core/assets/bundles/bundle_fil.properties index a368ae99a8..62e96758bb 100644 --- a/core/assets/bundles/bundle_fil.properties +++ b/core/assets/bundles/bundle_fil.properties @@ -66,12 +66,12 @@ schematic.browseworkshop = Maghanap sa Workshop schematic.copy = Kopyahin sa Clipboard schematic.copy.import = I-angkat mula sa Clipboard schematic.shareworkshop = Ibahagi sa Workshop -schematic.flip = [accent][[{0}][]/[accent][[{1}][]: Baligtarin ang eskematiko -schematic.saved = Na-i-adya na ang eskematiko. -schematic.delete.confirm = Ang eskematiko na'to ay tuluyang mawawala. -schematic.edit = I-edit ang Eskematiko -schematic.info = {0}x{1}, {2} na tipak -schematic.disabled = [scarlet]Ang mga eskematiko ay pinagbabawalan.[]\nBawal ka gumamit ng eskematiko sa [accent]mapa[] or [accent]server[] na ito. +schematic.flip = [accent][[{0}][]/[accent][[{1}][]: Baligtarin ang Schematic +schematic.saved = Na-i-adya na ang schematic. +schematic.delete.confirm = Ang schematic na'to ay tuluyang mawawala. +schematic.edit = I-edit ang Schematic +schematic.info = {0}x{1}, {2} blocks +schematic.disabled = [scarlet]Ang mga schematics ay pinagbabawalan.[]\nBawal ka gumamit gang schematics sa [accent]mapa[] or [accent]server[] na ito. schematic.tags = Mga Tag: schematic.edittags = Mag-edit ng Tag schematic.addtag = Mag-dagdag ng Tag @@ -181,7 +181,7 @@ about.button = Tungkol name = Pangalan: noname = Pumili ng[accent] pangalan[] muna. search = Search: -planetmap = Planet Map +planetmap = Mapa ng Planeta launchcore = I-Launch Ang Core filename = File Name: unlocked = Bagong content na na-unlock! @@ -197,10 +197,10 @@ techtree = Tech Tree techtree.select = Tech Tree Selection techtree.serpulo = Serpulo techtree.erekir = Erekir -research.load = Load -research.discard = Discard +research.load = I-Load +research.discard = I-Discard research.list = [lightgray]Research: -research = Research +research = Mga Research researched = [lightgray]{0} researched. research.progress = {0}% complete players = {0} player @@ -338,9 +338,10 @@ workshop.listing = I-edit ang Listahan sa Workshop ok = OK open = Open customize = I-customize ang Mga Panuntunan -cancel = Cancel +cancel = I-kansel command = Command command.queue = [lightgray][Queuing] + command.mine = Mina command.repair = Ipagawa command.rebuild = Itayo @@ -366,8 +367,8 @@ objective = Objective sa Map crash.export = I-Export Crash Logs crash.none = Walang nahanap na crash logs. crash.exported = Na-export ang mga crash log. -data.export = Export Data -data.import = Import Data +data.export = Export ang Data +data.import = Import ang Data data.openfolder = Buksan ang Data Folder data.exported = Na-i-export ang data. data.invalid = Hindi ito wastong data. @@ -397,8 +398,8 @@ wave.enemycore = [accent]{0}[lightgray] Enemy Core wave.enemy = [lightgray]{0} Natitirang Kaaway wave.guardianwarn = Ang Guardian ay papalapit na ng mga [accent]{0}[] wave. wave.guardianwarn.one = Ang Guardian ay papalapit na ng [accent]{0}[] wave. -loadimage = I-Load Image -saveimage = I-Save Image +loadimage = I-Load ng Imahe +saveimage = I-Save ng Imahe unknown = Unknown custom = Custom builtin = Built-In @@ -434,10 +435,10 @@ editor.mapinfo = Map Info editor.author = Author: editor.description = Description: editor.nodescription = Dapat meron paglalarawan ng hindi bababa sa 4 na character bago i-publish. -editor.waves = Waves: -editor.rules = Rules: +editor.waves = Mga Waves: +editor.rules = Mga Rules: editor.generation = Generation: -editor.objectives = Objectives +editor.objectives = Mga Objectives editor.locales = Locale Bundles editor.worldprocessors = World Processors editor.worldprocessors.editname = Edit Name @@ -523,38 +524,38 @@ editor.apply = Apply editor.generate = Generate editor.sectorgenerate = Sector Generate editor.resize = Resize -editor.loadmap = Load Map -editor.savemap = Save Map +editor.loadmap = I-load ang Mapa +editor.savemap = I-save ang Mapa editor.savechanges = [scarlet]You have unsaved changes!\n\n[]Do you want to save them? editor.saved = Saved! editor.save.noname = Walang pangalan ang iyong mapa! Itakda ang isa sa menu na 'impormasyon ng mapa'. editor.save.overwrite = Ino-overwrite ng iyong mapa ang isang built-in na mapa! Pumili ng ibang pangalan sa menu na 'impormasyon ng mapa'. editor.import.exists = [scarlet]Hindi kayang ma-import:[] mayroon nang built-in na mapa na '{0}'! editor.import = Import... -editor.importmap = Import Map +editor.importmap = Import ang Mapa editor.importmap.description = Mag-import ng umiiral nang mapa -editor.importfile = Import File +editor.importfile = Import ang File editor.importfile.description = Mag-import ng panlabas na file ng mapa editor.importimage = Mag-import ng File ng Larawan editor.importimage.description = Mag-import ng panlabas na file ng imahe ng mapa editor.export = Export... -editor.exportfile = Export File +editor.exportfile = I-export ang File editor.exportfile.description = Mag-Export nang map file -editor.exportimage = Export Terrain Image +editor.exportimage = I-export ang Terrain Image editor.exportimage.description = Mag-export ng image file na naglalaman lamang ng basic terrain -editor.loadimage = Import Terrain -editor.saveimage = Export Terrain +editor.loadimage = Import ang Terrain +editor.saveimage = I-export ang Terrain editor.unsaved = [scarlet]Mayroon kang mga hindi na-adyang mga pagbabago![]\nSigurado ka bang gusto mong mag-exit? editor.resizemap = Resize Map -editor.mapname = Map Name: +editor.mapname = Pangalan ng Mapa: editor.overwrite = [accent]Warning!\nIno-overwrite nito ang isang existing na mapa. editor.overwrite.confirm = [scarlet]Warning![] Umiiral na ang isang mapa na may ganitong pangalan. Sigurado ka bang gusto mong i-overwrite ito?\n"[accent]{0}[]" editor.exists = Umiiral na ang isang mapa na may ganitong pangalan. editor.selectmap = Pumili ng mapa na ilo-load: -toolmode.replace = Replace +toolmode.replace = Palitan toolmode.replace.description = Gumuhit lamang sa mga solidong blocks. -toolmode.replaceall = Replace All +toolmode.replaceall = Palitan Lahat toolmode.replaceall.description = Palitan ang lahat ng mga blocks sa mapa. toolmode.orthogonal = Orthogonal toolmode.orthogonal.description = Gumuhit lamang ng mga orthogonal na linya. @@ -718,10 +719,10 @@ launch.destination = Destination: {0} landing.sources = Source Sectors: [accent]{0}[] landing.import = Max Total Import: {0}[accent]{1}[lightgray]/min configure.invalid = Ang halaga ay dapat na isang numero sa pagitan ng 0 at {0}. -add = Add... +add = I-Add... guardian = Guardian -connectfail = [scarlet]Connection error:\n\n[accent]{0} +connectfail = [scarlet]Error sa Koneksyon:\n\n[accent]{0} error.unreachable = Hindi maabot ang server.\nTama ba ang spelling ng address? error.invalidaddress = Invalid address. error.timedout = Timed out!\nTiyaking may naka-set up na port forwarding ang host, at tama ang address! @@ -733,38 +734,37 @@ error.any = Unknown network error. error.bloom = Nabigong simulan ang bloom.\nMaaaring hindi ito sinusuportahan ng iyong device. error.moddex = Mindustry is unable to load this mod.\nYour device is blocking import of Java mods due to recent changes in Android.\nThere is no known workaround to this issue. -weather.rain.name = Rain -weather.snowing.name = Snow +weather.rain.name = Ulan +weather.snowing.name = Niyebe weather.sandstorm.name = Sandstorm weather.sporestorm.name = Sporestorm weather.fog.name = Fog campaign.playtime = \uf129 [lightgray]Sector Playtime: {0} campaign.complete = [accent]Congratulations.\n\nThe enemy on {0} has been defeated.\n[lightgray]The final sector has been conquered. -sectorlist = Sectors +sectorlist = Mga Sector sectorlist.attacked = {0} ay inaatake sectors.unexplored = [lightgray]Unexplored sectors.resources = Resources: -sectors.production = Production: +sectors.production = Produksyon: sectors.export = Export: sectors.import = Import: -sectors.time = Time: +sectors.time = Oras: sectors.threat = Threat: -sectors.wave = Wave: +sectors.wave = Mga Waves: sectors.stored = Stored: sectors.resume = Resume -sectors.launch = Launch -sectors.select = Select -sectors.launchselect = Select Launch Destination +sectors.launch = I-Launch +sectors.select = I-Select sectors.nonelaunch = [lightgray]none (sun) -sectors.redirect = Redirect Launch Pads -sectors.rename = Rename Sector +sectors.rename = Palitan ang pangalan ng Sector + sectors.enemybase = [scarlet]Enemy Base sectors.vulnerable = [scarlet]Vulnerable sectors.underattack = [scarlet]Under attack! [accent]{0}% damaged sectors.underattack.nodamage = [scarlet]Uncaptured sectors.survives = [accent]Survives {0} waves -sectors.go = Go +sectors.go = Punta sector.abandon = Abandonahin sector.abandon.confirm = Ang core (o mga core) sa sector ay mag se-self-destruct.\nSigurado ka? sector.curcapture = Nai-capture ang sector @@ -774,10 +774,10 @@ sector.attacked = Ang sector [accent]{0}[white] ay inaatake! sector.lost = Ang sector [accent]{0}[white] ay nawala! sector.capture = Sector [accent]{0}[white]Captured! sector.capture.current = Sector Captured! -sector.changeicon = Change Icon -sector.noswitch.title = Unable to Switch Sectors -sector.noswitch = You may not switch sectors while an existing sector is under attack.\n\nSector: [accent]{0}[] on [accent]{1}[] -sector.view = View Sector +sector.changeicon = I-Change ang Icon +sector.noswitch.title = Hindi ka mapalit sa ibang Sectors +sector.noswitch = Hindi ka pwede magpalit ng sectors habang ina-atake ang isang sector mo.\n\nSector: [accent]{0}[] on [accent]{1}[] +sector.view = Tingnan ang Sector threat.low = Mababa threat.medium = Medium threat.high = Mataas @@ -905,10 +905,10 @@ status.boss.name = Namumuno settings.language = Wika settings.data = Game Data -settings.reset = Reset to Defaults -settings.rebind = Rebind -settings.resetKey = Reset -settings.controls = Controls +settings.reset = I-Reset sa mga Default +settings.rebind = I-Rebind +settings.resetKey = I-Reset +settings.controls = Mga Controls settings.game = Game settings.sound = Sound settings.graphics = Graphics @@ -916,8 +916,8 @@ settings.cleardata = I-Clear ang Game Data... settings.clear.confirm = Sigurado ka bang gusto mong i-clear ang data na ito?\nHindi na mababawi ang nagawa! settings.clearall.confirm = [scarlet]WARNING![]\nIki-clear nito ang lahat ng data, kabilang ang mga pag-save, mapa, pag-unlock at keybinds.\nKapag pinindot mo ang 'ok', ibubura ng laro ang lahat ng data at awtomatikong lalabas. settings.clearsaves.confirm = Sigurado ka bang gusto mong i-clear ang lahat ng iyong saves? -settings.clearsaves = Clear Saves -settings.clearresearch = Clear Research +settings.clearsaves = I-Clear Saves +settings.clearresearch = I-Clear Research settings.clearresearch.confirm = Sigurado ka bang gusto mong i-clear ang lahat ng iyong campaign research? settings.clearcampaignsaves = Tanggalin ang mga Campaign Save settings.clearcampaignsaves.confirm = Sigurado ka bang gusto mong i-clear ang lahat ng iyong mga campaign save? @@ -935,84 +935,84 @@ lastaccessed = [lightgray]Last Accessed: {0} lastcommanded = [lightgray]Last Commanded: {0} block.unknown = [lightgray]??? stat.showinmap = -stat.description = Purpose +stat.description = Layunin stat.input = Input stat.output = Output -stat.maxefficiency = Max Efficiency -stat.booster = Booster -stat.tiles = Required Tiles -stat.affinities = Affinities -stat.opposites = Opposites -stat.powercapacity = Power Capacity -stat.powershot = Power/Shot -stat.damage = Damage -stat.targetsair = Targets Air -stat.targetsground = Targets Ground -stat.itemsmoved = Move Speed -stat.launchtime = Time Between Launches -stat.shootrange = Range -stat.size = Size -stat.displaysize = Display Size +stat.maxefficiency = Max ng Kahusayan +stat.booster = Pampalakas +stat.tiles = Kinakailangan mga Tiles +stat.affinities = Pagkakaugnay +stat.opposites = Kabaligtaran +stat.powercapacity = Kapasidad ng Kuryente +stat.powershot = Kuryente/Putok +stat.damage = Pinsala +stat.targetsair = Tinatarget ng mga Air +stat.targetsground = Tinatarget ng mga Ground +stat.itemsmoved = Bilis ng Pag-galaw +stat.launchtime = Oras sa pagitan ng mga launches +stat.shootrange = Saklaw +stat.size = Laki +stat.displaysize = Laki ng Display stat.liquidcapacity = Liquid Capacity -stat.powerrange = Power Range -stat.linkrange = Link Range -stat.instructions = Instructions -stat.powerconnections = Max Connections -stat.poweruse = Power Use -stat.powerdamage = Power/Damage -stat.itemcapacity = Item Capacity -stat.memorycapacity = Memory Capacity -stat.basepowergeneration = Base Power Generation -stat.productiontime = Production Time +stat.powerrange = Saklaw ng Kuryente +stat.linkrange = Saklaw ng Link +stat.instructions = Tagubilin +stat.powerconnections = Max na Koneksyon +stat.poweruse = Ginagamit ng Kuryente +stat.powerdamage = Kuryente/Pinsala +stat.itemcapacity = Kapasidad ng mga Aytem +stat.memorycapacity = Kapasidad ng Memorya +stat.basepowergeneration = Pagbuo ng Kuryente +stat.productiontime = Oras ng Produksyon stat.repairtime = Block Full Repair Time -stat.repairspeed = Repair Speed -stat.weapons = Weapons -stat.bullet = Bullet +stat.repairspeed = Bilis ng pagkumpuni +stat.weapons = Armas +stat.bullet = Bala stat.moduletier = Module Tier -stat.unittype = Unit Type -stat.speedincrease = Speed Increase -stat.range = Range -stat.drilltier = Drillables -stat.drillspeed = Base Drill Speed -stat.boosteffect = Boost Effect +stat.unittype = Uri ng mga Unit +stat.speedincrease = Pag-taas ng bilis +stat.range = Saklaw +stat.drilltier = Mga Drillable +stat.drillspeed = Base na Bilis ng Drill +stat.boosteffect = Epekto ng Lakas stat.maxunits = Max Active Units stat.health = Health -stat.armor = Armor -stat.buildtime = Build Time +stat.armor = Baluti +stat.buildtime = Oras ng pagbuo stat.maxconsecutive = Max Consecutive -stat.buildcost = Build Cost -stat.inaccuracy = Inaccuracy -stat.shots = Shots -stat.reload = Shots/Second -stat.ammo = Ammo -stat.shieldhealth = Shield Health -stat.cooldowntime = Cooldown Time -stat.explosiveness = Explosiveness +stat.buildcost = Gastos ng pagbuo +stat.inaccuracy = Ang Inaccuracy +stat.shots = Mga Putok +stat.reload = Putok/Segundo +stat.ammo = Mga Bala +stat.shieldhealth = Health ng Kalasag +stat.cooldowntime = Oras ng Cooldown +stat.explosiveness = Pagkasabog stat.basedeflectchance = Base Deflect Chance -stat.lightningchance = Lightning Chance -stat.lightningdamage = Lightning Damage -stat.flammability = Flammability -stat.radioactivity = Radioactivity +stat.lightningchance = Pagkakataon ng Lightning +stat.lightningdamage = Pinsala ng Lightning +stat.flammability = Pagkasunog +stat.radioactivity = Radyaktibidad stat.charge = Charge -stat.heatcapacity = HeatCapacity -stat.viscosity = Viscosity -stat.temperature = Temperature -stat.speed = Speed -stat.buildspeed = Build Speed -stat.minespeed = Mine Speed +stat.heatcapacity = Kapasidad ng Init +stat.viscosity = Lagkit +stat.temperature = Temperatura +stat.speed = Bilis +stat.buildspeed = Bilis ng Pag-buo +stat.minespeed = Bilis ng Pagmimina stat.minetier = Mine Tier -stat.payloadcapacity = Payload Capacity -stat.abilities = Abilities -stat.canboost = Can Boost -stat.flying = Flying -stat.ammouse = Ammo Use -stat.ammocapacity = Ammo Capacity -stat.damagemultiplier = Damage Multiplier -stat.healthmultiplier = Health Multiplier -stat.speedmultiplier = Speed Multiplier -stat.reloadmultiplier = Reload Multiplier -stat.buildspeedmultiplier = Build Speed Multiplier +stat.payloadcapacity = Kapasidad ng Payload +stat.abilities = Mga Abilidad +stat.canboost = Maaaring Magpalakas +stat.flying = Maaring Maglipad +stat.ammouse = Paggamit ng Bala +stat.ammocapacity = Kapasidad ng Bala +stat.damagemultiplier = Multiplier ng Pinsala +stat.healthmultiplier = Multiplier ng Health +stat.speedmultiplier = Multiplier ng Bilis +stat.reloadmultiplier = Multiplier ng BReload +stat.buildspeedmultiplier = Multiplier ng Bilis ng Pag-buo stat.reactive = Reacts stat.immunities = Immunities stat.healing = Healing @@ -1053,42 +1053,40 @@ ability.stat.shield = [stat]{0}[lightgray] shield ability.stat.repairspeed = [stat]{0}/sec[lightgray] repair speed ability.stat.slurpheal = [stat]{0}[lightgray] health/liquid unit ability.stat.cooldown = [stat]{0} sec[lightgray] cooldown -ability.stat.maxtargets = [stat]{0}[lightgray] max targets +ability.stat.maxtargets = [stat]{0}[lightgray] max ng mga target ability.stat.sametypehealmultiplier = [stat]{0}%[lightgray] same type repair amount -ability.stat.damagereduction = [stat]{0}%[lightgray] damage reduction -ability.stat.minspeed = [stat]{0} tiles/sec[lightgray] min speed -ability.stat.duration = [stat]{0} sec[lightgray] duration -ability.stat.buildtime = [stat]{0} sec[lightgray] build time +ability.stat.damagereduction = [stat]{0}%[lightgray] pagbabawas ng pinsala +ability.stat.minspeed = [stat]{0} tiles/sec[lightgray] min ng bilis +ability.stat.duration = [stat]{0} sec[lightgray] na tagal +ability.stat.buildtime = [stat]{0} sec[lightgray] oras na pagbuo -bar.onlycoredeposit = Only Core Depositing Allowed +bar.onlycoredeposit = Pinapayag lang ang Cire Depositing -bar.drilltierreq = Better Drill Required -bar.nobatterypower = Insufficieny Battery Power -bar.noresources = Missing Resources -bar.corereq = Core Base Required -bar.corefloor = Core Zone Tile Required -bar.cargounitcap = Cargo Unit Cap Reached -bar.drillspeed = Drill Speed: {0}/s -bar.pumpspeed = Pump Speed: {0}/s -bar.efficiency = Efficiency: {0}% -bar.boost = Boost: +{0}% -bar.powerbuffer = Battery Power: {0}/{1} -bar.powerbalance = Power: {0}/s -bar.powerstored = Stored: {0}/{1} -bar.poweramount = Power: {0} -bar.poweroutput = Power Output: {0} -bar.powerlines = Connections: {0}/{1} -bar.items = Items: {0} -bar.capacity = Capacity: {0} +bar.drilltierreq = Kinakailangan ang Mas mahusay na Drill +bar.noresources = Walang mga Kinakailangang Resources +bar.corereq = Kinakailangang Core Base +bar.corefloor = Kinakailangang Tile ng Core Zone +bar.cargounitcap = Naabot ng Limit ng Cargo Unit +bar.drillspeed = Bilis ng Drill: {0}/s +bar.pumpspeed = Bilis ng Pump: {0}/s +bar.efficiency = Kahusayan: {0}% +bar.boost = Palakas: +{0}% +bar.powerbalance = Kuryente: {0}/s +bar.powerstored = Nakaimbak: {0}/{1} +bar.poweramount = Kuryente: {0} +bar.poweroutput = Output ng Kuryente: {0} +bar.powerlines = Mga Connection: {0}/{1} +bar.items = Aytems: {0} +bar.capacity = Kapasidad: {0} bar.unitcap = {0} {1}/{2} -bar.liquid = Liquid -bar.heat = Heat -bar.cooldown = Cooldown +bar.liquid = Likido +bar.heat = Init + bar.instability = Instability -bar.heatamount = Heat: {0} -bar.heatpercent = Heat: {0} ({1}%) -bar.power = Power -bar.progress = Build Progress +bar.heatamount = Init: {0} +bar.heatpercent = Init: {0} ({1}%) +bar.power = Kuryente +bar.progress = Progress ng Bumuo bar.loadprogress = Progress bar.launchcooldown = Launch Cooldown bar.input = Input @@ -1125,32 +1123,31 @@ unit.powersecond = mga yunit ng kuryente/segundo unit.tilessecond = tile/segundo unit.liquidsecond = mga yunit ng likido/segundo unit.itemssecond = aytem/segundo -unit.liquidunits = liquid units -unit.powerunits = power units -unit.heatunits = heat units -unit.degrees = degrees -unit.seconds = seconds +unit.liquidunits = mga yunit ng likido +unit.powerunits = mga yunit ng kuryente +unit.heatunits = mga yunit ng init +unit.degrees = digri +unit.seconds = segundo unit.minutes = mins -unit.persecond = /sec +unit.persecond = /seg unit.perminute = /min -unit.timesspeed = x speed -unit.multiplier = x +unit.timesspeed = x bilis unit.percent = % -unit.shieldhealth = shield health -unit.items = items +unit.shieldhealth = health ng kalasag +unit.items = aytems unit.thousands = k unit.millions = mil unit.billions = bil unit.shots = shots unit.pershot = /shot -category.purpose = Purpose -category.general = General -category.power = Power -category.liquids = Liquids -category.items = Items +category.purpose = Ang Purpose +category.general = Pangkalahatan +category.power = Kuryente +category.liquids = Mga Likido +category.items = Mga Aytem category.crafting = Input/Output category.function = Function -category.optional = Optional Enhancements +category.optional = Opsyonal na mga enchantment setting.alwaysmusic.name = Always Play Music setting.alwaysmusic.description = When enabled, music will always play on loop in-game.\nWhen disabled, it only plays at random intervals. setting.skipcoreanimation.name = Laktawan ang Core Launch/Land Animation @@ -1164,7 +1161,7 @@ setting.backgroundpause.name = Pause In Background setting.buildautopause.name = Auto-Pause Building setting.doubletapmine.name = Double-Tap to Mine setting.commandmodehold.name = Hold For Command Mode -setting.distinctcontrolgroups.name = Limit One Control Group Per Unit +setting.distinctcontrolgroups.name = Limit One Control Group Per Unit setting.modcrashdisable.name = Huwag paganahin ang Mods Sa Startup Crash setting.animatedwater.name = Animated Fluids setting.animatedshields.name = Animated Shields @@ -1308,11 +1305,11 @@ keybind.menu.name = Menu keybind.pause.name = Pause keybind.pause_building.name = Pause/Resume Building keybind.minimap.name = Minimap -keybind.planet_map.name = Planet Map -keybind.research.name = Research -keybind.block_info.name = Block Info +keybind.planet_map.name = Mapa ng Planeta +keybind.research.name = Mga Research +keybind.block_info.name = Info ng Block keybind.chat.name = Chat -keybind.player_list.name = Player List +keybind.player_list.name = Lista ng mga Players keybind.console.name = Console keybind.rotate.name = Rotate keybind.rotateplaced.name = Rotate Existing (Hold) @@ -1388,17 +1385,17 @@ rules.deconstructrefundmultiplier = Deconstruct Refund Multiplier rules.waitForWaveToEnd = Waves Wait for Enemies rules.wavelimit = Map Ends After Wave rules.dropzoneradius = Drop Zone Radius:[lightgray] (tiles) -rules.unitammo = Units Require Ammo -rules.enemyteam = Enemy Team -rules.playerteam = Player Team +rules.unitammo = Mga yunit nangangailangan ng Munisyon +rules.enemyteam = Pangkat ng mga Kaaway +rules.playerteam = Pangkat ng Player rules.title.waves = Waves rules.title.resourcesbuilding = Resources & Building -rules.title.enemy = Enemies -rules.title.unit = Units +rules.title.enemy = Mga Kaaway +rules.title.unit = Mga Yunit rules.title.experimental = Experimental -rules.title.environment = Environment -rules.title.teams = Teams -rules.title.planet = Planet +rules.title.environment = Kapaligiran +rules.title.teams = Mga Team +rules.title.planet = Planeta rules.lighting = Lighting rules.fog = Fog of War rules.invasions = Enemy Sector Invasions @@ -1411,7 +1408,7 @@ rules.fire = Fire rules.anyenv = rules.explosions = Block/Unit Explosion Damage rules.ambientlight = Ambient Light -rules.weather = Weather +rules.weather = Panahon rules.weather.frequency = Frequency: rules.weather.always = Always rules.weather.duration = Duration: @@ -1419,22 +1416,23 @@ rules.randomwaveai.info = Makes units spawned in waves target random structures rules.placerangecheck.info = Prevents players from placing anything near enemy buildings. When trying to place a turret, the range is increased, so the turret will not be able to reach the enemy. rules.onlydepositcore.info = Prevents units from depositing items into any buildings except cores. -content.item.name = Items -content.liquid.name = Liquids -content.unit.name = Units -content.block.name = Blocks -content.status.name = Status Effects -content.sector.name = Sectors -content.team.name = Factions +content.item.name = Aytems +content.liquid.name = Likido +content.unit.name = Yunits +content.block.name = Mga Block +content.status.name = Status ng mga Epekto +content.sector.name = Mga Sector +content.team.name = Mga Faction wallore = (Wall) item.copper.name = Tanso -item.lead.name = Lead +item.lead.name = Tingga + item.coal.name = Coal -item.graphite.name = Graphite -item.titanium.name = Titanium +item.graphite.name = Grapayt +item.titanium.name = Titanyo item.thorium.name = Thorium -item.silicon.name = Silicon +item.silicon.name = Silikon item.plastanium.name = Plastanium item.phase-fabric.name = Phase Pabriko item.surge-alloy.name = Surge Alloy @@ -1443,17 +1441,18 @@ item.sand.name = Buhangin item.blast-compound.name = Blast Compound item.pyratite.name = Pyratite item.metaglass.name = Metaglass -item.scrap.name = Scrap +item.scrap.name = Piraso item.fissile-matter.name = Fissile Matter -item.beryllium.name = Beryllium +item.beryllium.name = Berilyo item.tungsten.name = Tungsten item.oxide.name = Oxide item.carbide.name = Carbide item.dormant-cyst.name = Dormant Cyst liquid.water.name = Tubig liquid.slag.name = Slag -liquid.oil.name = Oil +liquid.oil.name = Langis liquid.cryofluid.name = Lamigtubig + liquid.neoplasm.name = Neoplasm liquid.arkycite.name = Arkycite liquid.gallium.name = Gallium @@ -1524,19 +1523,19 @@ unit.latum.name = Latum unit.renale.name = Renale block.parallax.name = Parallax block.cliff.name = Cliff -block.sand-boulder.name = Sand Boulder -block.basalt-boulder.name = Basalt Boulder -block.grass.name = Grass +block.sand-boulder.name = Batong Buhangin +block.basalt-boulder.name = Batong Basalt +block.grass.name = Damo block.molten-slag.name = Slag block.pooled-cryofluid.name = Cryofluid -block.space.name = Space -block.salt.name = Salt -block.salt-wall.name = Salt Wall +block.space.name = Kalawakan +block.salt.name = Asin +block.salt-wall.name = Asin na Pader block.pebbles.name = Pebbles block.tendrils.name = Tendrils -block.sand-wall.name = Sand Wall +block.sand-wall.name = Buhangin na Pader block.spore-pine.name = Spore Pine -block.spore-wall.name = Spore Wall +block.spore-wall.name = Spore na Pader block.boulder.name = Boulder block.snow-boulder.name = Snow Boulder block.snow-pine.name = Snow Pine @@ -1546,13 +1545,13 @@ block.moss.name = Moss block.shrubs.name = Shrubs block.spore-moss.name = Spore Moss block.shale-wall.name = Shale Wall -block.scrap-wall.name = Scrap Wall -block.scrap-wall-large.name = Malaking Scrap Wall -block.scrap-wall-huge.name = Masmalaking Scrap Wall -block.scrap-wall-gigantic.name = Pinakamalaking Scrap Wall +block.scrap-wall.name = Pirasong Pader +block.scrap-wall-large.name = Malaking Pirasong Pader +block.scrap-wall-huge.name = Masmalaking Pirasong Pader +block.scrap-wall-gigantic.name = Pinakamalaking Pirasong Pader block.thruster.name = Thruster block.kiln.name = Kiln -block.graphite-press.name = Graphite Press +block.graphite-press.name = Grapayt Press block.multi-press.name = Multi-Press block.constructing = {0} [lightgray](Constructing) block.spawn.name = Enemy Spawn @@ -1561,19 +1560,20 @@ block.remove-ore.name = Remove Ore block.core-shard.name = Core: Shard block.core-foundation.name = Core: Foundation block.core-nucleus.name = Core: Nucleus -block.deep-water.name = Deep Water +block.deep-water.name = Malalim ng Tubig block.shallow-water.name = Tubig -block.tainted-water.name = Tainted Water -block.deep-tainted-water.name = Deep Tainted Water -block.darksand-tainted-water.name = Dark Sand Tainted Water +block.tainted-water.name = Bahid ng Tubig +block.deep-tainted-water.name = Malalim na bahid ng tubig +block.darksand-tainted-water.name = Madilim na buhangin na may bahid ng tubig block.tar.name = Tar -block.stone.name = Stone +block.stone.name = Bato block.sand-floor.name = Buhangin -block.darksand.name = Maitim na Buhangin +block.darksand.name = Madilim na Buhangin + block.ice.name = Yelo block.snow.name = Snow block.crater-stone.name = Craters -block.sand-water.name = Sand water +block.sand-water.name = Buhangin na Tubig block.darksand-water.name = Dark Sand Water block.char.name = Char block.dacite.name = Dacite @@ -1581,107 +1581,107 @@ block.rhyolite.name = Rhyolite block.dacite-wall.name = Dacite Wall block.dacite-boulder.name = Dacite Boulder block.ice-snow.name = Ice Snow -block.stone-wall.name = Stone Wall -block.ice-wall.name = Ice Wall -block.snow-wall.name = Snow Wall -block.dune-wall.name = Dune Wall +block.stone-wall.name = Pader na Bato +block.ice-wall.name = Pader na Yelo +block.snow-wall.name = Pader na Niyebe +block.dune-wall.name = Pader ng Dune block.pine.name = Pine -block.dirt.name = Dirt -block.dirt-wall.name = Dirt Wall -block.mud.name = Mud -block.white-tree-dead.name = White Tree Dead -block.white-tree.name = White Tree -block.spore-cluster.name = Spore Cluster -block.metal-floor.name = Metal Floor 1 -block.metal-floor-2.name = Metal Floor 2 -block.metal-floor-3.name = Metal Floor 3 -block.metal-floor-4.name = Metal Floor 4 -block.metal-floor-5.name = Metal Floor 4 -block.metal-floor-damaged.name = Metal Floor Damaged -block.dark-panel-1.name = Dark Panel 1 -block.dark-panel-2.name = Dark Panel 2 -block.dark-panel-3.name = Dark Panel 3 -block.dark-panel-4.name = Dark Panel 4 -block.dark-panel-5.name = Dark Panel 5 -block.dark-panel-6.name = Dark Panel 6 -block.dark-metal.name = Dark Metal +block.dirt.name = Dumi +block.dirt-wall.name = Pader ng Dumi +block.mud.name = Putik +block.white-tree-dead.name = Namatay na Puting Puno +block.white-tree.name = Puting Puno +block.spore-cluster.name = Kumpol ng Spore +block.metal-floor.name = Bakal na Sahig 1 +block.metal-floor-2.name = Bakal na Sahig 2 +block.metal-floor-3.name = Bakal na Sahig 3 +block.metal-floor-4.name = Bakal na Sahig 4 +block.metal-floor-5.name = Bakal na Sahig 4 +block.metal-floor-damaged.name = Wasak na Bakal na Sahig +block.dark-panel-1.name = Madilim na Panel 1 +block.dark-panel-2.name = Madilim na Panel 2 +block.dark-panel-3.name = Madilim na Panel 3 +block.dark-panel-4.name = Madilim na Panel 4 +block.dark-panel-5.name = Madilim na Panel 5 +block.dark-panel-6.name = Madilim na Panel +block.dark-metal.name = Madilim na Bakal block.basalt.name = Basalt -block.hotrock.name = Hot Rock -block.magmarock.name = Magma Rock -block.copper-wall.name = Copper Wall -block.copper-wall-large.name = Malaking Copper Wall -block.titanium-wall.name = Titanium Wall -block.titanium-wall-large.name = Malaking Titanium Wall -block.plastanium-wall.name = Plastanium Wall -block.plastanium-wall-large.name = Malaking Plastanium Wall -block.phase-wall.name = Phase Wall -block.phase-wall-large.name = Malaking Phase Wall -block.thorium-wall.name = Thorium Wall -block.thorium-wall-large.name = Malaking Thorium Wall -block.door.name = Door -block.door-large.name = Malaking Door +block.hotrock.name = Mainit na Bato +block.magmarock.name = Batong Magma +block.copper-wall.name = Tanso na Pader +block.copper-wall-large.name = Malaking Tanso na Pader +block.titanium-wall.name = Titanyo na Pader +block.titanium-wall-large.name = Malaking Titanyo na Pader +block.plastanium-wall.name = Plastanium na Pader +block.plastanium-wall-large.name = Malaking Plastanium na Pader +block.phase-wall.name = Phase na Pader +block.phase-wall-large.name = Malaking Phase na Pader +block.thorium-wall.name = Thorium na Pader +block.thorium-wall-large.name = Malaking Thorium na Pader +block.door.name = Pinto +block.door-large.name = Malaking Pinto block.duo.name = Duo block.scorch.name = Scorch block.scatter.name = Scatter block.hail.name = Hail block.lancer.name = Lancer block.conveyor.name = Conveyor -block.titanium-conveyor.name = Titanium Conveyor -block.plastanium-conveyor.name = Plastanium Conveyor -block.armored-conveyor.name = Armored Conveyor +block.titanium-conveyor.name = Titanyo na Conveyor +block.plastanium-conveyor.name = Plastanium na Conveyor +block.armored-conveyor.name = Nakabaluti na Conveyor block.junction.name = Junction block.router.name = Router -block.distributor.name = Distributor +block.distributor.name = Distribyutor block.sorter.name = Sorter block.inverted-sorter.name = Inverted Sorter -block.message.name = Message -block.reinforced-message.name = Reinforced Message -block.world-message.name = World Message +block.message.name = Mensahe +block.reinforced-message.name = Pinatibay na Mensahe +block.world-message.name = Mensahe ng Mundo block.world-switch.name = World Switch block.illuminator.name = Illuminator block.overflow-gate.name = Overflow Gate block.underflow-gate.name = Underflow Gate -block.silicon-smelter.name = Silicon Smelter +block.silicon-smelter.name = Silikon na Smelter block.phase-weaver.name = Phase Weaver block.pulverizer.name = Pulverizer block.cryofluid-mixer.name = Cryofluid Mixer -block.melter.name = Melter +block.melter.name = Pangtunaw block.incinerator.name = Incinerator block.spore-press.name = Spore Press -block.separator.name = Separator +block.separator.name = Panghiwalay block.coal-centrifuge.name = Coal Centrifuge -block.power-node.name = Power Node -block.power-node-large.name = Malaking Power Node -block.surge-tower.name = Surge Tower -block.diode.name = Battery Diode -block.battery.name = Battery -block.battery-large.name = Malaking Battery +block.power-node.name = Kuryente na Node +block.power-node-large.name = Malaking Kuryente na Node +block.surge-tower.name = Tore na Surge +block.diode.name = Bateryang Diode +block.battery.name = Baterya +block.battery-large.name = Malaking Baterya block.combustion-generator.name = Combustion Generator block.steam-generator.name = Steam Generator block.differential-generator.name = Differential Generator block.impact-reactor.name = Impact Reactor -block.mechanical-drill.name = Mechanical Drill -block.pneumatic-drill.name = Pneumatic Drill +block.mechanical-drill.name = Mekanikal na Drill +block.pneumatic-drill.name = Niyumatik na Drill block.laser-drill.name = Laser Drill block.water-extractor.name = Water Extractor block.cultivator.name = Cultivator -block.conduit.name = Conduit -block.mechanical-pump.name = Mechanical Pump -block.item-source.name = Item Source -block.item-void.name = Item Void -block.liquid-source.name = Liquid Source -block.liquid-void.name = Liquid Void -block.power-void.name = Power Void -block.power-source.name = Power Source -block.unloader.name = Unloader +block.conduit.name = Tubo +block.mechanical-pump.name = Mekanikal na Pump +block.item-source.name = Pinagmulan ng Aytem +block.item-void.name = Void ng Aytem +block.liquid-source.name = Pinagmulan ng Likido +block.liquid-void.name = Void ng Likido +block.power-void.name = Void ng Kuryente +block.power-source.name = Pinagmulan ng Kuryente +block.unloader.name = Diskargahan block.vault.name = Vault block.wave.name = Wave block.tsunami.name = Tsunami block.swarmer.name = Swarmer block.salvo.name = Salvo block.ripple.name = Ripple -block.phase-conveyor.name = Phase Conveyor -block.bridge-conveyor.name = Bridge Conveyor +block.phase-conveyor.name = Phase na Conveyor +block.bridge-conveyor.name = Tulay ng Conveyor block.plastanium-compressor.name = Plastanium Compressor block.pyratite-mixer.name = Pyratite Mixer block.blast-mixer.name = Blast Mixer @@ -1690,14 +1690,14 @@ block.solar-panel-large.name = Large Solar Panel block.oil-extractor.name = Oil Extractor block.repair-point.name = Repair Point block.repair-turret.name = Repair Turret -block.pulse-conduit.name = Pulse Conduit -block.plated-conduit.name = Plated Conduit -block.phase-conduit.name = Phase Conduit -block.liquid-router.name = Liquid Router -block.liquid-tank.name = Liquid Tank -block.liquid-container.name = Liquid Container -block.liquid-junction.name = Liquid Junction -block.bridge-conduit.name = Bridge Conduit +block.pulse-conduit.name = Pulse na Conduit +block.plated-conduit.name = Plated na Conduit +block.phase-conduit.name = Phase na Conduit +block.liquid-router.name = Likidong Router +block.liquid-tank.name = Likidong Tangke +block.liquid-container.name = Likidong Lalagyan +block.liquid-junction.name = Likidong Junction +block.bridge-conduit.name = Tubong Tulay block.rotary-pump.name = Rotary Pump block.thorium-reactor.name = Thorium Reactor block.mass-driver.name = Mass Driver @@ -1707,12 +1707,12 @@ block.thermal-generator.name = Thermal Generator block.surge-smelter.name = Surge Smelter block.mender.name = Mender block.mend-projector.name = Mend Projector -block.surge-wall.name = Surge Wall -block.surge-wall-large.name = Malaking Surge Wall +block.surge-wall.name = Surge na Pader +block.surge-wall-large.name = Malaking Surge na Pader block.cyclone.name = Cyclone block.fuse.name = Fuse -block.shock-mine.name = Shock Mine -block.overdrive-projector.name = Overdrive Projector +block.shock-mine.name = Mina ng Kuryente +block.overdrive-projector.name = Projector ng Overdrive block.force-projector.name = Force Projector block.arc.name = Arc block.rtg-generator.name = RTG Generator @@ -1724,9 +1724,9 @@ block.launch-pad.name = Launch Pad block.advanced-launch-pad.name = Launch Pad block.landing-pad.name = Landing Pad block.segment.name = Segment -block.ground-factory.name = Ground Factory -block.air-factory.name = Air Factory -block.naval-factory.name = Naval Factory +block.ground-factory.name = Pabrika ng Lupa +block.air-factory.name = Pabrika ng Langit +block.naval-factory.name = Pabrika ng Pandagat block.additive-reconstructor.name = Additive Reconstructor block.multiplicative-reconstructor.name = Multiplicative Reconstructor block.exponential-reconstructor.name = Exponential Reconstructor @@ -2128,26 +2128,26 @@ block.liquid-tank.description = Stores a large amount of liquids. Use for creati block.liquid-junction.description = Acts as a bridge for two crossing conduits. Useful in situations with two different conduits carrying different liquids to different locations. block.bridge-conduit.description = Advanced liquid transport block. Allows transporting liquids over up to 3 tiles of any terrain or building. block.phase-conduit.description = Advanced liquid transport block. Uses power to teleport liquids to a connected phase conduit over several tiles. -block.power-node.description = Transmits power to connected nodes. The node will receive power from or supply power to any adjacent blocks. -block.power-node-large.description = An advanced power node with greater range. -block.surge-tower.description = An extremely long-range power node with fewer available connections. -block.diode.description = Battery power can flow through this block in only one direction, but only if the other side has less power stored. -block.battery.description = Stores power as a buffer in times of surplus energy. Outputs power in times of deficit. -block.battery-large.description = Stores much more power than a regular battery. -block.combustion-generator.description = Generates power by burning flammable materials, such as coal. -block.thermal-generator.description = Generates power when placed in hot locations. -block.steam-generator.description = An advanced combustion generator. More efficient, but requires additional water for generating steam. -block.differential-generator.description = Generates large amounts of energy. Utilizes the temperature difference between cryofluid and burning pyratite. -block.rtg-generator.description = A simple, reliable generator. Uses the heat of decaying radioactive compounds to produce energy at a slow rate. -block.solar-panel.description = Provides a small amount of power from the sun. -block.solar-panel-large.description = A significantly more efficient version of the standard solar panel. -block.thorium-reactor.description = Generates significant amounts of power from thorium. Requires constant cooling. Will explode violently if insufficient amounts of coolant are supplied. Power output depends on fullness, with base power generated at full capacity. -block.impact-reactor.description = An advanced generator, capable of creating massive amounts of power at peak efficiency. Requires a significant power input to kickstart the process. -block.mechanical-drill.description = A cheap drill. When placed on appropriate tiles, outputs items at a slow pace indefinitely. Only capable of mining basic resources. -block.pneumatic-drill.description = An improved drill, capable of mining titanium. Mines at a faster pace than a mechanical drill. -block.laser-drill.description = Allows drilling even faster through laser technology, but requires power. Capable of mining thorium. -block.blast-drill.description = The ultimate drill. Requires large amounts of power. -block.water-extractor.description = Extracts groundwater. Used in locations with no surface water available. +block.power-node.description = Nagpapadala ng kuryente sa mga konektadong node. Ang node ay makakatanggap ng kuryente mula sa o magsu-supply ng kuryente sa anumang katabing block. +block.power-node-large.description = Isang advanced na node na may mas malawak na hanay. +block.surge-tower.description = Isang napakahabang kuryente na node, pero mas kaunting lamang magagamit na mga koneksyon. +block.diode.description = Ang kuryente ng baterya ay maaaring dumaloy sa block na to sa isang direksyon lamang, ngunit kung ang kabilang panig ay may mas kaunting kuryenteng nakaimbak. +block.battery.description = Nag-iimbak ng Kuryente bilang buffer sa mga oras ng sobrang enerhiya. Nag output ng mga kuryente sa oras ng kakulangan. +block.battery-large.description = Nag-iimbak ng mas maraming kuryente kaysa sa normal na baterya. +block.combustion-generator.description = Bumubuo ng kuryente sa pamamagitan ng pagsunog ng mga nasusunog na materyales, tulad ng coal. +block.thermal-generator.description = Bumubuo ng kuryente sa mga maiinit na lugar. +block.steam-generator.description = Isang advanced combustion generator. Mas efficient pero nangangailangan ng karagdagang tubig para sa pagbuo ng singaw. +block.differential-generator.description = Bumubuo ng malaking halaga ng enerhiya. Ginagamit ang pagkakaiba ng temperatura sa pagitan ng cryofluid at nasusunog na pyratite. +block.rtg-generator.description = Isang simpleng at maaasahang na generator. Gumagamit ng init ng mga nabubulok na radioactive compound upang makagawa ng enerhiya sa mabagal na bilis. +block.solar-panel.description = Nagbibigay ng kaunting kuryente mula sa araw. +block.solar-panel-large.description = Isang makabuluhang mas efficient na bersyon ng karaniwang solar panel. +block.thorium-reactor.description = Bumubuo ng malaking halaga ng kuryente mula sa thorium. Nangangailangan ng patuloy na lamigin gamit ang cryofluid. Marahas na sasabog kung hindi sapat ang dami ng coolant na ibinibigay. Ang output ng kuryente ay depende sa kapunuan, na may base na kuryente na nabuo sa buong kapasidad. +block.impact-reactor.description = Isang advanced na generator, na may kakayahang lumikha ng napakalaking halaga ng kuryente sa pinakamataas na efficiency. Nangangailangan lang ng makabuluhang input ng kuryente upang masimulan ang proseso. +block.mechanical-drill.description = Pinaka-mura na drill. Kapag inilagay sa mga appropriate tiles, naglalabas ng items na mabagal na walang katiyakan. Kaya mag drill ng basic resources. +block.pneumatic-drill.description = Isang upgrade sa nakaraan ng drill, kaya mag drill ang titanyo. Mas mabilis kaysa sa Mekanikal na Drill. +block.laser-drill.description = Pwede mag drill na mas mabilis lalo na sa teknolohiya ng laser, pero kailangan kuryente. Kaya mag drill ang thorium. +block.blast-drill.description = Ang pangwakas ng drill na ito. Kailangan ng malaking input sa kuryente. +block.water-extractor.description = Nag e-extract ng groundwater. Ginagamit sa mga sahig na walang ibabaw na tubig. block.cultivator.description = Cultivates tiny concentrations of spores in the atmosphere into industry-ready pods. block.cultivator.details = Recovered technology. Used to produce massive amounts of biomass as efficiently as possible. Likely the initial incubator of the spores now covering Serpulo. block.oil-extractor.description = Uses large amounts of power, sand and water to drill for oil. From af3c0528e26e8dcb712f5972046b7d7fd20172bb Mon Sep 17 00:00:00 2001 From: Github Actions Date: Wed, 5 Feb 2025 16:59:16 +0000 Subject: [PATCH 185/460] Automatic bundle update --- core/assets/bundles/bundle_fil.properties | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/core/assets/bundles/bundle_fil.properties b/core/assets/bundles/bundle_fil.properties index 62e96758bb..c8306bd9df 100644 --- a/core/assets/bundles/bundle_fil.properties +++ b/core/assets/bundles/bundle_fil.properties @@ -756,7 +756,9 @@ sectors.stored = Stored: sectors.resume = Resume sectors.launch = I-Launch sectors.select = I-Select +sectors.launchselect = Select Launch Destination sectors.nonelaunch = [lightgray]none (sun) +sectors.redirect = Redirect Launch Pads sectors.rename = Palitan ang pangalan ng Sector sectors.enemybase = [scarlet]Enemy Base @@ -935,7 +937,7 @@ lastaccessed = [lightgray]Last Accessed: {0} lastcommanded = [lightgray]Last Commanded: {0} block.unknown = [lightgray]??? stat.showinmap = -stat.description = Layunin +stat.description = Layunin stat.input = Input stat.output = Output @@ -1063,6 +1065,7 @@ ability.stat.buildtime = [stat]{0} sec[lightgray] oras na pagbuo bar.onlycoredeposit = Pinapayag lang ang Cire Depositing bar.drilltierreq = Kinakailangan ang Mas mahusay na Drill +bar.nobatterypower = Insufficient Battery Power bar.noresources = Walang mga Kinakailangang Resources bar.corereq = Kinakailangang Core Base bar.corefloor = Kinakailangang Tile ng Core Zone @@ -1071,6 +1074,7 @@ bar.drillspeed = Bilis ng Drill: {0}/s bar.pumpspeed = Bilis ng Pump: {0}/s bar.efficiency = Kahusayan: {0}% bar.boost = Palakas: +{0}% +bar.powerbuffer = Batteries: {0}/{1} bar.powerbalance = Kuryente: {0}/s bar.powerstored = Nakaimbak: {0}/{1} bar.poweramount = Kuryente: {0} @@ -1081,6 +1085,7 @@ bar.capacity = Kapasidad: {0} bar.unitcap = {0} {1}/{2} bar.liquid = Likido bar.heat = Init +bar.cooldown = Cooldown bar.instability = Instability bar.heatamount = Init: {0} @@ -1132,6 +1137,7 @@ unit.minutes = mins unit.persecond = /seg unit.perminute = /min unit.timesspeed = x bilis +unit.multiplier = x unit.percent = % unit.shieldhealth = health ng kalasag unit.items = aytems From 53eb20cf4bfb0faf3b9a0e4286e45ca61546f770 Mon Sep 17 00:00:00 2001 From: Darkness <79508138+Darkness6030@users.noreply.github.com> Date: Wed, 5 Feb 2025 19:59:23 +0300 Subject: [PATCH 186/460] Update bundle_ru.properties (#8774) --- core/assets/bundles/bundle_ru.properties | 60 ++++++++++++------------ 1 file changed, 30 insertions(+), 30 deletions(-) diff --git a/core/assets/bundles/bundle_ru.properties b/core/assets/bundles/bundle_ru.properties index 10490a64d1..1b134f14c2 100644 --- a/core/assets/bundles/bundle_ru.properties +++ b/core/assets/bundles/bundle_ru.properties @@ -36,7 +36,7 @@ load.scripts = Скрипты be.update = Доступна новая сборка Bleeding Edge: be.update.confirm = Загрузить её и перезапустить игру сейчас? -be.updating = Обновляется… +be.updating = Обновляется... be.ignore = Игнорировать be.noupdates = Обновления не найдены. be.check = Проверить обновления @@ -55,12 +55,12 @@ mods.browser.sortdate = Сортировка по дате изменения mods.browser.sortstars = Сортировка по количеству звёзд schematic = Схема -schematic.add = Сохранить схему… +schematic.add = Сохранить схему... schematics = Схемы -schematic.search = Поиск схем… +schematic.search = Поиск схем... schematic.replace = Схема с таким названием уже существует. Заменить её? schematic.exists = Схема с таким названием уже существует. -schematic.import = Импортировать схему… +schematic.import = Импортировать схему... schematic.exportfile = Экспортировать файл schematic.importfile = Импортировать файл schematic.browseworkshop = Просмотр Мастерской @@ -211,7 +211,7 @@ players = Игроков: {0} players.single = {0} игрок players.search = поиск players.notfound = [gray]игроки не найдены -server.closing = [accent]Закрытие сервера… +server.closing = [accent]Закрытие сервера... server.kicked.kick = Вас выгнали с сервера! server.kicked.whitelist = Вы не в белом списке сервера. server.kicked.serverClose = Сервер закрыт. @@ -235,7 +235,7 @@ hostserver = Запустить многопользовательский се invitefriends = Пригласить друзей hostserver.mobile = Запустить сервер host = Открыть сервер -hosting = [accent]Открытие сервера… +hosting = [accent]Открытие сервера... hosts.refresh = Обновить hosts.discovering = Поиск локальных игр hosts.discovering.any = Поиск игр @@ -262,12 +262,12 @@ trace.mobile = Мобильный клиент: [accent]{0} trace.modclient = Пользовательский клиент: [accent]{0} trace.times.joined = Присоединялся раз: [accent]{0} trace.times.kicked = Был выгнан раз: [accent]{0} -trace.ips = Все адреса: -trace.names = Имена: +trace.ips = Все IP: +trace.names = Все имена: invalidid = Недопустимый ID клиента! Отправьте отчёт об ошибке. player.ban = Заблокировать player.kick = Выгнать -player.trace = Статистика +player.trace = Отслеживать player.admin = Переключить администратора player.team = Сменить команду server.bans = Блокировки @@ -286,7 +286,7 @@ confirmkick = Вы действительно хотите выгнать игр confirmunban = Вы действительно хотите разблокировать этого игрока? confirmadmin = Вы действительно хотите сделать игрока «{0}[white]» администратором? confirmunadmin = Вы действительно хотите убрать игрока «{0}[white]» из администраторов? -votekick.reason = Причина +votekick.reason = Причина голосования votekick.reason.message = Вы уверены, что хотите голосованием выгнать "{0}[white]"?\nЕсли да, введите причину: joingame.title = Присоединиться к игре joingame.ip = IP: @@ -297,9 +297,9 @@ disconnect.timeout = Время ожидания истекло. disconnect.data = Ошибка при загрузке данных мира! disconnect.snapshottimeout = Timed out while receiving UDP snapshots.\nThis may be caused by an unstable network or connection. cantconnect = Не удаётся присоединиться к игре ([accent]{0}[]). -connecting = [accent]Подключение… -reconnecting = [accent]Переподключение… -connecting.data = [accent]Загрузка данных мира… +connecting = [accent]Подключение... +reconnecting = [accent]Переподключение... +connecting.data = [accent]Загрузка данных мира... server.port = Порт: server.invalidport = Неверный номер порта! server.error.addressinuse = [scarlet]Failed to open server on port 6567.[]\n\nMake sure no other Mindustry servers are running on your device or network! @@ -377,9 +377,9 @@ data.exported = Данные экспортированы. data.invalid = Эти игровые данные являются недействительными. data.import.confirm = Импорт внешних данных сотрёт[scarlet] все[] ваши игровые данные.\n[accent]Это не может быть отменено![]\n\nКак только данные будут импортированы, ваша игра немедленно закроется. quit.confirm = Вы уверены, что хотите выйти? -loading = [accent]Загрузка… +loading = [accent]Загрузка... downloading = [accent]Скачивание... -saving = [accent]Сохранение… +saving = [accent]Сохранение... respawn = [accent][[{0}][] для возрождения из ядра cancelbuilding = [accent][[{0}][] для очистки плана selectschematic = [accent][[{0}][] выделить и скопировать @@ -393,8 +393,8 @@ wave = [accent]Волна {0} wave.cap = [accent]Волна {0}/{1} wave.waiting = [lightgray]Волна через {0} wave.waveInProgress = [lightgray]Волна продолжается -waiting = [lightgray]Ожидание… -waiting.players = Ожидание игроков… +waiting = [lightgray]Ожидание... +waiting.players = Ожидание игроков... wave.enemies = [lightgray]Враги: {0} wave.enemycores = [lightgray]Вражеских ядер: [accent]{0} wave.enemycore = [accent]{0}[lightgray] вражеское ядро @@ -421,7 +421,7 @@ changelog = Список изменений (необязательно): updatedesc = Перезаписать заголовок и описание eula = Лицензионное соглашение Steam с конечным пользователем missing = Этот предмет был удалён или перемещён.\n[lightgray]Публикация в Мастерской была автоматически удалена. -publishing = [accent]Отправка… +publishing = [accent]Отправка... publish.confirm = Вы уверены, что хотите опубликовать этот предмет?\n\n[lightgray]Убедитесь, что вы согласны с EULA Мастерской, иначе ваши предметы не будут отображаться! publish.error = Ошибка отправки предмета: {0} steam.error = Не удалось инициализировать сервисы Steam.\nОшибка: {0} @@ -478,7 +478,7 @@ waves.spawn.none = [scarlet]не обнаружено точек появлен waves.max = максимум единиц waves.guardian = Страж waves.preview = Предварительный просмотр -waves.edit = Редактировать… +waves.edit = Редактировать... waves.random = Случайно waves.copy = Копировать в буфер обмена waves.load = Загрузить из буфера обмена @@ -502,8 +502,8 @@ wavemode.health = всего прочности all = All editor.default = [lightgray]<По умолчанию> -details = Подробности… -edit = Редактировать… +details = Подробности... +edit = Редактировать... variables = Переменные logic.clear.confirm = Are you sure you want to clear all code from this processor? logic.globals = Built-in Variables @@ -535,14 +535,14 @@ editor.saved = Сохранено! editor.save.noname = У вашей карты нет имени! Назовите её в меню «Информация о карте». editor.save.overwrite = Ваша карта не может быть записана поверх встроенной карты! Введите другое название в меню «Информация о карте» editor.import.exists = [scarlet]Не удалось импортировать:[] карта с именем «{0}» уже существует! -editor.import = Импорт… +editor.import = Импорт... editor.importmap = Импортировать карту editor.importmap.description = Импортировать уже существующую карту editor.importfile = Импортировать файл editor.importfile.description = Импортировать файл карты извне editor.importimage = Импортировать файл изображения editor.importimage.description = Импортировать изображение карты извне -editor.export = Экспорт… +editor.export = Экспорт... editor.exportfile = Экспортировать файл editor.exportfile.description = Экспорт файла карты editor.exportimage = Экспортировать ландшафт @@ -566,11 +566,11 @@ toolmode.orthogonal.description = Рисует только\nпрямоугол toolmode.square = Квадрат toolmode.square.description = Квадратная кисть. toolmode.eraseores = Стереть руды -toolmode.eraseores.description = Стереть только руды. +toolmode.eraseores.description = Стирает только руды. toolmode.fillteams = Изменить команду блоков toolmode.fillteams.description = Изменяет принадлежность\nблоков к команде. -toolmode.fillerase = Стереть тип -toolmode.fillerase.description = Стирает все блоки этого типа. +toolmode.fillerase = Стереть заливкой +toolmode.fillerase.description = Стирает все блоки\nодного типа. toolmode.drawteams = Изменить команду блока toolmode.drawteams.description = Изменяет принадлежность\nблока к команде. toolmode.underliquid = Под жидкостями @@ -925,7 +925,7 @@ settings.controls = Управление settings.game = Игра settings.sound = Звук settings.graphics = Графика -settings.cleardata = Очистить игровые данные… +settings.cleardata = Очистить игровые данные... settings.clear.confirm = Вы действительно хотите очистить свои данные?\nЭто нельзя отменить! settings.clearall.confirm = [scarlet]ОСТОРОЖНО![]\nЭто сотрёт все данные, включая сохранения, карты, прогресс кампании и настройки управления.\nПосле того как вы нажмёте [accent][ОК][], игра уничтожит все данные и автоматически закроется. settings.clearsaves.confirm = Вы уверены, что хотите удалить все сохранения? @@ -1239,7 +1239,7 @@ setting.macnotch.description = Для вступления изменений в steam.friendsonly = Только друзья steam.friendsonly.tooltip = Только ли друзья из Steam могут присоединяться к вашей игре.\nУбрав эту галочку, вы сделаете вашу игру публичной - присоединиться сможет любой желающий. public.beta = Имейте в виду, что бета-версия игры не может делать игры публичными. -uiscale.reset = Масштаб пользовательского интерфейса был изменён.\nНажмите «ОК» для подтверждения этого масштаба.\n[scarlet]Возврат настроек и выход через[accent] {0}[] секунд… +uiscale.reset = Масштаб пользовательского интерфейса был изменён.\nНажмите «ОК» для подтверждения этого масштаба.\n[scarlet]Возврат настроек и выход через[accent] {0}[] секунд... uiscale.cancel = Отменить & Выйти setting.bloom.name = Свечение keybind.title = Настройка управления @@ -1253,8 +1253,8 @@ placement.blockselectkeys = \n[lightgray]Клавиша: [{0}, keybind.respawn.name = Возрождение в ядре keybind.control.name = Перехватить контроль над единицей keybind.clear_building.name = Очистить план строительства -keybind.press = Нажмите клавишу… -keybind.press.axis = Нажмите ось или клавишу… +keybind.press = Нажмите клавишу... +keybind.press.axis = Нажмите ось или клавишу... keybind.screenshot.name = Скриншот карты keybind.toggle_power_lines.name = Отображение лазеров энергоснабжения keybind.toggle_block_status.name = Отображение статусов блоков From 457e5d71f4d23b6e68a077aa3cb80e36d425a0b3 Mon Sep 17 00:00:00 2001 From: Jason <131086642+JasonP01@users.noreply.github.com> Date: Wed, 5 Feb 2025 20:39:14 +0200 Subject: [PATCH 187/460] Para buffs (#9705) * para buffs? Signed-off-by: Jason <131086642+JasonP01@users.noreply.github.com> * para nerf Signed-off-by: Jason <131086642+JasonP01@users.noreply.github.com> --------- Signed-off-by: Jason <131086642+JasonP01@users.noreply.github.com> --- core/src/mindustry/content/Blocks.java | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/core/src/mindustry/content/Blocks.java b/core/src/mindustry/content/Blocks.java index 3da006d056..b59347fb54 100644 --- a/core/src/mindustry/content/Blocks.java +++ b/core/src/mindustry/content/Blocks.java @@ -3395,18 +3395,18 @@ public class Blocks{ }}; parallax = new TractorBeamTurret("parallax"){{ - requirements(Category.turret, with(Items.silicon, 120, Items.titanium, 90, Items.graphite, 30)); + requirements(Category.turret, with(Items.silicon, 160, Items.titanium, 110, Items.graphite, 50)); hasPower = true; size = 2; - force = 12f; - scaledForce = 6f; - range = 240f; - damage = 0.3f; + force = 16f; + scaledForce = 9f; + range = 300f; + damage = 0.5f; scaledHealth = 160; - rotateSpeed = 10; + rotateSpeed = 12; - consumePower(3f); + consumePower(3.3f); }}; swarmer = new ItemTurret("swarmer"){{ From 1182ce724a13d1930ff5ccf5b732b77187f35b8c Mon Sep 17 00:00:00 2001 From: BenjamonSRL Date: Wed, 5 Feb 2025 20:44:14 -0300 Subject: [PATCH 188/460] Update servers_v7.json (#10466) --- servers_v7.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/servers_v7.json b/servers_v7.json index 5b25ee9cee..4bc4be8f7b 100644 --- a/servers_v7.json +++ b/servers_v7.json @@ -128,7 +128,8 @@ "162.248.101.95", "162.248.100.98", "162.248.100.133", - "162.248.101.53" + "162.248.101.53", + "162.248.102.101" ] }, { From 26655995202732d6623195066cbf39a789c4400e Mon Sep 17 00:00:00 2001 From: Anuken Date: Wed, 5 Feb 2025 18:47:16 -0500 Subject: [PATCH 189/460] Closes #10440 --- core/src/mindustry/world/blocks/production/Drill.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/core/src/mindustry/world/blocks/production/Drill.java b/core/src/mindustry/world/blocks/production/Drill.java index 00d9ba56a1..9e165e18f1 100644 --- a/core/src/mindustry/world/blocks/production/Drill.java +++ b/core/src/mindustry/world/blocks/production/Drill.java @@ -54,7 +54,7 @@ public class Drill extends Block{ /** Drill effect randomness. Block size by default. */ public float drillEffectRnd = -1f; /** Chance of displaying the effect. Useful for extremely fast drills. */ - public float drillEffectChance = 1f; + public float drillEffectChance = 0.02f; /** Speed the drill bit rotates at. */ public float rotateSpeed = 2f; /** Effect randomly played while drilling. */ @@ -327,7 +327,7 @@ public class Drill extends Block{ progress %= delay; - if(wasVisible && Mathf.chanceDelta(updateEffectChance * warmup)) drillEffect.at(x + Mathf.range(drillEffectRnd), y + Mathf.range(drillEffectRnd), dominantItem.color); + if(wasVisible && Mathf.chanceDelta(drillEffectChance * warmup)) drillEffect.at(x + Mathf.range(drillEffectRnd), y + Mathf.range(drillEffectRnd), dominantItem.color); } } From 9801dbdfd277009ba7553d098cb347eb65907e4f Mon Sep 17 00:00:00 2001 From: router Date: Thu, 6 Feb 2025 01:49:07 +0200 Subject: [PATCH 190/460] Add canGameOver to logic rules, fix trailing spaces (#10403) --- core/src/mindustry/logic/LExecutor.java | 9 +++++---- core/src/mindustry/logic/LogicRule.java | 1 + 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/core/src/mindustry/logic/LExecutor.java b/core/src/mindustry/logic/LExecutor.java index d3a949d34e..d2d074ae56 100644 --- a/core/src/mindustry/logic/LExecutor.java +++ b/core/src/mindustry/logic/LExecutor.java @@ -45,9 +45,9 @@ public class LExecutor{ public LInstruction[] instructions = {}; /** Non-constant variables used for network sync */ public LVar[] vars = {}; - + public LVar counter, unit, thisv, ipt; - + public int[] binds; public boolean yield; @@ -226,7 +226,7 @@ public class LExecutor{ cache.found = false; outFound.setnum(0); } - + if(res != null && res.build != null && (unit.within(res.build.x, res.build.y, Math.max(unit.range(), buildingRange)) || res.build.team == exec.team)){ cache.build = res.build; @@ -1512,6 +1512,7 @@ public class LExecutor{ case dropZoneRadius -> state.rules.dropZoneRadius = value.numf() * 8f; case unitCap -> state.rules.unitCap = Math.max(value.numi(), 0); case lighting -> state.rules.lighting = value.bool(); + case canGameOver -> state.rules.canGameOver = value.bool(); case mapArea -> { int x = p1.numi(), y = p2.numi(), w = p3.numi(), h = p4.numi(); if(!checkMapArea(x, y, w, h, false)){ @@ -1963,7 +1964,7 @@ public class LExecutor{ public void run(LExecutor exec){ Sound sound = Sounds.getSound(id.numi()); if(sound == null || sound == Sounds.swish) sound = Sounds.none; //no. - + if(positional){ sound.at(World.unconv(x.numf()), World.unconv(y.numf()), pitch.numf(), Math.min(volume.numf(), 2f), limit.bool()); }else{ diff --git a/core/src/mindustry/logic/LogicRule.java b/core/src/mindustry/logic/LogicRule.java index 211064e271..b6ca757bb7 100644 --- a/core/src/mindustry/logic/LogicRule.java +++ b/core/src/mindustry/logic/LogicRule.java @@ -13,6 +13,7 @@ public enum LogicRule{ unitCap, mapArea, lighting, + canGameOver, ambientLight, solarMultiplier, dragMultiplier, From 3a0e54c514dca788ad44a951f2ca0a9be593c6c8 Mon Sep 17 00:00:00 2001 From: lemon3357 <126368248+lemon3357@users.noreply.github.com> Date: Thu, 6 Feb 2025 07:49:43 +0800 Subject: [PATCH 191/460] Update servers_v7.json (#10463) --- servers_v7.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/servers_v7.json b/servers_v7.json index 4bc4be8f7b..f96e0426ba 100644 --- a/servers_v7.json +++ b/servers_v7.json @@ -223,7 +223,8 @@ "address": [ "mindustry.icu", "sx.mindustry.icu", - "9k38.igla.pics" + "9k38.igla.pics", + "frp-oak.com:26979" ] }, { From f9dc41efec5b1e69db8ca99133a4abe07e0a0886 Mon Sep 17 00:00:00 2001 From: CharaDr33murr <95907864+CharaDr33murr@users.noreply.github.com> Date: Thu, 6 Feb 2025 02:50:20 +0300 Subject: [PATCH 192/460] Update bundle_ru.properties (#10345) Co-authored-by: Anuken --- core/assets/bundles/bundle_ru.properties | 30 +++++++++++------------- 1 file changed, 14 insertions(+), 16 deletions(-) diff --git a/core/assets/bundles/bundle_ru.properties b/core/assets/bundles/bundle_ru.properties index 1b134f14c2..8ff4e3ae64 100644 --- a/core/assets/bundles/bundle_ru.properties +++ b/core/assets/bundles/bundle_ru.properties @@ -499,14 +499,14 @@ waves.units.show = Показать все wavemode.counts = количество единиц wavemode.totals = всего единиц wavemode.health = всего прочности -all = All +all = всего editor.default = [lightgray]<По умолчанию> details = Подробности... edit = Редактировать... variables = Переменные logic.clear.confirm = Are you sure you want to clear all code from this processor? -logic.globals = Built-in Variables +logic.globals = Встроенные переменные editor.name = Название: editor.spawn = Создать боевую единицу editor.removeunit = Удалить боевую единицу @@ -594,7 +594,7 @@ filter.clear = Очистить filter.option.ignore = Игнорировать filter.scatter = Сеятель filter.terrain = Ландшафт -filter.logic = Logic +filter.logic = Логика filter.option.scale = Масштаб фильтра filter.option.chance = Шанс @@ -781,8 +781,8 @@ sector.curlost = Сектор потерян sector.missingresources = [scarlet]Недостаточно ресурсов для высадки sector.attacked = Сектор [accent]{0}[white] атакован! sector.lost = Сектор [accent]{0}[white] потерян! -sector.capture = Sector [accent]{0}[white]Captured! -sector.capture.current = Sector Captured! +sector.capture = Сектор [accent]{0}[white] захвачен! +sector.capture.current = Сектор захвачен! sector.changeicon = Изменить иконку sector.noswitch.title = Перемещение между секторами sector.noswitch = Вы не можете переключаться между секторами, пока существующий сектор находится под атакой.\n\nСектор: [accent]{0}[] на [accent]{1}[] @@ -794,10 +794,10 @@ threat.high = Высокая threat.extreme = Экстремальная threat.eradication = Истребляющая difficulty.casual = Casual -difficulty.easy = Easy -difficulty.normal = Normal -difficulty.hard = Hard -difficulty.eradication = Eradication +difficulty.easy = Лёгкая +difficulty.normal = Нормальная +difficulty.hard = Сложная +difficulty.eradication = Истребляющая planets = Планеты @@ -1163,7 +1163,7 @@ category.items = Предметы category.crafting = Ввод/вывод category.function = Действие category.optional = Дополнительные улучшения -setting.alwaysmusic.name = Always Play Music +setting.alwaysmusic.name = Всегда играть музыку setting.alwaysmusic.description = When enabled, music will always play on loop in-game.\nWhen disabled, it only plays at random intervals. setting.skipcoreanimation.name = Пропускать анимацию запуска/приземления ядра setting.landscape.name = Только альбомный (горизонтальный) режим @@ -1413,12 +1413,10 @@ rules.title.teams = Команды rules.title.planet = Планета rules.lighting = Освещение rules.fog = Туман войны -rules.invasions = Enemy Sector Invasions -rules.legacylaunchpads = Legacy Launch Pad Mechanics -rules.legacylaunchpads.info = Allows using launch pads without landing pads, as in 7.0. -landingpad.legacy.disabled = [scarlet]\ue815 Disabled[lightgray] (Legacy Launch Pads enabled) -rules.showspawns = Show Enemy Spawns -rules.randomwaveai = Unpredictable Wave AI +rules.invasions = Вторжения врагов на сектора +rules.showspawns = Показывать появление врагов +rules.randomwaveai = Непредсказуемый ИИ волн + rules.fire = Огонь rules.anyenv = <Любая> rules.explosions = Урон от взрывов блоков/единиц From 5140c37ed425e0a66046b31568b6eafc3ee273a5 Mon Sep 17 00:00:00 2001 From: overdramaticpanromantic <108166075+overdramaticpanromantic@users.noreply.github.com> Date: Wed, 5 Feb 2025 18:50:59 -0500 Subject: [PATCH 193/460] Allow updateEffect spread to be customized or disabled for GenericCrafter (#10422) * Allow updateEffect spread to be customized or disabled for GenericCrafters * i think that fixed it? --- core/src/mindustry/world/blocks/production/GenericCrafter.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/core/src/mindustry/world/blocks/production/GenericCrafter.java b/core/src/mindustry/world/blocks/production/GenericCrafter.java index 03a7b867bc..9fe01d436e 100644 --- a/core/src/mindustry/world/blocks/production/GenericCrafter.java +++ b/core/src/mindustry/world/blocks/production/GenericCrafter.java @@ -40,6 +40,7 @@ public class GenericCrafter extends Block{ public Effect craftEffect = Fx.none; public Effect updateEffect = Fx.none; public float updateEffectChance = 0.04f; + public float updateEffectSpread = 4f; public float warmupSpeed = 0.019f; /** Only used for legacy cultivator blocks. */ public boolean legacyReadWarmup = false; @@ -233,7 +234,7 @@ public class GenericCrafter extends Block{ } if(wasVisible && Mathf.chanceDelta(updateEffectChance)){ - updateEffect.at(x + Mathf.range(size * 4f), y + Mathf.range(size * 4)); + updateEffect.at(x + Mathf.range(size * updateEffectSpread), y + Mathf.range(size * updateEffectSpread)); } }else{ warmup = Mathf.approachDelta(warmup, 0f, warmupSpeed); From 8c482d21df9065c7dc85b19ea1626944b538cbcd Mon Sep 17 00:00:00 2001 From: Github Actions Date: Wed, 5 Feb 2025 23:51:49 +0000 Subject: [PATCH 194/460] Automatic bundle update --- core/assets/bundles/bundle_ru.properties | 3 +++ 1 file changed, 3 insertions(+) diff --git a/core/assets/bundles/bundle_ru.properties b/core/assets/bundles/bundle_ru.properties index 8ff4e3ae64..0e8ec146d5 100644 --- a/core/assets/bundles/bundle_ru.properties +++ b/core/assets/bundles/bundle_ru.properties @@ -1414,6 +1414,9 @@ rules.title.planet = Планета rules.lighting = Освещение rules.fog = Туман войны rules.invasions = Вторжения врагов на сектора +rules.legacylaunchpads = Legacy Launch Pad Mechanics +rules.legacylaunchpads.info = Allows using launch pads without landing pads, as in 7.0. +landingpad.legacy.disabled = [scarlet]\ue815 Disabled[lightgray] (Legacy Launch Pads enabled) rules.showspawns = Показывать появление врагов rules.randomwaveai = Непредсказуемый ИИ волн From fbc0518911d4baa8015e84085ef0e91a7cc5452d Mon Sep 17 00:00:00 2001 From: Anuken Date: Wed, 5 Feb 2025 18:52:02 -0500 Subject: [PATCH 195/460] Closes #10400 --- core/src/mindustry/mod/Mods.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/core/src/mindustry/mod/Mods.java b/core/src/mindustry/mod/Mods.java index 470811fc9e..ac5682fe8c 100644 --- a/core/src/mindustry/mod/Mods.java +++ b/core/src/mindustry/mod/Mods.java @@ -432,7 +432,9 @@ public class Mods implements Loadable{ } mods.remove(mod); mod.dispose(); - requiresReload = true; + if(mod.state != ModState.disabled){ + requiresReload = true; + } } public Scripts getScripts(){ From 571b87aaa325910167decccda761c0c1cd59fcb3 Mon Sep 17 00:00:00 2001 From: Anuken Date: Wed, 5 Feb 2025 18:53:19 -0500 Subject: [PATCH 196/460] Closes #10167 --- core/src/mindustry/game/EventType.java | 2 ++ core/src/mindustry/mod/Mods.java | 2 ++ 2 files changed, 4 insertions(+) diff --git a/core/src/mindustry/game/EventType.java b/core/src/mindustry/game/EventType.java index ec3bac3628..4fdd36885a 100644 --- a/core/src/mindustry/game/EventType.java +++ b/core/src/mindustry/game/EventType.java @@ -82,6 +82,8 @@ public class EventType{ public static class BlockInfoEvent{} /** Called *after* all content has been initialized. */ public static class ContentInitEvent{} + /** Called *after* all mod content has been loaded, but before it has been initialized. */ + public static class ModContentLoadEvent{} /** Called when the client game is first loaded. */ public static class ClientLoadEvent{} /** Called after SoundControl registers its music. */ diff --git a/core/src/mindustry/mod/Mods.java b/core/src/mindustry/mod/Mods.java index ac5682fe8c..70b83ab3c8 100644 --- a/core/src/mindustry/mod/Mods.java +++ b/core/src/mindustry/mod/Mods.java @@ -797,6 +797,8 @@ public class Mods implements Loadable{ //this finishes parsing content fields parser.finishParsing(); + + Events.fire(new ModContentLoadEvent()); } public void handleContentError(Content content, Throwable error){ From 7568e00a05e1c8fc1961cede9f2db8c753b71bbf Mon Sep 17 00:00:00 2001 From: Daniel Lehmann <09818610102020m@gmail.com> Date: Thu, 6 Feb 2025 00:54:27 +0100 Subject: [PATCH 197/460] Update bundle_de.properties (#10119) some translation Co-authored-by: Anuken --- core/assets/bundles/bundle_de.properties | 304 +++++++++++------------ 1 file changed, 151 insertions(+), 153 deletions(-) diff --git a/core/assets/bundles/bundle_de.properties b/core/assets/bundles/bundle_de.properties index 23d26e949e..7699b644d6 100644 --- a/core/assets/bundles/bundle_de.properties +++ b/core/assets/bundles/bundle_de.properties @@ -57,7 +57,7 @@ mods.browser.sortstars = Nach Sternen sortieren schematic = Entwurf schematic.add = Entwurf speichern... schematics = Entwürfe -schematic.search = Search schematics... +schematic.search = Suche nach Entwürfen... schematic.replace = Es gibt bereits einen Entwurf mit diesem Namen. Diesen ersetzen? schematic.exists = Es gibt schon einen Entwurf mit diesem Namen. schematic.import = Entwurf importieren... @@ -70,7 +70,7 @@ schematic.shareworkshop = Im Workshop teilen schematic.flip = [accent][[{0}][]/[accent][[{1}][]: Entwurf umkehren schematic.saved = Entwurf gespeichert. schematic.delete.confirm = Dieser Entwurf wird vollständig vernichtet. -schematic.edit = Edit Schematic +schematic.edit = Entwurf bearbeiten schematic.info = {0}x{1}, {2} Blöcke schematic.disabled = [scarlet]Entwürfe deaktiviert[]\nAuf dieser [accent]Karte[] oder [accent]Server[] dürfen keine Entwürfe verwendet werden. schematic.tags = Tags: @@ -157,8 +157,8 @@ mod.circulardependencies = [red]Wechselseitige Abhängigkeiten mod.incompletedependencies = [red]Fehlende Abhängigkeiten mod.requiresversion.details = Benötigt Spielversion [accent]{0}[]\nDein Spiel ist veraltet. Diese Mod benötigt eine neuere (möglicherweise Alpha- oder Beta-) Spielversion. -mod.outdatedv7.details = Diese Mod ist nicht mit der neuesten Version von Mindustry kompatibel. Der Autor muss diesen aktualisieren und [accent]minGameVersion: 136[] in der [accent]mod.json[]-Datei hinzufügen. -mod.blacklisted.details = Diese Mod würde manuell gesperrt, weil er diese Spielversion zum Abstürzen bringt oder andere Fehler verursacht. Benutze diese Mod nicht. +mod.outdatedv7.details = Diese Mod ist nicht mit der neuesten Version von Mindustry kompatibel. Der Autor muss sie aktualisieren und [accent]minGameVersion: 136[] in der [accent]mod.json[]-Datei hinzufügen. +mod.blacklisted.details = Diese Mod wurde manuell gesperrt, weil sie diese Spielversion zum Abstürzen bringt oder andere Fehler verursacht. Benutze diese Mod nicht. mod.missingdependencies.details = Dieser Mod fehlen folgende Abhängigkeiten: {0} mod.erroredcontent.details = Diese Mod hat beim Laden Fehler verursacht. Bitte den Mod-Autor, diese zu beheben. mod.circulardependencies.details = Diese Mod hat Abhängigkeiten, die von einander abhängen. @@ -181,7 +181,7 @@ mod.author = [lightgray]Autor:[] {0} mod.missing = Dieser Spielstand enthält Mods, welche nicht mehr vorhanden sind oder aktualisiert wurden. Spielstandfehler könnten passieren. Bist du dir sicher, dass du ihn laden möchtest?\n[lightgray]Mods:\n{0} mod.preview.missing = Bevor du diese Mod hochladen kannst, musst du eine Bildvorschau einbinden.\nLade ein Bild namens [accent]preview.png[] in den Modordner und versuche es nochmal. mod.folder.missing = Nur Mods in Ordnerform können in den Workshop hochgeladen werden.\nUm eine Mod in einen Ordner zu konvertieren, extrahiere das Archiv und lösche das alte Archiv danach. Starte dann das Spiel neu oder lade die Mods neu. -mod.scripts.disable = Ihr Gerät unterstützt keine Mods mit Skripten. Du musst diese Mods deaktivieren, um spielen zu können. +mod.scripts.disable = Dein Gerät unterstützt keine Mods mit Skripten. Du musst diese Mods deaktivieren, um spielen zu können. about.button = Info name = Name: @@ -196,8 +196,8 @@ unlock.incampaign = < Für Details in Kampagne freischalten > campaign.select = Startkampagne auswählen campaign.none = [lightgray]Wähle einen Planeten, auf dem du starten möchtest.\nDies kannst du jederzeit ändern. campaign.erekir = Neuerer, besserer Inhalt. Größtenteils linearer Fortschritt.\n\nSchwieriger. Höhere Karten- und Spielqualität. -campaign.serpulo = Ältere Inhalt; das klassische Spiel. Offener, mehr Inhalt. \n\nKarten und Spielmechanismen möglicherweise qualitativ schlechter und ohne Balance. -campaign.difficulty = Difficulty +campaign.serpulo = Älterer Inhalt; das klassische Spiel. Offener, mehr Inhalt. \n\nKarten und Spielmechanismen möglicherweise qualitativ schlechter und ohne Balance. + completed = [accent]Abgeschlossen techtree = Forschung techtree.select = Forschungsauswahl @@ -260,19 +260,19 @@ trace = Spieler verfolgen trace.playername = Spielername: [accent]{0} trace.ip = IP: [accent]{0} trace.id = ID: [accent]{0} -trace.language = Language: [accent]{0} +trace.language = Sprache: [accent]{0} trace.mobile = Mobiler Client: [accent]{0} trace.modclient = Gemoddeter Client: [accent]{0} trace.times.joined = Beigetreten: [accent]{0}[] Mal trace.times.kicked = Rausgeworfen: [accent]{0}[] Mal trace.ips = IPs: -trace.names = Names: +trace.names = Namen: invalidid = Ungültige Client-ID! Berichte den Fehler. -player.ban = Ban -player.kick = Kick -player.trace = Trace -player.admin = Toggle Admin -player.team = Change Team +player.ban = Verbannen +player.kick = Rauswerfen +player.trace = Verfolgen +player.admin = Admin an/aus +player.team = Team wechseln server.bans = Verbannungen server.bans.none = Keine verbannten Spieler gefunden! server.admins = Administratoren @@ -289,8 +289,8 @@ confirmkick = Bist du sicher, dass du diesen Spieler rauswerfen willst? confirmunban = Bist du sicher, dass du die Verbannung des Spielers rückgängig machen willst? confirmadmin = Bist du sicher, dass du diesen Spieler zu einem Administrator machen möchtest? confirmunadmin = Bist du sicher, dass dieser Spieler kein Administrator mehr sein soll? -votekick.reason = Vote-Kick Reason -votekick.reason.message = Are you sure you want to vote-kick "{0}[white]"?\nIf yes, please enter the reason: +votekick.reason = Vote-Kick Grund +votekick.reason.message = Bist du sicher, dass du "{0}[white]" rauswerfen willst?\nWenn ja, gib bitte einen Grund ein: joingame.title = Spiel beitreten joingame.ip = IP: disconnect = Verbindung unterbrochen. @@ -354,17 +354,17 @@ command.rebuild = Wiederaufbauen command.assist = Spieler unterstützen command.move = Bewegen command.boost = Boost -command.enterPayload = Enter Payload Block -command.loadUnits = Load Units -command.loadBlocks = Load Blocks -command.unloadPayload = Unload Payload -command.loopPayload = Loop Unit Transfer -stance.stop = Cancel Orders -stance.shoot = Stance: Shoot -stance.holdfire = Stance: Hold Fire -stance.pursuetarget = Stance: Pursue Target -stance.patrol = Stance: Patrol Path -stance.ram = Stance: Ram\n[lightgray]Straight line movement, no pathfinding +command.enterPayload = Frachtblock betreten +command.loadUnits = Einheiten laden +command.loadBlocks = Blöcke laden +command.unloadPayload = Fracht entladen +stance.stop = Befehle abbrechen +stance.shoot = Stellung: schießen +stance.holdfire = Stellung: nicht schießen +stance.pursuetarget = Stellung: Ziel verfolgen +stance.patrol = Stellung: Pfad patroullieren +stance.ram = Stellung: rammen\[lightgray]in einer geraden Lilie bewegen, gegen Wände laufen + openlink = Link öffnen copylink = Link kopieren back = Zurück @@ -447,7 +447,7 @@ editor.generation = Generator editor.objectives = Ziele editor.locales = Locale Bundles editor.worldprocessors = World Processors -editor.worldprocessors.editname = Edit Name +editor.worldprocessors.editname = Name bearbeiten editor.worldprocessors.none = [lightgray]No world processor blocks found!\nAdd one in the map editor, or use the \ue813 Add button below. editor.worldprocessors.nospace = No free space to place a world processor!\nDid you fill the map with structures? Why would you do this? editor.worldprocessors.delete.confirm = Are you sure you want to delete this world processor?\n\nIf it is surrounded by walls, it will be replaced by an environmental wall. @@ -463,8 +463,8 @@ editor.filters.type = Kartentyp: editor.filters.search = Suchen nach: editor.filters.author = Autor editor.filters.description = Beschreibung -editor.shiftx = Shift X -editor.shifty = Shift Y +editor.shiftx = Verschieben X +editor.shifty = Verschieben Y workshop = Workshop waves.title = Wellen waves.remove = Entfernen @@ -483,7 +483,7 @@ waves.guardian = Boss waves.preview = Vorschau waves.edit = Bearbeiten... waves.random = Zufällig -waves.copy = Aus der Zwischenablage kopieren +waves.copy = In die Zwischenablage kopieren waves.load = Aus der Zwischenablage laden waves.invalid = Ungültige Wellen in der Zwischenablage. waves.copied = Wellen kopiert. @@ -493,8 +493,8 @@ waves.sort.reverse = Reihenfolge umkehren waves.sort.begin = Anfang waves.sort.health = Lebenspunkte waves.sort.type = Sorte -waves.search = Search waves... -waves.filter = Unit Filter +waves.search = Wellen durchsuchen... +waves.filter = Einheiten Filter waves.units.hide = Alle verstecken waves.units.show = Alle anzeigen @@ -508,8 +508,8 @@ editor.default = [lightgray] details = Details edit = Bearbeiten variables = Variablen -logic.clear.confirm = Are you sure you want to clear all code from this processor? -logic.globals = Built-in Variables +logic.clear.confirm = Willst du wirklich den gesamten code aus diesem prozessor löschen? +logic.globals = Eingebaute Variablen editor.name = Name: editor.spawn = Spawnbereich editor.removeunit = Bereich entfernen @@ -533,7 +533,7 @@ editor.sectorgenerate = Sektor generieren editor.resize = Größe\nanpassen editor.loadmap = Karte\nladen editor.savemap = Karte\nspeichern -editor.savechanges = [scarlet]You have unsaved changes!\n\n[]Do you want to save them? +editor.savechanges = [scarlet]Du hast ungespeicherte Änderungen!\n\n[]Möchtest du sie speichern? editor.saved = Gespeichert! editor.save.noname = Deine Karte hat keinen Namen! Setze einen Namen im [accent]Karten-Info[]-Menü. editor.save.overwrite = Deine Karte überschreibt eine Standardkarte! Wähle einen anderen Karten Namen im [accent]Karten-Info[]-Menü. @@ -692,12 +692,12 @@ objective.commandmode.name = Steuerungsmodus objective.flag.name = Flag marker.shapetext.name = Geformter Text -marker.point.name = Point +marker.point.name = Punkt marker.shape.name = Form marker.text.name = Text marker.line.name = Line -marker.quad.name = Quad -marker.texture.name = Texture +marker.quad.name = Quadrat +marker.texture.name = Textur marker.background = Hintergrund marker.outline = Umriss @@ -814,7 +814,7 @@ planet.serpulo.name = Serpulo planet.erekir.name = Erekir planet.sun.name = Sonne -sector.impact0078.name = Impact 0078 +sector.impact0078.name = Einschlag 0078 sector.groundZero.name = Ground Zero sector.craters.name = Die Krater sector.frozenForest.name = Gefrorener Wald @@ -920,7 +920,7 @@ status.electrified.name = Elektrisch status.spore-slowed.name = Sporen-verlangsamt status.tarred.name = Teerend status.overdrive.name = Overdrive -status.overclock.name = Übertaktend +status.overclock.name = Übertaktet status.shocked.name = Schockend status.blasted.name = Sprengend status.unmoving.name = Unbeweglich @@ -1041,47 +1041,47 @@ stat.immunities = Immunitäten stat.healing = Heilung ability.forcefield = Kraftfeld -ability.forcefield.description = Projects a force shield that absorbs bullets +ability.forcefield.description = Projeziert ein Kraftfeld, welches Kugeln aufhält ability.repairfield = Heilungsfeld -ability.repairfield.description = Repairs nearby units +ability.repairfield.description = repariert Einheiten in der Nähe ability.statusfield = Statusfeld -ability.statusfield.description = Applies a status effect to nearby units +ability.statusfield.description = Gibt Einheiten in der Nähe einen Statuseffekt ability.unitspawn = Fabrik -ability.unitspawn.description = Constructs units +ability.unitspawn.description = Baut Einheiten ability.shieldregenfield = Schildregenerationsfeld -ability.shieldregenfield.description = Regenerates shields of nearby units +ability.shieldregenfield.description = Regeneriert Schilder von Einheiten in der Nähe ability.movelightning = Bewegungsblitze -ability.movelightning.description = Releases lightning while moving +ability.movelightning.description = Entfesselt bei Bewegung Blitze ability.armorplate = Armor Plate ability.armorplate.description = Reduces damage taken while shooting ability.shieldarc = Lichtbogenschild -ability.shieldarc.description = Projects a force shield in an arc that absorbs bullets +ability.shieldarc.description = Projeziert ein Kraftfeld in einem Bogen, welches Kugeln aufhält ability.suppressionfield = Heilungsunterdrückungsfeld -ability.suppressionfield.description = Stops nearby repair buildings +ability.suppressionfield.description = Unterdrückt Heilungsblöcke in der Nähe ability.energyfield = Energiefeld -ability.energyfield.description = Zaps nearby enemies -ability.energyfield.healdescription = Zaps nearby enemies and heals allies +ability.energyfield.description = Schockt Feinde in der Nähe +ability.energyfield.healdescription = Schockt Feinde und heilt alliierte in der Nähe ability.regen = Regeneration -ability.regen.description = Regenerates own health over time -ability.liquidregen = Liquid Absorption -ability.liquidregen.description = Absorbs liquid to heal itself -ability.spawndeath = Death Spawns -ability.spawndeath.description = Releases units on death -ability.liquidexplode = Death Spillage -ability.liquidexplode.description = Spills liquid on death -ability.stat.firingrate = [stat]{0}/sec[lightgray] firing rate -ability.stat.regen = [stat]{0}[lightgray] health/sec -ability.stat.pulseregen = [stat]{0}[lightgray] health/pulse -ability.stat.shield = [stat]{0}[lightgray] shield -ability.stat.repairspeed = [stat]{0}/sec[lightgray] repair speed -ability.stat.slurpheal = [stat]{0}[lightgray] health/liquid unit -ability.stat.cooldown = [stat]{0} sec[lightgray] cooldown -ability.stat.maxtargets = [stat]{0}[lightgray] max targets +ability.regen.description = Regeneriert eigene Lebenspunkte mit der Zeit +ability.liquidregen = Flüssigkeitsabsorbtion +ability.liquidregen.description = Nimmt Flüssigkeit auf, um sich selbst zu heilen +ability.spawndeath = Fragmentierung +ability.spawndeath.description = Entlässt beim Tod neue Einheiten +ability.liquidexplode = Auslaufen +ability.liquidexplode.description = Verschüttet Flüssigkeit beim Tod +ability.stat.firingrate = [stat]{0}/sek[lightgray] Feuerrate +ability.stat.regen = [stat]{0}[lightgray] Lebenspunkte/sek +ability.stat.shield = [stat]{0}[lightgray] Schild +ability.stat.repairspeed = [stat]{0}/sek[lightgray] Repariergeschwindigkeit +ability.stat.slurpheal = [stat]{0}[lightgray] Lebenspunkte/Flüssigkeitseinheit +ability.stat.cooldown = [stat]{0} sek[lightgray] cooldown +ability.stat.maxtargets = [stat]{0}[lightgray] max Ziele + ability.stat.sametypehealmultiplier = [stat]{0}%[lightgray] same type repair amount -ability.stat.damagereduction = [stat]{0}%[lightgray] damage reduction -ability.stat.minspeed = [stat]{0} tiles/sec[lightgray] min speed -ability.stat.duration = [stat]{0} sec[lightgray] duration -ability.stat.buildtime = [stat]{0} sec[lightgray] build time +ability.stat.damagereduction = [stat]{0}%[lightgray] Schadensreduktion +ability.stat.minspeed = [stat]{0} tiles/sec[lightgray] min Geschwindigkeit +ability.stat.duration = [stat]{0} sek[lightgray] Dauer +ability.stat.buildtime = [stat]{0} sek[lightgray] Baudauer bar.onlycoredeposit = Nur Kernablage möglich @@ -1153,7 +1153,7 @@ unit.powerunits = Stromeinheiten unit.heatunits = Hitzeeinheiten unit.degrees = Grad unit.seconds = Sekunden -unit.minutes = mins +unit.minutes = Minuten unit.persecond = /sek unit.perminute = /min unit.timesspeed = x Geschwindigkeit @@ -1164,7 +1164,7 @@ unit.items = Materialeinheiten unit.thousands = k unit.millions = Mio unit.billions = Mrd -unit.shots = shots +unit.shots = Schuss unit.pershot = /Schuss category.purpose = Beschreibung category.general = Allgemeines @@ -1174,8 +1174,8 @@ category.items = Materialien category.crafting = Erzeugung category.function = Funktion category.optional = Optionale Zusätze -setting.alwaysmusic.name = Always Play Music -setting.alwaysmusic.description = When enabled, music will always play on loop in-game.\nWhen disabled, it only plays at random intervals. +setting.alwaysmusic.name = Immer Musik spielen +setting.alwaysmusic.description = An: Musik spielt ständig im Spiel\n Aus: Musik spielt hin und wieder in zufälligen Abständen setting.skipcoreanimation.name = Kern Start- und Lande-Animation überspringen setting.landscape.name = Querformat sperren setting.shadows.name = Schatten @@ -1245,10 +1245,10 @@ setting.bridgeopacity.name = Brücken-Deckkraft setting.playerchat.name = Chat im Spiel anzeigen setting.showweather.name = Wetter anzeigen setting.hidedisplays.name = Logik-Bildschirme verdecken -setting.macnotch.name = Passen Sie die Schnittstelle an die Anzeigekerbe an +setting.macnotch.name = Passe die Schnittstelle an die Anzeigekerbe an setting.macnotch.description = Neustart erforderlich steam.friendsonly = Nur Freunde -steam.friendsonly.tooltip = Ob nur Steam-Freunde dein Spiel beitreten können.\nDiese Einstellung zu deaktivieren macht dein Spiel öffentlich - jeder kann beitreten. +steam.friendsonly.tooltip = Ob nur Steam-Freunde deinem Spiel beitreten können.\nDiese Einstellung zu deaktivieren macht dein Spiel öffentlich - jeder kann beitreten. public.beta = Bemerke: Beta-Versionen des Spiels können keine öffentlichen Spiele machen. uiscale.reset = UI-Skalierung wurde geändert.\nDrücke "OK", um diese Skalierung zu bestätigen.\n[scarlet]Zurückkehren und Beenden in[accent] {0}[] Einstellungen... uiscale.cancel = Abbrechen & Beenden @@ -1257,7 +1257,7 @@ keybind.title = Tasten zuweisen keybinds.mobile = [scarlet]Die meisten Tastenzuweisungen hier funktionieren auf mobilen Geräten nicht. Nur grundlegende Bewegung wird unterstützt. category.general.name = Allgemein category.view.name = Ansicht -category.command.name = Unit Command +category.command.name = Einheitenbefehle category.multiplayer.name = Mehrspieler category.blocks.name = Blockauswahl placement.blockselectkeys = \n[lightgray]Taste: [{0}, @@ -1275,23 +1275,23 @@ keybind.mouse_move.name = Der Maus folgen keybind.pan.name = Kamera alleine bewegen keybind.boost.name = Boost keybind.command_mode.name = Steuerungsmodus -keybind.command_queue.name = Unit Command Queue +keybind.command_queue.name = Befehl-Warteschlange keybind.create_control_group.name = Create Control Group -keybind.cancel_orders.name = Cancel Orders -keybind.unit_stance_shoot.name = Unit Stance: Shoot -keybind.unit_stance_hold_fire.name = Unit Stance: Hold Fire -keybind.unit_stance_pursue_target.name = Unit Stance: Pursue Target -keybind.unit_stance_patrol.name = Unit Stance: Patrol -keybind.unit_stance_ram.name = Unit Stance: Ram -keybind.unit_command_move.name = Unit Command: Move -keybind.unit_command_repair.name = Unit Command: Repair -keybind.unit_command_rebuild.name = Unit Command: Rebuild -keybind.unit_command_assist.name = Unit Command: Assist -keybind.unit_command_mine.name = Unit Command: Mine -keybind.unit_command_boost.name = Unit Command: Boost -keybind.unit_command_load_units.name = Unit Command: Load Units -keybind.unit_command_load_blocks.name = Unit Command: Load Blocks -keybind.unit_command_unload_payload.name = Unit Command: Unload Payload +keybind.cancel_orders.name = Befehle abbrechen +keybind.unit_stance_shoot.name = Stellung: schießen +keybind.unit_stance_hold_fire.name = Stellung: nicht schießen +keybind.unit_stance_pursue_target.name = Stellung: Ziel verfolgen +keybind.unit_stance_patrol.name = Stellung: patroullieren +keybind.unit_stance_ram.name = Stellung: rammen +keybind.unit_command_move.name = Befehl: bewegen +keybind.unit_command_repair.name = Befehl: reparieren +keybind.unit_command_rebuild.name = Befehl: wiederaufbauen +keybind.unit_command_assist.name = Befehl: Spieler helfen +keybind.unit_command_mine.name = Befehl: Ressourcen abbauen +keybind.unit_command_boost.name = Befehl: Boost +keybind.unit_command_load_units.name = Befehl: Einheiten aufnehmen +keybind.unit_command_load_blocks.name = Befehl: Blöcke aufnehmen +keybind.unit_command_unload_payload.name = Befehl: Last abladen keybind.unit_command_enter_payload.name = Unit Command: Enter Payload keybind.unit_command_loop_payload.name = Unit Command: Loop Unit Transfer keybind.rebuild_select.name = Region wiederaufbauen @@ -1357,7 +1357,7 @@ mode.pvp.description = Kämpfe lokal gegen andere Spieler.\n[gray]Benötigt mind mode.attack.name = Angriff mode.attack.description = Keine Wellen, das Ziel ist es, die gegnerische Basis zu zerstören.\n[gray]Benötigt einen roten Kern auf der Karte. mode.custom = Angepasste Regeln -rules.invaliddata = Invalid clipboard data. +rules.invaliddata = Ungültige Daten in der Zwischenablage rules.hidebannedblocks = Gesperrte Blöcke verstecken rules.infiniteresources = Unbegrenzte Ressourcen @@ -1369,21 +1369,19 @@ rules.disableworldprocessors = Deaktiviere Weltprozessoren rules.schematic = Entwürfe erlaubt rules.wavetimer = Wellen-Timer rules.wavesending = Manuelle Wellen möglich -rules.allowedit = Allow Editing Rules -rules.allowedit.info = When enabled, the player can edit rules in-game via the button in the bottom left corner of the Pause menu. -rules.alloweditworldprocessors = Allow Editing World Processors -rules.alloweditworldprocessors.info = When enabled, world logic blocks can be placed and edited even outside the editor. +rules.allowedit = Regeln bearbeiten erlauben +rules.allowedit.info = Erlaubt dem Spieler, diese Regeln im Spiel über den Button unten links im Pause-Menü zu bearbeiten. rules.waves = Wellen -rules.airUseSpawns = Air units use spawn points +rules.airUseSpawns = Lufteinheiten spawnen am Spawnpunkt rules.attack = Angriff-Modus -rules.buildai = Base Builder AI -rules.buildaitier = Builder AI Tier +rules.buildai = Bau-KI +rules.buildaitier = Bau-KI-Tier rules.rtsai = RTS KI [red](unfertig) rules.rtsai.campaign = RTS Attack AI rules.rtsai.campaign.info = In attack maps, makes units group up and attack player bases in a more intelligent manner. rules.rtsminsquadsize = Min. Squadgröße rules.rtsmaxsquadsize = Max. Squadgröße -rules.rtsminattackweight = Min. Attackiergewicht +rules.rtsminattackweight = Min. Angriffsgröße rules.cleanupdeadteams = Blöcke von erorberten Teams zerstören (PvP) rules.corecapture = Kern nach Zerstörung einnehmen rules.polygoncoreprotection = Polygonaler Kernschutz @@ -1409,7 +1407,7 @@ rules.buildcostmultiplier = Bau-Kosten Multiplikator rules.buildspeedmultiplier = Bau-Schnelligkeit Multiplikator rules.deconstructrefundmultiplier = Abbau Ressourcen-Rückerstattung rules.waitForWaveToEnd = Warten bis Welle endet -rules.wavelimit = Map Ends After Wave +rules.wavelimit = Letzte Welle rules.dropzoneradius = Drop-Zonen-Radius:[lightgray] (Kacheln) rules.unitammo = Einheiten benötigen Munition [red](wird vielleicht entfernt) rules.enemyteam = Gegnerteam @@ -1438,9 +1436,9 @@ rules.weather = Wetter rules.weather.frequency = Häufigkeit: rules.weather.always = Immer rules.weather.duration = Dauer: -rules.randomwaveai.info = Makes units spawned in waves target random structures instead of directly attacking the core or power generators. -rules.placerangecheck.info = Prevents players from placing anything near enemy buildings. When trying to place a turret, the range is increased, so the turret will not be able to reach the enemy. -rules.onlydepositcore.info = Prevents units from depositing items into any buildings except cores. +rules.placerangecheck.info = Hindert den Spieler daran, in der Nähe von feindlichen Blöcken zu bauen. Geschütze können nur platziert werden, wenn keine Feindlichen Blöcke in ihrer Reichweite sind. +rules.onlydepositcore.info = Lässt Einheiten Materialen nur in den Kern ablegen. Nicht in andere Blöcke. + content.item.name = Materialien content.liquid.name = Flüssigkeiten @@ -1555,7 +1553,7 @@ block.sand-boulder.name = Sandbrocken block.basalt-boulder.name = Basaltbrocken block.grass.name = Gras block.molten-slag.name = Schlacke -block.pooled-cryofluid.name = Cryoflüssigkeit +block.pooled-cryofluid.name = Kryoflüssigkeit block.space.name = Weltall block.salt.name = Salz block.salt-wall.name = Salzwand @@ -2443,48 +2441,48 @@ lst.cutscene = Verschiebe die Spielerkamera. lst.setflag = Setze eine Flag, die von allen Prozessoren gelesen werden kann. lst.getflag = Überprüfe, ob eine Flag gesetzt ist. lst.setprop = Setzt eine Eigenschaft einer Einheit oder eines Blockes. -lst.effect = Create a particle effect. -lst.sync = Sync a variable across the network.\nOnly invoked 10 times a second at most. -lst.playsound = Plays a sound.\nVolume and pan can be a global value, or calculated based on position. -lst.makemarker = Create a new logic marker in the world.\nAn ID to identify this marker must be provided.\nMarkers currently limited to 20,000 per world. -lst.setmarker = Set a property for a marker.\nThe ID used must be the same as in the Make Marker instruction. +lst.effect = Erstelle einen Partikeleffekt +lst.sync = Synchronisiert eine Variable im Netzwerk.\nWird maximal 10 Mal pro Sekunde ausgefürht. +lst.playsound = Spielt einen Ton.\nDie Lautstärke kann ein fester Wert sein, oder anhand der Position berechnet werden. (weiter weg: leiser) +lst.makemarker = Erstelle einen neuen Logikmarker in der Welt.\nEine ID zur Identifizierung muss angegeben werden.\nDerzeit können nur maximal 20.000 Marker pro Welt platziert werden. +lst.setmarker = Lege eine Eigenschaft für einen Marker fest.\nDie ID muss die selbe wie bei der Erstellung des Markers sein. lst.localeprint = Add map locale property value to the text buffer.\nTo set map locale bundles in map editor, check [accent]Map Info > Locale Bundles[].\nIf client is a mobile device, tries to print a property ending in ".mobile" first. lglobal.false = 0 lglobal.true = 1 lglobal.null = null -lglobal.@pi = The mathematical constant pi (3.141...) -lglobal.@e = The mathematical constant e (2.718...) -lglobal.@degToRad = Multiply by this number to convert degrees to radians -lglobal.@radToDeg = Multiply by this number to convert radians to degrees -lglobal.@time = Playtime of current save, in milliseconds -lglobal.@tick = Playtime of current save, in ticks (1 second = 60 ticks) -lglobal.@second = Playtime of current save, in seconds -lglobal.@minute = Playtime of current save, in minutes -lglobal.@waveNumber = Current wave number, if waves are enabled -lglobal.@waveTime = Countdown timer for waves, in seconds -lglobal.@mapw = Map width in tiles -lglobal.@maph = Map height in tiles -lglobal.sectionMap = Map +lglobal.@pi = Die mathematische Konstante pi (3.141...) +lglobal.@e = Die mathematische Konstante e (2.718...) +lglobal.@degToRad = Multipliziere mit dieser Zahl um Grad in Radianten umzuwandeln +lglobal.@radToDeg = Multipliziere mit dieser Zahl um Radianten in Grad umzuwandeln +lglobal.@time = Spielzeit des aktuellen Speicherstandes in Millisekunden +lglobal.@tick = Spielzeit des aktuellen Speicherstandes in Ticks (1 Sekunde = 60 Ticks) +lglobal.@second = Spielzeit des aktuellen Speicherstandes in Sekunden +lglobal.@minute = Spielzeit des aktuellen Speicherstandes in Minuten +lglobal.@waveNumber = Nummer der aktuellen Welle, wenn Wellen aktiviert sind +lglobal.@waveTime = Countdown zur nächsten Welle in Sekunden +lglobal.@mapw = Breite der Karte in Kacheln +lglobal.@maph = Höhe der Karte in Kacheln +lglobal.sectionMap = Karte lglobal.sectionGeneral = General lglobal.sectionNetwork = Network/Clientside [World Processor Only] lglobal.sectionProcessor = Processor lglobal.sectionLookup = Lookup -lglobal.@this = The logic block executing the code -lglobal.@thisx = X coordinate of block executing the code -lglobal.@thisy = Y coordinate of block executing the code -lglobal.@links = Total number of blocks linked to this processors -lglobal.@ipt = Execution speed of the processor in instructions per tick (60 ticks = 1 second) -lglobal.@unitCount = Total number of types of unit content in the game; used with the lookup instruction -lglobal.@blockCount = Total number of types of block content in the game; used with the lookup instruction -lglobal.@itemCount = Total number of types of item content in the game; used with the lookup instruction -lglobal.@liquidCount = Total number of types of liquid content in the game; used with the lookup instruction -lglobal.@server = True if the code is running on a server or in singleplayer, false otherwise -lglobal.@client = True if the code is running on a client connected to a server -lglobal.@clientLocale = Locale of the client running the code. For example: en_US -lglobal.@clientUnit = Unit of client running the code -lglobal.@clientName = Player name of client running the code -lglobal.@clientTeam = Team ID of client running the code -lglobal.@clientMobile = True is the client running the code is on mobile, false otherwise +lglobal.@this = Der Logikblock, der den Code ausführt +lglobal.@thisx = X-Koordinate des Blocks, der den Code ausführt +lglobal.@thisy = Y-Koordinate des Blocks, der den Code ausführt +lglobal.@links = Gesamtzahl der Blöcke, die mit diesem Prozessor verbunden sind +lglobal.@ipt = Ausführungsgeschwindigkeit in Anweisungen pro Tick (1 Sekunde = 60 Ticks) +lglobal.@unitCount = Gesamtzahl der verschiedenen Einheiten im Spiel; mit dem Lookup-Befehl benutzt +lglobal.@blockCount = Gesamtzahl der verschiedenen Blöcke im Spiel; mit dem Lookup-Befehl benutzt +lglobal.@itemCount = Gesamtzahl der verschiedenen Materialien im Spiel; mit dem Lookup-Befehl benutzt +lglobal.@liquidCount = Gesamtzahl der verschiedenen Flüssigkeiten im Spiel; mit dem Lookup-Befehl benutzt +lglobal.@server = true, wenn der Code auf einem Server oder im Einzelspielermodus ausgeführt wird, sonst false +lglobal.@client = true, wenn der Code auf einem Client läuft, der mit einem Server verbunden ist +lglobal.@clientLocale = Gebiet des Clients, der den Code ausführt. Zum Beispiel: en_US +lglobal.@clientUnit = Einheit des Clients, der den Code ausführt +lglobal.@clientName = Spielername des Clients, der diesen Code ausführt +lglobal.@clientTeam = Team ID des Clients, der diesen Code ausführt +lglobal.@clientMobile = true, wenn der Client ein Mobilgerät ist, sonst false logic.nounitbuild = [red]Logik, die Blöcke baut, ist hier nicht erlaubt. @@ -2493,7 +2491,7 @@ lenum.shoot = Schießt auf eine Position. lenum.shootp = Schießt auf eine Einheit / einen Block und sagt deren Position voraus. lenum.config = Blockkonfiguration, z.B. das ausgewählte Item in einem Sortierer. lenum.enabled = Ob der Block an oder aus ist. -laccess.currentammotype = Current ammo item/liquid of a turret. +laccess.currentammotype = Aktuelle Munitionsart eines Geschützes laccess.color = Illuminiererfarbe. laccess.controller = Einheitensteurer. Gibt "processor" zurück, wenn die Einheit prozessorgesteuert ist,.\nGibt den Steuerer zurück, wenn die Einheit Teil einer Formation ist.\nSonst wird einfach die Einheit zurückgegeben. @@ -2501,7 +2499,7 @@ laccess.dead = Ob ein Block / eine Einheit tot oder nicht mehr gültig ist. laccess.controlled = Gibt zurück:\n[accent]@ctrlProcessor[] wenn die Einheit prozessorgesteuert ist\n[accent]@ctrlPlayer[] wenn die Einheit / der Block von einem Spieler gesteuert wird\n[accent]@ctrlFormation[] wenn die Einheit Teil einer Formation ist\nSonst 0. laccess.progress = Fortschritt, von 0 bis 1.\nGibt Produktion, Nachladestatus or Baufortschritt zurück. laccess.speed = Höchstgeschwindigkeit einer Einheit, gemessen in Blöcke/Sekunde. -laccess.id = ID of a unit/block/item/liquid.\nThis is the inverse of the lookup operation. +laccess.id = ID einer Einheit/eines Blocks/eines Materials/einer Flüssigkeit\nThis is the inverse of the lookup operation. lcategory.unknown = Unbekannt lcategory.unknown.description = Unbekannte Anweisungen @@ -2529,7 +2527,7 @@ graphicstype.poly = Füllt ein gleichmäßiges Polygon. graphicstype.linepoly = Zeichnet den Umriss eines gleichmäßigen Polygons. graphicstype.triangle = Zeichnet ein Dreieck. graphicstype.image = Zeichnet ein Bild von einem englischen Namen.\nz.B. [accent]@router[] oder [accent]@dagger[]. -graphicstype.print = Draws text from the print buffer.\nClears the print buffer. +graphicstype.print = Zeichnet Text aus dem Textspeicher und leert diesen. lenum.always = Immer. lenum.idiv = Division mit ganzen Zahlen. @@ -2549,7 +2547,7 @@ lenum.xor = Bitweises XOR. lenum.min = Die Größte von zwei Zahlen. lenum.max = Die Kleinste von zwei Zahlen. lenum.angle = Vektorwinkel in Grad. -lenum.anglediff = Absolute distance between two angles in degrees. +lenum.anglediff = Absolute Entfernung zwischen zwei Winkeln in Grad. lenum.len = Vektorlänge. lenum.sin = Sinus in Grad. @@ -2617,7 +2615,7 @@ unitlocate.building = Variable für das Ergebnis. unitlocate.outx = Variable für die X-Koordinate. unitlocate.outy = Variable für die Y-Koordinate. unitlocate.group = Gesuchter Blocktyp. -playsound.limit = If true, prevents this sound from playing\nif it has already been played in the same frame. +playsound.limit = Wenn true: verhindert, dass dieser Ton abgespielt wird,\nwenn er im gleichen Frame schon einmal gespielt wurde. lenum.idle = Bewegt sich nicht, baut aber weiter ab.\nDer normale Zustand. lenum.stop = Bewegung / Abbau / Bau abbrechen. @@ -2625,7 +2623,7 @@ lenum.unbind = Logiksteuerung deaktivieren.\nNormale KI übernimmt. lenum.move = Geht zu diese Position. lenum.approach = Geht auf einen Punkt mit einem bestimmten Radius zu. lenum.pathfind = Geht zum gegnerischen Spawnpunkt. -lenum.autopathfind = Automatically pathfinds to the nearest enemy core or drop point.\nThis is the same as standard wave enemy pathfinding. +lenum.autopathfind = Läuft zum nächsten feindlichen Kern oder Spawnbereich. lenum.target = Schießt auf eine Position. lenum.targetp = Schießt auf eine Einheit und sagt deren Position voraus. lenum.itemdrop = Materialien abwerfen. @@ -2636,13 +2634,13 @@ lenum.payenter = Betritt den Fracht-Block, auf dem sich die Einheit befindet. lenum.flag = Zahl, mit der eine Einheit identifiziert werden kann. lenum.mine = Erz von einer Position abbauen. lenum.build = Einen Block bauen. -lenum.getblock = Fetch building, floor and block type at coordinates.\nUnit must be in range of the position, otherwise null is returned. +lenum.getblock = Gibt den Gebäude-, Boden- und Blocktyp and den gegebenen Koordinaten zurück.\nDie Position muss in Reichweite der Einheit sein, sonst wird null zurückgegeben. lenum.within = Prüft, ob eine Einheit in einem Radius um einen Punkt ist. lenum.boost = Aktiviert / deaktiviert den Boost. -lenum.flushtext = Flush print buffer's content to marker, if applicable.\nIf fetch is set to true, tries to fetch properties from map locale bundle or game's bundle. -lenum.texture = Texture name straight from game's texture atlas (using kebab-case naming style).\nIf printFlush is set to true, consumes text buffer content as text argument. -lenum.texturesize = Size of texture in tiles. Zero value scales marker width to original texture's size. -lenum.autoscale = Whether to scale marker corresponding to player's zoom level. +lenum.flushtext = Verschiebt den Inhalt des Print Buffers wenn möglich zu einem Marker.\nWenn fetch true ist, wird versucht, Eigenschaften vom Locale Bundle der Karte oder des Spiels zu lesen. +lenum.texture = Name einer Textur direkt aus dem Texturatlas des Spiels (bennant mit kebab-case naming style).\nWenn printFlush true ist, wird der Inhalt des Textspeichers als Argument genommen und gelöscht. +lenum.texturesize = Größe einer Textur in Kacheln. Zero value scales marker width to original texture's size. +lenum.autoscale = Ob der Marker entsprechend des Zoom-Levels des Spielers skaliert werden soll. lenum.posi = Indexed position, used for line and quad markers with index zero being the first position. -lenum.uvi = Texture's position ranging from zero to one, used for quad markers. +lenum.uvi = Positionen auf der Textur von 0 bis 1, für quad marker benutzt. lenum.colori = Indexed position, used for line and quad markers with index zero being the first color. From 48bf8aa078420620bf3d2f63a0675d26955ee364 Mon Sep 17 00:00:00 2001 From: Github Actions Date: Wed, 5 Feb 2025 23:55:20 +0000 Subject: [PATCH 198/460] Automatic bundle update --- core/assets/bundles/bundle_de.properties | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/core/assets/bundles/bundle_de.properties b/core/assets/bundles/bundle_de.properties index 7699b644d6..cb4a3af865 100644 --- a/core/assets/bundles/bundle_de.properties +++ b/core/assets/bundles/bundle_de.properties @@ -197,6 +197,7 @@ campaign.select = Startkampagne auswählen campaign.none = [lightgray]Wähle einen Planeten, auf dem du starten möchtest.\nDies kannst du jederzeit ändern. campaign.erekir = Neuerer, besserer Inhalt. Größtenteils linearer Fortschritt.\n\nSchwieriger. Höhere Karten- und Spielqualität. campaign.serpulo = Älterer Inhalt; das klassische Spiel. Offener, mehr Inhalt. \n\nKarten und Spielmechanismen möglicherweise qualitativ schlechter und ohne Balance. +campaign.difficulty = Difficulty completed = [accent]Abgeschlossen techtree = Forschung @@ -358,12 +359,13 @@ command.enterPayload = Frachtblock betreten command.loadUnits = Einheiten laden command.loadBlocks = Blöcke laden command.unloadPayload = Fracht entladen +command.loopPayload = Loop Unit Transfer stance.stop = Befehle abbrechen stance.shoot = Stellung: schießen stance.holdfire = Stellung: nicht schießen stance.pursuetarget = Stellung: Ziel verfolgen stance.patrol = Stellung: Pfad patroullieren -stance.ram = Stellung: rammen\[lightgray]in einer geraden Lilie bewegen, gegen Wände laufen +stance.ram = Stellung: rammen[lightgray]in einer geraden Lilie bewegen, gegen Wände laufen openlink = Link öffnen copylink = Link kopieren @@ -1071,6 +1073,7 @@ ability.liquidexplode = Auslaufen ability.liquidexplode.description = Verschüttet Flüssigkeit beim Tod ability.stat.firingrate = [stat]{0}/sek[lightgray] Feuerrate ability.stat.regen = [stat]{0}[lightgray] Lebenspunkte/sek +ability.stat.pulseregen = [stat]{0}[lightgray] health/pulse ability.stat.shield = [stat]{0}[lightgray] Schild ability.stat.repairspeed = [stat]{0}/sek[lightgray] Repariergeschwindigkeit ability.stat.slurpheal = [stat]{0}[lightgray] Lebenspunkte/Flüssigkeitseinheit @@ -1371,6 +1374,8 @@ rules.wavetimer = Wellen-Timer rules.wavesending = Manuelle Wellen möglich rules.allowedit = Regeln bearbeiten erlauben rules.allowedit.info = Erlaubt dem Spieler, diese Regeln im Spiel über den Button unten links im Pause-Menü zu bearbeiten. +rules.alloweditworldprocessors = Allow Editing World Processors +rules.alloweditworldprocessors.info = When enabled, world logic blocks can be placed and edited even outside the editor. rules.waves = Wellen rules.airUseSpawns = Lufteinheiten spawnen am Spawnpunkt rules.attack = Angriff-Modus @@ -1436,6 +1441,7 @@ rules.weather = Wetter rules.weather.frequency = Häufigkeit: rules.weather.always = Immer rules.weather.duration = Dauer: +rules.randomwaveai.info = Makes units spawned in waves target random structures instead of directly attacking the core or power generators. rules.placerangecheck.info = Hindert den Spieler daran, in der Nähe von feindlichen Blöcken zu bauen. Geschütze können nur platziert werden, wenn keine Feindlichen Blöcke in ihrer Reichweite sind. rules.onlydepositcore.info = Lässt Einheiten Materialen nur in den Kern ablegen. Nicht in andere Blöcke. From f825e17be00a2f362bd6fb89bcb9146dfacf407b Mon Sep 17 00:00:00 2001 From: Wiktor Perskawiec Date: Thu, 6 Feb 2025 00:56:40 +0100 Subject: [PATCH 199/460] Update pl translation (#9831) --- core/assets/bundles/bundle_pl.properties | 42 ++++++++++++------------ 1 file changed, 21 insertions(+), 21 deletions(-) diff --git a/core/assets/bundles/bundle_pl.properties b/core/assets/bundles/bundle_pl.properties index 8b34224701..6699b0c0d3 100644 --- a/core/assets/bundles/bundle_pl.properties +++ b/core/assets/bundles/bundle_pl.properties @@ -593,7 +593,7 @@ filter.clear = Oczyść filter.option.ignore = Ignoruj filter.scatter = Rozprosz filter.terrain = Teren -filter.logic = Logic +filter.logic = Logika filter.option.scale = Skala filter.option.chance = Szansa filter.option.mag = Wielkość @@ -616,25 +616,25 @@ filter.option.floor2 = Druga Podłoga filter.option.threshold2 = Drugi Próg filter.option.radius = Zasięg filter.option.percentile = Procent -filter.option.code = Code -filter.option.loop = Loop +filter.option.code = Kod +filter.option.loop = Pętla locales.info = Here, you can add locale bundles for specific languages to your map. In locale bundles, each property has a name and a value. These properties can be used by world processors and objectives using their names. They support text formatting (replacing placeholders with actual values).\n\n[cyan]Example property:\n[]name: [accent]timer[]\nvalue: [accent]Example timer, time left: {0}[]\n\n[cyan]Usage:\n[]Set it as objective's text: [accent]@timer\n\n[]Print it in a world processor:\n[accent]localeprint "timer"\nformat time\n[gray](where time is a separately calculated variable) -locales.deletelocale = Are you sure you want to delete this locale bundle? -locales.applytoall = Apply Changes To All Locales -locales.addtoother = Add To Other Locales -locales.rollback = Rollback to last applied -locales.filter = Property filter -locales.searchname = Search name... -locales.searchvalue = Search value... -locales.searchlocale = Search locale... -locales.byname = By name -locales.byvalue = By value -locales.showcorrect = Show properties that are present in all locales and have unique values everywhere -locales.showmissing = Show properties that are missing in some locales -locales.showsame = Show properties that have same values in different locales -locales.viewproperty = View in all locales -locales.viewing = Viewing property "{0}" -locales.addicon = Add Icon +locales.deletelocale = Czy na pewno chcesz usunąć ten pakiet lokalizacji? +locales.applytoall = Zastosuj Do Wszystkich Lokalizacji +locales.addtoother = Dodaj Do Innych Lokalizacji +locales.rollback = Cofnij do ostatnio zastosowanego +locales.filter = Filtr właściwości +locales.searchname = Szukaj nazwy... +locales.searchvalue = Szukaj wartości... +locales.searchlocale = Szukaj lokalizacji... +locales.byname = Po nazwie +locales.byvalue = Po wartośći +locales.showcorrect = Pokaż właściwości, które są obecne we wszystkich lokalizacjach i wszędzie mają unikalne wartości +locales.showmissing = Pokaż właściwości, których brakuje w niektórych lokalizacjach +locales.showsame = Pokaż właściwości, które mają te same wartości w różnych lokalizacjach +locales.viewproperty = Wyświetlanie we wszystkich lokalizacjach +locales.viewing = Wyświetlanie właściwości "{0}" +locales.addicon = Dodaj Ikonę width = Szerokość: height = Wysokość: @@ -1017,7 +1017,7 @@ stat.abilities = Umiejętności stat.canboost = Może przyspieszyć stat.flying = Może latać stat.ammouse = Zużycie Amunicji -stat.ammocapacity = Ammo Capacity +stat.ammocapacity = Pojemność Amunicji stat.damagemultiplier = Mnożnik Obrażeń stat.healthmultiplier = Mnożnik Zdrowia stat.speedmultiplier = Mnożnik Prędkości @@ -1151,7 +1151,7 @@ unit.items = przedmioty unit.thousands = tys. unit.millions = mln. unit.billions = mld. -unit.shots = shots +unit.shots = strzały unit.pershot = /strzał category.purpose = Opis category.general = Główne From 38cba7a223f377d15ccf9e777d938dcbcf478cbc Mon Sep 17 00:00:00 2001 From: Feather83 <144360504+Feather83@users.noreply.github.com> Date: Thu, 6 Feb 2025 02:00:47 +0200 Subject: [PATCH 200/460] Update bundle_bg.properties (#9045) Reviewing the older text and translating anything new or left-out. Co-authored-by: Anuken --- core/assets/bundles/bundle_bg.properties | 349 +++++++++++------------ 1 file changed, 162 insertions(+), 187 deletions(-) diff --git a/core/assets/bundles/bundle_bg.properties b/core/assets/bundles/bundle_bg.properties index 7b03332eb6..2d60d043b4 100644 --- a/core/assets/bundles/bundle_bg.properties +++ b/core/assets/bundles/bundle_bg.properties @@ -12,9 +12,9 @@ link.itch.io.description = itch.io страница. Можете да свал link.google-play.description = Свалете за Android от Google Play link.f-droid.description = Свалете за Android от F-Droid link.wiki.description = Официално Mindustry ръководство -link.suggestions.description = Предложете вашата идея +link.suggestions.description = Предложете Вашата идея link.bug.description = Намерихте грешка? Съобщете тук -linkopen = This server has sent you a link. Are you sure you want to open it?\n\n[sky]{0} +linkopen = Този сървър Ви изпрати линк. Сигурни ли сте, че искате да го отворите?\n\n[sky]{0} linkfail = Неуспех при отваряне на връзка!\nURL адресът е копиран в клипборда ви. screenshot = Записана екранна снимка в {0} screenshot.invalid = Картата е твърде голяма, възможно е да не достига памет за екранната снимка. @@ -31,11 +31,11 @@ load.map = Карти load.image = Графики load.content = Съдържание load.system = Система -load.mod = Модифицакии +load.mod = Модификации load.scripts = Скриптове be.update = Налична е актуализация: -be.update.confirm = Изтегли я и рестартирай играта? +be.update.confirm = Изтегляне и рестарт на играта? be.updating = Актуализиране... be.ignore = Игнорирай be.noupdates = Няма намерени актуализации. @@ -45,19 +45,19 @@ mods.browser = Списък с модове mods.browser.selected = Избран мод mods.browser.add = Инсталирай mods.browser.reinstall = Преинсталирай -mods.browser.view-releases = View Releases -mods.browser.noreleases = [scarlet]No Releases Found\n[accent]Couldn't find any releases for this mod. Check if the mod's repository has any releases published. +mods.browser.view-releases = Вижте издания +mods.browser.noreleases = [scarlet]Не са открити издания\n[accent]Не бяха открити издания за тази модификация. Проверете дали хранилището на модификацията има публикувани издания. mods.browser.latest = -mods.browser.releases = Releases +mods.browser.releases = Издания mods.github.open = Сайт -mods.github.open-release = Release Page +mods.github.open-release = Страница на изданията mods.browser.sortdate = Сортирай по дата mods.browser.sortstars = Сортирай по рейтинг schematic = Схема schematic.add = Запази Схема... schematics = Схеми -schematic.search = Search schematics... +schematic.search = Търсене из схемите... schematic.replace = Вече съществува схема с това име. Да бъде ли заместена? schematic.exists = Вече съществува схема с това име. schematic.import = Внасяне на Схема... @@ -67,30 +67,30 @@ schematic.browseworkshop = Работилница schematic.copy = Копирай в Клипборда schematic.copy.import = Внеси от Клипборда schematic.shareworkshop = Сподели в Работилницата -schematic.flip = [accent][[{0}][]/[accent][[{1}][]: Обърни Схемата +schematic.flip = [accent][[{0}][]/[accent][[{1}][]: Обърни схемата schematic.saved = Схемате беше запазена. schematic.delete.confirm = Тази схема ще бъде напълно унищожена. -schematic.edit = Edit Schematic +schematic.edit = Промяна на схемата schematic.info = {0}x{1}, {2} елемента -schematic.disabled = [scarlet]Схемите не са достъпни[]\nНе ви е позволено да използвате Схеми на тази [accent]карта[] или [accent]сървър[]. -schematic.tags = Tags: -schematic.edittags = Edit Tags -schematic.addtag = Add Tag -schematic.texttag = Text Tag -schematic.icontag = Icon Tag -schematic.renametag = Rename Tag -schematic.tagged = {0} tagged -schematic.tagdelconfirm = Delete this tag completely? -schematic.tagexists = That tag already exists. +schematic.disabled = [scarlet]Схемите не са достъпни[]\nНе Ви е позволено да използвате Схеми на тази [accent]карта[] или [accent]сървър[]. +schematic.tags = Етикети: +schematic.edittags = Промяна на етикетите +schematic.addtag = Добавяне на етикет +schematic.texttag = Текст +schematic.icontag = Икона +schematic.renametag = Преименуване на етикет +schematic.tagged = {0} етикирано +schematic.tagdelconfirm = Да се изтрие ли този етикет? +schematic.tagexists = Този етикет вече съществува. stats = Статистики -stats.wave = Waves Defeated -stats.unitsCreated = Units Created -stats.enemiesDestroyed = Enemies Destroyed -stats.built = Buildings Built -stats.destroyed = Buildings Destroyed -stats.deconstructed = Buildings Deconstructed -stats.playtime = Time Played +stats.wave = Надвити вълни +stats.unitsCreated = Създадени единици +stats.enemiesDestroyed = Унищожени врагове +stats.built = Построени сгради +stats.destroyed = Унищожени сгради +stats.deconstructed = Разглобени сгради +stats.playtime = Време в игра globalitems = [accent]Всички Ресурси map.delete = Сигурни ли сте че искате да изтриете карта "[accent]{0}[]"? @@ -98,7 +98,7 @@ level.highscore = Рекорд: [accent]{0} level.select = Избор на ниво level.mode = Режим на игра: coreattack = < Ядрото е нападнато! > -nearpoint = [[ [scarlet]НАПУСНЕТЕ ОПАСНАТА ЗОНА МОМЕНТАЛНО[] ]\nпредстои унижощение +nearpoint = [[ [scarlet]НАПУСНЕТЕ ОПАСНАТА ЗОНА МОМЕНТАЛНО[] ]\nредстои унижощение database = Енциклопедия database.button = База данни savegame = Запази Игра @@ -108,7 +108,7 @@ customgame = Персонализирана Игра newgame = Нова Игра none = <няма> none.found = [lightgray]<няма намерени> -none.inmap = [lightgray] +none.inmap = [lightgray]<няма в карти> minimap = Мини-карта position = Позиция close = Затвори @@ -132,12 +132,12 @@ feature.unsupported = Вашето устройство не поддържа т mods.initfailed = [red]⚠[]Mindustry претърпя срив при последното стартиране. Това вероятно е причинено от лошо поведение на някой мод.\n\nЗа да се предотврати постоянно сриване при стартиране, [red]всички модове бяха забранени.[]\n\nЗа да забраните тази опция, изключете я от [accent]Настройки->Игра->Забрани Модовете При Стартиране След Срив[]. mods = Модове mods.none = [lightgray]Няма намерени модове! -mods.guide = Как да създам мод? -mods.report = Съобщи за грешка +mods.guide = Как да създам модификация? +mods.report = Съобщаване за грешка mods.openfolder = Отвори Директория mods.viewcontent = Виж Съдържание mods.reload = Презареди -mods.reloadexit = Играта ще се затвори, за да презареди модовете. +mods.reloadexit = Играта ще се затвори, за да презареди модификациите. mod.installed = [[Инсталиран] mod.display = [gray]Мод:[orange] {0} mod.enabled = [lightgray]Активиран @@ -147,21 +147,21 @@ mod.disable = Деактивирай mod.version = Version: mod.content = Съдържание: mod.delete.error = Неуспешно изтриване на мод. Вероятно файловете се използват. -mod.incompatiblegame = [red]Outdated Game -mod.incompatiblemod = [red]Incompatible -mod.blacklisted = [red]Unsupported -mod.unmetdependencies = [red]Unmet Dependencies +mod.incompatiblegame = [red]Остаряла игра +mod.incompatiblemod = [red]Несъвместимо +mod.blacklisted = [red]Не се поддържа +mod.unmetdependencies = [red]Зависимостите не са покрити mod.erroredcontent = [scarlet]Грешки в Съдържанието -mod.circulardependencies = [red]Circular Dependencies -mod.incompletedependencies = [red]Incomplete Dependencies -mod.requiresversion.details = Requires game version: [accent]{0}[]\nYour game is outdated. This mod requires a newer version of the game (possibly a beta/alpha release) to function. -mod.outdatedv7.details = This mod is incompatible with the latest version of the game. The author must update it, and add [accent]minGameVersion: 136[] to its [accent]mod.json[] file. -mod.blacklisted.details = This mod has been manually blacklisted for causing crashes or other issues with this version of the game. Do not use it. -mod.missingdependencies.details = This mod is missing dependencies: {0} -mod.erroredcontent.details = This game caused errors when loading. Ask the mod author to fix them. -mod.circulardependencies.details = This mod has dependencies that depends on each other. -mod.incompletedependencies.details = This mod is unable to be loaded due to invalid or missing dependencies: {0}. -mod.requiresversion = Requires game version: [red]{0} +mod.circulardependencies = [red]Кръгобратни зависимости +mod.incompletedependencies = [red]Незавършени зависимостиIncomplete Dependencies +mod.requiresversion.details = Необходима е версия на играта: [accent]{0}[]\nВашата игра е остаряла. Тази модификация изисква по-нова версия на играта (вероятно бета/алфа издание), за да функционира. +mod.outdatedv7.details = Тази модификация е несъвместима с последната версия на играта. Авторът трябва да я обнови и да добави [accent]minGameVersion: 136[] към своя [accent]mod.json[] файл. +mod.blacklisted.details = Тази модификация е била поставена в черен списък, защото причинява сривове и други проблеми с тази версия на играта. Не я използвайте. +mod.missingdependencies.details = Липсват следните зависимости за този мод: {0} +mod.erroredcontent.details = Тази игра създаде грешки по време на зареждане. Помолете авторът да ги оправи. +mod.circulardependencies.details = Тази модификация има зависимости, които зависят една от друга. +mod.incompletedependencies.details = Тази модификация не може да зареди поради невалидни или липсващи зависимости: {0}. +mod.requiresversion = Нужна е версия на играта: [red]{0} mod.errors = Възникнаха грешки при зареждане на съдържанието. mod.noerrorplay = [scarlet]Има грешки в някои от модовете, които използвате.[] Трябва да деактивирате тези модове или да поправите грешките преди да играете. mod.nowdisabled = [scarlet]Липсват зависимости за мод '{0}':[accent] {1}\n[lightgray]Мод {0} ще бъде деактивиран докато не ги изтеглите. @@ -171,7 +171,7 @@ mod.reloadrequired = [scarlet]Необходимо е рестартиране mod.import = Вмъкни мод mod.import.file = Вмъкни от файл mod.import.github = Вмъкни от GitHub -mod.jarwarn = [scarlet]JAR модовете могат да са опасни.[]\n Уверете се, че този мод e от надежден източник! +mod.jarwarn = [scarlet]JAR модовете могат да бъдат опасни.[]\n Уверете се, че този мод e от надежден източник! mod.item.remove = Този предмет е част от [accent] '{0}'[] мод. За да го премахнете, премахнете или забранете този мод. mod.remove.confirm = Този мод ще бъде премахнат. mod.author = [lightgray]Автор:[] {0} @@ -183,23 +183,23 @@ mod.scripts.disable = Вашето устройство не поддържа м about.button = За играта name = Име: noname = Трябва да изберете [accent] име на играча[]. -search = Search: +search = Търсене: planetmap = Глобус launchcore = Изстреляй Ядрото filename = Име на файл: -unlocked = Отйлючихте нови неща! +unlocked = Отключихте нови неща! available = Можете да проучите нови технологии! -unlock.incampaign = < Unlock in campaign for details > -campaign.select = Select Starting Campaign -campaign.none = [lightgray]Select a planet to start on.\nThis can be switched at any time. -campaign.erekir = Newer, more polished content. Mostly linear campaign progression.\n\nHigher quality maps and overall experience. -campaign.serpulo = Older content; the classic experience. More open-ended.\n\nPotentially unbalanced maps and campaign mechanics. Less polished. -campaign.difficulty = Difficulty +unlock.incampaign = < Отключете в кампанията за подробности > +campaign.select = Изберете начална кампания +campaign.none = [lightgray]Изберете на коя планета да започнете.\nМоже да промените решението си по всяко време. +campaign.erekir = По-ново полирано съдържание. Напредъкът в кампанията е линеен.\n\nКартите са с по-високо качество за по-добро изживяване. +campaign.serpulo = По-старо съдържание; класическото преживяване. По-отворена игра.\n\nВъзможно е картите и механиките на кампанията да са небалансирани и с по-ниско качество. + completed = [accent]Завършено -techtree = Tech Tree -techtree.select = Tech Tree Selection -techtree.serpulo = Serpulo -techtree.erekir = Erekir +techtree = Технологичен план +techtree.select = Избиране на технологичен план +techtree.serpulo = Серпуло +techtree.erekir = Ерекир research.load = Зареди research.discard = Захвърли research.list = [lightgray]Проучване: @@ -211,17 +211,17 @@ players.single = {0} играч players.search = търси players.notfound = [gray]няма намерени играчи server.closing = [accent]Спиране на сървър... -server.kicked.kick = Вие бяхте изгонен от сървъра! +server.kicked.kick = Вие бяхте изгонени от сървъра! server.kicked.whitelist = Нямате позволение да влезете в този сървър. server.kicked.serverClose = Сървърът беше спрян. -server.kicked.vote = Ти беше изгонен чрез гласуване. До скоро. +server.kicked.vote = Бяхте изгонени чрез гласуване. До скоро. server.kicked.clientOutdated = Остарял клиент!\nАктуализирайте играта си! server.kicked.serverOutdated = Остарял сървър!\nПоискайте от собственика да го актуализира! server.kicked.banned = Вие сте баннат в този сървър. server.kicked.typeMismatch = Този сървър не е съвместим с вашата компилация. server.kicked.playerLimit = Сървърът е пълен.\nИзчакайте някой да излезе. -server.kicked.recentKick = Вие сте били изхвърлен наскоро.\nОпитайте отново по - късно. -server.kicked.nameInUse = Вече има играч с\nтова име в сървъра. +server.kicked.recentKick = Вие сте били изхвърлени наскоро.\nОпитайте отново по-късно. +server.kicked.nameInUse = Вече има играч с\nтакова име в сървъра. server.kicked.nameEmpty = Избрали сте невалидно име. server.kicked.idInUse = Вие вече сте в този сървър! Не е позволено да влизате многократно. server.kicked.customClient = Този сървър не поддържа неофициални компилации. Моля изтеглете официална версия. @@ -232,7 +232,7 @@ host.info = Бутонът [accent]Отвори за лоцалната мреж join.info = Тук можете да въведете [accent]IP адрес на сървър[] за да се свържете или да се присъедините към автоматично намерен сървър във вашата [accent]локална мрежа[] или [accent]публичен[] сървър.\nПоддържат се LAN и WAN мрежови игри.\n\n[lightgray]Ако искате да се свържете по IP ще трябва първо да поискате IP на собственика на сървъра, което той може да намери като напише "my ip" в Google от своята мрежа. hostserver = Стартирай Мрежова Игра invitefriends = Покани Приятели -hostserver.mobile = Host Game +hostserver.mobile = Организиране на игра host = Отвори за Локалната Мрежа hosting = [accent]Отваряне на сървър... hosts.refresh = Обнови @@ -240,10 +240,10 @@ hosts.discovering = Търсене на LAN сървъри hosts.discovering.any = Тръсене на сървъри server.refreshing = Обновяване на сървър hosts.none = [lightgray]Няма намерени локални сървъри! -host.invalid = [scarlet]Не може да се установи връска със сървъра. +host.invalid = [scarlet]Не може да се установи връзка със сървъра. servers.local = Локални Сървъри -servers.local.steam = Open Games & Local Servers +servers.local.steam = Отворени игри и локални сървъри servers.remote = Отдалечени Сървъри servers.global = Публични Сървъри @@ -251,25 +251,25 @@ servers.disclaimer = Публичните сървъри [accent]не[] са п servers.showhidden = Покажи Скритите Сървъри server.shown = Показан server.hidden = Скрит -viewplayer = Viewing Player: [accent]{0} +viewplayer = Гледате играч: [accent]{0} trace = Проследи Играч trace.playername = Име на играча: [accent]{0} trace.ip = IP: [accent]{0} trace.id = ID: [accent]{0} -trace.language = Language: [accent]{0} +trace.language = Език: [accent]{0} trace.mobile = Мобилен Клиент: [accent]{0} trace.modclient = Модифициран Клиент: [accent]{0} trace.times.joined = Пъти участвал в игра: [accent]{0} trace.times.kicked = Пъти изхвърлен от игра: [accent]{0} trace.ips = IPs: -trace.names = Names: +trace.names = Имена: invalidid = Невалидно ID на клиент. Съобщете за грешка. -player.ban = Ban -player.kick = Kick -player.trace = Trace -player.admin = Toggle Admin -player.team = Change Team +player.ban = Банване +player.kick = Изгонване +player.trace = Проследяване +player.admin = Превключване на админ +player.team = Промяна на отбора server.bans = Банове server.bans.none = Няма намерени баннати играчи! server.admins = Администратори @@ -286,12 +286,12 @@ confirmkick = Сигурни ли сте, че искате да изгонит confirmunban = Сигурни ли сте че, искате да анулирате банването на този играч? confirmadmin = Сигурни ли сте че, искате да направите "{0}[white]" администратор? confirmunadmin = Сигурни ли сте че, искате да премахнете администраторските права на "{0}[white]"? -votekick.reason = Vote-Kick Reason -votekick.reason.message = Are you sure you want to vote-kick "{0}[white]"?\nIf yes, please enter the reason: +votekick.reason = Причина за изгонване +votekick.reason.message = Сигурни ли сте, че искате да гласуване за изгонване "{0}[white]"?\nАко отговорът е да, посочете причината: joingame.title = Присъединяване в игра joingame.ip = IP адрес: disconnect = Връзката беше прекъсната. -disconnect.error = Проблем със връзката. +disconnect.error = Проблем с връзката. disconnect.closed = Връзката приключи. disconnect.timeout = Загубена връзка. disconnect.data = Грешка при зареждане на информация за света! @@ -305,8 +305,8 @@ server.invalidport = Невалиден порт! server.error.addressinuse = [scarlet]Failed to open server on port 6567.[]\n\nMake sure no other Mindustry servers are running on your device or network! server.error = [scarlet]Грешка при стартиране на сървър. save.new = Нов Запис -save.overwrite = Сигурни ли сте, че искате\nда презапишете тази позиция за запиз? -save.nocampaign = Individual save files from the campaign cannot be imported. +save.overwrite = Сигурни ли сте, че искате\nда презапишете тази позиция за запис? +save.nocampaign = Не може да импортирате индивидуални записи от кампанията. overwrite = Презапиши save.none = Не са намерени записи! savefail = Грешка при записване на игра! @@ -320,14 +320,14 @@ save.import = Внеси Запис save.newslot = Име на запис: save.rename = Преименувай save.rename.text = Ново име: -selectslot = Избери запис. +selectslot = Избери запис slot = [accent]Позиция {0} editmessage = Редактирай Съобщение save.corrupted = Невалиден или увреден запис! empty = <празно> on = Включено off = Изключено -save.search = Search saved games... +save.search = Търсене на записани игри... save.autosave = Автоматично записване: {0} save.map = Карта: {0} save.wave = Вълна {0} @@ -343,14 +343,14 @@ ok = OK open = Отвори customize = Персонализирай правилата cancel = Отказ -command = Command +command = Команда +command.mine = Изкопаване +command.repair = Ремонт +command.rebuild = Възстановяване +command.assist = Помогни на играч +command.move = Движение +command.boost = Ускоряване command.queue = [lightgray][Queuing] -command.mine = Mine -command.repair = Repair -command.rebuild = Rebuild -command.assist = Assist Player -command.move = Move -command.boost = Boost command.enterPayload = Enter Payload Block command.loadUnits = Load Units command.loadBlocks = Load Blocks @@ -366,7 +366,7 @@ openlink = Отвори Линк copylink = Копирай Линк back = Назад max = Максимално -objective = Map Objective +objective = Цел на картата crash.export = Изнеси информация за срив crash.none = Няма намерена информация за срив. crash.exported = Инесена информация за срив. @@ -375,20 +375,20 @@ data.import = Внеси данните на играта data.openfolder = Отвори директория с данни data.exported = Данните на играта беше изнесена. data.invalid = Това не е валиден файл с данни. -data.import.confirm = Внасянето на външен файл с данни ще унищожи [scarlet]всички[] ваши данни.\n[accent]Това няма да може да се възстанови![]\n\nСлед като информацията се внесе играта ще се затвори. +data.import.confirm = Внасянето на външен файл с данни ще унищожи [scarlet]всички[] Ваши данни.\n[accent]Това няма да може да се възстанови![]\n\nСлед като информацията се внесе, играта ще се затвори. quit.confirm = Сигурни ли сте, че искате да излезете? loading = [accent]Зареждане... -downloading = [accent]Downloading... +downloading = [accent]Изтегляне... saving = [accent]Записване... -respawn = [accent][[{0}][] за да се Върнете при Ядрото -cancelbuilding = [accent][[{0}][] за да Изчистите Скицата -selectschematic = [accent][[{0}][] за да Озберете+Копирате -pausebuilding = [accent][[{0}][] за да Отложите на Строежа -resumebuilding = [scarlet][[{0}][] за да Продължите Строежа -enablebuilding = [scarlet][[{0}][] за да Позволите Строенето +respawn = [accent][[{0}][] за да се върнете при Ядрото +cancelbuilding = [accent][[{0}][] за да изчистите скицата +selectschematic = [accent][[{0}][] за да изберете+копирате +pausebuilding = [accent][[{0}][] за да отложите строежа +resumebuilding = [scarlet][[{0}][] за да продължите строежа +enablebuilding = [scarlet][[{0}][] за да позволите построяването showui = Интерфейсът е скрит.\nНатиснете [accent][[{0}][] за да го покажете. -commandmode.name = [accent]Command Mode -commandmode.nounits = [no units] +commandmode.name = [accent]Команден режим +commandmode.nounits = [няма единици] wave = [accent]Вълна {0} wave.cap = [accent]Вълна {0}/{1} wave.waiting = [lightgray]Вълна след {0} @@ -398,7 +398,7 @@ waiting.players = Изчакване на играчи... wave.enemies = [lightgray]{0} Оставащи врагове wave.enemycores = [accent]{0}[lightgray] Вражески Ядра wave.enemycore = [accent]{0}[lightgray] Вражеско Ядро -wave.enemy = [lightgray]{0} Оставащи Врагове +wave.enemy = [lightgray]{0} Оставащи врагове wave.guardianwarn = Пазителят пристига след [accent]{0}[] вълни. wave.guardianwarn.one = Пазителят пристига след [accent]{0}[] вълна. loadimage = Зареди Изображение @@ -406,29 +406,29 @@ saveimage = Запази Изображение unknown = Неизвестно custom = Персонализирано builtin = Вградено -map.delete.confirm = Сигурни ли сте, че искате да изтриете тази карта? Това действие няма да може да бъде отменено! +map.delete.confirm = Сигурни ли сте, че искате да изтриете тази карта? Това действие не може да бъде отменено! map.random = [accent]Случайна Карта map.nospawn = Тази карта няма позиция за ядро на играча! Добавете поне едно {0} ядро от редактора на карти. -map.nospawn.pvp = Тази карта няма достатъчно позиции за ядра на други играчи! Добавете поне едно [scarlet]неоранжево[] ядро от редактора на карти. +map.nospawn.pvp = Тази карта няма достатъчно позиции за ядра на други играчи! Добавете поне едно [scarlet]не-оранжево[] ядро от редактора на карти. map.nospawn.attack = Тази карта няма нито едно вражеско ядро! Добавете поне едно {0} ядро от редактора на карти. map.invalid = Грешка при зареждане на карта: увреден или невалиден файл. workshop.update = Обновяване на елемент workshop.error = Грешка при изтегляне на данни от Работилницата: {0} -map.publish.confirm = Сигурни ли сте, че искате да публикувате тази карта?\n\n[lightgray]Уверете се че сте приели EULA(Условия за използване) на Работилницата, иначе вашата карта няма да се покаже там! +map.publish.confirm = Сигурни ли сте, че искате да публикувате тази карта?\n\n[lightgray]Уверете се че сте приели EULA (Условия за използване) на Работилницата, иначе Вашата карта няма да се покаже там! workshop.menu = Изберете какво искате да сторите с този елемент. workshop.info = Информация за елемент changelog = История на промените (по избор): -updatedesc = Overwrite Title & Description +updatedesc = Презаписване на заглавието и описанието eula = Steam EULA (Условия за използване на Steam) missing = Този елемент е бил изтрит или преместен.\n[lightgray]Препратката към Работилницата беше автоматично изтрита. publishing = [accent]Публикуване... -publish.confirm = Сигурни ли сте, че искате да публикувате това?\n\n[lightgray]Уверете се че сте приели EULA(Условия за използване) на Работилницата, иначе вашият елемент няма да се показва там! +publish.confirm = Сигурни ли сте, че искате да публикувате това?\n\n[lightgray]Уверете се че сте приели EULA (Условия за използване) на Работилницата, иначе Вашият елемент няма да се показва там! publish.error = Грешка при публикуване на елемент: {0} steam.error = Грешка при зареждане на Steam услуги.\nГрешка: {0} -editor.planet = Planet: -editor.sector = Sector: -editor.seed = Seed: -editor.cliffs = Walls To Cliffs +editor.planet = Планета: +editor.sector = Сектор: +editor.seed = Семе: +editor.cliffs = Стени към скали editor.brush = Четка editor.openin = Отвори в редактора @@ -437,29 +437,24 @@ editor.oregen.info = Генериране на руди: editor.mapinfo = Информация за картата editor.author = Автор: editor.description = Описание: -editor.nodescription = Картата трябва да има описание от поне 4 символа преди да е публикувана. +editor.nodescription = Картата трябва да има описание от поне 4 символа преди да бъде публикувана. editor.waves = Вълни: editor.rules = Правила: editor.generation = Генериране: -editor.objectives = Objectives -editor.locales = Locale Bundles -editor.worldprocessors = World Processors -editor.worldprocessors.editname = Edit Name -editor.worldprocessors.none = [lightgray]No world processor blocks found!\nAdd one in the map editor, or use the \ue813 Add button below. -editor.worldprocessors.nospace = No free space to place a world processor!\nDid you fill the map with structures? Why would you do this? -editor.worldprocessors.delete.confirm = Are you sure you want to delete this world processor?\n\nIf it is surrounded by walls, it will be replaced by an environmental wall. +editor.objectives = Задачи + editor.ingame = Редактирай в игра -editor.playtest = Playtest +editor.playtest = Тестване editor.publish.workshop = Публикувай в Работилницата editor.newmap = Нова Карта editor.center = Център -editor.search = Search maps... -editor.filters = Filter Maps -editor.filters.mode = Gamemodes: -editor.filters.type = Map Type: -editor.filters.search = Search In: -editor.filters.author = Author -editor.filters.description = Description +editor.search = Търсене на карти... +editor.filters = Фелтриране на карти +editor.filters.mode = Режими на игра: +editor.filters.type = Тип карта: +editor.filters.search = Търсене в: +editor.filters.author = Автор +editor.filters.description = Описание editor.shiftx = Shift X editor.shifty = Shift Y workshop = Работилница @@ -467,33 +462,33 @@ waves.title = Вълни от нападатели waves.remove = Премахни waves.every = повтаряй през waves.waves = вълна(и) -waves.health = health: {0}% +waves.health = здраве: {0}% waves.perspawn = на вълна waves.shields = броня на вълна waves.to = до -waves.spawn = spawn: +waves.spawn = пускане: waves.spawn.all = -waves.spawn.select = Spawn Select -waves.spawn.none = [scarlet]no spawns found in map -waves.max = max units +waves.spawn.select = Пускане на единици +waves.spawn.none = [scarlet]няма открити единици на картата +waves.max = макс. единици waves.guardian = Пазител waves.preview = Преглед waves.edit = Редактирай... -waves.random = Random +waves.random = Случаен брой waves.copy = Кобирай в Клипборд waves.load = Зареди от Клипборда waves.invalid = Клипборда съдържа невалидна информация за вълни. waves.copied = Вълните бяха копирани. waves.none = Няма дефинирани врагове.\nАко оставите описанието на вълните празно играта ще използва стандартния шаблон. -waves.sort = Sort By -waves.sort.reverse = Reverse Sort -waves.sort.begin = Begin -waves.sort.health = Health -waves.sort.type = Type -waves.search = Search waves... -waves.filter = Unit Filter -waves.units.hide = Hide All -waves.units.show = Show All +waves.sort = Сортиране чрез +waves.sort.reverse = Обратно сортиране +waves.sort.begin = Начало +waves.sort.health = Здраве +waves.sort.type = Вид +waves.search = Търсене на вълни... +waves.filter = Филтър за единици +waves.units.hide = Скриване на всички +waves.units.show = Показване на всички #these are intentionally in lower case / тези умишлено са оставени без главни букви wavemode.counts = бройки @@ -504,16 +499,15 @@ all = All editor.default = [lightgray]<Стандартно> details = Детайли... edit = Редактирай... -variables = Vars -logic.clear.confirm = Are you sure you want to clear all code from this processor? -logic.globals = Built-in Variables +variables = Променливи + editor.name = Име: -editor.spawn = Създай Единица -editor.removeunit = Премахни Единица +editor.spawn = Създай единица +editor.removeunit = Премахни единица editor.teams = Отбори editor.errorload = Грешка при зареждане на файл. editor.errorsave = Грешка при записване на файл. -editor.errorimage = Това е изображение, не карта. +editor.errorimage = Това е изображение, а не карта. editor.errorlegacy = Тази карта е твърде стара, играта вече не поддържа този формат. editor.errornot = Този файл не е карта. editor.errorheader = Този файл с карта е повреден или невалиден. @@ -521,12 +515,12 @@ editor.errorname = Картата няма зададено име. Да не с editor.errorlocales = Error reading invalid locale bundles. editor.update = Обнови editor.randomize = Случайно -editor.moveup = Move Up -editor.movedown = Move Down -editor.copy = Copy +editor.moveup = Придвижи нагоре +editor.movedown = Придвижи надолу +editor.copy = Копирай editor.apply = Приложи editor.generate = Генерирай -editor.sectorgenerate = Sector Generate +editor.sectorgenerate = Генериране на сектор editor.resize = Смени размера editor.loadmap = Зареди Карта editor.savemap = Запиши Карта @@ -541,7 +535,7 @@ editor.importmap.description = Работи върху копие на карт editor.importfile = Внеси файл editor.importfile.description = Използвай карта от файл editor.importimage = Внасяне от изображение -editor.importimage.description = Внеси отфайл с изображение на терена +editor.importimage.description = Внеси от файл с изображение на терена editor.export = Изнеси... editor.exportfile = Изнеси Файл editor.exportfile.description = Изнеси като файл с карта @@ -553,8 +547,8 @@ editor.unsaved = Сигурни ли сте, че искате да излезе editor.resizemap = Преоразмери картата editor.mapname = Име на картата: editor.overwrite = [accent]ВНИМАНИЕ!\nТази карта презаписва друга карта. -editor.overwrite.confirm = [scarlet]ВНИМАНИЕ![] Вече съществува карта с това име. Ако продължите ще запишете тази на нейно място. Желаете ли да продължите?\n"[accent]{0}[]" -editor.exists = В ече съществува карта с това име. +editor.overwrite.confirm = [scarlet]ВНИМАНИЕ![] Вече съществува карта с това име. Ако продължите, ще запишете тази на нейно място. Желаете ли да продължите?\n"[accent]{0}[]" +editor.exists = Вече съществува карта с това име. editor.selectmap = Изберете карта, която да заредите: toolmode.replace = Заместване @@ -569,14 +563,14 @@ toolmode.eraseores = Изтриване на руди toolmode.eraseores.description = Изтрива само руди. toolmode.fillteams = Запълване в отбори toolmode.fillteams.description = Променя отбора, не типа на обектите, чрез запълване -toolmode.fillerase = Fill Erase -toolmode.fillerase.description = Erase blocks of the same type. +toolmode.fillerase = Изпълващо изтриване +toolmode.fillerase.description = Изтрива блокчета от същият вид. toolmode.drawteams = Рисуване в отбори -toolmode.drawteams.description = Променя отбора, не типа на обектите, чрез рисуване -toolmode.underliquid = Under Liquids -toolmode.underliquid.description = Draw floors under liquid tiles. +toolmode.drawteams.description = Променя отбора, не типа на обектите, чрез рисуване. +toolmode.underliquid = Под течности +toolmode.underliquid.description = Рисува повърхности под течни полета. -filters.empty = [lightgray]Няма избран филтър! Изберете чрез бутона отдоло. +filters.empty = [lightgray]Няма избран филтър! Изберете чрез бутона отдолу. filter.distort = Изкривяване filter.noise = Шум filter.enemyspawn = Избор на вражеска начална точка @@ -602,44 +596,25 @@ filter.option.circle-scale = Кръгово мащабиране filter.option.octaves = Октави filter.option.falloff = Разпадане filter.option.angle = Ъгъл -filter.option.tilt = Tilt -filter.option.rotate = Rotate +filter.option.tilt = Наклон +filter.option.rotate = Завърти filter.option.amount = Количество filter.option.block = Блок filter.option.floor = Под filter.option.flooronto = Целеви под filter.option.target = Цел -filter.option.replacement = Replacement +filter.option.replacement = Заместване filter.option.wall = Стена filter.option.ore = Руда filter.option.floor2 = Втори под filter.option.threshold2 = Втори праг filter.option.radius = Радиус -filter.option.percentile = Перцентил -filter.option.code = Code -filter.option.loop = Loop -locales.info = Here, you can add locale bundles for specific languages to your map. In locale bundles, each property has a name and a value. These properties can be used by world processors and objectives using their names. They support text formatting (replacing placeholders with actual values).\n\n[cyan]Example property:\n[]name: [accent]timer[]\nvalue: [accent]Example timer, time left: {0}[]\n\n[cyan]Usage:\n[]Set it as objective's text: [accent]@timer\n\n[]Print it in a world processor:\n[accent]localeprint "timer"\nformat time\n[gray](where time is a separately calculated variable) -locales.deletelocale = Are you sure you want to delete this locale bundle? -locales.applytoall = Apply Changes To All Locales -locales.addtoother = Add To Other Locales -locales.rollback = Rollback to last applied -locales.filter = Property filter -locales.searchname = Search name... -locales.searchvalue = Search value... -locales.searchlocale = Search locale... -locales.byname = By name -locales.byvalue = By value -locales.showcorrect = Show properties that are present in all locales and have unique values everywhere -locales.showmissing = Show properties that are missing in some locales -locales.showsame = Show properties that have same values in different locales -locales.viewproperty = View in all locales -locales.viewing = Viewing property "{0}" -locales.addicon = Add Icon +filter.option.percentile = Процент width = Дължина: height = Височина: menu = Меню -play = Играй +play = Игра campaign = Кампания load = Зареди save = Запиши @@ -648,12 +623,12 @@ ping = Ping: {0}ms tps = TPS: {0} memory = Mem: {0}mb memory2 = Mem:\n {0}mb +\n {1}mb -language.restart = Рестартирайте вашата игра за да зареди настройките за език. +language.restart = Рестартирайте играта, за да промените езика. settings = Настройки tutorial = Обучение -tutorial.retake = Повтори Обучението +tutorial.retake = Повтори обучението editor = Редактор -mapeditor = Редактор на Карта +mapeditor = Редактор на карти abandon = Изоставяне abandon.text = Тази зона и всичките ѝ ресурси ще бъдат оставени на врага. From c670f6c5e3b21aeb676484ea3447aeaf58625c16 Mon Sep 17 00:00:00 2001 From: Github Actions Date: Thu, 6 Feb 2025 00:01:34 +0000 Subject: [PATCH 201/460] Automatic bundle update --- core/assets/bundles/bundle_bg.properties | 30 +++++++++++++++++++++++- 1 file changed, 29 insertions(+), 1 deletion(-) diff --git a/core/assets/bundles/bundle_bg.properties b/core/assets/bundles/bundle_bg.properties index 2d60d043b4..a0a942c085 100644 --- a/core/assets/bundles/bundle_bg.properties +++ b/core/assets/bundles/bundle_bg.properties @@ -194,6 +194,7 @@ campaign.select = Изберете начална кампания campaign.none = [lightgray]Изберете на коя планета да започнете.\nМоже да промените решението си по всяко време. campaign.erekir = По-ново полирано съдържание. Напредъкът в кампанията е линеен.\n\nКартите са с по-високо качество за по-добро изживяване. campaign.serpulo = По-старо съдържание; класическото преживяване. По-отворена игра.\n\nВъзможно е картите и механиките на кампанията да са небалансирани и с по-ниско качество. +campaign.difficulty = Difficulty completed = [accent]Завършено techtree = Технологичен план @@ -344,13 +345,13 @@ open = Отвори customize = Персонализирай правилата cancel = Отказ command = Команда +command.queue = [lightgray][Queuing] command.mine = Изкопаване command.repair = Ремонт command.rebuild = Възстановяване command.assist = Помогни на играч command.move = Движение command.boost = Ускоряване -command.queue = [lightgray][Queuing] command.enterPayload = Enter Payload Block command.loadUnits = Load Units command.loadBlocks = Load Blocks @@ -442,6 +443,12 @@ editor.waves = Вълни: editor.rules = Правила: editor.generation = Генериране: editor.objectives = Задачи +editor.locales = Locale Bundles +editor.worldprocessors = World Processors +editor.worldprocessors.editname = Edit Name +editor.worldprocessors.none = [lightgray]No world processor blocks found!\nAdd one in the map editor, or use the \ue813 Add button below. +editor.worldprocessors.nospace = No free space to place a world processor!\nDid you fill the map with structures? Why would you do this? +editor.worldprocessors.delete.confirm = Are you sure you want to delete this world processor?\n\nIf it is surrounded by walls, it will be replaced by an environmental wall. editor.ingame = Редактирай в игра editor.playtest = Тестване @@ -500,6 +507,8 @@ editor.default = [lightgray]<Стандартно> details = Детайли... edit = Редактирай... variables = Променливи +logic.clear.confirm = Are you sure you want to clear all code from this processor? +logic.globals = Built-in Variables editor.name = Име: editor.spawn = Създай единица @@ -610,6 +619,25 @@ filter.option.floor2 = Втори под filter.option.threshold2 = Втори праг filter.option.radius = Радиус filter.option.percentile = Процент +filter.option.code = Code +filter.option.loop = Loop +locales.info = Here, you can add locale bundles for specific languages to your map. In locale bundles, each property has a name and a value. These properties can be used by world processors and objectives using their names. They support text formatting (replacing placeholders with actual values).\n\n[cyan]Example property:\n[]name: [accent]timer[]\nvalue: [accent]Example timer, time left: {0}[]\n\n[cyan]Usage:\n[]Set it as objective's text: [accent]@timer\n\n[]Print it in a world processor:\n[accent]localeprint "timer"\nformat time\n[gray](where time is a separately calculated variable) +locales.deletelocale = Are you sure you want to delete this locale bundle? +locales.applytoall = Apply Changes To All Locales +locales.addtoother = Add To Other Locales +locales.rollback = Rollback to last applied +locales.filter = Property filter +locales.searchname = Search name... +locales.searchvalue = Search value... +locales.searchlocale = Search locale... +locales.byname = By name +locales.byvalue = By value +locales.showcorrect = Show properties that are present in all locales and have unique values everywhere +locales.showmissing = Show properties that are missing in some locales +locales.showsame = Show properties that have same values in different locales +locales.viewproperty = View in all locales +locales.viewing = Viewing property "{0}" +locales.addicon = Add Icon width = Дължина: height = Височина: From d030724292ce4721dc33f8653f59c4ea0b3a5386 Mon Sep 17 00:00:00 2001 From: Teamblur <34703059+BidTeamblur@users.noreply.github.com> Date: Thu, 6 Feb 2025 02:03:08 +0200 Subject: [PATCH 202/460] Update bundle_et.properties (#9468) Added new translations and updated old ones with better wording and grammar. --- core/assets/bundles/bundle_et.properties | 175 ++++++++++++----------- 1 file changed, 89 insertions(+), 86 deletions(-) diff --git a/core/assets/bundles/bundle_et.properties b/core/assets/bundles/bundle_et.properties index 47ab3a7027..fd724e7eb0 100644 --- a/core/assets/bundles/bundle_et.properties +++ b/core/assets/bundles/bundle_et.properties @@ -3,129 +3,132 @@ credits = Tegijad contributors = Tõlkijad ja panustajad discord = Liitu Mindustry Discordi serveriga! link.discord.description = Ametlik Discordi server -link.reddit.description = The Mindustry subreddit +link.reddit.description = Mindustry subreddit link.github.description = Mängu lähtekood link.changelog.description = Uuenduste nimekiri versioonide kaupa link.dev-builds.description = Arendusversioonide ajalugu link.trello.description = Plaanitud uuenduste nimekiri link.itch.io.description = Kõik PC-platvormide versioonid link.google-play.description = Androidi versioon Google Play poes -link.f-droid.description = F-Droid catalogue listing +link.f-droid.description = F-Droid kataloog link.wiki.description = Mängu ametlik viki -link.suggestions.description = Suggest new features -link.bug.description = Found one? Report it here -linkopen = This server has sent you a link. Are you sure you want to open it?\n\n[sky]{0} +link.suggestions.description = Anna soovitusi +link.bug.description = Leidsid vea? Kirjuta siia +linkopen = See server saatis sulle lingi. Oled kindel, et tahad avada?\n\n[sky]{0} linkfail = Lingi avamine ebaõnnestus!\nVeebiaadress kopeeriti. screenshot = Kuvatõmmis salvestati: {0} screenshot.invalid = Maailm on liiga suur: kuvatõmmise salvestamiseks ei pruugi olla piisavalt mälu. gameover = Mäng läbi! -gameover.disconnect = Disconnect +gameover.disconnect = Lahku gameover.pvp = Võistkond[accent] {0}[] võitis! -gameover.waiting = [accent]Waiting for next map... +gameover.waiting = [accent]Ootan järgmist kaarti... highscore = [accent]Uus rekord! -copied = Copied. -indev.notready = This part of the game isn't ready yet +copied = Kopeeritud. +indev.notready = See osa mängust ei ole veel valmis load.sound = Helid load.map = Maailmad load.image = Pildid load.content = Sisu load.system = Süsteem -load.mod = Mods -load.scripts = Scripts +load.mod = Modid +load.scripts = Skriptid -be.update = A new Bleeding Edge build is available: -be.update.confirm = Download it and restart now? -be.updating = Updating... -be.ignore = Ignore -be.noupdates = No updates found. -be.check = Check for updates -mods.browser = Mod Browser -mods.browser.selected = Selected mod -mods.browser.add = Install -mods.browser.reinstall = Reinstall -mods.browser.view-releases = View Releases -mods.browser.noreleases = [scarlet]No Releases Found\n[accent]Couldn't find any releases for this mod. Check if the mod's repository has any releases published. -mods.browser.latest = -mods.browser.releases = Releases +be.update = Uus arendusversioon on saadaval: +be.update.confirm = Lae alla ja taaskäivita? +be.updating = Värskendan... +be.ignore = Ignoreeri +be.noupdates = Ei leidnud värskendusi. +be.check = Otsi värskendusi + +mods.browser = Modi Brauser +mods.browser.selected = Valitud mod +mods.browser.add = Paigalda +mods.browser.reinstall = Taaspaigalda +mods.browser.view-releases = Kuva Versioonid +mods.browser.noreleases = [scarlet]Ei leidnud versioone\n[accent]Ei leidnud selle modi jaoks ühtegi väljaannet. Kontrollige, kas modi repositooriumis on avaldatud versioone. +mods.browser.latest = +mods.browser.releases = Versioonid mods.github.open = Repo -mods.github.open-release = Release Page -mods.browser.sortdate = Sort by recent -mods.browser.sortstars = Sort by stars +mods.github.open-release = Väljastusleht +mods.browser.sortdate = Sorteeri uusimad enne +mods.browser.sortstars = Sorteeri tähtede järgi -schematic = Schematic -schematic.add = Save Schematic... -schematics = Schematics -schematic.search = Search schematics... -schematic.replace = A schematic by that name already exists. Replace it? -schematic.exists = A schematic by that name already exists. -schematic.import = Import Schematic... -schematic.exportfile = Export File -schematic.importfile = Import File -schematic.browseworkshop = Browse Workshop -schematic.copy = Copy to Clipboard -schematic.copy.import = Import from Clipboard -schematic.shareworkshop = Share on Workshop -schematic.flip = [accent][[{0}][]/[accent][[{1}][]: Flip Schematic -schematic.saved = Schematic saved. -schematic.delete.confirm = This schematic will be utterly eradicated. -schematic.edit = Edit Schematic -schematic.info = {0}x{1}, {2} blocks -schematic.disabled = [scarlet]Schematics disabled[]\nYou are not allowed to use schematics on this [accent]map[] or [accent]server. -schematic.tags = Tags: -schematic.edittags = Edit Tags -schematic.addtag = Add Tag -schematic.texttag = Text Tag -schematic.icontag = Icon Tag -schematic.renametag = Rename Tag -schematic.tagged = {0} tagged -schematic.tagdelconfirm = Delete this tag completely? -schematic.tagexists = That tag already exists. -stats = Stats -stats.wave = Waves Defeated -stats.unitsCreated = Units Created -stats.enemiesDestroyed = Enemies Destroyed -stats.built = Buildings Built -stats.destroyed = Buildings Destroyed -stats.deconstructed = Buildings Deconstructed -stats.playtime = Time Played +schematic = Skeem +schematic.add = Salvesta Skeem... +schematics = Skeemid +schematic.search = Otsi skeemide hulgast... +schematic.replace = Selle nimega skeem juba eksisteerib. Asenda? +schematic.exists = Selle nimega skeem juba eksisteerib. +schematic.import = Impordi Skeem... +schematic.exportfile = Ekspordi Fail +schematic.importfile = Impordi Fail +schematic.browseworkshop = Lehitse Workshop'i +schematic.copy = Kopeeri Lõikelauale +schematic.copy.import = Impordi Lõikelaualt +schematic.shareworkshop = Jaga Workshop'is +schematic.flip = [accent][[{0}][]/[accent][[{1}][]: Peegelda Skeem +schematic.saved = Skeem salvestatud. +schematic.delete.confirm = See skeem hävitatakse täielikult. +schematic.edit = Muuda Skeemi +schematic.info = {0}x{1}, {2} plokki +schematic.disabled = [scarlet]Skeemid välja lülitatud[]\nSa ei tohi kasutada skeeme selles [accent]maailmas[] või [accent]serveris. +schematic.tags = Sildid: +schematic.edittags = Muuda Silte +schematic.addtag = Lisa Silt +schematic.texttag = Tekstisilt +schematic.icontag = Ikoonisilt +schematic.renametag = Nimeta Silt Ümber +schematic.tagged = {0} sildistatud +schematic.tagdelconfirm = Kustuta see silt täielikult? +schematic.tagexists = See silt juba eksisteerib. -globalitems = [accent]Global Items +stats = Statistika +stats.wave = Läbitud Laineid +stats.unitsCreated = Üksusi Loodud +stats.enemiesDestroyed = Vastaseid Hävitatud +stats.built = Ehitisi Ehitatud +stats.destroyed = Ehitisi Hävitatud +stats.deconstructed = Ehitisi Lammutatud +stats.playtime = Mängitud Aeg + +globalitems = [accent]Globaalsed Materjalid map.delete = Kas oled kindel, et soovid kustutada\nmaailma "[accent]{0}[]"? level.highscore = Rekord: [accent]{0} -level.select = Taseme valimine +level.select = Taseme valik level.mode = Mänguviis: -coreattack = < Tuumik on rünnaku all! > -nearpoint = [[ [scarlet]LAHKU VAENLASTE MAANDUMISE ALALT[] ]\nVaenlaste maandumisel hävib siin kõik. -database = Andmebaas -database.button = Database -savegame = Salvesta mäng -loadgame = Lae mäng -joingame = Liitu mänguga -customgame = Kohandatud mäng +coreattack = < Tuum on rünnaku all! > +nearpoint = [[ [scarlet]LAHKU KOHESELT MAANDUMISPLATSILT[] ]\nVaenlaste maandumisel hävib siin kõik. +database = Tuumandmebaas +database.button = Andmebaas +savegame = Salvesta Mäng +loadgame = Lae Mäng +joingame = Liitu Mänguga +customgame = Kohandatud Mäng newgame = Uus mäng none = -none.found = [lightgray] -none.inmap = [lightgray] +none.found = [lightgray] +none.inmap = [lightgray] minimap = Kaart -position = Position +position = Positsioon close = Sulge website = Veebileht quit = Välju -save.quit = Salvesta ja välju +save.quit = Salvesta ja Välju maps = Maailmad -maps.browse = Sirvi maailmu +maps.browse = Sirvi Maailmu continue = Jätka maps.none = [lightgray]Ühtegi maailma ei leitud! invalid = Kehtetu -pickcolor = Pick Color -preparingconfig = Konfiguratsiooni ettevalmistamine -preparingcontent = Sisu ettevalmistamine -uploadingcontent = Sisu üleslaadimine -uploadingpreviewfile = Eelvaate faili üleslaadimine -committingchanges = Muudatuste teostamine +pickcolor = Vali Värv +preparingconfig = Konfiguratsiooni Ettevalmistamine +preparingcontent = Sisu Ettevalmistamine +uploadingcontent = Sisu Üleslaadimine +uploadingpreviewfile = Eelvaate Faili Üleslaadimine +committingchanges = Muudatuste Teostamine done = Valmis -feature.unsupported = Your device does not support this feature. +feature.unsupported = Seade ei toeta seda funktsiooni. + mods.initfailed = [red]⚠[] The previous Mindustry instance failed to initialize. This was likely caused by misbehaving mods.\n\nTo prevent a crash loop, [red]all mods have been disabled.[] mods = Mods mods.none = [lightgray]No mods found! From 0691ee4a0c82d11bc0623d6cd93951ab3b85fd0b Mon Sep 17 00:00:00 2001 From: TheThatFSFC <74316923+thefsfc@users.noreply.github.com> Date: Thu, 6 Feb 2025 09:06:43 +0900 Subject: [PATCH 203/460] Update bundle_ru.properties (#10144) * Update bundle_ru.properties Now everything is good! * Update bundle_ru.properties * Update bundle_ru.properties * Update bundle_ru.properties * Update bundle_ru.properties * Update bundle_ru.properties --------- Co-authored-by: Anuken --- core/assets/bundles/bundle_ru.properties | 194 ++++++++++++----------- 1 file changed, 98 insertions(+), 96 deletions(-) diff --git a/core/assets/bundles/bundle_ru.properties b/core/assets/bundles/bundle_ru.properties index 0e8ec146d5..262922edc8 100644 --- a/core/assets/bundles/bundle_ru.properties +++ b/core/assets/bundles/bundle_ru.properties @@ -351,17 +351,17 @@ command.rebuild = Восстанавливать command.assist = Помогать игроку command.move = Двигаться command.boost = Лететь -command.enterPayload = Enter Payload Block -command.loadUnits = Load Units -command.loadBlocks = Load Blocks -command.unloadPayload = Unload Payload -command.loopPayload = Loop Unit Transfer -stance.stop = Cancel Orders -stance.shoot = Stance: Shoot -stance.holdfire = Stance: Hold Fire -stance.pursuetarget = Stance: Pursue Target -stance.patrol = Stance: Patrol Path -stance.ram = Stance: Ram\n[lightgray]Straight line movement, no pathfinding +command.enterPayload = Войти в грузовой блок +command.loadUnits = Загрузить единицы +command.loadBlocks = Загрузить постройки +command.unloadPayload = Выгрузить груз +stance.stop = Отменить команду +stance.shoot = Положение: Стрелять +stance.holdfire = Положение: Удерживать огонь +stance.pursuetarget = Положение: Преследовать цель +stance.patrol = Положение: Патрулировать путь +stance.ram = Положение: Таран\n[lightgray]Движение по прямой, без поиска пути + openlink = Открыть ссылку copylink = Скопировать ссылку back = Назад @@ -442,12 +442,12 @@ editor.waves = Волны: editor.rules = Правила: editor.generation = Генерация: editor.objectives = Цели -editor.locales = Locale Bundles -editor.worldprocessors = World Processors -editor.worldprocessors.editname = Edit Name -editor.worldprocessors.none = [lightgray]No world processor blocks found!\nAdd one in the map editor, or use the \ue813 Add button below. -editor.worldprocessors.nospace = No free space to place a world processor!\nDid you fill the map with structures? Why would you do this? -editor.worldprocessors.delete.confirm = Are you sure you want to delete this world processor?\n\nIf it is surrounded by walls, it will be replaced by an environmental wall. +editor.locales = Наборы локалей +editor.worldprocessors = Мировые процессоры +editor.worldprocessors.editname = Изменить название +editor.worldprocessors.none = [lightgray]Не найдено ни одного блока мирового процессора\nДобавьте его в редакторе карт или воспользуйтесь кнопкой "\ue813 Добавить" ниже. +editor.worldprocessors.nospace = Нет свободного места для размещения мирового процессора!\n Возможно на карте всё занято структурами +editor.worldprocessors.delete.confirm = Вы уверены, что хотите удалить этот мировой процессор?\n\nЕсли он окружен стенами, он будет заменен стеной окружения. editor.ingame = Редактировать в игре editor.playtest = Опробовать карту editor.publish.workshop = Опубликовать в Мастерской @@ -505,7 +505,8 @@ editor.default = [lightgray]<По умолчанию> details = Подробности... edit = Редактировать... variables = Переменные -logic.clear.confirm = Are you sure you want to clear all code from this processor? +logic.clear.confirm = Вы уверены, что хотите удалить весь код из этого процессора? + logic.globals = Встроенные переменные editor.name = Название: editor.spawn = Создать боевую единицу @@ -518,7 +519,7 @@ editor.errorlegacy = Эта карта слишком старая и испол editor.errornot = Это не файл карты. editor.errorheader = Этот файл карты недействителен или повреждён. editor.errorname = Карта не имеет имени. Может быть, вы пытаетесь загрузить сохранение? -editor.errorlocales = Error reading invalid locale bundles. +editor.errorlocales = Ошибка при чтении недопустимых наборов локалей. editor.update = Обновить editor.randomize = Случайно editor.moveup = Выше @@ -530,7 +531,7 @@ editor.sectorgenerate = Генерация сектора editor.resize = Изменить\nразмер editor.loadmap = Загрузить\nкарту editor.savemap = Сохранить\nкарту -editor.savechanges = [scarlet]You have unsaved changes!\n\n[]Do you want to save them? +editor.savechanges = [scarlet]У вас есть несохраненные изменения!\n\n[]Вы хотите сохранить их? editor.saved = Сохранено! editor.save.noname = У вашей карты нет имени! Назовите её в меню «Информация о карте». editor.save.overwrite = Ваша карта не может быть записана поверх встроенной карты! Введите другое название в меню «Информация о карте» @@ -618,25 +619,25 @@ filter.option.floor2 = Вторая поверхность filter.option.threshold2 = Вторичный предельный порог filter.option.radius = Радиус filter.option.percentile = Процентиль -filter.option.code = Code -filter.option.loop = Loop -locales.info = Here, you can add locale bundles for specific languages to your map. In locale bundles, each property has a name and a value. These properties can be used by world processors and objectives using their names. They support text formatting (replacing placeholders with actual values).\n\n[cyan]Example property:\n[]name: [accent]timer[]\nvalue: [accent]Example timer, time left: {0}[]\n\n[cyan]Usage:\n[]Set it as objective's text: [accent]@timer\n\n[]Print it in a world processor:\n[accent]localeprint "timer"\nformat time\n[gray](where time is a separately calculated variable) -locales.deletelocale = Are you sure you want to delete this locale bundle? -locales.applytoall = Apply Changes To All Locales -locales.addtoother = Add To Other Locales -locales.rollback = Rollback to last applied -locales.filter = Property filter -locales.searchname = Search name... -locales.searchvalue = Search value... -locales.searchlocale = Search locale... -locales.byname = By name -locales.byvalue = By value -locales.showcorrect = Show properties that are present in all locales and have unique values everywhere -locales.showmissing = Show properties that are missing in some locales -locales.showsame = Show properties that have same values in different locales -locales.viewproperty = View in all locales -locales.viewing = Viewing property "{0}" -locales.addicon = Add Icon +filter.option.code = Код +filter.option.loop = Цикл +locales.info = Здесь вы можете добавить на карту наборы локалей для определенных языков. В наборах локалей каждое свойство имеет имя и значение. Эти свойства могут использоваться мировыми процессорами и целями по их именам. Они поддерживают форматирование текста (заменяя пропуски реальными значениями).\n\n[cyan]Пример свойства:\n[]name: [accent]timer[]\nvalue: [accent]Пример таймера, оставшееся время: {0}[]\n\n[cyan]Использование:\n[]Установите его как текст цели: [accent]@timer\n\n[]Введите его в мировом процессоре:\n[accent]localeprint «timer»\nformat time\n[gray] (где time - отдельно вычисляемая переменная) +locales.deletelocale = Вы уверены, что хотите удалить этот набор локалей? +locales.applytoall = Применить изменения ко всем локалям +locales.addtoother = Добавить в другие локали +locales.rollback = Откат к последнему примененному значению +locales.filter = Фильтр свойств +locales.searchname = Поиск по имени... +locales.searchvalue = Поиск значения... +locales.searchlocale = Поиск локали... +locales.byname = По имени +locales.byvalue = По значению +locales.showcorrect = Показать свойства, которые присутствуют во всех локалях и имеют везде уникальные значения +locales.showmissing = Показать свойства, отсутствующие в некоторых локалях +locales.showsame = Показать свойства, которые имеют одинаковые значения в разных локалях +locales.viewproperty = Смотреть во всех локалях +locales.viewing = Просмотр свойства "{0}" +locales.addicon = Добавить иконку width = Ширина: height = Высота: @@ -686,12 +687,12 @@ objective.destroycore.name = Уничтожить ядро objective.commandmode.name = Командовать единицей objective.flag.name = Флаг marker.shapetext.name = Фигура с текстом -marker.point.name = Point +marker.point.name = Точка marker.shape.name = Фигура marker.text.name = Текст -marker.line.name = Line -marker.quad.name = Quad -marker.texture.name = Texture +marker.line.name = Линия +marker.quad.name = Четырёхугольник +marker.texture.name = Текстура marker.background = Фон marker.outline = Контур objective.research = [accent]Исследуйте:\n[]{0}[lightgray]{1} @@ -834,7 +835,7 @@ sector.weatheredChannels.name = Weathered Channels sector.mycelialBastion.name = Mycelial Bastion sector.frontier.name = Frontier -sector.groundZero.description = Оптимальная локация для повторных игр. Низкая вражеская угроза. Немного ресурсов.\nСоберите как можно больше свинца и меди.\nДвигайтесь дальше. +sector.groundZero.description = Оптимальная локация чтобы начать сначала. Низкая вражеская угроза. Немного ресурсов.\nСоберите как можно больше свинца и меди.\nДвигайтесь дальше. sector.frozenForest.description = Даже здесь, ближе к горам, споры распространились. Холодные температуры не могут сдерживать их вечно.\n\nНачните вкладываться в энергию. Постройте генераторы внутреннего сгорания. Научитесь пользоваться регенератором. sector.saltFlats.description = На окраине пустыни лежат соляные равнины. В этой местности можно найти немного ресурсов.\n\nВраги возвели здесь комплекс хранения ресурсов. Искорените их ядро. Не оставьте камня на камне. sector.craters.description = Вода скопилась в этом кратере, реликвии времён старых войн. Восстановите область. Соберите песок. Выплавьте метастекло. Качайте воду для охлаждения турелей и буров. @@ -1020,7 +1021,7 @@ stat.abilities = Способности stat.canboost = Может взлететь stat.flying = Летающий stat.ammouse = Использование боеприпасов -stat.ammocapacity = Ammo Capacity +stat.ammocapacity = Вместимость боеприпасов stat.damagemultiplier = Множитель урона stat.healthmultiplier = Множитель прочности stat.speedmultiplier = Множитель скорости @@ -1031,47 +1032,47 @@ stat.immunities = Невосприимчив stat.healing = Ремонт ability.forcefield = Силовое поле -ability.forcefield.description = Projects a force shield that absorbs bullets +ability.forcefield.description = Создает силовой щит, поглощающий пули ability.repairfield = Ремонтирующее поле -ability.repairfield.description = Repairs nearby units +ability.repairfield.description = Ремонтирует близлежащие единицы ability.statusfield = Усиливающее поле -ability.statusfield.description = Applies a status effect to nearby units +ability.statusfield.description = Накладывает эффект на ближайшие единицы ability.unitspawn = Завод единиц � -ability.unitspawn.description = Constructs units +ability.unitspawn.description = Конструирует единицы ability.shieldregenfield = Поле восстановления щита -ability.shieldregenfield.description = Regenerates shields of nearby units +ability.shieldregenfield.description = Восстанавливает щиты ближайших юнитов ability.movelightning = Молнии при движении -ability.movelightning.description = Releases lightning while moving -ability.armorplate = Armor Plate -ability.armorplate.description = Reduces damage taken while shooting +ability.movelightning.description = Выпускает молнии при движении +ability.armorplate = Бронепластина +ability.armorplate.description = Снижает урон, получаемый при стрельбе ability.shieldarc = Дуговой щит -ability.shieldarc.description = Projects a force shield in an arc that absorbs bullets +ability.shieldarc.description = Выпускает силовой щит по дуге, поглощающий пули ability.suppressionfield = Поле подавления регенерации -ability.suppressionfield.description = Stops nearby repair buildings +ability.suppressionfield.description = Останавливает ремонтные здания ability.energyfield = Энергетическое поле -ability.energyfield.description = Zaps nearby enemies -ability.energyfield.healdescription = Zaps nearby enemies and heals allies -ability.regen = Regeneration -ability.regen.description = Regenerates own health over time -ability.liquidregen = Liquid Absorption -ability.liquidregen.description = Absorbs liquid to heal itself -ability.spawndeath = Death Spawns -ability.spawndeath.description = Releases units on death -ability.liquidexplode = Death Spillage -ability.liquidexplode.description = Spills liquid on death -ability.stat.firingrate = [stat]{0}/sec[lightgray] firing rate -ability.stat.regen = [stat]{0}[lightgray] health/sec -ability.stat.pulseregen = [stat]{0}[lightgray] health/pulse -ability.stat.shield = [stat]{0}[lightgray] shield -ability.stat.repairspeed = [stat]{0}/sec[lightgray] repair speed -ability.stat.slurpheal = [stat]{0}[lightgray] health/liquid unit -ability.stat.cooldown = [stat]{0} sec[lightgray] cooldown -ability.stat.maxtargets = [stat]{0}[lightgray] max targets -ability.stat.sametypehealmultiplier = [stat]{0}%[lightgray] same type repair amount -ability.stat.damagereduction = [stat]{0}%[lightgray] damage reduction -ability.stat.minspeed = [stat]{0} tiles/sec[lightgray] min speed -ability.stat.duration = [stat]{0} sec[lightgray] duration -ability.stat.buildtime = [stat]{0} sec[lightgray] build time +ability.energyfield.description = Электризует ближайших врагов +ability.energyfield.healdescription = Электризует ближайших врагов и лечит союзников +ability.regen = Регенерация +ability.regen.description = Восстанавливает собственное здоровье с течением времени +ability.liquidregen = Поглощение жидкости +ability.liquidregen.description = Поглощает жидкость для самовосстановления +ability.spawndeath = Смертельное порождение +ability.spawndeath.description = Создает единицы после смерти +ability.liquidexplode = Смертельное разлитие +ability.liquidexplode.description = Разливает жидкость при смерти +ability.stat.firingrate = [stat]{0}/сек[lightgray] темп стрельбы +ability.stat.regen = [stat]{0}[lightgray] здоровья/сек +ability.stat.shield = [stat]{0}[lightgray] щит +ability.stat.repairspeed = [stat]{0}/sec[lightgray] скорость регенерации +ability.stat.slurpheal = [stat]{0}[lightgray] здоровья/единица жидкости +ability.stat.cooldown = [stat]{0} сек[lightgray] перезарядка +ability.stat.maxtargets = [stat]{0}[lightgray] максимум целей +ability.stat.sametypehealmultiplier = [stat]{0}%[lightgray] тот же тип ремонта +ability.stat.damagereduction = [stat]{0}%[lightgray] снижение урона +ability.stat.minspeed = [stat]{0} плиток/сек[lightgray] минимальная скорость +ability.stat.duration = [stat]{0} сек[lightgray] продолжительность +ability.stat.buildtime = [stat]{0} сек[lightgray] время постройки + bar.onlycoredeposit = Доступен перенос только в ядро bar.drilltierreq = Требуется бур получше @@ -1153,7 +1154,7 @@ unit.items = предметов unit.thousands = к unit.millions = М unit.billions = кM -unit.shots = shots +unit.shots = выстрелы unit.pershot = /выстрел category.purpose = Назначение category.general = Основные @@ -1163,8 +1164,9 @@ category.items = Предметы category.crafting = Ввод/вывод category.function = Действие category.optional = Дополнительные улучшения +setting.alwaysmusic.description = Если включить эту функцию, музыка всегда будет воспроизводиться в игре по кругу.\nЕсли выключить, она будет воспроизводиться только через случайные промежутки времени. setting.alwaysmusic.name = Всегда играть музыку -setting.alwaysmusic.description = When enabled, music will always play on loop in-game.\nWhen disabled, it only plays at random intervals. + setting.skipcoreanimation.name = Пропускать анимацию запуска/приземления ядра setting.landscape.name = Только альбомный (горизонтальный) режим setting.shadows.name = Тени @@ -1176,7 +1178,7 @@ setting.backgroundpause.name = Фоновая пауза setting.buildautopause.name = Автоматическая приостановка строительства setting.doubletapmine.name = Добыча руды двойным нажатием setting.commandmodehold.name = Удерживать для командования боевыми единицами -setting.distinctcontrolgroups.name = Limit One Control Group Per Unit +setting.distinctcontrolgroups.name = Ограничение на одну контрольную группу на единицу setting.modcrashdisable.name = Отключение модификаций после вылета при запуске setting.animatedwater.name = Анимированные поверхности setting.animatedshields.name = Анимированные щиты @@ -1225,7 +1227,7 @@ setting.mutesound.name = Заглушить звук setting.crashreport.name = Отправлять анонимные отчёты о вылетах setting.communityservers.name = Fetch Community Server List setting.savecreate.name = Автоматическое создание сохранений -setting.steampublichost.name = Public Game Visibility +setting.steampublichost.name = Видимость публичной игры setting.playerlimit.name = Ограничение игроков setting.chatopacity.name = Непрозрачность чата setting.lasersopacity.name = Непрозрачность лазеров энергоснабжения @@ -1246,7 +1248,7 @@ keybind.title = Настройка управления keybinds.mobile = [scarlet]Большинство комбинаций клавиш здесь не работает на мобильных устройствах. Поддерживается только базовое движение. category.general.name = Основное category.view.name = Просмотр -category.command.name = Unit Command +category.command.name = Командование единицой category.multiplayer.name = Сетевая игра category.blocks.name = Выбор блока placement.blockselectkeys = \n[lightgray]Клавиша: [{0}, @@ -2466,15 +2468,15 @@ lenum.shoot = Стрельба в определённую позицию. lenum.shootp = Стрельба в единицу/постройку с расчётом скорости. lenum.config = Конфигурация постройки, например, предмет сортировки. lenum.enabled = Включён ли блок. -laccess.currentammotype = Current ammo item/liquid of a turret. +laccess.currentammotype = Текущий боеприпас турели. laccess.color = Цвет осветителя. laccess.controller = Командующий единицей. Если единица управляется процессором, возвращает процессор. Если в строю, возвращает командующего.\nВ противном случае возвращает саму единицу. laccess.dead = Является ли единица/постройка неработающей или несуществующей. laccess.controlled = Возвращает:\n[accent]@ctrlProcessor[] если единица управляется процессором\n[accent]@ctrlPlayer[] если единица/постройка управляется игроком\n[accent]@ctrlFormation[] если единица в строю\nВ противном случае — 0. laccess.progress = Прогресс действия от 0 до 1. Возвращает прогресс производства, перезарядку турели или прогресс постройки. -laccess.speed = Максимальная скорость единицы, в тайлах/сек. -laccess.id = ID of a unit/block/item/liquid.\nThis is the inverse of the lookup operation. +laccess.speed = Максимальная скорость единицы, в плитках/сек. +laccess.id = Идентификатор единицы/блока/предмета/жидкости.\nЭто обратная операция поиска. lcategory.unknown = Неизвестно lcategory.unknown.description = Нет категории. lcategory.io = Ввод и вывод @@ -2589,7 +2591,7 @@ unitlocate.building = Переменная для записи обнаруже unitlocate.outx = Вывод X координаты. unitlocate.outy = Вывод Y координаты. unitlocate.group = Группа построек для поиска. -playsound.limit = If true, prevents this sound from playing\nif it has already been played in the same frame. +playsound.limit = Если значение равно true, предотвращает воспроизведение этого звука,\n если он уже воспроизводился в том же кадре. lenum.idle = Остановка движения, но продолжение строительства/копания.\nСостояние по умолчанию. lenum.stop = Остановка движения/копания/строительства. @@ -2597,7 +2599,7 @@ lenum.unbind = Полностью отключает управление лог lenum.move = Перемещение в определённую позицию. lenum.approach = Приближение к позиции с указанным радиусом. lenum.pathfind = Перемещение к точке появления врагов. -lenum.autopathfind = Automatically pathfinds to the nearest enemy core or drop point.\nThis is the same as standard wave enemy pathfinding. +lenum.autopathfind = Автоматический поиск пути к ближайшему вражескому ядру или точке высадки.\nЭто то же самое, что и стандартный поиск пути к врагу во время волны. lenum.target = Стрельба в определённую позицию. lenum.targetp = Стрельба в единицу/постройку с расчётом скорости. lenum.itemdrop = Сбрасывание предметов. @@ -2608,13 +2610,13 @@ lenum.payenter = Войти/приземлиться на грузовой бл lenum.flag = Числовой флаг единицы. lenum.mine = Копание в заданной позиции. lenum.build = Строительство блоков. -lenum.getblock = Fetch building, floor and block type at coordinates.\nUnit must be in range of the position, otherwise null is returned. +lenum.getblock = Получает тип постройки, пола и блока по заданным координатам.\nЕдиница должна быть в диапазоне позиции, иначе возвращается null. lenum.within = Проверка на нахождение единицы рядом с позицией. lenum.boost = Включение/выключение полёта. -lenum.flushtext = Flush print buffer's content to marker, if applicable.\nIf fetch is set to true, tries to fetch properties from map locale bundle or game's bundle. -lenum.texture = Texture name straight from game's texture atlas (using kebab-case naming style).\nIf printFlush is set to true, consumes text buffer content as text argument. -lenum.texturesize = Size of texture in tiles. Zero value scales marker width to original texture's size. -lenum.autoscale = Whether to scale marker corresponding to player's zoom level. -lenum.posi = Indexed position, used for line and quad markers with index zero being the first position. -lenum.uvi = Texture's position ranging from zero to one, used for quad markers. -lenum.colori = Indexed position, used for line and quad markers with index zero being the first color. +lenum.flushtext = Сбрасывает содержимое текстового буфера, если применимо. \nЕсли значение fetch равно true, пытаеся получить свойства из набора локали карты или набора локали игры. +lenum.texture = Имя текстуры прямо из атласа текстур игры (используя стиль написания с дефисами, например: build-tower) .\nЕсли printFlush имеет значение true, то в качестве текстового аргумента используется содержимое текстового буфера. +lenum.texturesize = Размер текстуры в плитках. Нулевое значение масштабирует ширину маркера до размера исходной текстуры. +lenum.autoscale = Масштабировать ли маркер в соответствии с уровнем масштабирования игрока. +lenum.posi = Индексированная позиция, используемая для линейных и квадратных маркеров с нулевым индексом в качестве первой позиции. +lenum.uvi = Положение текстуры в диапазоне от нуля до единицы, используется для квадратных маркеров. +lenum.colori = Индексируемая позиция, используемая для линейных и квадратных маркеров с нулевым индексом, являющимся первым цветом. From 14cf68b1d637a12de8f847088af2eec2fa6b7197 Mon Sep 17 00:00:00 2001 From: Github Actions Date: Thu, 6 Feb 2025 00:07:30 +0000 Subject: [PATCH 204/460] Automatic bundle update --- core/assets/bundles/bundle_ru.properties | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/core/assets/bundles/bundle_ru.properties b/core/assets/bundles/bundle_ru.properties index 262922edc8..10dd22ff1a 100644 --- a/core/assets/bundles/bundle_ru.properties +++ b/core/assets/bundles/bundle_ru.properties @@ -355,6 +355,7 @@ command.enterPayload = Войти в грузовой блок command.loadUnits = Загрузить единицы command.loadBlocks = Загрузить постройки command.unloadPayload = Выгрузить груз +command.loopPayload = Loop Unit Transfer stance.stop = Отменить команду stance.shoot = Положение: Стрелять stance.holdfire = Положение: Удерживать огонь @@ -1062,6 +1063,7 @@ ability.liquidexplode = Смертельное разлитие ability.liquidexplode.description = Разливает жидкость при смерти ability.stat.firingrate = [stat]{0}/сек[lightgray] темп стрельбы ability.stat.regen = [stat]{0}[lightgray] здоровья/сек +ability.stat.pulseregen = [stat]{0}[lightgray] health/pulse ability.stat.shield = [stat]{0}[lightgray] щит ability.stat.repairspeed = [stat]{0}/sec[lightgray] скорость регенерации ability.stat.slurpheal = [stat]{0}[lightgray] здоровья/единица жидкости @@ -1164,8 +1166,8 @@ category.items = Предметы category.crafting = Ввод/вывод category.function = Действие category.optional = Дополнительные улучшения -setting.alwaysmusic.description = Если включить эту функцию, музыка всегда будет воспроизводиться в игре по кругу.\nЕсли выключить, она будет воспроизводиться только через случайные промежутки времени. setting.alwaysmusic.name = Всегда играть музыку +setting.alwaysmusic.description = Если включить эту функцию, музыка всегда будет воспроизводиться в игре по кругу.\nЕсли выключить, она будет воспроизводиться только через случайные промежутки времени. setting.skipcoreanimation.name = Пропускать анимацию запуска/приземления ядра setting.landscape.name = Только альбомный (горизонтальный) режим From 760075216b86d355e2d29db013ff96eec88edf11 Mon Sep 17 00:00:00 2001 From: ninathedev <145730763+ninathedev@users.noreply.github.com> Date: Thu, 6 Feb 2025 00:08:38 +0000 Subject: [PATCH 205/460] Update bundle_fil.properties (#10164) not yet finished Co-authored-by: Anuken --- core/assets/bundles/bundle_fil.properties | 80 ++++++++++++----------- 1 file changed, 42 insertions(+), 38 deletions(-) diff --git a/core/assets/bundles/bundle_fil.properties b/core/assets/bundles/bundle_fil.properties index c8306bd9df..69dbe3457c 100644 --- a/core/assets/bundles/bundle_fil.properties +++ b/core/assets/bundles/bundle_fil.properties @@ -13,6 +13,7 @@ link.google-play.description = Listing sa Google Play Store link.f-droid.description = Catalogue listing sa F-Droid link.wiki.description = Opsiyal na ensiklopedya ng Mindustry link.suggestions.description = Magmungkahi ng mga bagong feature + link.bug.description = Nakahanap ng isang sira? Ipaulat dito! linkopen = Ang server na ito ay nagbigay ng isang link. Gusto mo ba na ibukas?\n\n[sky]{0} linkfail = Hindi mabuksan ang link!\nKinopya na sa iyong clipboard ang URL. @@ -152,13 +153,14 @@ mod.erroredcontent = [scarlet]Mga sira sa Nilalaman mod.circulardependencies = [red]Circular Dependencies mod.incompletedependencies = [red]Pagpapaasa ay hindi kompleto mod.requiresversion.details = Kailangan ng bersyon: [accent]{0}[]\nAng iyong laro ay hindi bago. Ang mod na ito ay kailangan ng bagong bersyon ng larong ito (pwedeng beta o alpha na bersyon) para gumana. -mod.outdatedv7.details = This mod is incompatible with the latest version of the game. The author must update it, and add [accent]minGameVersion: 136[] to its [accent]mod.json[] file. -mod.blacklisted.details = This mod has been manually blacklisted for causing crashes or other issues with this version of the game. Do not use it. -mod.missingdependencies.details = This mod is missing dependencies: {0} -mod.erroredcontent.details = This game caused errors when loading. Ask the mod author to fix them. -mod.circulardependencies.details = This mod has dependencies that depends on each other. -mod.incompletedependencies.details = This mod is unable to be loaded due to invalid or missing dependencies: {0}. -mod.requiresversion = Requires game version: [red]{0} +mod.outdatedv7.details = Ang mod na ito ay hindi tugma sa pinakabagong bersyon ng laro. Dapat itong i-update ng may-akda, at idagdag ang [accent]minGameVersion: 136[] sa [accent]mod.json[] file nito. +mod.blacklisted.details = Ang mod na ito ay manu-manong na-blacklist para sa pagdudulot ng mga pag-crash o iba pang isyu sa bersyong ito ng laro. Huwag gamitin ito. +mod.missingdependencies.details = Ang mod na ito ay walang mga dependencies: {0} +mod.erroredcontent.details = Nagdulot ng mga error ang larong ito kapag naglo-load. Hilingin sa may-akda ng mod na ayusin ang mga ito. +mod.circulardependencies.details = Ang mod na ito ay may mga dependency na umaasa sa isa't isa. +mod.incompletedependencies.details = Hindi ma-load ang mod na ito dahil sa di-wasto o nawawalang mga dependency: {0}. +mod.requiresversion = Nangangailangan ng bersyon ng laro: [red]{0} + mod.errors = May mga error na naitala habang ni-lo-load ang nilalaman. mod.noerrorplay = [scarlet]May mga mod kang may error.[] Maaaring 'wag munang paganahin ang mga apektadong mod o 'di kaya'y ayusin ang mga error bago maglaro. mod.nowdisabled = [scarlet]Ang mod na '{0}' ay ma kulang na mga dependency:[accent] {1}\n[lightgray]Ang mga ito'y kinakailangang i-download muna.\nAng mod na'to ay kusang 'di papaganahin. @@ -180,31 +182,33 @@ mod.scripts.disable = Ang device mo ay hindi sumusuporta ng mga mod na may iskri about.button = Tungkol name = Pangalan: noname = Pumili ng[accent] pangalan[] muna. -search = Search: -planetmap = Mapa ng Planeta +search = Maghanap: +planetmap = Mapa ng Planeta: + launchcore = I-Launch Ang Core -filename = File Name: +filename = Pangalan ng File: unlocked = Bagong content na na-unlock! available = Bagong research na available! unlock.incampaign = < I-unlock sa campaign para sa detalye > -campaign.select = Select Starting Campaign -campaign.none = [lightgray]Select a planet to start on.\nThis can be switched at any time. -campaign.erekir = Newer, more polished content. Mostly linear campaign progression.\n\nHigher quality maps and overall experience. -campaign.serpulo = Older content; the classic experience. More open-ended.\n\nPotentially unbalanced maps and campaign mechanics. Less polished. -campaign.difficulty = Difficulty -completed = [accent]Completed +campaign.select = Piliin ang Starting Campaign +campaign.none = [lightgray]Pumili ng planetang sisimulan.\nMaaari itong ilipat anumang oras. +campaign.erekir = Mas bago, mas pinakintab na content. Kadalasan ay linear na pag-unlad ng kampanya.\n\nMas mataas na kalidad at pangkalahatang karanasan. +campaign.serpulo = Mas lumang nilalaman; ang klasikong karanasan. Mas open-ended.\n\nPotensyal na hindi balanseng mga mapa at mechanics ng campaign. Hindi gaanong pulido. +completed = [accent]Nakumpleto + techtree = Tech Tree -techtree.select = Tech Tree Selection +techtree.select = Pagpili ng Tech Tree techtree.serpulo = Serpulo techtree.erekir = Erekir -research.load = I-Load -research.discard = I-Discard -research.list = [lightgray]Research: -research = Mga Research -researched = [lightgray]{0} researched. -research.progress = {0}% complete -players = {0} player -players.single = {0} player +research.load = Load +research.discard = Discard +research.list = [lightgray]Pananaliksik: +research = Pananaliksik +researched = [lightgray]{0} nagsaliksik. +research.progress = {0}% kumpleto +players = {0} manlalaro +players.single = {0} manlalaro + players.search = mag-search players.notfound = [gray]walang nahanap na players server.closing = [accent]Sinasarado ang server... @@ -212,8 +216,8 @@ server.kicked.kick = Sinipa ka mula sa server! server.kicked.whitelist = Hindi ka naka whitelist. server.kicked.serverClose = Ang server ay isinarado. server.kicked.vote = Na-vote-kick ka na. Paalam. -server.kicked.clientOutdated = Outdated client! I-Update yung laro mo! -server.kicked.serverOutdated = Outdated server! Hilingin sa host na mag-update! +server.kicked.clientOutdated = Outdated na kliyente! I-Update yung laro mo! +server.kicked.serverOutdated = Lumang server! Hilingin sa host na mag-update! server.kicked.banned = Ikaw ay pinagbawalan sa server na ito. server.kicked.typeMismatch = Ang server na ito ay hindi tugma sa iyong uri ng build. server.kicked.playerLimit = Puno na ang server na ito. maghintay ng libreng slot. @@ -222,25 +226,25 @@ server.kicked.nameInUse = May ganyang pangalan\nsa server na ito. server.kicked.nameEmpty = Invalid ang pangalan mo. server.kicked.idInUse = Nandito kana sa server, bawal mag-join gamit nang dalawan accounts. server.kicked.customClient = Hindi sinusuportahan ng server na ito ang mga custom na build. Mag-download ng opisyal na bersyon. -server.kicked.gameover = Game over! +server.kicked.gameover = Tapos na ang laro! server.kicked.serverRestarting = Nag rerestart ang server. -server.versions = Your version:[accent] {0}[]\nServer version:[accent] {1}[] -host.info = The [accent]host[] button hosts a server on port [scarlet]6567[]. \nAnybody on the same [lightgray]wifi or local network[] should be able to see your server in their server list.\n\nIf you want people to be able to connect from anywhere by IP, [accent]port forwarding[] is required.\n\n[lightgray]Note: If someone is experiencing trouble connecting to your LAN game, make sure you have allowed Mindustry access to your local network in your firewall settings. Note that public networks sometimes do not allow server discovery. -join.info = Dito, maaari mong ipasok ang isang [accent]server IP[] para ikonekta, o pag diskubre ng [accent]local network[] or [accent]global[] servers pwedeng konektahin.\nBoth LAN and WAN multiplayer is supported.\n\n[lightgray]If you want to connect to someone by IP, you would need to ask the host for their IP, which can be found by googling "my ip" from their device. -hostserver = Host Multiplayer Game +server.versions = Iyong bersyon:[accent] {0}[]\nBersyon ng server:[accent] {1}[] +host.info = Ang [accent]host[] button ay nagho-host ng server sa port [scarlet]6567[]. \nAng sinuman sa parehong [lightgray]wifi o lokal na network[] ay dapat na makita ang iyong server sa kanilang listahan ng server.\n\nKung gusto mong makakonekta ang mga tao mula sa kahit saan sa pamamagitan ng IP, [accent]port forwarding[] ay kinakailangan.\n\n[lightgray]Tandaan: Kung may nakakaranas ng problema sa pagkonekta sa iyong LAN game, tiyaking pinayagan mo ang Mindustry na ma-access ang iyong lokal na network sa iyong mga setting ng firewall. Tandaan na minsan ay hindi pinapayagan ng mga pampublikong network ang pagtuklas ng server. +join.info = Dito, maaari mong ipasok ang isang [accent]server IP[] para ikonekta, o pag diskubre ng [accent]local network[] or [accent]global[] servers pwedeng konektahin.\nBoth LAN and WAN multiplayer is supported.\n\n[lightgray]Kung gusto mong kumonekta sa isang tao sa pamamagitan ng IP, kakailanganin mong hilingin sa host ang kanilang IP, na makikita sa pamamagitan ng pag-googling sa "aking ip" mula sa kanilang device. +hostserver = Mag-host ng Multiplayer Game invitefriends = Mag-imbita ng mga kaibigan hostserver.mobile = Host\nGame host = Host hosting = [accent]Opening server... -hosts.refresh = Refresh -hosts.discovering = Discovering LAN games -hosts.discovering.any = Discovering games -server.refreshing = Refreshing server -hosts.none = [lightgray]walang nahanap na local games! +hosts.refresh = I-refresh +hosts.discovering = Pagtuklas ng mga LAN games... +hosts.discovering.any = Pagtuklas ng mga laro... +server.refreshing = Nagre-refresh ng server +hosts.none = [lightgray]Walang nahanap na local games! host.invalid = [scarlet]Hindi makakonekta sa Host. servers.local = Local Servers -servers.local.steam = Open Games & Local Servers +servers.local.steam = Buksan ang Mga Laro at Lokal na Server servers.remote = Remote Servers servers.global = Community Servers servers.disclaimer = Ang mga server ng komunidad ay [accent]hindi pagmamay-ari o kinokontrol[] ng developer.\n\nServers may contain user-generated content that is not appropriate for all ages. From 2711d8720682494c189104b651f13c9241977427 Mon Sep 17 00:00:00 2001 From: Github Actions Date: Thu, 6 Feb 2025 00:09:31 +0000 Subject: [PATCH 206/460] Automatic bundle update --- core/assets/bundles/bundle_fil.properties | 1 + 1 file changed, 1 insertion(+) diff --git a/core/assets/bundles/bundle_fil.properties b/core/assets/bundles/bundle_fil.properties index 69dbe3457c..c355367528 100644 --- a/core/assets/bundles/bundle_fil.properties +++ b/core/assets/bundles/bundle_fil.properties @@ -194,6 +194,7 @@ campaign.select = Piliin ang Starting Campaign campaign.none = [lightgray]Pumili ng planetang sisimulan.\nMaaari itong ilipat anumang oras. campaign.erekir = Mas bago, mas pinakintab na content. Kadalasan ay linear na pag-unlad ng kampanya.\n\nMas mataas na kalidad at pangkalahatang karanasan. campaign.serpulo = Mas lumang nilalaman; ang klasikong karanasan. Mas open-ended.\n\nPotensyal na hindi balanseng mga mapa at mechanics ng campaign. Hindi gaanong pulido. +campaign.difficulty = Difficulty completed = [accent]Nakumpleto techtree = Tech Tree From c5d3e50e71d9e43147171c0b3c06cb25d76dda8c Mon Sep 17 00:00:00 2001 From: DinoWattz <116862698+DinoWattz@users.noreply.github.com> Date: Wed, 5 Feb 2025 21:32:18 -0300 Subject: [PATCH 207/460] Update bundle_pt_BR.properties (#9096) * Update bundle_pt_BR.properties Missing words and grammar fixes * Update bundle_pt_BR.properties-fix --------- Co-authored-by: Anuken --- core/assets/bundles/bundle_pt_BR.properties | 323 ++++++++++---------- 1 file changed, 166 insertions(+), 157 deletions(-) diff --git a/core/assets/bundles/bundle_pt_BR.properties b/core/assets/bundles/bundle_pt_BR.properties index fc913d8f69..addbdc4fca 100644 --- a/core/assets/bundles/bundle_pt_BR.properties +++ b/core/assets/bundles/bundle_pt_BR.properties @@ -1,12 +1,12 @@ credits.text = Criado por [royal]Anuken[] - [sky]anukendev@gmail.com[] credits = Créditos -contributors = Tradutores e contribuidores +contributors = Tradutores e Contribuidores discord = Junte-se ao Discord do Mindustry! (Lá nós falamos em diversos idiomas!) link.discord.description = O Discord oficial do Mindustry link.reddit.description = O subreddit do Mindustry link.github.description = Código fonte do jogo. link.changelog.description = Lista de mudanças da atualização -link.dev-builds.description = Versões betas +link.dev-builds.description = Builds de desenvolvimento instáveis link.trello.description = Trello oficial para atualizações planejadas link.itch.io.description = Página do Itch.io com os downloads link.google-play.description = Página da Google Play store @@ -18,7 +18,7 @@ linkopen = Este servidor lhe enviou um link. Você tem certeza de que quer abri- linkfail = Falha ao abrir o link\nO Url foi copiado para a área de transferência. screenshot = Screenshot salva para {0} screenshot.invalid = Este mapa é grande demais, você pode estar potencialmente sem memória suficiente para captura de tela. -gameover = O núcleo foi destruído. +gameover = Fim de jogo. gameover.disconnect = Desconectado gameover.pvp = O time[accent] {0}[] ganhou! gameover.waiting = [accent]Esperando pelo próximo mapa... @@ -34,7 +34,7 @@ load.system = Sistema load.mod = Mods load.scripts = Scripts -be.update = Uma nova versão beta está disponível: +be.update = Uma nova versão de teste está disponível: be.update.confirm = Baixar e reiniciar o jogo agora? be.updating = Atualizando... be.ignore = Ignorar @@ -51,37 +51,38 @@ mods.browser.latest = mods.browser.releases = Versões mods.github.open = Repositório mods.github.open-release = Página da versão + mods.browser.sortdate = Ordenar por mais recente mods.browser.sortstars = Ordenar por estrelas schematic = Esquema -schematic.add = Salvar esquema +schematic.add = Salvar esquema... schematics = Esquemas -schematic.search = Search schematics... +schematic.search = Procurar esquemas... schematic.replace = Um esquema com esse nome já existe. Substituí-lo? schematic.exists = Um esquema com esse nome já existe. schematic.import = Importar esquema... -schematic.exportfile = Exportar arquivo -schematic.importfile = Importar arquivo -schematic.browseworkshop = Navegar pela oficina +schematic.exportfile = Exportar Arquivo +schematic.importfile = Importar Arquivo +schematic.browseworkshop = Navegar pela Oficina schematic.copy = Copiar para a área de transferência schematic.copy.import = Importar da área de transferência schematic.shareworkshop = Compartilhar na Oficina -schematic.flip = [accent][[{0}][]/[accent][[{1}][]: Virar o esquema +schematic.flip = [accent][[{0}][]/[accent][[{1}][]: Espelhar Esquema schematic.saved = Esquema salvo. schematic.delete.confirm = Esse esquema será apagado. Tem certeza? -schematic.edit = Edit Schematic +schematic.edit = Editar Esquema schematic.info = {0}x{1}, {2} blocos schematic.disabled = [scarlet]Esquemas desativados[]\nVocê não tem permissão para usar esquemas nesse [accent]mapa[] ou [accent]servidor. -schematic.tags = Tags: -schematic.edittags = Editar Tags -schematic.addtag = Adicionar Tag -schematic.texttag = Tag de Texto -schematic.icontag = Tag de Ícone -schematic.renametag = Renomear Tag +schematic.tags = Etiquetas: +schematic.edittags = Editar Etiquetas +schematic.addtag = Adicionar Etiqueta +schematic.texttag = Etiqueta de Texto +schematic.icontag = Etiqueta de Ícone +schematic.renametag = Renomear Etiqueta schematic.tagged = {0} tagged -schematic.tagdelconfirm = Deletar essa tag completamente? -schematic.tagexists = Essa tag já existe. +schematic.tagdelconfirm = Deletar essa etiqueta completamente? +schematic.tagexists = Essa etiqueta já existe. stats = Estatísticas stats.wave = Hordas Derrotadas @@ -92,20 +93,20 @@ stats.destroyed = Construções Destruídas stats.deconstructed = Construções Desconstruídas stats.playtime = Tempo Jogado -globalitems = [accent]Itens Globais -map.delete = Certeza que quer deletar o mapa "[accent]{0}[]"? -level.highscore = Melhor\npontuação: [accent] {0} +globalitems = [accent]Itens do Planeta +map.delete = Você tem certeza que quer deletar o mapa "[accent]{0}[]"? +level.highscore = Melhor pontuação: [accent]{0} level.select = Seleção de fase level.mode = Modo de jogo: -coreattack = < O núcleo está sob ataque! > -nearpoint = [[ [scarlet]SAIA DO PONTO DE SPAWN IMEDIATAMENTE[] ]\nAniquilação Iminente +coreattack = < O Núcleo está sob ataque! > +nearpoint = [[ [scarlet]SAIA DO PONTO DE QUEDA IMEDIATAMENTE[] ]\naniquilação iminente database = Banco de Dados do Núcleo database.button = Banco de Dados -savegame = Salvar jogo -loadgame = Carregar jogo -joingame = Entrar no jogo -customgame = Jogo customi-\nzado -newgame = Novo jogo +savegame = Salvar Jogo +loadgame = Carregar Jogo +joingame = Juntar-se ao Jogo +customgame = Jogo Customizado +newgame = Novo Jogo none = none.found = [lightgray] none.inmap = [lightgray] @@ -114,34 +115,34 @@ position = Posição close = Fechar website = Site quit = Sair -save.quit = Salvar e sair +save.quit = Salvar e Sair maps = Mapas maps.browse = Pesquisar mapas continue = Continuar maps.none = [lightgray]Nenhum mapa encontrado! invalid = Inválido pickcolor = Escolher Cor -preparingconfig = Preparando configuração -preparingcontent = Preparando conteúdo -uploadingcontent = Fazendo upload do conteúdo -uploadingpreviewfile = Fazendo upload do arquivo de pré-visualização -committingchanges = Enviando mudanças +preparingconfig = Preparando Configuração +preparingcontent = Preparando Conteúdo +uploadingcontent = Fazendo Upload do Conteúdo +uploadingpreviewfile = Fazendo Upload do Arquivo de Pré-visualização +committingchanges = Enviando Mudanças done = Feito feature.unsupported = Seu dispositivo não suporta este recurso. -mods.initfailed = [red]⚠[] A instância anterior do Mindustry falhou ao inicializar. Provavelmente causado por mods com problema.\n\nPara previnir um loop de crash, [red]todos os mods foram desativados.[] +mods.initfailed = [red]\u26A0[] A instância anterior do Mindustry falhou ao inicializar. Provavelmente causado por mods com problema.\n\nPara previnir um loop de crash, [red]todos os mods foram desativados.[] mods = Mods mods.none = [lightgray]Nenhum mod encontrado! -mods.guide = Guia de mods +mods.guide = Guia de Criar Mods mods.report = Reportar um Bug -mods.openfolder = Abrir pasta de mods -mods.viewcontent = Ver conteúdo +mods.openfolder = Abrir Pasta de Mods +mods.viewcontent = Ver Conteúdo mods.reload = Recarregar -mods.reloadexit = O jogo vai fechar, para poder recarregar os mods. +mods.reloadexit = O jogo agora irá fechar, para recarregar os mods. mod.installed = [[Instalado] mod.display = [gray]Mod:[orange] {0} mod.enabled = [lightgray]Ativado -mod.disabled = [scarlet]Desativado +mod.disabled = [red]Desativado mod.multiplayer.compatible = [gray]Compatível com Multiplayer mod.disable = Desati-\nvar mod.version = Version: @@ -152,25 +153,28 @@ mod.incompatiblemod = [red]Incompatível mod.blacklisted = [red]Não suportado mod.unmetdependencies = [red]Unmet Dependencies mod.erroredcontent = [scarlet]Erros no conteúdo -mod.circulardependencies = [red]Circular Dependencies -mod.incompletedependencies = [red]Incomplete Dependencies +mod.circulardependencies = [red]Dependências Mútuas +mod.incompletedependencies = [red]Dependências Incompletas + mod.requiresversion.details = Requer a versão do jogo: [accent]{0}[]\nSeu jogo está desatualizado. Este mod requer uma versão mais recente do jogo (possivelmente uma versão beta/alfa) para funcionar. mod.outdatedv7.details = Este mod é incompatível com a versão mais recente do jogo. O autor deve atualizá-lo e adicionar [accent]minGameVersion: 136[] ao seu arquivo [accent]mod.json[]. -mod.blacklisted.details = Este mod foi manualmente colocado na lista negra por causar falhas ou outros problemas com esta versão do jogo. Não use isso. -mod.missingdependencies.details = Este mod está sem dependências: {0} -mod.erroredcontent.details = Este jogo causou erros ao carregar. Peça ao autor do mod para corrigi-los. +mod.blacklisted.details = Este mod foi manualmente colocado na lista negra por causar falhas ou outros problemas com esta versão do jogo. Não use-o. +mod.missingdependencies.details = Este mod está com dependências ausentes: {0} +mod.erroredcontent.details = Este mod causou erros ao carregar. Peça ao autor do mod para corrigi-los. mod.circulardependencies.details = Este mod possui dependências que dependem umas das outras. mod.incompletedependencies.details = Este mod não pode ser carregado devido a dependências inválidas ou ausentes: {0}. + mod.requiresversion = Requer a versão do jogo: [red]{0} + mod.errors = Ocorreram erros ao carregar o conteúdo. mod.noerrorplay = [scarlet]Você tem mods com erros.[] Desative os mods afetados ou conserte os erros antes de jogar. mod.nowdisabled = [scarlet]O Mod '{0}' está com dependências ausentes:[accent] {1}\n[lightgray]Esses Mods precisam ser baixados primeiro.\nEsse Mod será desativado automaticamente. mod.enable = Ativar mod.requiresrestart = O jogo irá fechar para aplicar as mudanças do mod. -mod.reloadrequired = [scarlet]Recarregamento necessário -mod.import = Importar mod +mod.reloadrequired = [scarlet]Recarregamento Necessário +mod.import = Importar Mod mod.import.file = Importar Arquivo -mod.import.github = Importar mod do GitHub +mod.import.github = Importar Mod do GitHub mod.jarwarn = [scarlet]Mods JAR são altamente inseguros.[]\nTenha certeza que esse mod tenha uma fonte confiável! mod.item.remove = Este item é parte do mod[accent] '{0}'[]. Para removê-lo, desinstale esse mod. mod.remove.confirm = Este mod será deletado. @@ -185,16 +189,16 @@ name = Nome: noname = Escolha[accent] um nome[] primeiro. search = Procurar: planetmap = Mapa do Planeta -launchcore = Lançar núcleo -filename = Nome do arquivo: -unlocked = Novo bloco desbloqueado! +launchcore = Lançar Núcleo +filename = Nome do Arquivo: +unlocked = Novo conteúdo desbloqueado! available = Nova pesquisa disponível! unlock.incampaign = < Desbloqueie na campanha para mais detalhes > -campaign.select = Selecione a campanha inicial -campaign.none = [lightgray]Selecione um planeta para começar nele.\nVocê pode mudar de planeta a qualquer momento. -campaign.erekir = Novo, conteúdo mais polido. Uma progressão mais linear na campanha.\n\nExperiência geral e mapas de maior qualidade. -campaign.serpulo = Conteúdo antigo; a experiência clássica. Mais aberto.\n\nMapas e mecânicas de campanha potencialmente desbalanceados. Menos polido. -campaign.difficulty = Difficulty +campaign.select = Selecione uma Campanha Inicial +campaign.none = [lightgray]Selecione um planeta para começar.\nIsso pode ser alterado a qualquer momento. +campaign.erekir = Conteúdo mais novo e mais polido. Progressão de campanha principalmente linear.\n\nMapas de maior qualidade e experiência geral. +campaign.serpulo = Conteúdo mais antigo; a experiência clássica. Mais aberto, mais conteúdo.\n\nMapas e mecânicas de campanha potencialmente desbalanceados. Menos polido. + completed = [accent]Completado techtree = Árvore Tecnológica techtree.select = Seleção de Árvore Tecnológica @@ -212,7 +216,7 @@ players.search = Procurar players.notfound = [gray]Nenhum jogador encontrado server.closing = [accent]Fechando servidor... server.kicked.kick = Você foi expulso do servidor! -server.kicked.whitelist = Você não está na whitelist do servidor. +server.kicked.whitelist = Você não está na lista branca do servidor. server.kicked.serverClose = Servidor fechado. server.kicked.vote = Você foi expulso desse servidor. Adeus. server.kicked.clientOutdated = Cliente desatualizado! Atualize seu jogo! @@ -230,9 +234,9 @@ server.kicked.serverRestarting = O servidor esta reiniciando. server.versions = Sua versão:[accent] {0}[]\nVersão do servidor:[accent] {1}[] host.info = O botão de [accent]Hospedar[] hospeda um servidor no Host[scarlet]6567[] e [scarlet]6568.[]\nQualquer um no [lightgray]Wi-fi ou internet local[] pode ver este servidor na lista de servidores.\n\nSe você quiser poder entrar em qualquer servidor em seu ip, [accent]port forwarding[] é necessário.\n\n[lightgray]Nota: Se alguém está com problemas em conectar no seu servidor lan, tenha certeza que mindustry tem acesso a sua internet local nas configurações do seu firewall join.info = Aqui, você pode entar em um [accent]IP de servidor[] para conectar, ou descobrir [accent]servidores[] da rede local.\nAmbos os servidores LAN e WAN são suportados.\n\n[lightgray]Nota: Não há uma lista de servidores automáticos; Se você quiser se conectar ao IP de alguém, você precisa pedir o IP ao anfitrião. -hostserver = Hospedar servidor -invitefriends = Convidar amigos -hostserver.mobile = Hospedar\nJogo +hostserver = Hospedar Partida Multijogador +invitefriends = Convidar Amigos +hostserver.mobile = Hospedar Partida host = Hospedar hosting = [accent]Abrindo servidor... hosts.refresh = Recarregar @@ -242,54 +246,56 @@ server.refreshing = Atualizando servidor hosts.none = [lightgray]Nenhum jogo LAN encontrado! host.invalid = [scarlet]Não foi possivel hospedar -servers.local = Servidores locais -servers.local.steam = Jogos públicos e servidores locais -servers.remote = Servidores remotos -servers.global = Servidores da comunidade +servers.local = Servidores Locais +servers.local.steam = Jogos Públicos e Servidores Locais +servers.remote = Servidores Remotos +servers.global = Servidores da Comunidade servers.disclaimer = Servidores da comunidade [accent]não[] controlados pelo desenvolvedor.\n\nOs servidores podem conter conteúdo não apropriado para todas as idades. -servers.showhidden = Mostrar servidores escondidos +servers.showhidden = Mostrar servidores ocultos server.shown = Mostrar -server.hidden = Esconder +server.hidden = Ocultar -viewplayer = Vendo o Player: [accent]{0} -trace = Rastrear jogador +viewplayer = Vendo o Jogador: [accent]{0} +trace = Rastrear Jogador trace.playername = Nome do jogador: [accent]{0} trace.ip = IP: [accent]{0} trace.id = ID: [accent]{0} -trace.language = Language: [accent]{0} -trace.mobile = Cliente móvel: [accent]{0} -trace.modclient = Cliente customizado: [accent]{0} -trace.times.joined = Vezes que entrou: [accent]{0} -trace.times.kicked = Vezes que foi expulso: [accent]{0} +trace.language = Idioma: [accent]{0} +trace.mobile = Cliente Móvel: [accent]{0} +trace.modclient = Cliente Customizado: [accent]{0} +trace.times.joined = Vezes que se Juntou: [accent]{0} +trace.times.kicked = Vezes que foi Expulso: [accent]{0} trace.ips = IPs: trace.names = Names: invalidid = ID do cliente invalido! Reporte o bug + player.ban = Banir -player.kick = Chutar +player.kick = Expulsar player.trace = Rastrear player.admin = Alternar Admin -player.team = Trocar time +player.team = Trocar Time + server.bans = Banidos server.bans.none = Nenhum jogador banido encontrado! server.admins = Administradores server.admins.none = Nenhum administrador encontrado! server.add = Adicionar servidor -server.delete = Certeza que quer deletar o servidor? -server.edit = Editar servidor -server.outdated = [crimson]Servidor desatualizado![] -server.outdated.client = [crimson]Cliente desatualizado![] -server.version = [lightgray]Versão: {0} -server.custombuild = [accent]Versão customizada -confirmban = Certeza que quer banir "{0}[white]"? -confirmkick = Certeza que quer expulsar "{0}[white]"? -confirmunban = Certeza que quer desbanir este jogador? -confirmadmin = Certeza que quer fazer "{0}[white]" um administrador? -confirmunadmin = Certeza que quer remover o status de adminstrador do "{0}[white]"? -votekick.reason = Motivo para chutar por voto -votekick.reason.message = Tem certeza de que deseja chutar por voto "{0}[white]"?\nSe sim, digite o motivo: -joingame.title = Entrar no jogo -joingame.ip = IP: +server.delete = Você tem certeza que quer deletar esse servidor? +server.edit = Editar Servidor +server.outdated = [scarlet]Servidor Desatualizado![] +server.outdated.client = [scarlet]Cliente Desatualizado![] +server.version = [gray]v{0} {1} +server.custombuild = [accent]Versão Customizada +confirmban = Você tem certeza que quer banir "{0}[white]"? +confirmkick = Você tem certeza que quer expulsar "{0}[white]"? +confirmunban = Você tem certeza que quer desbanir este jogador? +confirmadmin = Você tem certeza que quer fazer "{0}[white]" um administrador? +confirmunadmin = Você tem certeza que quer remover o status de adminstrador do "{0}[white]"? +votekick.reason = Motivo para expulsar por votação +votekick.reason.message = Tem certeza de que deseja expulsar "{0}[white]" por votação?\nSe sim, digite o motivo: +joingame.title = Juntar-se ao jogo +joingame.ip = Endereço IP: disconnect = Desconectado. disconnect.error = Erro de conexão. disconnect.closed = Conexão fechada. @@ -301,29 +307,30 @@ connecting = [accent]Conectando... reconnecting = [accent]Reconectando... connecting.data = [accent]Carregando dados do mundo... server.port = Porta: -server.invalidport = Numero de port inválido! -server.error.addressinuse = [scarlet]Failed to open server on port 6567.[]\n\nMake sure no other Mindustry servers are running on your device or network! -server.error = [crimson]Erro ao hospedar o servidor: [accent]{0} -save.new = Novo save -save.overwrite = Você tem certeza que quer sobrescrever este save? -save.nocampaign = Arquivos salvos individuais da campanha não podem ser importados. +server.addressinuse = Endereço já em uso! +server.invalidport = Numero de porta inválido! +server.error = [scarlet]Erro ao hospedar o servidor. +save.new = Novo Jogo Salvo +save.overwrite = Você tem certeza que quer sobrescrever este jogo salvo? +save.nocampaign = Arquivos de jogos salvos individuais da campanha não podem ser importados. + overwrite = Sobrescrever -save.none = Nenhum save encontrado! +save.none = Nenhum jogo salvo encontrado! savefail = Falha ao salvar jogo! -save.delete.confirm = Certeza que quer deletar este save? +save.delete.confirm = Certeza que quer deletar este jogo salvo? save.delete = Deletar -save.export = Exportar save -save.import.invalid = [accent]Este save é inválido! -save.import.fail = [crimson]Falha ao importar save: [accent]{0} -save.export.fail = [crimson]Falha ao exportar save: [accent]{0} -save.import = Importar save -save.newslot = Nome do save: +save.export = Exportar Jogo Salvo +save.import.invalid = [accent]Este jogo salvo é inválido! +save.import.fail = [crimson]Falha ao importar jogo salvo: [accent]{0} +save.export.fail = [crimson]Falha ao exportar jogo salvo: [accent]{0} +save.import = Importar jogo salvo +save.newslot = Nome do jogo salvo: save.rename = Renomear -save.rename.text = Novo jogo: -selectslot = Selecione um lugar para salvar. +save.rename.text = Novo nome: +selectslot = Selecione um jogo salvo. slot = [accent]Slot {0} -editmessage = Editar mensagem -save.corrupted = [accent]Save corrompido ou inválido! +editmessage = Editar Mensagem +save.corrupted = [accent]Jogo salvo corrompido ou inválido! empty = on = Ligado off = Desligado @@ -332,87 +339,89 @@ save.autosave = Salvar automaticamente: {0} save.map = Mapa: {0} save.wave = Horda {0} save.mode = Modo de jogo: {0} -save.date = Último salvamento: {0} +save.date = Último Salvamento: {0} save.playtime = Tempo de jogo: {0} warning = Aviso. confirm = Confirmar delete = Excluir -view.workshop = Ver na oficina -workshop.listing = Editar a lista da oficina -ok = OK +view.workshop = Ver na Oficina +workshop.listing = Editar a Lista da Oficina +ok = Certo open = Abrir -customize = Customizar +customize = Customizar Regras cancel = Cancelar command = Comando -command.queue = [lightgray][Queuing] +command.queue = Fila command.mine = Minerar command.repair = Reparar command.rebuild = Reconstruir -command.assist = Assist Player +command.assist = Auxiliar Jogador command.move = Mover -command.boost = Boost -command.enterPayload = Enter Payload Block -command.loadUnits = Load Units -command.loadBlocks = Load Blocks -command.unloadPayload = Unload Payload -command.loopPayload = Loop Unit Transfer -stance.stop = Cancel Orders -stance.shoot = Stance: Shoot -stance.holdfire = Stance: Hold Fire -stance.pursuetarget = Stance: Pursue Target -stance.patrol = Stance: Patrol Path -stance.ram = Stance: Ram\n[lightgray]Straight line movement, no pathfinding + +command.boost = Impulso +command.enterPayload = Inserir Bloco de Carga útil +command.loadUnits = Carregar Unidades +command.loadBlocks = Carregar Blocos +command.unloadPayload = Descarregar Carga +stance.stop = Cancelar Ordens +stance.shoot = Modo: Atirar +stance.holdfire = Modo: Cessar Fogo +stance.pursuetarget = Modo: Perseguir Alvo +stance.patrol = Modo: Patrulhar Caminho +stance.ram = Modo: Vagar\n[lightgray]Andar em linha reta, ignorando o terreno + openlink = Abrir Link -copylink = Copiar link +copylink = Copiar Link back = Voltar max = Máximo objective = Objetivo do Mapa -crash.export = Exportar Históricos de Crashes. -crash.none = Nenhum Histórico de Crashes Encontrado. -crash.exported = Históricos de Crashes Exportado. -data.export = Exportar dados -data.import = Importar dados -data.openfolder = Abrir pasta de dados +crash.export = Exportar Logs de Crashes +crash.none = Nenhum logs de Crashes Encontrado. +crash.exported = Logs de Crashes Exportado. +data.export = Exportar Dados +data.import = Importar Dados +data.openfolder = Abrir Pasta de Dados data.exported = Dados exportados. -data.invalid = Estes dados de jogo não são válidos. -data.import.confirm = Importar dados externos irá deletar[scarlet] todos[] os seus dados atuais.\n[accent]Isso não pode ser desfeito![]\n\nQuando seus dados serão importados, seu jogo irá sair imediatamente. +data.invalid = Esse dados de jogo não são válidos. +data.import.confirm = Importar dados externos irá deletar[scarlet] todos[] os seus dados atuais.\n[accent]Isso não pode ser desfeito![]\n\nQuando seus dados serão importados, seu jogo irá fechar imediatamente. quit.confirm = Você tem certeza que quer sair? loading = [accent]Carregando... downloading = [accent]Baixando... saving = [accent]Salvando... -respawn = [accent][[{0}][] para nascer no núcleo +respawn = [accent][[{0}][] para renascer cancelbuilding = [accent][[{0}][] para cancelar a construção selectschematic = [accent][[{0}][] para selecionar + copiar -pausebuilding = [accent][[{0}][] para parar a construção +pausebuilding = [accent][[{0}][] para pausar a construção resumebuilding = [scarlet][[{0}][] para continuar a construção enablebuilding = [scarlet][[{0}][] para habilitar construção -showui = Interface escondida.\nPressione [accent][[{0}][] para mostrar a interface. -commandmode.name = [accent]Modo de comando -commandmode.nounits = [nenhuma unidade] +showui = Interface oculta.\nPressione [accent][[{0}][] para exibir a interface. +commandmode.name = [accent]Modo de Comando +commandmode.nounits = [sem unidades] + wave = [accent]Horda {0} wave.cap = [accent]Horda {0}/{1} -wave.waiting = Proxima horda em {0} +wave.waiting = [lightgray]Próxima horda em {0} wave.waveInProgress = [lightgray]Horda em progresso -waiting = Esperando... +waiting = [lightgray]Esperando... waiting.players = Esperando por jogadores... -wave.enemies = [lightgray]{0} inimigos restantes -wave.enemycores = [accent]{0}[lightgray] núcleos inimigos -wave.enemycore = [accent]{0}[lightgray] núcleo inimigo -wave.enemy = [lightgray]{0} inimigo restante +wave.enemies = [lightgray]{0} Inimigos Restantes +wave.enemycores = [accent]{0}[lightgray] Núcleos Inimigos +wave.enemycore = [accent]{0}[lightgray] Núcleo Inimigo +wave.enemy = [lightgray]{0} Inimigo Restante wave.guardianwarn = Guardião se aproximando em [accent]{0}[] hordas. wave.guardianwarn.one = Guardião se aproximando em [accent]{0}[] horda. -loadimage = Carregar\nimagem -saveimage = Salvar\nimagem +loadimage = Carregar Imagem +saveimage = Salvar Imagem unknown = Desconhecido custom = Customizado -builtin = Padrão -map.delete.confirm = Certeza que quer deletar este mapa? Isto não pode ser anulado! -map.random = [accent]Mapa aleatório -map.nospawn = Este mapa não possui nenhum núcleo para o jogador nascer! Adicione um núcleo {0} para este mapa no editor. -map.nospawn.pvp = Esse mapa não tem núcleos inimigos para os jogadores nascerem! Adicione [scarlet]núcleos vermelhos[] no mapa no editor. -map.nospawn.attack = Esse mapa não tem nenhum núcleo inimigo para o jogador atacar! coloque {0} vermelhos no editor. +builtin = Embutido +map.delete.confirm = Você tem certeza que quer deletar este mapa? Isso não pode ser revertido! +map.random = [accent]Mapa Aleatório +map.nospawn = Este mapa não possui nenhum Núcleo para o jogador nascer! Adicione um Núcleo {0} para este mapa no editor. +map.nospawn.pvp = Esse mapa não tem Núcleos inimigos para os jogadores nascerem! Adicione [scarlet]Núcleos não-laranjas[] para este mapa no editor. +map.nospawn.attack = Esse mapa não tem nenhum Núcleo inimigo para o jogador atacar! Adicione um Núcleos {0} para este mapa no editor. map.invalid = Erro ao carregar o mapa: Arquivo de mapa invalido ou corrupto. -workshop.update = Atualizar item +workshop.update = Atualizar Item workshop.error = Erro buscando os detalhes da oficina: {0} map.publish.confirm = Você tem certeza de que quer publicar este mapa?\n\n[lightgray]Tenha certeza de que você concorda com o EULA da oficina primeiro, ou seus mapas não serão mostrados! workshop.menu = Selecione oquê você gostaria de fazer com esse item. From 8ed4f80043f2d7394717e20dbdb33797f47e25d9 Mon Sep 17 00:00:00 2001 From: Github Actions Date: Thu, 6 Feb 2025 00:33:03 +0000 Subject: [PATCH 208/460] Automatic bundle update --- core/assets/bundles/bundle_pt_BR.properties | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/core/assets/bundles/bundle_pt_BR.properties b/core/assets/bundles/bundle_pt_BR.properties index addbdc4fca..b60d5ea613 100644 --- a/core/assets/bundles/bundle_pt_BR.properties +++ b/core/assets/bundles/bundle_pt_BR.properties @@ -130,7 +130,7 @@ committingchanges = Enviando Mudanças done = Feito feature.unsupported = Seu dispositivo não suporta este recurso. -mods.initfailed = [red]\u26A0[] A instância anterior do Mindustry falhou ao inicializar. Provavelmente causado por mods com problema.\n\nPara previnir um loop de crash, [red]todos os mods foram desativados.[] +mods.initfailed = [red]⚠[] A instância anterior do Mindustry falhou ao inicializar. Provavelmente causado por mods com problema.\n\nPara previnir um loop de crash, [red]todos os mods foram desativados.[] mods = Mods mods.none = [lightgray]Nenhum mod encontrado! mods.guide = Guia de Criar Mods @@ -198,6 +198,7 @@ campaign.select = Selecione uma Campanha Inicial campaign.none = [lightgray]Selecione um planeta para começar.\nIsso pode ser alterado a qualquer momento. campaign.erekir = Conteúdo mais novo e mais polido. Progressão de campanha principalmente linear.\n\nMapas de maior qualidade e experiência geral. campaign.serpulo = Conteúdo mais antigo; a experiência clássica. Mais aberto, mais conteúdo.\n\nMapas e mecânicas de campanha potencialmente desbalanceados. Menos polido. +campaign.difficulty = Difficulty completed = [accent]Completado techtree = Árvore Tecnológica @@ -307,8 +308,8 @@ connecting = [accent]Conectando... reconnecting = [accent]Reconectando... connecting.data = [accent]Carregando dados do mundo... server.port = Porta: -server.addressinuse = Endereço já em uso! server.invalidport = Numero de porta inválido! +server.error.addressinuse = [scarlet]Failed to open server on port 6567.[]\n\nMake sure no other Mindustry servers are running on your device or network! server.error = [scarlet]Erro ao hospedar o servidor. save.new = Novo Jogo Salvo save.overwrite = Você tem certeza que quer sobrescrever este jogo salvo? @@ -363,6 +364,7 @@ command.enterPayload = Inserir Bloco de Carga útil command.loadUnits = Carregar Unidades command.loadBlocks = Carregar Blocos command.unloadPayload = Descarregar Carga +command.loopPayload = Loop Unit Transfer stance.stop = Cancelar Ordens stance.shoot = Modo: Atirar stance.holdfire = Modo: Cessar Fogo From 108b101669dc14edd4ac4c853a12be5678114190 Mon Sep 17 00:00:00 2001 From: BlackDeluxeCat <65377021+BlackDeluxeCat@users.noreply.github.com> Date: Thu, 6 Feb 2025 08:36:26 +0800 Subject: [PATCH 209/460] Logic sensor accesses more infos of payload (#8766) * Added Logic Sense Payload * Update UnitComp.java --------- Co-authored-by: Anuken --- .../mindustry/entities/comp/BuildingComp.java | 4 +++ .../src/mindustry/entities/comp/UnitComp.java | 12 ++++++++ core/src/mindustry/logic/LAccess.java | 2 ++ core/src/mindustry/logic/LStatements.java | 28 +++++++++++++++++-- .../world/blocks/payloads/PayloadBlock.java | 8 ++++++ .../blocks/payloads/PayloadDeconstructor.java | 8 ++++++ 6 files changed, 60 insertions(+), 2 deletions(-) diff --git a/core/src/mindustry/entities/comp/BuildingComp.java b/core/src/mindustry/entities/comp/BuildingComp.java index 722fad3542..5fe15f9698 100644 --- a/core/src/mindustry/entities/comp/BuildingComp.java +++ b/core/src/mindustry/entities/comp/BuildingComp.java @@ -1988,6 +1988,10 @@ abstract class BuildingComp implements Posc, Teamc, Healthc, Buildingc, Timerc, public double sense(Content content){ if(content instanceof Item i && items != null) return items.get(i); if(content instanceof Liquid l && liquids != null) return liquids.get(l); + if(getPayloads() != null){ + if(content instanceof UnitType u) return getPayloads().get(u); + if(content instanceof Block b) return getPayloads().get(b); + } return Float.NaN; //invalid sense } diff --git a/core/src/mindustry/entities/comp/UnitComp.java b/core/src/mindustry/entities/comp/UnitComp.java index bfbb28c18e..f1a42e7a29 100644 --- a/core/src/mindustry/entities/comp/UnitComp.java +++ b/core/src/mindustry/entities/comp/UnitComp.java @@ -241,6 +241,8 @@ abstract class UnitComp implements Healthc, Physicsc, Hitboxc, Statusc, Teamc, I controller instanceof CommandAI command && command.hasCommand() ? ctrlCommand : 0; case payloadCount -> ((Object)this) instanceof Payloadc pay ? pay.payloads().size : 0; + case totalPayload -> ((Object)this) instanceof Payloadc pay ? pay.payloadUsed() : 0; + case payloadCapacity -> type.payloadCapacity; case size -> hitSize / tilesize; case color -> Color.toDoubleBits(team.color.r, team.color.g, team.color.b, 1f); default -> Float.NaN; @@ -265,6 +267,16 @@ abstract class UnitComp implements Healthc, Physicsc, Hitboxc, Statusc, Teamc, I @Override public double sense(Content content){ if(content == stack().item) return stack().amount; + if(content instanceof UnitType u){ + return ((Object)this) instanceof Payloadc pay ? + (pay.payloads().isEmpty() ? 0 : + pay.payloads().count(p -> p instanceof UnitPayload up && up.unit.type == u)) : 0; + } + if(content instanceof Block b){ + return ((Object)this) instanceof Payloadc pay ? + (pay.payloads().isEmpty() ? 0 : + pay.payloads().count(p -> p instanceof BuildPayload bp && bp.build.block == b)) : 0; + } return Float.NaN; } diff --git a/core/src/mindustry/logic/LAccess.java b/core/src/mindustry/logic/LAccess.java index a4d242e27c..94b57c73ac 100644 --- a/core/src/mindustry/logic/LAccess.java +++ b/core/src/mindustry/logic/LAccess.java @@ -55,6 +55,8 @@ public enum LAccess{ name, payloadCount, payloadType, + totalPayload, + payloadCapacity, id, //values with parameters are considered controllable diff --git a/core/src/mindustry/logic/LStatements.java b/core/src/mindustry/logic/LStatements.java index 223b1a7079..078e997786 100644 --- a/core/src/mindustry/logic/LStatements.java +++ b/core/src/mindustry/logic/LStatements.java @@ -19,6 +19,7 @@ import mindustry.logic.LExecutor.*; import mindustry.logic.LogicFx.*; import mindustry.type.*; import mindustry.ui.*; +import mindustry.world.*; import mindustry.world.meta.*; import static mindustry.Vars.*; @@ -614,6 +615,29 @@ public class LStatements{ if(++c % 6 == 0) i.row(); } }), + new Table(i -> { + i.left(); + int c = 0; + for(UnitType item : Vars.content.units()){ + if(!item.unlockedNow() || item.hidden) continue; + i.button(new TextureRegionDrawable(item.uiIcon), Styles.flati, iconSmall, () -> { + stype("@" + item.name); + hide.run(); + }).size(40f); + + if(++c % 6 == 0) i.row(); + } + + for(Block item : Vars.content.blocks()){ + if(!item.unlockedNow() || item.isHidden()) continue; + i.button(new TextureRegionDrawable(item.uiIcon), Styles.flati, iconSmall, () -> { + stype("@" + item.name); + hide.run(); + }).size(40f); + + if(++c % 6 == 0) i.row(); + } + }), //sensors new Table(i -> { for(LAccess sensor : LAccess.senseable){ @@ -625,7 +649,7 @@ public class LStatements{ }) }; - Drawable[] icons = {Icon.box, Icon.liquid, Icon.tree}; + Drawable[] icons = {Icon.box, Icon.liquid, Icon.units, Icon.tree}; Stack stack = new Stack(tables[selected]); ButtonGroup