Merge branch 'master' of https://github.com/Anuken/Mindustry into rework-sectors

This commit is contained in:
Anuken
2018-10-20 11:52:02 -04:00
26 changed files with 749 additions and 1003 deletions

View File

@@ -27,7 +27,7 @@ allprojects {
appName = 'Mindustry' appName = 'Mindustry'
gdxVersion = '1.9.8' gdxVersion = '1.9.8'
roboVMVersion = '2.3.0' roboVMVersion = '2.3.0'
uCoreVersion = '53f99fbdc50910a15b4f55e9739385f47cf800cf' uCoreVersion = '97b03d5408d0cc836258f0af0f0a12dcb14a5ede'
getVersionString = { getVersionString = {
String buildVersion = getBuildVersion() String buildVersion = getBuildVersion()

View File

@@ -13,28 +13,28 @@ text.about.button=Info
text.name=Name: text.name=Name:
text.players={0} Spieler online text.players={0} Spieler online
text.players.single={0} Spieler online text.players.single={0} Spieler online
text.server.mismatch=Paketfehler: Mögliche Client / Server-Version stimmt nicht überein. Stell sicher, dass du und der Host die neueste Version von Mindustry haben! text.server.mismatch=Paketfehler: Mögliche Client / Server-Version stimmt nicht überein. Stell sicher, dass du und der Host die neueste Version von Mindustry haben!
text.server.kicked.kick=Du wurdest vom Server gekickt! text.server.kicked.kick=Du wurdest vom Server gekickt!
text.hostserver=Server hosten text.hostserver=Server hosten
text.host=Host text.host=Host
text.hosting=[accent] Server wird geöffnet... text.hosting=[accent] Server wird geöffnet...
text.hosts.refresh=Aktualisieren text.hosts.refresh=Aktualisieren
text.hosts.discovering=Suche nach LAN-Spielen text.hosts.discovering=Suche nach LAN-Spielen
text.server.refreshing=Server wird aktualisiert text.server.refreshing=Server wird aktualisiert
text.hosts.none=[lightgray] Keine LAN Spiele gefunden! text.hosts.none=[lightgray] Keine LAN Spiele gefunden!
text.host.invalid=[scarlet] Kann keine Verbindung zum Host herstellen. text.host.invalid=[scarlet] Kann keine Verbindung zum Host herstellen.
text.server.add=Server hinzufügen text.server.add=Server hinzufügen
text.server.delete=Bist du dir sicher das du diesen Server löschen möchtest? text.server.delete=Bist du dir sicher das du diesen Server löschen möchtest?
text.server.hostname=Host: {0} text.server.hostname=Host: {0}
text.server.edit=Server bearbeiten text.server.edit=Server bearbeiten
text.joingame.title=Spiel beitreten text.joingame.title=Spiel beitreten
text.joingame.ip=IP: text.joingame.ip=IP:
text.disconnect=Verbindung unterbrochen. text.disconnect=Verbindung unterbrochen.
text.connecting=[accent] Verbindet... text.connecting=[accent] Verbindet...
text.connecting.data=[accent] Weltdaten werden geladen... text.connecting.data=[accent] Welt Daten werden geladen...
text.connectfail=[crimson] Verbindung zum Server konnte nicht hergestellt werden: [orange]{0} text.connectfail=[crimson] Verbindung zum Server konnte nicht hergestellt werden: [orange]{0}
text.server.port=Port: text.server.port=Port:
text.server.invalidport=Falscher Port! text.server.invalidport=Falscher Port!
text.server.error=[crimson] Fehler beim Hosten des Servers: [orange] {0} text.server.error=[crimson] Fehler beim Hosten des Servers: [orange] {0}
text.save.new=Neuer Spielstand text.save.new=Neuer Spielstand
text.save.overwrite=Möchten du diesen Spielstand wirklich überschreiben? text.save.overwrite=Möchten du diesen Spielstand wirklich überschreiben?
@@ -58,7 +58,7 @@ text.save.corrupted=[orange] Datei beschädigt oder ungültig!
text.empty=<leer> text.empty=<leer>
text.on=An text.on=An
text.off=Aus text.off=Aus
text.save.autosave=Automatisches Speichern: {0} text.save.autosave=Automatisches Speichern: {0}
text.save.map=Karte: {0} text.save.map=Karte: {0}
text.save.wave=Welle: {0} text.save.wave=Welle: {0}
text.save.date=Zuletzt gespeichert: {0} text.save.date=Zuletzt gespeichert: {0}
@@ -87,9 +87,9 @@ text.editor.loadimage=Bild\nladen
text.editor.saveimage=Bild\nspeichern text.editor.saveimage=Bild\nspeichern
text.editor.unsaved=[crimson] Du hast Änderungen nicht gespeichert [] Möchtest du wirklich aufhören? text.editor.unsaved=[crimson] Du hast Änderungen nicht gespeichert [] Möchtest du wirklich aufhören?
text.editor.resizemap=Grösse der Karte ändern text.editor.resizemap=Grösse der Karte ändern
text.editor.mapname=Map Name text.editor.mapname=Karten Name
text.editor.overwrite=[accent] Warnung! Dies überschreibt eine vorhandene Map. text.editor.overwrite=[accent] Warnung! Dies überschreibt eine vorhandene Karte.
text.editor.selectmap=Wähle eine Map zum Laden: text.editor.selectmap=Wähle eine Karte zum Laden:
text.width=Breite: text.width=Breite:
text.height=Höhe: text.height=Höhe:
text.menu=Menü text.menu=Menü
@@ -98,8 +98,8 @@ text.load=Laden
text.save=Speichern text.save=Speichern
text.settings=Einstellungen text.settings=Einstellungen
text.tutorial=Tutorial text.tutorial=Tutorial
text.editor=Bearbeiter text.editor=Editor
text.mapeditor=Karten Bearbeiter text.mapeditor=Karten Editor
text.donate=Spenden text.donate=Spenden
text.settings.reset=Auf Standard zurücksetzen text.settings.reset=Auf Standard zurücksetzen
text.settings.controls=Steuerung text.settings.controls=Steuerung
@@ -108,22 +108,22 @@ text.settings.sound=Audio
text.settings.graphics=Grafiken text.settings.graphics=Grafiken
text.paused=Pausiert text.paused=Pausiert
text.error.title=[crimson] Ein Fehler ist aufgetreten text.error.title=[crimson] Ein Fehler ist aufgetreten
text.error.crashtitle=EIn Fehler ist aufgetreten! text.error.crashtitle=Ein Fehler ist aufgetreten!
text.blocks.blockinfo=Blockinfo: text.blocks.blockinfo=Blockinfo:
text.blocks.powercapacity=Energiekapazität text.blocks.powercapacity=Power Kapazität
text.blocks.powershot=Energie / Schuss text.blocks.powershot=Power / Schuss
text.blocks.size=Grösse text.blocks.size=Grösse
text.blocks.liquidcapacity=Flüssigkeitskapazität text.blocks.liquidcapacity=Flüssigkeitskapazität
text.blocks.maxitemssecond=Max Gegenstände / Sekunde text.blocks.maxitemssecond=Max Gegenstand / Sekunde
text.blocks.powerrange=Energiereichweite text.blocks.powerrange=Power Reichweite
text.blocks.itemcapacity=Gegenstand Kapazität text.blocks.itemcapacity=Gegenstand Kapazität
text.blocks.inputliquid=Flüssigkeiten Eingabe text.blocks.inputliquid=Annahme von Flüssigkeit
text.blocks.inputitem=Eingabe Gegenstand text.blocks.inputitem=Verwendung von Gegenstand
text.blocks.explosive=Hochexplosiv! text.blocks.explosive=Hochexplosiv!
text.blocks.health=Lebenspunkte text.blocks.health=Lebenspunkte
text.blocks.inaccuracy=Ungenauigkeit text.blocks.inaccuracy=Ungenauigkeit
text.blocks.shots=Schüsse text.blocks.shots=Schüsse
text.blocks.inputcapacity=Eingabekapazität text.blocks.inputcapacity=Annahmekapazität
text.blocks.outputcapacity=Ausgabekapazität text.blocks.outputcapacity=Ausgabekapazität
setting.difficulty.easy=Leicht setting.difficulty.easy=Leicht
setting.difficulty.normal=Normal setting.difficulty.normal=Normal
@@ -139,7 +139,7 @@ setting.saveinterval.name=Autosave Häufigkeit
setting.seconds={0} Sekunden setting.seconds={0} Sekunden
setting.fps.name=Zeige FPS setting.fps.name=Zeige FPS
setting.vsync.name=VSync setting.vsync.name=VSync
setting.lasers.name=Zeige Energielaser setting.lasers.name=Zeige Powerlaser
setting.healthbars.name=Zeige Objekt Lebensbalken setting.healthbars.name=Zeige Objekt Lebensbalken
setting.musicvol.name=Musiklautstärke setting.musicvol.name=Musiklautstärke
setting.mutemusic.name=Musik stummschalten setting.mutemusic.name=Musik stummschalten
@@ -175,40 +175,40 @@ block.router.name=Verteiler
block.junction.name=Kreuzung block.junction.name=Kreuzung
block.sorter.name=Sortierer block.sorter.name=Sortierer
block.smelter.name=Schmelzer block.smelter.name=Schmelzer
text.credits=Credits text.credits=Danksagungen
text.link.discord.description=the official Mindustry discord chatroom text.link.discord.description=Der offizielle Mindustry Discord Chatroom
text.link.github.description=Game source code text.link.github.description=Spiel Source Code
text.link.dev-builds.description=Unstable development builds text.link.dev-builds.description=Entwicklungs- Builds (instabil)
text.link.trello.description=Official trello board for planned features text.link.trello.description=Offizielles Trello Board für geplante Features
text.link.itch.io.description=itch.io page with PC downloads and web version text.link.itch.io.description=itch.io Seite mit downloads und der Web-Version des Spiels
text.link.google-play.description=Google Play store listing text.link.google-play.description=Google Play store listing
text.link.wiki.description=official Mindustry wiki text.link.wiki.description=offizelles Mindustry wiki
text.linkfail=Failed to open link!\nThe URL has been copied to your cliboard. text.linkfail=Fehler beim Öffnen des Links!\nThe URL wurde in die Zwischenablage kopiert.
text.editor.web=The web version does not support the editor!\nDownload the game to use it. text.editor.web=Die Web-Version unterstützt den Editor nicht!\nLade das Spiel herunter um ihn zu benutzen.
text.web.unsupported=The web version does not support this feature! Download the game to use it. text.web.unsupported=Die Web-Version unterstützt den editor nicht! Lade das Spiel herunter um ihn zu benutzen.
text.map.delete=Are you sure you want to delete the map "[orange]{0}[]"? text.map.delete=Bist du sicher das du die Karte "[orange]{0}[]" löschen möchtest?
text.construction.title=Block Construction Guide text.construction.title=Block Konstruktions-Anleitung
text.construction=You've just selected [accent]block construction mode[].\n\nTo begin placing, simply tap a valid location near your ship.\nOnce you have selected some blocks, press the checkbox to confirm, and your ship will begin constructing them.\n\n- [accent]Remove blocks[] from your selection by tapping them.\n- [accent]Shift the selection[] by holding and dragging any block in the selection.\n- [accent]Place blocks in a line[] by tapping and holding an empty spot, then dragging in a direction.\n- [accent]Cancel construction or selection[] by pressing the X at the bottom left. text.construction=You've just selected [accent]block construction mode[].\n\nTo begin placing, simply tap a valid location near your ship.\nOnce you have selected some blocks, press the checkbox to confirm, and your ship will begin constructing them.\n\n- [accent]Remove blocks[] from your selection by tapping them.\n- [accent]Shift the selection[] by holding and dragging any block in the selection.\n- [accent]Place blocks in a line[] by tapping and holding an empty spot, then dragging in a direction.\n- [accent]Cancel construction or selection[] by pressing the X at the bottom left.
text.deconstruction.title=Block Deconstruction Guide text.deconstruction.title=Block Dekonstructions Anleitung
text.deconstruction=You've just selected [accent]block deconstruction mode[].\n\nTo begin breaking, simply tap a block near your ship.\nOnce you have selected some blocks, press the checkbox to confirm, and your ship will begin de-constructing them.\n\n- [accent]Remove blocks[] from your selection by tapping them.\n- [accent]Remove blocks in an area[] by tapping and holding an empty spot, then dragging in a direction.\n- [accent]Cancel deconstruction or selection[] by pressing the X at the bottom left. text.deconstruction=You've just selected [accent]block deconstruction mode[].\n\nTo begin breaking, simply tap a block near your ship.\nOnce you have selected some blocks, press the checkbox to confirm, and your ship will begin de-constructing them.\n\n- [accent]Remove blocks[] from your selection by tapping them.\n- [accent]Remove blocks in an area[] by tapping and holding an empty spot, then dragging in a direction.\n- [accent]Cancel deconstruction or selection[] by pressing the X at the bottom left.
text.showagain=Don't show again next session text.showagain=Zeige die nächste Session nicht nochmal
text.unlocks=Unlocks text.unlocks=Freigeschaltet
text.addplayers=Add/Remove Players text.addplayers=Hinzufügen/Entfernen von Spielern
text.maps=Maps text.maps=Karten
text.maps.none=[LIGHT_GRAY]No maps found! text.maps.none=[LIGHT_GRAY]Keine Karten gefunden!
text.unlocked=New Block Unlocked! text.unlocked=Neuen Block freigeschaltet!
text.unlocked.plural=New Blocks Unlocked! text.unlocked.plural=Neue Blöcke freigeschaltet!
text.server.closing=[accent]Closing server... text.server.closing=[accent]Schließe den Server...
text.server.kicked.clientOutdated=Outdated client! Update your game! text.server.kicked.clientOutdated=Veralteter Client! Aktualisiere dein Spiel!
text.server.kicked.serverOutdated=Outdated server! Ask the host to update! text.server.kicked.serverOutdated=Veralteter Server! Bitte den Host um ein Update!
text.server.kicked.banned=You are banned on this server. text.server.kicked.banned=Du wurdest vom Server verbannt.
text.server.kicked.recentKick=You have been kicked recently.\nWait before connecting again. text.server.kicked.recentKick=Du wurdest gerade gekickt.\nWarte bevor du dich wieder verbindest.
text.server.kicked.nameInUse=There is someone with that name\nalready on this server. text.server.kicked.nameInUse=Da ist bereits ein Spieler \nmit diesem Namen auf dem Server.
text.server.kicked.nameEmpty=Your name must contain at least one character or number. text.server.kicked.nameEmpty=Dein Name muss zumindest ein Buchstaben oder eine Zahl enthalten.
text.server.kicked.idInUse=You are already on this server! Connecting with two accounts is not permitted. text.server.kicked.idInUse=Du bist bereits auf dem Server! Anmeldungen mit zwei Accounts sind nicht gestattet.
text.server.kicked.customClient=This server does not support custom builds. Download an official version. text.server.kicked.customClient=Der Server akzeptiert keine Custom Builds von Mindustry. Lade dir die offizielle Version herunter.
text.host.info=The [accent]host[] button hosts a server on ports [scarlet]6567[] and [scarlet]6568.[]\nAnybody on the same [LIGHT_GRAY]wifi or local network[] should be able to see your server in their server list.\n\nIf you want people to be able to connect from anywhere by IP, [accent]port forwarding[] is required.\n\n[LIGHT_GRAY]Note: If someone is experiencing trouble connecting to your LAN game, make sure you have allowed Mindustry access to your local network in your firewall settings. text.host.info=Der [accent]host[] Knopf startet einen Server auf den Ports [scarlet]6567[] und [scarlet]6568.[]\nJeder im gleichen [LIGHT_GRAY]W-Lan oder lokalem Netzwerk[] sollte deinen Server in seiner Server Liste sehen können.\n\nWenn du Leuten 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, stell sicher das Mindustry in deinen Firewall Einstellungen Zugriff auf das lokale Netzwerk hat.
text.join.info=Here, you can enter a [accent]server IP[] to connect to, or discover [accent]local network[] servers to connect to.\nBoth LAN and WAN multiplayer is supported.\n\n[LIGHT_GRAY]Note: There is no automatic global server list; if you want to connect to someone by IP, you would need to ask the host for their IP. text.join.info=Hier kannst du eine [accent]Server IP[] eingeben um dich zu verbinden oder Server im [accent]lokalem 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 jemand per IP verbinden willst musst du den Host nach seiner IP fragen.
text.trace=Trace Player text.trace=Trace Player
text.trace.playername=Player name: [accent]{0} text.trace.playername=Player name: [accent]{0}
text.trace.ip=IP: [accent]{0} text.trace.ip=IP: [accent]{0}
@@ -222,378 +222,378 @@ text.trace.totalblocksplaced=Total blocks placed: [accent]{0}
text.trace.lastblockplaced=Last block placed: [accent]{0} text.trace.lastblockplaced=Last block placed: [accent]{0}
text.invalidid=Invalid client ID! Submit a bug report. text.invalidid=Invalid client ID! Submit a bug report.
text.server.bans=Bans text.server.bans=Bans
text.server.bans.none=No banned players found! text.server.bans.none=Keine gebannten Spieler gefunden!
text.server.admins=Admins text.server.admins=Admins
text.server.admins.none=No admins found! text.server.admins.none=Keine Admins gefunden!
text.server.outdated=[crimson]Outdated Server![] text.server.outdated=[crimson]Veralteter Server![]
text.server.outdated.client=[crimson]Outdated Client![] text.server.outdated.client=[crimson]Veralteter Client![]
text.server.version=[lightgray]Version: {0} text.server.version=[lightgray]Version: {0}
text.server.custombuild=[yellow]Custom Build text.server.custombuild=[yellow]Custom Build
text.confirmban=Are you sure you want to ban this player? text.confirmban=Bist du sicher das du diesen Spieler verbannen möchtest?
text.confirmunban=Are you sure you want to unban this player? text.confirmunban=Bist du sicher, dass du die Verbannung des Spielers rückgängig machen willst?
text.confirmadmin=Are you sure you want to make this player an admin? text.confirmadmin=Bist du sicher, dass du diesen Spieler zu einem Admin machen möchtest?
text.confirmunadmin=Are you sure you want to remove admin status from this player? text.confirmunadmin=Bis du sicher, dass dieser Spieler kein Admin mehr sein soll?
text.disconnect.data=Failed to load world data! text.disconnect.data=Fehler beim Laden der Welt Daten!
text.server.addressinuse=Address already in use! text.server.addressinuse=Adresse bereits in Benutzung!
text.save.difficulty=Difficulty: {0} text.save.difficulty=Schwierigkeitsgrad: {0}
text.copylink=Copy Link text.copylink=Kopiere Link
text.changelog.title=Changelog text.changelog.title=Changelog
text.changelog.loading=Getting changelog... text.changelog.loading=Lade Changelog...
text.changelog.error.android=[orange]Note that the changelog sometimes does not work on Android 4.4 and below!\nThis is due to an internal Android bug. text.changelog.error.android=[orange]Beachte: Das Changelog funktioniert manchmal nicht auf Android 4.4 (und älter)!\nDies resultiert aus einem Android bug.
text.changelog.error.ios=[orange]The changelog is currently not supported in iOS. text.changelog.error.ios=[orange]Das Changelog wird aktuell nicht von IOS unterstützt.
text.changelog.error=[scarlet]Error getting changelog!\nCheck your internet connection. text.changelog.error=[scarlet]Fehler beim Laden des Changelog!\nPrüfe deine Internet Verbindung.
text.changelog.current=[yellow][[Current version] text.changelog.current=[yellow][[Current version]
text.changelog.latest=[orange][[Latest version] text.changelog.latest=[orange][[Latest version]
text.saving=[accent]Saving... text.saving=[accent]Speichere...
text.unknown=Unknown text.unknown=Unbekannt
text.custom=Custom text.custom=Custom
text.builtin=Built-In text.builtin=Built-In
text.map.delete.confirm=Are you sure you want to delete this map? This action cannot be undone! text.map.delete.confirm=Bist du sicher das du diese Karte löschen willst? Die Aktion kann nicht rückgänig gemacht werden!
text.map.random=[accent]Random Map text.map.random=[accent]Zufällige Karte
text.map.nospawn=This map does not have any cores for the player to spawn in! Add a [ROYAL]blue[] core to this map in the editor. text.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.
text.editor.slope=\\ text.editor.slope=\\
text.editor.openin=Open In Editor text.editor.openin=Öffne im Editor
text.editor.oregen=Ore Generation text.editor.oregen=Erze generieren
text.editor.oregen.info=Ore Generation: text.editor.oregen.info=Erze generiert:
text.editor.mapinfo=Map Info text.editor.mapinfo=Karten Info
text.editor.author=Author: text.editor.author=Author:
text.editor.description=Description: text.editor.description=Beschreibung:
text.editor.name=Name: text.editor.name=Name:
text.editor.teams=Teams text.editor.teams=Teams
text.editor.elevation=Elevation text.editor.elevation=Höhe
text.editor.saved=Saved! text.editor.saved=Gespeichert!
text.editor.save.noname=Your map does not have a name! Set one in the 'map info' menu. text.editor.save.noname=Deine Karte hat keinen Namen! Setze einen Namen im [accent]Karten Info[] Menu.
text.editor.save.overwrite=Your map overwrites a built-in map! Pick a different name in the 'map info' menu. text.editor.save.overwrite=Deine Karte überschreibt eine built-in Karte! Wähle einen anderen Karten Namen im [accent]'Karten info'[] Menu.
text.editor.import.exists=[scarlet]Unable to import:[] a built-in map named '{0}' already exists! text.editor.import.exists=[scarlet]Fehler beim Import:[] Ein built-in Karte namens '{0}' existiert bereits!
text.editor.import=Import... text.editor.import=Import...
text.editor.importmap=Import Map text.editor.importmap=Importiere Karte
text.editor.importmap.description=Import an already existing map text.editor.importmap.description=Importiere von einer bestehende Karte
text.editor.importfile=Import File text.editor.importfile=Importiere Datei
text.editor.importfile.description=Import an external map file text.editor.importfile.description=Importiere aus einer Karten Datei
text.editor.importimage=Import Terrain Image text.editor.importimage=Importiere Terrain Bild
text.editor.importimage.description=Import an external map image file text.editor.importimage.description=Importiere aus einer Terrain Bild Datei
text.editor.export=Export... text.editor.export=Export...
text.editor.exportfile=Export File text.editor.exportfile=Export in Datei
text.editor.exportfile.description=Export a map file text.editor.exportfile.description=Exportiere in eine Karten Datei
text.editor.exportimage=Export Terrain Image text.editor.exportimage=Export in Terrain Bild Datei
text.editor.exportimage.description=Export a map image file text.editor.exportimage.description=Exportiere in eine Karten Bild Datei
text.editor.overwrite.confirm=[scarlet]Warning![] A map with this name already exists. Are you sure you want to overwrite it? text.editor.overwrite.confirm=[scarlet]Warnung![] Eine Karte mit diesem Namen existiert bereits. Bist du sicher das du sie überschreiben willst?
text.fps=FPS: {0} text.fps=FPS: {0}
text.tps=TPS: {0} text.tps=TPS: {0}
text.ping=Ping: {0}ms text.ping=Ping: {0}ms
text.language.restart=Please restart your game for the language settings to take effect. text.language.restart=Bitte Starte dein Spiel neu, damit die Sprach-Einstellung aktiv werden.
text.settings.language=Language text.settings.language=Sprache
text.settings.rebind=Rebind text.settings.rebind=Zuweisen
text.yes=Yes text.yes=Ja
text.no=No text.no=Nein
text.info.title=[accent]Info text.info.title=[accent]Info
text.blocks.targetsair=Targets Air text.blocks.targetsair=Visiert Luft Einheiten an
text.blocks.itemspeed=Units Moved text.blocks.itemspeed=Units Moved
text.blocks.shootrange=Range text.blocks.shootrange=Reichweite
text.blocks.poweruse=Power Use text.blocks.poweruse=Powerbedarf
text.blocks.inputitemcapacity=Input Item Capacity text.blocks.inputitemcapacity= Annahme Kapazität
text.blocks.outputitemcapacity=Input Item Capacity text.blocks.outputitemcapacity=Ausgabe Kapazität
text.blocks.powertransferspeed=Power Transfer text.blocks.powertransferspeed=Power Transfer
text.blocks.craftspeed=Production Speed text.blocks.craftspeed=Produktions-Geschwindigkeit
text.blocks.inputliquidaux=Aux Liquid text.blocks.inputliquidaux=Aux Flüssigkeit
text.blocks.inputitems=Input Items text.blocks.inputitems=Annahme von Gegenständen
text.blocks.outputitem=Output Item text.blocks.outputitem=Ausgabe von Gegenständen
text.blocks.drilltier=Drillables text.blocks.drilltier=Abbaubar
text.blocks.drillspeed=Base Drill Speed text.blocks.drillspeed=Grund Abbau Geschwindigkeit
text.blocks.liquidoutput=Liquid Output text.blocks.liquidoutput=Flüssigkeits-Ausgabe
text.blocks.liquiduse=Liquid Use text.blocks.liquiduse=Flüssigkeits-Verwendung
text.blocks.coolant=Coolant text.blocks.coolant=Kühlmittel
text.blocks.coolantuse=Coolant Use text.blocks.coolantuse=Kühlmittel Verwendung
text.blocks.inputliquidfuel=Fuel Liquid text.blocks.inputliquidfuel=Flüssigkraftstoff
text.blocks.liquidfueluse=Liquid Fuel Use text.blocks.liquidfueluse=Flüssigkraftstoff Benutzung
text.blocks.reload=Reload text.blocks.reload=Nachladen
text.blocks.inputfuel=Fuel text.blocks.inputfuel=Kraftstoff
text.blocks.fuelburntime=Fuel Burn Time text.blocks.fuelburntime=Kraftstoff Verbrennungs-Zeit
text.unit.blocks=blocks text.unit.blocks=blocks
text.unit.powersecond=power units/second text.unit.powersecond=Power Einheit/Sekunde
text.unit.liquidsecond=liquid units/second text.unit.liquidsecond=flüssige Einheit/Sekunde
text.unit.itemssecond=items/second text.unit.itemssecond=Gegenstand/Sekunde
text.unit.pixelssecond=pixels/second text.unit.pixelssecond=Pixel/Sekunde
text.unit.liquidunits=liquid units text.unit.liquidunits=flüssige Einheiten
text.unit.powerunits=power units text.unit.powerunits=Power Einheiten
text.unit.degrees=degrees text.unit.degrees=grad
text.unit.seconds=seconds text.unit.seconds=Sekunden
text.unit.none= text.unit.none=
text.unit.items=items text.unit.items=Gegenstände
text.category.general=General text.category.general=General
text.category.power=Power text.category.power=Power
text.category.liquids=Liquids text.category.liquids=Flüssigkeiten
text.category.items=Items text.category.items=Gegenstände
text.category.crafting=Crafting text.category.crafting=Herstellung
text.category.shooting=Shooting text.category.shooting=Schießen
setting.fullscreen.name=Fullscreen setting.fullscreen.name=Vollbild
setting.multithread.name=Multithreading setting.multithread.name=Multithreading
setting.minimap.name=Show Minimap setting.minimap.name=Zeige die Minimap
text.keybind.title=Rebind Keys text.keybind.title=Tasten Zuweisen
keybind.chat.name=chat keybind.chat.name=Chat
keybind.player_list.name=player_list keybind.player_list.name=player_list
keybind.console.name=console keybind.console.name=console
mode.text.help.title=Description of modes mode.text.help.title=Beschreibung der Modi
mode.waves.description=the normal mode. limited resources and automatic incoming waves. mode.waves.description=Der Normale Modus. Begrenzte Ressourcen und automatische Wellen.
mode.sandbox.description=infinite resources and no timer for waves. mode.sandbox.description=unendliche Ressourcen und kein Timer für Wellen.
mode.freebuild.description=limited resources and no timer for waves. mode.freebuild.description=begrenzte Ressourcen und kein Timer für Wellen.
content.item.name=Items content.item.name=Gegenstand
content.liquid.name=Liquids content.liquid.name=Flüssigkeit
content.recipe.name=Blocks content.recipe.name=Blöcke
item.stone.description=A common raw material. Used for separating and refining into other materials, or melting into lava. item.stone.description=Ein gängiger Rohstoff der für die Zerteilung und Verfeinerung in andere Gegenstände oder geschmolzen als Lava verwendet wird.
item.lead.name=Lead item.lead.name=Blei
item.lead.description=A basic starter material. Used extensively in electronics and liquid transportation blocks. item.lead.description=Ein grundliegendes Material. Häufig in Elektronik und Flüssigkeits-Transport Blöcken verwendet.
item.coal.description=A common and readily available fuel. item.coal.description=Ein sehr häufiger vorkommender Kraftstoff.
item.titanium.description=A rare super-light metal used extensively in liquid transportation, drills and aircraft. item.titanium.description=Ein seltenes sehr leichtes Metal. Häufig in Flüssigkeits-Transport Blöcken, Abbauanlagen und Flugzeugen verwendet.
item.thorium.description=A dense, radioactive metal used as structural support and nuclear fuel. item.thorium.description=Ein dichtes radioaktives Metal, welches als strukturelle Unterstützung und nuklearer Kraftstoff verwendet wird.
item.silicon.name=Silicon item.silicon.name=Silikon
item.silcion.description=An extremely useful semiconductor, with applications in solar panels and many complex electronics. item.silcion.description=Ein sehr nützlicher Halbleiter. Findet Anwendung in Solar Anlagen und komplexer Elektronik.
item.plastanium.name=Plastanium item.plastanium.name=Plastanium
item.plastanium.description=A light, ductile material used in advanced aircraft and fragmentation ammunition. item.plastanium.description=Ein leichtes dehnbares Material welches in Flugzeugen und Splittermunition verwendet wird.
item.phase-matter.name=Phase Matter item.phase-matter.name=Phase Materie
item.surge-alloy.name=Surge Alloy item.surge-alloy.name=Gewalzte Legierung
item.biomatter.name=Biomatter item.biomatter.name=Biomasse
item.biomatter.description=A clump of organic mush; used for conversion into oil or as a basic fuel. item.biomatter.description=Ein Klumpen organischer Brei. Wird für die Umwandlung in Öl oder als grundliegender Kraftstoff verwendet.
item.sand.description=A common material that is used extensively in smelting, both in alloying and as a flux. item.sand.description=Ein gäniges Material welches häufig in geschmolzener Form, flüssig oder als Legierung verwendet wird.
item.blast-compound.name=Blast Compound item.blast-compound.name=Explosive Mischung
item.blast-compound.description=A volatile compound used in bombs and explosives. While it can burned as fuel, this is not advised. item.blast-compound.description=Eine flüchtige Mischung die in Bomben und Sprengstoffen Verwendung findet. Es besteht die Möglichkeit es als Treibstoff zu verwenden, es wird dringend davon abgeraten.
item.pyratite.name=Pyratite item.pyratite.name=Pyratite
item.pyratite.description=An extremely flammable substance used in incendiary weapons. item.pyratite.description=Eine extrem leicht entflammen Substanz. Verwendet in Brand Waffen.
liquid.cryofluid.name=Cryofluid liquid.cryofluid.name=Cryofluid
text.item.explosiveness=[LIGHT_GRAY]Explosiveness: {0} text.item.explosiveness=[LIGHT_GRAY]Explosivität: {0}
text.item.flammability=[LIGHT_GRAY]Flammability: {0} text.item.flammability=[LIGHT_GRAY]Entflammbarkeit: {0}
text.item.radioactivity=[LIGHT_GRAY]Radioactivity: {0} text.item.radioactivity=[LIGHT_GRAY]Radioaktivität: {0}
text.item.fluxiness=[LIGHT_GRAY]Flux Power: {0} text.item.fluxiness=[LIGHT_GRAY]Fluss Power: {0}
text.liquid.heatcapacity=[LIGHT_GRAY]Heat Capacity: {0} text.liquid.heatcapacity=[LIGHT_GRAY]Hitze Kapazität: {0}
text.liquid.viscosity=[LIGHT_GRAY]Viscosity: {0} text.liquid.viscosity=[LIGHT_GRAY]Viskosität: {0}
text.liquid.temperature=[LIGHT_GRAY]Temperature: {0} text.liquid.temperature=[LIGHT_GRAY]Temperatur: {0}
block.thorium-wall.name=Thorium Wall block.thorium-wall.name=Thorium Mauer
block.thorium-wall-large.name=Large Thorium Wall block.thorium-wall-large.name=Große Thorium Mauer
block.duo.name=Duo block.duo.name=Duo
block.scorch.name=Scorch block.scorch.name=Scorch
block.hail.name=Hail block.hail.name=Hail
block.lancer.name=Lancer block.lancer.name=Lancer
block.titanium-conveyor.name=Titanium Conveyor block.titanium-conveyor.name=Titanium Transportband
block.router.description=Splits items into all 4 directions. Can store items as a buffer. block.router.description=Teilt Gegenstände in alle 4 Richtungen. Kann ebenfalls Gegenstände puffern.
block.distributor.name=Distributor block.distributor.name=Verteiler
block.distributor.description=A splitter that can split items into 8 directions. block.distributor.description=Ein Teiler der Gegenstände in 8 Richtungen teilen kann.
block.sorter.description=Sorts items. If an item matches the selection, it is allowed to pass. Otherwise, the item is outputted to the left and right. block.sorter.description=Sortiert Gegenstände. Wenn ein Gegenstand der Auswahl entspricht darf er vorbei. Andernfalls wird er links oder rechts ausgegeben.
block.overflow-gate.name=Overflow Gate block.overflow-gate.name=Overflow Gate
block.overflow-gate.description=A combination splitter and router that only outputs to the left and right if the front path is blocked. block.overflow-gate.description=Eine Kombination aus Splitter und router der nur Gegenstände nach links oder rechts ausgibt falls der Weg gerade aus blockiert ist.
block.bridgeconveyor.name=Bridge Conveyor block.bridgeconveyor.name=Transportband Brücke
block.bridgeconveyor.description=A conveyor that can go over other blocks, for up to two total blocks. block.bridgeconveyor.description=Ein Transportband welches über Blöcke gehen kann. Insgesamt maximal zwei Blöcke hoch.
block.arc-smelter.name=Arc Smelter block.arc-smelter.name=Lichtbogen Schmelzer
block.silicon-smelter.name=Silicon Smelter block.silicon-smelter.name=Silikon Schmelzer
block.phase-weaver.name=Phase Weaver block.phase-weaver.name=Phase Weaver
block.pulverizer.name=Pulverizer block.pulverizer.name=Pulverisierer
block.cryofluidmixer.name=Cryofluid Mixer block.cryofluidmixer.name=Cryofluid Mixer
block.melter.name=Melter block.melter.name=Schmelzer
block.incinerator.name=Incinerator block.incinerator.name=Verbrennungsanlage
block.biomattercompressor.name=Biomatter Compressor block.biomattercompressor.name=Biomassen Verdichter
block.separator.name=Separator block.separator.name=Seperierer
block.centrifuge.name=Centrifuge block.centrifuge.name=Zentrifuge
block.power-node.name=Power Node block.power-node.name=Power Knoten
block.power-node-large.name=Large Power Node block.power-node-large.name=Grosser Power Knoten
block.battery.name=Battery block.battery.name=Batterie
block.battery-large.name=Large Battery block.battery-large.name=Grosse Batterie
block.combustion-generator.name=Combustion Generator block.combustion-generator.name=Verbrennungs-Generator
block.turbine-generator.name=Turbine Generator block.turbine-generator.name=Turbinen Generator
block.laser-drill.name=Laser Drill block.laser-drill.name=Laser Bohrer
block.water-extractor.name=Water Extractor block.water-extractor.name=Wasser Extraktor
block.cultivator.name=Cultivator block.cultivator.name=Kultivierer
block.mechanical-pump.name=Mechanical Pump block.mechanical-pump.name=Mechanische Pumpe
block.itemsource.name=Item Source block.itemsource.name=Gegenstands Quelle
block.itemvoid.name=Item Void block.itemvoid.name=Gegenstand Void
block.liquidsource.name=Liquid Source block.liquidsource.name=Flüssigkeits-Quelle
block.powervoid.name=Power Void block.powervoid.name=Power Void
block.powerinfinite.name=Power Infinite block.powerinfinite.name=Power Unendlich
block.unloader.name=Unloader block.unloader.name=Entlader
block.sortedunloader.name=Sorted Unloader block.sortedunloader.name=Sortierender Entlader
block.vault.name=Vault block.vault.name=Tresor
block.wave.name=Wave block.wave.name=Welle
block.swarmer.name=Swarmer block.swarmer.name=Swarmer
block.salvo.name=Salvo block.salvo.name=Salvo
block.ripple.name=Ripple block.ripple.name=Ripple
block.phase-conveyor.name=Phase Conveyor block.phase-conveyor.name=Phase Transportband
block.bridge-conveyor.name=Bridge Conveyor block.bridge-conveyor.name=Brücken Transportband
block.plastanium-compressor.name=Plastanium Compressor block.plastanium-compressor.name=Plastanium Verdichter
block.pyratite-mixer.name=Pyratite Mixer block.pyratite-mixer.name=Pyratite Mixer
block.blast-mixer.name=Blast Mixer block.blast-mixer.name=Blast Mixer
block.solidifer.name=Solidifer block.solidifer.name=Solidifer
block.solar-panel.name=Solar Panel block.solar-panel.name=Solar Panel
block.solar-panel-large.name=Large Solar Panel block.solar-panel-large.name=Grosses Solar Panel
block.oil-extractor.name=Oil Extractor block.oil-extractor.name=Oil Extraktor
block.repair-point.name=Repair Point block.repair-point.name=Reparatur Punkt
block.pulse-conduit.name=Pulse Conduit block.pulse-conduit.name=Pulse Rohr
block.phase-conduit.name=Phase Conduit block.phase-conduit.name=Phase Rohr
block.liquid-router.name=Liquid Router block.liquid-router.name=Liquid Router
block.liquid-tank.name=Liquid Tank block.liquid-tank.name=Liquid Tank
block.liquid-junction.name=Liquid Junction block.liquid-junction.name=Liquid Kreuzung
block.bridge-conduit.name=Bridge Conduit block.bridge-conduit.name=Brücken Rohr
block.rotary-pump.name=Rotary Pump block.rotary-pump.name=Rotierende Pumpe
text.save.old=This save is for an older version of the game, and can no longer be used.\n\n[LIGHT_GRAY]Save backwards compatibility will be implemented in the full 4.0 release. text.save.old=This save is for an older version of the game, and can no longer be used.\n\n[LIGHT_GRAY]Save backwards compatibility will be implemented in the full 4.0 release.
text.customgame=Custom Game text.customgame=Custom Game
text.sectors=Sectors text.sectors=Sektoren
text.sector=Selected Sector: [LIGHT_GRAY]{0} text.sector=Ausgewählter Sektor: [LIGHT_GRAY]{0}
text.sector.time=Time: [LIGHT_GRAY]{0} text.sector.time=Zeit: [LIGHT_GRAY]{0}
text.sector.deploy=Deploy text.sector.deploy=Einsatz
text.sector.resume=Resume text.sector.resume=Fortsetzen
text.sector.locked=[scarlet][[Incomplete] text.sector.locked=[scarlet][[Unvollständig]
text.sector.unexplored=[accent][[Unexplored] text.sector.unexplored=[accent][[Unerforscht]
text.close=Close text.close=Schließen
text.save.playtime=Playtime: {0} text.save.playtime=Spielzeit: {0}
text.editor.brush=Brush text.editor.brush=Pinsel
text.credits.text=Created by [ROYAL]Anuken[] - [SKY]anukendev@gmail.com[]\n\n[GRAY](In case you can't tell, this text is currently unfinished.\nTranslators, don't edit it yet!) text.credits.text=Created by [ROYAL]Anuken[] - [SKY]anukendev@gmail.com[]\n\n[GRAY](In case you can't tell, this text is currently unfinished.\nTranslators, don't edit it yet!)
text.sector.gameover=This sector has been lost. Re-deploy? text.sector.gameover=Du hast diesen Sektor verloren. Erneuter Einsatz?
text.sector.retry=Retry text.sector.retry=Erneut Versuchen
text.wave.lasted=You lasted until wave [accent]{0}[]. text.wave.lasted=Du hast es bis Welle[accent]{0}[] ausgehalten.
setting.fpscap.name=Max FPS setting.fpscap.name=Max FPS
setting.fpscap.none=None setting.fpscap.none=kein
setting.fpscap.text={0} FPS setting.fpscap.text={0} FPS
block.command-center.name=Command Center block.command-center.name=Kommando Zentrum
text.mission=Mission:[LIGHT_GRAY] {0} text.mission=Mission:[LIGHT_GRAY] {0}
text.mission.wave=Survive [accent]{0}[] waves. text.mission.wave=Überlebe [accent]{0}[] Wellen.
text.mission.battle=Destroy the enemy base. text.mission.battle=Zerstöre die gegnerische Basis.
text.none=<none> text.none=<nichts>
text.sector.corrupted=[orange]A save file for this sector was found, but loading failed.\nA new one has been created. text.sector.corrupted=[orange]Ein Spielstand für diesen Sektor wurde nicht gefunden.\nEin neuer Spielstand wurde erstellt.
text.mission.complete=Mission complete! text.mission.complete=Mission erfolgreich!
text.mission.complete.body=Sector {0},{1} has been conquered. text.mission.complete.body=Sektor {0},{1} wurde erobert.
text.mission.resource=Obtain {0}:\n[accent]{1}/{2}[] text.mission.resource=Sammele {0}:\n[accent]{1}/{2}[]
text.unit.health=[LIGHT_GRAY]Health: {0} text.unit.health=[LIGHT_GRAY]Gesundheit: {0}
text.unit.speed=[LIGHT_GRAY]Speed: {0} text.unit.speed=[LIGHT_GRAY]Geschwindigkeit: {0}
block.mass-driver.name=Mass Driver block.mass-driver.name=Mass Driver
block.blast-drill.name=Blast Drill block.blast-drill.name=Spreng Bohrer
unit.drone.description=The starter drone unit. Spawns in the core by default. Automatically mines ores, collects items and repairs blocks. unit.drone.description=Die anfängliche Drohne. Sie wird gewöhnlich im Kern erzeugt. Baut automatisch Erz ab, sammelt Gegenstände und repariert Blöcke.
unit.fabricator.description=An advanced drone unit. Automatically mines ores, collects items and repairs blocks. Significantly more effective than a drone. unit.fabricator.description=Eine forgeschrittene Drohne. Baut automatisch Erz ab, sammelt Gegenstände und repariert Blöcke. Signifikant effizienter als die Drohne.
unit.titan.name=Titan unit.titan.name=Titan
unit.titan.description=An advanced armored ground unit. Uses carbide as ammo. Attacks both ground and air targets. unit.titan.description=Eine fortgeschrittene gepanzerte Bodeneinheit. Benutzt Carbide als Munition. Kann sowohl Boden als auch Luft Einheiten angreifen.
unit.monsoon.description=A heavy carpet bomber. Uses blast compound or pyratite as ammo. unit.monsoon.description=Ein schwerer Flächen Bomber. Benutzt Explosives Gemisch und Pyratite als munition.
unit.interceptor.description=A fast, hit-and-run strike unit. Uses lead as ammo. unit.interceptor.description=Eine schnelle hit-and-run Angriffs Einheit. Benutzt Blei als Munition.
block.thermal-pump.name=Thermal Pump block.thermal-pump.name=Thermische Pumpe
block.thermal-generator.name=Thermal Generator block.thermal-generator.name=Thermischer Generator
text.coreattack=< Core is under attack! > text.coreattack=< Der Kern wird angegriffen! >
text.continue=Continue text.continue=Weiter
text.nextmission=Next Mission text.nextmission=Nächste Mission
text.server.kicked.serverClose=Server closed. text.server.kicked.serverClose=Server geschlossen.
text.server.kicked.sectorComplete=Sector completed. text.server.kicked.sectorComplete=Sektor komplett.
text.server.kicked.sectorComplete.text=Your mission is complete.\nThe server will now continue at the next sector. text.server.kicked.sectorComplete.text=Deine Mission ist abgeschlossen.\nDer Server wird nun in einen neuen Sektor wechseln.
text.map.invalid=Error loading map: corrupted or invalid map file. text.map.invalid=Fehler beim Laden der Karte: Beschädigtes oder invalide Karten Datei.
block.deepwater.name=deepwater block.deepwater.name=Tiefes Wasser
block.water.name=water block.water.name=Wasser
block.lava.name=lava block.lava.name=Lava
block.oil.name=oil block.oil.name=Öl
block.blackstone.name=blackstone block.blackstone.name=Schwarzer Stein
block.stone.name=stone block.stone.name=Stein
block.dirt.name=dirt block.dirt.name=Dreck
block.sand.name=sand block.sand.name=Sand
block.ice.name=ice block.ice.name=Eis
block.snow.name=snow block.snow.name=Schnee
block.grass.name=grass block.grass.name=Grass
block.shrub.name=shrub block.shrub.name=Busch
block.rock.name=rock block.rock.name=Fels
block.blackrock.name=blackrock block.blackrock.name=Schwarzer Fels
block.icerock.name=icerock block.icerock.name=Eis Fels
unit.dagger.name=Dagger unit.dagger.name=Dagger
unit.dagger.description=A basic ground unit. Useful in swarms. unit.dagger.description=Eine Standard Bodeneinheit. Nützlich in Schwärmen.
category.general.name=General category.general.name=Allgemein
category.view.name=View category.view.name=View
category.multiplayer.name=Multiplayer category.multiplayer.name=Mehrspieler
keybind.toggle_menus.name=Toggle menus keybind.toggle_menus.name=Wechsele Menüs
keybind.chat_history_prev.name=Chat history prev keybind.chat_history_prev.name=Chat Historie zurück
keybind.chat_history_next.name=Chat history next keybind.chat_history_next.name=Chat Historie vor
keybind.chat_scroll.name=Chat scroll keybind.chat_scroll.name=Chat scroll
keybind.drop_unit.name=drop unit keybind.drop_unit.name=drop unit
keybind.zoom_minimap.name=Zoom minimap keybind.zoom_minimap.name=Zoom minimap
content.mech.name=Mechs content.mech.name=Mechs
item.copper.name=Copper item.copper.name=Kupfer
item.copper.description=A useful structure material. Used extensively in all types of blocks. item.copper.description=Ein nützliches Material. Wird in allen Arten von Blöcken verwendet.
item.dense-alloy.name=Dense Alloy item.dense-alloy.name=Dichte Legierung
item.dense-alloy.description=A tough alloy made with lead and copper. Used in advanced transportation blocks and high-tier drills. item.dense-alloy.description=Eine Robuste Legierung aus Blei und Kupfer. Findet Verwendung in fortgeschrittenen Transport Blöcken und höherwertigen Bohrern.
mech.alpha-mech.name=Alpha mech.alpha-mech.name=Alpha
mech.alpha-mech.weapon=Heavy Repeater mech.alpha-mech.weapon=Heavy Repeater
mech.alpha-mech.ability=Drone Swarm mech.alpha-mech.ability=Drone Swarm
mech.alpha-mech.description=The standard mech. Has decent speed and damage output; can create up to 3 drones for increased offensive capability. mech.alpha-mech.description=Der Standart Mech. Ist angemessen Schnell und hat ordentlich Schaden. Kann für erweiterte Offensive Fähigkeiten bis zu 3 Drohnen erzeugen.
mech.delta-mech.name=Delta mech.delta-mech.name=Delta
mech.delta-mech.weapon=Arc Generator mech.delta-mech.weapon=Lichtbogen Generator
mech.delta-mech.ability=Discharge mech.delta-mech.ability=Entladen
mech.delta-mech.description=A fast, lightly-armored mech made for hit-and-run attacks. Does little damage against structures, but can kill large groups of enemy units very quickly with its arc lightning weapons. mech.delta-mech.description= Ein schneller, leicht gepanzerter Mech, der für hit-and-run Attacken gemacht wurde. Verursacht wenig Schaden gegen Gebäude aber tötet Gruppen von Gegnern durch seine Lichtbogen Blitz Waffen.
mech.tau-mech.name=Tau mech.tau-mech.name=Tau
mech.tau-mech.weapon=Restruct Laser mech.tau-mech.weapon=Restrukt Laser
mech.tau-mech.ability=Repair Burst mech.tau-mech.ability=Reparier Burst
mech.tau-mech.description=The support mech. Heals allied blocks by shooting at them. Can extinguish fires and heal allies in a radius with its repair ability. mech.tau-mech.description=Der Support Mech. Kann Blöcke durch Schüsse heilen. Kann Feuer löschen und verbündete in seinem Aktions Radius heilen.
mech.omega-mech.name=Omega mech.omega-mech.name=Omega
mech.omega-mech.weapon=Swarm Missiles mech.omega-mech.weapon=Schwarm Raketen
mech.omega-mech.ability=Armored Configuration mech.omega-mech.ability=Rüstungs Konfiguration
mech.omega-mech.description=A bulky and well-armored mech, made for front-line assaults. Its armor ability can block up to 90% of incoming damage. mech.omega-mech.description=Ein klobiger und gut gepanzerter Mech, der für den Angriff in der Front Line gemacht wurde. Seine Rüstungsfähigkeit ermöglicht es ihm 90% des Schadens abzuwehren.
mech.dart-ship.name=Dart mech.dart-ship.name=Dart
mech.dart-ship.weapon=Repeater mech.dart-ship.weapon=Repeater
mech.dart-ship.description=The standard ship. Reasonably fast and light, but has little offensive capability and low mining speed. mech.dart-ship.description=Das standard Schiff. Einigermaßen schnell und leicht. Hat nur wenig offensiv Kraft und geringe Abbaugeschwindigkeit.
mech.javelin-ship.name=Javelin mech.javelin-ship.name=Javelin
mech.javelin-ship.description=A hit-and-run strike ship. While initially slow, it can accelerate to great speeds and fly by enemy outposts, dealing large amounts of damage with its lightning ability and missiles. mech.javelin-ship.description=Ein hit-and-run Schiff. Anfänglich träge kann es auf hohe Geschwindigkeiten beschleunigen um an gegnerischen Aussenposten vorbei zu fliegen und dabei mit seinen Blitz Waffen und Raketen große Mengen an Schaden verursachen.
mech.javelin-ship.weapon=Burst Missiles mech.javelin-ship.weapon=Burst Missiles
mech.javelin-ship.ability=Discharge Booster mech.javelin-ship.ability=Discharge Booster
mech.trident-ship.name=Trident mech.trident-ship.name=Trident
mech.trident-ship.description=A heavy bomber. Reasonably well armored. mech.trident-ship.description=Ein schwerer Bomber, solide gepanzert.
mech.trident-ship.weapon=Bomb Bay mech.trident-ship.weapon=Bomb Bay
mech.glaive-ship.name=Glaive mech.glaive-ship.name=Glaive
mech.glaive-ship.description=A large, well-armored gunship. Equipped with an incendiary repeater. Good acceleration and maximum speed. mech.glaive-ship.description=Ein großes gut gepanzertes Gunship. Ausgerüstet mit einer Brand Waffe. Gute Beschleunigung und maximal Geschwindigkeit.
mech.glaive-ship.weapon=Flame Repeater mech.glaive-ship.weapon=Flame Repeater
text.mech.weapon=[LIGHT_GRAY]Weapon: {0} text.mech.weapon=[LIGHT_GRAY]Waffe: {0}
text.mech.armor=[LIGHT_GRAY]Armor: {0} text.mech.armor=[LIGHT_GRAY]Rüstung: {0}
text.mech.itemcapacity=[LIGHT_GRAY]Item Capacity: {0} text.mech.itemcapacity=[LIGHT_GRAY]Gegenstands Kapazität: {0}
text.mech.minespeed=[LIGHT_GRAY]Mining Speed: {0} text.mech.minespeed=[LIGHT_GRAY]Mining Geschwindigkeit: {0}
text.mech.minepower=[LIGHT_GRAY]Mining Power: {0} text.mech.minepower=[LIGHT_GRAY]Mining Power: {0}
text.mech.ability=[LIGHT_GRAY]Ability: {0} text.mech.ability=[LIGHT_GRAY]Fähigkeit: {0}
block.core.name=Core block.core.name=Kern
block.metalfloor.name=Metal Floor block.metalfloor.name=Metal Boden
block.copper-wall.name=Copper Wall block.copper-wall.name=Kupfer Mauer
block.copper-wall-large.name=Large Copper Wall block.copper-wall-large.name=Grosse Kupfer Mauer
block.phase-wall.name=Phase Wall block.phase-wall.name=Phase Mauer
block.phase-wall-large.name=Large Phase Wall block.phase-wall-large.name=Grosse Phase Mauer
block.mechanical-drill.name=Mechanical Drill block.mechanical-drill.name=Mechanischer Bohrer
block.pneumatic-drill.name=Pneumatic Drill block.pneumatic-drill.name=Pneumatischer Bohrer
block.thorium-reactor.name=Thorium Reactor block.thorium-reactor.name=Thorium Reaktor
block.alloy-smelter.name=Alloy Smtler block.alloy-smelter.name=Legierungs Schmeltzer
block.mend-projector.name=Mend Projector block.mend-projector.name=Mend Projector
unit.alpha-drone.name=Alpha Drone unit.alpha-drone.name=Alpha Drone
text.construction.desktop=Desktop controls have been changed.\nTo deselect a block or stop building, [accent]use space[]. text.construction.desktop=Die Desktop Steuerung wurde geändert.\n Zum deselektieren eines Blocks oder das Bauen abzubrechen benutze die [accent] Space Taste[].
keybind.press=Press a key... keybind.press=Drücke eine Taste...
keybind.press.axis=Press an axis or key... keybind.press.axis=Drücke eine Taste oder bewege eine Achse...
keybind.deselect.name=Deselect keybind.deselect.name=Deselektieren
block.surge-wall.name=Surge Wall block.surge-wall.name=Surge Mauer
block.surge-wall-large.name=Large Surge Wall block.surge-wall-large.name=Grosse Surge Mauer
block.cyclone.name=Cyclone block.cyclone.name=Cyclone
block.fuse.name=Fuse block.fuse.name=Fuse
text.confirmkick=Are you sure you want to kick this player? text.confirmkick=Bist du sicher das du diesen Spieler kicken willst?
text.settings.cleardata=Clear Game Data... text.settings.cleardata=Spieldaten zurücksetzen...
text.settings.clear.confirm=Are you sure you want to clear this data?\nWhat is done cannot be undone! text.settings.clear.confirm=Bist du sicher das du die Spieldaten zurücksetzen willst?\n Diese Aktion kann nicht rückgänig gemacht werden!
text.settings.clearall.confirm=[scarlet]WARNING![]\nThis will clear all data, including saves, maps, unlocks and keybinds.\nOnce you press 'ok' the game will wipe all data and automatically exit. text.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.
text.settings.clearsectors=Clear Sectors text.settings.clearsectors=Sektoren zurücksetzen
text.settings.clearunlocks=Clear Unlocks text.settings.clearunlocks=Freischaltungen zurücksetzen
text.settings.clearall=Clear All text.settings.clearall=Alles zurücksetzen
block.shock-mine.name=Shock Mine block.shock-mine.name=Schock Mine
block.overdrive-projector.name=Overdrive Projector block.overdrive-projector.name=Overdrive Projektor
text.blocks.powerdamage=Power/Damage text.blocks.powerdamage=Power/Schaden
mode.custom.warning=Note that blocks cannot be used in custom games until they are unlocked in sectors.\n\n[LIGHT_GRAY]If you have not unlocked any blocks, none will appear. mode.custom.warning=Beachte das Blöcke auch in Eigenen Spielen nicht verwendet werden können, solange sie nicht in den Sektoren freigespielt wurden.\n\n[LIGHT_GRAY]Solange ein Block nicht freigeschaltet wurde, ist er nicht sichtbar.
content.unit.name=Units content.unit.name=Einheiten
block.force-projector.name=Force Projector block.force-projector.name=Force Projektor
block.arc.name=Arc block.arc.name=Arc
block.rtg-generator.name=RTG Generator block.rtg-generator.name=RTG Generator
block.spectre.name=Spectre block.spectre.name=Spectre
block.meltdown.name=Meltdown block.meltdown.name=Meltdown
text.mission.info=Mission Info text.mission.info=Mission Info
text.mission.wave.enemies=Survive[accent] {0}/{1} []waves\n{2} Enemies text.mission.wave.enemies=Überlebe[accent] {0}/{1} []Wellen\n{2} Gegner
text.mission.wave.enemy=Survive[accent] {0}/{1} []waves\n{2} Enemy text.mission.wave.enemy=Überlebe[accent] {0}/{1} []Wellen\n{2} Gegner
text.mission.wave.menu=Survive[accent] {0} []waves text.mission.wave.menu=Überlebe[accent] {0} []Wellen
text.mission.resource.menu=Obtain {0} x{1} text.mission.resource.menu=Erlange {0} x{1}
text.mission.block=Create {0} text.mission.block=Erstelle {0}
text.mission.unit=Create {0} Unit text.mission.unit=Erstelle {0} Einheiten
text.mission.linknode=Link Power Node text.mission.linknode=Verbinde Power Knoten
text.mission.display=[accent]Mission:\n[LIGHT_GRAY]{0} text.mission.display=[accent]Mission:\n[LIGHT_GRAY]{0}
text.hostserver.mobile=Host\nGame text.hostserver.mobile=Host\nGame
setting.difficulty.training=training setting.difficulty.training=training
block.dense-alloy-wall.name=Dense Alloy Wall block.dense-alloy-wall.name=Dichte Legierungs Mauer
block.dense-alloy-wall-large.name=Large Dense Alloy Wall block.dense-alloy-wall-large.name=Grosse Dichte Legierungs Mauer
block.dart-ship-pad.name=Dart Ship Pad block.dart-ship-pad.name=Dart Ship Pad
block.delta-mech-pad.name=Delta Mech Pad block.delta-mech-pad.name=Delta Mech Pad
block.javelin-ship-pad.name=Javelin Ship Pad block.javelin-ship-pad.name=Javelin Ship Pad
@@ -601,74 +601,74 @@ block.trident-ship-pad.name=Trident Ship Pad
block.glaive-ship-pad.name=Glaive Ship Pad block.glaive-ship-pad.name=Glaive Ship Pad
block.omega-mech-pad.name=Omega Mech Pad block.omega-mech-pad.name=Omega Mech Pad
block.tau-mech-pad.name=Tau Mech Pad block.tau-mech-pad.name=Tau Mech Pad
block.spirit-factory.name=Spirit Drone Factory block.spirit-factory.name=Spirit Drone Fabrik
block.phantom-factory.name=Phantom Drone Factory block.phantom-factory.name=Phantom Drone Fabrik
block.wraith-factory.name=Wraith Fighter Factory block.wraith-factory.name=Wraith Fighter Fabrik
block.ghoul-factory.name=Ghoul Bomber Factory block.ghoul-factory.name=Ghoul Bomber Fabrik
block.dagger-factory.name=Dagger Mech Factory block.dagger-factory.name=Dagger Mech Fabrik
block.titan-factory.name=Titan Mech Factory block.titan-factory.name=Titan Mech Fabrik
block.revenant-factory.name=Revenant Fighter Factory block.revenant-factory.name=Revenant Fighter Fabrik
unit.spirit.name=Spirit Drone unit.spirit.name=Spirit Drone
unit.spirit.description=The starter drone unit. Spawns in the core by default. Automatically mines ores, collects items and repairs blocks. unit.spirit.description=Die anfängliche Drohne. Sie wird gewöhnlich im Kern erzeugt. Baut automatisch Erz ab, sammelt Gegenstände und repariert Blöcke.
unit.phantom.name=Phantom Drone unit.phantom.name=Phantom Drone
unit.phantom.description=An advanced drone unit. Automatically mines ores, collects items and repairs blocks. Significantly more effective than a drone. unit.phantom.description=Eine fortgeschrittene Drohne. Baut automatisch Erz ab, sammelt Gegenstände und repariert Blöcke. Signifikant effizienter als die Drohne.
unit.ghoul.name=Ghoul Bomber unit.ghoul.name=Ghoul Bomber
unit.ghoul.description=A heavy carpet bomber. Uses blast compound or pyratite as ammo. unit.ghoul.description=Ein schwerer Flächen Bomber. Benutzt Explosives Gemisch und Pyratite als Munition.
unit.wraith.name=Wraith Fighter unit.wraith.name=Wraith Fighter
unit.wraith.description=A fast, hit-and-run interceptor unit. unit.wraith.description=Eine schnelle Abfangjäger Einheit.
unit.fortress.name=Fortress unit.fortress.name=Fortress
unit.fortress.description=A heavy artillery ground unit. unit.fortress.description=Eine schwere Artillerie Boden-Einheit.
unit.revenant.name=Revenant unit.revenant.name=Revenant
unit.revenant.description=A heavy laser platform. unit.revenant.description=Eine schwere Laser Platform.
tutorial.begin=Your mission here is to eradicate the[LIGHT_GRAY] enemy[].\n\nBegin by[accent] mining copper[]. Tap a copper ore vein near your core to do this. tutorial.begin=Deine Mission ist es den [LIGHT_GRAY]Gegner[] auszurotten.\n\n Beginne damit [accent] Kupfer abzubauen[]. Beginne in dem du auf ein Kupfer Vorkommen nahe deines Kerns klickst.
tutorial.drill=Mining manually is inefficient.\n[accent]Drills []can mine automatically.\nPlace one on a copper vein. tutorial.drill=Manuelles Abbauen von Ressourcen ist ineffizient.\n[accent]Bohrer[] können automatisch abbauen.\n Platziere einen auf einem Kupfer Vorkommen.
tutorial.conveyor=[accent]Conveyors[] are used to transport items to the core.\nMake a line of conveyors from the drill to the core. tutorial.conveyor=[accent]Transportbänder[] werden dazu benutzt Gegenstände zum Kern zu transportieren.\n Erstelle eine Reihe von Transportbändern zum Kern.
tutorial.morecopper=More copper is required.\n\nEither mine it manually, or place more drills. tutorial.morecopper=Du brauchst [accent]mehr Kupfer[]!\n\nEntweder du baust es manuell ab, oder du platzierst weitere Bohrer.
tutorial.turret=Defensive structures must be built to repel the[LIGHT_GRAY] enemy[].\nBuild a duo turret near your base. tutorial.turret=Wir benötigen Verteidigung gegen den [LIGHT_GRAY] Gegner[].\n Baue einen Duo Turm nahe deiner Basis.
tutorial.drillturret=Duo turrets require[accent] copper ammo []to shoot.\nPlace a drill next to the turret to supply it with mined copper. tutorial.drillturret=Der Duo Turm benötigt[accent] Kupfer[] als Munition. Platziere einen Bohrer neben dem Turm, um ihn mit Kupfer zu versorgen.
tutorial.waves=The[LIGHT_GRAY] enemy[] approaches.\n\nDefend your core for 2 waves. Build more turrets. tutorial.waves=Der [LIGHT_GRAY] Gegner[] greift an.\n\nVerteidige deinen Kern 2 Wellen lang. Bau mehr Türme.
tutorial.lead=More ores are available. Explore and mine[accent] lead[].\n\nDrag from your unit to the core to transfer resources. tutorial.lead=Mehr Erz ist verfügbar. Finde Blei und bau es ab.\n\n Klicke auf deine Einheit und ziehe die Maus auf den Kern um Ressourcen zu übertragen.
tutorial.smelter=Copper and lead are weak metals.\nSuperior[accent] Dense Alloy[] can be created in a smelter.\n\nBuild one. tutorial.smelter=Kupfer und Blei sind schwache Metalle.\n Super [accent]dichte Legierung [] kann in einem Schmeltzer erzeugt werden.\n\n Bau einen.
tutorial.densealloy=The smelter will now produce alloy.\nGet some.\nImprove the production if necessary. tutorial.densealloy=Der Schmeltzer wird nun Legierung produzieren.\n Produziere einige.\n Verbessere die Produktion sofern notwendig.
tutorial.siliconsmelter=The core will now create a[accent] spirit drone[] for mining and repairing blocks.\n\nFactories for other units can be created with [accent] silicon.\nMake a silicon smelter. tutorial.siliconsmelter=Der Kern wird nun [accent]spirit drohnen[] erstellen. Diese Bauen Rohstoffe und reparieren Blöcke.\n\nFabriken für andere Einheiten benötigen [accent]Silikon[].\n Baue ein Silikon Schmeltzer.
tutorial.silicondrill=Silicon requires[accent] coal[] and[accent] sand[].\nStart by making drills. tutorial.silicondrill=Silikon benötigt [accent]Kohle[] und [accent]Sand[].\n Fange damit an die Bohrer zu platzieren.
tutorial.generator=This technology requires power.\nCreate a[accent] combustion generator[] for it. tutorial.generator=Diese Technologie benötigt power.\n Erstelle einen Verbrennungs-Generator dafür.
tutorial.generatordrill=Combustion generators need fuel.\nFuel it with coal from a drill. tutorial.generatordrill=Verbrennungs Generatoren benötigen Kraftstoff.\nBenutze Kohle aus einem Bohrer als Kraftstoff.
tutorial.node=Power requires transport.\nCreate a[accent] power node[] next to your combustion generator to transfer its power. tutorial.node=Power muss transportiert werden.\nErstelle einen [accent]Power Knoten[] nahe deinem Verbrennungs Generator um seine Power zu transportieren.
tutorial.nodelink=Power can be transferred through contacting power blocks and generators, or by linked power nodes.\n\nLink power by tapping the node and selecting the generator and silicon smelter. tutorial.nodelink=Power kann über verbundene Power Blocks, Generatoren oder Power Knoten transferierd werden.\n\n Verbinde die Power in dem du auf den Knoten klickst und dann den Generator und den Silikon Schmeltzer auswählst.
tutorial.silicon=Silicon is being produced. Get some.\n\nImproving the production system is advised. tutorial.silicon=Silikon wird produziert. Produziere einiges.\n\n Verbesserungen am Produktionssystem werden empfohlen.
tutorial.daggerfactory=Construct a[accent] dagger mech factory.[]\n\nThis will be used to create attack mechs. tutorial.daggerfactory=Konstruiere eine Dagger Mech Fabrik.\n\n Diese wird verwendet um Angreifende Mechs zu erstellen.
tutorial.router=Factories need resources to function.\nCreate a router to split conveyor resources. tutorial.router=Fabriken benötigen Ressourcen um zu funktionieren.\n Platziere ein Router um Gegenstände auf Transportbändern aufzuteilen.
tutorial.dagger=Link power nodes to the factory.\nOnce requirements are met, a mech will be created.\n\nCreate more drills, generators and conveyors as necessary. tutorial.dagger=Verbinde die Fabrik mit einem Power Knoten. Wenn alle Voraussetzungen gegeben sind, beginnt die Fabrik Mechs zu konstruieren.\n\n Platziere mehr Bohrer und Transportbänder um die Versorgung der Fabrik zu sichern.
tutorial.battle=The[LIGHT_GRAY] enemy[] has revealed their core.\nDestroy it with your unit and dagger mechs. tutorial.battle=Der[LIGHT_GRAY] Gegner[] hat seinen Kern offenbart.\nZerstöre ihn mit deiner Einheit und den Dagger Mechs.
text.missions=Missions:[LIGHT_GRAY] {0} text.missions=Missionen:[LIGHT_GRAY] {0}
text.mission.command=Send Command {0} To Units text.mission.command=Sende Command {0} an Einheiten
text.mission.mech=Switch to mech[accent] {0}[] text.mission.mech=Wechsele zu Mech[accent] {0}[]
text.mission.create=Create[accent] {0}[] text.mission.create=Platziere[accent] {0}[]
text.wave.enemies=[LIGHT_GRAY]{0} Enemies Remaining text.wave.enemies=[LIGHT_GRAY]{0} Gegner Verbleiben
text.wave.enemy=[LIGHT_GRAY]{0} Enemy Remaining text.wave.enemy=[LIGHT_GRAY]{0} Gegner Verbleiben
setting.autotarget.name=Auto-Target setting.autotarget.name=Auto-Target
command.attack=Attack command.attack=Angreifen
command.retreat=Retreat command.retreat=Rückzug
command.patrol=Patrol command.patrol=Patrouillieren
block.spawn.name=Enemy Spawn block.spawn.name=Gegner Spawn
block.fortress-factory.name=Fortress Mech Factory block.fortress-factory.name=Fortress Mech Fabrik
text.gameover.pvp=The[accent] {0}[] team is victorious! text.gameover.pvp=Das[accent] {0}[] Team ist Siegreich!
text.sector.abandon=Abandon text.sector.abandon=Aufgeben
text.sector.abandon.confirm=Are you sure you want to abandon all progress at this sector?\nThis cannot be undone! text.sector.abandon.confirm=Bist du sicher das du allen Fortschritt in diesem Sektor aufgeben willst?\n Diese Aktion kann nicht Rückgängig gemacht werden!
text.mission.main=Main Mission:[LIGHT_GRAY] {0} text.mission.main=Haupt Mission:[LIGHT_GRAY] {0}
text.waiting.players=Waiting for players... text.waiting.players=Warte auf Spieler...
text.map.nospawn.pvp=This map does not have any enemy cores for player to spawn into! Add[SCARLET] red[] cores to this map in the editor. text.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.
text.blocks.basepowergeneration=Base Power Generation text.blocks.basepowergeneration=Base Power Generation
text.blocks.liquidoutputspeed=Liquid Output Speed text.blocks.liquidoutputspeed=Flüssigkeits-Ausgabe Geschwindigkeit
mode.custom.warning.read=Just to make sure you've read it:\n[scarlet]UNLOCKS IN CUSTOM GAMES DO NOT CARRY OVER TO SECTORS OR OTHER MODES!\n\n[LIGHT_GRAY](I wish this wasn't necessary, but apparently it is) mode.custom.warning.read=Nur um sicherzugehen das du es gelesen hast:\n[scarlet]FREISCHALTUNGEN in Eigenen Spielen übertragen sich NICHT in Sektoren oder andere Modis!\n\n[LIGHT_GRAY](Ich wünschte der Hinweis wäre nicht notwendig, aber offensichtlich ist es das)[]
mode.pvp.name=PvP mode.pvp.name=PvP
mode.pvp.description=fight against other players locally. mode.pvp.description=Kämpfe gegen andere Spieler local.
block.alpha-mech-pad.name=Alpha Mech Pad block.alpha-mech-pad.name=Alpha Mech Pad
block.container.name=Container block.container.name=Container
team.blue.name=blue team.blue.name=Blau
team.red.name=red team.red.name=Rot
team.orange.name=orange team.orange.name=Orange
team.none.name=gray team.none.name=Grau
team.green.name=green team.green.name=Grün
team.purple.name=purple team.purple.name=Lila

View File

@@ -5,18 +5,18 @@ text.link.github.description=게임 소스코드
text.link.dev-builds.description=개발중인 빌드 text.link.dev-builds.description=개발중인 빌드
text.link.trello.description=다음 출시될 기능들을 게시한 공식 Trello 보드 text.link.trello.description=다음 출시될 기능들을 게시한 공식 Trello 보드
text.link.itch.io.description=PC 버전 다운로드와 HTML5 버전이 있는 itch.io 사이트 text.link.itch.io.description=PC 버전 다운로드와 HTML5 버전이 있는 itch.io 사이트
text.link.google-play.description=Google 플레이 스토어 등록 정보 text.link.google-play.description=Google Play 스토어 정보
text.link.wiki.description=공식 Mindustry 위키 text.link.wiki.description=공식 Mindustry 위키 (영어)
text.linkfail=링크를 여는데 실패했습니다!URL이 기기의 클립보드에 복사되었습니다. text.linkfail=링크를 여는데 실패했습니다! URL이 기기의 클립보드에 복사되었습니다.
text.editor.web=HTML5 버전은 에디터 기능을 지원하지 않습니다!게임을 다운로드 한 뒤에 사용 해 주세요. text.editor.web=HTML5 버전은 에디터 기능을 지원하지 않습니다! 게임을 다운로드 한 뒤에 사용 해 주세요.
text.web.unsupported=HTML5 버전은 이 기능을 지원하지 않습니다!게임을 다운로드 한 뒤에 사용 해 주세요. text.web.unsupported=HTML5 버전은 이 기능을 지원하지 않습니다! 게임을 다운로드 한 뒤에 사용 해 주세요.
text.gameover=코어가 터졌습니다. 게임 오버! text.gameover=코어가 터졌습니다. 게임 오버!
text.highscore=[YELLOW]최고점수 달성! text.highscore=[YELLOW]최고점수 달성!
text.level.highscore=최고 점수:[accent]{0} text.level.highscore=최고 점수 : [accent]{0}
text.level.delete.title=삭제 확인 text.level.delete.title=삭제 확인
text.map.delete=정말로 "[orange]{0}[]" 맵을 삭제하시겠습니까? text.map.delete=정말로 "[orange]{0}[]" 맵을 삭제하시겠습니까?
text.level.select=맵 선택 text.level.select=맵 선택
text.level.mode=게임모드: text.level.mode=게임모드 :
text.construction.title=블록 배치 안내서 text.construction.title=블록 배치 안내서
text.construction=[accent]블록 배치 모드[]를 선택하셨습니다.\n\n블록을 설치하고 싶으면, 자신의 건설 가능 범위 내에서 간단히 탭 하면 됩니다.\n일부 블록을 선택한 후에 확인 버튼을 누르면 배가 배치 작업을 진행할 것입니다.\n- [accent]블록을 삭제[]하고 싶다면 배치하고 싶은 영역을 탭 하세요. \n- [accent]블록을 넓게 배치[]하고 싶다면 배치하고 싶은 시작 영역을 길게 누르며 드래그 하면 됩니다.- [accent]블록을 한줄로 배치[]하고 싶다면 배치하고 싶은 시작 영역을 한번 탭 하고 길게 누르면서 드래그 하면 됩니다. \n- [accent]블록 배치 모드를 취소[]하고 싶다면 화면 하단 왼쪽에 있는 X 버튼을 누르면 됩니다. text.construction=[accent]블록 배치 모드[]를 선택하셨습니다.\n\n블록을 설치하고 싶으면, 자신의 건설 가능 범위 내에서 간단히 탭 하면 됩니다.\n일부 블록을 선택한 후에 확인 버튼을 누르면 배가 배치 작업을 진행할 것입니다.\n- [accent]블록을 삭제[]하고 싶다면 배치하고 싶은 영역을 탭 하세요. \n- [accent]블록을 넓게 배치[]하고 싶다면 배치하고 싶은 시작 영역을 길게 누르며 드래그 하면 됩니다.- [accent]블록을 한줄로 배치[]하고 싶다면 배치하고 싶은 시작 영역을 한번 탭 하고 길게 누르면서 드래그 하면 됩니다. \n- [accent]블록 배치 모드를 취소[]하고 싶다면 화면 하단 왼쪽에 있는 X 버튼을 누르면 됩니다.
text.deconstruction.title=블록 삭제 안내서 text.deconstruction.title=블록 삭제 안내서
@@ -31,23 +31,23 @@ text.quit=나가기
text.maps= text.maps=
text.maps.none=[LIGHT_GRAY]맵을 찾을 수 없습니다! text.maps.none=[LIGHT_GRAY]맵을 찾을 수 없습니다!
text.about.button=정보 text.about.button=정보
text.name=이름: text.name=이름 :
text.unlocked=새 블록 잠금 해제 text.unlocked=새 블록 잠금 해제
text.unlocked.plural=새 블록 잠금 해제 text.unlocked.plural=새 블록 잠금 해제
text.players=현재 {0}명 접속중 text.players=현재 {0}명 접속중
text.players.single=현재 {0}명만 있음. text.players.single=현재 {0}명만 있음.
text.server.mismatch=클라이언트와 서버 버전이 일치하지 않습니다. 자신이 서버를 호스트하거나 최신 버전을 사용 해 주세요! text.server.mismatch=클라이언트와 서버 버전이 일치하지 않습니다. 자신이 서버를 호스트하거나 최신 버전을 사용 해 주세요!
text.server.closing=[accent]서버 닫는중... text.server.closing=[accent]서버 닫는중...
text.server.kicked.kick=당신은 서버에서 추방되었습니다! text.server.kicked.kick=서버에서 추방되었습니다!
text.server.kicked.clientOutdated=오래된 버전의 클라이언트 입니다! 게임을 업데이트 하세요! text.server.kicked.clientOutdated=오래된 버전의 클라이언트 입니다! 게임을 업데이트 하세요!
text.server.kicked.serverOutdated=오래된 버전의 서버입니다! 서버 호스트 관리자에게 문의하세요! text.server.kicked.serverOutdated=오래된 버전의 서버입니다! 서버 호스트 관리자에게 문의하세요!
text.server.kicked.banned=당신은 서버에서 밴 망치를 맞아 차단당했습니다. text.server.kicked.banned=서버에서 영 좋지 않은 행위를 하여 영구 차단되었습니다.
text.server.kicked.recentKick=당신은 방금 추방처리 되었습니다. 잠시 기다린 후에 접속 해 주세요. text.server.kicked.recentKick=방금 추방처리 되었습니다. 잠시 기다린 후에 접속 해 주세요.
text.server.kicked.nameInUse=이 닉네임이 이미 서버에서 사용중입니다. text.server.kicked.nameInUse=이 닉네임이 이미 서버에서 사용중입니다.
text.server.kicked.nameEmpty=닉네임에는 반드시 영어 또는 숫자가 있어야 합니다. text.server.kicked.nameEmpty=닉네임에는 반드시 영어 또는 숫자가 있어야 합니다.
text.server.kicked.idInUse=당신은 이미 서버에 접속중입니다! 다중 계정은 허용되지 않습니다. text.server.kicked.idInUse=이미 서버에 접속중입니다! 다중 계정은 허용되지 않습니다.
text.server.kicked.customClient=이 서버는 커스텀 빌드를 지원하지 않습니다. 공식 버전을 사용하세요. text.server.kicked.customClient=이 서버는 직접 빌드한 버전을 지원하지 않습니다. 공식 버전을 사용하세요.
text.host.info=[accent]호스트[] 버튼은 현재 네트워크의 [scarlet]6567[] 과 [scarlet]6568[] 포트를 사용합니다.\n[LIGHY_GRAY]같은 Wi-Fi 또는 로컬 네트워크[] 에서 서버 목록을 볼 수 있습니다.\n\n만약 플레이어들이 이 IP를 통해 어디에서나 연결할 수 있게 하고 싶다면, 공유기 설정에서 [accent]포트 포워딩[]을 해야 합니다.\n\n[LIGHT_GRAY]참고:LAN 게임 연결에 문제가 있는 사람이 있다면, 방화벽 설정에서 Mindustry 가 로컬 네트워크에 액세스하도록 허용했는지 확인 해 주세요. text.host.info=[accent]호스트[] 버튼은 현재 네트워크의 [scarlet]6567[] 과 [scarlet]6568[] 포트를 사용합니다.\n[LIGHY_GRAY]같은 Wi-Fi 또는 로컬 네트워크[] 에서 서버 목록을 볼 수 있습니다.\n\n만약 플레이어들이 이 IP를 통해 어디에서나 연결할 수 있게 하고 싶다면, 공유기 설정에서 [accent]포트 포워딩[]을 해야 합니다.\n\n[LIGHT_GRAY]참고 : LAN 게임 연결에 문제가 있는 사람이 있다면, 방화벽 설정에서 Mindustry 가 로컬 네트워크에 액세스하도록 허용했는지 확인 해 주세요.
text.join.info=여기서 [accent]서버 IP[]를 입력하여 다른 서버에 접속할 수 있습니다.\n또는 [accent]로컬 네트워크(LAN)[] 서버를 검색하여 접속할 수 있습니다.\nLAN 및 WAN 멀티 플레이어 모두 지원됩니다.\n\n[LIGHT_GRAY]참고:여기에서는 자동으로 글로벌 서버를 추가하지 않습니다. IP로 다른 사람의 서버에 접속할려면 서버장에게 IP를 요청해야 합니다. text.join.info=여기서 [accent]서버 IP[]를 입력하여 다른 서버에 접속할 수 있습니다.\n또는 [accent]로컬 네트워크(LAN)[] 서버를 검색하여 접속할 수 있습니다.\nLAN 및 WAN 멀티 플레이어 모두 지원됩니다.\n\n[LIGHT_GRAY]참고:여기에서는 자동으로 글로벌 서버를 추가하지 않습니다. IP로 다른 사람의 서버에 접속할려면 서버장에게 IP를 요청해야 합니다.
text.hostserver=서버 열기 text.hostserver=서버 열기
text.host=호스트 text.host=호스트
@@ -57,75 +57,75 @@ text.hosts.discovering=LAN 게임 찾기
text.server.refreshing=서버 목록 새로고치는중... text.server.refreshing=서버 목록 새로고치는중...
text.hosts.none=[lightgray]LAN 게임을 찾을 수 없습니다! text.hosts.none=[lightgray]LAN 게임을 찾을 수 없습니다!
text.host.invalid=[scarlet]서버에 연결할 수 없습니다! text.host.invalid=[scarlet]서버에 연결할 수 없습니다!
text.trace=플레이어 추적 text.trace=플레이어 정보 보기
text.trace.playername=이름:[accent]{0} text.trace.playername=이름 : [accent]{0}
text.trace.ip=IP:[accent]{0} text.trace.ip=IP : [accent]{0}
text.trace.id=고유 ID:[accent]{0} text.trace.id=고유 ID : [accent]{0}
text.trace.android=Android 클라이언트:[accent]{0} text.trace.android=Android 클라이언트 : [accent]{0}
text.trace.modclient=수정된 클라이언트:[accent]{0} text.trace.modclient=수정된 클라이언트 : [accent]{0}
text.trace.totalblocksbroken=총 블 파괴 개수:[accent]{0} text.trace.totalblocksbroken=총 블 파괴 개수 : [accent]{0}
text.trace.structureblocksbroken=구조 블 파괴 수:[accent]{0} text.trace.structureblocksbroken=구조 블 파괴 수 : [accent]{0}
text.trace.lastblockbroken=마지막으로 파괴한 블럭:[accent]{0} text.trace.lastblockbroken=마지막으로 파괴한 블록 : [accent]{0}
text.trace.totalblocksplaced=총 설치한 블 개수:[accent]{0} text.trace.totalblocksplaced=총 설치한 블 개수 : [accent]{0}
text.trace.lastblockplaced=마지막으로 설치한 블록:[accent]{0} text.trace.lastblockplaced=마지막으로 설치한 블록 : [accent]{0}
text.invalidid=잘못된 클라이언트 ID 입니다! 공식 Mindustry Discord 으로 버그 보고서를 제출 해 주세요. text.invalidid=잘못된 클라이언트 ID 입니다! 공식 Mindustry Discord 으로 버그 보고서를 제출 해 주세요.
text.server.bans=차단된 유저 text.server.bans=차단된 유저
text.server.bans.none=차단된 플레이어가 없습니다. text.server.bans.none=차단된 플레이어가 없습니다.
text.server.admins=관리 text.server.admins=
text.server.admins.none=관리자가 없습니다! text.server.admins.none=자가 없습니다!
text.server.add=서버 추가 text.server.add=서버 추가
text.server.delete=이 서버를 삭제 하시겠습니까? text.server.delete=이 서버를 삭제 하시겠습니까?
text.server.hostname=호스트:{0} text.server.hostname=호스트 : {0}
text.server.edit=서버 수정 text.server.edit=서버 수정
text.server.outdated=[crimson]서버 버전이 낮습니다![] text.server.outdated=[crimson]서버 버전이 낮습니다![]
text.server.outdated.client=[Crimson]클라이언트 버전이 낮습니다![] text.server.outdated.client=[Crimson]클라이언트 버전이 낮습니다![]
text.server.version=[lightgray]서버 버전:{0} text.server.version=[lightgray]서버 버전 : {0}
text.server.custombuild=[yellow]커스텀 서버 text.server.custombuild=[yellow]커스텀 서버
text.confirmban=이 플레이어를 차단하시겠습니까? text.confirmban=이 플레이어를 차단하시겠습니까?
text.confirmunban=이 플레이어를 차단하시겠습니까? text.confirmunban=이 플레이어를 차단해제 하시겠습니까?
text.confirmadmin=이 플레이어를 관리자로 설정 하시겠습니까? text.confirmadmin=이 플레이어를 자로 만들겠습니까?
text.confirmunadmin=이 플레이어의 관리자 상태를 해제하시겠습니까? text.confirmunadmin=이 플레이어를 일반 유저로 만들겠습니까?
text.joingame.title=게임 참가 text.joingame.title=게임 참가
text.joingame.ip=IP: text.joingame.ip=IP :
text.disconnect=서버와 연결이 해제되었습니다. text.disconnect=서버와 연결이 해제되었습니다.
text.disconnect.data=맵 데이터를 받아오는데 실패했습니다. text.disconnect.data=맵 데이터를 받아오는데 실패했습니다.
text.connecting=[accent]연결중... text.connecting=[accent]연결중...
text.connecting.data=[accent]맵 데이터 다운로드중... text.connecting.data=[accent]맵 데이터 다운로드중...
text.connectfail=[crimson]{0}[orange] 서버에 연결하지 못했습니다.[] text.connectfail=[crimson]{0}[orange] 서버에 연결하지 못했습니다.[]
text.server.port=포트: text.server.port=포트 :
text.server.addressinuse=이 주소는 이미 사용중입니다! text.server.addressinuse=이 주소는 이미 사용중입니다!
text.server.invalidport=포트 번호가 잘못되었습니다. text.server.invalidport=포트 번호가 잘못되었습니다.
text.server.error=[crimson]{0}[orange]서버를 여는데 오류가 발생했습니다.[] text.server.error=[crimson]{0}[orange]서버를 여는데 오류가 발생했습니다.[]
text.save.new=새로 저장\n text.save.new=새로 저장
text.save.overwrite=이 저장 슬롯을 덮어씌우겠습니까?\n text.save.overwrite=이 저장 슬롯을 덮어씌우겠습니까?
text.overwrite=덮어쓰기\n text.overwrite=덮어쓰기
text.save.none=저장 파일을 찾지 못했습니다!\n text.save.none=저장 파일을 찾지 못했습니다!
text.saveload=[accent]저장중...\n text.saveload=[accent]저장중...
text.savefail=게임을 저장하지 못했습니다!\n text.savefail=게임을 저장하지 못했습니다!
text.save.delete.confirm=이 저장파일을 삭제 하시겠습니까?\n text.save.delete.confirm=이 저장파일을 삭제 하시겠습니까?
text.save.delete=삭제\n text.save.delete=삭제
text.save.export=저장파일 내보내기\n text.save.export=저장파일 내보내기
text.save.import.invalid=[orange]저장 상태가 정상이 아닙니다! text.save.import.invalid=[orange]파일이 잘못되었습니다!
text.save.import.fail=[crimson]저장파일을 불러오지 못함:[orange]{0}\n text.save.import.fail=[crimson]저장파일을 불러오지 못함 : [orange]{0}
text.save.export.fail=[crimson]저장파일을 내보내지 못함:[orange]{0} text.save.export.fail=[crimson]저장파일을 내보내지 못함 : [orange]{0}
text.save.import=저장파일 불러오기\n text.save.import=저장파일 불러오기
text.save.newslot=저장 파일이름 :\n text.save.newslot=저장 파일이름 :
text.save.rename=이름 변경\n text.save.rename=이름 변경
text.save.rename.text=새 이름 :\n text.save.rename.text=새 이름 :
text.selectslot=저장슬롯을 선택하십시오.\n text.selectslot=저장슬롯을 선택하십시오.
text.slot=[accent]{0}번째 슬롯\n text.slot=[accent]{0}번째 슬롯
text.save.corrupted=[orange]세이브 파일이 손상되었거나 잘못된 파일입니다!만약 게임을 업데이트 했다면 이것은 아마 저장 형식 변경일 것이고, 이것은 버그가 [scarlet]아닙니다[].\n\n text.save.corrupted=[orange]세이브 파일이 손상되었거나 잘못된 파일입니다! 만약 게임을 업데이트 했다면 이것은 아마 저장 형식 변경일 것이고, 이것은 버그가 [scarlet]아닙니다[].
text.empty=<비어있음>\n text.empty=<비어있음>
text.on=켜기\n text.on=켜기
text.off=끄기\n text.off=끄기
text.save.autosave=자동저장:{0} text.save.autosave=자동저장 : {0}
text.save.map=:{0} text.save.map= : {0}
text.save.wave={0}단계 text.save.wave={0}단계[]
text.save.difficulty=난이도:{0} text.save.difficulty=난이도 : {0}
text.save.date=마지막 저장 날짜:{0} text.save.date=마지막 저장날짜 : {0}
text.confirm=확인 text.confirm=확인
text.delete=삭제\n text.delete=삭제
text.ok= text.ok=
text.open=열기 text.open=열기
text.cancel=취소 text.cancel=취소
text.openlink=링크 열기 text.openlink=링크 열기
@@ -140,10 +140,10 @@ text.changelog.error=[scarlet]게임 변경사항을 가져오는 중 오류가
text.changelog.current=[orange][[현재 버전] text.changelog.current=[orange][[현재 버전]
text.changelog.latest=[orange][[최신 버전] text.changelog.latest=[orange][[최신 버전]
text.loading=[accent]불러오는중... text.loading=[accent]불러오는중...
text.saving=[accent]저장중...\n text.saving=[accent]저장중...
text.wave=[orange]{0}단계 text.wave=[orange]{0}단계
text.wave.waiting=다음 단계 시작까지 {0}초 text.wave.waiting=다음 단계 시작까지 {0}초
text.waiting=대기중... text.waiting=[LIGHT_GRAY]대기중...
text.loadimage=사진 불러오기 text.loadimage=사진 불러오기
text.saveimage=사진 저장 text.saveimage=사진 저장
text.unknown=알 수 없음 text.unknown=알 수 없음
@@ -151,18 +151,18 @@ text.custom=커스텀
text.builtin=내장 text.builtin=내장
text.map.delete.confirm=이 맵을 삭제하시겠습니까? 이 명령은 취소할 수 없습니다! text.map.delete.confirm=이 맵을 삭제하시겠습니까? 이 명령은 취소할 수 없습니다!
text.map.random=[accent]랜덤 맵 text.map.random=[accent]랜덤 맵
text.map.nospawn=이 맵에 플레이어가 스폰 할 코어가 없습니다! 맵 편집기에서 [ROYAL]파란색[]코어를 맵에 추가하세요. text.map.nospawn=이 맵에 플레이어가 스폰 할 코어가 없습니다! 맵 편집기에서 [ROYAL]파란색[]코어를 맵에 추가하세요.
text.editor.slope=\\ text.editor.slope=\\
text.editor.openin=편집기 열기 text.editor.openin=편집기 열기
text.editor.oregen=광물 무작위 생성 text.editor.oregen=광물 무작위 생성
text.editor.oregen.info=광물 무작위 생성: text.editor.oregen.info=광물 무작위 생성 :
text.editor.mapinfo=맵 정보 text.editor.mapinfo=맵 정보
text.editor.author=만든이: text.editor.author=만든이 :
text.editor.description=설명: text.editor.description=설명 :
text.editor.name=이름: text.editor.name=이름 :
text.editor.teams= text.editor.teams=
text.editor.elevation=높이 text.editor.elevation=높이
text.editor.badsize=[orange]사진 크기가 잘못되었습니다![]유효한 맵 크기:{0} text.editor.badsize=[orange]사진 크기가 잘못되었습니다![] 유효한 맵 크기 : {0}
text.editor.errorimageload=[orange]{0}[] 파일을 불러오는데 오류가 발생했습니다. text.editor.errorimageload=[orange]{0}[] 파일을 불러오는데 오류가 발생했습니다.
text.editor.errorimagesave=[orange]{0}[] 파일 저장중 오류가 발생했습니다. text.editor.errorimagesave=[orange]{0}[] 파일 저장중 오류가 발생했습니다.
text.editor.generate=생성 text.editor.generate=생성
@@ -172,7 +172,7 @@ text.editor.savemap=맵 저장
text.editor.saved=저장됨! text.editor.saved=저장됨!
text.editor.save.noname=지도에 이름이 없습니다! '맵 정보' 메뉴에서 설정하세요. text.editor.save.noname=지도에 이름이 없습니다! '맵 정보' 메뉴에서 설정하세요.
text.editor.save.overwrite=이 맵의 이름은 기존에 있던 맵을 덮어씁니다! '맵 정보' 메뉴에서 다른 이름을 선택하세요. text.editor.save.overwrite=이 맵의 이름은 기존에 있던 맵을 덮어씁니다! '맵 정보' 메뉴에서 다른 이름을 선택하세요.
text.editor.import.exists=[scarlet]맵을 불러올 수 없음:[] 기존에 있던 '{0}' 맵이 이미 존재합니다! text.editor.import.exists=[scarlet]맵을 불러올 수 없음 : [] 기존에 있던 '{0}' 맵이 이미 존재합니다!
text.editor.import=가져오기 text.editor.import=가져오기
text.editor.importmap=맵 가져오기 text.editor.importmap=맵 가져오기
text.editor.importmap.description=이미 존재하는 맵 가져오기 text.editor.importmap.description=이미 존재하는 맵 가져오기
@@ -187,22 +187,22 @@ text.editor.exportimage=지형 이미지 내보내기
text.editor.exportimage.description=맵 이미지 파일 내보내기 text.editor.exportimage.description=맵 이미지 파일 내보내기
text.editor.loadimage=지형 가져오기 text.editor.loadimage=지형 가져오기
text.editor.saveimage=지형 내보내기 text.editor.saveimage=지형 내보내기
text.editor.unsaved=[scarlet]변경사항을 저장하지 않았습니다![]\n정말로 나가시겠습니까?\n text.editor.unsaved=[scarlet]변경사항을 저장하지 않았습니다![]\n정말로 나가시겠습니까?
text.editor.resizemap=맵 크기 조정 text.editor.resizemap=맵 크기 조정
text.editor.mapname=맵 이름: text.editor.mapname=맵 이름 :
text.editor.overwrite=[accept]경고!이 명령은 기존 맵을 덮어씌우게 됩니다.\n text.editor.overwrite=[accept]경고!이 명령은 기존 맵을 덮어씌우게 됩니다.
text.editor.overwrite.confirm=[scarlet]경고![] 이 이름을 가진 맵이 이미 있습니다. 덮어 쓰시겠습니까? text.editor.overwrite.confirm=[scarlet]경고![] 이 이름을 가진 맵이 이미 있습니다. 덮어 쓰시겠습니까?
text.editor.selectmap=불러올 맵 선택: text.editor.selectmap=불러올 맵 선택 :
text.width=넓이: text.width=넓이 :
text.height=높이: text.height=높이 :
text.menu=메뉴 text.menu=메뉴
text.play=플레이 text.play=플레이
text.load=불러오기 text.load=불러오기
text.save=저장 text.save=저장
text.fps={0}FPS text.fps={0}FPS
text.tps={0}TPS text.tps={0}TPS
text.ping={0}ms text.ping=ping : {0}ms
text.language.restart=언어를 변경하려면 게임을 다시 시작 해 주세요. text.language.restart=언어를 변경하려면 게임을 다시시작 해 주세요.
text.settings.language=언어 text.settings.language=언어
text.settings=설정 text.settings=설정
text.tutorial=게임 방법 text.tutorial=게임 방법
@@ -264,11 +264,9 @@ text.unit.powersecond=전력/초
text.unit.liquidsecond=액체/초 text.unit.liquidsecond=액체/초
text.unit.itemssecond=개/초 text.unit.itemssecond=개/초
text.unit.pixelssecond=초당 픽셀 text.unit.pixelssecond=초당 픽셀
text.unit.liquidunits=
text.unit.powerunits=전력 text.unit.powerunits=전력
text.unit.degrees= text.unit.degrees=
text.unit.seconds= text.unit.seconds=
text.unit.none=
text.unit.items=아이템 text.unit.items=아이템
text.category.general=일반 text.category.general=일반
text.category.power=전력 text.category.power=전력
@@ -279,8 +277,8 @@ text.category.shooting=사격
setting.difficulty.easy=쉬움 setting.difficulty.easy=쉬움
setting.difficulty.normal=보통 setting.difficulty.normal=보통
setting.difficulty.hard=어려움 setting.difficulty.hard=어려움
setting.difficulty.insane=[#1E90FF]K[#ADFF2F]O[#FFB6C1]R[#B0C4DE]E[#FF4500]A setting.difficulty.insane=이걸 할수있을까?
setting.difficulty.name=난이도: setting.difficulty.name=난이도 :
setting.screenshake.name=화면 흔들기 setting.screenshake.name=화면 흔들기
setting.indicators.name=적 위치 표시 화살표 setting.indicators.name=적 위치 표시 화살표
setting.effects.name=화면 효과 setting.effects.name=화면 효과
@@ -351,13 +349,13 @@ liquid.water.name=물
liquid.lava.name=용암 liquid.lava.name=용암
liquid.oil.name=석유 liquid.oil.name=석유
liquid.cryofluid.name=냉각수 liquid.cryofluid.name=냉각수
text.item.explosiveness=[LIGHT_GRAY]폭발력:{0} text.item.explosiveness=[LIGHT_GRAY]폭발력 : {0}
text.item.flammability=[LIGHT_GRAY]인화성:{0} text.item.flammability=[LIGHT_GRAY]인화성 : {0}
text.item.radioactivity=[LIGHT_GRAY]방사능:{0} text.item.radioactivity=[LIGHT_GRAY]방사능 : {0}
text.item.fluxiness=[LIGHT_GRAY]플렉스 파워:{0} text.item.fluxiness=[LIGHT_GRAY]플렉스 파워 : {0}
text.liquid.heatcapacity=[LIGHT_GRAY]발열량:{0} text.liquid.heatcapacity=[LIGHT_GRAY]발열량 : {0}
text.liquid.viscosity=[LIGHT_GRAY]점도:{0} text.liquid.viscosity=[LIGHT_GRAY]점도 : {0}
text.liquid.temperature=[LIGHT_GRAY]온도:{0} text.liquid.temperature=[LIGHT_GRAY]온도 : {0}
block.deepwater.name=깊은물 block.deepwater.name=깊은물
block.water.name= block.water.name=
block.lava.name=용암 block.lava.name=용암
@@ -393,7 +391,7 @@ block.sorter.description=아이템을 넣어서 필터에 설정된 아이템일
block.overflow-gate.name=오버플로 게이트 block.overflow-gate.name=오버플로 게이트
block.overflow-gate.description=정면 경로가 차단된 경우 왼쪽과 오른쪽으로만 출력하는 복합 분배기입니다. block.overflow-gate.description=정면 경로가 차단된 경우 왼쪽과 오른쪽으로만 출력하는 복합 분배기입니다.
block.bridgeconveyor.name=터널 block.bridgeconveyor.name=터널
block.bridgeconveyor.description=최대 2블록을 건너 뛰고 자원을 운반하게 해 주는 블. block.bridgeconveyor.description=최대 2블록을 건너 뛰고 자원을 운반하게 해 주는 블.
block.smelter.name=제련소 block.smelter.name=제련소
block.arc-smelter.name=대형 제련소 block.arc-smelter.name=대형 제련소
block.silicon-smelter.name=실리콘 제련소 block.silicon-smelter.name=실리콘 제련소
@@ -448,41 +446,42 @@ block.rotary-pump.name=동력 펌프
text.save.old=이 저장파일은 이전 버전의 게임용이며, 지금은 사용할 수 없습니다. \n\n[LIGHT_GRAY]4.0 정식때 이전 게임버전에서 만든 저장파일과 호환됩니다. text.save.old=이 저장파일은 이전 버전의 게임용이며, 지금은 사용할 수 없습니다. \n\n[LIGHT_GRAY]4.0 정식때 이전 게임버전에서 만든 저장파일과 호환됩니다.
text.customgame=커스텀 게임 text.customgame=커스텀 게임
text.sectors=구역 text.sectors=구역
text.sector=선택된 구역:[LIGHT_GRAY]{0} text.sector=선택된 구역 : [LIGHT_GRAY]{0}
text.sector.time=시간:[LIGHT_GRAY]{0} text.sector.time=시간 : [LIGHT_GRAY]{0}
text.sector.deploy=배치 text.sector.deploy=시작
text.sector.resume=계속하기 text.sector.resume=계속하기
text.sector.locked=[scarlet][[완료안됨] text.sector.locked=[scarlet][[완료안됨]
text.sector.unexplored=[accent][[탐색안됨] text.sector.unexplored=[accent][[탐색안됨]
text.close=닫기 text.close=닫기
text.save.playtime=플레이시간:{0} text.save.playtime=플레이시간 : {0}
text.editor.brush=브러쉬 text.editor.brush=브러쉬
text.credits.text=Created by [ROYAL]Anuken[] - [SKY]anukendev@gmail.com[]\n\n[GRAY](In case you can't tell, this text is currently unfinished.\nTranslators, don't edit it yet!) text.credits.text=Created by [ROYAL]Anuken[] - [SKY]anukendev@gmail.com[]\n\n[GRAY](In case you can't tell, this text is currently unfinished.\nTranslators, don't edit it yet!)
text.sector.gameover=이 구역을 공략하는데 실패했습니다. 다시 배치하시겠습니까? text.sector.gameover=이 구역을 공략하는데 실패했습니다. 다시 배치하시겠습니까?
text.sector.retry=다시할 text.sector.retry=다시할
text.wave.lasted=[accent]{0}[] 까지 버티셨습니다. text.wave.lasted=[accent]{0}[] 까지 버티셨습니다.
setting.fpscap.name=최대 FPS setting.fpscap.name=최대 FPS
setting.fpscap.none=없음 setting.fpscap.none=없음
setting.fpscap.text={0} FPS setting.fpscap.text={0} FPS
block.command-center.name=명령 본부 block.command-center.name=명령 본부
text.mission=목표:[LIGHT_GRAY] {0}
text.mission=목표 : [LIGHT_GRAY] {0}
text.mission.wave=[accent]{0}[]단계가 될때까지 생존하세요. text.mission.wave=[accent]{0}[]단계가 될때까지 생존하세요.
text.mission.battle=적 본부를 파괴하세요. text.mission.battle=적 본부를 파괴하세요.
text.none=<없음> text.none=<없음>
text.sector.corrupted=[orange]저장 파일에서 구역을 발견했으나 불러오지 못했습니다.\n새로 생성되었습니다. text.sector.corrupted=[orange]저장 파일에서 구역을 발견했으나 불러오지 못했습니다.\n새로 생성되었습니다.
text.mission.complete=미션 성공! text.mission.complete=미션 성공!
text.mission.complete.body=구역 {0},{1} 탐색 성공. text.mission.complete.body=구역 {0},{1} 탐색 성공.
text.mission.resource=Obtain {0}:\n[accent]{1}/{2}[] text.mission.resource={0} 자원을 {1}개 모으세요.
text.unit.health=[LIGHT_GRAY]체력:{0} text.unit.health=[LIGHT_GRAY]체력 : {0}
text.unit.speed=[LIGHT_GRAY]속도:{0} text.unit.speed=[LIGHT_GRAY]속도 : {0}
block.mass-driver.name=물질 이동기 block.mass-driver.name=물질 이동기
block.blast-drill.name=고속 발열 드릴 block.blast-drill.name=고속 발열 드릴
unit.drone.description=초기형 드론 유닛입니다. 기본적으로 코어에서 1대를 스폰합니다. 자동으로 아이템을 수집/채광하며 블럭들을 수리합니다.
unit.fabricator.description=고급 드론 유닛입니다. 자동으로 아이템과 수집/채광/블록들을 수리하며, 일반 드론보다 더 빠르게 작업할 수 있습니다.
unit.titan.name=타이탄 unit.titan.name=타이탄
unit.titan.description=고급 지상 유닛입니다. 합금을 탄약으로 사용하며 지상과 공중 둘다 공격할 수 있습니다. unit.titan.description=고급 지상 유닛입니다. 합금을 탄약으로 사용하며 지상과 공중 둘다 공격할 수 있습니다.
unit.monsoon.description=자폭 유닛입니다. 폭발 화합물 또는 피러레이트를 탄약으로 사용합니다.
unit.interceptor.description=빠르고, 공격하고 튀는 방식을 사용합니다. 납을 탄약으로 사용합니다.
unit.dagger.name=디거 unit.dagger.name=디거
unit.dagger.description=기본 지상 유닛입니다. 스웜과 같이 쓰면 유용합니다. unit.dagger.description=기본 지상 유닛입니다. 스웜과 같이 쓰면 유용합니다.
block.thermal-pump.name=지열 펌프 block.thermal-pump.name=지열 펌프
@@ -504,50 +503,55 @@ keybind.chat_history_next.name=다음 채팅기록
keybind.chat_scroll.name=채팅 스크롤 keybind.chat_scroll.name=채팅 스크롤
keybind.drop_unit.name=유닛 드롭 keybind.drop_unit.name=유닛 드롭
keybind.zoom_minimap.name=미니맵 확대 keybind.zoom_minimap.name=미니맵 확대
content.mech.name=Mechs content.mech.name=기체
item.copper.name=Copper
item.copper.description=A useful structure material. Used extensively in all types of blocks. item.copper.name=구리
item.dense-alloy.name=Dense Alloy item.copper.description=기본 블록 재료입니다. 모든 유형의 블록에서 광범위하게 사용됩니다.
item.dense-alloy.description=A tough alloy made with lead and copper. Used in advanced transportation blocks and high-tier drills. item.dense-alloy.name=합금
mech.alpha-mech.name=Alpha item.dense-alloy.description=납과 구리로 만든 튼튼한 합금. 고급 수송 블록이나 상위 티어 블록을 건설하는데 사용됩니다.
mech.alpha-mech.name=알파
mech.alpha-mech.weapon=Heavy Repeater mech.alpha-mech.weapon=Heavy Repeater
mech.alpha-mech.ability=Drone Swarm mech.alpha-mech.ability=Drone Swarm
mech.alpha-mech.description=The standard mech. Has decent speed and damage output; can create up to 3 drones for increased offensive capability. mech.alpha-mech.description=표준 기체. 적절한 속도와 공격력을 갖추고 있으며, 공격 능력을 높이기 위해 최대 3대의 드론을 만들 수 있습니다.
mech.delta-mech.name=Delta mech.delta-mech.name=델타
mech.delta-mech.weapon=Arc Generator mech.delta-mech.weapon=Arc Generator
mech.delta-mech.ability=Discharge mech.delta-mech.ability=Discharge
mech.delta-mech.description=A fast, lightly-armored mech made for hit-and-run attacks. Does little damage against structures, but can kill large groups of enemy units very quickly with its arc lightning weapons. mech.delta-mech.description=치고 빠지는 공격을 위해 만든 빠르고 가벼운 기체. 구조물에는 거의 피해를 주지 않지만, 번개 무기를 사용하여 많은 적군을 매우 빠르게 죽일 수 있습니다.
mech.tau-mech.name=Tau mech.tau-mech.name=Tau
mech.tau-mech.weapon=Restruct Laser mech.tau-mech.weapon=Restruct Laser
mech.tau-mech.ability=Repair Burst mech.tau-mech.ability=Repair Burst
mech.tau-mech.description=The support mech. Heals allied blocks by shooting at them. Can extinguish fires and heal allies in a radius with its repair ability. mech.tau-mech.description=지원형 기체. 총을 발사하여 건물을 치료하고 회복 능력 사용으로 화재를 진압하거나 반경 내 아군을 치유시킵니다.
mech.omega-mech.name=Omega mech.omega-mech.name=오메가
mech.omega-mech.weapon=Swarm Missiles mech.omega-mech.weapon=Swarm Missiles
mech.omega-mech.ability=Armored Configuration mech.omega-mech.ability=Armored Configuration
mech.omega-mech.description=A bulky and well-armored mech, made for front-line assaults. Its armor ability can block up to 90% of incoming damage. mech.omega-mech.description=전방 공격용으로 만든 부피가 크고 튼튼한 기체. 방어 능력은 최대 90%의 피해를 흡수할 수 있습니다.
mech.dart-ship.name=Dart mech.dart-ship.name=Dart
mech.dart-ship.weapon=Repeater mech.dart-ship.weapon=Repeater
mech.dart-ship.description=The standard ship. Reasonably fast and light, but has little offensive capability and low mining speed. mech.dart-ship.description=표준 비행선. 빠르고 가볍지만 공격력이 거의 없고 채광 속도가 느립니다.
mech.javelin-ship.name=Javelin mech.javelin-ship.name=Javelin
mech.javelin-ship.description=A hit-and-run strike ship. While initially slow, it can accelerate to great speeds and fly by enemy outposts, dealing large amounts of damage with its lightning ability and missiles. mech.javelin-ship.description=치고 빠지는 공격을 위한 비행선. 처음에는 느리지만, 가속도가 붙어 엄청난 속도로 미사일 피해를 입힐 수 있으며, 번개 능력을 사용할 수 있습니다.
mech.javelin-ship.weapon=Burst Missiles mech.javelin-ship.weapon=Burst Missiles
mech.javelin-ship.ability=Discharge Booster mech.javelin-ship.ability=Discharge Booster
mech.trident-ship.name=Trident mech.trident-ship.name=Trident
mech.trident-ship.description=A heavy bomber. Reasonably well armored. mech.trident-ship.description=대형 공중 폭격기. 당연하게도 엄청 단단합니다.
mech.trident-ship.weapon=Bomb Bay mech.trident-ship.weapon=Bomb Bay
mech.glaive-ship.name=Glaive mech.glaive-ship.name=Glaive
mech.glaive-ship.description=A large, well-armored gunship. Equipped with an incendiary repeater. Good acceleration and maximum speed. mech.glaive-ship.description=크고 잘 무장된 총을 가진 비행선. 방화용 리피터가 장착되어 있으며, 가속도와 최대속도가 높습니다.
mech.glaive-ship.weapon=Flame Repeater mech.glaive-ship.weapon=Flame Repeater
text.mech.weapon=[LIGHT_GRAY]Weapon: {0}
text.mech.armor=[LIGHT_GRAY]Armor: {0} text.mech.weapon=[LIGHT_GRAY]무기 : {0}
text.mech.itemcapacity=[LIGHT_GRAY]Item Capacity: {0} text.mech.armor=[LIGHT_GRAY]방어 : {0}
text.mech.minespeed=[LIGHT_GRAY]Mining Speed: {0} text.mech.itemcapacity=[LIGHT_GRAY]아이템 수용 용량 : {0}
text.mech.minepower=[LIGHT_GRAY]Mining Power: {0} text.mech.minespeed=[LIGHT_GRAY]채광 속도 : {0}
text.mech.ability=[LIGHT_GRAY]Ability: {0} text.mech.minepower=[LIGHT_GRAY]채광 레벨 : {0}
block.core.name=Core text.mech.ability=[LIGHT_GRAY]능력 : {0}
block.core.name=코어
block.metalfloor.name=Metal Floor block.metalfloor.name=Metal Floor
block.copper-wall.name=Copper Wall block.copper-wall.name=구리벽
block.copper-wall-large.name=Large Copper Wall block.copper-wall-large.name=큰 구리벽
block.phase-wall.name=Phase Wall block.phase-wall.name=Phase Wall
block.phase-wall-large.name=Large Phase Wall block.phase-wall-large.name=Large Phase Wall
block.mechanical-drill.name=Mechanical Drill block.mechanical-drill.name=Mechanical Drill
@@ -556,80 +560,85 @@ block.thorium-reactor.name=Thorium Reactor
block.alloy-smelter.name=Alloy Smtler block.alloy-smelter.name=Alloy Smtler
block.mend-projector.name=Mend Projector block.mend-projector.name=Mend Projector
unit.alpha-drone.name=Alpha Drone unit.alpha-drone.name=Alpha Drone
text.construction.desktop=Desktop controls have been changed.\nTo deselect a block or stop building, [accent]use space[]. text.construction.desktop=PC 에서의 조작 방법이 변경되었습니다.\n블록 선택을 해제하거나 건설을 중지하려면 [accent]스페이스 바[]를 누르세요.
keybind.press=Press a key... keybind.press=키를 누르세요...
keybind.press.axis=Press an axis or key... keybind.press.axis=축 또는 키를 누르세요...
keybind.deselect.name=Deselect keybind.deselect.name=선택해제
block.surge-wall.name=Surge Wall block.surge-wall.name=Surge Wall
block.surge-wall-large.name=Large Surge Wall block.surge-wall-large.name=Large Surge Wall
block.cyclone.name=Cyclone block.cyclone.name=사이클론
block.fuse.name=Fuse block.fuse.name=퓨즈
text.confirmkick=Are you sure you want to kick this player? text.confirmkick=정말로 이 플레이어를 추방시키겠습니까?
text.settings.cleardata=Clear Game Data... text.settings.cleardata=게임 데이터 초기화...
text.settings.clear.confirm=Are you sure you want to clear this data?\nWhat is done cannot be undone! text.settings.clear.confirm=정말로 초기화 하겠습니까?\n이 작업을 되돌릴 수 없습니다!
text.settings.clearall.confirm=[scarlet]WARNING![]\nThis will clear all data, including saves, maps, unlocks and keybinds.\nOnce you press 'ok' the game will wipe all data and automatically exit. text.settings.clearall.confirm=[scarlet]경고![]\n이 작업은 저장된 맵, 맵파일, 잠금 해제된 목록과 키 매핑, 그리고 모든 데이터를 삭제합니다.\n확인 버튼을 다시 눌러 모든 데이터를 삭제하고 게임에서 나갑니다.
text.settings.clearsectors=Clear Sectors text.settings.clearsectors=구역 초기화
text.settings.clearunlocks=Clear Unlocks text.settings.clearunlocks=잠금 해제 초기화
text.settings.clearall=Clear All text.settings.clearall=모두 초기화
block.shock-mine.name=Shock Mine block.shock-mine.name=Shock Mine
block.overdrive-projector.name=Overdrive Projector block.overdrive-projector.name=Overdrive Projector
text.blocks.powerdamage=Power/Damage text.blocks.powerdamage=전력/데미지
mode.custom.warning=Note that blocks cannot be used in custom games until they are unlocked in sectors.\n\n[LIGHT_GRAY]If you have not unlocked any blocks, none will appear. mode.custom.warning=[scarlet]서버에서 잠금해제한 블록은 저장되지 않습니다.[]\n\n구역을 플레이 하여 잠금해제하세요.
content.unit.name=Units content.unit.name=유닛
block.force-projector.name=Force Projector block.force-projector.name=Force Projector
block.arc.name=Arc block.arc.name=Arc
block.rtg-generator.name=RTG Generator block.rtg-generator.name=RTG Generator
block.spectre.name=Spectre block.spectre.name=Spectre
block.meltdown.name=Meltdown block.meltdown.name=Meltdown
text.mission.info=Mission Info
text.mission.wave.enemies=Survive[accent] {0}/{1} []waves\n{2} Enemies text.mission.info=미션 정보
text.mission.wave.enemy=Survive[accent] {0}/{1} []waves\n{2} Enemy text.mission.wave.enemies=[accent] {0}/{1} []단계동안 생존하세요.\n{2}마리 남음
text.mission.wave.menu=Survive[accent] {0} []waves text.mission.wave.enemy=[accent] {0}/{1} []단계동안 생존하세요.\n{2}마리 남음
text.mission.resource.menu=Obtain {0} x{1} text.mission.wave.menu=[accent] {0} []단계
text.mission.block=Create {0} text.mission.resource.menu={0} {1}개 수집
text.mission.unit=Create {0} Unit text.mission.block={0}를 만드세요.
text.mission.linknode=Link Power Node text.mission.unit={0}유닛을 만드세요.
text.mission.display=[accent]Mission:\n[LIGHT_GRAY]{0} text.mission.linknode=전력 노드를 연결하세요.
text.hostserver.mobile=Host\nGame text.mission.display=[accent]미션 : \n[LIGHT_GRAY]{0}
setting.difficulty.training=training text.hostserver.mobile=게임\n호스트
block.dense-alloy-wall.name=Dense Alloy Wall
block.dense-alloy-wall-large.name=Large Dense Alloy Wall setting.difficulty.training=훈련
block.dart-ship-pad.name=Dart Ship Pad
block.delta-mech-pad.name=Delta Mech Pad block.dense-alloy-wall.name=합금 벽
block.javelin-ship-pad.name=Javelin Ship Pad block.dense-alloy-wall-large.name=큰 합금 벽
block.trident-ship-pad.name=Trident Ship Pad block.dart-ship-pad.name=다트 비행선 패드
block.glaive-ship-pad.name=Glaive Ship Pad block.delta-mech-pad.name=델타 기체 패드
block.omega-mech-pad.name=Omega Mech Pad block.javelin-ship-pad.name=자바린 비행선 패드
block.tau-mech-pad.name=Tau Mech Pad block.trident-ship-pad.name=삼지창 비행선 패드
block.spirit-factory.name=Spirit Drone Factory block.glaive-ship-pad.name=글레브 비행선 패드
block.phantom-factory.name=Phantom Drone Factory block.omega-mech-pad.name=오메가 기체 패드
block.tau-mech-pad.name=Tau 기체 패드
block.spirit-factory.name=Spirit 드론 공장
block.phantom-factory.name=팬텀 드론 공장
block.wraith-factory.name=Wraith Fighter Factory block.wraith-factory.name=Wraith Fighter Factory
block.ghoul-factory.name=Ghoul Bomber Factory block.ghoul-factory.name=Ghoul Bomber Factory
block.dagger-factory.name=Dagger Mech Factory block.dagger-factory.name=디거 기체 공장
block.titan-factory.name=Titan Mech Factory block.titan-factory.name=타이탄 기체 공장
block.revenant-factory.name=Revenant Fighter Factory block.revenant-factory.name=Revenant Fighter Factory
unit.spirit.name=Spirit Drone
unit.spirit.description=The starter drone unit. Spawns in the core by default. Automatically mines ores, collects items and repairs blocks. unit.spirit.name=스피릿 드론
unit.phantom.name=Phantom Drone unit.spirit.description=기본 드론 유닛. 기본적으로 코어에서 1개가 스폰됩니다. 자동으로 채광하며 아이템을 수집하고, 블록을 수리합니다.
unit.phantom.description=An advanced drone unit. Automatically mines ores, collects items and repairs blocks. Significantly more effective than a drone. unit.phantom.name=팬텀 드론
unit.phantom.description=첨단 드론 유닛. 광석을 자동으로 채광하며, 아이템을 수집하고 블록을 수리합니다. 일반 드론보다 훨씬 효과적입니다.
unit.ghoul.name=Ghoul Bomber unit.ghoul.name=Ghoul Bomber
unit.ghoul.description=A heavy carpet bomber. Uses blast compound or pyratite as ammo. unit.ghoul.description=A heavy carpet bomber. Uses blast compound or pyratite as ammo.
unit.wraith.name=Wraith Fighter unit.wraith.name=Wraith Fighter
unit.wraith.description=A fast, hit-and-run interceptor unit. unit.wraith.description=빠르고, 치고 빠지는 공격방식을 사용합니다.
unit.fortress.name=Fortress unit.fortress.name=Fortress
unit.fortress.description=A heavy artillery ground unit. unit.fortress.description=중포 지상 부대 유닛.
unit.revenant.name=Revenant unit.revenant.name=Revenant
unit.revenant.description=A heavy laser platform. unit.revenant.description=A heavy laser platform.
tutorial.begin=Your mission here is to eradicate the[LIGHT_GRAY] enemy[].\n\nBegin by[accent] mining copper[]. Tap a copper ore vein near your core to do this.
tutorial.drill=Mining manually is inefficient.\n[accent]Drills []can mine automatically.\nPlace one on a copper vein. tutorial.begin=플레이어의 임무는 [LIGHT_GRAY]적군[]을 제거하는 것입니다.\n\n[accent]구리를 채광[]하는 것으로 시작합니다. 이것을 하기 위해 플레이어의 중심부 근처에 있는 구리 광맥을 누르세요.
tutorial.conveyor=[accent]Conveyors[] are used to transport items to the core.\nMake a line of conveyors from the drill to the core. tutorial.drill=수동으로 채광하는 것은 비효율 적입니다.\n[accent]드릴[]은 자동으로 채광 작업을 합니다.\n구리 광맥에 표시된 영역에 드릴을 하나를 놓으세요.
tutorial.morecopper=More copper is required.\n\nEither mine it manually, or place more drills. tutorial.conveyor=[accent]컨베이어[]를 사용하여 아이템을 코어로 운반합니다.\n드릴에서 코어까지 컨베이어 라인을 만드세요.
tutorial.turret=Defensive structures must be built to repel the[LIGHT_GRAY] enemy[].\nBuild a duo turret near your base. tutorial.morecopper=더 많은 구리가 필요합니다.\n\n수동으로 채광하거나, 드릴을 더 설치하세요.
tutorial.drillturret=Duo turrets require[accent] copper ammo []to shoot.\nPlace a drill next to the turret to supply it with mined copper. tutorial.turret=방어 구조물은 [LIGHT_GRAY]적[]을 물리치기 위해 반드시 필요합니다.\n기지 근처에 듀오 터렛을 설치하세요.
tutorial.waves=The[LIGHT_GRAY] enemy[] approaches.\n\nDefend your core for 2 waves. Build more turrets. tutorial.drillturret=듀오 터렛이 작동하기 위해서는[accent] 구리 탄약 []을 필요로 합니다.\n터렛 옆에 드릴을 설치하여 구리를 공급하세요.
tutorial.lead=More ores are available. Explore and mine[accent] lead[].\n\nDrag from your unit to the core to transfer resources. tutorial.waves=[LIGHT_GRAY]적[]이 접근합니다.\n\n2단계 동안 코어를 보호하고 더 많은 터렛을 만드세요.
tutorial.smelter=Copper and lead are weak metals.\nSuperior[accent] Dense Alloy[] can be created in a smelter.\n\nBuild one. tutorial.lead=더 많은 광석을 이용할 수 있습니다. [accent]납[]을 찾아 탐색하세요.\n\n아이템을 코어로 전송할려면 플레이어 기체 또는 비행기에서 코어로 드래그 하세요.
tutorial.densealloy=The smelter will now produce alloy.\nGet some.\nImprove the production if necessary. tutorial.smelter=구리와 납은 약한 금속입니다.\n[accent]합금[]은 제련소에서 만들 수 있습니다.\n\n하나 만드세요.
tutorial.densealloy=이 제련소는 이제 합금을 생산할 것입니다.\n몇개 더 생산하세요.\n필요한 경우 더 만드세요.
tutorial.siliconsmelter=The core will now create a[accent] spirit drone[] for mining and repairing blocks.\n\nFactories for other units can be created with [accent] silicon.\nMake a silicon smelter. tutorial.siliconsmelter=The core will now create a[accent] spirit drone[] for mining and repairing blocks.\n\nFactories for other units can be created with [accent] silicon.\nMake a silicon smelter.
tutorial.silicondrill=Silicon requires[accent] coal[] and[accent] sand[].\nStart by making drills. tutorial.silicondrill=Silicon requires[accent] coal[] and[accent] sand[].\nStart by making drills.
tutorial.generator=This technology requires power.\nCreate a[accent] combustion generator[] for it. tutorial.generator=This technology requires power.\nCreate a[accent] combustion generator[] for it.
@@ -638,37 +647,41 @@ tutorial.node=Power requires transport.\nCreate a[accent] power node[] next to y
tutorial.nodelink=Power can be transferred through contacting power blocks and generators, or by linked power nodes.\n\nLink power by tapping the node and selecting the generator and silicon smelter. tutorial.nodelink=Power can be transferred through contacting power blocks and generators, or by linked power nodes.\n\nLink power by tapping the node and selecting the generator and silicon smelter.
tutorial.silicon=Silicon is being produced. Get some.\n\nImproving the production system is advised. tutorial.silicon=Silicon is being produced. Get some.\n\nImproving the production system is advised.
tutorial.daggerfactory=Construct a[accent] dagger mech factory.[]\n\nThis will be used to create attack mechs. tutorial.daggerfactory=Construct a[accent] dagger mech factory.[]\n\nThis will be used to create attack mechs.
tutorial.router=Factories need resources to function.\nCreate a router to split conveyor resources. tutorial.router=공장을 작동시키기 위해 자원이 필요합니다.\n컨베이어에 운반되고 있는 자원을 분할할 분배기를 만드세요.
tutorial.dagger=Link power nodes to the factory.\nOnce requirements are met, a mech will be created.\n\nCreate more drills, generators and conveyors as necessary. tutorial.dagger=전력 노드를 공장에 연결하세요.\n일단 요구 사항이 충족되면 기체 생산을 시작합니다.\n\n필요에 따라 드릴 및 발전기, 컨베이어를 더 많이 만들 수 있습니다.
tutorial.battle=The[LIGHT_GRAY] enemy[] has revealed their core.\nDestroy it with your unit and dagger mechs. tutorial.battle=[LIGHT_GRAY]적[]의 코어가 드러났습니다.\n당신의 부대와 디거를 사용하여 파괴하세요.
text.missions=Missions:[LIGHT_GRAY] {0}
text.mission.command=Send Command {0} To Units text.missions=목표 : [LIGHT_GRAY] {0}
text.mission.mech=Switch to mech[accent] {0}[] text.mission.command=유닛에게 {0} 명령을 보내세요
text.mission.create=Create[accent] {0}[] text.mission.mech=[accent] {0}[] 기체로 바꾸세요.
text.wave.enemies=[LIGHT_GRAY]{0} Enemies Remaining text.mission.create=[accent] {0}[] 를 만드세요.
text.wave.enemy=[LIGHT_GRAY]{0} Enemy Remaining text.wave.enemies=[LIGHT_GRAY]{0} 마리 남았음
setting.autotarget.name=Auto-Target text.wave.enemy=[LIGHT_GRAY]{0} 마리 남음
command.attack=Attack
command.retreat=Retreat setting.autotarget.name=자동 조준
command.patrol=Patrol
block.spawn.name=Enemy Spawn command.attack=공격
command.retreat=후퇴
command.patrol=순찰
block.spawn.name=적 스폰지점
block.fortress-factory.name=Fortress Mech Factory block.fortress-factory.name=Fortress Mech Factory
text.gameover.pvp=The[accent] {0}[] team is victorious! text.gameover.pvp=[accent]{0}[] 팀이 승리했습니다!
text.sector.abandon=Abandon text.sector.abandon=초기화
text.sector.abandon.confirm=Are you sure you want to abandon all progress at this sector?\nThis cannot be undone! text.sector.abandon.confirm=정말로 이 구역의 모든 진행상활을 초기화 하겠습니까?\n이 작업은 되돌릴 수 없습니다!
text.mission.main=Main Mission:[LIGHT_GRAY] {0} text.waiting.players=다른 플레이어를 기다리는 중..
text.waiting.players=Waiting for players... text.map.nospawn.pvp=이 맵에는 적팀 코어가 없습니다! 에디터에서 [scarlet]빨간팀[] 코어를 추가하세요.
text.map.nospawn.pvp=This map does not have any enemy cores for player to spawn into! Add[SCARLET] red[] cores to this map in the editor.
text.blocks.basepowergeneration=Base Power Generation
text.blocks.liquidoutputspeed=Liquid Output Speed
mode.custom.warning.read=Just to make sure you've read it:\n[scarlet]UNLOCKS IN CUSTOM GAMES DO NOT CARRY OVER TO SECTORS OR OTHER MODES!\n\n[LIGHT_GRAY](I wish this wasn't necessary, but apparently it is)
mode.pvp.name=PvP mode.pvp.name=PvP
mode.pvp.description=fight against other players locally. mode.pvp.description=몹이 아닌 실제 플레이어와 PvP를 합니다.
block.alpha-mech-pad.name=Alpha Mech Pad block.container.name=컨테이너
block.container.name=Container team.blue.name=블루팀
team.blue.name=blue team.red.name=레드팀
team.red.name=red team.orange.name=오렌지팀
team.orange.name=orange team.none.name=공기팀
team.none.name=gray team.green.name=그린팀
team.green.name=green team.purple.name=보라색팀
team.purple.name=purple block.alpha-mech-pad.name=알파 기체 패드
text.blocks.basepowergeneration=기지 전력 생성기
text.blocks.liquidoutputspeed=액체 출력속도
text.unit.liquidunits=액체
mode.custom.warning.read=꼭 읽어보시길 바랍니다 :\n[scarlet]커스텀 게임에서 잠금해제한 블록은 구역 플레이나 다른 모드에서 적용되지 않습니다!\n\n[LIGHT_GRAY](이게 필요하지 않았으면 좋겠는데)

View File

@@ -14,6 +14,7 @@ import io.anuke.mindustry.world.meta.BlockFlag;
import io.anuke.ucore.core.Events; import io.anuke.ucore.core.Events;
import io.anuke.ucore.core.Timers; import io.anuke.ucore.core.Timers;
import io.anuke.ucore.util.Geometry; import io.anuke.ucore.util.Geometry;
import io.anuke.ucore.util.Structs;
import static io.anuke.mindustry.Vars.state; import static io.anuke.mindustry.Vars.state;
import static io.anuke.mindustry.Vars.world; import static io.anuke.mindustry.Vars.world;
@@ -82,7 +83,7 @@ public class Pathfinder{
} }
public float getValueforTeam(Team team, int x, int y){ public float getValueforTeam(Team team, int x, int y){
return paths == null || team.ordinal() >= paths.length ? 0 : paths[team.ordinal()].weights[x][y]; return paths == null || team.ordinal() >= paths.length ? 0 : Structs.inBounds(x, y, paths[team.ordinal()].weights) ? paths[team.ordinal()].weights[x][y] : 0;
} }
private boolean passable(Tile tile, Team team){ private boolean passable(Tile tile, Team team){

View File

@@ -113,7 +113,6 @@ public class WaveSpawner{
if(group.type.isFlying){ if(group.type.isFlying){
FlyerSpawn spawn = flySpawns.get(flyCount); FlyerSpawn spawn = flySpawns.get(flyCount);
//TODO verify flyer spawn
float margin = 40f; //how far away from the edge flying units spawn float margin = 40f; //how far away from the edge flying units spawn
spawnX = world.width() * tilesize / 2f + Mathf.sqrwavex(spawn.angle) * (world.width() / 2f * tilesize + margin); spawnX = world.width() * tilesize / 2f + Mathf.sqrwavex(spawn.angle) * (world.width() / 2f * tilesize + margin);

View File

@@ -176,7 +176,7 @@ public class ContentLoader{
} }
public void dispose(){ public void dispose(){
//TODO clear all content. //clear all content, currently not needed
} }
public void handleContent(Content content){ public void handleContent(Content content){

View File

@@ -24,12 +24,12 @@ import io.anuke.mindustry.type.ItemStack;
import io.anuke.mindustry.type.Recipe; import io.anuke.mindustry.type.Recipe;
import io.anuke.mindustry.ui.dialogs.FloatingDialog; import io.anuke.mindustry.ui.dialogs.FloatingDialog;
import io.anuke.ucore.core.*; import io.anuke.ucore.core.*;
import io.anuke.ucore.entities.Entities;
import io.anuke.ucore.entities.EntityQuery; import io.anuke.ucore.entities.EntityQuery;
import io.anuke.ucore.modules.Module; import io.anuke.ucore.modules.Module;
import io.anuke.ucore.util.Atlas; import io.anuke.ucore.util.Atlas;
import io.anuke.ucore.util.Bundles; import io.anuke.ucore.util.Bundles;
import io.anuke.ucore.util.Strings; import io.anuke.ucore.util.Strings;
import io.anuke.ucore.util.Timer;
import java.io.IOException; import java.io.IOException;
@@ -48,6 +48,7 @@ public class Control extends Module{
public final Saves saves; public final Saves saves;
public final Unlocks unlocks; public final Unlocks unlocks;
private Timer timerRPC= new Timer(), timerUnlock = new Timer();
private boolean hiscore = false; private boolean hiscore = false;
private boolean wasPaused = false; private boolean wasPaused = false;
private InputHandler[] inputs = {}; private InputHandler[] inputs = {};
@@ -363,12 +364,12 @@ public class Control extends Module{
} }
//auto-update rpc every 5 seconds //auto-update rpc every 5 seconds
if(Timers.get("rpcUpdate", 60 * 5)){ if(timerRPC.get(60 * 5)){
Platform.instance.updateRPC(); Platform.instance.updateRPC();
} }
//check unlocks every 2 seconds //check unlocks every 2 seconds
if(!state.mode.infiniteResources && Timers.get("timerCheckUnlock", 120)){ if(!state.mode.infiniteResources && timerUnlock.get(120)){
checkUnlockableBlocks(); checkUnlockableBlocks();
//save if the unlocks changed //save if the unlocks changed
@@ -395,10 +396,6 @@ public class Control extends Module{
} }
} }
if(!state.is(State.paused) || Net.active()){
Entities.update(effectGroup);
Entities.update(groundEffectGroup);
}
}else{ }else{
if(!state.is(State.paused) || Net.active()){ if(!state.is(State.paused) || Net.active()){
Timers.update(); Timers.update();

View File

@@ -163,6 +163,10 @@ public class Logic extends Module{
if(!Entities.defaultGroup().isEmpty()) if(!Entities.defaultGroup().isEmpty())
throw new RuntimeException("Do not add anything to the default group!"); throw new RuntimeException("Do not add anything to the default group!");
if(!headless){
Entities.update(effectGroup);
Entities.update(groundEffectGroup);
}
for(EntityGroup group : unitGroups){ for(EntityGroup group : unitGroups){
Entities.update(group); Entities.update(group);

View File

@@ -117,7 +117,7 @@ public class UI extends SceneModule{
} }
@Override @Override
public synchronized void update(){ public void update(){
if(Graphics.drawing()) Graphics.end(); if(Graphics.drawing()) Graphics.end();
act(); act();

View File

@@ -47,7 +47,7 @@ public class Damage{
for(int i = 0; i < waves; i++){ for(int i = 0; i < waves; i++){
int f = i; int f = i;
Timers.run(i * 2f, () -> { Timers.run(i * 2f, () -> {
Damage.damage(x, y, Mathf.clamp(radius + explosiveness, 0, 50f) * ((f + 1f) / waves), explosiveness / 2f); threads.run(() -> Damage.damage(x, y, Mathf.clamp(radius + explosiveness, 0, 50f) * ((f + 1f) / waves), explosiveness / 2f));
Effects.effect(ExplosionFx.blockExplosionSmoke, x + Mathf.range(radius), y + Mathf.range(radius)); Effects.effect(ExplosionFx.blockExplosionSmoke, x + Mathf.range(radius), y + Mathf.range(radius));
}); });
} }

View File

@@ -11,6 +11,7 @@ import io.anuke.ucore.entities.EntityGroup;
import io.anuke.ucore.entities.EntityQuery; import io.anuke.ucore.entities.EntityQuery;
import io.anuke.ucore.function.Consumer; import io.anuke.ucore.function.Consumer;
import io.anuke.ucore.function.Predicate; import io.anuke.ucore.function.Predicate;
import io.anuke.ucore.util.Threads;
import io.anuke.ucore.util.EnumSet; import io.anuke.ucore.util.EnumSet;
import static io.anuke.mindustry.Vars.*; import static io.anuke.mindustry.Vars.*;
@@ -20,10 +21,11 @@ import static io.anuke.mindustry.Vars.*;
*/ */
public class Units{ public class Units{
private static Rectangle rect = new Rectangle(); private static Rectangle rect = new Rectangle();
private static Rectangle rectGraphics = new Rectangle();
private static Rectangle hitrect = new Rectangle(); private static Rectangle hitrect = new Rectangle();
private static Unit result; private static Unit result;
private static float cdist; private static float cdist;
private static boolean boolResult; private static boolean boolResult, boolResultGraphics;
/** /**
* Validates a target. * Validates a target.
@@ -53,33 +55,57 @@ public class Units{
return invalidateTarget(target, targeter.team, targeter.x, targeter.y, targeter.getWeapon().getAmmo().getRange()); return invalidateTarget(target, targeter.team, targeter.x, targeter.y, targeter.getWeapon().getAmmo().getRange());
} }
/** /**Returns whether there are any entities on this tile.*/
* Returns whether there are any entities on this tile.
*/
public static boolean anyEntities(Tile tile){ public static boolean anyEntities(Tile tile){
Block type = tile.block(); Block type = tile.block();
rect.setSize(type.size * tilesize, type.size * tilesize); rect.setSize(type.size * tilesize, type.size * tilesize);
rect.setCenter(tile.drawx(), tile.drawy()); rect.setCenter(tile.drawx(), tile.drawy());
boolResult = false; return anyEntities(rect);
Units.getNearby(rect, unit -> {
if(boolResult) return;
if(!unit.isFlying()){
unit.getHitbox(hitrect);
if(hitrect.overlaps(rect)){
boolResult = true;
}
}
});
return boolResult;
} }
/** /**Can be called from any thread.*/
* Returns whether there are any entities on this tile, with the hitbox expanded. public static boolean anyEntities(Rectangle rect){
*/ if(Threads.isLogic()){
boolResult = false;
Units.getNearby(rect, unit -> {
if(boolResult) return;
if(!unit.isFlying()){
unit.getHitbox(hitrect);
if(hitrect.overlaps(rect)){
boolResult = true;
}
}
});
return boolResult;
}else{
boolResultGraphics = false;
for(EntityGroup<? extends BaseUnit> g : unitGroups){
g.forEach(u -> {
u.getHitbox(rectGraphics);
if(rectGraphics.overlaps(rect)){
boolResultGraphics = true;
}
});
if(boolResultGraphics) return true;
}
playerGroup.forEach(u -> {
u.getHitbox(rectGraphics);
if(rectGraphics.overlaps(rect)){
boolResultGraphics = true;
}
});
return boolResultGraphics;
}
}
/**Returns whether there are any entities on this tile, with the hitbox expanded.*/
public static boolean anyEntities(Tile tile, float expansion, Predicate<Unit> pred){ public static boolean anyEntities(Tile tile, float expansion, Predicate<Unit> pred){
Block type = tile.block(); Block type = tile.block();
rect.setSize(type.size * tilesize + expansion, type.size * tilesize + expansion); rect.setSize(type.size * tilesize + expansion, type.size * tilesize + expansion);

View File

@@ -19,8 +19,6 @@ public class Teams{
* @param enemies The array of enemies of this team. Any team not in this array is considered neutral. * @param enemies The array of enemies of this team. Any team not in this array is considered neutral.
*/ */
public void add(Team team, Team... enemies){ public void add(Team team, Team... enemies){
if(map[team.ordinal()] != null) throw new RuntimeException("Can't define team information twice!");
map[team.ordinal()] = new TeamData(team, EnumSet.of(enemies)); map[team.ordinal()] = new TeamData(team, EnumSet.of(enemies));
} }

View File

@@ -25,7 +25,7 @@ public class BlockRenderer{
private FloorRenderer floorRenderer; private FloorRenderer floorRenderer;
private Array<BlockRequest> requests = new Array<>(initialRequests); private Array<BlockRequest> requests = new Array<>(true, initialRequests, BlockRequest.class);
private IntSet teamChecks = new IntSet(); private IntSet teamChecks = new IntSet();
private int lastCamX, lastCamY, lastRangeX, lastRangeY; private int lastCamX, lastCamY, lastRangeX, lastRangeY;
private Layer lastLayer; private Layer lastLayer;

View File

@@ -10,7 +10,7 @@ import io.anuke.ucore.graphics.Lines;
import io.anuke.ucore.util.Mathf; import io.anuke.ucore.util.Mathf;
/** /**
* Class that renders a trail. * Class that renders a colored trail.
*/ */
public class Trail{ public class Trail{
private final static float maxJump = 15f; private final static float maxJump = 15f;

View File

@@ -267,7 +267,6 @@ public abstract class InputHandler extends InputAdapter{
&& tile.floor().drops != null && tile.floor().drops.item.hardness <= player.mech.drillPower && tile.floor().drops != null && tile.floor().drops.item.hardness <= player.mech.drillPower
&& !tile.floor().playerUnmineable && !tile.floor().playerUnmineable
&& player.inventory.canAcceptItem(tile.floor().drops.item) && player.inventory.canAcceptItem(tile.floor().drops.item)
&& Units.getClosestEnemy(player.getTeam(), tile.worldx(), tile.worldy(), 40f, e -> true) == null //don't being mining when an enemy is near
&& tile.block() == Blocks.air && player.distanceTo(tile.worldx(), tile.worldy()) <= Player.mineDistance; && tile.block() == Blocks.air && player.distanceTo(tile.worldx(), tile.worldy()) <= Player.mineDistance;
} }
@@ -354,7 +353,7 @@ public abstract class InputHandler extends InputAdapter{
for(Tile tile : state.teams.get(player.getTeam()).cores){ for(Tile tile : state.teams.get(player.getTeam()).cores){
if(tile.distanceTo(x * tilesize, y * tilesize) < coreBuildRange){ if(tile.distanceTo(x * tilesize, y * tilesize) < coreBuildRange){
return Build.validPlace(player.getTeam(), x, y, type, rotation) && return Build.validPlace(player.getTeam(), x, y, type, rotation) &&
Vector2.dst(player.x, player.y, x * tilesize, y * tilesize) < Player.placeDistance; Vector2.dst(player.x, player.y, x * tilesize, y * tilesize) < Player.placeDistance;
} }
} }
@@ -366,12 +365,10 @@ public abstract class InputHandler extends InputAdapter{
} }
public void placeBlock(int x, int y, Recipe recipe, int rotation){ public void placeBlock(int x, int y, Recipe recipe, int rotation){
//todo multiplayer support
player.addBuildRequest(new BuildRequest(x, y, rotation, recipe)); player.addBuildRequest(new BuildRequest(x, y, rotation, recipe));
} }
public void breakBlock(int x, int y){ public void breakBlock(int x, int y){
//todo multiplayer support
Tile tile = world.tile(x, y).target(); Tile tile = world.tile(x, y).target();
player.addBuildRequest(new BuildRequest(tile.x, tile.y)); player.addBuildRequest(new BuildRequest(tile.x, tile.y));
} }

View File

@@ -28,7 +28,6 @@ import io.anuke.mindustry.ui.dialogs.FloatingDialog;
import io.anuke.mindustry.world.Block; import io.anuke.mindustry.world.Block;
import io.anuke.mindustry.world.Tile; import io.anuke.mindustry.world.Tile;
import io.anuke.ucore.core.*; import io.anuke.ucore.core.*;
import io.anuke.ucore.entities.Entities;
import io.anuke.ucore.graphics.Draw; import io.anuke.ucore.graphics.Draw;
import io.anuke.ucore.graphics.Lines; import io.anuke.ucore.graphics.Lines;
import io.anuke.ucore.scene.Group; import io.anuke.ucore.scene.Group;
@@ -84,19 +83,17 @@ public class MobileInput extends InputHandler implements GestureListener{
/** Check and assign targets for a specific position. */ /** Check and assign targets for a specific position. */
void checkTargets(float x, float y){ void checkTargets(float x, float y){
synchronized(Entities.entityLock){ Unit unit = Units.getClosestEnemy(player.getTeam(), x, y, 20f, u -> !u.isDead());
Unit unit = Units.getClosestEnemy(player.getTeam(), x, y, 20f, u -> !u.isDead() && u.isAdded());
if(unit != null){ if(unit != null){
threads.run(() -> player.target = unit); threads.run(() -> player.target = unit);
}else{ }else{
Tile tile = world.tileWorld(x, y); Tile tile = world.tileWorld(x, y);
if(tile != null) tile = tile.target(); if(tile != null) tile = tile.target();
if(tile != null && state.teams.areEnemies(player.getTeam(), tile.getTeam())){ if(tile != null && state.teams.areEnemies(player.getTeam(), tile.getTeam())){
TileEntity entity = tile.entity; TileEntity entity = tile.entity;
threads.run(() -> player.target = entity); threads.run(() -> player.target = entity);
}
} }
} }
} }
@@ -344,7 +341,7 @@ public class MobileInput extends InputHandler implements GestureListener{
if(lineMode){ if(lineMode){
int tileX = tileX(Gdx.input.getX()); int tileX = tileX(Gdx.input.getX());
int tileY = tileY(Gdx.input.getY()); int tileY = tileY(Gdx.input.getY());
//draw placing //draw placing
if(mode == placing && recipe != null){ if(mode == placing && recipe != null){
NormalizeDrawResult dresult = PlaceUtils.normalizeDrawArea(recipe.result, lineStartX, lineStartY, tileX, tileY, true, maxLength, lineScale); NormalizeDrawResult dresult = PlaceUtils.normalizeDrawArea(recipe.result, lineStartX, lineStartY, tileX, tileY, true, maxLength, lineScale);
@@ -399,7 +396,7 @@ public class MobileInput extends InputHandler implements GestureListener{
Lines.rect(result.x, result.y, result.x2 - result.x, result.y2 - result.y); Lines.rect(result.x, result.y, result.x2 - result.x, result.y2 - result.y);
} }
} }
TargetTrait target = player.target; TargetTrait target = player.target;
@@ -555,7 +552,7 @@ public class MobileInput extends InputHandler implements GestureListener{
//ignore off-screen taps //ignore off-screen taps
if(cursor == null || ui.hasMouse(x, y)) return false; if(cursor == null || ui.hasMouse(x, y)) return false;
checkTargets(worldx, worldy); threads.run(() -> checkTargets(worldx, worldy));
//remove if request present //remove if request present
if(hasRequest(cursor)){ if(hasRequest(cursor)){

View File

@@ -1,267 +0,0 @@
package io.anuke.mindustry.maps.generation.pathfinding;
import com.badlogic.gdx.math.GridPoint2;
import com.badlogic.gdx.utils.Array;
import com.badlogic.gdx.utils.BinaryHeap;
import io.anuke.mindustry.content.fx.Fx;
import io.anuke.mindustry.world.Tile;
import io.anuke.ucore.core.Effects;
import io.anuke.ucore.function.Consumer;
import io.anuke.ucore.function.Predicate;
import io.anuke.ucore.util.Structs;
import io.anuke.ucore.util.Geometry;
//TODO
public class AStarPathFinder extends TilePathfinder{
NodeRecord[] records;
BinaryHeap<NodeRecord> openList;
NodeRecord current;
Predicate<Tile> goal;
private int searchId;
private Tile end;
private static final byte UNVISITED = 0;
private static final byte OPEN = 1;
private static final byte CLOSED = 2;
private static final boolean debug = false;
public AStarPathFinder(Tile[][] tiles) {
super(tiles);
this.records = new NodeRecord[tiles.length * tiles[0].length];
this.openList = new BinaryHeap<>();
}
@Override
public void search(Tile start, Tile end, Array<Tile> out){
}
public void search(Tile start, Tile end, Predicate<Tile> pred, Array<Tile> out){
this.goal = pred;
searchNodePath(start, end, out);
}
public boolean searchNodePath(Tile startNode, Tile endNode, Array<Tile> outPath) {
this.end = endNode;
// Perform AStar
boolean found = search(startNode, endNode);
if (found) {
// Create a path made of nodes
generateNodePath(startNode, outPath);
}
return found;
}
protected boolean search(Tile startNode, Tile endNode) {
initSearch(startNode, endNode);
// Iterate through processing each node
do {
// Retrieve the node with smallest estimated total cost from the open list
current = openList.pop();
current.category = CLOSED;
// Terminate if we reached the goal node
if (current.node == endNode || goal.test(current.node)) return true;
visitChildren(endNode);
} while (openList.size > 0);
// We've run out of nodes without finding the goal, so there's no solution
return false;
}
/*
public boolean search(PathFinderRequest<Tile> request, long timeToRun) {
long lastTime = TimeUtils.nanoTime();
// We have to initialize the search if the status has just changed
if (request.statusChanged) {
initSearch(request.startNode, request.endNode);
request.statusChanged = false;
}
// Iterate through processing each node
do {
// Check the available time
long currentTime = TimeUtils.nanoTime();
timeToRun -= currentTime - lastTime;
if (timeToRun <= PathFinderQueue.TIME_TOLERANCE) return false;
// Retrieve the node with smallest estimated total cost from the open list
current = openList.pop();
current.category = CLOSED;
// Terminate if we reached the goal node; we've found a path.
if (current.node == request.endNode) {
request.pathFound = true;
generateNodePath(request.startNode, request.resultPath);
return true;
}
// Visit current node's children
visitChildren(request.endNode);
// Store the current time
lastTime = currentTime;
} while (openList.size > 0);
// The open list is empty and we've not found a path.
request.pathFound = false;
return true;
}*/
protected void initSearch(Tile startNode, Tile endNode) {
// Increment the search id
if (++searchId < 0) searchId = 1;
// Initialize the open list
openList.clear();
// Initialize the record for the start node and add it to the open list
NodeRecord startRecord = getNodeRecord(startNode);
startRecord.node = startNode;
startRecord.from = null;
startRecord.costSoFar = 0;
addToOpenList(startRecord, estimate(startNode, endNode));
current = null;
}
protected void visitChildren(Tile endNode) {
if(debug) Effects.effect(Fx.spawn, current.node.worldx(), current.node.worldy());
nodes(current.node, node -> {
float addCost = estimate(current.node, node);
float nodeCost = current.costSoFar + addCost;
float nodeHeuristic;
NodeRecord nodeRecord = getNodeRecord(node);
if (nodeRecord.category == CLOSED) { // The node is closed
// If we didn't find a shorter route, skip
if (nodeRecord.costSoFar <= nodeCost){
return;
}
// We can use the node's old cost values to calculate its heuristic
// without calling the possibly expensive heuristic function
nodeHeuristic = nodeRecord.getEstimatedTotalCost() - nodeRecord.costSoFar;
} else if (nodeRecord.category == OPEN) { // The node is open
//If our route is no better, then skip
if (nodeRecord.costSoFar <= nodeCost){
return;
}
// Remove it from the open list (it will be re-added with the new cost)
openList.remove(nodeRecord);
// We can use the node's old cost values to calculate its heuristic
// without calling the possibly expensive heuristic function
nodeHeuristic = nodeRecord.getEstimatedTotalCost() - nodeRecord.costSoFar;
} else { // the node is unvisited
// We'll need to calculate the heuristic value using the function,
// since we don't have a node record with a previously calculated value
nodeHeuristic = estimate(node, endNode);
}
// Update node record's cost and connection
nodeRecord.costSoFar = nodeCost;
nodeRecord.from = current.node;
// Add it to the open list with the estimated total cost
addToOpenList(nodeRecord, nodeCost + nodeHeuristic);
});
}
protected void nodes(Tile current, Consumer<Tile> cons){
if(obstacle(current)) return;
for(GridPoint2 p : Geometry.d4){
int wx = current.x + p.x, wy = current.y + p.y;
Tile n = Structs.inBounds(wx, wy, tiles) ? tiles[wx][wy] : null;
if(!obstacle(n)) cons.accept(n);
}
}
protected boolean obstacle(Tile tile){
return tile == null || (tile.solid() && end.target() != tile && tile.target() != end) || !tile.block().alwaysReplace;
}
protected float estimate(Tile tile, Tile other){
return goal.test(other) || goal.test(tile) ? Float.MIN_VALUE : Math.abs(tile.worldx() - other.worldx()) + Math.abs(tile.worldy() - other.worldy());
}
protected void generateNodePath(Tile startNode, Array<Tile> outPath) {
// Work back along the path, accumulating nodes
outPath.clear();
while (current.from != null) {
outPath.add(current.node);
current = records[(indexOf(current.from))];
}
outPath.add(startNode);
// Reverse the path
outPath.reverse();
}
protected void addToOpenList(NodeRecord nodeRecord, float estimatedTotalCost) {
openList.add(nodeRecord, estimatedTotalCost);
nodeRecord.category = OPEN;
}
protected NodeRecord getNodeRecord(Tile node) {
if(records[indexOf(node)] == null){
NodeRecord record = new NodeRecord();
record.node = node;
record.searchId = searchId;
records[indexOf(node)] = record;
return record;
}else{
NodeRecord record = records[indexOf(node)];
if(record.searchId != searchId){
record.category = UNVISITED;
record.searchId = searchId;
}
return record;
}
}
private int indexOf(Tile node){
return node.packedPosition();
}
static class NodeRecord extends BinaryHeap.Node {
Tile node;
Tile from;
float costSoFar;
byte category;
int searchId;
public NodeRecord() {
super(0);
}
public float getEstimatedTotalCost() {
return getValue();
}
}
}

View File

@@ -26,8 +26,6 @@ import static io.anuke.mindustry.Vars.headless;
import static io.anuke.mindustry.Vars.ui; import static io.anuke.mindustry.Vars.ui;
public class Net{ public class Net{
public static final Object packetPoolLock = new Object();
private static boolean server; private static boolean server;
private static boolean active; private static boolean active;
private static boolean clientLoaded; private static boolean clientLoaded;
@@ -239,16 +237,12 @@ public class Net{
if(clientLoaded || ((object instanceof Packet) && ((Packet) object).isImportant())){ if(clientLoaded || ((object instanceof Packet) && ((Packet) object).isImportant())){
if(clientListeners.get(object.getClass()) != null) if(clientListeners.get(object.getClass()) != null)
clientListeners.get(object.getClass()).accept(object); clientListeners.get(object.getClass()).accept(object);
synchronized(packetPoolLock){ Pooling.free(object);
Pooling.free(object);
}
}else if(!((object instanceof Packet) && ((Packet) object).isUnimportant())){ }else if(!((object instanceof Packet) && ((Packet) object).isUnimportant())){
packetQueue.add(object); packetQueue.add(object);
Log.info("Queuing packet {0}", object); Log.info("Queuing packet {0}", object);
}else{ }else{
synchronized(packetPoolLock){ Pooling.free(object);
Pooling.free(object);
}
} }
}else{ }else{
Log.err("Unhandled packet type: '{0}'!", object); Log.err("Unhandled packet type: '{0}'!", object);
@@ -263,9 +257,7 @@ public class Net{
if(serverListeners.get(object.getClass()) != null){ if(serverListeners.get(object.getClass()) != null){
if(serverListeners.get(object.getClass()) != null) if(serverListeners.get(object.getClass()) != null)
serverListeners.get(object.getClass()).accept(connection, object); serverListeners.get(object.getClass()).accept(connection, object);
synchronized(packetPoolLock){ Pooling.free(object);
Pooling.free(object);
}
}else{ }else{
Log.err("Unhandled packet type: '{0}'!", object.getClass()); Log.err("Unhandled packet type: '{0}'!", object.getClass());
} }

View File

@@ -1,6 +1,5 @@
package io.anuke.mindustry.ui.dialogs; package io.anuke.mindustry.ui.dialogs;
import io.anuke.mindustry.entities.Player;
import io.anuke.mindustry.net.Administration.PlayerInfo; import io.anuke.mindustry.net.Administration.PlayerInfo;
import io.anuke.ucore.scene.ui.ScrollPane; import io.anuke.ucore.scene.ui.ScrollPane;
import io.anuke.ucore.scene.ui.layout.Table; import io.anuke.ucore.scene.ui.layout.Table;
@@ -43,12 +42,18 @@ public class AdminsDialog extends FloatingDialog{
res.addImageButton("icon-cancel", 14 * 3, () -> { res.addImageButton("icon-cancel", 14 * 3, () -> {
ui.showConfirm("$text.confirm", "$text.confirmunadmin", () -> { ui.showConfirm("$text.confirm", "$text.confirmunadmin", () -> {
netServer.admins.unAdminPlayer(info.id); netServer.admins.unAdminPlayer(info.id);
playerGroup.forEach(player -> {
if(player.uuid.equals(info.id)){
player.isAdmin = false;
}
});
/*
for(Player player : playerGroup.all()){ for(Player player : playerGroup.all()){
if(player.con != null){ if(player.con != null){
player.isAdmin = false; player.isAdmin = false;
break; break;
} }
} }*/
setup(); setup();
}); });
}).size(h).pad(-14f); }).size(h).pad(-14f);

View File

@@ -19,12 +19,14 @@ import io.anuke.ucore.scene.ui.Image;
import io.anuke.ucore.scene.ui.layout.Table; import io.anuke.ucore.scene.ui.layout.Table;
import io.anuke.ucore.scene.ui.layout.Unit; import io.anuke.ucore.scene.ui.layout.Unit;
import io.anuke.ucore.util.Bundles; import io.anuke.ucore.util.Bundles;
import io.anuke.ucore.util.Timer;
import static io.anuke.mindustry.Vars.*; import static io.anuke.mindustry.Vars.*;
public class PlayerListFragment extends Fragment{ public class PlayerListFragment extends Fragment{
private boolean visible = false; private boolean visible = false;
private Table content = new Table().marginRight(13f).marginLeft(13f); private Table content = new Table().marginRight(13f).marginLeft(13f);
private Timer timer = new Timer();
@Override @Override
public void build(Group parent){ public void build(Group parent){
@@ -36,7 +38,7 @@ public class PlayerListFragment extends Fragment{
return; return;
} }
if(visible && Timers.get("player-list-rebuild", 20)){ if(visible && timer.get(20)){
rebuild(); rebuild();
content.pack(); content.pack();
content.act(Gdx.graphics.getDeltaTime()); content.act(Gdx.graphics.getDeltaTime());
@@ -48,8 +50,7 @@ public class PlayerListFragment extends Fragment{
cont.table("pane", pane -> { cont.table("pane", pane -> {
pane.label(() -> Bundles.format(playerGroup.size() == 1 ? "text.players.single" : "text.players", playerGroup.size())); pane.label(() -> Bundles.format(playerGroup.size() == 1 ? "text.players.single" : "text.players", playerGroup.size()));
pane.row(); pane.row();
pane.pane("clear", content) pane.pane("clear", content).grow().get().setScrollingDisabled(true, false);
.grow().get().setScrollingDisabled(true, false);
pane.row(); pane.row();
pane.table("pane", menu -> { pane.table("pane", menu -> {
@@ -71,10 +72,10 @@ public class PlayerListFragment extends Fragment{
float h = 74f; float h = 74f;
for(Player player : playerGroup.all()){ playerGroup.forEach(player -> {
NetConnection connection = gwt ? null : player.con; NetConnection connection = gwt ? null : player.con;
if(connection == null && Net.server() && !player.isLocal) continue; if(connection == null && Net.server() && !player.isLocal) return;
Table button = new Table("button"); Table button = new Table("button");
button.left(); button.left();
@@ -139,7 +140,7 @@ public class PlayerListFragment extends Fragment{
content.add(button).padBottom(-6).width(350f).maxHeight(h + 14); content.add(button).padBottom(-6).width(350f).maxHeight(h + 14);
content.row(); content.row();
} });
content.marginBottom(5); content.marginBottom(5);
} }

View File

@@ -11,7 +11,6 @@ import io.anuke.mindustry.type.ContentType;
import io.anuke.mindustry.type.Recipe; import io.anuke.mindustry.type.Recipe;
import io.anuke.mindustry.world.blocks.BuildBlock.BuildEntity; import io.anuke.mindustry.world.blocks.BuildBlock.BuildEntity;
import io.anuke.ucore.core.Events; import io.anuke.ucore.core.Events;
import io.anuke.ucore.entities.Entities;
import io.anuke.ucore.util.Geometry; import io.anuke.ucore.util.Geometry;
import static io.anuke.mindustry.Vars.*; import static io.anuke.mindustry.Vars.*;
@@ -113,30 +112,9 @@ public class Build{
return false; return false;
} }
rect.setSize(type.size * tilesize, type.size * tilesize); if((type.solid || type.solidifes) &&
rect.setCenter(type.offset() + x * tilesize, type.offset() + y * tilesize); Units.anyEntities(rect.setSize(tilesize * type.size).setCenter(x * tilesize + type.offset(), y * tilesize + type.offset()))){
return false;
if(type.solid || type.solidifes){
synchronized(Entities.entityLock){
try{
rect.setSize(tilesize * type.size).setCenter(x * tilesize + type.offset(), y * tilesize + type.offset());
boolean[] result = {false};
Units.getNearby(rect, e -> {
if(e == null) return; //not sure why this happens?
e.getHitbox(hitrect);
if(rect.overlaps(hitrect) && !e.isFlying()){
result[0] = true;
}
});
if(result[0]) return false;
}catch(Exception e){
return false;
}
}
} }
//check for enemy cores //check for enemy cores

View File

@@ -64,19 +64,15 @@ public class Edges{
return polygons[(int) (radius * 2) - 1]; return polygons[(int) (radius * 2) - 1];
} }
public static synchronized GridPoint2[] getEdges(int size){ public static GridPoint2[] getEdges(int size){
if(size < 0 || size > maxSize) throw new RuntimeException("Block size must be between 0 and " + maxSize); if(size < 0 || size > maxSize) throw new RuntimeException("Block size must be between 0 and " + maxSize);
return edges[size - 1]; return edges[size - 1];
} }
public static synchronized GridPoint2[] getInsideEdges(int size){ public static GridPoint2[] getInsideEdges(int size){
if(size < 0 || size > maxSize) throw new RuntimeException("Block size must be between 0 and " + maxSize); if(size < 0 || size > maxSize) throw new RuntimeException("Block size must be between 0 and " + maxSize);
return edgeInside[size - 1]; return edgeInside[size - 1];
} }
public static synchronized int getEdgeAmount(int size){
return getEdges(size).length;
}
} }

View File

@@ -198,7 +198,7 @@ public class Conveyor extends Block{
} }
@Override @Override
public synchronized void update(Tile tile){ public void update(Tile tile){
ConveyorEntity entity = tile.entity(); ConveyorEntity entity = tile.entity();
entity.minitem = 1f; entity.minitem = 1f;
@@ -274,7 +274,7 @@ public class Conveyor extends Block{
} }
@Override @Override
public synchronized int removeStack(Tile tile, Item item, int amount){ public int removeStack(Tile tile, Item item, int amount){
ConveyorEntity entity = tile.entity(); ConveyorEntity entity = tile.entity();
entity.noSleep(); entity.noSleep();
int removed = 0; int removed = 0;
@@ -300,13 +300,13 @@ public class Conveyor extends Block{
} }
@Override @Override
public synchronized int acceptStack(Item item, int amount, Tile tile, Unit source){ public int acceptStack(Item item, int amount, Tile tile, Unit source){
ConveyorEntity entity = tile.entity(); ConveyorEntity entity = tile.entity();
return Math.min((int)(entity.minitem / itemSpace), amount); return Math.min((int)(entity.minitem / itemSpace), amount);
} }
@Override @Override
public synchronized void handleStack(Item item, int amount, Tile tile, Unit source){ public void handleStack(Item item, int amount, Tile tile, Unit source){
ConveyorEntity entity = tile.entity(); ConveyorEntity entity = tile.entity();
for(int i = amount - 1; i >= 0; i--){ for(int i = amount - 1; i >= 0; i--){

View File

@@ -9,8 +9,6 @@ import io.anuke.ucore.util.Pooling;
import java.nio.ByteBuffer; import java.nio.ByteBuffer;
import static io.anuke.mindustry.net.Net.packetPoolLock;
@SuppressWarnings("unchecked") @SuppressWarnings("unchecked")
public class ByteSerializer implements Serialization { public class ByteSerializer implements Serialization {
@@ -36,11 +34,9 @@ public class ByteSerializer implements Serialization {
if(id == -2){ if(id == -2){
return FrameworkSerializer.read(byteBuffer); return FrameworkSerializer.read(byteBuffer);
}else{ }else{
synchronized (packetPoolLock) { Packet packet = Pooling.obtain((Class<Packet>) Registrator.getByID(id).type, (Supplier<Packet>) Registrator.getByID(id).constructor);
Packet packet = Pooling.obtain((Class<Packet>) Registrator.getByID(id).type, (Supplier<Packet>) Registrator.getByID(id).constructor); packet.read(byteBuffer);
packet.read(byteBuffer); return packet;
return packet;
}
} }
} }

View File

@@ -1,11 +1,27 @@
package io.anuke.kryonet; package io.anuke.kryonet;
import io.anuke.mindustry.core.ThreadHandler.ThreadProvider; import io.anuke.mindustry.core.ThreadHandler.ThreadProvider;
import io.anuke.ucore.util.Threads;
import io.anuke.ucore.util.Threads.ThreadInfoProvider;
import io.anuke.ucore.util.Log; import io.anuke.ucore.util.Log;
public class DefaultThreadImpl implements ThreadProvider { public class DefaultThreadImpl implements ThreadProvider, ThreadInfoProvider{
private Thread thread; private Thread thread;
public DefaultThreadImpl(){
Threads.setThreadInfoProvider(this);
}
@Override
public boolean isOnLogicThread(){
return thread == null || isOnThread();
}
@Override
public boolean isOnGraphicsThread(){
return thread == null || !isOnThread();
}
@Override @Override
public boolean isOnThread() { public boolean isOnThread() {
return Thread.currentThread() == thread; return Thread.currentThread() == thread;

View File

@@ -23,7 +23,6 @@ import java.nio.ByteBuffer;
import java.nio.channels.ClosedSelectorException; import java.nio.channels.ClosedSelectorException;
import static io.anuke.mindustry.Vars.*; import static io.anuke.mindustry.Vars.*;
import static io.anuke.mindustry.net.Net.packetPoolLock;
public class KryoClient implements ClientProvider{ public class KryoClient implements ClientProvider{
Client client; Client client;
@@ -159,9 +158,7 @@ public class KryoClient implements ClientProvider{
client.sendUDP(object); client.sendUDP(object);
} }
synchronized (packetPoolLock) { Pooling.free(object);
Pooling.free(object);
}
} }
@Override @Override