diff --git a/.github/Mindustry-CodeStyle-IJ.xml b/.github/Mindustry-CodeStyle-IJ.xml
index 94486ff95b..e63661b6d3 100644
--- a/.github/Mindustry-CodeStyle-IJ.xml
+++ b/.github/Mindustry-CodeStyle-IJ.xml
@@ -82,4 +82,4 @@
-
\ No newline at end of file
+
diff --git a/.gitignore b/.gitignore
index 8017b41b6f..cbefe8fd20 100644
--- a/.gitignore
+++ b/.gitignore
@@ -18,6 +18,7 @@ logs/
/annotations/out/
/net/build/
/tools/build/
+/core/build/
/tests/build/
/server/build/
changelog
diff --git a/android/build.gradle b/android/build.gradle
index 015656f543..e82a957ba5 100644
--- a/android/build.gradle
+++ b/android/build.gradle
@@ -162,4 +162,4 @@ task run(type: Exec){
def adb = path + "/platform-tools/adb"
commandLine "$adb", 'shell', 'am', 'start', '-n', 'io.anuke.mindustry/mindustry.android.AndroidLauncher'
-}
\ No newline at end of file
+}
diff --git a/android/res/mipmap-anydpi-v26/ic_launcher.xml b/android/res/mipmap-anydpi-v26/ic_launcher.xml
index 4ae7d12378..cb73a95729 100644
--- a/android/res/mipmap-anydpi-v26/ic_launcher.xml
+++ b/android/res/mipmap-anydpi-v26/ic_launcher.xml
@@ -2,4 +2,4 @@
-
\ No newline at end of file
+
diff --git a/android/res/mipmap-anydpi-v26/ic_launcher_round.xml b/android/res/mipmap-anydpi-v26/ic_launcher_round.xml
index 4ae7d12378..cb73a95729 100644
--- a/android/res/mipmap-anydpi-v26/ic_launcher_round.xml
+++ b/android/res/mipmap-anydpi-v26/ic_launcher_round.xml
@@ -2,4 +2,4 @@
-
\ No newline at end of file
+
diff --git a/android/res/values-v21/styles.xml b/android/res/values-v21/styles.xml
index 699b6a05d7..e1bed057f8 100644
--- a/android/res/values-v21/styles.xml
+++ b/android/res/values-v21/styles.xml
@@ -8,4 +8,4 @@
@nulltrue
-
\ No newline at end of file
+
diff --git a/android/res/values/strings.xml b/android/res/values/strings.xml
index b77280e581..d40cf3accd 100644
--- a/android/res/values/strings.xml
+++ b/android/res/values/strings.xml
@@ -3,4 +3,4 @@
Mindustry
-
\ No newline at end of file
+
diff --git a/android/res/xml/backup_rules.xml b/android/res/xml/backup_rules.xml
index bfa7569b2e..072948235f 100644
--- a/android/res/xml/backup_rules.xml
+++ b/android/res/xml/backup_rules.xml
@@ -1,4 +1,4 @@
-
\ No newline at end of file
+
diff --git a/android/src/mindustry/android/AndroidLauncher.java b/android/src/mindustry/android/AndroidLauncher.java
index 2070f7c93b..4b0d7d25a1 100644
--- a/android/src/mindustry/android/AndroidLauncher.java
+++ b/android/src/mindustry/android/AndroidLauncher.java
@@ -81,7 +81,7 @@ public class AndroidLauncher extends AndroidApplication{
if(VERSION.SDK_INT >= VERSION_CODES.Q){
Intent intent = new Intent(open ? Intent.ACTION_OPEN_DOCUMENT : Intent.ACTION_CREATE_DOCUMENT);
intent.addCategory(Intent.CATEGORY_OPENABLE);
- intent.setType(extension.equals("zip") ? "application/zip" : "*/*");
+ intent.setType(extension.equals("zip") && !open ? "application/zip" : "*/*");
addResultListener(i -> startActivityForResult(intent, i), (code, in) -> {
if(code == Activity.RESULT_OK && in != null && in.getData() != null){
Uri uri = in.getData();
diff --git a/core/assets-raw/fontgen/config.json b/core/assets-raw/fontgen/config.json
index e5034e70fe..f2421542a9 100644
--- a/core/assets-raw/fontgen/config.json
+++ b/core/assets-raw/fontgen/config.json
@@ -921,4 +921,4 @@
"src": "fontawesome"
}
]
-}
\ No newline at end of file
+}
diff --git a/core/assets/bundles/bundle.properties b/core/assets/bundles/bundle.properties
index e8454ca944..50be8764ba 100644
--- a/core/assets/bundles/bundle.properties
+++ b/core/assets/bundles/bundle.properties
@@ -172,6 +172,11 @@ hosts.discovering.any = Discovering games
server.refreshing = Refreshing server
hosts.none = [lightgray]No local games found!
host.invalid = [scarlet]Can't connect to host.
+
+servers.local = Local Servers
+servers.remote = Remote Servers
+servers.global = Global Servers
+
trace = Trace Player
trace.playername = Player name: [accent]{0}
trace.ip = IP: [accent]{0}
diff --git a/core/assets/bundles/bundle_cs.properties b/core/assets/bundles/bundle_cs.properties
index 9249b5d1f5..a490645d52 100644
--- a/core/assets/bundles/bundle_cs.properties
+++ b/core/assets/bundles/bundle_cs.properties
@@ -1254,4 +1254,4 @@ block.omega-mech-pad.description = Umožňuje přeměnu Tvého vozidla na těžc
block.javelin-ship-pad.description = Umožňuje přeměnu Tvého vozidla na rychlou, lehce obrněnou stíhačku.\nAktivuj kliknutím nebo ťupnutím, když se nacházíš nad plošinou.
block.trident-ship-pad.description = Umožňuje přeměnu Tvého vozidla na těžkého podpůrného bombardéra.\nAktivuj kliknutím nebo ťupnutím, když se nacházíš nad plošinou.
block.glaive-ship-pad.description = Umožňuje přeměnu Tvého vozidla na velkou, dobře obrněnou střeleckou loď.\nAktivuj kliknutím nebo ťupnutím, když se nacházíš nad plošinou.
-
\ No newline at end of file
+
diff --git a/core/assets/bundles/bundle_de.properties b/core/assets/bundles/bundle_de.properties
index f61896411f..0a3b80f76c 100644
--- a/core/assets/bundles/bundle_de.properties
+++ b/core/assets/bundles/bundle_de.properties
@@ -1,27 +1,27 @@
credits.text = Entwickelt von [ROYAL]Anuken[] - [SKY]anukendev@gmail.com[]\n\n[GRAY]
credits = Danksagungen
contributors = Übersetzer und Mitwirkende
-discord = Tritt dem Mindustry Discord bei!
-link.discord.description = Der offizielle Mindustry Discord-Server
+discord = Tritt dem Mindustry-Discord bei!
+link.discord.description = Der offizielle Mindustry Discord-Chatroom
link.reddit.description = Der Mindustry Subreddit
link.github.description = Quellcode des Spiels
link.changelog.description = Liste der Änderungen
link.dev-builds.description = Entwicklungs-Builds (instabil)
-link.trello.description = Offizielles Trello Board für geplante Features
+link.trello.description = Offizielles Trello-Board für geplante Features
link.itch.io.description = itch.io-Seite mit Downloads und der Web-Version des Spiels
-link.google-play.description = Google Play Store Seite
+link.google-play.description = Google Play Store-Seite
link.f-droid.description = F-Droid catalogue listing
-link.wiki.description = Offizelles Mindustry Wiki
+link.wiki.description = Offizelles Mindustry-Wiki
link.feathub.description = Suggest new features
linkfail = Fehler beim Öffnen des Links!\nDie URL wurde in die Zwischenablage kopiert.
-screenshot = Screenshot gespeichert nach {0}
+screenshot = Screenshot gespeichert unter {0}.
screenshot.invalid = Karte zu groß! Eventuell nicht ausreichend Arbeitsspeicher für Screenshot.
gameover = Der Kern wurde zerstört.
gameover.pvp = Das[accent] {0}[] Team ist siegreich!
highscore = [YELLOW] Neuer Highscore!
copied = Kopiert.
-load.sound = Sounds
+load.sound = Audio
load.map = Karten
load.image = Bilder
load.content = Inhalt
@@ -39,17 +39,17 @@ be.check = Check for updates
schematic = Entwürfe
schematic.add = Entwurf speichern...
schematics = Entwürfe
-schematic.replace = Ein anderer Entwurf hat bereits diesen Namen. Diesen Ersetzen?
+schematic.replace = Ein anderer Entwurf hat bereits diesen Namen. Diesen ersetzen?
schematic.import = Entwurf importieren...
-schematic.exportfile = Entwurf exportieren
-schematic.importfile = Detei importieren
-schematic.browseworkshop = Workshop erkunden
-schematic.copy = In Zwischenablage speichern
-schematic.copy.import = Aus Zwischenablage ziehen
+schematic.exportfile = Datei exportieren
+schematic.importfile = Datei importieren
+schematic.browseworkshop = Workshop durchsuchen
+schematic.copy = In Zwischenablage kopieren
+schematic.copy.import = Aus Zwischenablage importieren
schematic.shareworkshop = Im Workshop teilen
schematic.flip = [accent][[{0}][]/[accent][[{1}][]: Entwurf umkehren
schematic.saved = Entwurf gespeichert.
-schematic.delete.confirm = Dieser Entwurf wird absolut ausgelöscht.
+schematic.delete.confirm = Dieser Entwurf wird vollständig vernichtet.
schematic.rename = Entwurf umbenennen
schematic.info = {0}x{1}, {2} Blöcke
@@ -82,43 +82,43 @@ position = Position
close = Schließen
website = Website
quit = Verlassen
-save.quit = Speichern & Beenden
+save.quit = Speichern & Verlassen
maps = Karten
-maps.browse = Karten durschsuchen
+maps.browse = Karten durchsuchen
continue = Weiter
maps.none = [LIGHT_GRAY]Keine Karten gefunden!
-invalid = ungültig
+invalid = Ungültig
pickcolor = Pick Color
preparingconfig = Konfiguration vorbereiten
-preparingcontent = Inhalte vorbereiten
-uploadingcontent = Inhalte hochladen
-uploadingpreviewfile = Vorschau hochladen
-committingchanges = Veränderungen bestätigen
+preparingcontent = Inhalt vorbereiten
+uploadingcontent = Inhalt hochladen
+uploadingpreviewfile = Vorschaudatei hochladen
+committingchanges = Veränderungen übernehmen
done = Fertig
feature.unsupported = Dein System unsterstützt dieses Feature nicht.
-mods.alphainfo = Vergiss nicht, dass Mods in der Alpha sind, und sehr Fehlerhaft sein [scarlet]könnten[].\nSende alle Probleme an den Mindustry Github oder Discord.
+mods.alphainfo = Vergiss nicht, dass Mods in der Alpha sind, und[scarlet] sehr fehlerhaft sein können[].\nMelde alle Probleme an den Mindustry GitHub oder Discord.
mods.alpha = [accent](Alpha)
mods = Mods
mods.none = [LIGHT_GRAY]Keine Mods gefunden!
mods.guide = Modding Anleitung
-mods.report = Problem senden
-mods.openfolder = Mod Verzeichnis öffnen
+mods.report = Problem melden
+mods.openfolder = Mod-Verzeichnis öffnen
mod.enabled = [lightgray]Aktiviert
mod.disabled = [scarlet]Deaktiviert
mod.disable = Deaktivieren
mod.delete.error = Unfähig Mod zu löschen; Datei könnte in Benutzung sein.
mod.requiresversion = [scarlet]Requires min game version: [accent]{0}
-mod.missingdependencies = [scarlet]Fehldene Abhängigkeiten: {0}
+mod.missingdependencies = [scarlet]Fehlende Abhängigkeiten: {0}
mod.erroredcontent = [scarlet]Content Errors
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}' fehlt Abhängigkeiten:[accent] {1}\n[lightgray]Diese Mods müssen erst installiert werden.\nDieser Mod wird automatisch deaktiviert.
+mod.nowdisabled = [scarlet]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 schließt nun, um Modänderungen wirksam zu machen.
+mod.requiresrestart = Das Spiel wird jetzt beendet, um die Mod-Änderungen anzuwenden.
mod.reloadrequired = [scarlet]Neuladen benötigt
mod.import = Mod importieren
-mod.import.github = GitHub Mod importieren
+mod.import.github = GitHub-Mod importieren
mod.item.remove = This item is part of the[accent] '{0}'[] mod. To remove it, uninstall that mod.
mod.remove.confirm = Dieser Mod wird gelöscht.
mod.author = [LIGHT_GRAY]Author:[] {0}
@@ -140,14 +140,14 @@ researched = [LIGHT_GRAY]{0} erforscht.
players = {0} Spieler online
players.single = {0} Spieler online
server.closing = [accent]Schließe den Server ...
-server.kicked.kick = Du wurdest vom Server gekickt!
-server.kicked.whitelist = Du bist hier nicht auf der Whitelist.
+server.kicked.kick = Du wurdest vom Server geworfen!
+server.kicked.whitelist = Du befindest dich nicht auf der Whitelist des Servers.
server.kicked.serverClose = Server geschlossen.
-server.kicked.vote = Es wurde abgestimmt, dich zu kicken. Tschüss.
+server.kicked.vote = Es wurde abgestimmt, dich rauszuwerfen. Tschüss.
server.kicked.clientOutdated = Veralteter Client! Aktualisiere dein Spiel!
server.kicked.serverOutdated = Veralteter Server! Bitte den Host um ein Update!
server.kicked.banned = Du wurdest vom Server verbannt.
-server.kicked.typeMismatch = Der Server ist nicht mit deinem Versionstyp kompatibel.
+server.kicked.typeMismatch = Dieser Server ist nicht mit deinem Buildtyp kompatibel.
server.kicked.playerLimit = Dieser Server ist voll. Warte auf einen freien Platz.
server.kicked.recentKick = Du wurdest gerade gekickt.\nWarte bevor du dich wieder verbindest.
server.kicked.nameInUse = Es ist bereits ein Spieler \nmit diesem Namen auf dem Server.
@@ -157,8 +157,8 @@ server.kicked.customClient = Der Server akzeptiert keine Custom Builds von Mindu
server.kicked.gameover = Game Over!
server.kicked.serverRestarting = The server is restarting.
server.versions = Deine Version:[accent] {0}[]\nServerversion:[accent] {1}[]
-host.info = Der [accent]Server hosten[]-Knopf startet einen Server auf den Ports [scarlet]6567[] und [scarlet]6568.[]\nJeder im gleichen [LIGHT_GRAY]W-Lan oder lokalen Netzwerk[] sollte deinen Server in seiner Server Liste sehen können.\n\nWenn du anderen die Verbindung über IP ermöglichen willst, benötigst du [accent]Port-Forwarding[].\n\n[LIGHT_GRAY]Hinweis: Falls es Probleme mit der Verbindung im Netzwerk gibt, stelle sicher, dass Mindustry in deinen Firewall Einstellungen Zugriff auf das lokale Netzwerk hat.
-join.info = Hier kannst du eine [accent]Server-IP[] eingeben um dich zu verbinden oder Server im [accent]lokalen Netzwerk[] entdecken und dich mit ihnen verbinden.\nSowohl Spielen über das lokale Netzwerk als auch Spielen über das Internet werden unterstützt.\n\n[LIGHT_GRAY]Hinweis: Es gibt keine globale Server Liste; Wenn du dich mit jemandem per IP verbinden willst, musst du den Host nach seiner IP fragen.
+host.info = Der [accent]Server hosten[]-Knopf startet einen Server auf den Ports [scarlet]6567[] und [scarlet]6568.[]\nJeder im gleichen [LIGHT_GRAY]W-Lan oder lokalen Netzwerk[] sollte deinen Server in seiner Serverliste sehen können.\n\nWenn du anderen die Verbindung über deine IP-Adresse ermöglichen willst, benötigst du [accent]Port-Forwarding[].\n\n[LIGHT_GRAY]Hinweis: Falls es Probleme mit der Verbindung im Netzwerk gibt, stelle sicher, dass Mindustry in deinen Firewall-Einstellungen Zugriff auf das lokale Netzwerk hat.
+join.info = Hier kannst du eine [accent]Server-IP[] eingeben, um dich zu verbinden, oder Server im [accent]lokalen Netzwerk[] entdecken und dich mit ihnen verbinden.\nSowohl Spielen über das lokale Netzwerk als auch Spielen über das Internet werden unterstützt.\n\n[LIGHT_GRAY]Hinweis: Es gibt keine globale Serverliste; wenn du dich mit jemandem per IP-Adresse verbinden willst, musst du den Host nach seiner IP-Adresse fragen.
hostserver = Server hosten
invitefriends = Freunde einladen
hostserver.mobile = Host\nSpiel
@@ -177,10 +177,10 @@ trace.id = Eindeutige ID: [accent]{0}
trace.mobile = Mobiler Client: [accent]{0}
trace.modclient = Gemoddeter Client: [accent]{0}
invalidid = Ungültige Client-ID! Berichte den Fehler.
-server.bans = Bans
-server.bans.none = Keine gebannten Spieler gefunden!
-server.admins = Admins
-server.admins.none = Keine Admins gefunden!
+server.bans = Verbannungen
+server.bans.none = Keine verbannten Spieler gefunden!
+server.admins = Administratoren
+server.admins.none = Keine Administratoren gefunden!
server.add = Server hinzufügen
server.delete = Bist du dir sicher, dass du diesen Server löschen möchtest?
server.edit = Server bearbeiten
@@ -189,17 +189,17 @@ server.outdated.client = [crimson]Veralteter Client![]
server.version = [lightgray]Version: {0}
server.custombuild = [yellow]Benutzerdefinierter Build
confirmban = Bist du sicher, dass du diesen Spieler verbannen möchtest?
-confirmkick = Bist du sicher, dass du diesen Spieler kicken willst?
-confirmvotekick = Bist du sicher diesen Spieler mit einer Abstimmung rauszuwerfen?
+confirmkick = Bist du sicher, dass du diesen Spieler rauswerfen willst?
+confirmvotekick = Bist du sicher, dass du darüber abstimmen willst, diesen Spieler rauszuwerfen?
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 Admin machen möchtest?
-confirmunadmin = Bis du sicher, dass dieser Spieler kein Admin mehr sein soll?
+confirmadmin = Bist du sicher, dass du diesen Spieler zu einem Administrator machen möchtest?
+confirmunadmin = Bis du sicher, dass dieser Spieler kein Administrator mehr sein soll?
joingame.title = Spiel beitreten
joingame.ip = IP:
disconnect = Verbindung unterbrochen.
disconnect.error = Verbindungsfehler.
disconnect.closed = Verbindung geschlossen.
-disconnect.timeout = Zeit Überschreitung.
+disconnect.timeout = Zeitüberschreitung.
disconnect.data = Fehler beim Laden der Welt!
cantconnect = Nicht möglich beizutreten ([accent]{0}[]).
connecting = [accent] Verbinde...
@@ -212,7 +212,7 @@ save.new = Neuer Spielstand
save.overwrite = Möchtest du diesen Spielstand wirklich überschreiben?
overwrite = Überschreiben
save.none = Keine Spielstände gefunden!
-saveload = [accent] Speichern ...
+saveload = [accent] Speichern...
savefail = Fehler beim Speichern des Spiels!
save.delete.confirm = Möchtest du diesen Spielstand wirklich löschen?
save.delete = Löschen
@@ -221,7 +221,7 @@ save.import.invalid = [accent] Dieser Spielstand ist ungültig!
save.import.fail = [crimson] Spielstand konnte nicht importiert werden: [accent] {0}
save.export.fail = [crimson] Spielstand konnte nicht exportiert werden: [accent] {0}
save.import = Spielstand importieren
-save.newslot = Name speichern:
+save.newslot = Name:
save.rename = Umbenennen
save.rename.text = Neuer Name
selectslot = Wähle einen Spielstand
@@ -234,36 +234,36 @@ off = Aus
save.autosave = Automatisches Speichern: {0}
save.map = Karte: {0}
save.wave = Welle: {0}
-save.mode = Gamemode: {0}
+save.mode = Spielmodus: {0}
save.date = Zuletzt gespeichert: {0}
save.playtime = Spielzeit: {0}
-warning = Warnung.
+warning = Warnung
confirm = Bestätigen
delete = Löschen
-view.workshop = Im Workshop betrachten
-workshop.listing = Workshop Auflistung bearbeiten
+view.workshop = Im Workshop ansehen
+workshop.listing = Workshop-Auflistung bearbeiten
ok = OK
open = Öffnen
customize = Anpassen
cancel = Abbruch
openlink = Link öffnen
-copylink = Kopiere Link
+copylink = Link kopieren
back = Zurück
data.export = Daten exportieren
data.import = Daten importieren
data.exported = Daten exportiert.
-data.invalid = Das sind ungültige Spieldateien.
-data.import.confirm = Externe Spielstände zu importieren löscht[scarlet] all[] deine jetzigen Spielstände.\n[accent]Dies kann nicht rückgängig gemacht werden![]\n\nSobald die Daten importiert sind, schließt das Spiel.
+data.invalid = Dies sind keine gültigen Spieldaten.
+data.import.confirm = Der Import von externen Daten wird [scarlet] alle[] deine gegenwärtigen Spieldaten löschen.\n[accent]Dies kann nicht rückgängig gemacht werden![]Sobald der Import abeschlossen ist, wird dein Spiel sofort beendet.
classic.export = Klassische Dateien exportieren
-classic.export.text = [accent]Mindustry[] Mindustry hatte gerade ein rießiges Update.\nKlassische (v3.5 build 40) Spielstand oder Karten-Daten wurden gefunden. Willst du sie in den home-Ordner deines Smartphones exportieren, um sie für die Mindustry-Klassik App zu verwenden?
+classic.export.text = [accent]Mindustry[] hat ein großes Update bekommen.\nEin Classic (v3.5 build 40) -Speicherstand oder eine -Karte wurde gefunden. Möchtest du diese Daten in den home-Ordner deines Smartphones exportieren, um sie in der Mindustry Classic-App zu verwenden?
quit.confirm = Willst du wirklich aufhören?
-quit.confirm.tutorial = Willst du das Tutorial wirklich abbrechen?\nDu kannst es unter[accent] Einstellungen->Spiel->Tutorial wiederholen[] erneut spielen.
+quit.confirm.tutorial = Weißt du, was du tust?\nDu kannst das Tutorial unter[accent] Einstellungen->Spiel->Tutorial wiederholen[] erneut spielen.
loading = [accent]Wird geladen...
-reloading = [accent]Mods neuladen...
+reloading = [accent]Lade Mods neu...
saving = [accent]Speichere...
-cancelbuilding = [accent][[{0}][] um Plan zu löschen
+cancelbuilding = [accent][[{0}][] um den Plan zu leeren
selectschematic = [accent][[{0}][] zum Auswählen+Kopieren
-pausebuilding = [accent][[{0}][] zum Pausieren des Bauens
+pausebuilding = [accent][[{0}][] um das Bauen zu pausieren
resumebuilding = [scarlet][[{0}][] um das Bauen fortzusetzen
wave = [accent]Welle {0}
wave.waiting = Welle in {0}
@@ -277,33 +277,33 @@ saveimage = Bild speichern
unknown = Unbekannt
custom = Benutzerdefiniert
builtin = Enthalten
-map.delete.confirm = Bist du sicher, dass du diese Karte löschen willst? Die Aktion kann nicht rückgänig gemacht werden!
+map.delete.confirm = Bist du sicher, dass du diese Karte löschen willst? Dies kann nicht rückgänig gemacht werden!
map.random = [accent]Zufällige Karte
map.nospawn = Diese Karte hat keine Kerne in denen die Spieler beginnen können! Füge einen [ROYAL]blue[] Kern zu dieser Karte im Editor hinzu.
-map.nospawn.pvp = Diese Karte hat keine gegnerischen Kerne wo Gegner starten könnten! Füge über den Editor [SCARLET] rote[] Kerne zu dieser Karte hinzu.
+map.nospawn.pvp = Diese Karte hat keine gegnerischen Kerne in denen Gegner starten können! Füge über den Editor [SCARLET] rote[] Kerne zu dieser Karte hinzu.
map.nospawn.attack = Diese Karte hat keine gengnerischen Kerne, die Spieler angreifen können! Füge über den Editor [SCARLET] rote[] Kerne zu dieser Karte hinzu.
-map.invalid = Fehler beim Laden der Karte: Beschädigtes oder ungültige Karten Datei.
-workshop.update = Item aktualisieren
-workshop.error = Fehler beim laden von Workshop-Daten: {0}
-map.publish.confirm = Willst du wirklich diese Map hochladen?\n\n[lightgray]Vergewissere dich die, der Workshop-EULA zugestimmt zu haben, sonst tauch deine Map nicht auf!
-workshop.menu = Wähle aus, was du mit diesem Item machen willst.
-workshop.info = Item Info
+map.invalid = Fehler beim Laden der Karte: Beschädigte oder ungültige Kartendatei.
+workshop.update = Objekt aktualisieren
+workshop.error = Fehler beim Laden von Workshop-Details: {0}
+map.publish.confirm = Willst du diese Karte wirklich veröffentlichen?\n\n[lightgray]Vergewissere dich, dass du der Workshop-EULA zugestimmt hast, sonst tauchen deine Karten nicht auf!
+workshop.menu = Wähle aus, was du mit diesem Objekt tun willst.
+workshop.info = Objekt-Info
changelog = Changelog (optional):
eula = Steam EULA
-missing = Dieses Item wurde verschoben oder gelöscht.\n[lightgray]Die Workshop-Auflistung wird nun automatisch ungekoppelt.
+missing = Dieses Objekt wurde gelöscht oder verschoben.\n[lightgray]Die Workshop-Auflistung ist nun automatisch getrennt worden.
publishing = [accent]Veröffentlichen...
-publish.confirm = Bist du sicher, dies zu veröffentlichen?\n\n[lightgray]Vergewissere dich die, der Workshop-EULA zugestimmt zu haben, sonst tauch deine Karte nicht auf!
-publish.error = Fehler beim veröffentlichen des Items: {0}
+publish.confirm = Willst du das wirklich veröffentlichen?\n\n[lightgray]Vergewissere dich, dass du der Workshop-EULA zugestimmt hast, sonst tauchen deine Objekte nicht auf!
+publish.error = Fehler beim Veröffentlichen des Objekts: {0}
steam.error = Fehler beim laden der Steam-Dienste.\nError: {0}
editor.brush = Pinsel
editor.openin = Öffne im Editor
editor.oregen = Erze generieren
editor.oregen.info = Erze generiert:
-editor.mapinfo = Karten Info
+editor.mapinfo = Karten-Info
editor.author = Autor:
editor.description = Beschreibung:
-editor.nodescription = Eine Karte benötigt mindestens 4 Buchstaben in der Beschreibung, bevor sie veröffentlich werden kann.
+editor.nodescription = Eine Karte benötigt eine Beschreibung mit mindestens 4 Buchstaben, bevor sie veröffentlich werden kann.
editor.waves = Wellen:
editor.rules = Regeln:
editor.generation = Generator:
@@ -325,23 +325,23 @@ waves.copy = Aus der Zwischenablage kopieren
waves.load = Aus der Zwischenablage laden
waves.invalid = Ungültige Wellen in der Zwischenablage.
waves.copied = Wellen kopiert.
-waves.none = Keine Gegner definiert.\nInfo: Leere Wellen Entwürfe werden automatisch mit dem Standard-Entwurf ersetzt.
+waves.none = Keine Gegner definiert.\nInfo: Leere Wellenentwürfe werden automatisch mit dem Standard-Entwurf ersetzt.
editor.default = [LIGHT_GRAY]
-details = Details...
-edit = Bearbeiten...
+details = Details
+edit = Bearbeiten
editor.name = Name:
-editor.spawn = Spawn Bereich
-editor.removeunit = Entferne Bereich
+editor.spawn = Spawnbereich
+editor.removeunit = Bereich entfernen
editor.teams = Teams
editor.errorload = Fehler beim Laden der Datei:\n[accent]{0}
editor.errorsave = Fehler beim Speichern der Datei:\n[accent]{0}
-editor.errorimage = Das ist ein Bild, keine Karte. Wechsel nicht den Dateityp und erwarte, dass es funktioniert.\n\nWenn du eine alte Karte importieren möchtest, benutze den 'Importiere Terrain Bild' Knopf in dem Editor.
-editor.errorlegacy = Diese Karte ist zu alt und benutzt ein veraltetes Karten Format, das nicht mehr unterstützt wird.
-editor.errornot = Dies ist keine Kartendatei
+editor.errorimage = Das ist ein Bild, keine Karte. Wechsle nicht den Dateityp und erwarte, dass es funktioniert.\n\nWenn du eine 3.5/build 40-Karte importieren möchtest, benutze den 'Importiere Terrainbild' Knopf im Editor.
+editor.errorlegacy = Diese Karte ist zu alt und benutzt ein veraltetes Kartenformat, das nicht mehr unterstützt wird.
+editor.errornot = Dies ist keine Kartendatei.
editor.errorheader = Diese Karte ist entweder nicht gültig oder beschädigt.
editor.errorname = Karte hat keinen Namen.
editor.update = Aktualisieren
-editor.randomize = Zufällig Anordnen
+editor.randomize = Zufällig anordnen
editor.apply = Anwenden
editor.generate = Generieren
editor.resize = Größe\nanpassen
@@ -355,22 +355,22 @@ editor.import = Importieren...
editor.importmap = Importiere Karte
editor.importmap.description = Importiere von einer bestehenden Karte
editor.importfile = Importiere Datei
-editor.importfile.description = Importiere aus einer Karten Datei
-editor.importimage = Importiere Terrain Bild
-editor.importimage.description = Importiere aus einer Terrain Bild Datei
-editor.export = Exportieren...
+editor.importfile.description = Importiere aus einer Kartendatei
+editor.importimage = Importiere Terrainbild
+editor.importimage.description = Importiere aus einer Terrainbild-Datei
+editor.export = Exportiere...
editor.exportfile = Export in Datei
-editor.exportfile.description = Exportiere in eine Karten Datei
-editor.exportimage = Export in Terrain Bild Datei
-editor.exportimage.description = Exportiere in eine Karten Bild Datei
+editor.exportfile.description = Exportiere in eine Karten-Datei
+editor.exportimage = Export in Terrainbild-Datei
+editor.exportimage.description = Exportiere in ein Kartenbild
editor.loadimage = Bild\nladen
editor.saveimage = Bild\nspeichern
-editor.unsaved = [crimson] Du hast Änderungen nicht gespeichert [] Möchtest du wirklich aufhören?
+editor.unsaved = [crimson] Einige Änderungen wurden noch nicht gespeichert! [] Möchtest du den Editor wirklich verlassen?
editor.resizemap = Größe der Karte ändern
-editor.mapname = Karten Name
+editor.mapname = Kartenname
editor.overwrite = [accent] Warnung! Dies überschreibt eine vorhandene Karte.
editor.overwrite.confirm = [scarlet]Warnung![] Eine Karte mit diesem Namen existiert bereits. Bist du sicher, dass du sie überschreiben willst?
-editor.exists = A map with this name already exists.
+editor.exists = Eine Karte mit diesem Namen existiert bereits.
editor.selectmap = Wähle eine Karte zum Laden:
toolmode.replace = Ersetzen
@@ -380,23 +380,23 @@ toolmode.replaceall.description = Alle Blöcke auf der Karte ersetzen.
toolmode.orthogonal = Rechtwinkelig
toolmode.orthogonal.description = Zeichnet nur rechtwinkelige Linien.
toolmode.square = Quadrat
-toolmode.square.description = Quadrat Pinsel.
+toolmode.square.description = Quadratpinsel.
toolmode.eraseores = Erze löschen
toolmode.eraseores.description = Löscht nur Erze.
-toolmode.fillteams = Teams Ausfüllen
-toolmode.fillteams.description = Füllt Teams aus anstatt Blöcke.
+toolmode.fillteams = Teams ausfüllen
+toolmode.fillteams.description = Füllt Teams aus statt Blöcke.
toolmode.drawteams = Teams Zeichnen
-toolmode.drawteams.description = Zeichnet Teams anstatt Blöcke.
+toolmode.drawteams.description = Zeichnet Teams statt Blöcke.
filters.empty = [LIGHT_GRAY]Keine Filter! Füge einen mit dem unteren Knopf hinzu.
filter.distort = Verzerren
filter.noise = Rauschen
-filter.median = Mittelwert
-filter.oremedian =Erz Median
+filter.median = Median
+filter.oremedian = Erzmedian
filter.blend = Mischen
-filter.defaultores = Standard Erze
+filter.defaultores = Standarderze
filter.ore = Erz
-filter.rivernoise = Fluss Rauschen
+filter.rivernoise = Flussrauschen
filter.mirror = Spiegel
filter.clear = Löschen
filter.option.ignore = Ignorieren
@@ -406,7 +406,7 @@ filter.option.scale = Skalierung
filter.option.chance = Wahrscheinlichkeit
filter.option.mag = Größe
filter.option.threshold = Grenzwert
-filter.option.circle-scale = Kreis Skalierung
+filter.option.circle-scale = Kreisskalierung
filter.option.octaves = Oktaven
filter.option.falloff = Rückgang
filter.option.angle = Winkel
@@ -434,29 +434,29 @@ settings = Einstellungen
tutorial = Tutorial
tutorial.retake = Tutorial wiederholen
editor = Editor
-mapeditor = Karten Editor
+mapeditor = Karteneditor
abandon = Aufgeben
abandon.text = Diese Zone sowie alle Ressourcen werden dem Gegner überlassen.
locked = Gesperrt
complete = [LIGHT_GRAY]Abschließen:
-requirement.wave = Erreiche {0} in {1}
-requirement.core = Zerstöre Gegnerbasis in {0}
-requirement.unlock = Schalte {0} freo
+requirement.wave = Erreiche Welle {0} in {1}
+requirement.core = Zerstöre den feindlichen Kern in {0}
+requirement.unlock = Schalte {0} frei
resume = Zu Zone zurückkehren:\n[LIGHT_GRAY]{0}
bestwave = [LIGHT_GRAY]Beste Welle: {0}
-launch = Abschluss
-launch.title = Abschluss erfolgreich
+launch = Starten
+launch.title = Start erfolgreich
launch.next = [LIGHT_GRAY]Nächste Möglichkeit bei Welle {0}
-launch.unable2 = [scarlet]Unfähig abzuschließen.[]
+launch.unable2 = [scarlet]START nicht möglich.[]
launch.confirm = Dies wird alle Ressourcen in deinen Kern übertragen.\nDu kannst nicht wieder zu dieser Karte zurückkehren.
-launch.skip.confirm = Wenn du jetzt überspringst, kannst du nicht vor späteren Wellen abschließen.
+launch.skip.confirm = Wenn du die Wartezeit überspringst, kannst du den Kern bis zu einer späteren Welle nicht mehr starten.
uncover = Freischalten
configure = Startitems festlegen
bannedblocks = Gesperrte Blöcke
addall = Alle hinzufügen
-configure.locked = [LIGHT_GRAY]Erreiche Welle {0}\n, um Startitems festlegen zu können.
-configure.invalid = Anzahl muss zwischen 0 und {0} sein.
+configure.locked = [lightgray]Festlegen von Startitems freischalten: {0}.
+configure.invalid = Anzahl muss eine Zahl zwischen 0 und {0} sein.
zone.unlocked = [LIGHT_GRAY]{0} freigeschaltet.
zone.requirement.complete = Welle {0} erreicht:\n{1} Anforderungen der Zone erfüllt.
zone.config.unlocked = Konfiguration:[lightgray]\n{0}
@@ -465,7 +465,7 @@ zone.objective = [lightgray]Ziel: [accent]{0}
zone.objective.survival = Überlebe
zone.objective.attack = Zerstöre den feindlichen Kern
add = Hinzufügen...
-boss.health = Boss Lebenskraft
+boss.health = Boss-Lebenskraft
connectfail = [crimson] Verbindung zum Server konnte nicht hergestellt werden: [accent]{0}
error.unreachable = Server nicht erreichbar.
@@ -487,14 +487,14 @@ zone.stainedMountains.name = Gefleckte Berge
zone.desolateRift.name = Trostloser Riss
zone.nuclearComplex.name = Kernkraftwerk
zone.overgrowth.name = Überwucherung
-zone.tarFields.name = Ölfelder
-zone.saltFlats.name = Salztiefen
-zone.impact0078.name = Auswirkung 0078
+zone.tarFields.name = Teerfelder
+zone.saltFlats.name = Salzebenen
+zone.impact0078.name = Einschlag 0078
zone.crags.name = Felsen
zone.fungalPass.name = Sporenpass
zone.groundZero.description = Der optimale Ort, um anzufangen. Niedrige Bedrohung durch Gegner. Wenige Ressourcen.\nSammel so viel Kupfer und Blei wie möglich.\nMach weiter!
-zone.frozenForest.description = Sogar hier, näher an den Bergen, haben sich die Sporen verbreitet. Die kalten Temperaturen können sie nicht für immer im Schach halten.\n\nStarte das Wagnis in Strom. Baue Verbrennungsgeneratoren. Lerne Heiler zu benutzen.
+zone.frozenForest.description = Sogar hier, näher an den Bergen, haben sich die Sporen verbreitet. Die kalten Temperaturen können sie nicht für immer im Schach halten.\n\nStarte das Wagnis in Strom. Baue Verbrennungsgeneratoren. Lerne Reparateure zu benutzen.
zone.desertWastes.description = Diese Abfälle sind riesig, unberechenbar, und durchzogen von verfallenen Sektorstrukturen.\nKohle ist in dieser Region vorhanden. Verbrenne es für Strom, oder synthetisiere Graphit.\n\n[lightgray]Dieser Landeort kann nicht garantiert werden.
zone.saltFlats.description = Am Rande der Wüste liegen die Salzebenen. In dieser Gegend können wenige Ressourcen gefunden werden.\n\nDer Feind hat hier einen Ressourcenspeicherkomplex errichtet. Zerstöre ihren Kern. Lass nichts stehen.
zone.craters.description = Wasser hat sich in diesem Krater angesammelt, ein Relikt von den alten Kriegen. Gewinne dieses Gebiet zurück. Sammle Sand. Schmelze Metaglass. Pumpe Wasser, um Geschütztürme und Bohrer zu kühlen.
@@ -504,7 +504,7 @@ zone.overgrowth.description = Dieser Bereich ist bewachsen, näher an der Quelle
zone.tarFields.description = Der Rand einer Ölförderzone, zwischen Bergen und Wüste. Eine der wenigen Plätze mit nutzbare Teer Reserven.\nObwohl es aufgegeben wurde, hat dieses Gebiet einige gefährliche feindliche Kräfte in der Nähe. Unterschätze sie nicht.\n\n[lightgray]Wenn möglich, erforsche Technologien zur Ölverarbeitung.
zone.desolateRift.description = Eine extrem gefährliche Zone. Reichlich Ressourcen, aber wenig Platz. Hohe Zerstörungsgefahr. Verlasse es so schnell wie möglich. Lassen Sie sich nicht von den großen Abständen zwischen feindlichen Angriffen in die Irre führen.
zone.nuclearComplex.description = Eine ehemalige Anlage zur Herstellung und Verarbeitung von Thorium, die in Trümmern liegt.\n[lightgray]Erforsche das Thorium und seine vielen Verwendungsmöglichkeiten.\n\nDer Feind ist hier in großer Zahl präsent und sucht ständig nach Angreifern.
-zone.fungalPass.description = Ein Übergangsgebiet zwischen hohen Bergen und tieferen, sporengeplagter Länder. Eine kleine Späherbasis ist hier angelegt.\nZerstöre sie.\nNutze Dagger und Crawler. Zerstöre die zwei Basen.
+zone.fungalPass.description = Ein Übergangsgebiet zwischen hohen Bergen und niedrigeren, sporenverseuchten Landschaften. Ein kleiner feindlicher Außenposten wurde hier entdeckt.\nZerstöre ihn.\nNutze Dagger und Crawler-Einheiten. Zerstöre die zwei Kerne.
zone.impact0078.description =
zone.crags.description =
@@ -519,7 +519,7 @@ settings.sound = Audio
settings.graphics = Grafik
settings.cleardata = Spieldaten zurücksetzen...
settings.clear.confirm = Bist du sicher, dass du die Spieldaten zurücksetzen willst?\n Diese Aktion kann nicht rückgängig gemacht werden!
-settings.clearall.confirm = [scarlet]Warnung![]\nDas wird jegliche Spieldaten zurücksetzen inklusive Speicherstände, Karten, Freischaltungen und Tastenbelegungen.\n Nachdem du 'OK' drückst wird alles zurückgesetzt und das Spiel schließt sich automatisch.
+settings.clearall.confirm = [scarlet]Warnung![]\nDas wird jegliche Spieldaten zurücksetzen, inklusive Speicherstände, Karten, Freischaltungen und Tastenbelegungen.\n Nachdem du 'OK' drückst wird alles zurückgesetzt und das Spiel schließt sich automatisch.
paused = Pausiert
clear = Leeren
banned = [scarlet]Banned
@@ -535,8 +535,8 @@ block.unknown = [LIGHT_GRAY]???
blocks.powercapacity = Kapazität
blocks.powershot = Stromverbrauch/Schuss
blocks.damage = Schaden
-blocks.targetsair = Visiert Luft Einheiten an
-blocks.targetsground = Visiert Boden Einheiten an
+blocks.targetsair = Visiert Lufteinheiten an
+blocks.targetsground = Visiert Bodeneinheiten an
blocks.itemsmoved = Bewegungsgeschwindigkeit
blocks.launchtime = Zeit zwischen Starts
blocks.shootrange = Reichweite
@@ -549,13 +549,13 @@ blocks.powerdamage = Stromverbrauch/Schadenspunkt
blocks.itemcapacity = Materialkapazität
blocks.basepowergeneration = Basis-Stromerzeugung
blocks.productiontime = Produktionszeit
-blocks.repairtime = Zeit zur vollständigen Heilung
+blocks.repairtime = Zeit zur vollständigen Reparatur
blocks.speedincrease = Geschwindigkeitserhöhung
blocks.range = Reichweite
blocks.drilltier = Abbaubare Erze
blocks.drillspeed = Bohrgeschwindigkeit
blocks.boosteffect = Verstärkungseffekt
-blocks.maxunits = Max aktive Einheiten
+blocks.maxunits = Max. aktive Einheiten
blocks.health = Lebenspunkte
blocks.buildtime = Baudauer
blocks.buildcost = Baukosten
@@ -564,14 +564,14 @@ blocks.shots = Schüsse
blocks.reload = Schüsse/Sekunde
blocks.ammo = Munition
-bar.drilltierreq = Besserer Bohrer benötigt
+bar.drilltierreq = Besserer Bohrer Benötigt
bar.drillspeed = Bohrgeschwindigkeit: {0}/s
bar.pumpspeed = Pump Speed: {0}/s
bar.efficiency = Effizienz: {0}%
bar.powerbalance = Strom: {0}
bar.powerstored = Gespeichert: {0}/{1}
bar.poweramount = Strom: {0}
-bar.poweroutput = Stromgeneration: {0}
+bar.poweroutput = Stromgenerierung: {0}
bar.items = Items: {0}
bar.capacity = Kapazität: {0}
bar.liquid = Flüssigkeit
@@ -586,7 +586,7 @@ bullet.damage = [stat]{0}[lightgray] Schaden
bullet.splashdamage = [stat]{0}[lightgray] Flächenschaden ~[stat] {1}[lightgray] Kacheln
bullet.incendiary = [stat]entzündend
bullet.homing = [stat]zielsuchend
-bullet.shock = [stat]schock
+bullet.shock = [stat]schockend
bullet.frag = [stat]explosiv
bullet.knockback = [stat]{0}[lightgray] zurückstoßend
bullet.freezing = [stat]frierend
@@ -602,7 +602,7 @@ unit.liquidunits = Flüssigkeitseinheiten
unit.powerunits = Stromeinheiten
unit.degrees = Grad
unit.seconds = Sekunden
-unit.persecond = /s
+unit.persecond = /sek
unit.timesspeed = x Geschwindigkeit
unit.percent = %
unit.items = Materialeinheiten
@@ -627,8 +627,8 @@ setting.antialias.name = Antialias[LIGHT_GRAY] (Neustart erforderlich)[]
setting.indicators.name = Verbündeten-Indikatoren
setting.autotarget.name = Auto-Zielauswahl
setting.keyboard.name = Maus+Tastatur Steuerung
-setting.touchscreen.name = Touchscreen Controls
-setting.fpscap.name = Max FPS
+setting.touchscreen.name = Touchscreen-Steuerung
+setting.fpscap.name = Max. FPS
setting.fpscap.none = kein
setting.fpscap.text = {0} FPS
setting.uiscale.name = UI-Skalierung[lightgray] (Neustart erforderlich)[]
@@ -645,12 +645,12 @@ setting.destroyedblocks.name = Zerstörte Blöcke anzeigen
setting.conveyorpathfinding.name = Automatische Wegfindung beim Bau von Förderbändern
setting.coreselect.name = Allow Schematic Cores
setting.sensitivity.name = Controller-Empfindlichkeit
-setting.saveinterval.name = Autosave Häufigkeit
+setting.saveinterval.name = Autosave-Häufigkeit
setting.seconds = {0} Sekunden
setting.blockselecttimeout.name = Block Auswahl Timeout
setting.milliseconds = {0} Millisekunden
setting.fullscreen.name = Vollbild
-setting.borderlesswindow.name = Randloses Fenster[LIGHT_GRAY] (Neustart teilweise erforderlich)
+setting.borderlesswindow.name = Randloses Fenster[LIGHT_GRAY] (Neustart vielleicht erforderlich)
setting.fps.name = Zeige FPS
setting.blockselectkeys.name = Block Shortcuts anzeigen
setting.vsync.name = VSync
@@ -663,10 +663,10 @@ setting.mutemusic.name = Musik stummschalten
setting.sfxvol.name = Audioeffekt-Lautstärke
setting.mutesound.name = Audioeffekte stummschalten
setting.crashreport.name = Anonyme Absturzberichte senden
-setting.savecreate.name = Automatisch Speicherstände anlegen
-setting.publichost.name = Public Game Visibility
-setting.chatopacity.name = Chat Deckkraft
-setting.lasersopacity.name = Power Laser Opacity
+setting.savecreate.name = Automatisch speichern
+setting.publichost.name = Öffentliche Sichtbarkeit des Spiels
+setting.chatopacity.name = Chat-Deckkraft
+setting.lasersopacity.name = Power-Laser-Deckkraft
setting.playerchat.name = Chat im Spiel anzeigen
public.confirm = Willst du dein Spiel öffentlich zugänglich machen?\n[accent]Jeder kann deinem Spiel beitreten.\n[lightgray]Dies kann später in den Einstellung->Spielt->Öffentliches Spiel geändert werden.
public.beta = Bemerke: Beta-Versionen des Spiels können keine öffentlichen Spiele machen.
@@ -679,7 +679,7 @@ category.general.name = Allgemein
category.view.name = Ansicht
category.multiplayer.name = Mehrspieler
command.attack = Angreifen
-command.rally = Rally
+command.rally = Patrouillieren
command.retreat = Rückzug
placement.blockselectkeys = \n[lightgray]Shortcut: [{0},
keybind.clear_building.name = Clear Building
@@ -690,11 +690,11 @@ keybind.toggle_power_lines.name = Toggle Power Lasers
keybind.move_x.name = X-Achse
keybind.move_y.name = Y-Achse
keybind.mouse_move.name = Follow Mouse
-keybind.dash.name = Bindestrich
+keybind.dash.name = Sprinten
keybind.schematic_select.name = Bereich auswählen
-keybind.schematic_menu.name = Schematic Menu
+keybind.schematic_menu.name = Entwurfsmenü
keybind.schematic_flip_x.name = Entwurf umdrehen X
-keybind.schematic_flip_y.name = Entwurf umdrehn Y
+keybind.schematic_flip_y.name = Entwurf umdrehen Y
keybind.category_prev.name = Vorige Kategorie
keybind.category_next.name = Nächste Kategorie
keybind.block_select_left.name = Block-Auswahl nach links
@@ -711,10 +711,10 @@ keybind.block_select_07.name = Kategorie/Block 7 auswählen
keybind.block_select_08.name = Kategorie/Block 8 auswählen
keybind.block_select_09.name = Kategorie/Block 9 auswählen
keybind.block_select_10.name = Kategorie/Block 10 auswählen
-keybind.fullscreen.name = Vollbild umschalten
+keybind.fullscreen.name = Vollbildmodus umschalten
keybind.select.name = Auswählen/Schießen
keybind.diagonal_placement.name = Diagonal platzieren
-keybind.pick.name = Block Auswählen
+keybind.pick.name = Block auswählen
keybind.break_block.name = Block zerstören
keybind.deselect.name = Auswahl aufheben
keybind.shoot.name = Schießen
@@ -741,14 +741,14 @@ mode.sandbox.name = Sandkasten
mode.sandbox.description = Unendliche Ressourcen und kein Timer für Wellen.
mode.editor.name = Editor
mode.pvp.name = PvP
-mode.pvp.description = Kämpfe gegen andere Spieler lokal.
+mode.pvp.description = Kämpfe lokal gegen andere Spieler.
mode.attack.name = Angriff
-mode.attack.description = Keine Wellen, das Ziel ist es die gegnerische Basis zu zerstören.
+mode.attack.description = Keine Wellen, das Ziel ist es, die gegnerische Basis zu zerstören.
mode.custom = Angepasste Regeln
rules.infiniteresources = Unbegrenzte Ressourcen
rules.reactorexplosions = Reactor Explosions
-rules.wavetimer = Wellen Timer
+rules.wavetimer = Wellen-Timer
rules.waves = Wellen
rules.attack = Angriff-Modus
rules.enemyCheat = Unbegrenzte Ressourcen für KI
@@ -760,16 +760,16 @@ rules.playerhealthmultiplier = Spieler-Lebenspunkte Multiplikator
rules.playerdamagemultiplier = Spieler-Schaden Multiplikator
rules.unitdamagemultiplier = Schaden-Einheit Multiplikator
rules.enemycorebuildradius = Bauverbot Radius druch feindlichen Kern:[LIGHT_GRAY] (Kacheln)
-rules.respawntime = Respawn Zeit:[LIGHT_GRAY] (Sek)
-rules.wavespacing = Wellen Abstand:[LIGHT_GRAY] (Sek)
+rules.respawntime = Respawn-Zeit:[LIGHT_GRAY] (Sek)
+rules.wavespacing = Wellen-Abstand:[LIGHT_GRAY] (Sek)
rules.buildcostmultiplier = Bau-Kosten Multiplikator
rules.buildspeedmultiplier = Bau-Schnelligkeit Multiplikator
rules.waitForWaveToEnd = Warten bis Welle endet
-rules.dropzoneradius = Drop Zonen Radius:[LIGHT_GRAY] (Kacheln)
-rules.respawns = Max Respawns pro Welle
-rules.limitedRespawns = Respawn-Limit
+rules.dropzoneradius = Drop-Zonen-Radius:[LIGHT_GRAY] (Kacheln)
+rules.respawns = Max. Wiederbelebungen pro Welle
+rules.limitedRespawns = Wiederbelebungslimit
rules.title.waves = Wellen
-rules.title.respawns = Respawns
+rules.title.respawns = Wiederbelebungen
rules.title.resourcesbuilding = Ressourcen & Gebäude
rules.title.player = Spieler
rules.title.enemy = Gegner
@@ -792,7 +792,7 @@ item.thorium.name = Thorium
item.silicon.name = Silizium
item.plastanium.name = Plastanium
item.phase-fabric.name = Phasengewebe
-item.surge-alloy.name = Spannungsstoß-Legierung
+item.surge-alloy.name = Spannungslegierung
item.spore-pod.name = Sporen-Pod
item.sand.name = Sand
item.blast-compound.name = Explosive Mischung
@@ -802,7 +802,7 @@ item.scrap.name = Schrott
liquid.water.name = Wasser
liquid.slag.name = Lava
liquid.oil.name = Öl
-liquid.cryofluid.name = Kryoflüssigkeit
+liquid.cryofluid.name = Kühlflüssigkeit
mech.alpha-mech.name = Alpha
mech.alpha-mech.weapon = Schwerer Mehrlader
mech.alpha-mech.ability = Drohnenschwarm
@@ -896,7 +896,7 @@ block.pine.name = Kiefer
block.white-tree-dead.name = Weißer toter Baum
block.white-tree.name = Weißer Baum
block.spore-cluster.name = Sporen-Cluster
-block.metal-floor.name = Metallboden
+block.metal-floor.name = Metallboden 1
block.metal-floor-2.name = Metallboden 2
block.metal-floor-3.name = Metallboden 3
block.metal-floor-5.name = Metallboden 5
@@ -931,8 +931,8 @@ block.hail.name = Streuer
block.lancer.name = Lanzer
block.conveyor.name = Förderband
block.titanium-conveyor.name = Titan-Förderband
-block.armored-conveyor.name = Gepanzertes-Förderband
-block.armored-conveyor.description = Moves items at the same speed as titanium conveyors, but possesses more armor. Does not accept inputs from the sides from anything but other conveyors.
+block.armored-conveyor.name = Gepanzertes Förderband
+block.armored-conveyor.description = Bewegt Gegenstände genauso schnell wie das Titan-Förderband, ist aber besser gepanzert. Akzeptiert nur Verbindungen mit anderen Förderbändern.
block.junction.name = Kreuzung
block.router.name = Verteiler
block.distributor.name = Großer Verteiler
@@ -966,13 +966,13 @@ block.pneumatic-drill.name = Pneumatischer Bohrer
block.laser-drill.name = Laser-Bohrer
block.water-extractor.name = Wasser-Extraktor
block.cultivator.name = Kultivierer
-block.dart-mech-pad.name = Dart Mech-Pad
-block.delta-mech-pad.name = Delta Mech-Pad
-block.javelin-ship-pad.name = Javelin Luftschiff-Pad
-block.trident-ship-pad.name = Dreizack Luftschiff-Pad
-block.glaive-ship-pad.name = Glaive Luftschiff-Pad
-block.omega-mech-pad.name = Omega Mech-Pad
-block.tau-mech-pad.name = Tau Mech-Pad
+block.dart-mech-pad.name = Dart-Mech-Pad
+block.delta-mech-pad.name = Delta-Mech-Pad
+block.javelin-ship-pad.name = Javelin-Luftschiff-Pad
+block.trident-ship-pad.name = Dreizack-Luftschiff-Pad
+block.glaive-ship-pad.name = Glaive-Luftschiff-Pad
+block.omega-mech-pad.name = Omega-Mech-Pad
+block.tau-mech-pad.name = Tau-Mech-Pad
block.conduit.name = Leitungsrohr
block.mechanical-pump.name = Mechanische Pumpe
block.item-source.name = Materialquelle
@@ -987,25 +987,25 @@ block.wave.name = Welle
block.swarmer.name = Schwärmer
block.salvo.name = Salve
block.ripple.name = Zerstörer
-block.phase-conveyor.name = Phasen-Transportband
-block.bridge-conveyor.name = Brücken-Transportband
+block.phase-conveyor.name = Phasen-Förderband
+block.bridge-conveyor.name = Brücken-Förderband
block.plastanium-compressor.name = Plastanium-Verdichter
block.pyratite-mixer.name = Pyratit-Mixer
block.blast-mixer.name = Sprengmixer
block.solar-panel.name = Solarpanel
block.solar-panel-large.name = Großes Solarpanel
block.oil-extractor.name = Öl-Extraktor
-block.command-center.name = Kommandozentrum
-block.draug-factory.name = Draug Miner-Drohnenfactory
+block.command-center.name = Kommandozentrale
+block.draug-factory.name = Draug-Miner-Dronenfabrik
block.spirit-factory.name = Spirit-Drohnenfabrik
block.phantom-factory.name = Phantom-Drohnenfabrik
-block.wraith-factory.name = Wraith Fighter-Fabrik
-block.ghoul-factory.name = Ghoul Bomber-Fabrik
-block.dagger-factory.name = Dagger Mech-Fabrik
-block.crawler-factory.name = Crawler Mech-Fabrik
-block.titan-factory.name = Titan Mech-Fabrik
-block.fortress-factory.name = Fortress Mech-Fabrik
-block.revenant-factory.name = Revenant Fighter-Fabrik
+block.wraith-factory.name = Wraith-Fighter-Fabrik
+block.ghoul-factory.name = Ghoul-Bomber-Fabrik
+block.dagger-factory.name = Dagger-Mech-Fabrik
+block.crawler-factory.name = Crawler-Mech-Fabrik
+block.titan-factory.name = Titan-Mech-Fabrik
+block.fortress-factory.name = Fortress-Mech-Fabrik
+block.revenant-factory.name = Revenant-Fighter-Fabrik
block.repair-point.name = Reparaturpunkt
block.pulse-conduit.name = Impulskanal
block.plated-conduit.name = Plated Conduit
@@ -1023,8 +1023,8 @@ block.thermal-generator.name = Thermischer Generator
block.alloy-smelter.name = Legierungsschmelze
block.mender.name = Reparateur
block.mend-projector.name = Reparaturprojektor
-block.surge-wall.name = Spannungsstoß-Mauer
-block.surge-wall-large.name = Große Spannungsstoß-Mauer
+block.surge-wall.name = Spannungsmauer
+block.surge-wall-large.name = Große Spannungsmauer
block.cyclone.name = Zyklon
block.fuse.name = Zünder
block.shock-mine.name = Schock-Mine
@@ -1041,11 +1041,11 @@ team.blue.name = Blau
team.crux.name = red
team.sharded.name = orange
team.orange.name = Orange
-team.derelict.name = derelict
+team.derelict.name = Derelict
team.green.name = Grün
team.purple.name = Lila
unit.spirit.name = Spirit-Drohne
-unit.draug.name = Draug Miner-Drone
+unit.draug.name = Draug-Miner-Drone
unit.phantom.name = Phantom-Drohne
unit.dagger.name = Dagger
unit.crawler.name = Crawler
@@ -1120,7 +1120,7 @@ unit.eruptor.description = Ein schwerer Mech, der Strukturen abbaut. Feuert eine
unit.wraith.description = Eine schneller Abfangjäger.
unit.ghoul.description = Ein schwerer Flächenbomber.
unit.revenant.description = Eine schwere, schwebende Raketengruppe.
-block.message.description = Benutzt um Nachrichten mit Verbündeten auszutauschen.
+block.message.description = Speichert eine Nachricht. Wird genutzt, um mit Verbündeten zu kommunizieren.
block.graphite-press.description = Komprimiert Kohlestücke zu reinen Graphitplatten.
block.multi-press.description = Eine aktualisierte Version der Graphitpresse. Setzt Wasser und Strom ein, um Kohle schnell und effizient zu verarbeiten.
block.silicon-smelter.description = Reduziert Sand mit hochreinem Kohlenstoff, um Silizium zu produzieren.
@@ -1129,12 +1129,12 @@ block.plastanium-compressor.description = Produziert Plastanium aus Öl und Tita
block.phase-weaver.description = Produziert Phasengewebe aus radioaktivem Thorium und großen Mengen an Sand.
block.alloy-smelter.description = Verarbeitet Titan, Blei, Silizium und Kupfer zu einer Stromstoßlegierung.
block.cryofluidmixer.description = Verarbeitet Wasser mit Titan zu einer Kryoflüssigkeit, die viel effizienter kühlt.
-block.blast-mixer.description = Verwendet Öl, um Pyratit in eine weniger enzündliche aber explosive Mischung umzuwandeln.
+block.blast-mixer.description = Verwendet Sporen, um Pyratit in eine weniger enzündliche aber explosive Mischung umzuwandeln.
block.pyratite-mixer.description = Vermischt Kohle, Blei und Sand zu hochentzündlichem Pyratit.
-block.melter.description = Erhitzt Stein auf extrem hohe Temperaturen, um Lava zu erhalten.
-block.separator.description = Setzt Stein Wasserdruck aus, um verschiedene Mineralien im Stein freizulegen.
+block.melter.description = Erhitzt Schrott auf extrem hohe Temperaturen, um Lava zu erhalten.
+block.separator.description = Setzt Lava Wasserdruck aus, um verschiedene Mineralien freizulegen.
block.spore-press.description = Komprimiert Sporenhülsen zu Öl.
-block.pulverizer.description = Zertrümmert Stein zu Sand. Nützlich, wenn kein natürlicher Sand verfügbar ist.
+block.pulverizer.description = Zertrümmert Schrott zu Sand. Nützlich, wenn kein natürlicher Sand verfügbar ist.
block.coal-centrifuge.description = Verfestigt Öl zu Kohlenstücken.
block.incinerator.description = Vernichtet beliebige überschüssige Materialien oder Flüssigkeiten.
block.power-void.description = Verschlingt den kompletten übrigen Strom. Nur im Sandkasten-Modus verfügbar.
@@ -1157,8 +1157,8 @@ block.surge-wall.description = Der stärkste Verteidigungsblock.\nHat eine klein
block.surge-wall-large.description = Der stärkste Verteidigungsblock.\nHat eine kleine Chance, bei einem Schuss einen Lichtbogen in Richtung Angreifer auszulösen.\nBenötigt mehrere Kacheln.
block.door.description = Eine kleine Tür, die durch Tippen geöffnet und geschlossen werden kann.\nGegner können durch geöffnete Türen schießen und laufen.
block.door-large.description = Eine kleine Tür, die durch Tippen geöffnet und geschlossen werden kann.\nGegner können durch geöffnete Türen schießen und laufen.\nBenötigt mehrere Kacheln.
-block.mender.description = Repariert regelmäßig Blöcke in der Nähe. Hält die Abwehrkräfte zwischen den Wellen instand.\nVerwendet optional Silizium, um Reichweite und Effizienz zu steigern.
-block.mend-projector.description = Heilt zyklisch Blöcke in seiner Umgebung.
+block.mender.description = Repariert regelmäßig Blöcke in seiner Umgebung. Hält die Abwehrkräfte zwischen den Wellen instand.\nVerwendet optional Silizium, um Reichweite und Effizienz zu steigern.
+block.mend-projector.description = Eine verbesserte Version des Reparateurs. Repariert regelmäßig Blöcke in seiner Umgebung.\nVerwendet optional Phasengewebe, um Reichweite und Effizienz zu steigern.
block.overdrive-projector.description = Erhöht die Geschwindigkeit von nahegelegenen Blöcken, wie Bohrer und Förderbänder.
block.force-projector.description = Erzeugt ein sechseckiges Kraftfeld um sich herum, das Blöcke und Einheiten vor Schaden schützt.
block.shock-mine.description = Beschädigt Gegner, die auf die Mine laufen. Für Gegener schwer zu sehen.
@@ -1228,13 +1228,13 @@ block.ripple.description = Ein großer Artillerie-Geschützturm, der mehrere Sch
block.cyclone.description = Ein großer Schnellfeuer-Geschützturm.
block.spectre.description = Ein großer Geschützturm, der zwei starke Schüsse gleichzeitig abfeuert.
block.meltdown.description = Ein großer Geschützturm, der starke Strahlen mit großer Reichweite abfeuert.
-block.command-center.description = Issues movement commands to allied units across the map.\nCauses units to patrol, attack an enemy core or retreat to the core/factory. When no enemy core is present, units will default to patrolling under the attack command.
+block.command-center.description = Erteilt allen verbündeten Einheiten auf der Karte Bewegungsbefehle. \nBringt Einheiten zum Patrouillieren, Angreifen eines feindlichen Kerns oder Rückzug zur Fabrik/ zum Kern. Wenn es keinen feindlichen Kern gibt, patrouillieren die Einheiten bei einem Angriffsbefehl.
block.draug-factory.description = Produziert Draug-Mining-Drohnen.
block.spirit-factory.description = Produziert leichte Drohnen, die Erz abbauen und Blöcke reparieren können.
block.phantom-factory.description = Produziert erweiterte Drohnen, die deutlich effizienter sind als Spirit-Drohnen.
block.wraith-factory.description = Produziert schnelle Abfangjäger.
block.ghoul-factory.description = Produziert schwere Flächenbomber.
-block.revenant-factory.description = Produziert schwere Raketen basierte Flugeinheiten.
+block.revenant-factory.description = Produziert schwere Raketen-basierte Flugeinheiten.
block.dagger-factory.description = Produziert Standard-Bodeneinheiten.
block.crawler-factory.description = Produziert schnelle, selbstzerstörende Schwarmeinheiten.
block.titan-factory.description = Produziert fortgeschrittene, gepanzerte Bodeneinheiten.
diff --git a/core/assets/bundles/bundle_fi.properties b/core/assets/bundles/bundle_fi.properties
index cefc5181ec..a017e15ecc 100644
--- a/core/assets/bundles/bundle_fi.properties
+++ b/core/assets/bundles/bundle_fi.properties
@@ -3,7 +3,7 @@ credits = Tekijät
contributors = Kääntäjät ja avustajat
discord = Liity Mindustryn Discordiin!
link.discord.description = Mindustryn virallinen Discord-keskusteluhuone
-link.reddit.description = Mindustry subreddit
+link.reddit.description = Mindustryn alireddit
link.github.description = Pelin lähdekoodi
link.changelog.description = Lista päivityksien muutoksista
link.dev-builds.description = Epävakaat kehitysversiot
@@ -21,15 +21,15 @@ gameover.pvp = [accent] {0}[] joukkue voittaa!
highscore = [accent]Uusi ennätys!
copied = Kopioitu.
-load.sound = Ääni
-load.map = Kartat
-load.image = Kuvat
-load.content = Sisältö
-load.system = Systeemi
-load.mod = Modit
-load.scripts = Skriptit
+load.sound = Ääniä
+load.map = Karttoja
+load.image = Kuvia
+load.content = Sisältöä
+load.system = Järjestelmää
+load.mod = Modeja
+load.scripts = Skriptejä
-be.update = A new Bleeding Edge build is available:
+be.update = Uusi kehitysversio on saatavilla:
be.update.confirm = Lataa se ja käynnistä peli uudelleen?
be.updating = Päivitetään...
be.ignore = Sivuuta
@@ -37,20 +37,20 @@ be.noupdates = Ei päivityksiä saatavilla.
be.check = Tarkista päivityksiä
schematic = Kaavio
-schematic.add = Tallenna Kaavio...
+schematic.add = Tallenna kaavio...
schematics = Kaaviot
schematic.replace = Kaavio tällä nimellä on jo olemassa. Haluatko korvata sen?
-schematic.import = Tuo Kaavio...
-schematic.exportfile = Luo Tiedosto
-schematic.importfile = Tuo Tiedosto
-schematic.browseworkshop = Selaa Työpajaa
-schematic.copy = Kopioi Leikepöydälle
-schematic.copy.import = Tou Leikepöydälle
-schematic.shareworkshop = Jaa työpajaan
+schematic.import = Tuo kaavio...
+schematic.exportfile = Vie tiedosto
+schematic.importfile = Tuo tiedosto
+schematic.browseworkshop = Selaa Workshoppia
+schematic.copy = Kopioi leikepöydälle
+schematic.copy.import = Tuo leikepöydältä
+schematic.shareworkshop = Jaa Workshoppiin
schematic.flip = [accent][[{0}][]/[accent][[{1}][]: Käännä Kaavio
schematic.saved = Kaavio tallennettu.
schematic.delete.confirm = Tämä kaavio poistetaan.
-schematic.rename = Uudelleennimeä Kaavio
+schematic.rename = Nimeä kaavio uudelleen
schematic.info = {0}x{1}, {2} palikkaa
stat.wave = Tasoja voitettu:[accent] {0}
@@ -62,7 +62,7 @@ stat.delivered = Resursseja laukaistu:
stat.rank = Lopullinen arvosana: [accent]{0}
launcheditems = [accent]Laukaistut tavarat
-launchinfo = [unlaunched][[LAUNCH] your core to obtain the items indicated in blue.
+launchinfo = [unlaunched][[LAUKAISE] ytimesi saadaksesi sinisellä merkityt tavarat.
map.delete = Oletko varma että haluat poistaa kartan "[accent]{0}[]"?
level.highscore = Ennätys: [accent]{0}
level.select = Tason valinta
@@ -82,12 +82,12 @@ position = Sijainti
close = Sulje
website = Verkkosivu
quit = Poistu
-save.quit = Tallenna ja Poistu
+save.quit = Tallenna ja poistu
maps = Kartat
-maps.browse = Selaa Karttoja
+maps.browse = Selaa karttoja
continue = Jatka
maps.none = [lightgray]Karttoja ei löytynyt!
-invalid = Invalidi
+invalid = Virheellinen
pickcolor = Valitse väri
preparingconfig = Preparing Config
preparingcontent = Preparing Content
@@ -95,29 +95,29 @@ uploadingcontent = Uploading Content
uploadingpreviewfile = Uploading Preview File
committingchanges = Comitting Changes
done = Valmis
-feature.unsupported = Sinun laitteesi ei tue tätä toimintoa.
+feature.unsupported = Laitteesi ei tue tätä toimintoa.
mods.alphainfo = Pidä mielessä että modit ovat alpha-tilassa, ja[scarlet] ne voivat olla virheellisiä[].\nRaportoi kaikki virheet Mindustry GitHub-sivuille tai Discordiin.
mods.alpha = [accent](Alpha)
mods = Modit
mods.none = [LIGHT_GRAY]Modeja ei löytynyt!
-mods.guide = Modaamisen opas
+mods.guide = Modaamisopas
mods.report = Raportoi ohjelmistovirhe
-mods.openfolder = Avaa Modikansio
+mods.openfolder = Avaa modikansio
mod.enabled = [lightgray]Käytössä
-mod.disabled = [scarlet]Epäkäytössä
-mod.disable = Laita pois päältä
-mod.delete.error = Modia ei pystynyt poistamaan. Tiedosto voi olla käytössä.
-mod.requiresversion = [scarlet]Tarvitsee vähintää pelin version: [accent]{0}
+mod.disabled = [scarlet]Pois käytöstä
+mod.disable = Poista käytössä
+mod.delete.error = Modia ei pystytty poistamaan. Tiedosto voi olla käytössä.
+mod.requiresversion = [scarlet]Tarvitsee vähintään pelin version: [accent]{0}
mod.missingdependencies = [scarlet]Tarvitsee nämä modit: {0}
-mod.erroredcontent = [scarlet]Sisältö Virheet
+mod.erroredcontent = [scarlet]Sisältövirheet
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]Mod '{0}' is missing dependencies:[accent] {1}\n[lightgray]These mods need to be downloaded first.\nThis mod will be automatically disabled.
mod.enable = Käytä
mod.requiresrestart = Peli suljetaan jotta muutokset voisivat toteutua.
mod.reloadrequired = [scarlet]Vaatii Uudelleenkäynnistystä
-mod.import = Tuo Modi
+mod.import = Tuo modi
mod.import.github = Import GitHub Mod
mod.item.remove = This item is part of the[accent] '{0}'[] mod. To remove it, uninstall that mod.
mod.remove.confirm = Tämä modi poistetaan.
@@ -170,7 +170,7 @@ hosts.discovering.any = Etsitään Pelejä
server.refreshing = Päivitetään palvelimen tietoja
hosts.none = [lightgray]Paikallisia pelejä ei löytynyt!
host.invalid = [scarlet]Isäntään ei voitu yhdistää.
-trace = Seuraa Pelaajaa
+trace = Seuraa pelaajaa
trace.playername = Pelaajanimi: [accent]{0}
trace.ip = IP-osoite: [accent]{0}
trace.id = Uniikki tunniste: [accent]{0}
@@ -188,8 +188,8 @@ server.outdated = [crimson]Vanhentunut palvelin![]
server.outdated.client = [crimson]Vanhentunut asiakasohjelma![]
server.version = [gray]v{0} {1}
server.custombuild = [yellow]Custom Build
-confirmban = Oletko varma että haluat potkia tämän pelaajan?
-confirmkick = Oletko varma että haluat poistaa tämän pelaajan?
+confirmban = Oletko varma että haluat antaa porttikiellon tälle pelaajalle?
+confirmkick = Oletko varma että haluat potkia tämän pelaajan?
confirmvotekick = Oletko varma että haluat äänestää tämän pelaajan potkituksi?
confirmunban = Oletko varma että haluat päästää tämän pelaajan takaisin?
confirmadmin = Oletko varma että haluat antaa pelaajalle hallinto-oikeuksia?
@@ -208,32 +208,32 @@ server.port = Portti:
server.addressinuse = Address already in use!
server.invalidport = Invalid port number!
server.error = [crimson]Error hosting server: [accent]{0}
-save.new = New Save
+save.new = Uusi tallennus
save.overwrite = Are you sure you want to overwrite\nthis save slot?
overwrite = Overwrite
save.none = No saves found!
saveload = Tallennetaan...
-savefail = Failed to save game!
+savefail = Pelin tallentaminen epäonnistui!
save.delete.confirm = Are you sure you want to delete this save?
save.delete = Delete
save.export = Export Save
save.import.invalid = [accent]This save is invalid!
save.import.fail = [crimson]Failed to import save: [accent]{0}
save.export.fail = [crimson]Failed to export save: [accent]{0}
-save.import = Tuo Tallennus
+save.import = Tuo tallennus
save.newslot = Tallennuksen nimi:
save.rename = Nimeä uudelleen
save.rename.text = Uusi nimi:
selectslot = Valitse tallennus.
slot = [accent]Paikka {0}
-editmessage = Edit Message
+editmessage = Muokkaa viestiä
save.corrupted = [accent]Tallennustiedosto korruptoitunut tai viallinen!\nJos olet päivittänyt juuri pelisi, tämä on todennäköisesti muutos tallennusmuodossa [scarlet]eikä[] virhe.
empty =
on = Päällä
off = Pois
save.autosave = Automaattitallennus: {0}
save.map = Kartta: {0}
-save.wave = Aalto {0}
+save.wave = Taso {0}
save.mode = Gamemode: {0}
save.date = Viimeksi tallennettu: {0}
save.playtime = Peliaika: {0}
@@ -308,15 +308,15 @@ editor.waves = Tasot:
editor.rules = Säännöt:
editor.generation = Generaatio:
editor.ingame = Muokka pelin sisällä
-editor.publish.workshop = Julkaise työpajaan
+editor.publish.workshop = Julkaise Workshoppiin
editor.newmap = Uusi kartta
-workshop = Työpaja
+workshop = Workshop
waves.title = Tasot
waves.remove = Poista
waves.never =
waves.every = every
waves.waves = wave(s)
-waves.perspawn = per spawni
+waves.perspawn = per syntymispiste
waves.to = to
waves.boss = Pomo
waves.preview = Esikatselu
@@ -324,13 +324,13 @@ waves.edit = Muokkaa...
waves.copy = Kopioi leikepöydälle
waves.load = Lataa leikepöydältä
waves.invalid = Invalid waves in clipboard.
-waves.copied = Aallot kopioitu.
+waves.copied = Tasot kopioitu.
waves.none = No enemies defined.\nNote that empty wave layouts will automatically be replaced with the default layout.
editor.default = [lightgray]
details = Yksityiskohdat...
edit = Muokkaa...
editor.name = Nimi:
-editor.spawn = Spawni yksikkö
+editor.spawn = Luo yksikkö
editor.removeunit = Poista yksikkö
editor.teams = Joukkueet
editor.errorload = Virhe ladattaessa tiedostoa:\n[accent]{0}
@@ -431,8 +431,8 @@ fps = FPS: {0}
ping = Ping: {0}ms
language.restart = Please restart your game for the language settings to take effect.
settings = Asetukset
-tutorial = Tutoriaali
-tutorial.retake = Uusita Tutoriaali
+tutorial = Perehdytys
+tutorial.retake = Pelaa perehdytys uudelleen
editor = Editori
mapeditor = Kartan Editori
@@ -449,8 +449,8 @@ launch = < LAUNCH >
launch.title = Onnistunut laukaisu
launch.next = [lightgray]next opportunity at wave {0}
launch.unable2 = [scarlet]Unable to LAUNCH.[]
-launch.confirm = Tämä laukaisee kaikki resourssit ytimestäsi.\nEt voi enää palata takaisin.
-launch.skip.confirm = Jos ohitat nyt, voit laukaista vasta myöhemmissä tasoissa.
+launch.confirm = Tämä laukaisee kaikki resurssit ytimestäsi.\nEt voi enää palata takaisin.
+launch.skip.confirm = Jos ohitat nyt, voit laukaista vasta myöhemmillä tasoilla.
uncover = Paljasta
configure = Configure Loadout
bannedblocks = Kielletyt Palikat
@@ -530,60 +530,60 @@ error.title = [crimson]An error has occured
error.crashtitle = An error has occured
blocks.input = Sisääntulo
blocks.output = Ulostulo
-blocks.booster = Boostaa
+blocks.booster = Tehostaja
block.unknown = [lightgray]???
blocks.powercapacity = Energiakapasiteetti
blocks.powershot = Energiaa/Ammus
blocks.damage = Vahinko
-blocks.targetsair = Hyökkää Ilmaan
-blocks.targetsground = Hyökkää Maahan
+blocks.targetsair = Hyökkää ilmaan
+blocks.targetsground = Hyökkää maahan
blocks.itemsmoved = Liikkumisnopeus
-blocks.launchtime = Aika Laukaisujen Välillä
+blocks.launchtime = Aika laukaisujen välillä
blocks.shootrange = Kantama
blocks.size = Koko
-blocks.liquidcapacity = Neste Kapasiteetti
-blocks.powerrange = Energia Kantama
-blocks.powerconnections = Maksimi konnektio määrä
-blocks.poweruse = Energian Käyttö
+blocks.liquidcapacity = Nestekapasiteetti
+blocks.powerrange = Energiakantama
+blocks.powerconnections = Maksimimäärä yhdistyksiä
+blocks.poweruse = Energian käyttö
blocks.powerdamage = Energia/Vahinko
-blocks.itemcapacity = Tavara Kapasiteetti
-blocks.basepowergeneration = Kanta Enegian Generointi
-blocks.productiontime = Produktion Aika
-blocks.repairtime = Kokonaisen Palikan Korjaus Aika
-blocks.speedincrease = Nopeuden Kasvu
+blocks.itemcapacity = Tavarakapasiteetti
+blocks.basepowergeneration = Perus energiantuotto
+blocks.productiontime = Tuotantoaika
+blocks.repairtime = Kokonaisen palikan korjausaika
+blocks.speedincrease = Nopeuden kasvu
blocks.range = Etäisyys
blocks.drilltier = Porattavat
blocks.drillspeed = Kanta Poran Nopeus
-blocks.boosteffect = Boostaamisen Vaikutus
-blocks.maxunits = Maksimi Määrä Yksikköjä
+blocks.boosteffect = Tehostamisem vaikutus
+blocks.maxunits = Maksimimäärä yksikköjä
blocks.health = Elämäpisteet
-blocks.buildtime = Rakentamisen Aika
-blocks.buildcost = Rakentamisen Hinta
+blocks.buildtime = Rakentamisaika
+blocks.buildcost = Rakentamishinta
blocks.inaccuracy = Epätarkkuus
blocks.shots = Ammusta
-blocks.reload = Ammusta/Sekunnissa
+blocks.reload = Ammusta/sekunnissa
blocks.ammo = Ammus
-bar.drilltierreq = Parempi Pora Vaadittu
-bar.drillspeed = Poran Nopeus: {0}/s
-bar.pumpspeed = Pumpun Nopeus: {0}/s
+bar.drilltierreq = Parempi pora vaadittu
+bar.drillspeed = Poran nopeus: {0}/s
+bar.pumpspeed = Pumpun nopeus: {0}/s
bar.efficiency = Tehokkuus: {0}%
bar.powerbalance = Energia: {0}/s
bar.powerstored = Säilöttynä: {0}/{1}
bar.poweramount = Energia: {0}
-bar.poweroutput = Energian Ulostulo: {0}
+bar.poweroutput = Energiantuotto: {0}
bar.items = Tavaroita: {0}
bar.capacity = Kapasiteetti: {0}
bar.liquid = Neste
bar.heat = Lämpö
bar.power = Energia
-bar.progress = Rakennuksen Edistys
+bar.progress = Rakennuksen edistys
bar.spawned = Yksikköjä: {0}/{1}
bar.input = Sisääntulo
bar.output = Ulostulo
bullet.damage = [stat]{0}[lightgray] Vahinko
-bullet.splashdamage = [stat]{0}[lightgray] Alue vahinko ~[stat] {1}[lightgray] palikkaa
+bullet.splashdamage = [stat]{0}[lightgray] Aluevahinko ~[stat] {1}[lightgray] palikkaa
bullet.incendiary = [stat]sytyttävä
bullet.homing = [stat]itseohjautuva
bullet.shock = [stat]shokki
@@ -591,15 +591,15 @@ bullet.frag = [stat]sirpaloituva
bullet.knockback = [stat]{0}[lightgray] knockback
bullet.freezing = [stat]jäädyttävä
bullet.tarred = [stat]tervattu
-bullet.multiplier = [stat]{0}[lightgray]x ammusten multiplikaatio
-bullet.reload = [stat]{0}[lightgray]x ammunta nopeus
+bullet.multiplier = [stat]{0}[lightgray]x ammusten kerroin
+bullet.reload = [stat]{0}[lightgray]x ampumisnopeus
unit.blocks = palikat
-unit.powersecond = energia yksikköä/sekunti
-unit.liquidsecond = neste yksikköä/sekunti
+unit.powersecond = energiayksikköä/sekunti
+unit.liquidsecond = nesteyksikköä/sekunti
unit.itemssecond = esinettä/sekunti
-unit.liquidunits = neste yksikköä
-unit.powerunits = energia yksikköä
+unit.liquidunits = nesteyksikköä
+unit.powerunits = energiayksikköä
unit.degrees = astetta
unit.seconds = sekunttia
unit.persecond = /s
@@ -614,25 +614,25 @@ category.liquids = Neste
category.items = Tavarat
category.crafting = Ulos/Sisääntulo
category.shooting = Ammunta
-category.optional = Mahdolliset Lumoukset
+category.optional = Mahdolliset parannukset
setting.landscape.name = Lukitse tasavaakaan
setting.shadows.name = Varjot
setting.blockreplace.name = Automaattisia Palikka Suosituksia
-setting.linear.name = Lineararien Filteeraus
+setting.linear.name = Lineaarinen suodatus
setting.hints.name = Vihjeet
setting.buildautopause.name = Automaattisest Pysäytä Rakentaessa
-setting.animatedwater.name = Animoitu Vesi
-setting.animatedshields.name = Animoitu Kilpi
+setting.animatedwater.name = Animoitu vesi
+setting.animatedshields.name = Animoidut kilvet
setting.antialias.name = Antialiaasi[lightgray] (vaatii uudelleenkäynnistyksen)[]
setting.indicators.name = Vihollis/Puolulais Indikaattorit
setting.autotarget.name = Automaatinen Tähtäys
-setting.keyboard.name = Hiiri+Näppäimistö Kontrollit
-setting.touchscreen.name = Kosketusnäyttö kontrollit
+setting.keyboard.name = Hiiri+Näppäimistö -ohjaus
+setting.touchscreen.name = Kosketusnäyttöohjaus
setting.fpscap.name = Maksimi FPS
setting.fpscap.none = Ei Mitään
setting.fpscap.text = {0} FPS
setting.uiscale.name = UI Koko[lightgray] (vaatii uudelleenkäynnistyksen)[]
-setting.swapdiagonal.name = Aina Vino Korvaus
+setting.swapdiagonal.name = Aina vino korvaus
setting.difficulty.training = Treeni
setting.difficulty.easy = Helppo
setting.difficulty.normal = Keskivaikea
@@ -641,10 +641,10 @@ setting.difficulty.insane = Järjetön
setting.difficulty.name = Vaikeustaso:
setting.screenshake.name = Näytön keikkuminen
setting.effects.name = Naytön Efektit
-setting.destroyedblocks.name = Näytä Tuhoutuneet Palikat
+setting.destroyedblocks.name = Näytä tuhoutuneet palikat
setting.conveyorpathfinding.name = Conveyor Placement Pathfinding
setting.coreselect.name = Allow Schematic Cores
-setting.sensitivity.name = Kontrollin Herkkyys
+setting.sensitivity.name = Ohjauksen herkkyys
setting.saveinterval.name = Tallennuksen Aikaväli
setting.seconds = {0} Sekunttia
setting.blockselecttimeout.name = Block Select Timeout
@@ -652,35 +652,35 @@ setting.milliseconds = {0} millisekunttia
setting.fullscreen.name = Fullscreen
setting.borderlesswindow.name = Borderless Window[lightgray] (vaatii uudelleenkäynnistyksen)
setting.fps.name = Näytä FPS
-setting.blockselectkeys.name = Bäytä Palikan Selektio Kontrollit
+setting.blockselectkeys.name = Näytä palikan valintaohjaimet
setting.vsync.name = VSync
setting.pixelate.name = Pixeloi[lightgray] (poistaa animaation käytöstä)
-setting.minimap.name = Näytä Minimappi
+setting.minimap.name = Näytä pienoiskartta
setting.position.name = Näytä pelaajan sijainti
-setting.musicvol.name = Musiikin Äänenvoimakkuus
-setting.ambientvol.name = Tausta Äänet
-setting.mutemusic.name = Sulje Musiikki
-setting.sfxvol.name = SFX Volyymi
-setting.mutesound.name = Sulje Äänet
+setting.musicvol.name = Musiikin äänenvoimakkuus
+setting.ambientvol.name = Taustaäänet
+setting.mutemusic.name = Mykistä musiikki
+setting.sfxvol.name = SFX-voimakkuus
+setting.mutesound.name = Mykistä äänet
setting.crashreport.name = Send Anonymous Crash Reports
-setting.savecreate.name = Luo Automaattisesti Tallennukset
+setting.savecreate.name = Luo tallenuksia automaattisesti
setting.publichost.name = Public Game Visibility
-setting.chatopacity.name = Chatin Läpinäkymättömyys
-setting.lasersopacity.name = Energia Laaserin Läpinäkymattämyys
-setting.playerchat.name = Näytä Pelinsisäinen Keskustelu
+setting.chatopacity.name = Keskustelun läpinäkymättömyys
+setting.lasersopacity.name = Energia laserin läpinäkymättömyys
+setting.playerchat.name = Näytä pelinsisäinen keskustelu
public.confirm = Do you want to make your game public?\n[accent]Anyone will be able to join your games.\n[lightgray]This can be changed later in Settings->Game->Public Game Visibility.
public.beta = Note that beta versions of the game cannot make public lobbies.
uiscale.reset = UI scale has been changed.\nPress "OK" to confirm this scale.\n[scarlet]Reverting and exiting in[accent] {0}[] seconds...
-uiscale.cancel = Peruuta ja Poistu
+uiscale.cancel = Peruuta ja poistu
setting.bloom.name = Bloom
keybind.title = Rebind Keys
keybinds.mobile = [scarlet]Most keybinds here are not functional on mobile. Only basic movement is supported.
category.general.name = General
category.view.name = View
-category.multiplayer.name = Multiplayer
-command.attack = Hyökkää
-command.rally = Kutsu Koolle
-command.retreat = Palaa
+category.multiplayer.name = Moninpeli
+command.attack = Hyökkäys
+command.rally = Kokoontuminen
+command.retreat = Perääntyminen
placement.blockselectkeys = \n[lightgray]Key: [{0},
keybind.clear_building.name = Clear Building
keybind.press = Press a key...
@@ -711,7 +711,7 @@ 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 = Vaihda Fullscreen
+keybind.fullscreen.name = Vaihda kokonäyttötilaan
keybind.select.name = Select/Shoot
keybind.diagonal_placement.name = Diagonal Placement
keybind.pick.name = Pick Block
@@ -722,8 +722,8 @@ keybind.zoom.name = Zoom
keybind.menu.name = Menu
keybind.pause.name = Pause
keybind.pause_building.name = Pause/Resume Building
-keybind.minimap.name = Minimappi
-keybind.chat.name = Chatti
+keybind.minimap.name = Pienoiskartta
+keybind.chat.name = Keskustelu
keybind.player_list.name = Player list
keybind.console.name = Console
keybind.rotate.name = Rotate
@@ -736,9 +736,9 @@ keybind.drop_unit.name = Drop Unit
keybind.zoom_minimap.name = Zoom minimap
mode.help.title = Description of modes
mode.survival.name = Survival
-mode.survival.description = Normaali moodi. Rajoitettu määrä resursseja ja tasoilla on aika.\n[gray]Vaatii vihollis spawneja kartassa.
+mode.survival.description = Normaali tila. Rajoitettu määrä resursseja ja tasoilla on aika.\n[gray]Vaatii vihollisten syntymispisteen kartassa.
mode.sandbox.name = Hiekkalaatikko
-mode.sandbox.description = Ikuisesti resursseja ja tasoilla ei ole aikaa.
+mode.sandbox.description = Ikuisesti resursseja ja tasoja ei ole ajastettu.
mode.editor.name = Editori
mode.pvp.name = PvP
mode.pvp.description = Fight against other players locally.\n[gray]Requires at least 2 differently-colored cores in the map to play.
@@ -746,9 +746,9 @@ mode.attack.name = Attack
mode.attack.description = Destroy the enemy's base. No waves.\n[gray]Requires a red core in the map to play.
mode.custom = Custom Rules
-rules.infiniteresources = Ikuisesti Resursseja
-rules.reactorexplosions = Reaktori Räjähdykset
-rules.wavetimer = Tasojen Aikaraja
+rules.infiniteresources = Ikuiset resurssit
+rules.reactorexplosions = Reaktorien räjähtäminen
+rules.wavetimer = Tasojen aikaraja
rules.waves = Tasot
rules.attack = Attack Mode
rules.enemyCheat = Infinite AI (Red Team) Resources
@@ -791,11 +791,11 @@ item.titanium.name = Titaani
item.thorium.name = Torium
item.silicon.name = Pii
item.plastanium.name = Plastaniumi
-item.phase-fabric.name = Kiihde Kuitu
-item.surge-alloy.name = Taite Seos
-item.spore-pod.name = Itiö Palko
+item.phase-fabric.name = Kiihdekuitu
+item.surge-alloy.name = Taiteseos
+item.spore-pod.name = Itiöpalko
item.sand.name = Hiekka
-item.blast-compound.name = Räjähde Yhdiste
+item.blast-compound.name = Räjähdeyhdiste
item.pyratite.name = Pyratiitti
item.metaglass.name = Metallilasi
item.scrap.name = Romu
@@ -824,7 +824,7 @@ mech.trident-ship.name = Trident
mech.trident-ship.weapon = Bomb Bay
mech.glaive-ship.name = Glaive
mech.glaive-ship.weapon = Flame Repeater
-item.corestorable = [lightgray]Säilöttävissä Ytimeen: {0}
+item.corestorable = [lightgray]Säilöttävissä ytimeen: {0}
item.explosiveness = [lightgray]Räjädysmäisyys: {0}%
item.flammability = [lightgray]Flammability: {0}%
item.radioactivity = [lightgray]Radioactivity: {0}%
@@ -832,12 +832,12 @@ unit.health = [lightgray]Elämäpisteet: {0}
unit.speed = [lightgray]Nopeus: {0}
mech.weapon = [lightgray]Ase: {0}
mech.health = [lightgray]Elämäpisteet: {0}
-mech.itemcapacity = [lightgray]Tavara Kapasiteetti: {0}
-mech.minespeed = [lightgray]Louhimis Nopeus: {0}%
-mech.minepower = [lightgray]Louhimis Voima: {0}
-mech.ability = [lightgray]Spesiaalikyky: {0}
-mech.buildspeed = [lightgray]Rakennus Nopeus: {0}%
-liquid.heatcapacity = [lightgray]Lämpö Kapasiteetti: {0}
+mech.itemcapacity = [lightgray]Tavarakapasiteetti: {0}
+mech.minespeed = [lightgray]Louhimisnopeus: {0}%
+mech.minepower = [lightgray]Louhimisvoima: {0}
+mech.ability = [lightgray]Erityiskyky: {0}
+mech.buildspeed = [lightgray]Rakentamisnopeus: {0}%
+liquid.heatcapacity = [lightgray]Lämpökapasiteetti: {0}
liquid.viscosity = [lightgray]Tahmeus: {0}
liquid.temperature = [lightgray]Lämpö: {0}
@@ -865,21 +865,21 @@ block.scrap-wall-huge.name = Huge Scrap Wall
block.scrap-wall-gigantic.name = Gigantic Scrap Wall
block.thruster.name = Thruster
block.kiln.name = Kiln
-block.graphite-press.name = Grafiitti Puristin
-block.multi-press.name = Multi-Puristin
+block.graphite-press.name = Grafiittipuristin
+block.multi-press.name = Monipuristin
block.constructing = {0} [lightgray](Rakentamassa)
-block.spawn.name = Vihollis Spawni
+block.spawn.name = Vihollisten syntymispiste
block.core-shard.name = Ydin: Siru
block.core-foundation.name = Ydin: Pohjaus
block.core-nucleus.name = Ydin: Tuma
-block.deepwater.name = Syvä Vesi
+block.deepwater.name = Syvä vesi
block.water.name = Vesi
-block.tainted-water.name = Pilattu Vesi
+block.tainted-water.name = Pilaantunut vesi
block.darksand-tainted-water.name = Dark Sand Tainted Water
block.tar.name = Terva
block.stone.name = Kivi
block.sand.name = Hiekka
-block.darksand.name = Tumma Hiekka
+block.darksand.name = Tumma hiekka
block.ice.name = Jää
block.snow.name = Lumi
block.craters.name = Kraatterit
diff --git a/core/assets/scripts/base.js b/core/assets/scripts/base.js
index 6ce3070968..9c06bed19c 100755
--- a/core/assets/scripts/base.js
+++ b/core/assets/scripts/base.js
@@ -17,4 +17,4 @@ const cons = method => new Cons(){get: method}
const prov = method => new Prov(){get: method}
const newEffect = (lifetime, renderer) => new Effects.Effect(lifetime, new Effects.EffectRenderer({render: renderer}))
Call = Packages.mindustry.gen.Call
-const Calls = Call //backwards compat
\ No newline at end of file
+const Calls = Call //backwards compat
diff --git a/core/build.gradle b/core/build.gradle
index ea07c810b3..0923858a74 100644
--- a/core/build.gradle
+++ b/core/build.gradle
@@ -1,4 +1,4 @@
apply plugin: "java"
sourceCompatibility = 1.8
[compileJava, compileTestJava]*.options*.encoding = 'UTF-8'
-sourceSets.main.java.srcDirs = ["src/", "$buildDir/generated/sources/annotationProcessor/java/main"]
\ No newline at end of file
+sourceSets.main.java.srcDirs = ["src/", "$buildDir/generated/sources/annotationProcessor/java/main"]
diff --git a/core/src/mindustry/content/Blocks.java b/core/src/mindustry/content/Blocks.java
index e6428ad0e0..2425482efa 100644
--- a/core/src/mindustry/content/Blocks.java
+++ b/core/src/mindustry/content/Blocks.java
@@ -58,7 +58,7 @@ public class Blocks implements ContentList{
//transport
conveyor, titaniumConveyor, armoredConveyor, distributor, junction, itemBridge, phaseConveyor, sorter, invertedSorter, router, overflowGate, underflowGate, massDriver,
- //liquids
+ //liquid
mechanicalPump, rotaryPump, thermalPump, conduit, pulseConduit, platedConduit, liquidRouter, liquidTank, liquidJunction, bridgeConduit, phaseConduit,
//power
diff --git a/core/src/mindustry/core/Platform.java b/core/src/mindustry/core/Platform.java
index fda4ea4564..ba23ff61a5 100644
--- a/core/src/mindustry/core/Platform.java
+++ b/core/src/mindustry/core/Platform.java
@@ -130,4 +130,4 @@ public interface Platform{
/** Stops forcing the app into landscape orientation.*/
default void endForceLandscape(){
}
-}
\ No newline at end of file
+}
diff --git a/core/src/mindustry/editor/MapEditor.java b/core/src/mindustry/editor/MapEditor.java
index 9a2f6e1449..eefe8f174a 100644
--- a/core/src/mindustry/editor/MapEditor.java
+++ b/core/src/mindustry/editor/MapEditor.java
@@ -337,4 +337,4 @@ public class MapEditor{
world.endMapLoad();
}
}
-}
\ No newline at end of file
+}
diff --git a/core/src/mindustry/entities/units/UnitCommand.java b/core/src/mindustry/entities/units/UnitCommand.java
index dccc5076f6..dada524b84 100644
--- a/core/src/mindustry/entities/units/UnitCommand.java
+++ b/core/src/mindustry/entities/units/UnitCommand.java
@@ -15,4 +15,4 @@ public enum UnitCommand{
public String localized(){
return localized;
}
-}
\ No newline at end of file
+}
diff --git a/core/src/mindustry/game/MusicControl.java b/core/src/mindustry/game/MusicControl.java
index dc1eda2591..0885d13a17 100644
--- a/core/src/mindustry/game/MusicControl.java
+++ b/core/src/mindustry/game/MusicControl.java
@@ -100,6 +100,8 @@ public class MusicControl{
/** Plays and fades in a music track. This must be called every frame.
* If something is already playing, fades out that track and fades in this new music.*/
private void play(@Nullable Music music){
+ if(!shouldPlay()) return;
+
//update volume of current track
if(current != null){
current.setVolume(fade * Core.settings.getInt("musicvol") / 100f);
@@ -143,7 +145,7 @@ public class MusicControl{
/** Plays a music track once and only once. If something is already playing, does nothing.*/
private void playOnce(Music music){
- if(current != null || music == null) return; //do not interrupt already-playing tracks
+ if(current != null || music == null || !shouldPlay()) return; //do not interrupt already-playing tracks
//save last random track played to prevent duplicates
lastRandomPlayed = music;
@@ -162,6 +164,10 @@ public class MusicControl{
current.play();
}
+ private boolean shouldPlay(){
+ return Core.settings.getInt("musicvol") > 0;
+ }
+
/** Fades out the current track, unless it has already been silenced. */
private void silence(){
play(null);
diff --git a/core/src/mindustry/game/Schematics.java b/core/src/mindustry/game/Schematics.java
index 2f03916d1c..edbfceedb8 100644
--- a/core/src/mindustry/game/Schematics.java
+++ b/core/src/mindustry/game/Schematics.java
@@ -375,7 +375,7 @@ public class Schematics implements Loadable{
/** Loads a schematic from base64. May throw an exception. */
public static Schematic readBase64(String schematic){
try{
- return read(new ByteArrayInputStream(Base64Coder.decode(schematic)));
+ return read(new ByteArrayInputStream(Base64Coder.decode(schematic.trim())));
}catch(IOException e){
throw new RuntimeException(e);
}
diff --git a/core/src/mindustry/io/MapIO.java b/core/src/mindustry/io/MapIO.java
index 3187b791b6..0a70a8c0f6 100644
--- a/core/src/mindustry/io/MapIO.java
+++ b/core/src/mindustry/io/MapIO.java
@@ -175,4 +175,4 @@ public class MapIO{
interface TileProvider{
Tile get(int x, int y);
}
-}
\ No newline at end of file
+}
diff --git a/core/src/mindustry/maps/Maps.java b/core/src/mindustry/maps/Maps.java
index 4279ebc765..ea12df404e 100644
--- a/core/src/mindustry/maps/Maps.java
+++ b/core/src/mindustry/maps/Maps.java
@@ -501,4 +501,4 @@ public class Maps{
return provider.next(previous);
}
}
-}
\ No newline at end of file
+}
diff --git a/core/src/mindustry/maps/filters/TerrainFilter.java b/core/src/mindustry/maps/filters/TerrainFilter.java
index b51e938633..d525f74d14 100644
--- a/core/src/mindustry/maps/filters/TerrainFilter.java
+++ b/core/src/mindustry/maps/filters/TerrainFilter.java
@@ -41,4 +41,4 @@ public class TerrainFilter extends GenerateFilter{
in.block = Blocks.air;
}
}
-}
\ No newline at end of file
+}
diff --git a/core/src/mindustry/mod/Mods.java b/core/src/mindustry/mod/Mods.java
index 1ef88311c5..fb97e5b273 100644
--- a/core/src/mindustry/mod/Mods.java
+++ b/core/src/mindustry/mod/Mods.java
@@ -611,7 +611,7 @@ public class Mods implements Loadable{
Fi metaf = zip.child("mod.json").exists() ? zip.child("mod.json") : zip.child("mod.hjson").exists() ? zip.child("mod.hjson") : zip.child("plugin.json");
if(!metaf.exists()){
- Log.warn("Mod {0} doesn't have a 'mod.json'/'plugin.json'/'mod.js' file, skipping.", sourceFile);
+ Log.warn("Mod {0} doesn't have a 'mod.json'/'mod.hjson'/'plugin.json' file, skipping.", sourceFile);
throw new IllegalArgumentException("No mod.json found.");
}
diff --git a/core/src/mindustry/net/ArcNetProvider.java b/core/src/mindustry/net/ArcNetProvider.java
index ccfdafb94f..1ed6713e93 100644
--- a/core/src/mindustry/net/ArcNetProvider.java
+++ b/core/src/mindustry/net/ArcNetProvider.java
@@ -418,4 +418,4 @@ public class ArcNetProvider implements NetProvider{
}
}
-}
\ No newline at end of file
+}
diff --git a/core/src/mindustry/net/Interpolator.java b/core/src/mindustry/net/Interpolator.java
index b2a544dbd6..42cf9df137 100644
--- a/core/src/mindustry/net/Interpolator.java
+++ b/core/src/mindustry/net/Interpolator.java
@@ -65,4 +65,4 @@ public class Interpolator{
}
}
-}
\ No newline at end of file
+}
diff --git a/core/src/mindustry/ui/ItemsDisplay.java b/core/src/mindustry/ui/ItemsDisplay.java
index 53d2ed2970..81b9439d7b 100644
--- a/core/src/mindustry/ui/ItemsDisplay.java
+++ b/core/src/mindustry/ui/ItemsDisplay.java
@@ -44,7 +44,7 @@ public class ItemsDisplay extends Table{
t.setText(state.is(State.menu) ? "$launcheditems" : "$launchinfo");
t.setChecked(col.isCollapsed());
((Image)t.getChildren().get(1)).setDrawable(col.isCollapsed() ? Icon.upOpen : Icon.downOpen);
- }).padBottom(4).left().fillX().margin(12f);
+ }).padBottom(4).left().fillX().margin(12f).minWidth(200f);
c.row();
c.add(col);
});
diff --git a/core/src/mindustry/ui/dialogs/CustomGameDialog.java b/core/src/mindustry/ui/dialogs/CustomGameDialog.java
index 03ec05961e..f47a3ac796 100644
--- a/core/src/mindustry/ui/dialogs/CustomGameDialog.java
+++ b/core/src/mindustry/ui/dialogs/CustomGameDialog.java
@@ -91,4 +91,4 @@ public class CustomGameDialog extends FloatingDialog{
cont.add(pane).uniformX();
}
-}
\ No newline at end of file
+}
diff --git a/core/src/mindustry/ui/dialogs/JoinDialog.java b/core/src/mindustry/ui/dialogs/JoinDialog.java
index 65b34ac697..fa54134d92 100644
--- a/core/src/mindustry/ui/dialogs/JoinDialog.java
+++ b/core/src/mindustry/ui/dialogs/JoinDialog.java
@@ -13,6 +13,7 @@ import arc.util.serialization.*;
import mindustry.*;
import mindustry.core.*;
import mindustry.gen.*;
+import mindustry.graphics.*;
import mindustry.net.*;
import mindustry.net.Packets.*;
import mindustry.ui.*;
@@ -25,6 +26,7 @@ public class JoinDialog extends FloatingDialog{
Server renaming;
Table local = new Table();
Table remote = new Table();
+ Table global = new Table();
Table hosts = new Table();
int totalHosts;
@@ -80,15 +82,11 @@ public class JoinDialog extends FloatingDialog{
}
});
- keyDown(KeyCode.F5, () -> {
- refreshLocal();
- refreshRemote();
- });
+ keyDown(KeyCode.F5, this::refreshAll);
shown(() -> {
setup();
- refreshLocal();
- refreshRemote();
+ refreshAll();
if(!steam){
Core.app.post(() -> Core.settings.getBoolOnce("joininfo", () -> ui.showInfo("$join.info")));
@@ -97,11 +95,16 @@ public class JoinDialog extends FloatingDialog{
onResize(() -> {
setup();
- refreshLocal();
- refreshRemote();
+ refreshAll();
});
}
+ void refreshAll(){
+ refreshLocal();
+ refreshRemote();
+ refreshGlobal();
+ }
+
void setupRemote(){
remote.clear();
@@ -128,21 +131,12 @@ public class JoinDialog extends FloatingDialog{
inner.add(button.getLabel()).growX();
inner.addImageButton(Icon.upOpen, Styles.emptyi, () -> {
- int index = servers.indexOf(server);
- if(index > 0){
- servers.remove(index);
- servers.insert(0, server);
+ moveRemote(server, -1);
- saveServers();
- setupRemote();
- for(Server other : servers){
- if(other.lastHost != null){
- setupServer(other, other.lastHost);
- }else{
- refreshServer(other);
- }
- }
- }
+ }).margin(3f).padTop(6f).top().right();
+
+ inner.addImageButton(Icon.downOpen, Styles.emptyi, () -> {
+ moveRemote(server, +1);
}).margin(3f).pad(2).padTop(6f).top().right();
@@ -172,6 +166,26 @@ public class JoinDialog extends FloatingDialog{
}
}
+ void moveRemote(Server server, int sign){
+ int index = servers.indexOf(server);
+
+ if(index + sign < 0) return;
+ if(index + sign > servers.size - 1) return;
+
+ servers.remove(index);
+ servers.insert(index + sign, server);
+
+ saveServers();
+ setupRemote();
+ for(Server other : servers){
+ if(other.lastHost != null){
+ setupServer(other, other.lastHost);
+ }else{
+ refreshServer(other);
+ }
+ }
+ }
+
void refreshRemote(){
for(Server server : servers){
refreshServer(server);
@@ -232,9 +246,9 @@ public class JoinDialog extends FloatingDialog{
hosts.clear();
- hosts.add(remote).growX();
- hosts.row();
- hosts.add(local).width(w);
+ section("$servers.local", local);
+ section("$servers.remote", remote);
+ section("$servers.global", global);
ScrollPane pane = new ScrollPane(hosts);
pane.setFadeScrollBars(false);
@@ -289,6 +303,24 @@ public class JoinDialog extends FloatingDialog{
});
}
+ void section(String label, Table servers){
+ Collapser coll = new Collapser(servers, Core.settings.getBool("collapsed-" + label, false));
+ coll.setDuration(0.1f);
+
+ hosts.table(name -> {
+ name.add(label).pad(10).growX().left().color(Pal.accent);
+ name.addImageButton(Icon.downOpen, Styles.emptyi, () -> {
+ coll.toggle(false);
+ Core.settings.putSave("collapsed-" + label, coll.isCollapsed());
+ }).update(i -> i.getStyle().imageUp = (!coll.isCollapsed() ? Icon.upOpen : Icon.downOpen)).size(40f).right().padRight(10f);
+ }).growX();
+ hosts.row();
+ hosts.addImage().growX().pad(5).padLeft(10).padRight(10).height(3).color(Pal.accent);
+ hosts.row();
+ hosts.add(coll).width(targetWidth());
+ hosts.row();
+ }
+
void refreshLocal(){
totalHosts = 0;
@@ -296,12 +328,17 @@ public class JoinDialog extends FloatingDialog{
local.background(null);
local.table(Tex.button, t -> t.label(() -> "[accent]" + Core.bundle.get("hosts.discovering.any") + Strings.animated(Time.time(), 4, 10f, ".")).pad(10f)).growX();
net.discoverServers(this::addLocalHost, this::finishLocalHosts);
+ }
+
+ void refreshGlobal(){
+ global.clear();
+ global.background(null);
for(String host : defaultServers){
String resaddress = host.contains(":") ? host.split(":")[0] : host;
int resport = host.contains(":") ? Strings.parseInt(host.split(":")[1]) : port;
net.pingHost(resaddress, resport, res -> {
res.port = resport;
- addLocalHost(res);
+ addGlobalHost(res);
}, e -> {});
}
}
@@ -334,6 +371,18 @@ public class JoinDialog extends FloatingDialog{
buildServer(host, button);
}
+ void addGlobalHost(Host host){
+ global.background(null);
+ float w = targetWidth();
+
+ global.row();
+
+ TextButton button = global.addButton("", Styles.cleart, () -> safeConnect(host.address, host.port, host.version))
+ .width(w).pad(5f).get();
+ button.clearChildren();
+ buildServer(host, button);
+ }
+
public void connect(String ip, int port){
if(player.name().trim().isEmpty()){
ui.showInfo("$noname");
@@ -428,4 +477,4 @@ public class JoinDialog extends FloatingDialog{
public Server(){
}
}
-}
+}
\ No newline at end of file
diff --git a/core/src/mindustry/ui/layout/BranchTreeLayout.java b/core/src/mindustry/ui/layout/BranchTreeLayout.java
index 15dbe4ae6f..0e24685705 100644
--- a/core/src/mindustry/ui/layout/BranchTreeLayout.java
+++ b/core/src/mindustry/ui/layout/BranchTreeLayout.java
@@ -288,4 +288,4 @@ public class BranchTreeLayout implements TreeLayout{
public enum TreeAlignment{
center, towardsRoot, awayFromRoot
}
-}
\ No newline at end of file
+}
diff --git a/core/src/mindustry/world/blocks/Floor.java b/core/src/mindustry/world/blocks/Floor.java
index 35a6990287..fe5fa13e52 100644
--- a/core/src/mindustry/world/blocks/Floor.java
+++ b/core/src/mindustry/world/blocks/Floor.java
@@ -222,4 +222,4 @@ public class Floor extends Block{
return block.edges()[x][2 - y];
}
-}
\ No newline at end of file
+}
diff --git a/core/src/mindustry/world/blocks/distribution/Conveyor.java b/core/src/mindustry/world/blocks/distribution/Conveyor.java
index 4f60d5a319..5768931ffb 100644
--- a/core/src/mindustry/world/blocks/distribution/Conveyor.java
+++ b/core/src/mindustry/world/blocks/distribution/Conveyor.java
@@ -378,4 +378,4 @@ public class Conveyor extends Block implements Autotiler{
}
}
}
-}
\ No newline at end of file
+}
diff --git a/core/src/mindustry/world/blocks/distribution/Junction.java b/core/src/mindustry/world/blocks/distribution/Junction.java
index eeb2b69376..53b927b13c 100644
--- a/core/src/mindustry/world/blocks/distribution/Junction.java
+++ b/core/src/mindustry/world/blocks/distribution/Junction.java
@@ -23,7 +23,6 @@ public class Junction extends Block{
super(name);
update = true;
solid = true;
- instantTransfer = true;
group = BlockGroup.transportation;
unloadable = false;
entityType = JunctionEntity::new;
diff --git a/core/src/mindustry/world/blocks/liquid/LiquidExtendingBridge.java b/core/src/mindustry/world/blocks/liquid/LiquidExtendingBridge.java
index 99cdec27ab..f3baf6283a 100644
--- a/core/src/mindustry/world/blocks/liquid/LiquidExtendingBridge.java
+++ b/core/src/mindustry/world/blocks/liquid/LiquidExtendingBridge.java
@@ -39,7 +39,6 @@ public class LiquidExtendingBridge extends ExtendingItemBridge{
}
if(entity.uptime >= 0.5f){
-
if(tryMoveLiquid(tile, other, false, entity.liquids().current()) > 0.1f){
entity.cycleSpeed = Mathf.lerpDelta(entity.cycleSpeed, 4f, 0.05f);
}else{
diff --git a/core/src/mindustry/world/blocks/production/GenericCrafter.java b/core/src/mindustry/world/blocks/production/GenericCrafter.java
index 8db6b86df1..67d7aecb85 100644
--- a/core/src/mindustry/world/blocks/production/GenericCrafter.java
+++ b/core/src/mindustry/world/blocks/production/GenericCrafter.java
@@ -137,7 +137,7 @@ public class GenericCrafter extends Block{
if(outputItem != null && tile.entity.items().get(outputItem.item) >= itemCapacity){
return false;
}
- return outputLiquid == null || !(tile.entity.liquids().get(outputLiquid.liquid) >= liquidCapacity);
+ return outputLiquid == null || !(tile.entity.liquids().get(outputLiquid.liquid) >= liquidCapacity - 0.001f);
}
@Override
diff --git a/core/src/mindustry/world/meta/values/FloorValue.java b/core/src/mindustry/world/meta/values/FloorValue.java
index 7993a60eb0..81b612164b 100644
--- a/core/src/mindustry/world/meta/values/FloorValue.java
+++ b/core/src/mindustry/world/meta/values/FloorValue.java
@@ -18,4 +18,4 @@ public class FloorValue implements StatValue{
table.add(new Image(floor.icon(Cicon.small))).padRight(3);
table.add(floor.localizedName).padRight(3);
}
-}
\ No newline at end of file
+}
diff --git a/fastlane/metadata/android/cs-CZ/title.txt b/fastlane/metadata/android/cs-CZ/title.txt
index 2beb939017..e2842b447a 100644
--- a/fastlane/metadata/android/cs-CZ/title.txt
+++ b/fastlane/metadata/android/cs-CZ/title.txt
@@ -1 +1 @@
-Mindustry
\ No newline at end of file
+Mindustry
diff --git a/fastlane/metadata/android/en-US/changelogs/12203.txt b/fastlane/metadata/android/en-US/changelogs/12203.txt
index 942424c5ea..8cefa14d20 100644
--- a/fastlane/metadata/android/en-US/changelogs/12203.txt
+++ b/fastlane/metadata/android/en-US/changelogs/12203.txt
@@ -1,3 +1,3 @@
- Fixed incorrect attribution in credits; music was made by "A Drop A Day"
- Removed unneeded 3.5 upgrade dialog that sometimes showed up in main menu
-- Added information dialog regarding v4 beta
\ No newline at end of file
+- Added information dialog regarding v4 beta
diff --git a/fastlane/metadata/android/en-US/changelogs/12205.txt b/fastlane/metadata/android/en-US/changelogs/12205.txt
index 70bcab4bfc..d2fbea0415 100644
--- a/fastlane/metadata/android/en-US/changelogs/12205.txt
+++ b/fastlane/metadata/android/en-US/changelogs/12205.txt
@@ -1,4 +1,4 @@
- Fixed incorrect attribution in credits; music was made by "A Drop A Day"
- Removed unneeded 3.5 upgrade dialog that sometimes showed up in main menu
- Added information dialog regarding v4 beta
-- Fixed Discord link
\ No newline at end of file
+- Fixed Discord link
diff --git a/fastlane/metadata/android/en-US/changelogs/26593.txt b/fastlane/metadata/android/en-US/changelogs/26593.txt
index 610563a652..7e281e161b 100644
--- a/fastlane/metadata/android/en-US/changelogs/26593.txt
+++ b/fastlane/metadata/android/en-US/changelogs/26593.txt
@@ -1 +1 @@
-sound.
\ No newline at end of file
+sound.
diff --git a/fastlane/metadata/android/en-US/changelogs/27434.txt b/fastlane/metadata/android/en-US/changelogs/27434.txt
index 5240303123..0228878dee 100644
--- a/fastlane/metadata/android/en-US/changelogs/27434.txt
+++ b/fastlane/metadata/android/en-US/changelogs/27434.txt
@@ -1 +1 @@
-everything
\ No newline at end of file
+everything
diff --git a/fastlane/metadata/android/en-US/changelogs/27476.txt b/fastlane/metadata/android/en-US/changelogs/27476.txt
index ec779fbdba..f7a9042cc4 100644
--- a/fastlane/metadata/android/en-US/changelogs/27476.txt
+++ b/fastlane/metadata/android/en-US/changelogs/27476.txt
@@ -1 +1 @@
-Fixed some minor sound/multiplayer issues
\ No newline at end of file
+Fixed some minor sound/multiplayer issues
diff --git a/fastlane/metadata/android/en-US/changelogs/27689.txt b/fastlane/metadata/android/en-US/changelogs/27689.txt
index 92e8a8c47e..f849f7a245 100644
--- a/fastlane/metadata/android/en-US/changelogs/27689.txt
+++ b/fastlane/metadata/android/en-US/changelogs/27689.txt
@@ -1 +1 @@
-Bugfixes
\ No newline at end of file
+Bugfixes
diff --git a/fastlane/metadata/android/en-US/changelogs/27770.txt b/fastlane/metadata/android/en-US/changelogs/27770.txt
index 04d19b551f..06f22342a3 100644
--- a/fastlane/metadata/android/en-US/changelogs/27770.txt
+++ b/fastlane/metadata/android/en-US/changelogs/27770.txt
@@ -1 +1 @@
-Added ambient sounds for machines.
\ No newline at end of file
+Added ambient sounds for machines.
diff --git a/fastlane/metadata/android/en-US/changelogs/27997.txt b/fastlane/metadata/android/en-US/changelogs/27997.txt
index 2b2809c72d..9b26aa3618 100644
--- a/fastlane/metadata/android/en-US/changelogs/27997.txt
+++ b/fastlane/metadata/android/en-US/changelogs/27997.txt
@@ -1,2 +1,2 @@
The first release of version 4.0; an update that has been in the works for over a year.
-Extensive changes, including new gamemodes, customizable rules, a new editor, new graphics, new enemies, unit production, new progression, a campaign, and more. See the in-game changelog link for specific details of what has been added and removed over the past year.
\ No newline at end of file
+Extensive changes, including new gamemodes, customizable rules, a new editor, new graphics, new enemies, unit production, new progression, a campaign, and more. See the in-game changelog link for specific details of what has been added and removed over the past year.
diff --git a/fastlane/metadata/android/en-US/changelogs/28409.txt b/fastlane/metadata/android/en-US/changelogs/28409.txt
index 670c65cc45..72fac509ef 100644
--- a/fastlane/metadata/android/en-US/changelogs/28409.txt
+++ b/fastlane/metadata/android/en-US/changelogs/28409.txt
@@ -1,2 +1,2 @@
Fixed multiplayer not syncing positions and shots correctly on certain networks or situations.
-Various other bugfixes.
\ No newline at end of file
+Various other bugfixes.
diff --git a/fastlane/metadata/android/en-US/changelogs/721.txt b/fastlane/metadata/android/en-US/changelogs/721.txt
index 8361896cef..4e72aaf3d6 100644
--- a/fastlane/metadata/android/en-US/changelogs/721.txt
+++ b/fastlane/metadata/android/en-US/changelogs/721.txt
@@ -2,4 +2,4 @@
- Fixed wave timer being extremely slow at high TPS with multithreading enabled
- Fixed scrolling on player menu causing the whole screen to pan
- Updated Polish translation
-- Updated Russian translation with new text (Thanks to @Prosta4okua)
\ No newline at end of file
+- Updated Russian translation with new text (Thanks to @Prosta4okua)
diff --git a/fastlane/metadata/android/en-US/full_description.txt b/fastlane/metadata/android/en-US/full_description.txt
index b9958053f1..d95c57b64d 100644
--- a/fastlane/metadata/android/en-US/full_description.txt
+++ b/fastlane/metadata/android/en-US/full_description.txt
@@ -11,4 +11,4 @@ Feature include:
- Cross-platform multiplayer via local networks or dedicated servers
- Custom game rules: Change block costs, enemy stats, starting items, wave timing and more
- A powerful editor, with tools to randomly generate ores, terrain, decoration and apply symmetry to maps
-- Customizable map wave layouts
\ No newline at end of file
+- Customizable map wave layouts
diff --git a/fastlane/metadata/android/en-US/short_description.txt b/fastlane/metadata/android/en-US/short_description.txt
index b6b5a942cd..ac569c2687 100644
--- a/fastlane/metadata/android/en-US/short_description.txt
+++ b/fastlane/metadata/android/en-US/short_description.txt
@@ -1 +1 @@
-A factory-based sandbox tower defense game.
\ No newline at end of file
+A factory-based sandbox tower defense game.
diff --git a/fastlane/metadata/android/en-US/summary.txt b/fastlane/metadata/android/en-US/summary.txt
index b6b5a942cd..ac569c2687 100644
--- a/fastlane/metadata/android/en-US/summary.txt
+++ b/fastlane/metadata/android/en-US/summary.txt
@@ -1 +1 @@
-A factory-based sandbox tower defense game.
\ No newline at end of file
+A factory-based sandbox tower defense game.
diff --git a/fastlane/metadata/android/en-US/title.txt b/fastlane/metadata/android/en-US/title.txt
index 2beb939017..e2842b447a 100644
--- a/fastlane/metadata/android/en-US/title.txt
+++ b/fastlane/metadata/android/en-US/title.txt
@@ -1 +1 @@
-Mindustry
\ No newline at end of file
+Mindustry
diff --git a/fastlane/metadata/android/fr-FR/title.txt b/fastlane/metadata/android/fr-FR/title.txt
index 2beb939017..e2842b447a 100644
--- a/fastlane/metadata/android/fr-FR/title.txt
+++ b/fastlane/metadata/android/fr-FR/title.txt
@@ -1 +1 @@
-Mindustry
\ No newline at end of file
+Mindustry
diff --git a/fastlane/metadata/android/fr-FR/video.txt b/fastlane/metadata/android/fr-FR/video.txt
index e69de29bb2..8b13789179 100644
--- a/fastlane/metadata/android/fr-FR/video.txt
+++ b/fastlane/metadata/android/fr-FR/video.txt
@@ -0,0 +1 @@
+
diff --git a/fastlane/metadata/android/it-IT/changelogs/102.2.txt b/fastlane/metadata/android/it-IT/changelogs/102.2.txt
index db62ea93f9..718fa43d87 100644
--- a/fastlane/metadata/android/it-IT/changelogs/102.2.txt
+++ b/fastlane/metadata/android/it-IT/changelogs/102.2.txt
@@ -2,4 +2,4 @@
- Aggiunta regola della salute dei blocchi
- Aggiunte ulteriori squadre interne per modalità di gioco alternative
- Aggiunte funzionalità per migliorare il server modding
-- Cambiamenti interni: il package ora è "mindustry" invece di "io.anuke.mindustry" (i plugin non funzioneranno)
\ No newline at end of file
+- Cambiamenti interni: il package ora è "mindustry" invece di "io.anuke.mindustry" (i plugin non funzioneranno)
diff --git a/fastlane/metadata/android/it-IT/full_description.txt b/fastlane/metadata/android/it-IT/full_description.txt
index 1cf2ed8e9c..071cef4ed0 100644
--- a/fastlane/metadata/android/it-IT/full_description.txt
+++ b/fastlane/metadata/android/it-IT/full_description.txt
@@ -11,4 +11,4 @@ Funzionalità:
- Modalità multigiocatore cross-platform attraverso la rete locale o i server dedicati
- Regole di gioco personalizzate: modifica i costi dei blocchi, le statistiche nemiche, gli oggetti di partenza, i tempi tra le ondate e molto altro
- Un editor potente, con strumenti che permettono di generare i minerali in modo casuale, il terreno, le decorazioni e applicare simmetria alle mappe
-- Ondate delle mappe completamente personalizzabili
\ No newline at end of file
+- Ondate delle mappe completamente personalizzabili
diff --git a/fastlane/metadata/android/it-IT/short_description.txt b/fastlane/metadata/android/it-IT/short_description.txt
index 92c1aa2e38..335469c50a 100644
--- a/fastlane/metadata/android/it-IT/short_description.txt
+++ b/fastlane/metadata/android/it-IT/short_description.txt
@@ -1 +1 @@
-Un gioco sandbox basato sulla produzione e sulla difesa.
\ No newline at end of file
+Un gioco sandbox basato sulla produzione e sulla difesa.
diff --git a/fastlane/metadata/android/it-IT/summary.txt b/fastlane/metadata/android/it-IT/summary.txt
index 92c1aa2e38..335469c50a 100644
--- a/fastlane/metadata/android/it-IT/summary.txt
+++ b/fastlane/metadata/android/it-IT/summary.txt
@@ -1 +1 @@
-Un gioco sandbox basato sulla produzione e sulla difesa.
\ No newline at end of file
+Un gioco sandbox basato sulla produzione e sulla difesa.
diff --git a/fastlane/metadata/android/it-IT/title.txt b/fastlane/metadata/android/it-IT/title.txt
index 2beb939017..e2842b447a 100644
--- a/fastlane/metadata/android/it-IT/title.txt
+++ b/fastlane/metadata/android/it-IT/title.txt
@@ -1 +1 @@
-Mindustry
\ No newline at end of file
+Mindustry
diff --git a/fastlane/metadata/android/it-IT/video.txt b/fastlane/metadata/android/it-IT/video.txt
index e69de29bb2..8b13789179 100644
--- a/fastlane/metadata/android/it-IT/video.txt
+++ b/fastlane/metadata/android/it-IT/video.txt
@@ -0,0 +1 @@
+
diff --git a/fastlane/metadata/android/ja-JP/full_description.txt b/fastlane/metadata/android/ja-JP/full_description.txt
index d76eb7a53c..8b0405139b 100644
--- a/fastlane/metadata/android/ja-JP/full_description.txt
+++ b/fastlane/metadata/android/ja-JP/full_description.txt
@@ -11,4 +11,4 @@ Mindustryの特徴:
- ローカルネットワークや専用サーバーで、クロスプラットフォームのマルチプレイが可能
- カスタマイズ可能なゲーム: ブロックのコスト変更、敵のステータス、初期アイテム、ウェーブのタイミング など…
- 強力なエディター、鉱石をランダムに生成したり、地形、デコレーション、左右対称なマップも制作可能
-- マップごとにウェーブの構成もカスタマイズ可能
\ No newline at end of file
+- マップごとにウェーブの構成もカスタマイズ可能
diff --git a/fastlane/metadata/android/ja-JP/short_description.txt b/fastlane/metadata/android/ja-JP/short_description.txt
index a7430009eb..093c9d2745 100644
--- a/fastlane/metadata/android/ja-JP/short_description.txt
+++ b/fastlane/metadata/android/ja-JP/short_description.txt
@@ -1 +1 @@
-工場ベースのサンドボックスタワーディフェンスゲーム。
\ No newline at end of file
+工場ベースのサンドボックスタワーディフェンスゲーム。
diff --git a/fastlane/metadata/android/ja-JP/title.txt b/fastlane/metadata/android/ja-JP/title.txt
index 2beb939017..e2842b447a 100644
--- a/fastlane/metadata/android/ja-JP/title.txt
+++ b/fastlane/metadata/android/ja-JP/title.txt
@@ -1 +1 @@
-Mindustry
\ No newline at end of file
+Mindustry
diff --git a/fastlane/metadata/android/pl-PL/short_description.txt b/fastlane/metadata/android/pl-PL/short_description.txt
index 6628c453f0..520c848bcf 100644
--- a/fastlane/metadata/android/pl-PL/short_description.txt
+++ b/fastlane/metadata/android/pl-PL/short_description.txt
@@ -1 +1 @@
-Bazująca na przetrwaniu i zarządzaniu fabryką sandboxowa gra typu obrony wieży.
\ No newline at end of file
+Bazująca na przetrwaniu i zarządzaniu fabryką sandboxowa gra typu obrony wieży.
diff --git a/fastlane/metadata/android/pl-PL/summary.txt b/fastlane/metadata/android/pl-PL/summary.txt
index 6628c453f0..520c848bcf 100644
--- a/fastlane/metadata/android/pl-PL/summary.txt
+++ b/fastlane/metadata/android/pl-PL/summary.txt
@@ -1 +1 @@
-Bazująca na przetrwaniu i zarządzaniu fabryką sandboxowa gra typu obrony wieży.
\ No newline at end of file
+Bazująca na przetrwaniu i zarządzaniu fabryką sandboxowa gra typu obrony wieży.
diff --git a/fastlane/metadata/android/pl-PL/title.txt b/fastlane/metadata/android/pl-PL/title.txt
index 2beb939017..e2842b447a 100644
--- a/fastlane/metadata/android/pl-PL/title.txt
+++ b/fastlane/metadata/android/pl-PL/title.txt
@@ -1 +1 @@
-Mindustry
\ No newline at end of file
+Mindustry
diff --git a/fastlane/metadata/android/pt-PT/changelogs/102.txt b/fastlane/metadata/android/pt-PT/changelogs/102.txt
index 784f53ea20..f1fb5da19e 100644
--- a/fastlane/metadata/android/pt-PT/changelogs/102.txt
+++ b/fastlane/metadata/android/pt-PT/changelogs/102.txt
@@ -2,4 +2,4 @@
- Foi adicionada regra de integridade do bloco
- Adicionado mais equipes internas para modos de jogo alternativos
- Adicionado recursos para melhorar a modificação do servidor
--Grande mudança interna: o pacote agora é "mindustry" em vez de "io.anuke.mindustry" (irá quebrar os plugins)
\ No newline at end of file
+-Grande mudança interna: o pacote agora é "mindustry" em vez de "io.anuke.mindustry" (irá quebrar os plugins)
diff --git a/fastlane/metadata/android/pt-PT/full_description.txt b/fastlane/metadata/android/pt-PT/full_description.txt
index 07cf8233b3..78d122abe5 100644
--- a/fastlane/metadata/android/pt-PT/full_description.txt
+++ b/fastlane/metadata/android/pt-PT/full_description.txt
@@ -11,4 +11,4 @@ Recursos incluidos:
- Multijogador multiplataforma através de redes locais ou servidores dedicados
- Regras personalizadas do jogo: altere os custos de bloqueio, estatísticas do inimigo, itens iniciais, tempo das ondas e muito mais
- Um editor poderoso, com ferramentas para gerar aleatoriamente minérios, terrenos, decoração e aplicar simetria a mapas
-- Layouts de rondas de mapa personalizáveis
\ No newline at end of file
+- Layouts de rondas de mapa personalizáveis
diff --git a/fastlane/metadata/android/pt-PT/summary.txt b/fastlane/metadata/android/pt-PT/summary.txt
index 24b4edd83d..6ecbaf697a 100644
--- a/fastlane/metadata/android/pt-PT/summary.txt
+++ b/fastlane/metadata/android/pt-PT/summary.txt
@@ -1 +1 @@
-Um jogo de defesa de torre de sandbox baseado em construção.
\ No newline at end of file
+Um jogo de defesa de torre de sandbox baseado em construção.
diff --git a/fastlane/metadata/android/pt-PT/title.txt b/fastlane/metadata/android/pt-PT/title.txt
index 2beb939017..e2842b447a 100644
--- a/fastlane/metadata/android/pt-PT/title.txt
+++ b/fastlane/metadata/android/pt-PT/title.txt
@@ -1 +1 @@
-Mindustry
\ No newline at end of file
+Mindustry
diff --git a/fastlane/metadata/android/ru-RU/full_description.txt b/fastlane/metadata/android/ru-RU/full_description.txt
index 03219413cc..2b1647994e 100644
--- a/fastlane/metadata/android/ru-RU/full_description.txt
+++ b/fastlane/metadata/android/ru-RU/full_description.txt
@@ -12,4 +12,4 @@
- Кроссплатформенный мультиплеер с поддержкой как и локальных сетей, так и серверов
- Пользовательские настройки игры — изменяйте цену блоков, силу врагов, количество стартовых ресурсов, интервал между волнами и т.д.
- Редактор карт с бесчисленными возможностями, инструментами для случайной генерации руд, рельефа, декораций, а также для симметрии карт
-- Настраиваемые раскладки волн для карт
\ No newline at end of file
+- Настраиваемые раскладки волн для карт
diff --git a/fastlane/metadata/android/ru-RU/title.txt b/fastlane/metadata/android/ru-RU/title.txt
index 2beb939017..e2842b447a 100644
--- a/fastlane/metadata/android/ru-RU/title.txt
+++ b/fastlane/metadata/android/ru-RU/title.txt
@@ -1 +1 @@
-Mindustry
\ No newline at end of file
+Mindustry
diff --git a/fastlane/metadata/android/uk/title.txt b/fastlane/metadata/android/uk/title.txt
index 2beb939017..e2842b447a 100644
--- a/fastlane/metadata/android/uk/title.txt
+++ b/fastlane/metadata/android/uk/title.txt
@@ -1 +1 @@
-Mindustry
\ No newline at end of file
+Mindustry
diff --git a/fastlane/metadata/android/zh-TW/title.txt b/fastlane/metadata/android/zh-TW/title.txt
index 2beb939017..e2842b447a 100644
--- a/fastlane/metadata/android/zh-TW/title.txt
+++ b/fastlane/metadata/android/zh-TW/title.txt
@@ -1 +1 @@
-Mindustry
\ No newline at end of file
+Mindustry
diff --git a/ios/data/Assets.xcassets/AppIcon.appiconset/Contents.json b/ios/data/Assets.xcassets/AppIcon.appiconset/Contents.json
index 2210d686de..8d0bc9cd26 100644
--- a/ios/data/Assets.xcassets/AppIcon.appiconset/Contents.json
+++ b/ios/data/Assets.xcassets/AppIcon.appiconset/Contents.json
@@ -113,4 +113,4 @@
"version": 1,
"author": "xcode"
}
-}
\ No newline at end of file
+}
diff --git a/ios/data/Assets.xcassets/Contents.json b/ios/data/Assets.xcassets/Contents.json
index 121dee67a6..97a8662ebd 100644
--- a/ios/data/Assets.xcassets/Contents.json
+++ b/ios/data/Assets.xcassets/Contents.json
@@ -3,4 +3,4 @@
"version": 1,
"author": "xcode"
}
-}
\ No newline at end of file
+}
diff --git a/server/server_template/run_server.bat b/server/server_template/run_server.bat
index 26d919a77b..8084a7149f 100644
--- a/server/server_template/run_server.bat
+++ b/server/server_template/run_server.bat
@@ -1 +1 @@
-java -jar server.jar
\ No newline at end of file
+java -jar server.jar
diff --git a/server/server_template/run_server.sh b/server/server_template/run_server.sh
index 26d919a77b..8084a7149f 100755
--- a/server/server_template/run_server.sh
+++ b/server/server_template/run_server.sh
@@ -1 +1 @@
-java -jar server.jar
\ No newline at end of file
+java -jar server.jar
diff --git a/server/src/mindustry/server/ServerLauncher.java b/server/src/mindustry/server/ServerLauncher.java
index 8b668ae669..c7d2ea9b3f 100644
--- a/server/src/mindustry/server/ServerLauncher.java
+++ b/server/src/mindustry/server/ServerLauncher.java
@@ -82,4 +82,4 @@ public class ServerLauncher implements ApplicationListener{
Events.fire(new ServerLoadEvent());
}
-}
\ No newline at end of file
+}
diff --git a/servers_be.json b/servers_be.json
index be72d9d6da..e99eefaaad 100644
--- a/servers_be.json
+++ b/servers_be.json
@@ -2,4 +2,4 @@
{
"address": "mindustry.us.to:6568"
}
-]
\ No newline at end of file
+]
diff --git a/tests/build.gradle b/tests/build.gradle
index 93595748d0..14b7dccb41 100644
--- a/tests/build.gradle
+++ b/tests/build.gradle
@@ -8,4 +8,4 @@ sourceSets{
srcDir "src/test/resources"
}
}
-}
\ No newline at end of file
+}
diff --git a/tests/src/test/java/ApplicationTests.java b/tests/src/test/java/ApplicationTests.java
index 26d4168c2a..eaebe96f35 100644
--- a/tests/src/test/java/ApplicationTests.java
+++ b/tests/src/test/java/ApplicationTests.java
@@ -442,4 +442,4 @@ public class ApplicationTests{
tile.block().handleStack(item, 1, tile, unit);
assertEquals(capacity, tile.entity.items().get(item));
}
-}
\ No newline at end of file
+}
diff --git a/tools/run-newline b/tools/run-newline
new file mode 100755
index 0000000000..e9e4394169
--- /dev/null
+++ b/tools/run-newline
@@ -0,0 +1,14 @@
+#!/usr/bin/env bash
+
+# add newlines to all files
+git ls-files -z | while IFS= read -rd '' f; do tail -c1 < "$f" | read -r _ || echo >> "$f"; done
+
+# undo the changes in these
+git checkout -- "*.png"
+git checkout -- "*.msav"
+git checkout -- "*.jar"
+git checkout -- "*.ogg"
+git checkout -- "*.ico"
+git checkout -- "*.icns"
+git checkout -- "*.ttf"
+git checkout -- "*.glsl"