diff --git a/.gitignore b/.gitignore index 2377dbee42..79cf5235d0 100644 --- a/.gitignore +++ b/.gitignore @@ -10,6 +10,7 @@ logs/ /desktop/mindustry-maps/ /desktop/gifexport/ /core/lib/ +/ios/assets/ /core/assets-raw/sprites/generated/ /core/assets-raw/sprites_out/ /annotations/build/ diff --git a/android/build.gradle b/android/build.gradle index 202558c172..e24bbab771 100644 --- a/android/build.gradle +++ b/android/build.gradle @@ -46,7 +46,7 @@ task deploy(type: Copy){ from "build/outputs/apk/release/android-release.apk" into "../deploy/" - rename("android-release.apk", appName + "-android-" + getVersionString() + ".apk") + rename("android-release.apk", "${generateDeployName('android')}.apk") } android{ diff --git a/annotations/src/main/java/io/anuke/annotations/AssetsAnnotationProcessor.java b/annotations/src/main/java/io/anuke/annotations/AssetsAnnotationProcessor.java index f8a3c7c34e..32bd471288 100644 --- a/annotations/src/main/java/io/anuke/annotations/AssetsAnnotationProcessor.java +++ b/annotations/src/main/java/io/anuke/annotations/AssetsAnnotationProcessor.java @@ -79,7 +79,8 @@ public class AssetsAnnotationProcessor extends AbstractProcessor{ name = name + "s"; } - load.addStatement(name + " = io.anuke.arc.Core.audio."+loadMethod+"(io.anuke.arc.Core.files.internal($S))", path.substring(path.lastIndexOf("/") + 1) + "/" + fname); + load.addStatement(name + " = io.anuke.arc.Core.audio."+loadMethod+"(io.anuke.arc.Core.files.internal(io.anuke.arc.Core.app.getType() != io.anuke.arc.Application.ApplicationType.iOS ? $S : $S))", + path.substring(path.lastIndexOf("/") + 1) + "/" + fname, (path.substring(path.lastIndexOf("/") + 1) + "/" + fname).replace(".ogg", ".caf")); dispose.addStatement(name + ".dispose()"); dispose.addStatement(name + " = null"); type.addField(FieldSpec.builder(ClassName.bestGuess(rtype), name, Modifier.STATIC, Modifier.PUBLIC).initializer("new io.anuke.arc.audio.mock.Mock" + rtype.substring(rtype.lastIndexOf(".") + 1)+ "()").build()); diff --git a/build.gradle b/build.gradle index 086c056df0..f6b7aa6cc6 100644 --- a/build.gradle +++ b/build.gradle @@ -8,7 +8,7 @@ buildscript{ } dependencies{ - classpath 'com.mobidevelop.robovm:robovm-gradle-plugin:2.3.6' + classpath 'com.mobidevelop.robovm:robovm-gradle-plugin:2.3.7' classpath "com.badlogicgames.gdx:gdx-tools:1.9.10" classpath "com.badlogicgames.packr:packr:2.1-SNAPSHOT" } @@ -19,11 +19,11 @@ allprojects{ ext{ versionNumber = '4' - versionModifier = 'beta' + versionModifier = 'release' if(!project.hasProperty("versionType")) versionType = 'official' appName = 'Mindustry' gdxVersion = '1.9.10' - roboVMVersion = '2.3.6' + roboVMVersion = '2.3.7' arcHash = null debugged = { @@ -57,11 +57,36 @@ allprojects{ } } + generateDeployName = { String platform -> + if(platform == "windows"){ + platform += "64" + } + platform = platform.capitalize() + + if(platform.endsWith("64") || platform.endsWith("32")){ + platform = "${platform.substring(0, platform.length() - 2)}-${platform.substring(platform.length() - 2)}bit" + } + + return "[${platform}]${getModifierString()}[${getNeatVersionString()}]${appName}.zip" + } + getVersionString = { String buildVersion = getBuildVersion() return "$versionNumber-$versionModifier-$buildVersion" } + getNeatVersionString = { + String buildVersion = getBuildVersion() + return "v$buildVersion" + } + + getModifierString = { + if(versionModifier != "release"){ + return "[${versionModifier.toUpperCase()}]" + } + return "" + } + getBuildVersion = { if(!project.hasProperty("buildversion")) return "custom build" return project.getProperties()["buildversion"] diff --git a/core/assets-raw/sprites/ui/discord-banner.png b/core/assets-raw/sprites/ui/discord-banner.png index d73d665602..7d1a2d4385 100644 Binary files a/core/assets-raw/sprites/ui/discord-banner.png and b/core/assets-raw/sprites/ui/discord-banner.png differ diff --git a/core/assets/bundles/bundle.properties b/core/assets/bundles/bundle.properties index ce45c658e4..5f19cec78d 100644 --- a/core/assets/bundles/bundle.properties +++ b/core/assets/bundles/bundle.properties @@ -46,6 +46,7 @@ newgame = New Game none = minimap = Minimap close = Close +website = Website quit = Quit maps = Maps continue = Continue @@ -158,7 +159,7 @@ openlink = Open Link copylink = Copy Link back = Back classic.export = Export Classic Data -classic.export.text = Classic (v3.5 build 40) save or map data has been detected. Would you like to export these saves to your phone's home folder, for use in the Mindustry Classic app? +classic.export.text = [accent]Mindustry[] has just had a major update.\nClassic (v3.5 build 40) save or map data has been detected. Would you like to export these saves to your phone's home folder, for use in the Mindustry Classic app? quit.confirm = Are you sure you want to quit? quit.confirm.tutorial = Are you sure you know what you're doing?\nThe tutorial can be re-taken in[accent] Settings->Game->Re-Take Tutorial.[] loading = [accent]Loading... @@ -514,13 +515,14 @@ setting.lasers.name = Show Power Lasers setting.pixelate.name = Pixelate[lightgray] (disables animations) setting.minimap.name = Show Minimap setting.musicvol.name = Music Volume +setting.ambientvol.name = Ambient Volume setting.mutemusic.name = Mute Music setting.sfxvol.name = SFX Volume setting.mutesound.name = Mute Sound setting.crashreport.name = Send Anonymous Crash Reports setting.chatopacity.name = Chat Opacity setting.playerchat.name = Display In-Game Chat -uiscale.reset = UI scale has been changed.\nPress "OK" to confirm this scale.\n[scarlet]Reverting and exiting in[accent] {0}[] settings... +uiscale.reset = UI scale has been changed.\nPress "OK" to confirm this scale.\n[scarlet]Reverting and exiting in[accent] {0}[] seconds... uiscale.cancel = Cancel & Exit setting.bloom.name = Bloom keybind.title = Rebind Keys @@ -873,7 +875,7 @@ tutorial.drill.mobile = Mining manually is inefficient.\n[accent]Drills []can mi tutorial.blockinfo = Each block has different stats. Each drill can only mine certain ores.\nTo check a block's info and stats,[accent] tap the "?" button while selecting it in the build menu.[]\n\n[accent]Access the Mechanical Drill's stats now.[] tutorial.conveyor = [accent]Conveyors[] are used to transport items to the core.\nMake a line of conveyors from the drill to the core.\n[accent]Hold down the mouse to place in a line.[]\nHold[accent] CTRL[] while selecting a line to place diagonally.\n\n[accent]{0}/{1} conveyors placed in line\n[accent]0/1 items delivered tutorial.conveyor.mobile = [accent]Conveyors[] are used to transport items to the core.\nMake a line of conveyors from the drill to the core.\n[accent] Place in a line by holding down your finger for a few seconds[] and dragging in a direction.\n\n[accent]{0}/{1} conveyors placed in line\n[accent]0/1 items delivered -tutorial.turret = Defensive structures must be built to repel the[lightgray] enemy[].\nBuild a[accent] duo turret[] near your base. +tutorial.turret = Once an item enters your core, it can be used for building.\nKeep in mind that not all items can be used for building.\nItems that are not used for building, such as[accent] coal[] or[accent] scrap[], cannot be put into the core.\nDefensive structures must be built to repel the[lightgray] enemy[].\nBuild a[accent] duo turret[] near your base. tutorial.drillturret = Duo turrets require[accent] copper ammo []to shoot.\nPlace a drill near the turret.\nLead conveyors into the turret to supply it with copper.\n\n[accent]Ammo delivered: 0/1 tutorial.pause = During battle, you are able to[accent] pause the game.[]\nYou may queue buildings while paused.\n\n[accent]Press space to pause. tutorial.pause.mobile = During battle, you are able to[accent] pause the game.[]\nYou may queue buildings while paused.\n\n[accent]Press this button in the top left to pause. diff --git a/core/assets/bundles/bundle_de.properties b/core/assets/bundles/bundle_de.properties index f5c047f326..6c937b3e0c 100644 --- a/core/assets/bundles/bundle_de.properties +++ b/core/assets/bundles/bundle_de.properties @@ -4,15 +4,15 @@ contributors = Übersetzer und Mitwirkende discord = Trete dem Mindustry Discord bei! link.discord.description = Der offizielle Mindustry Discord Chatroom link.github.description = Quellcode des Spiels -link.changelog.description = List of update changes +link.changelog.description = Liste von Änderungen link.dev-builds.description = Entwicklungs-Builds (instabil) link.trello.description = Offizielles Trello Board für geplante Features link.itch.io.description = itch.io Seite mit Downloads und der Web-Version des Spiels link.google-play.description = Google Play Store Seite link.wiki.description = Offizelles Mindustry Wiki linkfail = Fehler beim Öffnen des Links!\nDie URL wurde in die Zwischenablage kopiert. -screenshot = Screenshot saved to {0} -screenshot.invalid = Map too large, potentially not enough memory for screenshot. +screenshot = Screenshot gespeichert nach {0} +screenshot.invalid = Karte zu groß! Eventuell nicht ausreichend Arbeitsspeicher für Screenshot. gameover = Der Kern wurde zerstört. gameover.pvp = Das[accent] {0}[] Team ist siegreich! highscore = [YELLOW] Neuer Highscore! @@ -22,12 +22,12 @@ stat.built = Gebäude Gebaut:[accent] {0} stat.destroyed = Gebäude Zerstört:[accent] {0} stat.deconstructed = Gebäude Abgebaut:[accent] {0} stat.delivered = Resources Launched: -stat.rank = Final Rank: [accent]{0} -placeline = You have selected a block.\nYou can[accent] place in a line[] by[accent] holding down your finger for a few seconds[] and dragging in a direction.\nTry it. -removearea = You have selected removal mode.\nYou can[accent] remove blocks in a rectangle[] by[accent] holding down your finger for a few seconds[] and dragging.\nTry it. +stat.rank = Finaler Rang: [accent]{0} +placeline = Du hast einen Block ausgewählt.\nDu kannst[accent] davon eine Reihe bauen,[] indem du[accent] wenige Sekunden mit einem Finger drückst[] und ihn in eine Richtung ziehst.\nVersuch es. +removearea = Du hast den Zerstörungs Modus ausgewählt.\nDu kannst[accent] Blöcke im Rechteck zerstören,[] indem du[accent] wenige Sekunden mit einem Finger drückst[] und ihn ziehst.\nTry it. launcheditems = [accent]Launched Items map.delete = Bist du sicher, dass du die Karte "[accent]{0}[]" löschen möchtest? -level.highscore = High Score: [accent]{0} +level.highscore = Highscore: [accent]{0} level.select = Level Auswahl level.mode = Spielmodus: showagain = Nächstes mal nicht mehr anzeigen @@ -49,10 +49,10 @@ continue = Weiter maps.none = [LIGHT_GRAY]Keine Karten gefunden! about.button = Info name = Name: -noname = Pick a[accent] player name[] first. +noname = Wähle zuerst einen[accent] Spielernamen[]. filename = Dateiname: unlocked = Neuen Block freigeschaltet! -completed = [accent]Completed +completed = [accent]Abgeschlossen techtree = Tech Tree research.list = [LIGHT_GRAY]Forschung: research = Forschung @@ -67,14 +67,14 @@ server.kicked.serverOutdated = Veralteter Server! Bitte den Host um ein Update! server.kicked.banned = Du wurdest vom Server verbannt. server.kicked.recentKick = Du wurdest gerade gekickt.\nWarte bevor du dich wieder verbindest. server.kicked.nameInUse = Es ist bereits ein Spieler \nmit diesem Namen auf dem Server. -server.kicked.nameEmpty = Dein Name muss zumindest einen Buchstaben oder eine Zahl enthalten. +server.kicked.nameEmpty = Dein Name muss mindestens einen Buchstaben oder eine Zahl enthalten. server.kicked.idInUse = Du bist bereits auf dem Server! Anmeldungen mit zwei Accounts sind nicht gestattet. server.kicked.customClient = Der Server akzeptiert keine Custom Builds von Mindustry. Lade dir die offizielle Version herunter. server.kicked.gameover = Game over! 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, dass Mindustry in deinen Firewall Einstellungen Zugriff auf das lokale Netzwerk hat. join.info = Hier kannst du eine [accent]Server IP[] eingeben um dich zu verbinden oder Server im [accent]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. hostserver = Server hosten -hostserver.mobile = Host\nGame +hostserver.mobile = Host\nSpiel host = Host hosting = [accent] Server wird geöffnet... hosts.refresh = Aktualisieren @@ -144,12 +144,12 @@ save.wave = Welle: {0} save.difficulty = Schwierigkeitsgrad: {0} save.date = Zuletzt gespeichert: {0} save.playtime = Spielzeit: {0} -warning = Warning. +warning = Warnung. confirm = Bestätigen delete = Löschen ok = OK open = Öffnen -customize = Customize +customize = Anpassen cancel = Abbruch openlink = Link öffnen copylink = Kopiere Link @@ -159,7 +159,7 @@ loading = [accent]Wird geladen ... saving = [accent]Speichere... wave = [accent]Welle {0} wave.waiting = Welle in {0} -wave.waveInProgress = [LIGHT_GRAY]Wave in progress +wave.waveInProgress = [LIGHT_GRAY]Welle im Gange waiting = Warten... waiting.players = Warte auf Spieler... wave.enemies = [LIGHT_GRAY]{0} Gegner verbleiben @@ -173,8 +173,8 @@ map.delete.confirm = Bist du sicher, dass du diese Karte löschen willst? Die Ak map.random = [accent]Zufällige Karte map.nospawn = Diese Karte hat keine Kerne in denen die Spieler beginnen können! Füge einen [ROYAL]blue[] Kern zu dieser Karte im Editor hinzu. map.nospawn.pvp = Diese Karte hat keine gegnerischen Kerne wo Gegner starten könnten! Füge über den Editor [SCARLET] rote[] Kerne zu dieser Karte hinzu. -map.nospawn.attack = This map does not have any enemy cores for player to attack! Add[SCARLET] red[] cores to this map in the editor. -map.invalid = Fehler beim Laden der Karte: Beschädigtes oder invalide Karten Datei. +map.nospawn.attack = Diese Karte hat keine gengnerischen Kerne, die Spieler angreifen können! Füge über den Editor [SCARLET] rote[] Kerne zu dieser Karte hinzu. +map.invalid = Fehler beim Laden der Karte: Beschädigtes oder ungültige Karten Datei. editor.brush = Pinsel editor.openin = Öffne im Editor editor.oregen = Erze generieren @@ -183,17 +183,17 @@ editor.mapinfo = Karten Info editor.author = Autor: editor.description = Beschreibung: editor.waves = Wellen: -editor.rules = Rules: +editor.rules = Regeln: editor.generation = Generation: -editor.ingame = Edit In-Game -editor.newmap = New Map +editor.ingame = In-Game Bearbeiten +editor.newmap = Neue Karte waves.title = Wellen waves.remove = Entfernen -waves.never = -waves.every = every +waves.never = +waves.every = alle waves.waves = Welle(n) -waves.perspawn = per spawn -waves.to = to +waves.perspawn = per Spawn +waves.to = bis waves.boss = Boss waves.preview = Vorschau waves.edit = Bearbeiten... @@ -201,7 +201,7 @@ waves.copy = Aus der Zwischenablage kopieren waves.load = Aus der Zwischenablage laden waves.invalid = Ungültige Wellen in der Zwischenablage. waves.copied = Wellen kopiert. -waves.none = No enemies defined.\nNote that empty wave layouts will automatically be replaced with the default layout. +waves.none = Keine Gegner definiert.\nInfo: Leere Wellen Entwürfe werden automatisch mit dem standard Entwurf ersetzt. editor.default = [LIGHT_GRAY] edit = Bearbeiten... editor.name = Name: @@ -210,12 +210,12 @@ editor.removeunit = Remove Unit editor.teams = Teams editor.errorload = Fehler beim laden der Datei:\n[accent]{0} editor.errorsave = Fehler beim speichern der Datei:\n[accent]{0} -editor.errorimage = That's an image, not a map. Don't go around changing extensions expecting it to work.\n\nIf you want to import a legacy map, use the 'import legacy map' button in the editor. -editor.errorlegacy = This map is too old, and uses a legacy map format that is no longer supported. -editor.errorheader = This map file is either not valid or corrupt. +editor.errorimage = Das ist ein Bild, keine Karte. Wechsel nicht den Dateityp und erwarte, dass es funktioniert.\n\nWenn du eine alte Karte importieren möchtest, benutze den 'Importiere Terrain Bild' Knopf in dem Editor. +editor.errorlegacy = Diese Karte ist zu alt und benutzt ein veraltetes Karten Format, das nicht mehr unterstützt wird. +editor.errorheader = Diese Karte ist entweder nicht gültig oder beschädigt. editor.errorname = Karte hat keinen Namen. editor.update = Update -editor.randomize = Randomize +editor.randomize = Zufällig Anordnen editor.apply = Anwenden editor.generate = Generieren editor.resize = Grösse\nanpassen @@ -245,35 +245,35 @@ editor.mapname = Karten Name editor.overwrite = [accent] Warnung! Dies überschreibt eine vorhandene Karte. editor.overwrite.confirm = [scarlet]Warnung![] Eine Karte mit diesem Namen existiert bereits. Bist du sicher, dass du sie überschreiben willst? editor.selectmap = Wähle eine Karte zum Laden: -toolmode.replace = Replace -toolmode.replace.description = Draws only on solid blocks. -toolmode.replaceall = Replace All -toolmode.replaceall.description = Replace all blocks in map. -toolmode.orthogonal = Orthogonal -toolmode.orthogonal.description = Draws only orthogonal lines. -toolmode.square = Square -toolmode.square.description = Square brush. -toolmode.eraseores = Erase Ores -toolmode.eraseores.description = Erase only ores. +toolmode.replace = Ersetzen +toolmode.replace.description = Zeichnet nur auf festen Blöcken. +toolmode.replaceall = Alles Ersetzen +toolmode.replaceall.description = Alle Blöcke auf der Karte ersetzen. +toolmode.orthogonal = Rechtwinkelig +toolmode.orthogonal.description = Zeichnet nur rechtwinkelige Linien. +toolmode.square = Quadrat +toolmode.square.description = Quadrat Pinsel. +toolmode.eraseores = Erze löschen +toolmode.eraseores.description = Löscht nur Erze. toolmode.fillteams = Fill Teams toolmode.fillteams.description = Fill teams instead of blocks. toolmode.drawteams = Draw Teams toolmode.drawteams.description = Draw teams instead of blocks. -filters.empty = [LIGHT_GRAY]No filters! Add one with the button below. +filters.empty = [LIGHT_GRAY]Keine Filter! Füge einen mit dem unteren Knopf hinzu. filter.distort = Distort filter.noise = Noise filter.median = Median filter.blend = Blend -filter.defaultores = Default Ores +filter.defaultores = Standard Erze filter.ore = Erz filter.rivernoise = River Noise filter.mirror = Mirror -filter.clear = Clear +filter.clear = Löschen filter.option.ignore = Ignore filter.scatter = Scatter filter.terrain = Terrain filter.option.scale = Scale -filter.option.chance = Chance +filter.option.chance = Wahrscheinlichkeit filter.option.mag = Magnitude filter.option.threshold = Threshold filter.option.circle-scale = Circle Scale @@ -293,7 +293,7 @@ width = Breite: height = Höhe: menu = Menü play = Spielen -campaign = Campaign +campaign = Kampagne load = Laden save = Speichern fps = FPS: {0} @@ -383,14 +383,14 @@ no = Nein info.title = [accent]Info error.title = [crimson] Ein Fehler ist aufgetreten error.crashtitle = Ein Fehler ist aufgetreten! -attackpvponly = [scarlet]Only available in Attack/PvP modes +attackpvponly = [scarlet]Nur in Angriff oder PvP Modus verfügbar. blocks.input = Input blocks.output = Output blocks.booster = Booster block.unknown = [LIGHT_GRAY]??? blocks.powercapacity = Kapazität blocks.powershot = Stromverbrauch/Schuss -blocks.damage = Damage +blocks.damage = Schaden blocks.targetsair = Visiert Luft Einheiten an blocks.targetsground = Visiert Boden Einheiten an blocks.itemsmoved = Bewegungsgeschwindigkeit @@ -434,7 +434,7 @@ bullet.incendiary = [stat]entzündend bullet.homing = [stat]verfolgend bullet.shock = [stat]schock bullet.frag = [stat]explosiv -bullet.knockback = [stat]{0}[lightgray] knockback +bullet.knockback = [stat]{0}[lightgray] zurückstoßend bullet.freezing = [stat]gefrierend bullet.tarred = [stat]geteert bullet.multiplier = [stat]{0}[lightgray]x ammo multiplier diff --git a/core/assets/bundles/bundle_et.properties b/core/assets/bundles/bundle_et.properties new file mode 100644 index 0000000000..8c7c1cf081 --- /dev/null +++ b/core/assets/bundles/bundle_et.properties @@ -0,0 +1,955 @@ +credits.text = [ROYAL]Anuken[] - [SKY]anukendev@gmail.com[] poolt loodud +credits = Tegijad +contributors = Tõlkijad ja panustajad +discord = Liituge Mindustry Discordi serveriga! +link.discord.description = Mindustry ametlik Discordi server +link.github.description = Github mängu koodiga +link.dev-builds.description = Selle mängu pooleli olevad versioonid +link.trello.description = Ametlik Trello leht plaanitud funktsioonide listiga +link.itch.io.description = itch.io leht selle mängu arvuti versioonidega +link.google-play.description = Mindustry Google play's +link.wiki.description = Ametlik Mindustry wiki +linkfail = Linki ebaõnnestus avada!\nAadress kopeeriti +screenshot = Kuvatõmme salvestati {0} +screenshot.invalid = Maailm liiga suur, tõenäoliselt pole piisavalt mälu salvestamiseks +gameover = Mäng Läbi +gameover.pvp = [accent] {0}[] tiim võitis! +highscore = [accent]Uus rekord! + +stat.wave = Raund:[accent] {0} +stat.enemiesDestroyed = Vaenlasi hävitatud:[accent] {0} +stat.built = Ehitisi ehitatud:[accent] {0} +stat.destroyed = Ehitisi hävitatud:[accent] {0} +stat.deconstructed = Ehitisi lahtivõetud:[accent] {0} +stat.delivered = Materjale kaasa võetud: +stat.rank = Lõplik Hinne: [accent]{0} + +placeline = Sa valisid ehitise\nSa saad[accent] panna neid sirges reas[] hoides näpuga all ja, siis viibates mõnes suunas.\n\n[scarlet] TEE SEDA +removearea = Sa valisid hävitamise funktsiooni.\nsa saad[accent] hävitada[]hoides oma sõrme all mõne sekundi ja, siis viibates mõnele poole.\n\n[scarlet]TEE SEDA + +launcheditems = [accent]Kaasa võetud materjalid +map.delete = Kas oled kindel, et soovid kustutada "[accent]{0}[]". +level.highscore = Rekord: [accent]{0} +level.select = Taseme valik +level.mode = Mänguviisi valik: +showagain = Ära näita järgmine kord +coreattack = < TUUMA RÜNNATAKSE! >\nMAYDAY MAYDAY +nearpoint = [[ [scarlet]LAHKU VAENLASTE LANGEMISE ALALT VIIVITAMATA[] ]\npeatselt hävinemine +outofbounds = [[ PIIRIDEST VÄLJAS ]\n[]enese hävitamine {0} +database = Tuuma Andmebaas +savegame = Salvesta +loadgame = Lae Mäng +joingame = Liitu +addplayers = Lisa/Eemalda Mängijaid +customgame = Kohandatud Mäng +newgame = Uus Mäng +none = +minimap = Kaart +close = Sule +quit = Lahku +maps = Maailmad +continue = Jätka +maps.none = [LIGHT_GRAY]Ühtegi maailma ei leitud! +about.button = Info +name = Nimi: +noname = Valige[accent] nimi[] kõigepealt. +filename = Faili Nimi: +unlocked = Said lahti uue sisu! +completed = [accent]Tehtud +techtree = Uurimuspuu +research.list = [LIGHT_GRAY]Uuring: +research = Uuri +researched = [LIGHT_GRAY]{0} uuritud. +players = {0} mängijat mängus +players.single = {0} mängija mängus +server.closing = [accent]Serveri sulgemine... +server.kicked.kick = Sind visati serverist välja! +server.kicked.serverClose = Server suletud. +server.kicked.clientOutdated = Aegunud versioon! Uuenda oma mängu! +server.kicked.serverOutdated = Aegunud server! Palu omanikul serverit uuendada! +server.kicked.banned = Sul on keeld seal mängida. +server.kicked.recentKick = Sind visati hiljuti välja.\nOota natuke enne uuesti proovimist. +server.kicked.nameInUse = Keegi sellise nimega\non juba seal serveris. +server.kicked.nameEmpty = Sinu valitud nimi ei sobi. +server.kicked.idInUse = Sa juba oled selles serveris! Kahe kasutajaga liitumine on keelatud. +server.kicked.customClient = See server ei luba modifitseeritud mängu versioone. Lae alla ametlik versioon. +server.kicked.gameover = Mäng läbi! +host.info = [accent]Hosti[] nupp avab serveri pordil [scarlet]6567[]. \nIgaüks samas [LIGHT_GRAY]wifis või kohtvõrgus[] peaks nägema sinu serverit enda serverite nimekirjas.\n\nKui sa tahad, et inimesed saaksid kõikjalt IP aadressi abil liituda, [accent]portide edasisuunamine[] on vajalik.\n\n[LIGHT_GRAY]Märkus: Kui kellelgi on probleeme sinu LAN-mänguga liitumisel, siis tee kindlaks, et sul on Mindustry lubatud oma kohtvõrgus tulemüüri seadetes. +join.info = Siin saad lisada [accent]serveri IP aadressi[] millega liituda, või leida [accent]kohtvõrgu[] servereid millega liituda.\nNii LAN kui ka WAN mitmikmängu toetatakse.\n\n[LIGHT_GRAY]Märkus: Ei ole olemas automaatset üldist serverite listi; kui sa tahad kellegagi liituda IP-aadressiga on sul vaja omaniku IP-aadressi. +hostserver = Hosti Mäng +hostserver.mobile = Hosti\nMäng +host = Hosti +hosting = [accent]Serveri avamine... +hosts.refresh = Värskenda +hosts.discovering = LAN mängude otsimine +server.refreshing = Serveri värskendamine +hosts.none = [lightgray]Kohalikke mänge ei leitud! +host.invalid = [scarlet]Serveriga ei saa ühendust. +trace = Jälita mängijat +trace.playername = Mängija nimi: [accent]{0} +trace.ip = IP: [accent]{0} +trace.id = Isiklik ID: [accent]{0} +trace.mobile = Telefoni Versioon: [accent]{0} +trace.modclient = Modifitseeritud: [accent]{0} +invalidid = Kehtetu kasutaja ID! Saada veateade. +server.bans = Keelatud mängijad +server.bans.none = Keelatud mängijaid ei leitud! +server.admins = Administraatorid +server.admins.none = Administraatoreid ei leitud! +server.add = Lisa Server +server.delete = Oled kindel, et soovid serveri kustutada? +server.hostname = Omanik: {0} +server.edit = Kohanda Serverit +server.outdated = [crimson]Aegunud Server![] +server.outdated.client = [crimson]Aegunud Versioon[] +server.version = [lightgray]Versioon: {0} {1} +server.custombuild = [yellow]Kohandatud Versioon +confirmban = Oled kindel, et soovid mängjale anda keelu siin mängida? +confirmkick = Oled kindel, et soovid mängijat välja visata? +confirmunban = Oled kindel, et soovid sellel mängijal siin uuesti lubada mängida? +confirmadmin = Oled kindel, et soovid mängijale adminstraatori õigused anda? +confirmunadmin = Oled kindel, et soovid mängijalt adminstraatori õigused ära võtta? +joingame.title = Liitu Mänguga +joingame.ip = Aadress: +disconnect = Lahti ühendatud. +disconnect.data = Ebaõnnestus maailma andmeid alla laadida! +connecting = [accent]Ühendamine... +connecting.data = [accent]Laen maailma andmeid alla... +server.port = Port: +server.addressinuse = Aadress on juba kasutuses! +server.invalidport = Kehtetu pordi number! +server.error = [crimson]Viga serverit käivitades: [accent]{0} +save.old = See salvestus on mõeldud mängu vanemale versioonile.\n\n[LIGHT_GRAY]Vanemate salvestuste kasutamist lisatakse kui mängu versioon täielik 4.0 välja tuleb. +save.new = Uus Salvestus +save.overwrite = Oled kindel, et soovid selle salvestuse asendada? +overwrite = Asenda +save.none = Salvestisi ei leitud! +saveload = [accent]Salvestamine... +savefail = Salvestamine ebaõnnestus! +save.delete.confirm = Oled kindel, et seda kustutada soovid?? +save.delete = Kustuta +save.export = Ekspordi +save.import.invalid = [accent]See salvestus on kehtetu! +save.import.fail = [crimson]Ebaõnnestus salvestust importida: [accent]{0} +save.export.fail = [crimson]Ebaõnnestus salvestust eksportida: [accent]{0} +save.import = Impordi Salvestus +save.newslot = Salvestuse Nimi: +save.rename = Nimeta ümber +save.rename.text = Uus nimi: +selectslot = Vali salvestus. +slot = [accent]Koht {0} +save.corrupted = [accent]See salvestus on ära rikutud!\nKui sa just uuendasid mängu, siis on probleem tõenäoliselt kasutatavate salvestuste formaadi muutus ja [scarlet]mitte[] koodi viga. +empty = +on = Sees +off = Väljas +save.autosave = Automaatne salvestamine: {0} +save.map = Maailm: {0} +save.wave = Raund {0} +save.difficulty = Raskusaste: {0} +save.date = Viimati Salvestatud: {0} +save.playtime = Mänguaeg: {0} +warning = Hoiatus. +confirm = Kinnita +delete = Kustuta +ok = OK +open = Ava +customize = Kohanda +cancel = Tühista +openlink = Ava Link +copylink = Kopeeri Link +back = Tagasi +quit.confirm = Oled kindel, et soovid lahkuda? +changelog.title = Muudatused +changelog.loading = Getting changelog... +changelog.error.android = [accent]Note that the changelog sometimes does not work on Android 4.4 and below!\nThis is due to an internal Android bug. +changelog.error.ios = [accent]The changelog is currently not supported in iOS. +changelog.error = [scarlet]Error getting changelog!\nCheck your internet connection. +changelog.current = [yellow][[Current version] +changelog.latest = [accent][[Latest version] +loading = [accent]Laadimine... +saving = [accent]Salvestamine... +wave = [accent]Raund {0} +wave.waiting = [LIGHT_GRAY]Raund {0} sekundi pärast +wave.waveInProgress = [LIGHT_GRAY]Raund käib +waiting = [LIGHT_GRAY]Ootan... +waiting.players = Ootan mängijaid... +wave.enemies = [LIGHT_GRAY]{0} Vastast Alles +wave.enemy = [LIGHT_GRAY]{0} Vastane Alles +loadimage = Lae Pilt +saveimage = Salvesta Pilt +unknown = Tundmatu +custom = Custom +builtin = Sisseehitatud +map.delete.confirm = Are you sure you want to delete this map? This action cannot be undone! +map.random = [accent]Random Map +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. +map.nospawn.pvp = This map does not have any enemy cores for player to spawn into! Add[SCARLET] non-blue[] cores to this map in the editor. +map.nospawn.attack = This map does not have any enemy cores for player to attack! Add[SCARLET] red[] cores to this map in the editor. +map.invalid = Error loading map: corrupted or invalid map file. +editor.brush = Brush +editor.openin = Open In Editor +editor.oregen = Ore Generation +editor.oregen.info = Ore Generation: +editor.mapinfo = Maailma Info +editor.author = Autor: +editor.description = Kirjeldus: +editor.waves = Raundid: +editor.rules = Rules: +editor.ingame = Edit In-Game +waves.title = Raundid +waves.remove = Eemalda +waves.never = +waves.every = iga +waves.waves = Raund(id) +waves.perspawn = per spawn +waves.to = kuni +waves.boss = Boss +waves.preview = Preview +waves.edit = Muuda... +waves.copy = Copy to Clipboard +waves.load = Load from Clipboard +waves.invalid = Invalid waves in clipboard. +waves.copied = Raundid kopeeritud. +editor.default = [LIGHT_GRAY] +edit = Muuda... +editor.name = Nimi: +editor.spawn = Spawn Unit +editor.removeunit = Remove Unit +editor.teams = Tiimid +editor.elevation = Elevation +editor.errorload = Error loading file:\n[accent]{0} +editor.errorsave = Error saving file:\n[accent]{0} +editor.errorimage = That's an image, not a map. Don't go around changing extensions expecting it to work.\n\nIf you want to import a legacy map, use the 'import legacy map' button in the editor. +editor.errorlegacy = This map is too old, and uses a legacy map format that is no longer supported. +editor.errorheader = This map file is either not valid or corrupt. +editor.errorname = Maailma nime pole täpsustatud. +editor.update = Uuenda +editor.randomize = Randomize +editor.apply = Apply +editor.generate = Genereeri +editor.resize = Resize +editor.loadmap = Lae Maailm +editor.savemap = Salvesta maailm +editor.saved = Salvestatud! +editor.save.noname = Your map does not have a name! Set one in the 'map info' menu. +editor.save.overwrite = Your map overwrites a built-in map! Pick a different name in the 'map info' menu. +editor.import.exists = [scarlet]Unable to import:[] a built-in map named '{0}' already exists! +editor.import = Impordi... +editor.importmap = Impordi Maailm +editor.importmap.description = Import an already existing map +editor.importfile = Impordi Fail +editor.importfile.description = Import an external map file +editor.importimage = Import Legacy Image +editor.importimage.description = Import an external map image file +editor.export = Ekspordi... +editor.exportfile = Ekspordi Fail +editor.exportfile.description = Ekspordi maailma fail +editor.exportimage = Export Terrain Image +editor.exportimage.description = Export a map image file +editor.loadimage = Import Terrain +editor.saveimage = Export Terrain +editor.unsaved = [scarlet]You have unsaved changes![]\nAre you sure you want to exit? +editor.resizemap = Resize Map +editor.mapname = Map Name: +editor.overwrite = [accent]Warning!\nThis overwrites an existing map. +editor.overwrite.confirm = [scarlet]Warning![] A map with this name already exists. Are you sure you want to overwrite it? +editor.selectmap = Select a map to load: +filters.empty = [LIGHT_GRAY]No filters! Add one with the button below. +filter.distort = Distort +filter.noise = Noise +filter.ore = Maak +filter.rivernoise = River Noise +filter.scatter = Scatter +filter.terrain = Terrain +filter.option.scale = Scale +filter.option.chance = Chance +filter.option.mag = Magnitude +filter.option.threshold = Threshold +filter.option.circle-scale = Circle Scale +filter.option.octaves = Octaves +filter.option.falloff = Falloff +filter.option.block = Plokk +filter.option.floor = Põrand +filter.option.wall = Sein +filter.option.ore = Maak +filter.option.floor2 = Teine Korrus +filter.option.threshold2 = Secondary Threshold +width = Laius: +height = Kõrgus: +menu = Menüü +play = Mängi +load = Lae +save = Salvesta +fps = FPS: {0} +tps = TPS: {0} +ping = Ping: {0}ms +language.restart = Please restart your game for the language settings to take effect. +settings = Sätted +tutorial = Õpetus +editor = Editor +mapeditor = Map Editor +donate = Anneta +abandon = Abandon +abandon.text = This zone and all its resources will be lost to the enemy. +locked = Locked +complete = [LIGHT_GRAY]Reach: +zone.requirement = Wave {0} in zone {1} +resume = Resume Zone:\n[LIGHT_GRAY]{0} +bestwave = [LIGHT_GRAY]Best Wave: {0} +launch = < LAUNCH > +launch.title = Launch Successful +launch.next = [LIGHT_GRAY]next opportunity at wave {0} +launch.unable = [scarlet]Unable to LAUNCH.[] {0} Enemies. +launch.confirm = This will launch all resources in your core.\nYou will not be able to return to this base. +uncover = Uncover +configure = Configure Loadout +configure.locked = [LIGHT_GRAY]Unlock configuring loadout: Wave {0}. +zone.unlocked = [LIGHT_GRAY]{0} unlocked. +zone.requirement.complete = Wave {0} reached:\n{1} zone requirements met. +zone.config.complete = Wave {0} reached:\nLoadout config unlocked. +zone.resources = Resources Detected: +add = Lisa... +boss.health = Bossi Elud +connectfail = [crimson]Failed to connect to server:\n\n[accent]{0} +error.unreachable = Server unreachable.\nIs the address spelled correctly? +error.invalidaddress = Invalid address. +error.timedout = Timed out!\nMake sure the host has port forwarding set up, and that the address is correct! +error.mismatch = Packet error:\npossible client/server version mismatch.\nMake sure you and the host have the latest version of Mindustry! +error.alreadyconnected = Already connected. +error.mapnotfound = Map file not found! +error.io = Network I/O error. +error.any = Unknown network error. +zone.groundZero.name = Ground Zero +zone.desertWastes.name = Desert Wastes +zone.craters.name = The Craters +zone.frozenForest.name = Frozen Forest +zone.ruinousShores.name = Ruinous Shores +zone.stainedMountains.name = Stained Mountains +zone.desolateRift.name = Desolate Rift +zone.nuclearComplex.name = Nuclear Production Complex +zone.overgrowth.name = Overgrowth +zone.tarFields.name = Tar Fields + +settings.language = Keel +settings.reset = Reset to Defaults +settings.rebind = Rebind +settings.controls = Controls +settings.game = Mäng +settings.sound = Heli +settings.graphics = Graphics +settings.cleardata = Clear Game Data... +settings.clear.confirm = Are you sure you want to clear this data?\nWhat is done cannot be undone! +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. +settings.clearunlocks = Clear Unlocks +settings.clearall = Clear All +paused = [accent]< Paused > +yes =Jah +no = Ei +info.title = Info +error.title = [crimson]An error has occured +error.crashtitle = An error has occured +blocks.input = Sisend +blocks.output = Väljund +blocks.booster = Booster +block.unknown = [LIGHT_GRAY]??? +blocks.powercapacity = Power Capacity +blocks.powershot = Power/Shot +blocks.targetsair = Targets Air +blocks.targetsground = Targets Ground +blocks.itemsmoved = Move Speed +blocks.launchtime = Time Between Launches +blocks.shootrange = Range +blocks.size = Suurus +blocks.liquidcapacity = Liquid Capacity +blocks.powerrange = Energia Ulatus +blocks.poweruse = Energia Kasutus +blocks.powerdamage = Power/Damage +blocks.itemcapacity = Item Capacity +blocks.basepowergeneration = Base Power Generation +blocks.productiontime = Production Time +blocks.repairtime = Block Full Repair Time +blocks.speedincrease = Speed Increase +blocks.range = Ulatus +blocks.drilltier = Drillables +blocks.drillspeed = Base Drill Speed +blocks.boosteffect = Boost Effect +blocks.maxunits = Max Active Units +blocks.health = Health +blocks.buildtime = Build Time +blocks.inaccuracy = Inaccuracy +blocks.shots = Shots +blocks.reload = Shots/Second +blocks.ammo = Laskemoon + +bar.drillspeed = Drill Speed: {0}/s +bar.efficiency = Efficiency: {0}% +bar.powerbalance = Power: {0}/s +bar.poweramount = Power: {0} +bar.poweroutput = Power Output: {0} +bar.items = Items: {0} +bar.liquid = Vedelik +bar.heat = Kuumus +bar.power = Energia +bar.progress = Build Progress +bar.spawned = Units: {0}/{1} +bullet.damage = [stat]{0}[lightgray] damage + +bullet.splashdamage = [stat]{0}[lightgray] area dmg ~[stat] {1}[lightgray] tiles +bullet.incendiary = [stat]incendiary +bullet.homing = [stat]homing +bullet.shock = [stat]shock +bullet.frag = [stat]frag +bullet.knockback = [stat]{0}[lightgray] knockback +bullet.freezing = [stat]freezing +bullet.tarred = [stat]tarred +bullet.multiplier = [stat]{0}[lightgray]x ammo multiplier +bullet.reload = [stat]{0}[lightgray]x fire rate + +unit.blocks = blocks +unit.powersecond = power units/second +unit.liquidsecond = liquid units/second +unit.itemssecond = items/second +unit.liquidunits = liquid units +unit.powerunits = power units +unit.degrees = degrees +unit.seconds = sek +unit.persecond = /s +unit.timesspeed = x kiirus +unit.percent = % +unit.items = asjad +category.general = Üldine +category.power = Energia +category.liquids = Vedelikud +category.items = Asjad +category.crafting = Sisend/Väljund +category.shooting = Tulistamine +category.optional = Optional Enhancements +setting.landscape.name = Lock Landscape +setting.shadows.name = Varjud +setting.animatedwater.name = Animeeritud Vesi +setting.animatedshields.name = Animeeritud Kilbid +setting.antialias.name = Antialias[LIGHT_GRAY] (requires restart)[] +setting.indicators.name = Enemy/Ally Indicators +setting.autotarget.name = Auto-Target +setting.fpscap.name = Max FPS +setting.fpscap.none = None +setting.fpscap.text = {0} FPS +setting.swapdiagonal.name = Always Diagonal Placement +setting.difficulty.training = Treening +setting.difficulty.easy = Lihtne +setting.difficulty.normal = Normaalne +setting.difficulty.hard = Raske +setting.difficulty.insane = Insane +setting.difficulty.name = Difficulty: +setting.screenshake.name = Screen Shake +setting.effects.name = Display Effects +setting.sensitivity.name = Controller Sensitivity +setting.saveinterval.name = Save Interval +setting.seconds = {0} Sekundit +setting.fullscreen.name = Täisekraan +setting.borderlesswindow.name = Borderless Window[LIGHT_GRAY] (may require restart) +setting.fps.name = Show FPS +setting.vsync.name = VSync +setting.lasers.name = Näita Energia Lasereid +setting.pixelate.name = Pixelate[LIGHT_GRAY] (disables animations) +setting.minimap.name = Näita Kaarti +setting.musicvol.name = Heli tase +setting.mutemusic.name = Vaigista muusika +setting.sfxvol.name = SFX Volume +setting.mutesound.name = Mute Sound +setting.crashreport.name = Send Anonymous Crash Reports +setting.chatopacity.name = Chat Opacity +setting.playerchat.name = Display In-Game Chat +keybind.title = Rebind Keys +category.general.name = General +category.view.name = View +category.multiplayer.name = Multiplayer +command.attack = Ründa +command.retreat = Põgene +command.patrol = Patrol +keybind.gridMode.name = Block Select +keybind.gridModeShift.name = Category Select +keybind.press = Vajuta klahvi... +keybind.press.axis = Press an axis or key... +keybind.screenshot.name = Map Screenshot +keybind.move_x.name = Move x +keybind.move_y.name = Move y +keybind.select.name = Select/Shoot +keybind.diagonal_placement.name = Diagonal Placement +keybind.pick.name = Pick Block +keybind.break_block.name = Break Block +keybind.deselect.name = Deselect +keybind.shoot.name = Shoot +keybind.zoom_hold.name = Zoom Hold +keybind.zoom.name = Zoom +keybind.menu.name = Menüü +keybind.pause.name = Paus +keybind.minimap.name = Minimap +keybind.dash.name = Dash +keybind.chat.name = Chat +keybind.player_list.name = Player list +keybind.console.name = Console +keybind.rotate.name = Rotate +keybind.toggle_menus.name = Toggle menus +keybind.chat_history_prev.name = Chat history prev +keybind.chat_history_next.name = Chat history next +keybind.chat_scroll.name = Chat scroll +keybind.drop_unit.name = Drop Unit +keybind.zoom_minimap.name = Zoom minimap +mode.help.title = Description of modes +mode.survival.name = Survival +mode.survival.description = The normal mode. Limited resources and automatic incoming waves. +mode.sandbox.name = Liivakast +mode.sandbox.description = Infinite resources and no timer for waves. +mode.pvp.name = PvP +mode.pvp.description = Fight against other players locally. +mode.attack.name = Attack +mode.attack.description = Destroy the enemy's base. No waves. +mode.custom = Kohandatud Reeglid + +rules.infiniteresources = Infinite Resources +rules.wavetimer = Wave Timer +rules.waves = Raundi +rules.enemyCheat = Infinite AI (Red Team) Resources +rules.unitdrops = Unit Drops +rules.unitbuildspeedmultiplier = Unit Production Speed Multiplier +rules.unithealthmultiplier = Unit Health Multiplier +rules.playerhealthmultiplier = Player Health Multiplier +rules.playerdamagemultiplier = Player Damage Multiplier +rules.unitdamagemultiplier = Unit Damage Multiplier +rules.enemycorebuildradius = Enemy Core No-Build Radius:[LIGHT_GRAY] (tiles) +rules.respawntime = Respawn Time:[LIGHT_GRAY] (sec) +rules.wavespacing = Wave Spacing:[LIGHT_GRAY] (sec) +rules.buildcostmultiplier = Build Cost Multiplier +rules.buildspeedmultiplier = Build Speed Multiplier +rules.waitForWaveToEnd = Waves wait for enemies +rules.dropzoneradius = Drop Zone Radius:[LIGHT_GRAY] (tiles) +rules.respawns = Max respawns per wave +rules.limitedRespawns = Limit Respawns +rules.title.waves = Raundid +rules.title.respawns = Respawns +rules.title.resourcesbuilding = Resources & Building +rules.title.player = Mängijad +rules.title.enemy = Vastased +rules.title.unit = Units + +content.item.name = Asjad +content.liquid.name = Vedelikud +content.unit.name = Units +content.block.name = Plokid +content.mech.name = Mechs +item.copper.name = Vask +item.copper.description = A useful structure material. Used extensively in all types of blocks. +item.lead.name = Plii +item.lead.description = A basic starter material. Used extensively in electronics and liquid transportation blocks. +item.coal.name = Süsi +item.coal.description = A common and readily available fuel. +item.graphite.name = Grafiit +item.titanium.name = Titaanium +item.titanium.description = A rare super-light metal used extensively in liquid transportation, drills and aircraft. +item.thorium.name = Toorium +item.thorium.description = A dense, radioactive metal used as structural support and nuclear fuel. +item.silicon.name = Silikoon +item.silicon.description = An extremely useful semiconductor, with applications in solar panels and many complex electronics. +item.plastanium.name = Plastaanium +item.plastanium.description = A light, ductile material used in advanced aircraft and fragmentation ammunition. +item.phase-fabric.name = Faasriie +item.phase-fabric.description = A near-weightless substance used in advanced electronics and self-repairing technology. +item.surge-alloy.name = Surge Alloy +item.surge-alloy.description = An advanced alloy with unique electrical properties. +item.spore-pod.name = Spore Pod +item.spore-pod.description = Used for conversion into oil, explosives and fuel. +item.sand.name = Liiv +item.sand.description = A common material that is used extensively in smelting, both in alloying and as a flux. +item.blast-compound.name = Blast Compound +item.blast-compound.description = A volatile compound used in bombs and explosives. While it can burned as fuel, this is not advised. +item.pyratite.name = Pyratite +item.pyratite.description = An extremely flammable substance used in incendiary weapons. +item.metaglass.name = Metaglass +item.metaglass.description = A super-tough glass compound. Extensively used for liquid distribution and storage. +item.scrap.name = Scrap +item.scrap.description = Leftover remnants of old structures and units. Contains trace amounts of many different metals. +liquid.water.name = Vesi +liquid.slag.name = Slag +liquid.oil.name = Nafta +liquid.cryofluid.name = Cryofluid +mech.alpha-mech.name = Alpha +mech.alpha-mech.weapon = Heavy Repeater +mech.alpha-mech.ability = Regeneration +mech.alpha-mech.description = The standard mech. Has decent speed and damage output. +mech.delta-mech.name = Delta +mech.delta-mech.weapon = Arc Generator +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.tau-mech.name = Tau +mech.tau-mech.weapon = Restruct Laser +mech.tau-mech.ability = Repair Burst +mech.tau-mech.description = The support mech. Heals allied blocks by shooting at them. Can heal allies in a radius with its repair ability. +mech.omega-mech.name = Omega +mech.omega-mech.weapon = Swarm Missiles +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.dart-ship.name = Dart +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.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.weapon = Burst Missiles +mech.javelin-ship.ability = Discharge Booster +mech.trident-ship.name = Trident +mech.trident-ship.description = A heavy bomber. Reasonably well armored. +mech.trident-ship.weapon = Bomb Bay +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.weapon = Flame Repeater +item.explosiveness = [LIGHT_GRAY]Explosiveness: {0}% +item.flammability = [LIGHT_GRAY]Flammability: {0}% +item.radioactivity = [LIGHT_GRAY]Radioactivity: {0}% +unit.health = [LIGHT_GRAY]Health: {0} +unit.speed = [LIGHT_GRAY]Speed: {0} +mech.weapon = [LIGHT_GRAY]Weapon: {0} +mech.health = [LIGHT_GRAY]Health: {0} +mech.itemcapacity = [LIGHT_GRAY]Item Capacity: {0} +mech.minespeed = [LIGHT_GRAY]Mining Speed: {0}% +mech.minepower = [LIGHT_GRAY]Mining Power: {0} +mech.ability = [LIGHT_GRAY]Ability: {0} +mech.buildspeed = [LIGHT_GRAY]Building Speed: {0}% +liquid.heatcapacity = [LIGHT_GRAY]Heat Capacity: {0} +liquid.viscosity = [LIGHT_GRAY]Viscosity: {0} +liquid.temperature = [LIGHT_GRAY]Temperature: {0} + +block.grass.name = Grass +block.salt.name = Salt +block.saltrocks.name = Salt Rocks +block.pebbles.name = Pebbles +block.tendrils.name = Tendrils +block.sandrocks.name = Sand Rocks +block.spore-pine.name = Spore Pine +block.sporerocks.name = Spore Rocks +block.rock.name = Kivi +block.snowrock.name = Lumekivi +block.shale.name = Shale +block.shale-boulder.name = Shale Boulder +block.moss.name = Moss +block.shrubs.name = Shrubs +block.spore-moss.name = Spore Moss +block.shalerocks.name = Shale Rocks +block.scrap-wall.name = Scrap Wall +block.scrap-wall-large.name = Large Scrap Wall +block.scrap-wall-huge.name = Huge Scrap Wall +block.scrap-wall-gigantic.name = Gigantic Scrap Wall +block.thruster.name = Thruster +block.kiln.name = Kiln +block.kiln.description = Smelts sand and lead into metaglass. Requires small amounts of power. +block.graphite-press.name = Graphite Press +block.multi-press.name = Multi-Press +block.constructing = {0} [LIGHT_GRAY](Constructing) +block.spawn.name = Enemy Spawn +block.core-shard.name = Core: Shard +block.core-foundation.name = Core: Foundation +block.core-nucleus.name = Core: Nucleus +block.deepwater.name = Deep Water +block.water.name = Water +block.tainted-water.name = Tainted Water +block.darksand-tainted-water.name = Dark Sand Tainted Water +block.tar.name = Tar +block.stone.name = Stone +block.sand.name = Sand +block.darksand.name = Dark Sand +block.ice.name = Ice +block.snow.name = Snow +block.craters.name = Craters +block.sand-water.name = Sand water +block.darksand-water.name = Dark Sand Water +block.char.name = Char +block.holostone.name = Holo stone +block.ice-snow.name = Ice Snow +block.rocks.name = Rocks +block.icerocks.name = Ice rocks +block.snowrocks.name = Snow Rocks +block.dunerocks.name = Dune Rocks +block.pine.name = Pine +block.white-tree-dead.name = White Tree Dead +block.white-tree.name = White Tree +block.spore-cluster.name = Spore Cluster +block.metal-floor.name = Metal Floor 1 +block.metal-floor-2.name = Metal Floor 2 +block.metal-floor-3.name = Metal Floor 3 +block.metal-floor-5.name = Metal Floor 4 +block.metal-floor-damaged.name = Metal Floor Damaged +block.dark-panel-1.name = Dark Panel 1 +block.dark-panel-2.name = Dark Panel 2 +block.dark-panel-3.name = Dark Panel 3 +block.dark-panel-4.name = Dark Panel 4 +block.dark-panel-5.name = Dark Panel 5 +block.dark-panel-6.name = Dark Panel 6 +block.dark-metal.name = Dark Metal +block.ignarock.name = Igna Rock +block.hotrock.name = Hot Rock +block.magmarock.name = Magma Rock +block.cliffs.name = Cliffs +block.copper-wall.name = Copper Wall +block.copper-wall-large.name = Large Copper Wall +block.titanium-wall.name = Titanium Wall +block.titanium-wall-large.name = Large Titanium Wall +block.phase-wall.name = Phase Wall +block.phase-wall-large.name = Large Phase Wall +block.thorium-wall.name = Thorium Wall +block.thorium-wall-large.name = Large Thorium Wall +block.door.name = Door +block.door-large.name = Large Door +block.duo.name = Duo +block.scorch.name = Scorch +block.scatter.name = Scatter +block.hail.name = Hail +block.lancer.name = Lancer +block.conveyor.name = Conveyor +block.titanium-conveyor.name = Titanium Conveyor +block.junction.name = Junction +block.router.name = Router +block.distributor.name = Distributor +block.sorter.name = Sorter +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.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.silicon-smelter.name = Silicon Smelter +block.phase-weaver.name = Phase Weaver +block.pulverizer.name = Pulverizer +block.cryofluidmixer.name = Cryofluid Mixer +block.melter.name = Melter +block.incinerator.name = Incinerator +block.spore-press.name = Spore Press +block.separator.name = Separator +block.coal-centrifuge.name = Coal Centrifuge +block.power-node.name = Power Node +block.power-node-large.name = Large Power Node +block.surge-tower.name = Surge Tower +block.battery.name = Battery +block.battery-large.name = Large Battery +block.combustion-generator.name = Combustion Generator +block.turbine-generator.name = Turbine Generator +block.differential-generator.name = Differential Generator +block.impact-reactor.name = Impact Reactor +block.mechanical-drill.name = Mechanical Drill +block.pneumatic-drill.name = Pneumatic Drill +block.laser-drill.name = Laser Drill +block.water-extractor.name = Water Extractor +block.cultivator.name = Cultivator +block.dart-mech-pad.name = Alpha Mech Pad +block.delta-mech-pad.name = Delta Mech Pad +block.javelin-ship-pad.name = Javelin Ship Pad +block.trident-ship-pad.name = Trident Ship Pad +block.glaive-ship-pad.name = Glaive Ship Pad +block.omega-mech-pad.name = Omega Mech Pad +block.tau-mech-pad.name = Tau Mech Pad +block.conduit.name = Conduit +block.mechanical-pump.name = Mechanical Pump +block.item-source.name = Item Source +block.item-void.name = Item Void +block.liquid-source.name = Liquid Source +block.power-void.name = Power Void +block.power-source.name = Power Infinite +block.unloader.name = Unloader +block.vault.name = Vault +block.wave.name = Laine +block.swarmer.name = Swarmer +block.salvo.name = Salvo +block.ripple.name = Ripple +block.phase-conveyor.name = Phase Conveyor +block.bridge-conveyor.name = Bridge Conveyor +block.plastanium-compressor.name = Plastanium Compressor +block.pyratite-mixer.name = Pyratite Mixer +block.blast-mixer.name = Blast Mixer +block.solar-panel.name = Solar Panel +block.solar-panel-large.name = Large Solar Panel +block.oil-extractor.name = Oil Extractor +block.spirit-factory.name = Spirit Drone Factory +block.phantom-factory.name = Phantom Drone Factory +block.wraith-factory.name = Wraith Fighter Factory +block.ghoul-factory.name = Ghoul Bomber Factory +block.dagger-factory.name = Dagger Mech Factory +block.crawler-factory.name = Crawler Mech Factory +block.titan-factory.name = Titan Mech Factory +block.fortress-factory.name = Fortress Mech Factory +block.revenant-factory.name = Revenant Fighter Factory +block.repair-point.name = Repair Point +block.pulse-conduit.name = Pulse Conduit +block.phase-conduit.name = Phase Conduit +block.liquid-router.name = Liquid Router +block.liquid-tank.name = Liquid Tank +block.liquid-junction.name = Liquid Junction +block.bridge-conduit.name = Bridge Conduit +block.rotary-pump.name = Rotary Pump +block.thorium-reactor.name = Thorium Reactor +block.mass-driver.name = Mass Driver +block.blast-drill.name = Airblast Drill +block.thermal-pump.name = Thermal Pump +block.thermal-generator.name = Thermal Generator +block.alloy-smelter.name = Alloy Smelter +block.mender.name = Mender +block.mend-projector.name = Mend Projector +block.surge-wall.name = Surge Wall +block.surge-wall-large.name = Large Surge Wall +block.cyclone.name = Cyclone +block.fuse.name = Fuse +block.shock-mine.name = Shock Mine +block.overdrive-projector.name = Overdrive Projector +block.force-projector.name = Force Projector +block.arc.name = Arc +block.rtg-generator.name = RTG Generator +block.spectre.name = Spectre +block.meltdown.name = Meltdown +block.container.name = Container +block.launch-pad.name = Launch Pad +block.launch-pad.description = Launches batches of items without any need for a core launch. Unfinished. +block.launch-pad-large.name = Large Launch Pad +team.blue.name = sinine +team.red.name = punane +team.orange.name = oranž +team.none.name = hall +team.green.name = roheline +team.purple.name = lilla +unit.spirit.name = Spirit Drone +unit.spirit.description = The starter drone unit. Spawns in the core by default. Automatically mines ores and repairs blocks. +unit.phantom.name = Phantom Drone +unit.phantom.description = An advanced drone unit. Automatically mines ores and repairs blocks. Significantly more effective than a spirit drone. +unit.dagger.name = Dagger +unit.dagger.description = A basic ground unit. Useful in swarms. +unit.crawler.name = Crawler +unit.titan.name = Titan +unit.titan.description = An advanced, armored ground unit. Attacks both ground and air targets. +unit.ghoul.name = Ghoul Bomber +unit.ghoul.description = A heavy carpet bomber. +unit.wraith.name = Wraith Fighter +unit.wraith.description = A fast, hit-and-run interceptor unit. +unit.fortress.name = Fortress +unit.fortress.description = A heavy artillery ground unit. +unit.revenant.name = Revenant +unit.eruptor.name = Eruptor +unit.chaos-array.name = Chaos Array +unit.eradicator.name = Eradicator +unit.lich.name = Lich +unit.reaper.name = Reaper +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.conveyor = [accent]Conveyors[] are used to transport items to the core.\nMake a line of conveyors from the drill to the core. +tutorial.morecopper = More copper is required.\n\nEither mine it manually, or place more drills. +tutorial.turret = Defensive structures must be built to repel the[LIGHT_GRAY] enemy[].\nBuild a duo turret near your base. +tutorial.drillturret = Duo turrets require[accent] copper ammo []to shoot.\nPlace a drill next to the turret to supply it with mined copper. +tutorial.waves = The[LIGHT_GRAY] enemy[] approaches.\n\nDefend your core for 2 waves. Build more turrets. +tutorial.lead = More ores are available. Explore and mine[accent] lead[].\n\nDrag from your unit to the core to transfer resources. +tutorial.smelter = Copper and lead are weak metals.\nSuperior[accent] Dense Alloy[] can be created in a smelter.\n\nBuild one. +tutorial.densealloy = The smelter will now produce alloy.\nGet some.\nImprove the production if necessary. +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.generator = This technology requires power.\nCreate a[accent] combustion generator[] for it. +tutorial.generatordrill = Combustion generators need fuel.\nFuel it with coal from a drill. +tutorial.node = Power requires transport.\nCreate a[accent] power node[] next to your combustion generator to transfer its power. +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.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.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.battle = The[LIGHT_GRAY] enemy[] has revealed their core.\nDestroy it with your unit and dagger mechs. +block.copper-wall.description = A cheap defensive block.\nUseful for protecting the core and turrets in the first few waves. +block.copper-wall-large.description = A cheap defensive block.\nUseful for protecting the core and turrets in the first few waves.\nSpans multiple tiles. +block.thorium-wall.description = A strong defensive block.\nGood protection from enemies. +block.thorium-wall-large.description = A strong defensive block.\nGood protection from enemies.\nSpans multiple tiles. +block.phase-wall.description = Not as strong as a thorium wall but will deflect bullets unless they are too powerful. +block.phase-wall-large.description = Not as strong as a thorium wall but will deflect bullets unless they are too powerful.\nSpans multiple tiles. +block.surge-wall.description = The strongest defensive block.\nHas a small chance of triggering lightning towards the attacker. +block.surge-wall-large.description = The strongest defensive block.\nHas a small chance of triggering lightning towards the attacker.\nSpans multiple tiles. +block.door.description = A small door that can be opened and closed by tapping on it.\nIf opened, enemies can shoot and move through. +block.door-large.description = A large door that can be opened and closed by tapping on it.\nIf opened, enemies can shoot and move through.\nSpans multiple tiles. +block.mend-projector.description = Periodically heals blocks in its vicinity. +block.overdrive-projector.description = Increases the speed of nearby buildings like drills and conveyors. +block.force-projector.description = Creates a hexagonal force field around itself, protecting buildings and units inside from damage through bullets. +block.shock-mine.description = Damages enemies stepping on the mine. Nearly invisible to the enemy. +block.duo.description = A small, cheap turret. Useful against ground units. +block.scatter.description = A medium-sized anti-air turret. Sprays clumps of lead or scrap flak at enemy units. +block.arc.description = A small close-range turret which shoots electricity in a random arc towards the enemy. +block.hail.description = A small artillery turret. +block.lancer.description = A medium-sized turret which shoots charged electricity beams. +block.wave.description = A medium-sized rapid-fire turret which shoots liquid bubbles. +block.salvo.description = A medium-sized turret which fires shots in salvos. +block.swarmer.description = A medium-sized turret which shoots burst missiles. +block.ripple.description = A large artillery turret which fires several shots simultaneously. +block.cyclone.description = A large rapid fire turret. +block.fuse.description = A large turret which shoots powerful short-range beams. +block.spectre.description = A large turret which shoots two powerful bullets at once. +block.meltdown.description = A large turret which shoots powerful long-range beams. +block.conveyor.description = Basic item transport block. Moves items forward and automatically deposits them into turrets or crafters. Rotatable. +block.titanium-conveyor.description = Advanced item transport block. Moves items faster than standard conveyors. +block.phase-conveyor.description = Advanced item transport block. Uses power to teleport items to a connected phase conveyor over several tiles. +block.junction.description = Acts as a bridge for two crossing conveyor belts. Useful in situations with two different conveyors carrying different materials to different locations. +block.mass-driver.description = Ultimate item transport block. Collects several items and then shoots them to another mass driver over a long range. +block.silicon-smelter.description = Reduces sand with highly pure coal in order to produce silicon. +block.plastanium-compressor.description = Produces plastanium from oil and titanium. +block.phase-weaver.description = Produces phase fabric from radioactive thorium and high amounts of sand. +block.alloy-smelter.description = Produces surge alloy from titanium, lead, silicon and copper. +block.pulverizer.description = Crushes scrap into sand. Useful when there is a lack of natural sand. +block.pyratite-mixer.description = Mixes coal, lead and sand into highly flammable pyratite. +block.blast-mixer.description = Uses oil for transforming pyratite into the less flammable but more explosive blast compound. +block.cryofluidmixer.description = Combines water and titanium into cryofluid which is much more efficient for cooling. +block.melter.description = Melts down scrap into slag for further processing or usage in turrets. +block.incinerator.description = Gets rid of any excess item or liquid. +block.spore-press.description = Compresses spore pods into oil. +block.separator.description = Extracts useful minerals from slag. +block.power-node.description = Transmits power to connected nodes. Up to four power sources, sinks or nodes can be connected. The node will receive power from or supply power to any adjacent blocks. +block.power-node-large.description = Has a larger radius than the power node and connects to up to six power sources, sinks or nodes. +block.battery.description = Stores power whenever there is an abundance and provides power whenever there is a shortage, as long as there is capacity left. +block.battery-large.description = Stores much more power than a regular battery. +block.combustion-generator.description = Generates power by burning oil or flammable materials. +block.turbine-generator.description = More efficient than a combustion generator, but requires additional water. +block.thermal-generator.description = Generates power when placed in hot locations. +block.solar-panel.description = Provides a small amount of power from the sun. +block.solar-panel-large.description = Provides much better power supply than a standard solar panel, but is also much more expensive to build. +block.thorium-reactor.description = Generates huge amounts of power from highly radioactive thorium. Requires constant cooling. Will explode violently if insufficient amounts of coolant are supplied. Power output depends on fullness, with base power generated at full capacity. +block.rtg-generator.description = A radioisotope thermoelectric generator which does not require cooling but provides less power than a thorium reactor. +block.unloader.description = Unloads items from a container, vault or core onto a conveyor or directly into an adjacent block. The type of item to be unloaded can be changed by tapping on the unloader. +block.container.description = Stores a small amount of items of each type. An[LIGHT_GRAY] unloader[] can be used to retrieve items from the container. +block.vault.description = Stores a large amount of items of each type. An[LIGHT_GRAY] unloader[] can be used to retrieve items from the vault. +block.mechanical-drill.description = A cheap drill. When placed on appropriate tiles, outputs items at a slow pace indefinitely. +block.pneumatic-drill.description = An improved drill which is faster and able to process harder materials by making use of air pressure. +block.laser-drill.description = Allows drilling even faster through laser technology, but requires power. Additionally, radioactive thorium can be retrieved with this drill. +block.blast-drill.description = The ultimate drill. Requires large amounts of power. +block.water-extractor.description = Extracts water from the ground. Use it when there is no lake nearby. +block.cultivator.description = Cultivates tiny concentrations of spores into industry-ready pods. +block.oil-extractor.description = Uses large amounts of power in order to extract oil from sand. Use it when there is no direct source of oil nearby. +block.trident-ship-pad.description = Leave your current vessel and change into a reasonably well armored heavy bomber.\nUse the pad by double tapping while standing on it. +block.javelin-ship-pad.description = Leave your current vessel and change into a strong and fast interceptor with lightning weapons.\nUse the pad by double tapping while standing on it. +block.glaive-ship-pad.description = Leave your current vessel and change into a large, well-armored gunship.\nUse the pad by double tapping while standing on it. +block.tau-mech-pad.description = Leave your current vessel and change into a support mech which can heal friendly buildings and units.\nUse the pad by double tapping while standing on it. +block.delta-mech-pad.description = Leave your current vessel and change into a fast, lightly-armored mech made for hit-and-run attacks.\nUse the pad by double tapping while standing on it. +block.omega-mech-pad.description = Leave your current vessel and change into a bulky and well-armored mech, made for front-line assaults.\nUse the pad by double tapping while standing on it. +block.spirit-factory.description = Produces light drones which mine ore and repair blocks. +block.phantom-factory.description = Produces advanced drone units which are significantly more effective than a spirit drone. +block.wraith-factory.description = Produces fast, hit-and-run interceptor units. +block.ghoul-factory.description = Produces heavy carpet bombers. +block.dagger-factory.description = Produces basic ground units. +block.titan-factory.description = Produces advanced, armored ground units. + +block.fortress-factory.description = Produces heavy artillery ground units. +block.revenant-factory.description = Produces heavy laser air units. +block.repair-point.description = Continuously heals the closest damaged unit in its vicinity. +block.conduit.description = Basic liquid transport block. Works like a conveyor, but with liquids. Best used with extractors, pumps or other conduits. +block.pulse-conduit.description = Advanced liquid transport block. Transports liquids faster and stores more than standard conduits. +block.phase-conduit.description = Advanced liquid transport block. Uses power to teleport liquids to a connected phase conduit over several tiles. +block.liquid-router.description = Accepts liquids from one direction and outputs them to up to 3 other directions equally. Can also store a certain amount of liquid. Useful for splitting the liquids from one source to multiple targets. +block.liquid-tank.description = Hoiustab suure hulga vedelikke. Use it for creating buffers when there is a non-constant demand of materials or as a safeguard for cooling vital blocks. +block.liquid-junction.description = Töötab kui sild kahele ristuvale torule. Kasulik situatsioonides kui kaks erinevat toru viivad kahte erinevat vedelikku eri kohtadesse. +block.bridge-conduit.description = Arenenud vedeliku transport. Lubab transportida vedelikke üle iga pinnase ja ehitise 3 ruudu kaugusele. +block.mechanical-pump.description = Odav ja aeglane pump, mis ei vaja elektrit. +block.rotary-pump.description = Kahekordistab kiiruse kasutades elektrit. +block.thermal-pump.description = Ülim pump. +block.router.description = Võtab vastu materjale ühest suunast ja annab neid võrdselt välja kolmes suunas. Kasulik ühest allikast tulevate materjalide jagamisel mitmeks. +block.distributor.description = Arenenud jagaja, mis jagab materjale kuni 7 suunas. +block.bridge-conveyor.description = Arenenud transpordi ehitis. Lubab transportida materjale üle iga pinnase ja ehitise 3 ruudu kaugusele. +block.item-source.description = Annab välja lõpmatult materjale. Ainult liivakastis. +block.liquid-source.description = Annab välja lõpmatult vedelikke. Ainult liivakastis. +block.item-void.description = Hävitab kõik materjalid, mis sinna lähevad elektrit kasutamata. Ainult liivakastis. +block.power-source.description = Annab välja lõpmatult elektrit. Ainult liivakastis. +block.power-void.description = Hävitab kõik materjalid, mis sinna lähevad. Ainult liivakastis. +liquid.water.description = Sageli kasutatud jahutamiseks ja jäätme töötluseks. +liquid.oil.description = Seda saab põleteda, õhku lasta või kasutada jahutamiseks. +liquid.cryofluid.description = Kõige efektiivsem vedelik asjade maha jahutamiseks. diff --git a/core/assets/bundles/bundle_ko.properties b/core/assets/bundles/bundle_ko.properties index 1595564cec..6695221a30 100644 --- a/core/assets/bundles/bundle_ko.properties +++ b/core/assets/bundles/bundle_ko.properties @@ -75,7 +75,7 @@ server.kicked.idInUse = 이미 서버에 접속중입니다! 다중 계정은 server.kicked.customClient = 이 서버는 직접 빌드한 버전을 지원하지 않습니다. 공식 버전을 사용하세요. server.kicked.gameover = 코어가 파괴되었습니다... host.info = [accent]호스트[] 버튼은 현재 네트워크의 [scarlet]6567[] 포트를 사용합니다.\n[LIGHT_GRAY]같은 Wi-Fi 또는 로컬 네트워크[] 에서 서버 목록을 볼 수 있습니다.\n\n만약 플레이어들이 이 IP를 통해 어디에서나 연결할 수 있게 하고 싶다면, 공유기 설정에서 [accent]포트 포워딩[]을 하시거나 Vpn을 사용하셔야 합니다.\n\n[LIGHT_GRAY]참고: LAN 게임 연결에 문제가 있는 사람이 있다면, 방화벽 설정에서 Mindustry 가 로컬 네트워크에 액세스하도록 허용했는지 확인 해 주세요. -join.info = 여기서 [accent]서버 IP[]를 입력하여 다른 서버에 접속할 수 있습니다.\n또는 [accent]로컬 네트워크(LAN)[] 서버를 검색하여 접속할 수 있습니다.\nLAN 및 WAN 멀티 플레이어 모두 지원됩니다.\n\n[LIGHT_GRAY]참고:여기에서는 자동으로 글로벌 서버를 추가하지 않습니다. IP로 다른 사람의 서버에 접속할려면 서버장에게 IP를 요청해야 합니다. +join.info = 여기서 [accent]서버 IP[]를 입력하여 다른 서버에 접속할 수 있습니다.\n또는 [accent]로컬 네트워크(LAN)[] 서버를 검색하여 접속할 수 있습니다.\nLAN 및 WAN 멀티 플레이어 모두 지원됩니다.\n\n[LIGHT_GRAY]참고:여기에서는 자동으로 글로벌 서버를 추가하지 않습니다. IP로 다른 사람의 서버에 접속할려면 서버장에게 IP를 요청해야 합니다.[]\n\n[ROYAL]한국의 공식 서버로는 mindustry.kr의 7000,7001,7002포트와 server1.mindustry.r-e.kr의 8000,8001,8002,8004포트가 있습니다.\n서버 주소 입력방법은 < 주소:포트 >의 형식입니다. hostserver = 서버 열기 hostserver.mobile = 서버\n열기 host = 서버 열기 @@ -157,7 +157,10 @@ cancel = 취소 openlink = 링크 열기 copylink = 링크 복사 back = 뒤로가기 +classic.export = 클래식 데이터 추출 +classic.export.text = Mindustry 클래식 (v3.5 build 40)의 세이브파일 또는 맵 데이터가 발견되었습니다. 이 것들을 Mindustry 클래식 앱에서 사용하기 위해 홈 폴더로 추출할까요? quit.confirm = 정말로 종료하시겠습니까? +quit.confirm.tutorial = 튜토리얼을 종료하시겠습니까?\n튜토리얼은 [accent]설정 -> 게임 -> 튜토리얼[]에서 다시 해보실 수 있습니다. loading = [accent]불러오는중... saving = [accent]저장중... wave = [accent]웨이브 {0} @@ -189,6 +192,7 @@ editor.waves = 웨이브: editor.rules = 규칙: editor.generation = 맵 생성 설정: editor.ingame = 인게임 편집 +editor.newmap = 신규 맵 waves.title = 웨이브 waves.remove = 삭제 waves.never = 여기까지 유닛생성 @@ -210,10 +214,9 @@ editor.name = 이름: editor.spawn = 유닛 생성 editor.removeunit = 유닛 삭제 editor.teams = 팀 -editor.elevation = 지형 높이 editor.errorload = [accent]{0} 파일을 불러오는데 실패했습니다. editor.errorsave = [accent]{0} 파일을 저장하는데 실패했습니다. -editor.errorimage = 이것은 맵이 아니라 사진입니다. 확장자를 바꿔서 시도할 생각하지 마세요.\n\n예전 맵을 가져올려면 편집기의 '예전 맵 가져오기' 버튼을 사용하세요. +editor.errorimage = 이것은 맵이 아니라 사진입니다.\n\n예전 맵을 가져올려면 편집기의 '예전 맵 가져오기' 버튼을 사용하세요. editor.errorlegacy = 이 맵은 너무 오래되어, 더이상 지원하지 않는 맵 형식을 사용합니다. editor.errorheader = 이 맵 파일은 유효하지 않거나 손상되었습니다. editor.errorname = 맵에 이름이 지정되어 있지 않습니다. @@ -309,6 +312,7 @@ ping = Ping: {0}ms language.restart = 언어를 변경하려면 게임을 다시시작 해 주세요. settings = 설정 tutorial = 게임 방법 +tutorial.retake = 튜토리얼 editor = 편집기 mapeditor = 맵 편집기 donate = 기부 @@ -323,8 +327,9 @@ bestwave = [LIGHT_GRAY]최고 점수: {0} launch = < 출격 > launch.title = 출격 성공 launch.next = [LIGHT_GRAY]다음 출격기회는 {0} 단계에서 나타납니다. -launch.unable = [scarlet]출격할 수 없습니다.[] {0}마리 남음. +launch.unable2 = [scarlet]출격할 수 없습니다.[] {0}마리 남음. launch.confirm = 출격하게 되면 모든 자원이 코어로 들어갑니다.\n또한 성공하기 전까지 기지로 돌아갈 수 없습니다. +launch.skip.confirm = 만약 지금 출격하시지 않고 스킵하신다면, 다음 출격 웨이브까지 기다려야 합니다. uncover = 구역 개방 configure = 코어 시작자원 설정 configure.locked = {0} 단계에서 시작자원 설정 잠금이 해제됩니다. @@ -366,7 +371,7 @@ zone.fungalPass.name = 포자 지대 zone.groundZero.description = 이 장소는 다시 시작하기에 최적의 환경을 지닌 장소입니다. 적은 수준의 위협이 있으며 자원의 양은 적습니다.\n가능한 한 많은 양의 구리와 납을 수집하십시오.\n출격합시다! zone.frozenForest.description = 이 지역도 산과 가까운 지역입니다 포자들이 흩뿌려져 있으며 극한의 추위도 포자룰 막을 수 있을거 같지 않습니다.\n전력을 통해서 모험을 시작하십시오 화력 발전소를 짓고 수리드론을 사용하는 법을 배우십시오. -zone.desertWastes.description = 이 황무지는 끝을 알수 없을 정도로 광활합니다 그리고 십자가 형태의 버려진 구조물이 존재합니다.\n석탄이 존재하며 이를 화력발전에 쓰거나 흑연정제에 쓰십시오.\n\n[LOYAL]이 지역에서의 착륙장소는 확실하지 않습니다. +zone.desertWastes.description = 이 황무지는 끝을 알수 없을 정도로 광활합니다 그리고 십자가 형태의 버려진 구조물이 존재합니다.\n석탄이 존재하며 이를 화력발전에 쓰거나 흑연정제에 쓰십시오.\n\n[lightgray]이 지역에서의 착륙장소는 확실하지 않습니다. zone.saltFlats.description = 이 소금 사막은 매우 척박하여 자원이 거의 없습니다.\n하지만 자원이 희소한 이곳에서도 적들의 요새가 발견되었습니다.그들을 사막의 모래로 만들어버리십시오. zone.craters.description = 물이 가득한 이 크레이터에는 옛 전쟁의 유물들이 쌓여있습니다.\n이곳을 다시 점령해 강화유리를 제작하고 물을 끌어올려 포탑과 드릴에 공급하여 더 좋은 효율로 방어선을 강화하십시오. zone.ruinousShores.description = 이 지역은 과거 해안방어기지로 사용되었습니다.\n그러나 지금은 기본구조물만 남아있으니 이 지역을 어서 신속히 수리하여 외부로 세력을 확장한뒤 잃어버린 기술을 다시 회수하십시오. @@ -423,7 +428,6 @@ blocks.speedincrease = 속도 증가 blocks.range = 사거리 blocks.drilltier = 드릴 blocks.drillspeed = 기본 드릴 속도 -blocks.drilltierreq = 더 높은 티어의 드릴이 요구됨. blocks.boosteffect = 가속 효과 blocks.maxunits = 최대 활성유닛 blocks.health = 체력 @@ -433,6 +437,7 @@ blocks.shots = 발포 횟수 blocks.reload = 재장전 blocks.ammo = 탄약 +bar.drilltierreq = 드릴이 요구됨 bar.drillspeed = 채광 속도 : {0}/s bar.efficiency = 효율성 : {0}% bar.powerbalance = 전력 : {0}/s @@ -677,7 +682,7 @@ block.scrap-wall.name = 조각벽 block.scrap-wall-large.name = 큰 조각벽 block.scrap-wall-huge.name = 거대한 조각 벽 block.scrap-wall-gigantic.name = 엄청나게 큰 조각 벽 -block.thruster.name = 반동 +block.thruster.name = 쓰러스터 block.kiln.name = 가마 block.graphite-press.name = 흑연 압축기 block.multi-press.name = 다중 압축기 @@ -724,14 +729,14 @@ block.dark-panel-6.name = 어두운 패널 6 block.dark-metal.name = 어두운 금속제 block.ignarock.name = 얼은 바위 block.hotrock.name = 뜨거운 바위 -block.magmarock.name = 마그마 바위 +block.magmarock.name = 용암 바위 block.cliffs.name = 절벽 block.copper-wall.name = 구리 벽 block.copper-wall-large.name = 대형 구리 벽 block.titanium-wall.name = 티타늄 벽 block.titanium-wall-large.name = 대형 티타늄 벽 block.phase-wall.name = 위상 벽 -block.phase-wall-large.name = 대형 메타 벽 +block.phase-wall-large.name = 대형 위상 벽 block.thorium-wall.name = 토륨 벽 block.thorium-wall-large.name = 대형 토륨 벽 block.door.name = 문 @@ -846,9 +851,9 @@ team.orange.name = 주황색 팀 team.derelict.name = 버려진 팀 team.green.name = 초록색 팀 team.purple.name = 보라색 팀 -unit.spirit.name = 정령 수리 드론 -unit.draug.name = 영혼 채광 -unit.phantom.name = 환영 건설 드론 +unit.spirit.name = 스피릿 수리 드론 +unit.draug.name = 드라우그 채광 드론 +unit.phantom.name = 팬텀 건설 드론 unit.dagger.name = 디거 unit.crawler.name = 자폭자 unit.titan.name = 타이탄 @@ -861,27 +866,27 @@ unit.chaos-array.name = 혼돈 배열 unit.eradicator.name = 박멸 unit.lich.name = 리치 unit.reaper.name = 사신 -tutorial.begin = 플레이어의 주요 목표는 [LIGHT_GRAY]적군[]을 제거하는 것입니다.\n\n이 게임은 [accent]구리를 채광[]하는 것으로 시작합니다.\n이것을 하기 위해 플레이어의 중심부 근처에 있는 구리 광맥을 누르세요. -tutorial.drill = 수동으로 채광하는 것은 효율이 낮습니다.\n[accent]드릴[]은 자동으로 채광 작업을 합니다.\n구리 광맥에 표시된 영역에 드릴을 하나를 놓으세요. -tutorial.conveyor = [accent]컨베이어[]를 사용하여 아이템을 코어로 운반합니다.\n드릴에서 코어까지 컨베이어 라인을 만드세요. -tutorial.morecopper = 더 많은 구리가 필요합니다.\n\n수동으로 채광하거나, 드릴을 더 설치하세요. -tutorial.turret = 방어 구조물은 [LIGHT_GRAY]적[]을 물리치기 위해 반드시 필요합니다.\n기지 근처에 듀오 터렛을 설치하세요. -tutorial.drillturret = 듀오 터렛이 작동하기 위해서는[accent] 구리 탄약 []을 필요로 합니다.\n터렛 옆에 드릴을 설치하여 구리를 공급하세요. -tutorial.waves = [LIGHT_GRAY]적[]이 접근합니다.\n\n2단계 동안 코어를 보호하고 더 많은 터렛을 만드세요. -tutorial.lead = 더 많은 광석을 이용할 수 있습니다. [accent]납[]을 찾아 탐색하세요.\n\n아이템을 코어로 전송할려면 플레이어 기체 또는 비행기에서 코어로 드래그 하세요. -tutorial.smelter = 구리와 납은 약한 금속입니다.\n[accent]고밀도 합금[]은 제련소에서 만들 수 있습니다.\n\n하나 만드세요. -tutorial.densealloy = 이 제련소는 이제 고밀도 합금을 생산할 것입니다.\n몇개 더 생산하세요.\n필요한 경우 더 만드세요. -tutorial.siliconsmelter = 이제 이코어는 채굴과 수리하기 위한[accent] 스피릿 드론[]을 생성 할 것 입니다.\n\n[accent]실리콘[]을 사용해 다른 유닛을 생성하기 위한 공장을 만들 수 있습니다.\n실리콘 제련기를 제작하세요! -tutorial.silicondrill = 실리콘을 제작하려면[accent] 석탄[] 과[accent] 모래[]가 필요합니다.\n드릴을 먼저 건설해보는건 어떤가요? -tutorial.generator = 이 건물은 [LIGHT_YELLOW]전력[]이 필요합니다.\n[accent] 석탄 발전기[]를 건설하세요. -tutorial.generatordrill = [accent] 석탄 발전기[]는 연료가 필요합니다.\n[accent] 석탄[]을 드릴로 채굴해서 연료를 체워주세요. -tutorial.node = 전력은 송신해줄 노드가 필요합니다.\n[accent] 전력 노드[]를 석탄 등등 발전기 옆에 설치해서 생산된 전기를 다른곳으로 송신합시다. -tutorial.nodelink = 전력은 전력 블록과 발전기에 연결하거나, 연결된 전력 노드를 통해 전송이 가능합니다. \n\n전력 노드를 누르고 발전기와 실리콘 제련기를 선택하여 전원을 연결합시다. -tutorial.silicon = 실리콘이 생산되고 있습니다.\n\n생산 시스템의 개선을 권고 드립니다. -tutorial.daggerfactory = 이[accent] 디거 기체 공장[]은\n\n공격하는 기체를 생산하기 위해 사용됩니다. -tutorial.router = 공장을 작동시키기 위해 자원이 필요합니다.\n컨베이어에 운반되고 있는 자원을 분할할 분배기를 만드세요. -tutorial.dagger = 전력 노드를 공장에 연결하세요.\n일단 요구 사항이 충족되면 기체 생산을 시작합니다.\n\n필요에 따라 드릴 및 발전기, 컨베이어를 더 많이 만들 수 있습니다. -tutorial.battle = [LIGHT_GRAY]적[]의 코어가 드러났습니다.\n당신의 부대와 디거를 사용하여 파괴하세요. +tutorial.next = [lightgray]< 이 곳을 터치해 진행하세요. > +tutorial.intro = Mindustry 튜토리얼을 시작하겠습니다. 튜토리얼은 [accent]모바일은 뒤로가기, 데스크탑은 esc버튼[]을 누르고 [accent]나가기 버튼[]을 눌러 종료가 가능합니다.\n[accent]구리[]를 18개 채광하세요. 코어 주위에 있는 주황색의 구리 광물을 터치함으로써 구리를 채광할 수 있습니다.\n\n[accent]현재 모은 구리의 개수 : {0}/{1} 개[] +tutorial.drill = 수동으로 채광하는 것은 효율이 낮습니다.\n[accent]드릴[]은 자동으로 드릴 바로아래에 있는 광물들을 채광합니다.\n드릴 카테고리의 기계식 드릴을 선택하여 구리 광맥위에 설치하세요.\n마우스 오른쪽 버튼으로 취소가 가능합니다. +tutorial.drill.mobile = 수동으로 채광하는 것은 효율이 낮습니다.\n[accent]드릴[]은 자동으로 드릴 바로아래에 있는 광물들을 채광합니다.\n드릴 카테고리의 기계식 드릴을 선택하여 구리 광맥위에 설치하세요.\n취소 버튼을 눌러 건축하기 전의 설계를 취소할 수 있습니다. +tutorial.blockinfo = 블록들은 각각 능력이 다르며, 하위 티어의 드릴은 채광할 수 있는 광물의 종류가 적습니다.\n블럭의 정보를 확인하기 위해서는,[accent] 카테고리의 블럭을 누른 후, "?"버튼을 클릭하여 블럭의 정보를 확인하세요.[]\n[royal]궁금한 블럭의 정보를 아무거나 한 번 확인해보세요. +tutorial.conveyor = [accent]컨베이어[]는 붙어 있는 곳에서 받는 아이템을 코어로 운반합니다.\n드릴에서 코어까지 컨베이어 라인을 만드세요.\n[accent]컨베이어를 클릭 후 건설을 시작하려는 지점을 마우스 왼쪽 버튼으로 꾸욱 누른 뒤[] 드래그하여 설계하세요.\n\n컨베이어 건설 수[accent]{0}/{1}\n[accent]광물을 코어로 운반하세요. +tutorial.conveyor.mobile = [accent]컨베이어[]는 붙어 있는 곳에서 받는 아이템을 코어로 운반합니다.\n드릴에서 코어까지 컨베이어 라인을 만드세요.\n[accent]컨베이어를 화면에 1초정도 클릭하여 작은 노란색 원이 잠깐 나타났다 사라질 때까지 기다리신 후[] 드래그하여 설계하세요.\n\n컨베이어 건설 수[accent]{0}/{1}\n[accent]광물을 코어로 운반하세요. +tutorial.turret = 방어 구조물은 [LIGHT_GRAY]적[]을 물리치기 위해 반드시 필요합니다.\n포탑 카테고리의 듀오 포탑을 선택하신 후, 기지 근처에 듀오 포탑을 설치하세요. +tutorial.drillturret = 듀오 포탑이 공격하기 위해서는[accent] 구리 탄약[]을 필요로 합니다.\n포탑 근처의 구리 광맥에 드릴을 설치하고 컨베이어로 포탑과 이어서 포탑에 구리를 공급하세요.\n또는 직접 코어에서 광물을 꺼내 포탑에 넣을 수 도 있습니다. +tutorial.pause = 싱글 플래이에서는 게임을 [accent]일시정지[]할 수 있습니다.\n일시정지하면 교전과 더불어 건설까지 일시정지됩니다.\n\n[accent]스페이스 버튼[]을 눌러 일시정지하세요. +tutorial.pause.mobile = 싱글 플래이에서는 게임을 [accent]일시정지[]할 수 있습니다.\n일시정지하면 교전과 더불어 건설까지 일시정지됩니다.\n\n[accent]일시정지 버튼[]을 눌러 일시정지하세요. +tutorial.unpause = 게임을 진행하기 위해 [accent]스페이스 버튼[]을 다시 누르세요. +tutorial.unpause.mobile = 게임을 진행하기 위해 같은 위치의 버튼을 다시 누르세요. +tutorial.breaking = 설계를 방해하는 블록을 제거하기 위해서 [accent]첫 번째 지점을 마우스 오른쪽 버튼[]으로 누른 뒤 드래그하여 범위를 지정해서 제거하세요.[]\n\n[accent]코어 근처의 조각 블럭 3개[]를 제거하세요. +tutorial.breaking.mobile = 설계를 방해하는 블록을 제거하기 위해서 [accent]망치 버튼을 눌러 제거모드[]로 변경하신 후, 첫번째 지점을 누른 후 드래그하여 범위를 지정한뒤 V버튼을 클릭해 블럭을 제거하세요.\n\n[accent]코어 근처의 조각 블럭 3개[]를 제거하세요. +tutorial.withdraw = [accent]코어나 창고,공장[]같은 자원을 넣을 수 있는 일부 블럭에서는 직접 자원을 빼낼 수도 있습니다.\n[accent]코어를 클릭 후 자원을 눌러서 자원을 빼내세요. +tutorial.deposit = 자원을 다시 블록에 넣을수도 있습니다.\n\n[accent]당신의 기체에서 코어로 드래그[]하여 자원을 되돌려 넣으세요. +tutorial.waves = [LIGHT_GRAY]적[]이 접근합니다.\n당신의 기체는 적을 향해 클릭하여 공격할 수 있습니다. 또한, 구리를 더 캐내고 포탑을 더 지어서 방어를 강화하세요.\n\n[accent]2단계 동안 코어를 보호하세요.[] +tutorial.waves.mobile = [LIGHT_GRAY]적[]이 접근합니다.\n당신의 기체는 적을 자동조준하지만, 원하는 적을 클릭하여 공격하고 싶은 대상을 바꿀 수 있습니다.\n구리를 더 캐내고 포탑을 더 지어서 방어를 강화하세요.\n\n[accent]2단계동안 코어를 방어하세요.[] +tutorial.launch = 특정 단계에 도달하면 [accent]출격[]이 가능합니다.\n[accent]출격[]을 하게되면 해당 지역의 코어에 들어있는 자원들을 캠페인의 자원 창고로 보내지만, 해당 지역의 [accent]모든 것들[]은 날라가게 되니 주의하세요. + item.copper.description = 모든 종류의 블록에서 광범위하게 사용되는 자원입니다. item.lead.description = 쉽게 구할 수 있으며, 전자 및 액체 수송 블록에서 광범위하게 사용되는 자원입니다. @@ -917,11 +922,11 @@ unit.phantom.description = 첨단 드론 유닛. 플레이어의 건설을 도 unit.dagger.description = 기본 지상 유닛입니다.\n플레이어 기체처럼 드론을 소환하지는 않습니다. unit.crawler.description = 지상 유닛. 적이 가까이에 있으면 폭발합니다. unit.titan.description = 고급 지상 유닛입니다.\n원거리 총 대신에 근접 화염 방사기를 가지고 있으며, 지상과 공중 둘다 공격할 수 있습니다. -unit.ghoul.description = 무겁고 튼튼한 지상 폭격기 입니다.\n주로 적 건물로 이동하여 엄청난 폭격을 가합니다. -unit.wraith.description = 적 핵심 건물 및 유닛을 집중적으로 공격하는 방식을 사용하는 전투기 입니다. unit.fortress.description = 중포 지상 유닛.\n높은 공격력을 가진 총과 높은 체력을 가지고 있습니다. -unit.revenant.description = 플래이어가 생산가능한 최종 공중 전투기. 폭발물을 쓰는 스웜 포탑과 같은 무기를 사용합니다. unit.eruptor.description = 지상 유닛. 광재를 넣은 파도와 같은 무기를 장착했습니다. +unit.wraith.description = 적 핵심 건물 및 유닛을 집중적으로 공격하는 방식을 사용하는 전투기 입니다. +unit.ghoul.description = 무겁고 튼튼한 지상 폭격기 입니다.\n주로 적 건물로 이동하여 엄청난 폭격을 가합니다. +unit.revenant.description = 플래이어가 생산가능한 최종 공중 전투기. 폭발물을 쓰는 스웜 포탑과 같은 무기를 사용합니다. unit.chaos-array.description = 지상 중간보스 유닛. 설금을 넣은 사이클론과 같은 무기를 장착했습니다. unit.eradicator.description = 지상 최종보스 유닛. 토륨을 넣은 스펙터와 같은 무기를 장착했습니다. unit.lich.description = 공중 중간보스 유닛. 리치와 같은 무기를 장착했으나 공격속도가 좀 더 빠릅니다. @@ -996,15 +1001,15 @@ block.differential-generator.description = 냉각수와 파이라타이트의 block.rtg-generator.description = 방사성동위원소 열전기 발전기\n토륨또는 현상 구조체를 사용하며, 냉각이 필요없는 발전을 하지만 토륨 원자로에 비해 발전량이 매우 적습니다. block.solar-panel.description = 태양광으로 극소량의 전기을 생산합니다. block.solar-panel-large.description = 일반 태양 전지판보다 훨씬 나은 발전량이 많지만, 건축비도 훨씬 비쌉니다. -block.thorium-reactor.description = 토륨을 이용해 막대한 양의 전기를 생산합니다. 지속적인 냉각이 필요하며 냉각제의 양이 부족하면 크게 폭발합니다.\n\n[LOYAL]폭발로 인한 피해를 버틸 수 있는 건물은 없습니다. -block.impact-reactor.description = 최첨단 발전기\n폭발물과 냉각수를 이용해 최고의 효율로 매우 많은 양의 전기를 생산할 수 있습니다. 발전을 시작하는데 전기가 필요하며 발전기를 가동하는데 시간이 많이 걸립니다.\n[LOYAL]오버드라이브 프로젝터로 10000이상의 전기를 생산할 수 있으며, 가동중에 전기가 끊기면 가동을 다시 해야되기 때문에 창고,물탱크,배터리 등을 주위에 설치하고 나서 가동하는 것을 추천합니다. +block.thorium-reactor.description = 토륨을 이용해 막대한 양의 전기를 생산합니다. 지속적인 냉각이 필요하며 냉각제의 양이 부족하면 크게 폭발합니다.\n\n[royal]폭발로 인한 피해를 버틸 수 있는 건물은 없습니다. +block.impact-reactor.description = 최첨단 발전기\n폭발물과 냉각수를 이용해 최고의 효율로 매우 많은 양의 전기를 생산할 수 있습니다. 발전을 시작하는데 전기가 필요하며 발전기를 가동하는데 시간이 많이 걸립니다.\n[royal]오버드라이브 프로젝터로 10000이상의 전기를 생산할 수 있으며, 가동중에 전기가 끊기면 가동을 다시 해야되기 때문에 창고,물탱크,배터리 등을 주위에 설치하고 나서 가동하는 것을 추천합니다. block.mechanical-drill.description = 싸구려 드릴. 적절한 타일 위에 놓였을때 매우 느린 속도로 계속 채광합니다.\n\n[ROYAL]구리와 납은 광부 드론으로 대체가 가능합니다. block.pneumatic-drill.description = 기압을 이용하여 보다 빠르게 단단한 물질을 채광할 수 있는 향상된 드릴.\n\n[ROYAL]전기를 사용하지 않는 드릴이라도 물과 오버드라이브를 이용하여 가속할 수 있습니다. block.laser-drill.description = 토륨을 채광할 수 있는 고급 드릴입니다. 전력과 물을 공급하여 빠른 속도로 채광할 수 있습니다.\n\n[ROYAL]드릴아래에 배치된 광물타일의 비율에 따라 채광량이 달라집니다. block.blast-drill.description = 최상위 드릴입니다. 많은량의 전력이 필요합니다.\n\n[ROYAL]물추출기 하나면 충분합니다. block.water-extractor.description = 땅에서 물을 추출합니다. 근처에 호수가 없을 때 사용하세요.\n\n[ROYAL]물추출기의 효율이 달라지는 타일이 있습니다. block.cultivator.description = 소량의 포자를 산업용으로 사용가능한 포자로 배양하는 건물입니다. -block.oil-extractor.description = 대량의 전력과 물을 사용하여 모래에서 기름을 추출합니다. 근처에 직접적인 석유 공급원이 없을때 사용하세요.\n\n[LOYAL]모래 또는 고철을 이용하여 +block.oil-extractor.description = 대량의 전력과 물을 사용하여 모래에서 기름을 추출합니다. 근처에 직접적인 석유 공급원이 없을때 사용하세요.\n\n[royal]모래 또는 고철을 이용하여 block.core-shard.description = 코어의 1단계 형태입니다.\n이것이 파괴되면 플레이하고 있는 지역과의 연결이 끊어지니 적의 공격에 파괴되지 않도록 주의하세요.\n[ROYAL]연결이 끊긴다는 말은 게임오버와 일맥상통합니다. block.core-foundation.description = 코어의 2단계 형태입니다.\n첫 번째 코어보다 더 튼튼하고 더 많은 자원을 저장할 수 있습니다.\n\n[ROYAL]크기도 좀 더 큽니다. block.core-nucleus.description = 코어의 3단계이자 마지막 형태입니다.\n최고로 튼튼하며 막대한 양의 자원들을 저장할 수 있습니다. diff --git a/core/assets/bundles/bundle_pl.properties b/core/assets/bundles/bundle_pl.properties index 1f1b30aeef..02429f0f58 100644 --- a/core/assets/bundles/bundle_pl.properties +++ b/core/assets/bundles/bundle_pl.properties @@ -16,6 +16,7 @@ screenshot.invalid = Zrzut ekranu jest zbyt duży. Najprawdopodobniej brakuje mi gameover = Rdzeń został zniszczony. gameover.pvp = Zwyciężyła drużyna [accent]{0}[]! highscore = [YELLOW] Nowy rekord! + stat.wave = Fale powstrzymane:[accent] {0} stat.enemiesDestroyed = Przeciwnicy zniszczeni:[accent] {0} stat.built = Budynki zbudowane:[accent] {0} @@ -23,8 +24,10 @@ stat.destroyed = Budynki zniszczone:[accent] {0} stat.deconstructed = Budynki zrekonstruowane:[accent] {0} stat.delivered = Surowce wystrzelone: stat.rank = Ocena: [accent]{0} -placeline = You have selected a block.\nYou can[accent] place in a line[] by[accent] holding down your finger for a few seconds[] and dragging in a direction.\nTry it. -removearea = You have selected removal mode.\nYou can[accent] remove blocks in a rectangle[] by[accent] holding down your finger for a few seconds[] and dragging.\nTry it. + +placeline = Wybrałeś blok.\nMożesz umieścić[accent] w linii,[] [accent]przytrzymując palec przez kilka sekund[] i przeciągając.\nSpróbuj. +removearea = Wybrałeś tryb usuwania.\nMożesz[accent] usunąć bloki w prostokoncie,[] [accent]przytrzymując palec przez kilka sekund i przeciągając[] and dragging.\nTry it. + launcheditems = [accent]Wystrzelone przedmioty map.delete = Jesteś pewny, że chcesz usunąć "[accent]{0}[]"? level.highscore = Rekord: [accent]{0} @@ -32,7 +35,7 @@ level.select = Wybrany poziom level.mode = Tryb gry: showagain = Nie pokazuj tego więcej coreattack = < Rdzeń jest atakowany! > -nearpoint = [[ [scarlet]OPUŚĆ PUNKT ZRZUTU NATYCHMIAST[] ]\n unicestwienie nadchodzi +nearpoint = [[ [scarlet]OPUŚĆ PUNKT ZRZUTU NATYCHMIAST[] ]\nunicestwienie nadchodzi database = Centralna baza danych savegame = Zapisz Grę loadgame = Wczytaj grę @@ -199,9 +202,9 @@ waves.preview = Preview waves.edit = Edytuj... waves.copy = Kopiuj do schowka waves.load = Załaduj ze schowka -waves.invalid = Invalid waves in clipboard. +waves.invalid = Nieprawidłowe fale w schowku. waves.copied = Fale zostały skopiowane. -waves.none = No enemies defined.\nNote that empty wave layouts will automatically be replaced with the default layout. +waves.none = Brak zdefiniowanych wrogów.\nPamiętaj, że puste układy fal zostaną automatycznie zastąpione układem domyślnym. editor.default = [LIGHT_GRAY] edit = Edytuj... editor.name = Nazwa: @@ -210,9 +213,9 @@ editor.removeunit = Remove Unit editor.teams = Drużyny editor.errorload = Błąd podczas ładowania pliku:\n[accent]{0} editor.errorsave = Błąd podczas zapisywania pliku:\n[accent]{0} -editor.errorimage = That's an image, not a map. Don't go around changing extensions expecting it to work.\n\nIf you want to import a legacy map, use the 'import legacy map' button in the editor. -editor.errorlegacy = This map is too old, and uses a legacy map format that is no longer supported. -editor.errorheader = This map file is either not valid or corrupt. +editor.errorimage = To obraz, nie mapa. Nie zmieniaj rozszeżenia spodziewając sie że to coś zmieni.\n\nJeśli chcesz zaimportować starszą mapę, użyj przycisku „importuj starszą mapę” w edytorze. +editor.errorlegacy = Ta mapa jest zbyt stara i używa starszego formatu mapy, który nie jest już obsługiwany. +editor.errorheader = Ten plik mapy jest nieprawidłowy lub uszkodzony. editor.errorname = Mapa nie zawiera nazwy. editor.update = Aktualizuj editor.randomize = Losuj @@ -245,30 +248,31 @@ editor.mapname = Nazwa mapy: editor.overwrite = [accent]Uwaga!\nSpowoduje to nadpisanie istniejącej mapy. editor.overwrite.confirm = [scarlet]Uwaga![] Mapa pod tą nazwą już istnieje. Jesteś pewny, że chcesz ją nadpisać? editor.selectmap = Wybierz mapę do załadowania: -toolmode.replace = Replace -toolmode.replace.description = Draws only on solid blocks. -toolmode.replaceall = Replace All -toolmode.replaceall.description = Replace all blocks in map. -toolmode.orthogonal = Orthogonal -toolmode.orthogonal.description = Draws only orthogonal lines. -toolmode.square = Square +toolmode.replace = Zastąp +toolmode.replace.description = Rysuje tylko na stałych blokach. +toolmode.replaceall = Zastąp wszystko +toolmode.replaceall.description = Zastąp wszystkie bloki na mapie. +toolmode.orthogonal = Prostokątny +toolmode.orthogonal.description = Rysuje tylko prostopadłe linie. +toolmode.square = Kwadrat toolmode.square.description = Square brush. -toolmode.eraseores = Erase Ores -toolmode.eraseores.description = Erase only ores. -toolmode.fillteams = Fill Teams -toolmode.fillteams.description = Fill teams instead of blocks. -toolmode.drawteams = Draw Teams -toolmode.drawteams.description = Draw teams instead of blocks. +toolmode.eraseores = Wymaż Rudy +toolmode.eraseores.description = Usuń tylko rudy. +toolmode.fillteams = Wypełń Drużyny +toolmode.fillteams.description = Wypełniaj drużyny zamiast bloków. +toolmode.drawteams = Rysuj Drużyny +toolmode.drawteams.description = Rysuj drużyny zamiast bloków. + filters.empty = [LIGHT_GRAY]Brak filtrów! Dodaj jeden za pomocą przycisku poniżej. -filter.distort = Distort +filter.distort = Zniekształcanie filter.noise = Szum filter.median = Median filter.blend = Blend -filter.defaultores = Default Ores +filter.defaultores = Domyślne rudy filter.ore = Ruda filter.rivernoise = Szum rzeki -filter.mirror = Mirror -filter.clear = Clear +filter.mirror = Lustro +filter.clear = Oczyść filter.option.ignore = Ignore filter.scatter = Zozprosz filter.terrain = Teren @@ -278,17 +282,17 @@ filter.option.mag = Magnituda filter.option.threshold = Próg filter.option.circle-scale = Skala koła filter.option.octaves = Oktawy -filter.option.falloff = Falloff -filter.option.angle = Angle +filter.option.falloff = Spadek +filter.option.angle = Kąt filter.option.block = Blok filter.option.floor = Podłoga -filter.option.flooronto = Target Floor +filter.option.flooronto = Podłoga Docelowa filter.option.wall = Ściana filter.option.ore = Ruda filter.option.floor2 = Druga podłoga filter.option.threshold2 = Secondary Threshold filter.option.radius = Zasięg -filter.option.percentile = Percentile +filter.option.percentile = Percentyl width = Szerokość: height = Wysokość: menu = Menu @@ -305,6 +309,7 @@ tutorial = Poradnik editor = Edytor mapeditor = Edytor map donate = Wspomóż nas + abandon = Opuść abandon.text = Ta strefa i wszystkie jej surowce będą przejęte przez przeciwników. locked = Zablokowane @@ -325,10 +330,11 @@ zone.requirement.complete = Fala {0} osiągnięta:\n{1} Wymagania strefy został zone.config.complete = Fala {0} osiągnięta:\nKonfiguracja ładunku odblokowana. zone.resources = Wykryte Zasoby: zone.objective = [lightgray]Objective: [accent]{0} -zone.objective.survival = Survive -zone.objective.attack = Destroy Enemy Core +zone.objective.survival = Przeżyj +zone.objective.attack = Zniszcz Rdzeń Wroga add = Dodaj... boss.health = Boss Health + connectfail = [crimson]Nie można połączyć się z serwerem:\n\n[accent]{0} error.unreachable = Serwer niedostępny.\nCzy adres jest wpisany poprawnie? error.invalidaddress = Niepoprawny adres. @@ -340,31 +346,34 @@ error.io = Błąd siecowy I/O. error.any = Nieznany błąd sieci. error.bloom = Failed to initialize bloom.\nYour device may not support it. zone.groundZero.name = Wybuch Lądowy -zone.desertWastes.name = Desert Wastes +zone.desertWastes.name = Pustynne Pustkowia zone.craters.name = Kratery zone.frozenForest.name = Zamrożony Las zone.ruinousShores.name = Zniszczone Przybrzerza zone.stainedMountains.name = Zabarwione Góry zone.desolateRift.name = Ponura Szczelina zone.nuclearComplex.name = Centrum Wyrobu Jądrowego -zone.overgrowth.name = Overgrowth -zone.tarFields.name = Tar Fields -zone.saltFlats.name = Salt Flats [scarlet][[WIP] -zone.impact0078.name = Impact 0078 -zone.crags.name = Crags -zone.groundZero.description = The optimal location to begin once more. Low enemy threat. Few resources.\nGather as much lead and copper as possible.\nMove on. -zone.frozenForest.description = Even here, closer to mountains, the spores have spread. The fridgid temperatures cannot contain them forever.\n\nBegin the venture into power. Build combustion generators. Learn to use menders. +zone.overgrowth.name = Przerośnięty Las +zone.tarFields.name = Pola Smołowe +zone.saltFlats.name = Salt Flats +zone.impact0078.name = Uderzenie 0078 +zone.crags.name = Urwisko + +zone.groundZero.description = Optymalna lokalizacja, aby rozpocząć jeszcze raz. Niskie zagrożenie. Niewiele zasobów.\nZbierz jak najwięcej miedzi i ołowiu, tyle ile jest możliwe.\nPrzejdź do następnej strefy jak najszybciej. +zone.frozenForest.description = Nawet tutaj, bliżej gór, zarodniki rozprzestrzeniły się. Niskie temperatury nie mogą ich zatrzymać na zawsze.\n\nRozpocznij przedsięwzięcie od władzy. Buduj generatory spalinowe. Naucz się korzystać z naprawiaczy. zone.desertWastes.description = These wastes are vast, unpredictable, and criss-crossed with derelict sector structures.\nCoal is present in the region. Burn it for power, or synthesize graphite.\n\n[lightgray]This landing location cannot be guaranteed. zone.saltFlats.description = On the outskirts of the desert lie the Salt Flats. Few resources can be found in this location.\n\nThe enemy has erected a resource storage complex here. Eradicate their core. Leave nothing standing. zone.craters.description = Water has accumulated in this crater, relic of the old wars. Reclaim the area. Collect sand. Smelt metaglass. Pump water to cool turrets and drills. zone.ruinousShores.description = Past the wastes, is the shoreline. Once, this location housed a coastal defense array. Not much of it remains. Only the most basic defense structures have remained unscathed, everything else reduced to scrap.\nContinue the expansion outwards. Rediscover the technology. -zone.stainedMountains.description = Further inland lie the mountains, yet untainted by spores.\nExtract the abundant titanium in this area. Learn how to use it.\n\nThe enemy presence is greater here. Do not give them time to send their strongest units. -zone.overgrowth.description = This area is overgrown, closer to the source of the spores.\nThe enemy has established an outpost here. Build dagger units. Destroy it. Reclaim that which was lost. -zone.tarFields.description = The outskirts of an oil production zone, between the mountains and desert. One of the few areas with usable tar reserves.\nAlthough abandoned, this area has some dangerous enemy forces nearby. Do not underestimate them.\n\n[lightgray]Research oil processing technology if possible. -zone.desolateRift.description = An extremely dangerous zone. Plentiful resources, but little space. High risk of destruction. Leave as soon as possible. Do not be fooled by the long spacing between enemy attacks. -zone.nuclearComplex.description = A former facility for the production and processing of thorium, reduced to ruins.\n[lightgray]Research the thorium and its many uses.\n\nThe enemy is present here in great numbers, constantly scouting for attackers. +zone.stainedMountains.description = W głębi lądu leżą góry, jeszcze nieskażone przez zarodniki.\nWydobądź obfity tytan w tym obszarze. Dowiedz się, jak z niego korzystać.\n\nObecność wroga jest tutaj większa. Nie daj im czasu na wysłanie swoich najsilniejszych jednostek. +zone.overgrowth.description = Obszar ten jest zarośnięty, bliżej źródła zarodników.\nWróg założył tu placówkę. Zbuduj jednostki Nóż. Zniszcz to. Odzyskaj to, co nam odebrano. +zone.tarFields.description = Obrzeża strefy produkcji ropy, między górami a pustynią. Jeden z niewielu obszarów z rezerwami użytecznej smoły.\nMimo że ta strefa jest opuszczona, w pobliżu znajdują się niebezpieczne siły wroga. Nie lekceważ ich.\n\n[lightgray]Jeśli to możliwe, zbadaj technologię przetwarzania oleju. +zone.desolateRift.description = Strefa wyjątkowo niebezpieczna. Opfita w zasoby ale mało miejsca. Wysokie ryzyko zniszczenia. Opuść tę strefe jak najszybciej. Nie daj się zwieść długiemu odstępowi między atakami wroga. +zone.nuclearComplex.description = Dawny zakład produkcji i przetwarzania toru, zredukowny do ruin.\n[lightgray]Zbadaj tor i jego zastosowania.\n\nWróg jest tutaj obecny w dużej ilości, nieustannie poszukuje napastników. +zone.fungalPass.description = A transition area between high mountains and lower, spore-ridden lands. A small enemy reconnaissance base is located here.\nDestroy it.\nUse Dagger and Crawler units. Take out the two cores. zone.impact0078.description = zone.crags.description = + settings.language = Język settings.reset = Przywróć domyślne settings.rebind = Zmień @@ -417,6 +426,7 @@ blocks.inaccuracy = Niedokładność blocks.shots = Strzały blocks.reload = Strzałów/sekundę blocks.ammo = Amunicja + bar.drillspeed = Prędkość wiertła: {0}/s bar.efficiency = Efektywność: {0}% bar.powerbalance = Moc: {0} @@ -428,17 +438,19 @@ bar.heat = Ciepło bar.power = Prąd bar.progress = Postęp Budowy bar.spawned = Jednostki: {0}/{1} + bullet.damage = [stat]{0}[lightgray] Obrażenia bullet.splashdamage = [stat]{0}[lightgray] Obrażenia obszarowe ~[stat] {1}[lightgray] kratki bullet.incendiary = [stat]zapalający bullet.homing = [stat]naprowadzający -bullet.shock = [stat]piorunoey +bullet.shock = [stat]piorunowy bullet.frag = [stat]fragmentacyjny bullet.knockback = [stat]{0}[lightgray] odrzut bullet.freezing = [stat]zamrażający bullet.tarred = [stat]smolny bullet.multiplier = [stat]{0}[lightgray]x mnożnik amunicji -bullet.reload = [stat]{0}[lightgray]x fire rate +bullet.reload = [stat]{0}[lightgray]x szybkość ataku + unit.blocks = Klocki unit.powersecond = jednostek prądu na sekundę unit.liquidsecond = jednostek płynów na sekundę @@ -473,16 +485,16 @@ setting.fpscap.text = {0} FPS setting.uiscale.name = UI Scaling[lightgray] (require restart)[] setting.swapdiagonal.name = Pozwala na ukośne stawianie setting.difficulty.training = trening -setting.difficulty.easy = łatwy -setting.difficulty.normal = normalny -setting.difficulty.hard = trudny -setting.difficulty.insane = szalony +setting.difficulty.easy = Łatwy +setting.difficulty.normal = Normalny +setting.difficulty.hard = Trudny +setting.difficulty.insane = Szalony setting.difficulty.name = Poziom trudności setting.screenshake.name = Trzęsienie się ekranu setting.effects.name = Wyświetlanie efektów setting.sensitivity.name = Czułość kontrolera setting.saveinterval.name = Interwał automatycznego zapisywania -setting.seconds = Sekundy +setting.seconds = {0} Sekundy setting.fullscreen.name = Pełny ekran setting.borderlesswindow.name = Bezramkowe okno[LIGHT_GRAY] (może wymagać restartu) setting.fps.name = Pokazuj FPS @@ -547,6 +559,7 @@ mode.pvp.description = Walcz przeciwko innym graczom. mode.attack.name = Atak mode.attack.description = Brak fal, celem jest zniszczenie bazy przeciwnika. mode.custom = Własny tryb + rules.infiniteresources = Nieskończone zasoby rules.wavetimer = Zegar fal rules.waves = Fale @@ -573,6 +586,7 @@ rules.title.resourcesbuilding = Zasoby i Budowanie rules.title.player = Gracze rules.title.enemy = Przeciwnicy rules.title.unit = Jednostki + content.item.name = Przedmioty content.liquid.name = Płyny content.unit.name = Jednostki @@ -588,25 +602,25 @@ item.silicon.name = Krzem item.plastanium.name = Plastan item.phase-fabric.name = Włókno Fazowe item.surge-alloy.name = Energetyczny Stop -item.spore-pod.name = Spore Pod +item.spore-pod.name = Kapsułka Zarodników item.sand.name = Piasek item.blast-compound.name = Wybuchowy związek item.pyratite.name = Piratian item.metaglass.name = Metaszkło -item.scrap.name = Resztki +item.scrap.name = Złom liquid.water.name = Woda -liquid.slag.name = Slag +liquid.slag.name = Żużel liquid.oil.name = Ropa liquid.cryofluid.name = Lodociecz mech.alpha-mech.name = Alpha mech.alpha-mech.weapon = Ciężki Karabin -mech.alpha-mech.ability = Chmara Dronòw +mech.alpha-mech.ability = Regeneracja mech.delta-mech.name = Delta mech.delta-mech.weapon = Generator Piorunów -mech.delta-mech.ability = Rozładunek +mech.delta-mech.ability = Wyładowanie mech.tau-mech.name = Tau mech.tau-mech.weapon = Laser Odbudowy -mech.tau-mech.ability = Wybuch Naprawy +mech.tau-mech.ability = Pole Naprawy mech.omega-mech.name = Omega mech.omega-mech.weapon = Rakiety Chmarowe mech.omega-mech.ability = Układ Obronny @@ -614,7 +628,7 @@ mech.dart-ship.name = Strzałka mech.dart-ship.weapon = Karabin mech.javelin-ship.name = Javelin mech.javelin-ship.weapon = Seria Rakiet -mech.javelin-ship.ability = Dopalacze Prądowe +mech.javelin-ship.ability = Wyładowania Dopalacza mech.trident-ship.name = Trójząb mech.trident-ship.weapon = Wnęka bombowa mech.glaive-ship.name = Glewia @@ -638,25 +652,25 @@ block.sand-boulder.name = Sand Boulder block.grass.name = Trawa block.salt.name = Sól block.saltrocks.name = Skały Solne -block.pebbles.name = Pebbles -block.tendrils.name = Tendrils +block.pebbles.name = Kamyczki +block.tendrils.name = Wić block.sandrocks.name = Skały Piaskowe -block.spore-pine.name = Spore Pine -block.sporerocks.name = Spore Rocks +block.spore-pine.name = Sosna Zarodkowa +block.sporerocks.name = Skała z Zarodkami block.rock.name = Skały block.snowrock.name = Skały śnieżne block.snow-pine.name = Snow Pine -block.shale.name = Shale -block.shale-boulder.name = Shale Boulder +block.shale.name = Łupek +block.shale-boulder.name = Głaz Łupkowy block.moss.name = Mech -block.shrubs.name = Shrubs -block.spore-moss.name = Spore Moss -block.shalerocks.name = Shale Rocks -block.scrap-wall.name = Scrap Wall -block.scrap-wall-large.name = Large Scrap Wall -block.scrap-wall-huge.name = Huge Scrap Wall -block.scrap-wall-gigantic.name = Gigantic Scrap Wall -block.thruster.name = Thruster +block.shrubs.name = Krzewy +block.spore-moss.name = Mech z Zarodkami +block.shalerocks.name = Skały Łupkowe +block.scrap-wall.name = Ściana z Złomu +block.scrap-wall-large.name = Duża Ściana z Złomu +block.scrap-wall-huge.name = Ogromna Ściana z Złomu +block.scrap-wall-gigantic.name = Gigantyczna Ściana z Złomu +block.thruster.name = Silnik block.kiln.name = Wypalarka block.graphite-press.name = Grafitowa Prasa block.multi-press.name = Multi-Prasa @@ -667,8 +681,8 @@ block.core-foundation.name = Rdzeń: Podstawa block.core-nucleus.name = Rdzeń: Jądro block.deepwater.name = Głęboka Woda block.water.name = Woda -block.tainted-water.name = Tainted Water -block.darksand-tainted-water.name = Dark Sand Tainted Water +block.tainted-water.name = Skażona Woda +block.darksand-tainted-water.name = Skażona Woda z Ciemnym Piaskiem block.tar.name = Smoła block.stone.name = Kamień block.sand.name = Piasek @@ -676,8 +690,8 @@ block.darksand.name = Czarny piasek block.ice.name = Lód block.snow.name = Śnieg block.craters.name = Kratery -block.sand-water.name = Sand water -block.darksand-water.name = Dark Sand Water +block.sand-water.name = Woda z Piaskiem +block.darksand-water.name = Woda z Ciemnym Piaskiem block.char.name = Char block.holostone.name = Holo stone block.ice-snow.name = Lodowy Śnieg @@ -685,26 +699,26 @@ block.rocks.name = Skały block.icerocks.name = Lodowe skały block.snowrocks.name = Śnieżne Skały block.dunerocks.name = Dune Rocks -block.pine.name = Pine -block.white-tree-dead.name = White Tree Dead -block.white-tree.name = White Tree -block.spore-cluster.name = Spore Cluster +block.pine.name = Sosna +block.white-tree-dead.name = Białe Drzewo Martwe +block.white-tree.name = Białe Drzewo +block.spore-cluster.name = Grono Zarodków block.metal-floor.name = Metalowa Podłoga block.metal-floor-2.name = Metalowa Podłoga 2 block.metal-floor-3.name = Metalowa Podłoga 3 block.metal-floor-5.name = Metalowa Podłoga 5 block.metal-floor-damaged.name = Uszkodzona Metalowa Podłoga -block.dark-panel-1.name = Dark Panel 1 -block.dark-panel-2.name = Dark Panel 2 -block.dark-panel-3.name = Dark Panel 3 -block.dark-panel-4.name = Dark Panel 4 -block.dark-panel-5.name = Dark Panel 5 -block.dark-panel-6.name = Dark Panel 6 -block.dark-metal.name = Dark Metal -block.ignarock.name = Igna Rock -block.hotrock.name = Hot Rock +block.dark-panel-1.name = Ciemny Panel 1 +block.dark-panel-2.name = Ciemny Panel 2 +block.dark-panel-3.name = Ciemny Panel 3 +block.dark-panel-4.name = Ciemny Panel 4 +block.dark-panel-5.name = Ciemny Panel 5 +block.dark-panel-6.name = Ciemny Panel 6 +block.dark-metal.name = Ciemny Metal +block.ignarock.name = Skała Wulkaniczna +block.hotrock.name = Gorący Kamień block.magmarock.name = Magma Rock -block.cliffs.name = Cliffs +block.cliffs.name = Klify block.copper-wall.name = Miedziana Ściana block.copper-wall-large.name = Duża miedziana ściana block.titanium-wall.name = Tytanowa Ściana @@ -720,6 +734,13 @@ block.scorch.name = Płomień block.scatter.name = Flak block.hail.name = Hail block.lancer.name = Lancer +block.wave.name = Wave +block.swarmer.name = Działo Rojowe +block.salvo.name = Działo Salwowe +block.ripple.name = Działo falowe +block.cyclone.name = Cyklon +block.fuse.name = Lont +block.shock-mine.name = Mina block.conveyor.name = Przenośnik block.titanium-conveyor.name = Tytanowy przenośnik block.junction.name = Węzeł @@ -730,7 +751,7 @@ block.overflow-gate.name = Brama Przeciwprzepełnieniowa block.silicon-smelter.name = Huta Krzemu block.phase-weaver.name = Fazowa Fabryka block.pulverizer.name = Rozkruszacz -block.cryofluidmixer.name = Mieszacz Cryofluidu +block.cryofluidmixer.name = Mieszacz Lodocieczy block.melter.name = Przetapiacz block.incinerator.name = Spalacz block.spore-press.name = Spore Press @@ -742,15 +763,15 @@ block.surge-tower.name = Wieża Energetyczna block.battery.name = Bateria block.battery-large.name = Duża Bateria block.combustion-generator.name = Generator Spalinowy -block.turbine-generator.name = Generator Turbinowy +block.turbine-generator.name = Generator Parowy block.differential-generator.name = Generator Różnicowy block.impact-reactor.name = Reaktor Uderzeniowy block.mechanical-drill.name = Wiertło Mechaniczne block.pneumatic-drill.name = Wiertło Pneumatyczne block.laser-drill.name = Wiertło Laserowe block.water-extractor.name = Ekstraktor Wody -block.cultivator.name = Spluchniacz -block.dart-mech-pad.name = Dart Mech Pad +block.cultivator.name = Spulchniacz +block.dart-mech-pad.name = Lądowisko Mecha Alpha block.delta-mech-pad.name = Lądowisko Mecha Delta block.javelin-ship-pad.name = Lądowisko Statku Oszczep block.trident-ship-pad.name = Lądowisko Statku Trójząb @@ -766,10 +787,6 @@ block.power-void.name = Próżnia prądu block.power-source.name = Nieskończony Prąd block.unloader.name = Wyciągacz block.vault.name = Magazyn -block.wave.name = Działo Płynowe -block.swarmer.name = Działo Rojowe -block.salvo.name = Działo Salwowe -block.ripple.name = Działo falowe block.phase-conveyor.name = Fazowy Transporter block.bridge-conveyor.name = Most Transportowy block.plastanium-compressor.name = Kompresor Plastanu @@ -778,7 +795,7 @@ block.blast-mixer.name = Wybuchowy Mieszacz block.solar-panel.name = Panel Słoneczny block.solar-panel-large.name = Duży Panel Słoneczny block.oil-extractor.name = Ekstraktor Ropy -block.draug-factory.name = Draug Miner Drone Factory +block.draug-factory.name = Fabryka Dronów Draug block.spirit-factory.name = Fabryka Dronów Duch block.phantom-factory.name = Fabryka Dronów Widmo block.wraith-factory.name = Fabryka Wojowników Zjawa @@ -802,13 +819,10 @@ block.blast-drill.name = Wiertło Wybuchowe block.thermal-pump.name = Pompa Termalna block.thermal-generator.name = Generator Termalny block.alloy-smelter.name = Piec Mieszający -block.mender.name = Mender +block.mender.name = Naprawiacz block.mend-projector.name = Projektor Napraw block.surge-wall.name = Ściana Stopu Energetycznego block.surge-wall-large.name = Duża Ściana Stopu Energetycznego -block.cyclone.name = Cyklon -block.fuse.name = Lont -block.shock-mine.name = Mina block.overdrive-projector.name = Projektor Nad-prędkości block.force-projector.name = Projektor Pola Siłowego block.arc.name = Piorun @@ -819,9 +833,9 @@ block.container.name = Kontener block.launch-pad.name = Skocznia block.launch-pad-large.name = Duża skocznia team.blue.name = niebieski -team.red.name = czerwony -team.orange.name = pomarańczowy -team.none.name = szary +team.crux.name = czerwony +team.sharded.name = pomarańczowy +team.derelict.name = szary team.green.name = zielony team.purple.name = fioletowy unit.spirit.name = Duch @@ -832,9 +846,9 @@ unit.crawler.name = Pełzak unit.titan.name = Tytan unit.ghoul.name = Upiór unit.wraith.name = Zjawa -unit.fortress.name = Fortreca -unit.revenant.name = Potwór -unit.eruptor.name = Wysadzać +unit.fortress.name = Forteca +unit.revenant.name = Zjawa +unit.eruptor.name = Roztapiacz unit.chaos-array.name = Kolejka Chaosu unit.eradicator.name = Niszczyciel unit.lich.name = Obudzony @@ -860,6 +874,7 @@ tutorial.daggerfactory = Construct a[accent] dagger mech factory.[]\n\nThis will tutorial.router = Factories need resources to function.\nCreate a router to split conveyor resources. 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.battle = The[LIGHT_GRAY] enemy[] has revealed their core.\nDestroy it with your unit and dagger mechs. + item.copper.description = Przydatny materiał budowlany. Szeroko używany w prawie każdej konstrukcji. item.lead.description = Podstawowy matriał. Używany w przesyle przemiotów i płynów. Nie jest on przypadkiem szkodliwy? item.metaglass.description = Niesamowite silne szkło. Szeroko używane w transporcie i przechowywaniu płynów. @@ -883,7 +898,7 @@ liquid.cryofluid.description = Najefektywniejsza ciecz do schładzania budowli. mech.alpha-mech.description = Standardowy mech. Średnia broń i prędkość, leć potrafi stworzyć trzy małe drony do walki. mech.delta-mech.description = Szybki i wrażliwy mech stworzony do szybkih ataków i ucieczki. Budynką robi prawie nic, leć jest wstanie szybko rozwalić grupę wrogich jednostek piorunami. mech.tau-mech.description = Mech pomocny. Naprawia budynki drużyny, strzelając w nie. Potrafi wygasić niedalekie pożary i uleczyć bliskich przyjaciół. -mech.omega-mech.description = Duży i silny mech, zaprojektowany na ataki. Jego zdolność pozwala mu na zablokowanie do 90% zagrożeń. +mech.omega-mech.description = Duży i silny mech, zaprojektowany na ataki. Jego zdolność pozwala mu na zablokowanie do 90% obrażeń. mech.dart-ship.description = Standardowy statek. Lekki i szybki, ale jest kiepski jak chodzi o walkę i kopanie. mech.javelin-ship.description = Statek do ataku i szybkiej ucieczki. Zaczyna powoli, ale przyspiesza do wielkiej prędkości. Przy tej prędkości, może przelecieć koło wrogiej bazy i atakować piorunami czy rakietami. mech.trident-ship.description = Ciężki bombowiec. Dobrze uzbrojony. @@ -893,12 +908,12 @@ unit.spirit.description = Początkowy dron. Rdzeń zawsze tworzy jeden. Wydobywa unit.phantom.description = Zaawansowany dron. Wydobywa surowce, naprawia budynki oraz pomaga przy budowie szybciej niż dron Duch. unit.dagger.description = Podstawowy mech lądowy. Sam jest słaby, lecz przydatny w dużych ilościach. unit.crawler.description = A ground unit consisting of a stripped-down frame with high explosives strapped on top. Not particular durable. Explodes on contact with enemies. -unit.titan.description = Bardziej zaawansowany mech lądowy. Atakuje cele lądowe i niebne. +unit.titan.description = Bardziej zaawansowany mech lądowy. Atakuje cele lądowe i powietrzne. unit.fortress.description = Wielka jednostka artyleryjna lądowa. unit.eruptor.description = A heavy mech designed to take down structures. Fires a stream of slag at enemy fortifications, melting them and setting volatiles on fire. unit.chaos-array.description = unit.eradicator.description = -unit.wraith.description = Szybka jednostka do ataku i ucieczki. +unit.wraith.description = Szybka jednostka, stosuje taktyke uderz-uciekaj. unit.ghoul.description = Ciężki bombowiec. unit.revenant.description = A heavy, hovering missile array. unit.lich.description = @@ -913,10 +928,10 @@ block.alloy-smelter.description = Produces surge alloy from titanium, lead, sili block.cryofluidmixer.description = Combines water and titanium into cryofluid which is much more efficient for cooling. block.blast-mixer.description = Uses oil for transforming pyratite into the less flammable but more explosive blast compound. block.pyratite-mixer.description = Mixes coal, lead and sand into highly flammable pyratite. -block.melter.description = Melts down scrap into slag for further processing or usage in turrets. -block.separator.description = Extracts useful minerals from slag. +block.melter.description = Przetapia złom na żużel do dalszego przetwarzania lub użycia w wieżyczkach +block.separator.description = Oddziel użyteczne materiały z mieszaniny jaką jest żużel. block.spore-press.description = Compresses spore pods into oil. -block.pulverizer.description = Crushes scrap into sand. Useful when there is a lack of natural sand. +block.pulverizer.description = Mieli złom w drobny piaske. Przydatne, gdy brakuje naturalnego piasku. block.coal-centrifuge.description = Solidifes oil into chunks of coal. block.incinerator.description = Gets rid of any excess item or liquid. block.power-void.description = Niszczy całą energię wprowadzoną do tego bloku. Dostępny tylko w trybie sandbox. @@ -961,12 +976,12 @@ block.liquid-tank.description = Magazynuje ogromne ilości cieczy. Użyj go do s block.liquid-junction.description = Działa jak most dla dwóch krzyżujących się rur. Przydatne w sytuacjach, kiedy dwie rury mają różne ciecze do różnych lokacji. block.bridge-conduit.description = Zaawansowany blok przenoszący ciecze. Pozwala na przenoszenie cieczy nawet do 3 bloków na każdym terenie, przez każdy budynek. block.phase-conduit.description = Zaawansowany blok do przenoszenia cieczy. Używa prądu, aby przenieść ciecz do połączonego transportera fazowego przez kilka bloków. -block.power-node.description = Transmits power to connected nodes. Up to four power sources, sinks or nodes can be connected. The node will receive power from or supply power to any adjacent blocks. +block.power-node.description = Przesyła moc do połączonych węzłów. Można podłączyć do czterech źródeł zasilania, zlewów lub węzłów. Zasila też bloki które go dotykają. block.power-node-large.description = Has a larger radius than the power node and connects to up to six power sources, sinks or nodes. block.surge-tower.description = An extremely long-range power node with fewer available connections. block.battery.description = Stores power whenever there is an abundance and provides power whenever there is a shortage, as long as there is capacity left. block.battery-large.description = Stores much more power than a regular battery. -block.combustion-generator.description = Generates power by burning oil or flammable materials. +block.combustion-generator.description = Wytwarza energię poprzez spalanie łatwopalnych materiałów. block.thermal-generator.description = Generates power when placed in hot locations. block.turbine-generator.description = More efficient than a combustion generator, but requires additional water. block.differential-generator.description = Generates large amounts of energy. Utilizes the temperature difference between cryofluid and burning pyratite. diff --git a/core/assets/bundles/bundle_ru.properties b/core/assets/bundles/bundle_ru.properties index acae9dc403..f2bcb41d25 100644 --- a/core/assets/bundles/bundle_ru.properties +++ b/core/assets/bundles/bundle_ru.properties @@ -44,6 +44,7 @@ newgame = Новая игра none = <ничего> minimap = Мини-карта close = Закрыть +website = Веб-сайт quit = Выход maps = Карты continue = Продолжить @@ -605,7 +606,7 @@ item.blast-compound.name = Взрывная смесь item.pyratite.name = Пиротит item.metaglass.name = Метастекло item.scrap.name = Металлолом -liquid.water.name = Вода +iquid.water.name = Вода liquid.slag.name = Шлак liquid.oil.name = Нефть liquid.cryofluid.name = Криогенная жидкость diff --git a/core/assets/bundles/bundle_se.properties b/core/assets/bundles/bundle_se.properties new file mode 100644 index 0000000000..9f9e81a8e2 --- /dev/null +++ b/core/assets/bundles/bundle_se.properties @@ -0,0 +1,1046 @@ +credits.text = Skapad av [ROYAL]Anuken[] - [SKY]anukendev@gmail.com[] +credits = Credits +contributors = Translators and Contributors +discord = Join the Mindustry Discord! +link.discord.description = The official Mindustry Discord chatroom +link.github.description = Game source code +link.changelog.description = List of update changes +link.dev-builds.description = Unstable development builds +link.trello.description = Official Trello board for planned features +link.itch.io.description = itch.io page with PC downloads +link.google-play.description = Google Play store listing +link.wiki.description = Official Mindustry wiki +linkfail = Failed to open link!\nThe URL has been copied to your clipboard. +screenshot = Screenshot saved to {0} +screenshot.invalid = Map too large, potentially not enough memory for screenshot. +gameover = Game Over +gameover.pvp = The[accent] {0}[] team is victorious! +highscore = [accent]Nytt rekord! + +stat.wave = Waves Defeated:[accent] {0} +stat.enemiesDestroyed = Enemies Destroyed:[accent] {0} +stat.built = Buildings Built:[accent] {0} +stat.destroyed = Buildings Destroyed:[accent] {0} +stat.deconstructed = Buildings Deconstructed:[accent] {0} +stat.delivered = Resources Launched: +stat.rank = Final Rank: [accent]{0} + +placeline = Du har valt ett block.\nDu kan[accent] placera i en linje[] genom att[accent] hålla ner ett finger i några sekunder[] och sedan dra åt ett håll.\n\n[scarlet]GÖR DET. +removearea = Du har valt borttagningsläget.\nDu kan[accent] ta bort block inom en rektangel[] genom att[accent] hålla ner ett finger i några sekunder[] och dra.\n\n[scarlet]GÖR DET. + +launcheditems = [accent]Launched Items +map.delete = Are you sure you want to delete the map "[accent]{0}[]"? +level.highscore = High Score: [accent]{0} +level.select = Level Select +level.mode = Spelläge: +showagain = Visa inte igen nästa session +coreattack = < Kärnan är under attack! > +nearpoint = [[ [scarlet]LÄMNA SLÄPPZONEN OMEDELBART[] ]\ndu dör snart +database = Core Database +savegame = Spara Spel +loadgame = Importera Spel +joingame = Join Game +customgame = Anpassat Spel +newgame = Nytt Spel +none = +minimap = Minikarta +close = Stäng +quit = Avsulta +maps = Kartor +continue = Fortsätt +maps.none = [lightgray]No maps found! +about.button = Om +name = Namn: +noname = Välj ett[accent] namn[] först. +filename = Filnamn: +unlocked = New content unlocked! +completed = [accent]Avklarad +techtree = Tech Tree +research.list = [lightgray]Research: +research = Research +researched = [lightgray]{0} researched. +players = {0} spelare online +players.single = {0} spelare online +server.closing = [accent]Stänger server... +server.kicked.kick = You have been kicked from the server! +server.kicked.serverClose = Server stängd. +server.kicked.clientOutdated = Outdated client! Uppdatera ditt spel! +server.kicked.serverOutdated = Outdated server! Ask the host to update! +server.kicked.banned = Du är bannad från servern. +server.kicked.recentKick = You have been kicked recently.\nWait before connecting again. +server.kicked.nameInUse = Någon med det namnet finns redan\npå servern. +server.kicked.nameEmpty = Ditt namn är ogiltigt. +server.kicked.idInUse = You are already on this server! Connecting with two accounts is not permitted. +server.kicked.customClient = This server does not support custom builds. Ladda ned en officiell verision. +server.kicked.gameover = Game over! +host.info = The [accent]host[] button hosts a server on port [scarlet]6567[]. \nAnybody on the same [lightgray]wifi or local network[] should be able to see your server in their server list.\n\nIf you want people to be able to connect from anywhere by IP, [accent]port forwarding[] is required.\n\n[lightgray]Note: If someone is experiencing trouble connecting to your LAN game, make sure you have allowed Mindustry access to your local network in your firewall settings. Note that public networks sometimes do not allow server discovery. +join.info = 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[lightgray]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. +hostserver = Host Multiplayer Game +hostserver.mobile = Host\nGame +host = Host +hosting = [accent]Öppnar server... +hosts.refresh = Refresh +hosts.discovering = Discovering LAN games +server.refreshing = Refreshing server +hosts.none = [lightgray]No local games found! +host.invalid = [scarlet]Can't connect to host. +trace = Trace Player +trace.playername = Player name: [accent]{0} +trace.ip = IP: [accent]{0} +trace.id = Unique ID: [accent]{0} +trace.mobile = Mobile Client: [accent]{0} +trace.modclient = Custom Client: [accent]{0} +invalidid = Invalid client ID! Submit a bug report. +server.bans = Bans +server.bans.none = Inga bannade spelare hittades! +server.admins = Administratörer +server.admins.none = Inga administratörer hittades! +server.add = Lägg Till Server +server.delete = Är du säker på att du vill ta bort servern? +server.edit = Redigera Server +server.outdated = [crimson]Outdated Server![] +server.outdated.client = [crimson]Outdated Client![] +server.version = [gray]v{0} {1} +server.custombuild = [yellow]Custom Build +confirmban = Are you sure you want to ban this player? +confirmkick = Are you sure you want to kick this player? +confirmunban = Are you sure you want to unban this player? +confirmadmin = Are you sure you want to make this player an admin? +confirmunadmin = Are you sure you want to remove admin status from this player? +joingame.title = Join Game +joingame.ip = Adress: +disconnect = Disconnected. +disconnect.data = Failed to load world data! +connecting = [accent]Ansluter... +connecting.data = [accent]Loading world data... +server.port = Port: +server.addressinuse = Address already in use! +server.invalidport = Ogiltigt portnummer! +server.error = [crimson]Error hosting server: [accent]{0} +save.old = This save is for an older version of the game, and can no longer be used.\n\n[lightgray]Save backwards compatibility will be implemented in the full 4.0 release. +save.new = New Save +save.overwrite = Are you sure you want to overwrite\nthis save slot? +overwrite = Skriv över +save.none = No saves found! +saveload = [accent]Sparar... +savefail = Failed to save game! +save.delete.confirm = Are you sure you want to delete this save? +save.delete = Radera +save.export = Exportera +save.import.invalid = [accent]This save is invalid! +save.import.fail = [crimson]Failed to import save: [accent]{0} +save.export.fail = [crimson]Failed to export save: [accent]{0} +save.import = Importera +save.newslot = Namn: +save.rename = Byt namn +save.rename.text = Nytt namn: +selectslot = Select a save. +slot = [accent]Slot {0} +save.corrupted = [accent]Save file corrupted or invalid!\nIf you have just updated your game, this is probably a change in the save format and [scarlet]not[] a bug. +empty = +on = På +off = Av +save.autosave = Autospara: {0} +save.map = Map: {0} +save.wave = Våg {0} +save.difficulty = Difficulty: {0} +save.date = Last Saved: {0} +save.playtime = Speltid: {0} +warning = Varning. +confirm = Confirm +delete = Radera +ok = OK +open = Öppna +customize = Customize Rules +cancel = Avbryt +openlink = Öppna Länk +copylink = Kopiera Länk +back = Tillbaka +classic.export = Exportera Classic-Data +classic.export.text = Sparad data från Classic (v3.5 build 40) har hittats. Vill du exportera den här datan till telefonens hem-mapp för att använda i Mindustry Classic-appen? +quit.confirm = Är du säker på att du vill avsluta? +quit.confirm.tutorial = Are you sure you know what you're doing?\nThe tutorial can be re-taken in[accent] Settings->Game->Re-Take Tutorial.[] +loading = [accent]Läser in... +saving = [accent]Sparar... +wave = [accent]Våg {0} +wave.waiting = [lightgray]Våg om {0} +wave.waveInProgress = [lightgray]Våg pågår +waiting = [lightgray]Väntar... +waiting.players = Väntar på spelare... +wave.enemies = [lightgray]{0} Fiender Återstår +wave.enemy = [lightgray]{0} Fiende Återstår +loadimage = Load Image +saveimage = Save Image +unknown = Okänd +custom = Anpassad +builtin = Inbyggd +map.delete.confirm = Are you sure you want to delete this map? This action cannot be undone! +map.random = [accent]Random Map +map.nospawn = This map does not have any cores for the player to spawn in! Add a[accent] orange[] core to this map in the editor. +map.nospawn.pvp = This map does not have any enemy cores for player to spawn into! Add[SCARLET] non-orange[] cores to this map in the editor. +map.nospawn.attack = This map does not have any enemy cores for player to attack! Add[SCARLET] red[] cores to this map in the editor. +map.invalid = Error loading map: corrupted or invalid map file. +editor.brush = Pensel +editor.openin = Öppna I Redigeraren +editor.oregen = Malmgenerering +editor.oregen.info = Malmgenerering: +editor.mapinfo = Map Info +editor.author = Skapare: +editor.description = Beskrivning: +editor.waves = Vågor: +editor.rules = Regler: +editor.generation = Generering: +editor.ingame = Edit In-Game +editor.newmap = New Map +waves.title = Vågor +waves.remove = Ta bort +waves.never = +waves.every = var +waves.waves = våg(or) +waves.perspawn = per spawn +waves.to = till +waves.boss = Boss +waves.preview = Förhandsvisning +waves.edit = Ändra... +waves.copy = Kopiera till Urklipp +waves.load = Läs från Urklipp +waves.invalid = Invalid waves in clipboard. +waves.copied = Vågor kopierade. +waves.none = No enemies defined.\nNote that empty wave layouts will automatically be replaced with the default layout. +editor.default = [lightgray] +edit = Redigera... +editor.name = Namn: +editor.spawn = Spawn Unit +editor.removeunit = Remove Unit +editor.teams = Lag +editor.errorload = Error loading file:\n[accent]{0} +editor.errorsave = Error saving file:\n[accent]{0} +editor.errorimage = That's an image, not a map. Don't go around changing extensions expecting it to work.\n\nIf you want to import a legacy map, use the 'import legacy map' button in the editor. +editor.errorlegacy = This map is too old, and uses a legacy map format that is no longer supported. +editor.errorheader = This map file is either not valid or corrupt. +editor.errorname = Map has no name defined. Are you trying to load a save file? +editor.update = Uppdatera +editor.randomize = Slumpa +editor.apply = Verkställ +editor.generate = Generera +editor.resize = Resize +editor.loadmap = Load Map +editor.savemap = Save Map +editor.saved = Sparad! +editor.save.noname = Your map does not have a name! Set one in the 'map info' menu. +editor.save.overwrite = Your map overwrites a built-in map! Pick a different name in the 'map info' menu. +editor.import.exists = [scarlet]Unable to import:[] a built-in map named '{0}' already exists! +editor.import = Importera... +editor.importmap = Importera Karta +editor.importmap.description = Import an already existing map +editor.importfile = Import File +editor.importfile.description = Import an external map file +editor.importimage = Import Legacy Image +editor.importimage.description = Import an external map image file +editor.export = Exportera... +editor.exportfile = Exportera Fil +editor.exportfile.description = Export a map file +editor.exportimage = Export Terrain Image +editor.exportimage.description = Export a map image file +editor.loadimage = Import Terrain +editor.saveimage = Export Terrain +editor.unsaved = [scarlet]You have unsaved changes![]\nAre you sure you want to exit? +editor.resizemap = Resize Map +editor.mapname = Kartnamn: +editor.overwrite = [accent]Warning!\nThis overwrites an existing map. +editor.overwrite.confirm = [scarlet]Warning![] A map with this name already exists. Are you sure you want to overwrite it? +editor.selectmap = Select a map to load: + +toolmode.replace = Byt ut +toolmode.replace.description = Draws only on solid blocks. +toolmode.replaceall = Byt ut alla +toolmode.replaceall.description = Replace all blocks in map. +toolmode.orthogonal = Orthogonal +toolmode.orthogonal.description = Draws only orthogonal lines. +toolmode.square = Square +toolmode.square.description = Square brush. +toolmode.eraseores = Erase Ores +toolmode.eraseores.description = Erase only ores. +toolmode.fillteams = Fyll Lag +toolmode.fillteams.description = Fill teams instead of blocks. +toolmode.drawteams = Rita Lag +toolmode.drawteams.description = Draw teams instead of blocks. + +filters.empty = [lightgray]No filters! Add one with the button below. +filter.distort = Distort +filter.noise = Brus +filter.median = Median +filter.oremedian = Malmmedian +filter.blend = Blend +filter.defaultores = Default Ores +filter.ore = Malm +filter.rivernoise = Flodbrus +filter.mirror = Spegla +filter.clear = Rensa +filter.option.ignore = Ignorera +filter.scatter = Sprid +filter.terrain = Terräng +filter.option.scale = Skala +filter.option.chance = Chans +filter.option.mag = Magnitud +filter.option.threshold = Tröskelvärde +filter.option.circle-scale = Cirkelskala +filter.option.octaves = Oktaver +filter.option.falloff = Falloff +filter.option.angle = Vinkel +filter.option.block = Block +filter.option.floor = Golv +filter.option.flooronto = Target Floor +filter.option.wall = Vägg +filter.option.ore = Malm +filter.option.floor2 = Secondary Floor +filter.option.threshold2 = Secondary Threshold +filter.option.radius = Radie +filter.option.percentile = Percentile + +width = Bredd: +height = Höjd: +menu = Meny +play = Spela +campaign = Campaign +load = Load +save = Spara +fps = FPS: {0} +tps = TPS: {0} +ping = Ping: {0}ms +language.restart = Starta om spelet för att språkinställningarna ska ta effekt. +settings = Inställningar +tutorial = Tutorial +tutorial.retake = Ta Om Tutorial +editor = Editor +mapeditor = Map Editor +donate = Donera + +abandon = Ge upp +abandon.text = Zonen och alla dess resurser förloras till fienden. +locked = Låst +complete = [lightgray]Nå: +zone.requirement = Våg {0} i zon {1} +resume = Fortsätt Zon:\n[lightgray]{0} +bestwave = [lightgray]Bästa Våg: {0} +launch = < LAUNCH > +launch.title = Launch Successful +launch.next = [lightgray]next opportunity at wave {0} +launch.unable2 = [scarlet]Unable to LAUNCH.[] +launch.confirm = This will launch all resources in your core.\nYou will not be able to return to this base. +launch.skip.confirm = If you skip now, you will not be able to launch until later waves. +uncover = Uncover +configure = Configure Loadout +configure.locked = [lightgray]Unlock configuring loadout: Wave {0}. +zone.unlocked = [lightgray]{0} unlocked. +zone.requirement.complete = Wave {0} reached:\n{1} zone requirements met. +zone.config.complete = Wave {0} reached:\nLoadout config unlocked. +zone.resources = [lightgray]Resources Detected: +zone.objective = [lightgray]Objective: [accent]{0} +zone.objective.survival = Survive +zone.objective.attack = Destroy Enemy Core +add = Lägg till... +boss.health = Boss Health + +connectfail = [crimson]Connection error:\n\n[accent]{0} +error.unreachable = Server unreachable.\nIs the address spelled correctly? +error.invalidaddress = Ogiltig adress. +error.timedout = Timed out!\nMake sure the host has port forwarding set up, and that the address is correct! +error.mismatch = Packet error:\npossible client/server version mismatch.\nMake sure you and the host have the latest version of Mindustry! +error.alreadyconnected = Redan ansluten. +error.mapnotfound = Map file not found! +error.io = Network I/O error. +error.any = Okänt nätverksfel. +error.bloom = Failed to initialize bloom.\nYour device may not support it. + +zone.groundZero.name = Ground Zero +zone.desertWastes.name = Desert Wastes +zone.craters.name = Kratrar +zone.frozenForest.name = Frusen Skog +zone.ruinousShores.name = Ruinous Shores +zone.stainedMountains.name = Stained Mountains +zone.desolateRift.name = Desolate Rift +zone.nuclearComplex.name = Nuclear Production Complex +zone.overgrowth.name = Överväxt +zone.tarFields.name = Tjärfält +zone.saltFlats.name = Salt Flats +zone.impact0078.name = Impact 0078 +zone.crags.name = Crags +zone.fungalPass.name = Fungal Pass + +zone.groundZero.description = The optimal location to begin once more. Low enemy threat. Few resources.\nGather as much lead and copper as possible.\nMove on. +zone.frozenForest.description = Even here, closer to mountains, the spores have spread. The fridgid temperatures cannot contain them forever.\n\nBegin the venture into power. Build combustion generators. Learn to use menders. +zone.desertWastes.description = These wastes are vast, unpredictable, and criss-crossed with derelict sector structures.\nCoal is present in the region. Burn it for power, or synthesize graphite.\n\n[lightgray]This landing location cannot be guaranteed. +zone.saltFlats.description = On the outskirts of the desert lie the Salt Flats. Few resources can be found in this location.\n\nThe enemy has erected a resource storage complex here. Eradicate their core. Leave nothing standing. +zone.craters.description = Water has accumulated in this crater, relic of the old wars. Reclaim the area. Collect sand. Smelt metaglass. Pump water to cool turrets and drills. +zone.ruinousShores.description = Past the wastes, is the shoreline. Once, this location housed a coastal defense array. Not much of it remains. Only the most basic defense structures have remained unscathed, everything else reduced to scrap.\nContinue the expansion outwards. Rediscover the technology. +zone.stainedMountains.description = Further inland lie the mountains, yet untainted by spores.\nExtract the abundant titanium in this area. Learn how to use it.\n\nThe enemy presence is greater here. Do not give them time to send their strongest units. +zone.overgrowth.description = This area is overgrown, closer to the source of the spores.\nThe enemy has established an outpost here. Build Titan units. Destroy it. Reclaim that which was lost. +zone.tarFields.description = The outskirts of an oil production zone, between the mountains and desert. One of the few areas with usable tar reserves.\nAlthough abandoned, this area has some dangerous enemy forces nearby. Do not underestimate them.\n\n[lightgray]Research oil processing technology if possible. +zone.desolateRift.description = An extremely dangerous zone. Plentiful resources, but little space. High risk of destruction. Leave as soon as possible. Do not be fooled by the long spacing between enemy attacks. +zone.nuclearComplex.description = A former facility for the production and processing of thorium, reduced to ruins.\n[lightgray]Research the thorium and its many uses.\n\nThe enemy is present here in great numbers, constantly scouting for attackers. +zone.fungalPass.description = A transition area between high mountains and lower, spore-ridden lands. A small enemy reconnaissance base is located here.\nDestroy it.\nUse Dagger and Crawler units. Take out the two cores. +zone.impact0078.description = +zone.crags.description = + +settings.language = Språk +settings.reset = Återställ till Standardvärden +settings.rebind = Byt +settings.controls = Kontroller +settings.game = Spel +settings.sound = Ljud +settings.graphics = Grafik +settings.cleardata = Rensa Data... +settings.clear.confirm = Are you sure you want to clear this data?\nWhat is done cannot be undone! +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. +settings.clearunlocks = Clear Unlocks +settings.clearall = Rensa Allt +paused = [accent]< Pausat > +yes = Ja +no = Nej +info.title = Info +error.title = [crimson]An error has occured +error.crashtitle = An error has occured +attackpvponly = [scarlet]Only available in Attack/PvP modes +blocks.input = Inmatning +blocks.output = Utmatning +blocks.booster = Booster +block.unknown = [lightgray]??? +blocks.powercapacity = Power Capacity +blocks.powershot = Power/Shot +blocks.damage = Skada +blocks.targetsair = Targets Air +blocks.targetsground = Targets Ground +blocks.itemsmoved = Move Speed +blocks.launchtime = Time Between Launches +blocks.shootrange = Range +blocks.size = Storlek +blocks.liquidcapacity = Liquid Capacity +blocks.powerrange = Power Range +blocks.poweruse = Power Use +blocks.powerdamage = Power/Damage +blocks.itemcapacity = Item Capacity +blocks.basepowergeneration = Base Power Generation +blocks.productiontime = Production Time +blocks.repairtime = Block Full Repair Time +blocks.speedincrease = Speed Increase +blocks.range = Range +blocks.drilltier = Drillables +blocks.drillspeed = Base Drill Speed +blocks.boosteffect = Boost Effect +blocks.maxunits = Max Active Units +blocks.health = Health +blocks.buildtime = Build Time +blocks.inaccuracy = Inaccuracy +blocks.shots = Skott +blocks.reload = Shots/Second +blocks.ammo = Ammunition + +bar.drilltierreq = Bättre Borr Krävs +bar.drillspeed = Drill Speed: {0}/s +bar.efficiency = Effektivitet: {0}% +bar.powerbalance = Power: {0}/s +bar.poweramount = Power: {0} +bar.poweroutput = Power Output: {0} +bar.items = Föremål: {0} +bar.liquid = Vätska +bar.heat = Hetta +bar.power = Power +bar.progress = Build Progress +bar.spawned = Units: {0}/{1} + +bullet.damage = [stat]{0}[lightgray] skada +bullet.splashdamage = [stat]{0}[lightgray] area dmg ~[stat] {1}[lightgray] tiles +bullet.incendiary = [stat]incendiary +bullet.homing = [stat]homing +bullet.shock = [stat]shock +bullet.frag = [stat]frag +bullet.knockback = [stat]{0}[lightgray] knockback +bullet.freezing = [stat]freezing +bullet.tarred = [stat]tarred +bullet.multiplier = [stat]{0}[lightgray]x ammo multiplier +bullet.reload = [stat]{0}[lightgray]x fire rate + +unit.blocks = block +unit.powersecond = power units/second +unit.liquidsecond = liquid units/second +unit.itemssecond = items/second +unit.liquidunits = liquid units +unit.powerunits = power units +unit.degrees = grader +unit.seconds = sekunder +unit.persecond = /sek +unit.timesspeed = x hastighet +unit.percent = % +unit.items = föremål +category.general = Allmänt +category.power = Energi +category.liquids = Vätskor +category.items = Föremål +category.crafting = Inmatning/Utmatning +category.shooting = Skjutning +category.optional = Optional Enhancements +setting.landscape.name = Lock Landscape +setting.shadows.name = Skuggor +setting.linear.name = Linear Filtering +setting.animatedwater.name = Animerat Vatten +setting.animatedshields.name = Animerade Sköldar +setting.antialias.name = Antialias[lightgray] (requires restart)[] +setting.indicators.name = Enemy/Ally Indicators +setting.autotarget.name = Auto-Target +setting.keyboard.name = Mouse+Keyboard Controls +setting.fpscap.name = Begränsade FPS +setting.fpscap.none = Inga +setting.fpscap.text = {0} FPS +setting.uiscale.name = UI Scaling[lightgray] (require restart)[] +setting.swapdiagonal.name = Always Diagonal Placement +setting.difficulty.training = Träning +setting.difficulty.easy = Lätt +setting.difficulty.normal = Normalt +setting.difficulty.hard = Svårt +setting.difficulty.insane = Galet +setting.difficulty.name = Svårighetsgrad: +setting.screenshake.name = Skärmskak +setting.effects.name = Visa Effekter +setting.sensitivity.name = Controller Sensitivity +setting.saveinterval.name = Save Interval +setting.seconds = {0} Sekunder +setting.fullscreen.name = Fullskärm +setting.borderlesswindow.name = Borderless Window[lightgray] (may require restart) +setting.fps.name = Show FPS +setting.vsync.name = VSync +setting.lasers.name = Show Power Lasers +setting.pixelate.name = Pixellera[lightgray] (disables animations) +setting.minimap.name = Visa Minikarta +setting.musicvol.name = Musikvolym +setting.mutemusic.name = Stäng Av Musik +setting.sfxvol.name = Ljudeffektvolym +setting.mutesound.name = Stäng Av Ljudeffekter +setting.crashreport.name = Skicka Anonyma Krashrapporter +setting.chatopacity.name = Chattgenomskinlighet +setting.playerchat.name = Visa Chatt +uiscale.reset = UI-skalan har ändrats.\nTryck "OK" för att använda den här skalan.\n[scarlet]Avslutar och återställer om[accent] {0}[] sekunder... +uiscale.cancel = Avbryt och Avsluta +setting.bloom.name = Bloom +keybind.title = Rebind Keys +keybinds.mobile = [scarlet]Most keybinds here are not functional on mobile. Only basic movement is supported. +category.general.name = General +category.view.name = View +category.multiplayer.name = Multiplayer +command.attack = Attack +command.retreat = Retreat +command.patrol = Patrol +keybind.gridMode.name = Block Select +keybind.gridModeShift.name = Category Select +keybind.press = Press a key... +keybind.press.axis = Press an axis or key... +keybind.screenshot.name = Map Screenshot +keybind.move_x.name = Move x +keybind.move_y.name = Move y +keybind.select.name = Select/Shoot +keybind.diagonal_placement.name = Diagonal Placement +keybind.pick.name = Pick Block +keybind.break_block.name = Break Block +keybind.deselect.name = Deselect +keybind.shoot.name = Shoot +keybind.zoom_hold.name = Zoom Hold +keybind.zoom.name = Zoom +keybind.menu.name = Menu +keybind.pause.name = Pause +keybind.minimap.name = Minimap +keybind.dash.name = Dash +keybind.chat.name = Chat +keybind.player_list.name = Player list +keybind.console.name = Console +keybind.rotate.name = Rotate +keybind.toggle_menus.name = Toggle menus +keybind.chat_history_prev.name = Chat history prev +keybind.chat_history_next.name = Chat history next +keybind.chat_scroll.name = Chat scroll +keybind.drop_unit.name = Drop Unit +keybind.zoom_minimap.name = Zoom minimap +mode.help.title = Description of modes +mode.survival.name = Överlevnad +mode.survival.description = The normal mode. Limited resources and automatic incoming waves.\n[gray]Requires enemy spawns in the map to play. +mode.sandbox.name = Sandbox +mode.sandbox.description = Infinite resources and no timer for waves. +mode.pvp.name = PvP +mode.pvp.description = Fight against other players locally.\n[gray]Requires at least 2 differently-colored cores in the map to play. +mode.attack.name = Attack +mode.attack.description = Destroy the enemy's base. No waves.\n[gray]Requires a red core in the map to play. +mode.custom = Custom Rules +rules.infiniteresources = Infinite Resources +rules.wavetimer = Vågtimer +rules.waves = Vågor +rules.attack = Attack Mode +rules.enemyCheat = Infinite AI (Red Team) Resources +rules.unitdrops = Unit Drops +rules.unitbuildspeedmultiplier = Unit Production Speed Multiplier +rules.unithealthmultiplier = Unit Health Multiplier +rules.playerhealthmultiplier = Player Health Multiplier +rules.playerdamagemultiplier = Player Damage Multiplier +rules.unitdamagemultiplier = Unit Damage Multiplier +rules.enemycorebuildradius = Enemy Core No-Build Radius:[lightgray] (tiles) +rules.respawntime = Respawn Time:[lightgray] (sec) +rules.wavespacing = Wave Spacing:[lightgray] (sec) +rules.buildcostmultiplier = Build Cost Multiplier +rules.buildspeedmultiplier = Build Speed Multiplier +rules.waitForWaveToEnd = Waves wait for enemies +rules.dropzoneradius = Drop Zone Radius:[lightgray] (tiles) +rules.respawns = Max respawns per wave +rules.limitedRespawns = Limit Respawns +rules.title.waves = Vågor +rules.title.respawns = Respawns +rules.title.resourcesbuilding = Resources & Building +rules.title.player = Spelare +rules.title.enemy = Fiender +rules.title.unit = Units +content.item.name = Föremål +content.liquid.name = Vätskor +content.unit.name = Units +content.block.name = Block +content.mech.name = Mechs +item.copper.name = Koppar +item.lead.name = Bly +item.coal.name = Kol +item.graphite.name = Grafit +item.titanium.name = Titan +item.thorium.name = Torium +item.silicon.name = Silikon +item.plastanium.name = Plast +item.phase-fabric.name = Phase Fabric +item.surge-alloy.name = Surge Alloy +item.spore-pod.name = Spore Pod +item.sand.name = Sand +item.blast-compound.name = Sprängmedel +item.pyratite.name = Pyratit +item.metaglass.name = Metaglas +item.scrap.name = Scrap +liquid.water.name = Vatten +liquid.slag.name = Slag +liquid.oil.name = Olja +liquid.cryofluid.name = Cryofluid +mech.alpha-mech.name = Alfa +mech.alpha-mech.weapon = Heavy Repeater +mech.alpha-mech.ability = Regeneration +mech.delta-mech.name = Delta +mech.delta-mech.weapon = Arc Generator +mech.delta-mech.ability = Discharge +mech.tau-mech.name = Tau +mech.tau-mech.weapon = Restruct Laser +mech.tau-mech.ability = Repair Burst +mech.omega-mech.name = Omega +mech.omega-mech.weapon = Swarm Missiles +mech.omega-mech.ability = Armored Configuration +mech.dart-ship.name = Dart +mech.dart-ship.weapon = Repeater +mech.javelin-ship.name = Javelin +mech.javelin-ship.weapon = Burst Missiles +mech.javelin-ship.ability = Discharge Booster +mech.trident-ship.name = Treudd +mech.trident-ship.weapon = Bomb Bay +mech.glaive-ship.name = Glaive +mech.glaive-ship.weapon = Flame Repeater +item.explosiveness = [lightgray]Explosiveness: {0}% +item.flammability = [lightgray]Flammability: {0}% +item.radioactivity = [lightgray]Radioactivity: {0}% +unit.health = [lightgray]Health: {0} +unit.speed = [lightgray]Fart: {0} +mech.weapon = [lightgray]Vapen: {0} +mech.health = [lightgray]Health: {0} +mech.itemcapacity = [lightgray]Item Capacity: {0} +mech.minespeed = [lightgray]Mining Speed: {0}% +mech.minepower = [lightgray]Mining Power: {0} +mech.ability = [lightgray]Ability: {0} +mech.buildspeed = [lightgray]Building Speed: {0}% +liquid.heatcapacity = [lightgray]Heat Capacity: {0} +liquid.viscosity = [lightgray]Viskositet: {0} +liquid.temperature = [lightgray]Temperatur: {0} +block.sand-boulder.name = Sandbumling +block.grass.name = Gräs +block.salt.name = Salt +block.saltrocks.name = Saltstenar +block.pebbles.name = Pebbles +block.tendrils.name = Tendrils +block.sandrocks.name = Sandstenar +block.spore-pine.name = Spore Pine +block.sporerocks.name = Spore Rocks +block.rock.name = Sten +block.snowrock.name = Snow Rock +block.snow-pine.name = Snow Pine +block.shale.name = Shale +block.shale-boulder.name = Shale Boulder +block.moss.name = Mossa +block.shrubs.name = Shrubs +block.spore-moss.name = Spore Moss +block.shalerocks.name = Shale Rocks +block.scrap-wall.name = Scrap Wall +block.scrap-wall-large.name = Large Scrap Wall +block.scrap-wall-huge.name = Huge Scrap Wall +block.scrap-wall-gigantic.name = Gigantic Scrap Wall +block.thruster.name = Thruster +block.kiln.name = Ugn +block.graphite-press.name = Grapfitpress +block.multi-press.name = Multi-Press +block.constructing = {0} [lightgray](Constructing) +block.spawn.name = Enemy Spawn +block.core-shard.name = Core: Shard +block.core-foundation.name = Core: Foundation +block.core-nucleus.name = Core: Nucleus +block.deepwater.name = Djupt Vatten +block.water.name = Vatten +block.tainted-water.name = Tainted Water +block.darksand-tainted-water.name = Dark Sand Tainted Water +block.tar.name = Tjära +block.stone.name = Sten +block.sand.name = Sand +block.darksand.name = Mörk Sand +block.ice.name = Is +block.snow.name = Snö +block.craters.name = Kratrar +block.sand-water.name = Sandvatten +block.darksand-water.name = Mörksandvatten +block.char.name = Char +block.holostone.name = Holosten +block.ice-snow.name = Issnö +block.rocks.name = Stenar +block.icerocks.name = Isstenar +block.snowrocks.name = Snöstenar +block.dunerocks.name = Dynstenar +block.pine.name = Tall +block.white-tree-dead.name = Vitt Dött Träd +block.white-tree.name = Vitt Träd +block.spore-cluster.name = Spore Cluster +block.metal-floor.name = Metal Floor 1 +block.metal-floor-2.name = Metallgolv 2 +block.metal-floor-3.name = Metallgolv 3 +block.metal-floor-5.name = Metallgolv 4 +block.metal-floor-damaged.name = Skadat Metallgolv +block.dark-panel-1.name = Mörk Panel 1 +block.dark-panel-2.name = Mörk Panel 2 +block.dark-panel-3.name = Mörk Panel 3 +block.dark-panel-4.name = Mörk Panel 4 +block.dark-panel-5.name = Mörk Panel 5 +block.dark-panel-6.name = Mörk Panel 6 +block.dark-metal.name = Mörk Metall +block.ignarock.name = Ignasten +block.hotrock.name = Het Sten +block.magmarock.name = Magmasten +block.cliffs.name = Klippor +block.copper-wall.name = Kopparvägg +block.copper-wall-large.name = Stor Kopparvägg +block.titanium-wall.name = Titanvägg +block.titanium-wall-large.name = Stor Titanvägg +block.phase-wall.name = Phasevägg +block.phase-wall-large.name = Stor Phasevägg +block.thorium-wall.name = Toriumvägg +block.thorium-wall-large.name = Stor Toriumvägg +block.door.name = Dörr +block.door-large.name = Stor Dörr +block.duo.name = Duo +block.scorch.name = Scorch +block.scatter.name = Scatter +block.hail.name = Hail +block.lancer.name = Lancer +block.conveyor.name = Conveyor +block.titanium-conveyor.name = Titanium Conveyor +block.junction.name = Korsning +block.router.name = Router +block.distributor.name = Distributor +block.sorter.name = Sorterare +block.overflow-gate.name = Overflow Gate +block.silicon-smelter.name = Silicon Smelter +block.phase-weaver.name = Phase Weaver +block.pulverizer.name = Pulverizer +block.cryofluidmixer.name = Cryofluid Mixer +block.melter.name = Smältare +block.incinerator.name = Incinerator +block.spore-press.name = Spore Press +block.separator.name = Separerare +block.coal-centrifuge.name = Kolcentrifug +block.power-node.name = Energinod +block.power-node-large.name = Stor Energinod +block.surge-tower.name = Surge Tower +block.battery.name = Batteri +block.battery-large.name = Stort Batteri +block.combustion-generator.name = Combustion Generator +block.turbine-generator.name = Ånggenerator +block.differential-generator.name = Differential Generator +block.impact-reactor.name = Impact Reactor +block.mechanical-drill.name = Mekanisk Borr +block.pneumatic-drill.name = Pneumatisk Borr +block.laser-drill.name = Laserborr +block.water-extractor.name = Vattenextraktor +block.cultivator.name = Kultiverare +block.dart-mech-pad.name = Alpha Mech Pad +block.delta-mech-pad.name = Delta Mech Pad +block.javelin-ship-pad.name = Javelin Ship Pad +block.trident-ship-pad.name = Trident Ship Pad +block.glaive-ship-pad.name = Glaive Ship Pad +block.omega-mech-pad.name = Omega Mech Pad +block.tau-mech-pad.name = Tau Mech Pad +block.conduit.name = Conduit +block.mechanical-pump.name = Mechanical Pump +block.item-source.name = Föremålskälla +block.item-void.name = Föremålsförstörare +block.liquid-source.name = Vätskekälla +block.power-void.name = Energiätare +block.power-source.name = Energikälla +block.unloader.name = Urladdare +block.vault.name = Vault +block.wave.name = Wave +block.swarmer.name = Svärmare +block.salvo.name = Salvo +block.ripple.name = Ripple +block.phase-conveyor.name = Phase Conveyor +block.bridge-conveyor.name = Bro +block.plastanium-compressor.name = Plastanium Compressor +block.pyratite-mixer.name = Pyratite Mixer +block.blast-mixer.name = Blast Mixer +block.solar-panel.name = Solpanel +block.solar-panel-large.name = Stor Solpanel +block.oil-extractor.name = Oljeextraktor +block.draug-factory.name = Draug Miner Drone Factory +block.spirit-factory.name = Spirit Repair Drone Factory +block.phantom-factory.name = Phantom Builder Drone Factory +block.wraith-factory.name = Wraith Fighter Factory +block.ghoul-factory.name = Ghoul Bomber Factory +block.dagger-factory.name = Dagger Mech Factory +block.crawler-factory.name = Crawler Mech Factory +block.titan-factory.name = Titan Mech Factory +block.fortress-factory.name = Fortress Mech Factory +block.revenant-factory.name = Revenant Fighter Factory +block.repair-point.name = Repairationspunkt +block.pulse-conduit.name = Pulse Conduit +block.phase-conduit.name = Phase Conduit +block.liquid-router.name = Liquid Router +block.liquid-tank.name = Vätsketank +block.liquid-junction.name = Vätskekorsning +block.bridge-conduit.name = Bridge Conduit +block.rotary-pump.name = Rotary Pump +block.thorium-reactor.name = Thorium Reactor +block.mass-driver.name = Mass Driver +block.blast-drill.name = Airblast Drill +block.thermal-pump.name = Thermal Pump +block.thermal-generator.name = Thermal Generator +block.alloy-smelter.name = Alloy Smelter +block.mender.name = Mender +block.mend-projector.name = Mend Projector +block.surge-wall.name = Surge Wall +block.surge-wall-large.name = Large Surge Wall +block.cyclone.name = Cyklon +block.fuse.name = Fuse +block.shock-mine.name = Schockmina +block.overdrive-projector.name = Overdrive Projector +block.force-projector.name = Force Projector +block.arc.name = Båge +block.rtg-generator.name = RTG Generator +block.spectre.name = Spectre +block.meltdown.name = Meltdown +block.container.name = Container +block.launch-pad.name = Launch Pad +block.launch-pad-large.name = Large Launch Pad +team.blue.name = blåa +team.crux.name = röda +team.sharded.name = orangea +team.orange.name = orangea +team.derelict.name = derelicta +team.green.name = gröna +team.purple.name = lila +unit.spirit.name = Spirit Repair Drone +unit.draug.name = Draug Miner Drone +unit.phantom.name = Phantom Builder Drone +unit.dagger.name = Dagger +unit.crawler.name = Crawler +unit.titan.name = Titan +unit.ghoul.name = Ghoul Bomber +unit.wraith.name = Wraith Fighter +unit.fortress.name = Fortress +unit.revenant.name = Revenant +unit.eruptor.name = Eruptor +unit.chaos-array.name = Chaos Array +unit.eradicator.name = Eradikator +unit.lich.name = Lich +unit.reaper.name = Reaper +tutorial.next = [lightgray] +tutorial.intro = You have entered the[scarlet] Mindustry Tutorial.[]\nBegin by[accent] mining copper[]. Tap a copper ore vein near your core to do this.\n\n[accent]{0}/{1} copper +tutorial.drill = Mining manually is inefficient.\n[accent]Drills []can mine automatically.\nClick the drill tab in the bottom right.\nSelect the[accent] mechanical drill[]. Place it on a copper vein by clicking.\n[accent]Right-click[] to stop building. +tutorial.drill.mobile = Mining manually is inefficient.\n[accent]Drills []can mine automatically.\nTap the drill tab in the bottom right.\nSelect the[accent] mechanical drill[].\nPlace it on a copper vein by tapping, then press the[accent] checkmark[] below to confirm your selection.\nPress the[accent] X button[] to cancel placement. +tutorial.blockinfo = Each block has different stats. Each drill can only mine certain ores.\nTo check a block's info and stats,[accent] tap the "?" button while selecting it in the build menu.[]\n\n[accent]Access the Mechanical Drill's stats now.[] +tutorial.conveyor = [accent]Conveyors[] are used to transport items to the core.\nMake a line of conveyors from the drill to the core.\n[accent]Hold down the mouse to place in a line.[]\nHold[accent] CTRL[] while selecting a line to place diagonally.\n\n[accent]{0}/{1} conveyors\n[accent]0/1 items delivered +tutorial.conveyor.mobile = [accent]Conveyors[] are used to transport items to the core.\nMake a line of conveyors from the drill to the core.\n[accent] Place in a line by holding down your finger for a few seconds[] and dragging in a direction.\n\n[accent]{0}/{1} conveyors\n[accent]0/1 items delivered +tutorial.turret = Defensive structures must be built to repel the[lightgray] enemy[].\nBuild a[accent] duo turret[] near your base. +tutorial.drillturret = Duo turrets require[accent] copper ammo []to shoot.\nPlace a drill near to the turret\n Lead conveyors into the turret to supply it with copper.\n\n[accent]Ammo delivered: 0/1 +tutorial.pause = During battle, you are able to[accent] pause the game.[]\nYou may queue buildings while paused.\n\n[accent]Press space to pause. +tutorial.pause.mobile = During battle, you are able to[accent] pause the game.[]\nYou may queue buildings while paused.\n\n[accent]Press this button in the top left to pause. +tutorial.unpause = Now press space again to unpause. +tutorial.unpause.mobile = Now press it again to unpause. +tutorial.breaking = Blocks frequently need to be destroyed.\n[accent]Hold down right-click[] to destroy all blocks in a selection.[]\n\n[accent]Destroy all the scrap blocks to the right of your core. +tutorial.breaking.mobile = Blocks frequently need to be destroyed.\n[accent]Select deconstruction mode[], then tap a block to begin breaking it.\nDestroy an area by holding down your finger for a few seconds[] and dragging in a direction.\nPress the checkmark button to confirm breaking.\n\n[accent]Destroy all the scrap blocks to the right of your core. +tutorial.withdraw = In some situations, taking items directly from blocks is necessary.\nTo do this, [accent]tap a block[] with items in it, then [accent]tap the item[] in the inventory. Multiple items can be withdrawn by [accent]tapping and holding[].\n\n[accent]Withdraw some copper from the core.[] +tutorial.deposit = Deposit items into blocks by dragging from your ship to the destination block.\n\n[accent]Deposit your copper back into the core.[] +tutorial.waves = The[lightgray] enemy[] approaches.\n\nDefend the core for 2 waves.[accent] Click[] to shoot.\nBuild more turrets and drills. Mine more copper. +tutorial.waves.mobile = The[lightgray] enemy[] approaches.\n\nDefend the core for 2 waves. Your ship will automatically fire at enemies.\nBuild more turrets and drills. Mine more copper. +tutorial.launch = Once you reach a specific wave, you are able to[accent] launch the core[], leaving your defenses behind and[accent] obtaining all the resources in your core.[]\nThese resources can then be used to research new technology.\n\n[accent]Press the launch button. +item.copper.description = The most basic structural material. Used extensively in all types of blocks. +item.lead.description = A basic starter material. Used extensively in electronics and liquid transportation blocks. +item.metaglass.description = A super-tough glass compound. Extensively used for liquid distribution and storage. +item.graphite.description = Mineralized carbon, used for ammunition and electrical insulation. +item.sand.description = A common material that is used extensively in smelting, both in alloying and as a flux. +item.coal.description = Fossilized plant matter, formed long before the seeding event. Used extensively for fuel and resource production. +item.titanium.description = A rare super-light metal used extensively in liquid transportation, drills and aircraft. +item.thorium.description = A dense, radioactive metal used as structural support and nuclear fuel. +item.scrap.description = Leftover remnants of old structures and units. Contains trace amounts of many different metals. +item.silicon.description = An extremely useful semiconductor. Applications in solar panels, complex electronics and homing turret ammunition. +item.plastanium.description = A light, ductile material used in advanced aircraft and fragmentation ammunition. +item.phase-fabric.description = A near-weightless substance used in advanced electronics and self-repairing technology. +item.surge-alloy.description = An advanced alloy with unique electrical properties. +item.spore-pod.description = A pod of synthetic spores, synthesized from atmospheric concentrations for industrial purposes. Used for conversion into oil, explosives and fuel. +item.blast-compound.description = An unstable compound used in bombs and explosives. Synthesized from spore pods and other volatile substances. Use as fuel is not advised. +item.pyratite.description = An extremely flammable substance used in incendiary weapons. +liquid.water.description = The most useful liquid. Commonly used for cooling machines and waste processing. +liquid.slag.description = Various different types of molten metal mixed together. Can be separated into its constituent minerals, or sprayed at enemy units as a weapon. +liquid.oil.description = A liquid used in advanced material production. Can be converted into coal as fuel, or sprayed and set on fire as a weapon. +liquid.cryofluid.description = An inert, non-corrosive liquid created from water and titanium. Has extremely high heat capacity. Extensively used as coolant. +mech.alpha-mech.description = The standard control mech. Based on a Dagger unit, with upgraded armor and building capabilities. Has more damage output than a Dart ship. +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.tau-mech.description = The support mech. Heals allied blocks by shooting at them. Can heal allies in a radius with its repair ability. +mech.omega-mech.description = A bulky and well-armored mech, made for front-line assaults. Its armor can block up to 90% of incoming damage. +mech.dart-ship.description = The standard control ship. Reasonably fast and light, but has little offensive capability and low mining speed. +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 and missiles. +mech.trident-ship.description = A heavy bomber, built for construction and destroying enemy fortifications. Reasonably well armored. +mech.glaive-ship.description = A large, well-armored gunship. Equipped with an incendiary repeater. Highly maneuverable. +unit.draug.description = A primitive mining drone. Cheap to produce. Expendable. Automatically mines copper and lead in the vicinity. Delivers mined resources to the closest core. +unit.spirit.description = A modified draug drone, designed for repair instead of mining. Automatically fixes any damaged blocks in the area. +unit.phantom.description = An advanced drone unit. Follows users. Assists in block construction. +unit.dagger.description = The most basic ground mech. Cheap to produce. Overwhelming when used in swarms. +unit.crawler.description = A ground unit consisting of a stripped-down frame with high explosives strapped on top. Not particular durable. Explodes on contact with enemies. +unit.titan.description = An advanced, armored ground unit. Attacks both ground and air targets. Equipped with two miniature Scorch-class flamethrowers. +unit.fortress.description = A heavy artillery mech. Equipped with two modified Hail-type cannons for long-range assault on enemy structures and units. +unit.eruptor.description = A heavy mech designed to take down structures. Fires a stream of slag at enemy fortifications, melting them and setting volatiles on fire. +unit.chaos-array.description = +unit.eradicator.description = +unit.wraith.description = A fast, hit-and-run interceptor unit. Targets power generators. +unit.ghoul.description = A heavy carpet bomber. Rips through enemy structures, targeting critital infrastructure. +unit.revenant.description = A heavy, hovering missile array. +unit.lich.description = +unit.reaper.description = +block.graphite-press.description = Compresses chunks of coal into pure sheets of graphite. +block.multi-press.description = An upgraded version of the graphite press. Employs water and power to process coal quickly and efficiently. +block.silicon-smelter.description = Reduces sand with pure coal. Produces silicon. +block.kiln.description = Smelts sand and lead into the compound known as metaglass. Requires small amounts of power to run. +block.plastanium-compressor.description = Produces plastanium from oil and titanium. +block.phase-weaver.description = Synthesizes phase fabric from radioactive thorium and sand. Requires massive amounts of power to function. +block.alloy-smelter.description = Combines titanium, lead, silicon and copper to produce surge alloy. +block.cryofluidmixer.description = Mixes water and fine titanium powder into cryofluid. Essential for thorium reactor usage. +block.blast-mixer.description = Crushes and mixes clusters of spores with pyratite to produce blast compound. +block.pyratite-mixer.description = Mixes coal, lead and sand into highly flammable pyratite. +block.melter.description = Melts down scrap into slag for further processing or usage in wave turrets. +block.separator.description = Separates slag into its mineral components. Outputs the cooled result. +block.spore-press.description = Compresses spore pods under extreme pressure to synthesize oil. +block.pulverizer.description = Crushes scrap into fine sand. +block.coal-centrifuge.description = Solidifes oil into chunks of coal. +block.incinerator.description = Vaporizes any excess item or liquid it receives. +block.power-void.description = Voids all power inputted into it. Sandbox only. +block.power-source.description = Infinitely outputs power. Sandbox only. +block.item-source.description = Infinitely outputs items. Sandbox only. +block.item-void.description = Destroys any items. Sandbox only. +block.liquid-source.description = Infinitely outputs liquids. Sandbox only. +block.copper-wall.description = A cheap defensive block.\nUseful for protecting the core and turrets in the first few waves. +block.copper-wall-large.description = A cheap defensive block.\nUseful for protecting the core and turrets in the first few waves.\nSpans multiple tiles. +block.titanium-wall.description = A moderately strong defensive block.\nProvides moderate protection from enemies. +block.titanium-wall-large.description = A moderately strong defensive block.\nProvides moderate protection from enemies.\nSpans multiple tiles. +block.thorium-wall.description = A strong defensive block.\nDecent protection from enemies. +block.thorium-wall-large.description = A strong defensive block.\nDecent protection from enemies.\nSpans multiple tiles. +block.phase-wall.description = A wall coated with special phase-based reflective compound. Deflects most bullets upon impact. +block.phase-wall-large.description = A wall coated with special phase-based reflective compound. Deflects most bullets upon impact.\nSpans multiple tiles. +block.surge-wall.description = An extremely durable defensive block.\nBuilds up charge on bullet contact, releasing it randomly. +block.surge-wall-large.description = An extremely durable defensive block.\nBuilds up charge on bullet contact, releasing it randomly.\nSpans multiple tiles. +block.door.description = A small door. Can be opened or closed by tapping. +block.door-large.description = A large door. Can be opened and closed by tapping.\nSpans multiple tiles. +block.mender.description = Periodically repairs blocks in its vicinity. Keeps defenses repaired in-between waves.\nOptionally uses silicon to boost range and efficiency. +block.mend-projector.description = An upgraded version of the Mender. Repairs blocks in its vicinity.\nOptionally uses phase fabric to boost range and efficiency. +block.overdrive-projector.description = Increases the speed of nearby buildings.\nOptionally uses phase fabric to boost range and efficiency. +block.force-projector.description = Creates a hexagonal force field around itself, protecting buildings and units inside from damage.\nOverheats if too much damage is sustained. Optionally uses coolant to prevent overheating. Phase fabric can be used to increase shield size. +block.shock-mine.description = Damages enemies stepping on the mine. Nearly invisible to the enemy. +block.conveyor.description = Basic item transport block. Moves items forward and automatically deposits them into blocks. Rotatable. +block.titanium-conveyor.description = Advanced item transport block. Moves items faster than standard conveyors. +block.junction.description = Acts as a bridge for two crossing conveyor belts. Useful in situations with two different conveyors carrying different materials to different locations. +block.bridge-conveyor.description = Advanced item transport block. Allows transporting items over up to 3 tiles of any terrain or building. +block.phase-conveyor.description = Advanced item transport block. Uses power to teleport items to a connected phase conveyor over several tiles. +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.router.description = Accepts items, then outputs them to up to 3 other directions equally. Useful for splitting the materials from one source to multiple targets.\n\n[scarlet]Never use next to production inputs, as they will get clogged by output.[] +block.distributor.description = An advanced router. Splits items to up to 7 other directions equally. +block.overflow-gate.description = A combination splitter and router. Only outputs to the left and right if the front path is blocked. +block.mass-driver.description = The ultimate item transport block. Collects several items and then shoots them to another mass driver over a long range. Requires power to operate. +block.mechanical-pump.description = A cheap pump with slow output, but no power consumption. +block.rotary-pump.description = An advanced pump. Pumps more liquid, but requires power. +block.thermal-pump.description = The ultimate pump. +block.conduit.description = Basic liquid transport block. Moves liquids forward. Used in conjunction with pumps and other conduits. +block.pulse-conduit.description = An advanced liquid transport block. Transports liquids faster and stores more than standard conduits. +block.liquid-router.description = Accepts liquids from one direction and outputs them to up to 3 other directions equally. Can also store a certain amount of liquid. Useful for splitting the liquids from one source to multiple targets. +block.liquid-tank.description = Stores a large amount of liquids. Use for creating buffers in situations with non-constant demand of materials or as a safeguard for cooling vital blocks. +block.liquid-junction.description = Acts as a bridge for two crossing conduits. Useful in situations with two different conduits carrying different liquids to different locations. +block.bridge-conduit.description = Advanced liquid transport block. Allows transporting liquids over up to 3 tiles of any terrain or building. +block.phase-conduit.description = Advanced liquid transport block. Uses power to teleport liquids to a connected phase conduit over several tiles. +block.power-node.description = Transmits power to connected nodes. The node will receive power from or supply power to any adjacent blocks. +block.power-node-large.description = An advanced power node with greater range and more connections. +block.surge-tower.description = An extremely long-range power node with fewer available connections. +block.battery.description = Stores power as a buffer in times of surplus energy. Outputs power in times of deficit. +block.battery-large.description = Stores much more power than a regular battery. +block.combustion-generator.description = Generates power by burning flammable materials, such as coal. +block.thermal-generator.description = Generates power when placed in hot locations. +block.turbine-generator.description = An advanced combustion generator. More efficient, but requires additional water for generating steam. +block.differential-generator.description = Generates large amounts of energy. Utilizes the temperature difference between cryofluid and burning pyratite. +block.rtg-generator.description = A simple, reliable generator. Uses the heat of decaying radioactive compounds to produce energy at a slow rate. +block.solar-panel.description = Provides a small amount of power from the sun. +block.solar-panel-large.description = A significantly more efficient version of the standard solar panel. +block.thorium-reactor.description = Generates significant amounts of power from thorium. Requires constant cooling. Will explode violently if insufficient amounts of coolant are supplied. Power output depends on fullness, with base power generated at full capacity. +block.impact-reactor.description = An advanced generator, capable of creating massive amounts of power at peak efficiency. Requires a significant power input to kickstart the process. +block.mechanical-drill.description = A cheap drill. When placed on appropriate tiles, outputs items at a slow pace indefinitely. Only capable of mining basic resources. +block.pneumatic-drill.description = An improved drill, capable of mining titanium. Mines at a faster pace than a mechanical drill. +block.laser-drill.description = Allows drilling even faster through laser technology, but requires power. Capable of mining thorium. +block.blast-drill.description = The ultimate drill. Requires large amounts of power. +block.water-extractor.description = Extracts groundwater. Used in locations with no surface water available. +block.cultivator.description = Cultivates tiny concentrations of spores in the atmosphere into industry-ready pods. +block.oil-extractor.description = Uses large amounts of power, sand and water to drill for oil. +block.core-shard.description = The first iteration of the core capsule. Once destroyed, all contact to the region is lost. Do not let this happen. +block.core-foundation.description = The second version of the core. Better armored. Stores more resources. +block.core-nucleus.description = The third and final iteration of the core capsule. Extremely well armored. Stores massive amounts of resources. +block.vault.description = Stores a large amount of items of each type. An unloader block can be used to retrieve items from the vault. +block.container.description = Stores a small amount of items of each type. An unloader block can be used to retrieve items from the container. +block.unloader.description = Unloads items from a container, vault or core onto a conveyor or directly into an adjacent block. The type of item to be unloaded can be changed by tapping. +block.launch-pad.description = Launches batches of items without any need for a core launch. +block.launch-pad-large.description = An improved version of the launch pad. Stores more items. Launches more frequently. +block.duo.description = A small, cheap turret. Useful against ground units. +block.scatter.description = An essential anti-air turret. Sprays clumps of lead or scrap flak at enemy units. +block.scorch.description = Burns any ground enemies close to it. Highly effective at close range. +block.hail.description = A small, long-range artillery turret. +block.wave.description = A medium-sized turret. Shoots streams of liquid at enemies. Automatically extinguishes fires when supplied with water. +block.lancer.description = A medium-sized anti-ground laser turret. Charges and fires powerful beams of energy. +block.arc.description = A small close-range electric turret. Fires arcs of electricity at enemies. +block.swarmer.description = A medium-sized missile turret. Attacks both air and ground enemies. Fires homing missiles. +block.salvo.description = A larger, more advanced version of the Duo turret. Fires quick salvos of bullets at the enemy. +block.fuse.description = A large, close-range energy turret. Fires three piercing beams at nearby enemies. +block.ripple.description = An extremely poweful artillery turret. Shoots clusters of shells at enemies over long distances. +block.cyclone.description = A large anti-air and anti-ground turret. Fires explosive clumps of flak at nearby units. +block.spectre.description = A massive dual-barreled cannon. Shoots large armor-piercing bullets at air and ground targets. +block.meltdown.description = A massive laser cannon. Charges and fires a persistent laser beam at nearby enemies. Requires coolant to operate. +block.draug-factory.description = Produces Draug mining drones. +block.spirit-factory.description = Produces Spirit structural repair drones. +block.phantom-factory.description = Produces advanced construction drones. +block.wraith-factory.description = Produces fast, hit-and-run interceptor units. +block.ghoul-factory.description = Produces heavy carpet bombers. +block.revenant-factory.description = Produces heavy missile-based units. +block.dagger-factory.description = Produces basic ground units. +block.crawler-factory.description = Produces fast self-destructing swarm units. +block.titan-factory.description = Produces advanced, armored ground units. +block.fortress-factory.description = Produces heavy artillery ground units. +block.repair-point.description = Continuously heals the closest damaged unit in its vicinity. +block.dart-mech-pad.description = Provides transformation into a basic attack mech.\nUse by tapping while standing on it. +block.delta-mech-pad.description = Provides transformation into a lightly armored hit-and-run attack mech.\nUse by tapping while standing on it. +block.tau-mech-pad.description = Provides transformation into an advanced support mech.\nUse by tapping while st +block.omega-mech-pad.description = Provides transformation into a heavily-armored missile mech.\nUse by tapping while standing on it. +block.javelin-ship-pad.description = Provides transformation into a quick, lightly-armored interceptor.\nUse by tapping while standing on it. +block.trident-ship-pad.description = Provides transformation into a heavy support bomber.\nUse by tapping while standing on it. +block.glaive-ship-pad.description = Provides transformation into a large, well-armored gunship.\nUse by tapping while standing on it. \ No newline at end of file diff --git a/core/assets/bundles/bundle_zh_CN.properties b/core/assets/bundles/bundle_zh_CN.properties index 94e0930b97..4974494ce2 100644 --- a/core/assets/bundles/bundle_zh_CN.properties +++ b/core/assets/bundles/bundle_zh_CN.properties @@ -1,10 +1,10 @@ -credits.text = 由[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!) +credits.text = 由[ROYAL]Anuken[]开发 - [SKY]anukendev@gmail.com[] credits = 致谢 contributors = 译者和贡献者 discord = 加入 Mindustry 的 Discord! link.discord.description = 官方 Mindustry Discord 聊天室 link.github.description = 游戏源码 -link.changelog.description = List of update changes +link.changelog.description = 更新列表 link.dev-builds.description = 不稳定开发版 link.trello.description = Trello board 上的官方计划表 link.itch.io.description = PC版下载和网页版(itch.io) @@ -16,15 +16,18 @@ screenshot.invalid = 地图太大,可能没有足够的内存用于截图。 gameover = 你的核心被摧毁了! gameover.pvp = [accent] {0}[] 队获胜! highscore = [accent]新纪录! + stat.wave = 战胜的波数:[accent]{0} stat.enemiesDestroyed = 消灭的敌人:[accent]{0} stat.built = 建造的建筑:[accent]{0} stat.destroyed = 摧毁的建筑:[accent]{0} stat.deconstructed = 拆除的建筑:[accent]{0} stat.delivered = 发射的资源: -stat.rank = 最终排名:[accent]{0} -placeline = 你选择了一个方块。\n你能通过[accent]长按几秒钟[]并向一个方向拖动来[accent]直线放置方块[]。\n试试看吧。 -removearea = 你选择了拆除模式。\n你能通过[accent]长按几秒钟[]并拖动来[accent]删除矩形内的方块[]。\n试试看吧。 +stat.rank = 最终等级:[accent]{0} + +placeline = 你选择了一个方块。\n你可以[accent]长按几秒钟[]并向一个方向拖动来[accent]直线放置方块[]。\n试试看吧。 +removearea = 你选择了拆除模式。\n你可以[accent]长按几秒钟[]并拖动来[accent]删除矩形内的方块[]。\n试试看吧。 + launcheditems = [accent]发射的资源 map.delete = 确定要删除 "[accent]{0}[]" 地图吗? level.highscore = 最高分:[accent]{0} @@ -54,7 +57,7 @@ filename = 文件名: unlocked = 新方块已解锁! completed = [accent]己研究 techtree = 科技树 -research.list = [LIGHT_GRAY]研究: +research.list = [LIGHT_GRAY]研究: research = 研究 researched = [LIGHT_GRAY]{0}己研究。 players = {0} 玩家在线 @@ -100,11 +103,11 @@ server.outdated = [crimson]过旧的服务器![] server.outdated.client = [crimson]过旧的客户端![] server.version = [lightgray]版本:{0} {1} server.custombuild = [yellow]定制版 -confirmban = 你确认你想拉黑这名玩家吗? -confirmkick = 你确定你想要踢走这名玩家吗? -confirmunban = 你确定你想要取消拉黑这名玩家吗? -confirmadmin = 你确定你想要使这名玩家成为一个管理员吗? -confirmunadmin = 你确定你想要删除这名玩家的管理员地位吗? +confirmban = 确认拉黑这名玩家? +confirmkick = 确定踢走这名玩家? +confirmunban = 确定取消拉黑这名玩家? +confirmadmin = 确定给予这名玩家管理员权限? +confirmunadmin = 确定取消这名玩家的管理员权限? joingame.title = 加入游戏 joingame.ip = 地址: disconnect = 已断开 @@ -115,7 +118,7 @@ server.port = 端口: server.addressinuse = 地址已经在使用中! server.invalidport = 无效的端口号! server.error = [crimson]创建服务器错误:[accent]{0} -save.old = 这个存档属于旧版本游戏,不再被使用。\n\n[LIGHT_GRAY]存档向下兼容将在完整的 4.0 版本中被实现。 +save.old = 这个存档属于旧版本游戏,不再被使用。\n\n[LIGHT_GRAY]存档向下兼容将在完整的 4.0 版本中实现。 save.new = 新存档 save.overwrite = 你确定你要覆盖这个存档位吗? overwrite = 覆盖 @@ -142,24 +145,24 @@ save.autosave = 自动保存:{0} save.map = 地图:{0} save.wave = 波次 {0} save.difficulty = 难度:{0} -save.date = 最后保存过:{0} +save.date = 最后保存:{0} save.playtime = 游戏时间:{0} warning = 警告! confirm = 确认 delete = 删除 -ok = 好的 +ok = 确定 open = 打开 customize = 定制 cancel = 取消 openlink = 打开链接 copylink = 复制链接 back = 返回 -quit.confirm = 你确定你想要退出? +quit.confirm = 确定退出? loading = [accent]加载中…… saving = [accent]保存中…… wave = [accent]波次 {0} wave.waiting = [LIGHT_GRAY]下一波将在{0}秒后到来 -wave.waveInProgress = [LIGHT_GRAY]Wave in progress +wave.waveInProgress = [LIGHT_GRAY]波次进行中 waiting = [LIGHT_GRAY]等待中…… waiting.players = 等待玩家中…… wave.enemies = [LIGHT_GRAY]剩余 {0} 个敌人 @@ -184,9 +187,9 @@ editor.author = 作者: editor.description = 描述: editor.waves = 波数: editor.rules = 规则: -editor.generation = Generation: +editor.generation = 筛选器: editor.ingame = 游戏内编辑 -editor.newmap = New Map +editor.newmap = 新地图 waves.title = 波数 waves.remove = 移除 waves.never = <永不> @@ -201,7 +204,7 @@ waves.copy = 复制到剪贴板 waves.load = 从剪贴板读取 waves.invalid = 剪贴板中无效的波次信息。 waves.copied = 波次信息已复制。 -waves.none = No enemies defined.\nNote that empty wave layouts will automatically be replaced with the default layout. +waves.none = 无自定义敌人。\n请注意,空布局将自动替换为默认布局。 editor.default = [LIGHT_GRAY]<默认> edit = 编辑…… editor.name = 名称: @@ -225,93 +228,97 @@ editor.saved = 已保存! editor.save.noname = 你的地图没有名字!在“地图信息”菜单里设置一个。 editor.save.overwrite = 你的地图覆盖了一个内建的地图!在“地图信息”菜单里重新设置一个不同的名称。 editor.import.exists = [scarlet]无法导入:[]名为‘{0}’的内建地图已存在! -editor.import = 导入... +editor.import = 导入…… editor.importmap = 导入地图 editor.importmap.description = 导入一个已经存在的地图 editor.importfile = 导入文件 editor.importfile.description = 导入一个外置的地图文件 editor.importimage = 导入地形图像 editor.importimage.description = 导入一个外置的地图图像文件 -editor.export = 导出... +editor.export = 导出…… editor.exportfile = 导出文件 editor.exportfile.description = 导出一个地图文件 editor.exportimage = 导出一个地形文件 editor.exportimage.description = 导出一个地图图像文件 editor.loadimage = 导入地形 editor.saveimage = 导出地形 -editor.unsaved = [scarlet]你有未保存的更改![]\n你确定你想要要退出? +editor.unsaved = [scarlet]更改未保存![]\n确定退出? editor.resizemap = 调整地图大小 editor.mapname = 地图名称: editor.overwrite = [accent]警告!\n这将会覆盖一个已经存在的地图。 editor.overwrite.confirm = [scarlet]警告![]存在同名地图。你确定你想要覆盖? editor.selectmap = 选择一个地图加载: -toolmode.replace = Replace -toolmode.replace.description = Draws only on solid blocks. -toolmode.replaceall = Replace All -toolmode.replaceall.description = Replace all blocks in map. -toolmode.orthogonal = Orthogonal -toolmode.orthogonal.description = Draws only orthogonal lines. -toolmode.square = Square -toolmode.square.description = Square brush. -toolmode.eraseores = Erase Ores -toolmode.eraseores.description = Erase only ores. -toolmode.fillteams = Fill Teams -toolmode.fillteams.description = Fill teams instead of blocks. -toolmode.drawteams = Draw Teams -toolmode.drawteams.description = Draw teams instead of blocks. -filters.empty = [LIGHT_GRAY]没有过滤器(filters)!用下方的按钮添加一个。 -filter.distort = 扭曲程度 -filter.noise = 噪音(Noise) + +toolmode.replace = 替换 +toolmode.replace.description = 仅在实心块上绘制。 +toolmode.replaceall = 全部替换 +toolmode.replaceall.description = 替换地图中的所有方块。 +toolmode.orthogonal = 正交线 +toolmode.orthogonal.description = 只绘制正交线。 +toolmode.square = 方形 +toolmode.square.description = 方形刷子 +toolmode.eraseores = 清除矿石 +toolmode.eraseores.description = 只清除矿石。 +toolmode.fillteams = 填充团队 +toolmode.fillteams.description = 填充团队而不是方块。 +toolmode.drawteams = 绘制团队 +toolmode.drawteams.description = 绘制团队而不是方块。 + +filters.empty = [LIGHT_GRAY]没有筛选器!用下方的按钮添加一个。 +filter.distort = Distort +filter.noise = Noise filter.median = Median filter.blend = Blend filter.defaultores = Default Ores -filter.ore = 矿石数量 -filter.rivernoise = 河流噪音(River Noise) +filter.ore = Ore +filter.rivernoise = River Noise filter.mirror = Mirror filter.clear = Clear filter.option.ignore = Ignore -filter.scatter = 分散程度 -filter.terrain = 地形 -filter.option.scale = 规模大小 -filter.option.chance = 机会(Chance) -filter.option.mag = 大小?(Magnitude) -filter.option.threshold = 门槛?(Threshold) -filter.option.circle-scale = 圈规模?(Circle Scale) -filter.option.octaves = 八度?(Octaves) -filter.option.falloff = 减少?(Falloff) +filter.scatter = Scatter +filter.terrain = Terrain +filter.option.scale = Scale +filter.option.chance = Chance +filter.option.mag = Magnitude +filter.option.threshold = Threshold +filter.option.circle-scale = Circle Scale +filter.option.octaves = Octaves +filter.option.falloff = Falloff filter.option.angle = Angle -filter.option.block = 方块 -filter.option.floor = 地面 +filter.option.block = Block +filter.option.floor = Floor filter.option.flooronto = Target Floor -filter.option.wall = 墙 -filter.option.ore = 矿石 -filter.option.floor2 = 第二地面?(Secondary Floor) -filter.option.threshold2 = 第二门槛?(Secondary Threshold) +filter.option.wall = Wall +filter.option.ore = Ore +filter.option.floor2 = Secondary Floor +filter.option.threshold2 = Secondary Threshold filter.option.radius = Radius filter.option.percentile = Percentile + width = 宽度: height = 高度: menu = 菜单 play = 开始游戏 -campaign = Campaign load = 载入游戏 +campaign = 战役模式 save = 保存 -fps = FPS: {0} -tps = TPS: {0} -ping = 延迟: {0}ms +fps = FPS:{0} +tps = TPS:{0} +ping = 延迟:{0}毫秒 language.restart = 为了使语言设置生效请重启游戏。 settings = 设置 tutorial = 教程 editor = 编辑器 mapeditor = 地图编辑器 donate = 打赏 + abandon = 放弃 abandon.text = 这个区域和它的所有资源会被敌人重置。 locked = 已被锁定 complete = [LIGHT_GRAY]完成: zone.requirement = 在{1}中达到{0}波 -resume = 恢复区:\n[LIGHT_GRAY]{0} -bestwave = [LIGHT_GRAY]最好: {0} +resume = 暂停:\n[LIGHT_GRAY]{0} +bestwave = [LIGHT_GRAY]最高波次:{0} launch = < 发射 > launch.title = 发射成功 launch.next = [LIGHT_GRAY]下一个发射机会在第 {0} 波 @@ -324,11 +331,12 @@ zone.unlocked = [LIGHT_GRAY]{0} 已解锁。 zone.requirement.complete = 已达到第{0}波。\n达到解锁{1}的需求。 zone.config.complete = 已达到第{0}波。\n允许携带发射的资源进入此地区。 zone.resources = 地图中的资源: -zone.objective = [lightgray]Objective: [accent]{0} -zone.objective.survival = Survive -zone.objective.attack = Destroy Enemy Core -add = 添加 +zone.objective = [lightgray]目标:[accent]{0} +zone.objective.survival = 生存 +zone.objective.attack = 摧毁敌方核心 +add = 添加…… boss.health = BOSS 生命值 + connectfail = [crimson]服务器连接失败:[accent]{0} error.unreachable = 服务器无法访问。 error.invalidaddress = 地址无效。 @@ -338,7 +346,8 @@ error.alreadyconnected = 已连接。 error.mapnotfound = 找不到地图文件! error.io = 网络 I/O 错误。 error.any = 未知网络错误。 -error.bloom = Failed to initialize bloom.\nYour device may not support it. +error.bloom = 未能初始化特效。\n您的设备可能不支持它。 + zone.groundZero.name = 零号地区 zone.desertWastes.name = 沙漠废物 zone.craters.name = 陨石带 @@ -349,22 +358,24 @@ zone.desolateRift.name = 荒芜裂谷 zone.nuclearComplex.name = 核裂变 zone.overgrowth.name = 增生区 zone.tarFields.name = 石油田 -zone.saltFlats.name = Salt Flats -zone.impact0078.name = Impact 0078 -zone.crags.name = Crags -zone.groundZero.description = The optimal location to begin once more. Low enemy threat. Few resources.\nGather as much lead and copper as possible.\nMove on. -zone.frozenForest.description = Even here, closer to mountains, the spores have spread. The fridgid temperatures cannot contain them forever.\n\nBegin the venture into power. Build combustion generators. Learn to use menders. -zone.desertWastes.description = These wastes are vast, unpredictable, and criss-crossed with derelict sector structures.\nCoal is present in the region. Burn it for power, or synthesize graphite.\n\n[lightgray]This landing location cannot be guaranteed. -zone.saltFlats.description = On the outskirts of the desert lie the Salt Flats. Few resources can be found in this location.\n\nThe enemy has erected a resource storage complex here. Eradicate their core. Leave nothing standing. -zone.craters.description = Water has accumulated in this crater, relic of the old wars. Reclaim the area. Collect sand. Smelt metaglass. Pump water to cool turrets and drills. -zone.ruinousShores.description = Past the wastes, is the shoreline. Once, this location housed a coastal defense array. Not much of it remains. Only the most basic defense structures have remained unscathed, everything else reduced to scrap.\nContinue the expansion outwards. Rediscover the technology. -zone.stainedMountains.description = Further inland lie the mountains, yet untainted by spores.\nExtract the abundant titanium in this area. Learn how to use it.\n\nThe enemy presence is greater here. Do not give them time to send their strongest units. -zone.overgrowth.description = This area is overgrown, closer to the source of the spores.\nThe enemy has established an outpost here. Build dagger units. Destroy it. Reclaim that which was lost. -zone.tarFields.description = The outskirts of an oil production zone, between the mountains and desert. One of the few areas with usable tar reserves.\nAlthough abandoned, this area has some dangerous enemy forces nearby. Do not underestimate them.\n\n[lightgray]Research oil processing technology if possible. -zone.desolateRift.description = An extremely dangerous zone. Plentiful resources, but little space. High risk of destruction. Leave as soon as possible. Do not be fooled by the long spacing between enemy attacks. -zone.nuclearComplex.description = A former facility for the production and processing of thorium, reduced to ruins.\n[lightgray]Research the thorium and its many uses.\n\nThe enemy is present here in great numbers, constantly scouting for attackers. -zone.impact0078.description = -zone.crags.description = +zone.saltFlats.name = 盐碱荒滩 +zone.impact0078.name = 0078号冲击 +zone.crags.name = 悬崖 + +zone.groundZero.description = 重新开始的最佳位置。敌人威胁很小,资源少。\n尽可能收集多的铅和铜。\n行动。 +zone.frozenForest.description = 即使在这里,靠近山脉的地方,孢子也已经扩散。寒冷的温度不可能永远容纳它们。\n\n此行动须投入电力。建造燃烧发电机并学会使用修理者。 +zone.desertWastes.description = 这些废物是巨大的,不可预测的,并且与废弃的结构交错在一起。燃烧它以获取动力或合成石墨。\n\n[lightgray]无法保证此着陆位置。 +zone.saltFlats.description = 在沙漠的郊区有盐滩。在这个地方几乎找不到资源。\n\n敌人在这里建立了一个资源存储区。根除他们的核心。不要留下任何东西。 +zone.craters.description = 水在这个火山口积聚,这是旧战争的遗迹。夺下该区域。收集沙子来冶炼玻璃。用水泵抽水冷却炮塔和钻头。 +zone.ruinousShores.description = 穿过荒地,就是海岸线。曾经这个地方安置了一个海岸防御阵列。现在剩下的不多了,只有最基本的防御结构仍然毫发无损,其他一切都被销毁了。\n继续向外扩展。继续研究科技。 +zone.stainedMountains.description = 在更远的内陆地区是山脉,但没有被孢子污染。\n在这一地区分布着丰富的钛。学习如何使用它。\n\n这里敌人的存在更大。不要给他们时间派出最强的部队。 +zone.overgrowth.description = 这个地区生长过度,靠近孢子的来源。\n敌人在这里建立了一个前哨站。建造尖刀单位来摧毁它并找回丢失的东西。 +zone.tarFields.description = 位于山脉和沙漠之间的产油区的郊区是少数几个有可用焦油储量的地区之一。\n尽管被废弃,但附近仍有一些危险的敌军。不要低估它们。\n\n[lightgray]如果可能,研究石油加工技术。 +zone.desolateRift.description = 非常危险的区域。资源丰富但空间小。破坏风险高。尽快离开,不要被敌人的攻击间隔太长所愚弄。 +zone.nuclearComplex.description = 以前生产和加工钍的设施已变成废墟。\n[浅灰色]研究钍及其多种用途。\n\n敌人在这里大量存在,不断侦察入侵者。 +zone.impact0078.description = <在此处插入说明> +zone.crags.description = <在此处插入说明> + settings.language = 语言 settings.reset = 恢复默认 settings.rebind = 重新绑定 @@ -374,23 +385,23 @@ settings.sound = 声音 settings.graphics = 图像 settings.cleardata = 清除游戏数据…… settings.clear.confirm = 您确定要清除数据吗?\n这个操作无法撤销! -settings.clearall.confirm = [scarlet]警告![]\n这将清除所有数据,包括存档、地图、解锁和键绑定。\n按「是」后,游戏将删除所有数据并自动退出。 -settings.clearunlocks = 清除解锁 -settings.clearall = 清除所有 +settings.clearall.confirm = [scarlet]警告![]\n这将清除所有数据,包括存档、地图、解锁和绑定键。\n按「是」后,游戏将删除所有数据并自动退出。 +settings.clearunlocks = 清除解锁的科技 +settings.clearall = 清除所有数据 paused = 暂停 yes = 是 -no = 不 +no = 否 info.title = [accent]详情 error.title = [crimson]发生了一个错误 error.crashtitle = 发生了一个错误 -attackpvponly = [scarlet]Only available in Attack/PvP modes +attackpvponly = [scarlet]只在攻击/PVP模式中可用 blocks.input = 输入 blocks.output = 输出 blocks.booster = 加成物品/液体 block.unknown = [LIGHT_GRAY]??? blocks.powercapacity = 能量容量 blocks.powershot = 能量/发射 -blocks.damage = Damage +blocks.damage = 伤害 blocks.targetsair = 攻击空中单位 blocks.targetsground = 攻击地面单位 blocks.itemsmoved = 移动速度 @@ -417,6 +428,7 @@ blocks.inaccuracy = 误差 blocks.shots = 发射数 blocks.reload = 重新装弹 blocks.ammo = 子弹 + bar.drillspeed = 挖掘速度:{0}/s bar.efficiency = 效率:{0}% bar.powerbalance = 能量:{0} @@ -427,7 +439,8 @@ bar.liquid = 液体 bar.heat = 热量 bar.power = 电力 bar.progress = 制造进度 -bar.spawned = 单位数量: {0}/{1} +bar.spawned = 单位数量:{0}/{1} + bullet.damage = [stat]{0}[lightgray] 伤害 bullet.splashdamage = [stat]{0}[lightgray] 范围伤害 ~[stat] {1}[lightgray] 格 bullet.incendiary = [stat] 燃烧 @@ -439,6 +452,7 @@ bullet.freezing = [stat] 冰冻 bullet.tarred = [stat] 减速 bullet.multiplier = [stat]{0}[lightgray]x 子弹数量 bullet.reload = [stat]{0}[lightgray]x 装弹 + unit.blocks = 方块 unit.powersecond = 能量单位/秒 unit.liquidsecond = 液体单位/秒 @@ -465,13 +479,13 @@ setting.animatedwater.name = 流动的水 setting.animatedshields.name = 动态画面 setting.antialias.name = 抗锯齿[LIGHT_GRAY] (需要重新启动)[] setting.indicators.name = 队友指示器 -setting.autotarget.name = 自动发射 -setting.keyboard.name = Mouse+Keyboard Controls -setting.fpscap.name = FPS限制 +setting.autotarget.name = 自动射击 +setting.keyboard.name = 鼠标+键盘操控 +setting.fpscap.name = 最大FPS setting.fpscap.none = 无 setting.fpscap.text = {0} FPS -setting.uiscale.name = UI Scaling[lightgray] (require restart)[] -setting.swapdiagonal.name = 总是自动铺设 +setting.uiscale.name = UI缩放比例[lightgray] (需要重新启动)[] +setting.swapdiagonal.name = 自动铺设 setting.difficulty.training = 训练 setting.difficulty.easy = 简单 setting.difficulty.normal = 普通 @@ -497,11 +511,11 @@ setting.mutesound.name = 静音 setting.crashreport.name = 发送匿名崩溃报告 setting.chatopacity.name = 聊天界面透明度 setting.playerchat.name = 显示游戏内聊天界面 -uiscale.reset = UI scale has been changed.\nPress "OK" to confirm this scale.\n[scarlet]Reverting and exiting in[accent] {0}[] settings... -uiscale.cancel = Cancel & Exit -setting.bloom.name = Bloom +uiscale.reset = UI缩放比例已经改变。\n按下“确定”来确定缩放比例\n[accent]{0}[]秒后[scarlet]退出并恢复设定。 +uiscale.cancel = 取消并退出 +setting.bloom.name = 特效 keybind.title = 重新绑定按键 -keybinds.mobile = [scarlet]Most keybinds here are not functional on mobile. Only basic movement is supported. +keybinds.mobile = [scarlet]这里的大多数键绑定在移动设备上都不起作用。仅支持基本运动。 category.general.name = 普通 category.view.name = 查看 category.multiplayer.name = 多人 @@ -547,10 +561,11 @@ mode.pvp.description = 和本地玩家对战。 mode.attack.name = 攻击 mode.attack.description = 没有波数,但是有摧毁敌人基地的任务。 mode.custom = 自定义模式 + rules.infiniteresources = 无限资源 rules.wavetimer = 波次计时器 rules.waves = 波次 -rules.attack = Attack Mode +rules.attack = 攻击模式 rules.enemyCheat = 敌人无限资源 rules.unitdrops = 敌人出生点 rules.unitbuildspeedmultiplier = 单位生产速度倍数 @@ -573,6 +588,7 @@ rules.title.resourcesbuilding = 资源和建造 rules.title.player = 玩家 rules.title.enemy = 敌人 rules.title.unit = 单位 + content.item.name = 物品 content.liquid.name = 液体 content.unit.name = 部队 @@ -595,35 +611,35 @@ item.pyratite.name = 硫 item.metaglass.name = 钢化玻璃 item.scrap.name = 废料 liquid.water.name = 水 -liquid.slag.name = 岩浆 +liquid.slag.name = 矿渣 liquid.oil.name = 石油 liquid.cryofluid.name = 冷冻液 -mech.alpha-mech.name = 阿尔法 +mech.alpha-mech.name = Alpha mech.alpha-mech.weapon = 重型机枪 -mech.alpha-mech.ability = 无人机群 -mech.delta-mech.name = 德尔塔 +mech.alpha-mech.ability = 再生 +mech.delta-mech.name = Delta mech.delta-mech.weapon = 电弧发电机 mech.delta-mech.ability = 放电 -mech.tau-mech.name = 医疗机 +mech.tau-mech.name = Tau mech.tau-mech.weapon = 重构激光 mech.tau-mech.ability = 修复 -mech.omega-mech.name = 欧米茄 +mech.omega-mech.name = Omega mech.omega-mech.weapon = 导弹群 mech.omega-mech.ability = 配置装甲 -mech.dart-ship.name = 飞镖 +mech.dart-ship.name = Dart mech.dart-ship.weapon = 机枪 -mech.javelin-ship.name = 标枪 +mech.javelin-ship.name = Javelin mech.javelin-ship.weapon = 爆裂导弹 mech.javelin-ship.ability = 放电助推器 -mech.trident-ship.name = 三叉戟 +mech.trident-ship.name = Trident mech.trident-ship.weapon = 炸弹 -mech.glaive-ship.name = 阔剑 +mech.glaive-ship.name = Glaive mech.glaive-ship.weapon = 火焰机枪 item.explosiveness = [LIGHT_GRAY]爆炸性:{0} item.flammability = [LIGHT_GRAY]易燃性:{0} item.radioactivity = [LIGHT_GRAY]放射性:{0} unit.health = [LIGHT_GRAY]生命值:{0} -unit.speed = [LIGHT_GRAY]速度:{0} +unit.speed = [LIGHT_GRAY]速度:{0}有 mech.weapon = [LIGHT_GRAY]武器:{0} mech.health = [LIGHT_GRAY]生命值: {0} mech.itemcapacity = [LIGHT_GRAY]物品容量:{0} @@ -634,7 +650,8 @@ mech.buildspeed = [LIGHT_GRAY]建造速度:{0}% liquid.heatcapacity = [LIGHT_GRAY]热容量:{0} liquid.viscosity = [LIGHT_GRAY]粘度:{0} liquid.temperature = [LIGHT_GRAY]温度:{0} -block.sand-boulder.name = Sand Boulder + +block.sand-boulder.name = 沙砂巨石 block.grass.name = 草地 block.salt.name = 盐碱地 block.saltrocks.name = 盐碱岩石 @@ -645,7 +662,7 @@ block.spore-pine.name = 孢子树 block.sporerocks.name = 孢子岩石 block.rock.name = 岩石 block.snowrock.name = 雪岩石 -block.snow-pine.name = Snow Pine +block.snow-pine.name = 雪树 block.shale.name = 页岩地 block.shale-boulder.name = 页岩巨石 block.moss.name = 苔藓地 @@ -738,7 +755,7 @@ block.separator.name = 分离机 block.coal-centrifuge.name = 煤炭离心机 block.power-node.name = 能量节点 block.power-node-large.name = 大型能量节点 -block.surge-tower.name = 远程输电塔 +block.surge-tower.name = 巨浪塔 block.battery.name = 电池 block.battery-large.name = 大型电池 block.combustion-generator.name = 燃烧发电机 @@ -750,13 +767,13 @@ block.pneumatic-drill.name = 气动钻头 block.laser-drill.name = 激光钻头 block.water-extractor.name = 抽水机 block.cultivator.name = 培养机 -block.dart-mech-pad.name = 飞镖 机甲平台 -block.delta-mech-pad.name = 德尔塔 机甲平台 -block.javelin-ship-pad.name = 标枪 机甲平台 -block.trident-ship-pad.name = 三叉戟 机甲平台 -block.glaive-ship-pad.name = 阔剑 机甲平台 -block.omega-mech-pad.name = 欧米茄 机甲平台 -block.tau-mech-pad.name = 医疗机 机甲平台 +block.dart-mech-pad.name = Dart 机甲平台 +block.delta-mech-pad.name = Delta 机甲平台 +block.javelin-ship-pad.name = Javelin 机甲平台 +block.trident-ship-pad.name = Trident 机甲平台 +block.glaive-ship-pad.name = Glaive 机甲平台 +block.omega-mech-pad.name = Omega 机甲平台 +block.tau-mech-pad.name = Tau 机甲平台 block.conduit.name = 导管 block.mechanical-pump.name = 机械泵 block.item-source.name = 物品源 @@ -778,9 +795,9 @@ block.blast-mixer.name = 爆炸混合器 block.solar-panel.name = 太阳能电池 block.solar-panel-large.name = 大型太阳能电池 block.oil-extractor.name = 石油钻井 -block.draug-factory.name = Draug Miner Drone Factory -block.spirit-factory.name = 轻型无人机工厂 -block.phantom-factory.name = 鬼怪无人机工厂 +block.draug-factory.name = 德鲁格采矿机工厂 +block.spirit-factory.name = 幽灵修理机工厂 +block.phantom-factory.name = 鬼怪建造机工厂 block.wraith-factory.name = 幻影战机工厂 block.ghoul-factory.name = 食尸鬼轰炸机工厂 block.dagger-factory.name = 尖刀机甲工厂 @@ -802,7 +819,7 @@ block.blast-drill.name = 爆破钻头 block.thermal-pump.name = 热能泵 block.thermal-generator.name = 热能发电机 block.alloy-smelter.name = 合金冶炼厂 -block.mender.name = Mender +block.mender.name = 修理者 block.mend-projector.name = 修理投影器 block.surge-wall.name = 波动墙 block.surge-wall-large.name = 大型波动墙 @@ -824,9 +841,9 @@ team.orange.name = 橙 team.none.name = 灰 team.green.name = 绿 team.purple.name = 紫 -unit.spirit.name = 轻型无人机 -unit.draug.name = Draug Miner Drone -unit.phantom.name = 鬼怪无人机 +unit.draug.name = 德鲁格采矿机 +unit.spirit.name = 幽灵修理机 +unit.phantom.name = 鬼怪建造机 unit.dagger.name = 尖刀 unit.crawler.name = 爬行者 unit.titan.name = 泰坦 @@ -860,10 +877,11 @@ tutorial.daggerfactory = 建造一个[accent] 尖刀机甲工厂.[]\n\n它可以 tutorial.router = 工厂需要资源来运作.\n造一个路由器来分发传送资源. tutorial.dagger = 链接能源节点到工厂.\n一旦需求满足, 将会制作一个机甲.\n\n根据需要制作更多的钻头,发电机,传送带. tutorial.battle = [LIGHT_GRAY] 敌人[] 的核心已经暴露。\n用你的尖刀机甲摧毁它。 + item.copper.description = 一种有用的结构材料。在各种类型的方块中广泛使用。 -item.lead.description = 一种基本的起始材料。被广泛用于电子设备和液体运输方块。 -item.metaglass.description = 一种超级强硬的复合玻璃。通常用来传送和收藏液体 -item.graphite.description = Mineralized carbon, used for ammunition and electrical insulation. +item.lead.description = 一种基本的起始材料。被广泛用于电子设备和液体运输方块。 +item.metaglass.description = 一种超级强硬的复合玻璃。通常用来传送和收藏液体。 +item.graphite.description = 一种用于弹药和电路绝缘的矿化碳。 item.sand.description = 一种常见的材料,广泛用于冶炼,包括制作合金和助熔剂。 item.coal.description = 一种常见并容易获得的燃料。 item.titanium.description = 一种罕见的超轻金属,被广泛运用于液体运输、钻头和飞机。 @@ -876,105 +894,105 @@ item.surge-alloy.description = 一种具有独特电气性能的高级合金。 item.spore-pod.description = 一种用于制造石油,炸药及燃料的生物质。 item.blast-compound.description = 一种用于炸弹和炸药的挥发性混合物。虽然它可以作为燃料燃烧,但不建议这样做。 item.pyratite.description = 一种燃烧武器中使用的极易燃物质。 -liquid.water.description = 通常用于冷却和废物处理。 -liquid.slag.description = Various different types of molten metal mixed together. Can be separated into its constituent minerals, or sprayed at enemy units as a weapon. -liquid.oil.description = 可以燃烧,爆炸或用作冷却液。 -liquid.cryofluid.description = 用于降温的最有效液体。 -mech.alpha-mech.description = 标准的机甲。具有不错的速度和伤害输出,可以制造多达 3 架无人机以提高进攻能力。 +liquid.water.description = 最有用的液体。常用于冷却和废物处理。 +liquid.slag.description = 各种不同类型的熔融金属混合在一起的液体。可以被分解成其组成矿物,或作为武器喷向敌方单位。 +liquid.oil.description = 用于先进材料生产的液体。可以转换成煤作为燃料,或作为武器喷射和放火。 +liquid.cryofluid.description = 一种由水和钛制成的惰性、无腐蚀性的液体。具有极高的热容量。广泛用作冷却剂。 +mech.alpha-mech.description = 标准控制机甲。基于尖刀单位,具有升级的装甲和建筑能力。比Dart有更多的伤害输出。 mech.delta-mech.description = 一种快速,轻便的机甲,一击即退。对结构造成的伤害很小,但可以用弧形闪电武器很快杀死大量敌方单位。 mech.tau-mech.description = 后勤机甲。治疗友军。可以熄灭火焰并治疗一定范围内的友军。 mech.omega-mech.description = 一种装甲厚重的机甲,用于在前线攻击。它的护甲可以阻挡高达90%的伤害。 -mech.dart-ship.description = 标准飞船。快速轻便,但攻击能力低,采矿速度快。 +mech.dart-ship.description = 标准飞船。快速轻便,但攻击能力低,采矿速度慢。 mech.javelin-ship.description = 一艘一击即退的攻击船。虽然最初很慢,但它可以加速到很快的速度,并飞过敌人的前哨,利用其闪电能力和导弹造成大量伤害。 -mech.trident-ship.description = 一种重型轰炸机。有厚装甲。 +mech.trident-ship.description = 为建造和摧毁敌人防御工事而建造的重型轰炸机。有相当好的装甲。 mech.glaive-ship.description = 一种大型,装甲厚重的武装直升机。配备燃烧机枪。有优秀的加速能力和最快的速度。 -unit.draug.description = A primitive mining drone. Cheap to produce. Expendable. Automatically mines copper and lead in the vicinity. Delivers mined resources to the closest core. -unit.spirit.description = 初始无人机。默认情况下在内核中生成。自动开采矿石,收集物品和修理块。 -unit.phantom.description = 一种先进的无人机单位。自动开采矿石,收集物品和修理块。比初始无人机有效得多。 -unit.dagger.description = 基础的地面单位,在蜂群中很有用。 -unit.crawler.description = A ground unit consisting of a stripped-down frame with high explosives strapped on top. Not particular durable. Explodes on contact with enemies. -unit.titan.description = 高级的有武装地面单位,使用电石作为弹药.攻击地面单位和空中单位. -unit.fortress.description = 一种地面重炮部队。 -unit.eruptor.description = A heavy mech designed to take down structures. Fires a stream of slag at enemy fortifications, melting them and setting volatiles on fire. -unit.chaos-array.description = -unit.eradicator.description = -unit.wraith.description = 一种快速,打了就跑的截击机。 -unit.ghoul.description = 重型地毯轰炸机。用爆炸化合物或黄铁矿作为弹药。 -unit.revenant.description = A heavy, hovering missile array. -unit.lich.description = -unit.reaper.description = -block.graphite-press.description = Compresses chunks of coal into pure sheets of graphite. -block.multi-press.description = An upgraded version of the graphite press. Employs water and power to process coal quickly and efficiently. +unit.draug.description = 一种原始的采矿机。生产成本低,消耗品。在附近自动开采铜和铅。将开采的资源输送到最近的核心。 +unit.spirit.description = 一种改进的德鲁格无人机,设计用于维修而不是采矿。自动修复该区域中任何损坏的块。 +unit.phantom.description = 一种先进的无人机。跟随玩家并协助建造。 +unit.dagger.description = 一种最基本的地面机甲。生产成本低。在蜂群中使用时很有用。 +unit.crawler.description = 一种地面装置,由一个框架和绑在上面的烈性炸药组成。不是特别耐用。与敌人接触后爆炸。 +unit.titan.description = 一种先进的装甲地面部队。攻击地面和空中目标。配备两个微型灼烧级火焰喷射器。 +unit.fortress.description = 一种重型炮兵机甲。装备两门改进型冰雹炮,用于对敌军建筑物和部队进行远程攻击。 +unit.eruptor.description = 一种用来拆除建筑物的重型机甲。在敌人的防御工事上发射一股熔渣,将它们熔化并点燃挥发物。 +unit.chaos-array.description = +unit.eradicator.description = +unit.wraith.description = 一种快速、一击即退的拦截器机甲。目标是发电机。 +unit.ghoul.description = 一种地毯式轰炸机。通过敌人的结构进行攻击,并瞄准关键的基础设施。 +unit.revenant.description = 一种发射导弹的重型飞行机甲 +unit.lich.description = +unit.reaper.description = +block.graphite-press.description = 把大块的煤压缩成纯石墨片。 +block.multi-press.description = 石墨压缩机的升级版。利用水和电力快速高效地处理煤炭。 block.silicon-smelter.description = 用高纯度的焦炭来加工沙子以生产硅。 block.kiln.description = 将铅和沙子熔炼成钢化玻璃,需要少量电力。 block.plastanium-compressor.description = 用石油和钛生产塑钢。 block.phase-weaver.description = 用放射性钍和大量沙子生产相织物。 block.alloy-smelter.description = 用钛,铅,硅和铜生产浪涌合金。 -block.cryofluidmixer.description = 水和钛结合到低温流体中,冷却效率更高。 -block.blast-mixer.description = 用油将硫转化为不易燃但更具爆炸性的爆炸化合物。 -block.pyratite-mixer.description = 用煤,铅和沙子混合成高度易燃的硫。 -block.melter.description = 将废料熔化成岩浆,以便进一步加工或用于炮塔子弹。 -block.separator.description = 从岩浆中提取有用的矿物。 -block.spore-press.description = 压缩孢子荚得到石油。 block.pulverizer.description = 将废料压碎成沙子。当缺少天然沙子时很有用。 -block.coal-centrifuge.description = Solidifes oil into chunks of coal. +block.pyratite-mixer.description = 用煤,铅和沙子混合成高度易燃的硫。 +block.blast-mixer.description = 用油将硫转化为不易燃但更具爆炸性的爆炸化合物。 +block.cryofluidmixer.description = 水和钛结合到低温流体中,冷却效率更高。 +block.melter.description = 将废料熔化成矿渣,以便进一步加工或用于炮塔子弹。 block.incinerator.description = 用于除掉任何多余的物品或液体。 -block.power-void.description = 消耗输入的所有功率。仅限沙箱。 -block.power-source.description = 无限输出功率。仅限沙箱。 -block.item-source.description = 无限输出物品。仅限沙箱。 -block.item-void.description = 在不使用电源的情况下销毁任何进入它的物品。仅限沙箱。 -block.liquid-source.description = 无限输出液体。仅限沙箱。 +block.spore-press.description = 压缩孢子荚得到石油。 +block.separator.description = 从矿渣中提取有用的矿物。 +block.coal-centrifuge.description = 使石油凝固成煤块。 +block.item-source.description = 无限输出物品。仅限沙盒。 +block.liquid-source.description = 无限输出液体。仅限沙盒。 +block.item-void.description = 在不使用电源的情况下销毁任何进入它的物品。仅限沙盒。 +block.power-source.description = 无限输出功率。仅限沙盒。 +block.power-void.description = 消耗输入的所有功率。仅限沙盒。 block.copper-wall.description = 廉价的防守区块。\n用于保护前几波中的核心和炮塔。 -block.copper-wall-large.description = 廉价的防御块。\n用于保护前几个波浪中的核心和炮塔。\n跨越多个块。 -block.titanium-wall.description = A moderately strong defensive block.\nProvides moderate protection from enemies. -block.titanium-wall-large.description = A moderately strong defensive block.\nProvides moderate protection from enemies.\nSpans multiple tiles. +block.copper-wall-large.description = 廉价的防御块。\n用于保护前几个波浪中的核心和炮塔。\n跨越多个区块。 +block.titanium-wall.description = 中等强度的防御挡块。\n提供中等强度的防御以抵御敌人。 +block.titanium-wall-large.description = 一个中等强度的防御块。\n提供中等强度的防御以防敌人攻击。\n跨越多个区块。 block.thorium-wall.description = 强大的防守区块。\n很好的防御敌人。 -block.thorium-wall-large.description = 强大的防守区块。\n很好地防御敌人。\n跨越多个块。 +block.thorium-wall-large.description = 强大的防守区块。\n很好地防御敌人。\n跨越多个区块。 block.phase-wall.description = 没有钍墙那样坚固,但是它可以使不太强的子弹发生偏转。 -block.phase-wall-large.description = 没有钍墙那样坚固,但是它可以使不太强的子弹发生偏转。\n跨越多个块。 +block.phase-wall-large.description = 没有钍墙那样坚固,但是它可以使不太强的子弹发生偏转。\n跨越多个区块。 block.surge-wall.description = 强大的防守区块。\n有很小的机会向攻击者发射闪电。 block.surge-wall-large.description = 强大的防御区块。\n有很小的机会向攻击者发射闪电。\n跨越多个区块。 block.door.description = 一扇小门,可以通过点击打开和关闭。\n如果打开,敌人可以射击并穿过。 -block.door-large.description = 一扇大门,可以通过点击打开和关闭。\n如果打开,敌人可以射击并穿过。\n扫过多个瓷砖。 -block.mender.description = Periodically repairs blocks in its vicinity. Keeps defenses repaired in-between waves.\nOptionally uses silicon to boost range and efficiency. +block.door-large.description = 一扇大门,可以通过点击打开和关闭。\n如果打开,敌人可以射击并穿过。\n跨越多个区块。 +block.mender.description = 定期修理附近的方块,使防御系统在波与波之间得到修复。\n通常使用硅来提高范围和效率。 block.mend-projector.description = 定期修复附近的建筑物。 block.overdrive-projector.description = 提高附近建筑物的速度,如钻头和传送带。 -block.force-projector.description = 自身周围创建一个六边形力场,保护建筑物和内部单位免受子弹的伤害。 +block.force-projector.description = 自身周围创建一个六边形力场,使建筑物和内部单位免受子弹的伤害。 block.shock-mine.description = 伤害踩到它的敌人。敌人几乎看不到它。 block.conveyor.description = 初级传送带。将物品向前移动并自动将它们放入炮塔或工厂中。可旋转方向。 block.titanium-conveyor.description = 高级传送带。能比初级传送带更快地移动物品。 -block.junction.description = 为两条交叉传送带的桥梁。适用于两种不同传送带将不同材料运送到不同位置的情况。 +block.router.description = 从一个方向接受物品,并将它们平均输出到最多3个其他方向。用于将材料从一个源分割为多个目标。 +block.distributor.description = 一个高级路由器,可以将物品分成最多7个方向。 block.bridge-conveyor.description = 高级项目传输块。允许在跨越任何地形或建筑物上运输物品,最多跨越3个块。 block.phase-conveyor.description = 高级传送带。使用电力将物品传送到距离几个块的相位传送带上。 block.sorter.description = 对物品进行分类。如果物品与所选种类,则允许其通过。否则,物品将从左边和右边输出。 -block.router.description = 从一个方向接受物品,并将它们平均输出到最多3个其他方向。用于将材料从一个源分割为多个目标。 -block.distributor.description = 一个高级路由器,可以将物品分成最多7个方向。 block.overflow-gate.description = 分离器和路由器的组合,如果前面被挡住,则向从左和右输出。 +block.junction.description = 两条交叉传送带的桥梁。适用于两条不同传送带将不同材料运送到不同位置的情况。 block.mass-driver.description = 终极传送带。收集几件物品,然后将它们射向长距离外的另一个批量传送带。 -block.mechanical-pump.description = 一种输出速度慢但没有功耗的廉价泵。 -block.rotary-pump.description = 一种先进的泵,通过使用动力使速度加倍。 -block.thermal-pump.description = 终级水泵。 block.conduit.description = 基本液体传输块。像输送机一样工作,但用于液体。最适用于提取器,泵或其他导管。 block.pulse-conduit.description = 高级液体传输块。比标准导管更快地输送液体并储存更多液体。 +block.phase-conduit.description = 高级液体传输块。使用电力将液体传送到多个块上的连接相管道。 block.liquid-router.description = 接受来自一个方向的液体并将它们平均输出到最多3个其他方向。也可以储存一定量的液体。用于将液体从一个源分成多个目标。 block.liquid-tank.description = 存储大量液体。当存在对材料的非恒定需求或作为冷却重要块的安全措施时,将其用于创建缓冲区。 block.liquid-junction.description = 作为两个交叉管道的桥梁。适用于两种不同导管将不同液体输送到不同位置的情况。 block.bridge-conduit.description = 高级液体传输块。允许在任何地形或建筑物的最多3个块上运输液体。 -block.phase-conduit.description = 高级液体传输块。使用电力将液体传送到多个块上的连接相管道。 -block.power-node.description = 连接节点传输电源。最多可连接四个电源,接收器或节点。节点将从任何相邻块接收电力或向其供电。 +block.mechanical-pump.description = 一种输出速度慢但没有功耗的廉价泵。 +block.rotary-pump.description = 一种先进的泵,通过使用动力使速度加倍。 +block.thermal-pump.description = 终级水泵。 +block.power-node.description = 连接节点传输电源。最多可连接四个电源,用电器或节点。节点将从任何相邻块接收电力或向其供电。 block.power-node-large.description = 传输径大于电源节点,最多可连接六个电源,接收器或节点。 -block.surge-tower.description = An extremely long-range power node with fewer available connections. +block.surge-tower.description = 具有较少可用连接的远程电源节点。 block.battery.description = 储存电力,当储存有能量时,可在电力短缺时提供电力。 block.battery-large.description = 比普通电池容量更大。 block.combustion-generator.description = 通过燃烧油或易燃材料产生电力。 block.thermal-generator.description = 当放置在热的地方时发电。 block.turbine-generator.description = 比燃烧发电机更有效,但需要额外的水。 -block.differential-generator.description = Generates large amounts of energy. Utilizes the temperature difference between cryofluid and burning pyratite. block.rtg-generator.description = 一种放射性同位素热电发电机,它不需要冷却,但功率低于钍反应堆。 block.solar-panel.description = 标准太阳能面板,提供少量电力。 block.solar-panel-large.description = 比标准太阳能电池板提供更好的电源,但构建起来要贵得多。 block.thorium-reactor.description = 高放射性钍产生大量电力。需要持续冷却。如果供应的冷却剂量不足,会剧烈爆炸。 -block.impact-reactor.description = An advanced generator, capable of creating massive amounts of power at peak efficiency. Requires a significant power input to kickstart the process. +block.differential-generator.description = 产生大量的能量。利用低温流体和燃烧的硫之间的温差。 +block.impact-reactor.description = 一种先进的发电机,能够以最高效率产生大量的电力。需要大量的电源输入才能启动进程。 block.mechanical-drill.description = 便宜的钻头。放置在适当的块上时,无限期地以缓慢的速度输出物品。 block.pneumatic-drill.description = 一种改进的钻头,它更快,能够利用气压处理更硬的材料。 block.laser-drill.description = 通过激光技术更快地钻孔,但需要电源。此外,这种钻头可以回收放射性钍。 @@ -982,43 +1000,43 @@ block.blast-drill.description = 终极钻头,需要大量电力。 block.water-extractor.description = 从地下提取水。当附近没有湖泊时使用它。 block.cultivator.description = 将微小浓度的孢子培养成工业用的孢子荚。 block.oil-extractor.description = 使用大量的电力从沙子中提取石油。当附近没有直接的石油来源时使用它。 -block.core-shard.description = The first iteration of the core capsule. Once destroyed, all contact to the region is lost. Do not let this happen. -block.core-foundation.description = The second version of the core. Better armored. Stores more resources. -block.core-nucleus.description = The third and final iteration of the core capsule. Extremely well armored. Stores massive amounts of resources. -block.vault.description = 存储大量物品。当存在非恒定的材料需求时,使用它来创建缓冲区。 [LIGHT_GRAY]卸载器[]可用于从仓库中获取物品。 -block.container.description = 存储少量物品。当存在非恒定的材料需求时,使用它来创建缓冲区。 [LIGHT_GRAY]卸载器[]可用于从容器中获取物品。 +block.core-shard.description = 核心第一代。一旦被摧毁,与该地区的所有联系都将失去。不要让这种情况发生。 +block.core-foundation.description = 核心第二代。有更好的装甲。可以存储更多资源。 +block.core-nucleus.description = 核心第三代,也是最后一代。装甲非常好。存储大量资源。 block.unloader.description = 物品从容器,仓库或核心卸载到传送带上或直接卸载到相邻的块中。可以通过点击卸载器来更改要卸载的项目类型。 -block.launch-pad.description = 不通过核心发射物体。尚未完成。 -block.launch-pad-large.description = An improved version of the launch pad. Stores more items. Launches more frequently. +block.container.description = 存储少量物品。当存在非恒定的材料需求时,使用它来创建缓冲区。 [LIGHT_GRAY]卸载器[]可用于从容器中获取物品。 +block.vault.description = 存储大量物品。当存在非恒定的材料需求时,使用它来创建缓冲区。 [LIGHT_GRAY]卸载器[]可用于从仓库中获取物品。 +block.launch-pad.description = 不通过核心发射物体。 +block.launch-pad-large.description = 发射台的改进版。存储更多物体。启动频率更高。 block.duo.description = 小而便宜的炮塔。 block.scatter.description = 中型防空炮塔,向空中单位发射铅或废料。 -block.scorch.description = Burns any ground enemies close to it. Highly effective at close range. -block.hail.description = 小型炮兵炮台。 -block.wave.description = 中型快速炮塔,射出液体泡泡。 -block.lancer.description = 中型炮塔,发射带电的电子束。 +block.scorch.description = 小型炮塔,燃烧任何靠近它的地面敌人。近距离高效。 block.arc.description = 小型炮塔,发射电弧。 -block.swarmer.description = 发射爆炸导弹的中型炮塔。 +block.hail.description = 小型炮兵炮台。 +block.lancer.description = 中型炮塔,发射带电的电子束。 +block.wave.description = 中型快速炮塔,射出液体泡泡。 block.salvo.description = 中型炮塔,齐射射击。 -block.fuse.description = 发射强大的短程光束的大型炮塔。 +block.swarmer.description = 中型炮塔,发射爆炸导弹。 block.ripple.description = 大型炮兵炮塔,可同时向多个目标开火。 block.cyclone.description = 大型快速炮塔。 +block.fuse.description = 大型炮塔,发射强大的短程光束。 block.spectre.description = 大型炮塔,一次射出两颗强大的子弹。 block.meltdown.description = 发射强大的远程光束的大型炮塔。 -block.draug-factory.description = Produces Draug mining drones. -block.spirit-factory.description = 生产轻型无人机,用于开采矿石和修复块。 -block.phantom-factory.description = 生产高级无人机单元,它比轻型无人机更有效。 +block.crawler-factory.description = 生产快速自毁单元。 +block.draug-factory.description = 生产德鲁格釆矿机。 +block.spirit-factory.description = 生产幽灵修理机。 +block.phantom-factory.description = 生产鬼怪建造机。 block.wraith-factory.description = 生产快速截击机。 block.ghoul-factory.description = 生产重型地毯轰炸机。 -block.revenant-factory.description = 生产重型激光地面单元。 block.dagger-factory.description = 生产基本地面单位。 -block.crawler-factory.description = Produces fast self-destructing swarm units. block.titan-factory.description = 生产先进的装甲地面单位。 -block.fortress-factory.description = 生产重型火炮地面部队。 +block.fortress-factory.description = 生产重型地面火炮部队。 +block.revenant-factory.description = 生产重型导弹部队。 block.repair-point.description = 连续治疗附近最近的受损单位。 -block.dart-mech-pad.description = Provides transformation into a basic attack mech.\nUse by tapping while standing on it. -block.delta-mech-pad.description = 离开你当前的装置并换成一个快速,轻装甲的机械装置,用于快速攻击。\n站在上面时双击切换。 -block.tau-mech-pad.description = 离开你当前的装置并换成一个可以治愈友方建筑物和单位的支撑机械。\n站在上面时双击切换。 -block.omega-mech-pad.description = 离开你当前的装置并换成一个笨重且装甲良好的机甲,用于前线攻击。\n站在上面时双击切换。 -block.javelin-ship-pad.description = 离开你当前的装置,换上一个强大而快速的截击机,用闪电武器。\n站在上面时双击切换。 +block.dart-mech-pad.description = 离开你当前的装置,换成一个基本攻击机甲。\n站在上面时双击切换。 block.trident-ship-pad.description = 离开你当前的装置,换成一个装甲合理的重型轰炸机。\n站在上面时双击切换。 +block.javelin-ship-pad.description = 离开你当前的装置,换成一个强大而快速的截击机,用闪电武器。\n站在上面时双击切换。 block.glaive-ship-pad.description = 离开现有的装置,换成装甲良好的大型武装直升机。\n站在上面时双击切换。 +block.tau-mech-pad.description = 离开你当前的装置并换成一个可以治愈友方建筑物和单位的支撑机械。\n站在上面时双击切换。 +block.delta-mech-pad.description = 离开你当前的装置并换成一个快速,轻装甲的机械装置,用于快速攻击。\n站在上面时双击切换。 +block.omega-mech-pad.description = 离开你当前的装置并换成一个笨重且装甲良好的机甲,用于前线攻击。\n站在上面时双击切换。 \ No newline at end of file diff --git a/core/assets/maps/overgrowth.msav b/core/assets/maps/overgrowth.msav index 927f58d1c4..23db0583ed 100644 Binary files a/core/assets/maps/overgrowth.msav and b/core/assets/maps/overgrowth.msav differ diff --git a/core/assets/maps/saltFlats.msav b/core/assets/maps/saltFlats.msav index 6d03b08641..83debe54dd 100644 Binary files a/core/assets/maps/saltFlats.msav and b/core/assets/maps/saltFlats.msav differ diff --git a/core/assets/sounds/artillery.ogg b/core/assets/sounds/artillery.ogg index 8debe8b262..e3651f5ce1 100644 Binary files a/core/assets/sounds/artillery.ogg and b/core/assets/sounds/artillery.ogg differ diff --git a/core/assets/sounds/back.ogg b/core/assets/sounds/back.ogg index 98707d207f..381cf83079 100644 Binary files a/core/assets/sounds/back.ogg and b/core/assets/sounds/back.ogg differ diff --git a/core/assets/sounds/bang.ogg b/core/assets/sounds/bang.ogg index 8debe8b262..afbd099e6f 100644 Binary files a/core/assets/sounds/bang.ogg and b/core/assets/sounds/bang.ogg differ diff --git a/core/assets/sounds/beam.ogg b/core/assets/sounds/beam.ogg index d628942bd1..9b39f2363c 100644 Binary files a/core/assets/sounds/beam.ogg and b/core/assets/sounds/beam.ogg differ diff --git a/core/assets/sounds/bigshot.ogg b/core/assets/sounds/bigshot.ogg index da92f34e54..3218eec651 100644 Binary files a/core/assets/sounds/bigshot.ogg and b/core/assets/sounds/bigshot.ogg differ diff --git a/core/assets/sounds/boom.ogg b/core/assets/sounds/boom.ogg index d024eb74c0..4cce577fe9 100644 Binary files a/core/assets/sounds/boom.ogg and b/core/assets/sounds/boom.ogg differ diff --git a/core/assets/sounds/break.ogg b/core/assets/sounds/break.ogg old mode 100755 new mode 100644 index 28266f8148..30ca95aea2 Binary files a/core/assets/sounds/break.ogg and b/core/assets/sounds/break.ogg differ diff --git a/core/assets/sounds/build.ogg b/core/assets/sounds/build.ogg index 97155ae9e0..8235d41eb9 100644 Binary files a/core/assets/sounds/build.ogg and b/core/assets/sounds/build.ogg differ diff --git a/core/assets/sounds/buttonClick.ogg b/core/assets/sounds/buttonClick.ogg old mode 100755 new mode 100644 index fb48038764..5f225eadcc Binary files a/core/assets/sounds/buttonClick.ogg and b/core/assets/sounds/buttonClick.ogg differ diff --git a/core/assets/sounds/click.ogg b/core/assets/sounds/click.ogg old mode 100755 new mode 100644 index a993b2cd53..4960f9098f Binary files a/core/assets/sounds/click.ogg and b/core/assets/sounds/click.ogg differ diff --git a/core/assets/sounds/conveyor.ogg b/core/assets/sounds/conveyor.ogg new file mode 100644 index 0000000000..9f989d70d0 Binary files /dev/null and b/core/assets/sounds/conveyor.ogg differ diff --git a/core/assets/sounds/corexplode.ogg b/core/assets/sounds/corexplode.ogg index b5c8290481..b26ff4a64c 100644 Binary files a/core/assets/sounds/corexplode.ogg and b/core/assets/sounds/corexplode.ogg differ diff --git a/core/assets/sounds/door.ogg b/core/assets/sounds/door.ogg old mode 100755 new mode 100644 index 30b57f0189..121b3c3037 Binary files a/core/assets/sounds/door.ogg and b/core/assets/sounds/door.ogg differ diff --git a/core/assets/sounds/drill.ogg b/core/assets/sounds/drill.ogg old mode 100755 new mode 100644 index c2c005051e..6aab153a47 Binary files a/core/assets/sounds/drill.ogg and b/core/assets/sounds/drill.ogg differ diff --git a/core/assets/sounds/empty.ogg b/core/assets/sounds/empty.ogg index 917d0e3611..6c7ecbe8e0 100644 Binary files a/core/assets/sounds/empty.ogg and b/core/assets/sounds/empty.ogg differ diff --git a/core/assets/sounds/explosion.ogg b/core/assets/sounds/explosion.ogg index b771280848..7c7f2c43da 100644 Binary files a/core/assets/sounds/explosion.ogg and b/core/assets/sounds/explosion.ogg differ diff --git a/core/assets/sounds/explosionbig.ogg b/core/assets/sounds/explosionbig.ogg index b521732f79..30cb7933f0 100644 Binary files a/core/assets/sounds/explosionbig.ogg and b/core/assets/sounds/explosionbig.ogg differ diff --git a/core/assets/sounds/fire.ogg b/core/assets/sounds/fire.ogg index 2626a9fd7e..0201ee8ea4 100644 Binary files a/core/assets/sounds/fire.ogg and b/core/assets/sounds/fire.ogg differ diff --git a/core/assets/sounds/flame.ogg b/core/assets/sounds/flame.ogg index e8f1a051db..ef203e0524 100644 Binary files a/core/assets/sounds/flame.ogg and b/core/assets/sounds/flame.ogg differ diff --git a/core/assets/sounds/flame2.ogg b/core/assets/sounds/flame2.ogg index 917d0e3611..812774a6e6 100644 Binary files a/core/assets/sounds/flame2.ogg and b/core/assets/sounds/flame2.ogg differ diff --git a/core/assets/sounds/laser.ogg b/core/assets/sounds/laser.ogg index 3514a627d2..3a727c5053 100644 Binary files a/core/assets/sounds/laser.ogg and b/core/assets/sounds/laser.ogg differ diff --git a/core/assets/sounds/laserbig.ogg b/core/assets/sounds/laserbig.ogg index 97b4260d49..4aa6658cf6 100644 Binary files a/core/assets/sounds/laserbig.ogg and b/core/assets/sounds/laserbig.ogg differ diff --git a/core/assets/sounds/machine.ogg b/core/assets/sounds/machine.ogg new file mode 100644 index 0000000000..42429721a0 Binary files /dev/null and b/core/assets/sounds/machine.ogg differ diff --git a/core/assets/sounds/message.ogg b/core/assets/sounds/message.ogg old mode 100755 new mode 100644 index 84937baf4d..2db223d24e Binary files a/core/assets/sounds/message.ogg and b/core/assets/sounds/message.ogg differ diff --git a/core/assets/sounds/missile.ogg b/core/assets/sounds/missile.ogg index 466f610b64..eb13976d87 100644 Binary files a/core/assets/sounds/missile.ogg and b/core/assets/sounds/missile.ogg differ diff --git a/core/assets/sounds/pew.ogg b/core/assets/sounds/pew.ogg index b26373883d..0c1df7f711 100644 Binary files a/core/assets/sounds/pew.ogg and b/core/assets/sounds/pew.ogg differ diff --git a/core/assets/sounds/place.ogg b/core/assets/sounds/place.ogg index 2fca68203c..ff1d05c211 100644 Binary files a/core/assets/sounds/place.ogg and b/core/assets/sounds/place.ogg differ diff --git a/core/assets/sounds/press.ogg b/core/assets/sounds/press.ogg index e52cdb2270..419cd38847 100644 Binary files a/core/assets/sounds/press.ogg and b/core/assets/sounds/press.ogg differ diff --git a/core/assets/sounds/release.ogg b/core/assets/sounds/release.ogg index 865d547ef2..89efd2ca2e 100644 Binary files a/core/assets/sounds/release.ogg and b/core/assets/sounds/release.ogg differ diff --git a/core/assets/sounds/respawn.ogg b/core/assets/sounds/respawn.ogg index 8fbe54ded6..b194989ebf 100644 Binary files a/core/assets/sounds/respawn.ogg and b/core/assets/sounds/respawn.ogg differ diff --git a/core/assets/sounds/respawning.ogg b/core/assets/sounds/respawning.ogg index 402b70f89c..cc0e4332f8 100644 Binary files a/core/assets/sounds/respawning.ogg and b/core/assets/sounds/respawning.ogg differ diff --git a/core/assets/sounds/shoot.ogg b/core/assets/sounds/shoot.ogg index c50b9ff90a..d4b1c791c6 100644 Binary files a/core/assets/sounds/shoot.ogg and b/core/assets/sounds/shoot.ogg differ diff --git a/core/assets/sounds/shootBig.ogg b/core/assets/sounds/shootBig.ogg index ba796b2dfc..9bc3bf055d 100644 Binary files a/core/assets/sounds/shootBig.ogg and b/core/assets/sounds/shootBig.ogg differ diff --git a/core/assets/sounds/shootSnap.ogg b/core/assets/sounds/shootSnap.ogg index c50b9ff90a..fc692486a0 100644 Binary files a/core/assets/sounds/shootSnap.ogg and b/core/assets/sounds/shootSnap.ogg differ diff --git a/core/assets/sounds/shotgun.ogg b/core/assets/sounds/shotgun.ogg index 5e26f3f1e4..47d5213579 100644 Binary files a/core/assets/sounds/shotgun.ogg and b/core/assets/sounds/shotgun.ogg differ diff --git a/core/assets/sounds/spark.ogg b/core/assets/sounds/spark.ogg index 58fbfb4030..ac61a476de 100644 Binary files a/core/assets/sounds/spark.ogg and b/core/assets/sounds/spark.ogg differ diff --git a/core/assets/sounds/splash.ogg b/core/assets/sounds/splash.ogg index 0ca516e674..4b6e5eec53 100644 Binary files a/core/assets/sounds/splash.ogg and b/core/assets/sounds/splash.ogg differ diff --git a/core/assets/sounds/spray.ogg b/core/assets/sounds/spray.ogg new file mode 100644 index 0000000000..7bddeb6685 Binary files /dev/null and b/core/assets/sounds/spray.ogg differ diff --git a/core/assets/sounds/thruster.ogg b/core/assets/sounds/thruster.ogg old mode 100755 new mode 100644 index fad9090768..d8e7efb086 Binary files a/core/assets/sounds/thruster.ogg and b/core/assets/sounds/thruster.ogg differ diff --git a/core/assets/sounds/unlock.ogg b/core/assets/sounds/unlock.ogg old mode 100755 new mode 100644 index 04fe1efae0..7149b695be Binary files a/core/assets/sounds/unlock.ogg and b/core/assets/sounds/unlock.ogg differ diff --git a/core/assets/sounds/wave.ogg b/core/assets/sounds/wave.ogg index f5af16677e..bf74702474 100644 Binary files a/core/assets/sounds/wave.ogg and b/core/assets/sounds/wave.ogg differ diff --git a/core/assets/sounds/windowHide.ogg b/core/assets/sounds/windowHide.ogg old mode 100755 new mode 100644 index 92fbd146e8..9039d4e3b4 Binary files a/core/assets/sounds/windowHide.ogg and b/core/assets/sounds/windowHide.ogg differ diff --git a/core/assets/sprites/sprites4.png b/core/assets/sprites/sprites4.png index 84ad928d4c..8887453e93 100644 Binary files a/core/assets/sprites/sprites4.png and b/core/assets/sprites/sprites4.png differ diff --git a/core/convert_sounds.sh b/core/convert_sounds.sh new file mode 100755 index 0000000000..02db793811 --- /dev/null +++ b/core/convert_sounds.sh @@ -0,0 +1,12 @@ +#convert from stereo to mono +cd assets/sounds/ +for i in *.ogg; do + echo $i + ffmpeg -i "$i" -ac 1 "OUT_$i" +done + +find . -type f ! -name "OUT_*" -delete + +for file in OUT_*; do mv "$file" "${file#OUT_}"; done; + +cd ../../ diff --git a/core/src/io/anuke/mindustry/Vars.java b/core/src/io/anuke/mindustry/Vars.java index 183eb56a0c..f995df588b 100644 --- a/core/src/io/anuke/mindustry/Vars.java +++ b/core/src/io/anuke/mindustry/Vars.java @@ -133,6 +133,7 @@ public class Vars{ public static GlobalData data; public static EntityCollisions collisions; public static DefaultWaves defaultWaves; + public static LoopControl loops; public static Control control; public static Logic logic; @@ -181,6 +182,7 @@ public class Vars{ content.setVerbose(); } + loops = new LoopControl(); defaultWaves = new DefaultWaves(); collisions = new EntityCollisions(); diff --git a/core/src/io/anuke/mindustry/content/Blocks.java b/core/src/io/anuke/mindustry/content/Blocks.java index 6d2ec8615c..cf947b02e7 100644 --- a/core/src/io/anuke/mindustry/content/Blocks.java +++ b/core/src/io/anuke/mindustry/content/Blocks.java @@ -1608,8 +1608,8 @@ public class Blocks implements ContentList{ shootDuration = 220f; powerUse = 14f; shootSound = Sounds.laserbig; - idleSound = Sounds.beam; - idleSoundVolume = 2f; + activeSound = Sounds.beam; + activeSoundVolume = 2f; health = 200 * size * size; consumes.add(new ConsumeLiquidFilter(liquid -> liquid.temperature <= 0.5f && liquid.flammability < 0.1f, 0.5f)).update(false); diff --git a/core/src/io/anuke/mindustry/content/Fx.java b/core/src/io/anuke/mindustry/content/Fx.java index 0272a7dc58..6773815d5d 100644 --- a/core/src/io/anuke/mindustry/content/Fx.java +++ b/core/src/io/anuke/mindustry/content/Fx.java @@ -734,7 +734,7 @@ public class Fx implements ContentList{ shootSmallFlame = new Effect(32f, e -> { Draw.color(Pal.lightFlame, Pal.darkFlame, Color.GRAY, e.fin()); - Angles.randLenVectors(e.id, 8, e.finpow() * 44f, e.rotation, 10f, (x, y) -> { + Angles.randLenVectors(e.id, 8, e.finpow() * 60f, e.rotation, 10f, (x, y) -> { Fill.circle(e.x + x, e.y + y, 0.65f + e.fout() * 1.5f); }); @@ -744,7 +744,7 @@ public class Fx implements ContentList{ shootPyraFlame = new Effect(33f, e -> { Draw.color(Pal.lightPyraFlame, Pal.darkPyraFlame, Color.GRAY, e.fin()); - Angles.randLenVectors(e.id, 10, e.finpow() * 50f, e.rotation, 10f, (x, y) -> { + Angles.randLenVectors(e.id, 10, e.finpow() * 70f, e.rotation, 10f, (x, y) -> { Fill.circle(e.x + x, e.y + y, 0.65f + e.fout() * 1.6f); }); diff --git a/core/src/io/anuke/mindustry/content/UnitTypes.java b/core/src/io/anuke/mindustry/content/UnitTypes.java index 367786db79..95fcc9e82a 100644 --- a/core/src/io/anuke/mindustry/content/UnitTypes.java +++ b/core/src/io/anuke/mindustry/content/UnitTypes.java @@ -196,7 +196,7 @@ public class UnitTypes implements ContentList{ mass = 5f; hitsize = 20f; rotatespeed = 0.06f; - health = 4000; + health = 3000; weapon = new Weapon("chaos"){{ length = 8f; reload = 50f; @@ -220,7 +220,7 @@ public class UnitTypes implements ContentList{ mass = 5f; hitsize = 20f; rotatespeed = 0.06f; - health = 10000; + health = 9000; weapon = new Weapon("eradication"){{ length = 13f; reload = 30f; @@ -313,7 +313,7 @@ public class UnitTypes implements ContentList{ }}; lich = new UnitType("lich", Revenant.class, Revenant::new){{ - health = 7000; + health = 6000; mass = 20f; hitsize = 40f; speed = 0.01f; @@ -346,7 +346,7 @@ public class UnitTypes implements ContentList{ }}; reaper = new UnitType("reaper", Revenant.class, Revenant::new){{ - health = 13000; + health = 11000; mass = 30f; hitsize = 56f; speed = 0.01f; diff --git a/core/src/io/anuke/mindustry/core/Control.java b/core/src/io/anuke/mindustry/core/Control.java index 46ccb86bdb..b0e2eed073 100644 --- a/core/src/io/anuke/mindustry/core/Control.java +++ b/core/src/io/anuke/mindustry/core/Control.java @@ -127,7 +127,7 @@ public class Control implements ApplicationListener{ Call.onGameOver(event.winner); if(state.rules.zone != null && !Net.client()){ //remove zone save on game over - if(saves.getZoneSlot() != null){ + if(saves.getZoneSlot() != null && !state.rules.tutorial){ saves.getZoneSlot().delete(); } } @@ -392,6 +392,7 @@ public class Control implements ApplicationListener{ data.checkSave(); music.update(); + loops.update(); if(!state.is(State.menu)){ input.update(); @@ -415,7 +416,7 @@ public class Control implements ApplicationListener{ Platform.instance.updateRPC(); } - if(Core.input.keyTap(Binding.pause) && !ui.restart.isShown() && (state.is(State.paused) || state.is(State.playing))){ + if(Core.input.keyTap(Binding.pause) && !scene.hasDialog() && !ui.restart.isShown() && (state.is(State.paused) || state.is(State.playing))){ state.set(state.is(State.playing) ? State.paused : State.playing); } diff --git a/core/src/io/anuke/mindustry/core/Logic.java b/core/src/io/anuke/mindustry/core/Logic.java index 9f6b77ba80..1cf43878d2 100644 --- a/core/src/io/anuke/mindustry/core/Logic.java +++ b/core/src/io/anuke/mindustry/core/Logic.java @@ -5,7 +5,7 @@ import io.anuke.annotations.Annotations.Remote; import io.anuke.arc.ApplicationListener; import io.anuke.arc.Events; import io.anuke.arc.collection.ObjectSet.ObjectSetIterator; -import io.anuke.arc.util.Time; +import io.anuke.arc.util.*; import io.anuke.mindustry.content.*; import io.anuke.mindustry.core.GameState.State; import io.anuke.mindustry.entities.*; diff --git a/core/src/io/anuke/mindustry/core/NetClient.java b/core/src/io/anuke/mindustry/core/NetClient.java index ba23997804..81c002966b 100644 --- a/core/src/io/anuke/mindustry/core/NetClient.java +++ b/core/src/io/anuke/mindustry/core/NetClient.java @@ -176,6 +176,7 @@ public class NetClient implements ApplicationListener{ public static void onKick(KickReason reason){ netClient.disconnectQuietly(); state.set(State.menu); + logic.reset(); if(!reason.quiet){ if(reason.extraText() != null){ diff --git a/core/src/io/anuke/mindustry/core/Renderer.java b/core/src/io/anuke/mindustry/core/Renderer.java index 881f560093..6041017533 100644 --- a/core/src/io/anuke/mindustry/core/Renderer.java +++ b/core/src/io/anuke/mindustry/core/Renderer.java @@ -1,30 +1,28 @@ package io.anuke.mindustry.core; import io.anuke.arc.*; -import io.anuke.arc.files.FileHandle; -import io.anuke.arc.function.Consumer; -import io.anuke.arc.function.Predicate; +import io.anuke.arc.files.*; +import io.anuke.arc.function.*; import io.anuke.arc.graphics.*; import io.anuke.arc.graphics.g2d.*; -import io.anuke.arc.graphics.glutils.FrameBuffer; -import io.anuke.arc.math.Mathf; -import io.anuke.arc.math.geom.Rectangle; -import io.anuke.arc.math.geom.Vector2; +import io.anuke.arc.graphics.glutils.*; +import io.anuke.arc.math.*; +import io.anuke.arc.math.geom.*; import io.anuke.arc.scene.ui.layout.*; import io.anuke.arc.util.*; -import io.anuke.arc.util.pooling.Pools; -import io.anuke.mindustry.content.Fx; -import io.anuke.mindustry.core.GameState.State; +import io.anuke.arc.util.pooling.*; +import io.anuke.mindustry.content.*; +import io.anuke.mindustry.core.GameState.*; import io.anuke.mindustry.entities.*; -import io.anuke.mindustry.entities.effect.GroundEffectEntity; -import io.anuke.mindustry.entities.effect.GroundEffectEntity.GroundEffect; -import io.anuke.mindustry.entities.impl.EffectEntity; +import io.anuke.mindustry.entities.effect.*; +import io.anuke.mindustry.entities.effect.GroundEffectEntity.*; +import io.anuke.mindustry.entities.impl.*; import io.anuke.mindustry.entities.traits.*; import io.anuke.mindustry.entities.type.*; -import io.anuke.mindustry.game.EventType.DisposeEvent; -import io.anuke.mindustry.game.Team; +import io.anuke.mindustry.game.EventType.*; +import io.anuke.mindustry.game.*; import io.anuke.mindustry.graphics.*; -import io.anuke.mindustry.world.blocks.defense.ForceProjector.ShieldEntity; +import io.anuke.mindustry.world.blocks.defense.ForceProjector.*; import static io.anuke.arc.Core.*; import static io.anuke.mindustry.Vars.*; diff --git a/core/src/io/anuke/mindustry/editor/MapEditorDialog.java b/core/src/io/anuke/mindustry/editor/MapEditorDialog.java index 23b42e6885..a5080952e1 100644 --- a/core/src/io/anuke/mindustry/editor/MapEditorDialog.java +++ b/core/src/io/anuke/mindustry/editor/MapEditorDialog.java @@ -87,7 +87,8 @@ public class MapEditorDialog extends Dialog implements Disposable{ t.row(); - t.addImageTextButton("$editor.import", "icon-load-map", isize, () -> + if(!ios){ + t.addImageTextButton("$editor.import", "icon-load-map", isize, () -> createDialog("$editor.import", "$editor.importmap", "$editor.importmap.description", "icon-load-map", (Runnable)loadDialog::show, "$editor.importfile", "$editor.importfile.description", "icon-file", (Runnable)() -> @@ -115,24 +116,43 @@ public class MapEditorDialog extends Dialog implements Disposable{ Log.err(e); } }), true, FileChooser.pngFiles)) - ); + ); + } - t.addImageTextButton("$editor.export", "icon-save-map", isize, () -> - Platform.instance.showFileChooser("$editor.savemap", "Map Files", file -> { - file = file.parent().child(file.nameWithoutExtension() + "." + mapExtension); - FileHandle result = file; + Cell cell = t.addImageTextButton("$editor.export", "icon-save-map", isize, () -> { + if(!ios){ + Platform.instance.showFileChooser("$editor.savemap", "Map Files", file -> { + file = file.parent().child(file.nameWithoutExtension() + "." + mapExtension); + FileHandle result = file; + ui.loadAnd(() -> { + try{ + if(!editor.getTags().containsKey("name")){ + editor.getTags().put("name", result.nameWithoutExtension()); + } + MapIO.writeMap(result, editor.createMap(result)); + }catch(Exception e){ + ui.showError(Core.bundle.format("editor.errorsave", Strings.parseException(e, true))); + Log.err(e); + } + }); + }, false, FileChooser.mapFiles); + }else{ ui.loadAnd(() -> { try{ - if(!editor.getTags().containsKey("name")){ - editor.getTags().put("name", result.nameWithoutExtension()); - } + FileHandle result = Core.files.local(editor.getTags().get("name", "unknown") + "." + mapExtension); MapIO.writeMap(result, editor.createMap(result)); + Platform.instance.shareFile(result); }catch(Exception e){ ui.showError(Core.bundle.format("editor.errorsave", Strings.parseException(e, true))); Log.err(e); } }); - }, false, FileChooser.mapFiles)); + } + }); + + if(ios){ + cell.size(swidth * 2f + 10, 60f).colspan(2); + } }); menu.cont.row(); diff --git a/core/src/io/anuke/mindustry/entities/EntityGroup.java b/core/src/io/anuke/mindustry/entities/EntityGroup.java index d3010c84f3..6b2e343ae3 100644 --- a/core/src/io/anuke/mindustry/entities/EntityGroup.java +++ b/core/src/io/anuke/mindustry/entities/EntityGroup.java @@ -6,6 +6,7 @@ import io.anuke.arc.function.Consumer; import io.anuke.arc.function.Predicate; import io.anuke.arc.math.geom.QuadTree; import io.anuke.arc.math.geom.Rectangle; +import io.anuke.arc.util.*; import io.anuke.mindustry.entities.traits.Entity; public class EntityGroup{ @@ -170,8 +171,10 @@ public class EntityGroup{ } public void clear(){ - for(T entity : entityArray) + for(T entity : entityArray){ + entity.removed(); entity.setGroup(null); + } for(T entity : entitiesToAdd) entity.setGroup(null); diff --git a/core/src/io/anuke/mindustry/entities/Predict.java b/core/src/io/anuke/mindustry/entities/Predict.java index 25bb2aea84..c4143a80b8 100644 --- a/core/src/io/anuke/mindustry/entities/Predict.java +++ b/core/src/io/anuke/mindustry/entities/Predict.java @@ -1,9 +1,9 @@ package io.anuke.mindustry.entities; -import io.anuke.arc.math.Mathf; -import io.anuke.arc.math.geom.Vector2; -import io.anuke.arc.util.Time; -import io.anuke.mindustry.entities.traits.TargetTrait; +import io.anuke.arc.math.*; +import io.anuke.arc.math.geom.*; +import io.anuke.arc.util.*; +import io.anuke.mindustry.entities.traits.*; /** * Class for predicting shoot angles based on velocities of targets. @@ -55,9 +55,7 @@ public class Predict{ * See {@link #intercept(float, float, float, float, float, float, float)}. */ public static Vector2 intercept(TargetTrait src, TargetTrait dst, float v){ - return intercept(src.getX(), src.getY(), dst.getX(), dst.getY(), - dst.getTargetVelocityX() - src.getTargetVelocityX()/2f, - dst.getTargetVelocityY() - src.getTargetVelocityY()/2f, v); + return intercept(src.getX(), src.getY(), dst.getX(), dst.getY(), dst.getTargetVelocityX() - src.getTargetVelocityX(), dst.getTargetVelocityY() - src.getTargetVelocityY(), v); } private static Vector2 quad(float a, float b, float c){ diff --git a/core/src/io/anuke/mindustry/entities/type/Player.java b/core/src/io/anuke/mindustry/entities/type/Player.java index e1b7b94b19..6d124c9c42 100644 --- a/core/src/io/anuke/mindustry/entities/type/Player.java +++ b/core/src/io/anuke/mindustry/entities/type/Player.java @@ -70,7 +70,7 @@ public class Player extends Unit implements BuilderMinerTrait, ShooterTrait{ private Tile mining; private Vector2 movement = new Vector2(); private boolean moved; - private SoundLoop boostSound = new SoundLoop(Sounds.thruster, 2f), buildSound = new SoundLoop(Sounds.build, 0.75f); + private SoundLoop buildSound = new SoundLoop(Sounds.build, 0.75f); //endregion @@ -133,7 +133,6 @@ public class Player extends Unit implements BuilderMinerTrait, ShooterTrait{ @Override public void removed(){ - boostSound.stop(); buildSound.stop(); } @@ -514,7 +513,10 @@ public class Player extends Unit implements BuilderMinerTrait, ShooterTrait{ destructTime = 0f; } - boostSound.update(x, y, isBoosting && !isDead() && !mech.flying); + if(!isDead() && isFlying()){ + loops.play(Sounds.thruster, this, Mathf.clamp(velocity.len() * 2f) * 0.4f); + } + BuildRequest request = buildRequest(); buildSound.update(request == null ? x : request.x * tilesize, request == null ? y : request.y * tilesize, isBuilding() && (Mathf.within(request.x * tilesize, request.y * tilesize, x, y, placeDistance) || state.isEditor())); @@ -750,8 +752,7 @@ public class Player extends Unit implements BuilderMinerTrait, ShooterTrait{ rotation = Mathf.slerpDelta(rotation, angleTo(target), 0.2f); } - Vector2 intercept = - Predict.intercept(x, y, target.getX(), target.getY(), target.velocity().x - velocity.x, target.velocity().y - velocity.y, getWeapon().bullet.speed); + Vector2 intercept = Predict.intercept(this, target, getWeapon().bullet.speed); pointerX = intercept.x; pointerY = intercept.y; diff --git a/core/src/io/anuke/mindustry/entities/type/TileEntity.java b/core/src/io/anuke/mindustry/entities/type/TileEntity.java index 2c442a00a4..ce9af0012b 100644 --- a/core/src/io/anuke/mindustry/entities/type/TileEntity.java +++ b/core/src/io/anuke/mindustry/entities/type/TileEntity.java @@ -20,8 +20,7 @@ import io.anuke.mindustry.world.modules.*; import java.io.*; -import static io.anuke.mindustry.Vars.tileGroup; -import static io.anuke.mindustry.Vars.world; +import static io.anuke.mindustry.Vars.*; public class TileEntity extends BaseEntity implements TargetTrait, HealthTrait{ public static final float timeToSleep = 60f * 4; //4 seconds to fall asleep @@ -70,8 +69,8 @@ public class TileEntity extends BaseEntity implements TargetTrait, HealthTrait{ x = tile.drawx(); y = tile.drawy(); block = tile.block(); - if(block.idleSound != Sounds.none){ - sound = new SoundLoop(block.idleSound, block.idleSoundVolume); + if(block.activeSound != Sounds.none){ + sound = new SoundLoop(block.activeSound, block.activeSoundVolume); } health = block.health; @@ -298,7 +297,11 @@ public class TileEntity extends BaseEntity implements TargetTrait, HealthTrait{ } if(sound != null){ - sound.update(x, y, block.shouldIdleSound(tile)); + sound.update(x, y, block.shouldActiveSound(tile)); + } + + if(block.idleSound != Sounds.none && block.shouldIdleSound(tile)){ + loops.play(block.idleSound, this, block.idleSoundVolume); } Block previous = block; diff --git a/core/src/io/anuke/mindustry/game/LoopControl.java b/core/src/io/anuke/mindustry/game/LoopControl.java new file mode 100644 index 0000000000..3924a1c28c --- /dev/null +++ b/core/src/io/anuke/mindustry/game/LoopControl.java @@ -0,0 +1,61 @@ +package io.anuke.mindustry.game; + +import io.anuke.arc.*; +import io.anuke.arc.audio.*; +import io.anuke.arc.collection.*; +import io.anuke.arc.math.*; +import io.anuke.arc.math.geom.*; +import io.anuke.mindustry.*; + +public class LoopControl{ + private ObjectMap sounds = new ObjectMap<>(); + + public void play(Sound sound, Position pos, float volume){ + if(Vars.headless) return; + + float baseVol = sound.calcFalloff(pos.getX(), pos.getY()); + float vol = baseVol * volume; + + SoundData data = sounds.getOr(sound, SoundData::new); + data.volume += vol; + data.volume = Mathf.clamp(data.volume, 0f, 1f); + data.total += baseVol; + data.sum.add(pos.getX() * baseVol, pos.getY() * baseVol); + } + + public void update(){ + float avol = Core.settings.getInt("ambientvol", 100) / 100f; + + sounds.each((sound, data) -> { + data.curVolume = Mathf.lerpDelta(data.curVolume, data.volume * avol, 0.2f); + + boolean play = data.curVolume > 0.01f; + float pan = Mathf.isZero(data.total, 0.0001f) ? 0f : sound.calcPan(data.sum.x / data.total, data.sum.y / data.total); + if(data.soundID <= 0){ + if(play){ + data.soundID = sound.loop(data.curVolume, 1f, pan); + } + }else{ + if(data.curVolume <= 0.01f){ + sound.stop(data.soundID); + data.soundID = -1; + return; + } + sound.setPan(data.soundID, pan, data.curVolume); + } + + data.volume = 0f; + data.total = 0f; + data.sum.setZero(); + }); + } + + private class SoundData{ + float volume; + float total; + Vector2 sum = new Vector2(); + + int soundID; + float curVolume; + } +} diff --git a/core/src/io/anuke/mindustry/game/SoundLoop.java b/core/src/io/anuke/mindustry/game/SoundLoop.java index 6dc6f2cae8..3266721ed6 100644 --- a/core/src/io/anuke/mindustry/game/SoundLoop.java +++ b/core/src/io/anuke/mindustry/game/SoundLoop.java @@ -9,7 +9,7 @@ public class SoundLoop{ private static final float fadeSpeed = 0.05f; private final Sound sound; - private long id = -1; + private int id = -1; private float volume, baseVolume; public SoundLoop(Sound sound, float baseVolume){ diff --git a/core/src/io/anuke/mindustry/io/JsonIO.java b/core/src/io/anuke/mindustry/io/JsonIO.java index 500374994a..15f1e18476 100644 --- a/core/src/io/anuke/mindustry/io/JsonIO.java +++ b/core/src/io/anuke/mindustry/io/JsonIO.java @@ -2,6 +2,7 @@ package io.anuke.mindustry.io; import io.anuke.arc.collection.*; import io.anuke.arc.util.serialization.*; +import io.anuke.arc.util.serialization.Json.*; import io.anuke.mindustry.*; import io.anuke.mindustry.content.*; import io.anuke.mindustry.game.*; @@ -11,10 +12,13 @@ import io.anuke.mindustry.world.*; @SuppressWarnings("unchecked") public class JsonIO{ - private static CustomJson json = new CustomJson(); + private static CustomJson jsonBase = new CustomJson(); + private static Json json = new Json(){{ + apply(this); + }}; public static String write(Object object){ - return json.toJson(object); + return json.toJson(object, object.getClass()); } public static T copy(T object){ @@ -26,66 +30,50 @@ public class JsonIO{ } public static T read(Class type, T base, String string){ - return json.fromBaseJson(type, base, string); + return jsonBase.fromBaseJson(type, base, string); } public static String print(String in){ return json.prettyPrint(in); } - static class CustomJson extends Json{ - private Object baseObject; + private static void apply(Json json){ + json.setIgnoreUnknownFields(true); + json.setElementType(Rules.class, "spawns", SpawnGroup.class); + json.setElementType(Rules.class, "loadout", ItemStack.class); - { - setIgnoreUnknownFields(true); - setElementType(Rules.class, "spawns", SpawnGroup.class); - setElementType(Rules.class, "loadout", ItemStack.class); - - setSerializer(Zone.class, new Serializer(){ - @Override - public void write(Json json, Zone object, Class knownType){ - json.writeValue(object.name); - } - - @Override - public Zone read(Json json, JsonValue jsonData, Class type){ - return Vars.content.getByName(ContentType.zone, jsonData.asString()); - } - }); - - setSerializer(Item.class, new Serializer(){ - @Override - public void write(Json json, Item object, Class knownType){ - json.writeValue(object.name); - } - - @Override - public Item read(Json json, JsonValue jsonData, Class type){ - if(jsonData.asString() == null) return Items.copper; - Item i = Vars.content.getByName(ContentType.item, jsonData.asString()); - return i == null ? Items.copper : i; - } - }); - - //TODO extremely hacky and disgusting - for(Block block : Vars.content.blocks()){ - Class type = block.getClass(); - if(type.isAnonymousClass()) type = type.getSuperclass(); - - setSerializer(type, new Serializer(){ - @Override - public void write(Json json, Block object, Class knownType){ - json.writeValue(object.name); - } - - @Override - public Block read(Json json, JsonValue jsonData, Class type){ - return Vars.content.getByName(ContentType.block, jsonData.asString()); - } - }); + json.setSerializer(Zone.class, new Serializer(){ + @Override + public void write(Json json, Zone object, Class knownType){ + json.writeValue(object.name); } - setSerializer(Block.class, new Serializer(){ + @Override + public Zone read(Json json, JsonValue jsonData, Class type){ + return Vars.content.getByName(ContentType.zone, jsonData.asString()); + } + }); + + json.setSerializer(Item.class, new Serializer(){ + @Override + public void write(Json json, Item object, Class knownType){ + json.writeValue(object.name); + } + + @Override + public Item read(Json json, JsonValue jsonData, Class type){ + if(jsonData.asString() == null) return Items.copper; + Item i = Vars.content.getByName(ContentType.item, jsonData.asString()); + return i == null ? Items.copper : i; + } + }); + + //TODO extremely hacky and disgusting + for(Block block : Vars.content.blocks()){ + Class type = block.getClass(); + if(type.isAnonymousClass()) type = type.getSuperclass(); + + json.setSerializer(type, new Serializer(){ @Override public void write(Json json, Block object, Class knownType){ json.writeValue(object.name); @@ -96,40 +84,60 @@ public class JsonIO{ return Vars.content.getByName(ContentType.block, jsonData.asString()); } }); + } - setSerializer(TeamData.class, new Serializer(){ - @Override - public void write(Json json, TeamData object, Class knownType){ - json.writeObjectStart(); - json.writeValue("brokenBlocks", object.brokenBlocks.toArray()); - json.writeValue("team", object.team.ordinal()); - json.writeObjectEnd(); - } + json.setSerializer(Block.class, new Serializer(){ + @Override + public void write(Json json, Block object, Class knownType){ + json.writeValue(object.name); + } - @Override - public TeamData read(Json json, JsonValue jsonData, Class type){ - long[] blocks = jsonData.get("brokenBlocks").asLongArray(); - Team team = Team.all[jsonData.getInt("team", 0)]; - TeamData out = new TeamData(team, EnumSet.of(new Team[]{})); - out.brokenBlocks = new LongQueue(blocks); - return out; - } - }); + @Override + public Block read(Json json, JsonValue jsonData, Class type){ + return Vars.content.getByName(ContentType.block, jsonData.asString()); + } + }); - setSerializer(ItemStack.class, new Serializer(){ - @Override - public void write(Json json, ItemStack object, Class knownType){ - json.writeObjectStart(); - json.writeValue("item", object.item); - json.writeValue("amount", object.amount); - json.writeObjectEnd(); - } + json.setSerializer(TeamData.class, new Serializer(){ + @Override + public void write(Json json, TeamData object, Class knownType){ + json.writeObjectStart(); + json.writeValue("brokenBlocks", object.brokenBlocks.toArray()); + json.writeValue("team", object.team.ordinal()); + json.writeObjectEnd(); + } - @Override - public ItemStack read(Json json, JsonValue jsonData, Class type){ - return new ItemStack(json.getSerializer(Item.class).read(json, jsonData.get("item"), Item.class), jsonData.getInt("amount")); - } - }); + @Override + public TeamData read(Json json, JsonValue jsonData, Class type){ + long[] blocks = jsonData.get("brokenBlocks").asLongArray(); + Team team = Team.all[jsonData.getInt("team", 0)]; + TeamData out = new TeamData(team, EnumSet.of(new Team[]{})); + out.brokenBlocks = new LongQueue(blocks); + return out; + } + }); + + json.setSerializer(ItemStack.class, new Serializer(){ + @Override + public void write(Json json, ItemStack object, Class knownType){ + json.writeObjectStart(); + json.writeValue("item", object.item); + json.writeValue("amount", object.amount); + json.writeObjectEnd(); + } + + @Override + public ItemStack read(Json json, JsonValue jsonData, Class type){ + return new ItemStack(json.getSerializer(Item.class).read(json, jsonData.get("item"), Item.class), jsonData.getInt("amount")); + } + }); + } + + static class CustomJson extends Json{ + private Object baseObject; + + { + apply(this); } @Override diff --git a/core/src/io/anuke/mindustry/io/SaveFileReader.java b/core/src/io/anuke/mindustry/io/SaveFileReader.java index a969776896..8384aca50e 100644 --- a/core/src/io/anuke/mindustry/io/SaveFileReader.java +++ b/core/src/io/anuke/mindustry/io/SaveFileReader.java @@ -14,9 +14,7 @@ public abstract class SaveFileReader{ protected final DataOutputStream dataBytes = new DataOutputStream(byteOutput); protected final ReusableByteOutStream byteOutputSmall = new ReusableByteOutStream(); protected final DataOutputStream dataBytesSmall = new DataOutputStream(byteOutputSmall); - protected final ObjectMap fallback = ObjectMap.of( - - ); + protected final ObjectMap fallback = ObjectMap.of(); protected void region(String name, DataInput stream, CounterInputStream counter, IORunner cons) throws IOException{ counter.resetCount(); diff --git a/core/src/io/anuke/mindustry/io/SaveMeta.java b/core/src/io/anuke/mindustry/io/SaveMeta.java index f88746605f..c3fd749024 100644 --- a/core/src/io/anuke/mindustry/io/SaveMeta.java +++ b/core/src/io/anuke/mindustry/io/SaveMeta.java @@ -1,5 +1,6 @@ package io.anuke.mindustry.io; +import io.anuke.arc.collection.*; import io.anuke.mindustry.game.Rules; import io.anuke.mindustry.maps.Map; @@ -13,8 +14,9 @@ public class SaveMeta{ public Map map; public int wave; public Rules rules; + public StringMap tags; - public SaveMeta(int version, long timestamp, long timePlayed, int build, String map, int wave, Rules rules){ + public SaveMeta(int version, long timestamp, long timePlayed, int build, String map, int wave, Rules rules, StringMap tags){ this.version = version; this.build = build; this.timestamp = timestamp; @@ -22,5 +24,6 @@ public class SaveMeta{ this.map = world.maps.all().find(m -> m.name().equals(map)); this.wave = wave; this.rules = rules; + this.tags = tags; } } diff --git a/core/src/io/anuke/mindustry/io/SaveVersion.java b/core/src/io/anuke/mindustry/io/SaveVersion.java index b4f700a582..90d3af2210 100644 --- a/core/src/io/anuke/mindustry/io/SaveVersion.java +++ b/core/src/io/anuke/mindustry/io/SaveVersion.java @@ -28,7 +28,7 @@ public abstract class SaveVersion extends SaveFileReader{ public SaveMeta getMeta(DataInput stream) throws IOException{ stream.readInt(); //length of data, doesn't matter here StringMap map = readStringMap(stream); - return new SaveMeta(map.getInt("version"), map.getLong("saved"), map.getLong("playtime"), map.getInt("build"), map.get("mapname"), map.getInt("wave"), JsonIO.read(Rules.class, map.get("rules", "{}"))); + return new SaveMeta(map.getInt("version"), map.getLong("saved"), map.getLong("playtime"), map.getInt("build"), map.get("mapname"), map.getInt("wave"), JsonIO.read(Rules.class, map.get("rules", "{}")), map); } @Override diff --git a/core/src/io/anuke/mindustry/type/Weapon.java b/core/src/io/anuke/mindustry/type/Weapon.java index 180bb2fad5..4e77b2bc4a 100644 --- a/core/src/io/anuke/mindustry/type/Weapon.java +++ b/core/src/io/anuke/mindustry/type/Weapon.java @@ -92,7 +92,7 @@ public class Weapon{ float baseX = shooter.getX(), baseY = shooter.getY(); Weapon weapon = shooter.getWeapon(); - weapon.shootSound.at(x, y); + weapon.shootSound.at(x, y, Mathf.random(0.8f, 1.0f)); sequenceNum = 0; if(weapon.shotDelay > 0.01f){ diff --git a/core/src/io/anuke/mindustry/type/Zone.java b/core/src/io/anuke/mindustry/type/Zone.java index a89d7f3079..02ef87b8e1 100644 --- a/core/src/io/anuke/mindustry/type/Zone.java +++ b/core/src/io/anuke/mindustry/type/Zone.java @@ -176,7 +176,7 @@ public class Zone extends UnlockableContent{ @Override public void load(){ - if(Core.files.internal("zones/" + name + ".png").exists()){ + if(Core.files.internal("zones/" + name + ".png").exists() && !headless){ preview = new Texture(Core.files.internal("zones/" + name + ".png")); } } diff --git a/core/src/io/anuke/mindustry/ui/MultiReqImage.java b/core/src/io/anuke/mindustry/ui/MultiReqImage.java index 41c9ef2e44..4fa2cf2fc8 100644 --- a/core/src/io/anuke/mindustry/ui/MultiReqImage.java +++ b/core/src/io/anuke/mindustry/ui/MultiReqImage.java @@ -25,7 +25,9 @@ public class MultiReqImage extends Stack{ if(valid != null){ valid.visible(true); }else{ - displays.get((int)(time) % displays.size).visible(true); + if(displays.size > 0){ + displays.get((int)(time) % displays.size).visible(true); + } } } } diff --git a/core/src/io/anuke/mindustry/ui/dialogs/MapsDialog.java b/core/src/io/anuke/mindustry/ui/dialogs/MapsDialog.java index d19c6b0ae7..41a7ec23c8 100644 --- a/core/src/io/anuke/mindustry/ui/dialogs/MapsDialog.java +++ b/core/src/io/anuke/mindustry/ui/dialogs/MapsDialog.java @@ -43,7 +43,7 @@ public class MapsDialog extends FloatingDialog{ void setup(){ buttons.clearChildren(); - if(Core.graphics.isPortrait()){ + if(Core.graphics.isPortrait() && !ios){ buttons.addImageTextButton("$back", "icon-arrow-left", iconsize, this::hide).size(210f*2f, 64f).colspan(2); buttons.row(); }else{ @@ -60,54 +60,56 @@ public class MapsDialog extends FloatingDialog{ }); }).size(210f, 64f); - buttons.addImageTextButton("$editor.importmap", "icon-load", iconsize, () -> { - Platform.instance.showFileChooser("$editor.importmap", "Map File", file -> { - world.maps.tryCatchMapError(() -> { - if(MapIO.isImage(file)){ - ui.showError("$editor.errorimage"); - return; - } + if(!ios){ + buttons.addImageTextButton("$editor.importmap", "icon-load", iconsize, () -> { + Platform.instance.showFileChooser("$editor.importmap", "Map File", file -> { + world.maps.tryCatchMapError(() -> { + if(MapIO.isImage(file)){ + ui.showError("$editor.errorimage"); + return; + } - Map map; - if(file.extension().equalsIgnoreCase(mapExtension)){ - map = MapIO.createMap(file, true); - }else{ - map = world.maps.makeLegacyMap(file); - } + Map map; + if(file.extension().equalsIgnoreCase(mapExtension)){ + map = MapIO.createMap(file, true); + }else{ + map = world.maps.makeLegacyMap(file); + } - //when you attempt to import a save, it will have no name, so generate one - String name = map.tags.getOr("name", () -> { - String result = "unknown"; - int number = 0; - while(world.maps.byName(result + number++) != null); - return result + number; - }); - - //this will never actually get called, but it remains just in case - if(name == null){ - ui.showError("$editor.errorname"); - return; - } - - Map conflict = world.maps.all().find(m -> m.name().equals(name)); - - if(conflict != null && !conflict.custom){ - ui.showInfo(Core.bundle.format("editor.import.exists", name)); - }else if(conflict != null){ - ui.showConfirm("$confirm", "$editor.overwrite.confirm", () -> { - world.maps.tryCatchMapError(() -> { - world.maps.importMap(file); - setup(); - }); + //when you attempt to import a save, it will have no name, so generate one + String name = map.tags.getOr("name", () -> { + String result = "unknown"; + int number = 0; + while(world.maps.byName(result + number++) != null) ; + return result + number; }); - }else{ - world.maps.importMap(map.file); - setup(); - } - }); - }, true, FileChooser.anyMapFiles); - }).size(210f, 64f); + //this will never actually get called, but it remains just in case + if(name == null){ + ui.showError("$editor.errorname"); + return; + } + + Map conflict = world.maps.all().find(m -> m.name().equals(name)); + + if(conflict != null && !conflict.custom){ + ui.showInfo(Core.bundle.format("editor.import.exists", name)); + }else if(conflict != null){ + ui.showConfirm("$confirm", "$editor.overwrite.confirm", () -> { + world.maps.tryCatchMapError(() -> { + world.maps.importMap(file); + setup(); + }); + }); + }else{ + world.maps.importMap(map.file); + setup(); + } + + }); + }, true, FileChooser.anyMapFiles); + }).size(210f, 64f); + } cont.clear(); diff --git a/core/src/io/anuke/mindustry/ui/dialogs/PausedDialog.java b/core/src/io/anuke/mindustry/ui/dialogs/PausedDialog.java index 46506277f2..40fb91dc9b 100644 --- a/core/src/io/anuke/mindustry/ui/dialogs/PausedDialog.java +++ b/core/src/io/anuke/mindustry/ui/dialogs/PausedDialog.java @@ -108,6 +108,7 @@ public class PausedDialog extends FloatingDialog{ if(control.saves.getCurrent() == null || !control.saves.getCurrent().isAutosave() || state.rules.tutorial){ state.set(State.menu); + logic.reset(); return; } @@ -119,6 +120,7 @@ public class PausedDialog extends FloatingDialog{ ui.showError("[accent]" + Core.bundle.get("savefail")); } state.set(State.menu); + logic.reset(); }); } } diff --git a/core/src/io/anuke/mindustry/ui/dialogs/SettingsMenuDialog.java b/core/src/io/anuke/mindustry/ui/dialogs/SettingsMenuDialog.java index 84c429ed0e..19fbf6a4d3 100644 --- a/core/src/io/anuke/mindustry/ui/dialogs/SettingsMenuDialog.java +++ b/core/src/io/anuke/mindustry/ui/dialogs/SettingsMenuDialog.java @@ -126,6 +126,7 @@ public class SettingsMenuDialog extends SettingsDialog{ void addSettings(){ sound.sliderPref("musicvol", bundle.get("setting.musicvol.name", "Music Volume"), 100, 0, 100, 1, i -> i + "%"); sound.sliderPref("sfxvol", bundle.get("setting.sfxvol.name", "SFX Volume"), 100, 0, 100, 1, i -> i + "%"); + sound.sliderPref("ambientvol", bundle.get("setting.ambientvol.name", "Ambient Volume"), 100, 0, 100, 1, i -> i + "%"); game.screenshakePref(); if(mobile){ diff --git a/core/src/io/anuke/mindustry/ui/dialogs/ZoneInfoDialog.java b/core/src/io/anuke/mindustry/ui/dialogs/ZoneInfoDialog.java index 835557aa14..36baa4125f 100644 --- a/core/src/io/anuke/mindustry/ui/dialogs/ZoneInfoDialog.java +++ b/core/src/io/anuke/mindustry/ui/dialogs/ZoneInfoDialog.java @@ -58,7 +58,7 @@ public class ZoneInfoDialog extends FloatingDialog{ rebuildItems.run(); - cont.table(cont -> { + cont.pane(cont -> { if(zone.locked()){ cont.addImage("icon-locked"); cont.row(); @@ -138,6 +138,7 @@ public class ZoneInfoDialog extends FloatingDialog{ () -> loadout.show(zone.loadout.core().itemCapacity, zone::getStartingItems, zone::resetStartingItems, zone::updateLaunchCost, rebuildItems, item -> data.getItem(item) > 0 && item.type == ItemType.material) ).fillX().pad(3).disabled(b -> !zone.canConfigure()); } + cont.marginRight(12f); }); cont.row(); diff --git a/core/src/io/anuke/mindustry/ui/fragments/MenuFragment.java b/core/src/io/anuke/mindustry/ui/fragments/MenuFragment.java index 1b3908937a..6f6dd9ec8f 100644 --- a/core/src/io/anuke/mindustry/ui/fragments/MenuFragment.java +++ b/core/src/io/anuke/mindustry/ui/fragments/MenuFragment.java @@ -66,6 +66,7 @@ public class MenuFragment extends Fragment{ //info icon if(mobile){ parent.fill(c -> c.bottom().left().addButton("", "info", ui.about::show).size(84, 45)); + parent.fill(c -> c.bottom().right().addButton("", "discord", ui.discord::show).size(84, 45)); } String versionText = "[#ffffffba]" + ((Version.build == -1) ? "[#fc8140aa]custom build" : Version.modifier + " build " + Version.build); @@ -100,7 +101,7 @@ public class MenuFragment extends Fragment{ join = new MobileButton("icon-add", isize, "$joingame", ui.join::show), editor = new MobileButton("icon-editor", isize, "$editor", ui.maps::show), tools = new MobileButton("icon-tools", isize, "$settings", ui.settings::show), - donate = new MobileButton("icon-donate", isize, "$donate", () -> Core.net.openURI(donationURL)), + donate = new MobileButton("icon-link", isize, "$website", () -> Core.net.openURI("https://anuke.itch.io/mindustry")), exit = new MobileButton("icon-exit", isize, "$quit", () -> Core.app.exit()); if(!Core.graphics.isPortrait()){ @@ -108,8 +109,9 @@ public class MenuFragment extends Fragment{ container.add(play); container.add(join); container.add(custom); + if(ios) container.row(); container.add(maps); - container.row(); + if(!ios) container.row(); container.table(table -> { table.defaults().set(container.defaults()); @@ -118,7 +120,7 @@ public class MenuFragment extends Fragment{ table.add(tools); if(Platform.instance.canDonate()) table.add(donate); - table.add(exit); + if(!ios) table.add(exit); }).colspan(4); }else{ container.marginTop(0f); diff --git a/core/src/io/anuke/mindustry/world/Block.java b/core/src/io/anuke/mindustry/world/Block.java index 5e5e80154c..577d40771e 100644 --- a/core/src/io/anuke/mindustry/world/Block.java +++ b/core/src/io/anuke/mindustry/world/Block.java @@ -25,6 +25,7 @@ import io.anuke.mindustry.game.*; import io.anuke.mindustry.gen.*; import io.anuke.mindustry.graphics.*; import io.anuke.mindustry.input.InputHandler.*; +import io.anuke.mindustry.net.Net; import io.anuke.mindustry.type.*; import io.anuke.mindustry.ui.*; import io.anuke.mindustry.world.blocks.*; @@ -100,7 +101,13 @@ public class Block extends BlockStorage{ public boolean hasShadow = true; /** Sounds made when this block breaks.*/ public Sound breakSound = Sounds.boom; - /** The sound that this block makes while active.*/ + + /** The sound that this block makes while active. One sound loop. Do not overuse.*/ + public Sound activeSound = Sounds.none; + /** Active sound base volume. */ + public float activeSoundVolume = 0.5f; + + /** The sound that this block makes while idle. Uses one sound loop for all blocks.*/ public Sound idleSound = Sounds.none; /** Idle sound base volume. */ public float idleSoundVolume = 0.5f; @@ -211,6 +218,11 @@ public class Block extends BlockStorage{ return progressIncrease; } + /** @return whether this block should play its active sound.*/ + public boolean shouldActiveSound(Tile tile){ + return false; + } + /** @return whether this block should play its idle sound.*/ public boolean shouldIdleSound(Tile tile){ return canProduce(tile); @@ -282,6 +294,15 @@ public class Block extends BlockStorage{ /** Called after the block is placed by this client. */ @CallSuper public void playerPlaced(Tile tile){ + if(outputsPower && !consumesPower){ + PowerNode.lastPlaced = tile.pos(); + } + } + + /** Called after the block is placed by anyone. */ + @CallSuper + public void placed(Tile tile){ + if(Net.client()) return; if((consumesPower && !outputsPower) || (!consumesPower && outputsPower)){ int range = 10; @@ -289,7 +310,7 @@ public class Block extends BlockStorage{ Geometry.circle(tile.x, tile.y, range, (x, y) -> { Tile other = world.ltile(x, y); if(other != null && other.block instanceof PowerNode && ((PowerNode)other.block).linkValid(other, tile) && !other.entity.proximity().contains(tile) && - !(outputsPower && tile.entity.proximity().contains(p -> p.entity != null && p.entity.power != null && p.entity.power.graph == other.entity.power.graph))){ + !(outputsPower && tile.entity.proximity().contains(p -> p.entity != null && p.entity.power != null && p.entity.power.graph == other.entity.power.graph))){ tempTiles.add(other); } }); @@ -298,19 +319,11 @@ public class Block extends BlockStorage{ Call.linkPowerNodes(null, tempTiles.first(), tile); } } - - if(outputsPower && !consumesPower){ - PowerNode.lastPlaced = tile.pos(); - } } public void removed(Tile tile){ } - /** Called after the block is placed by anyone. */ - public void placed(Tile tile){ - } - /** Called every frame a unit is on this tile. */ public void unitOn(Tile tile, Unit unit){ } diff --git a/core/src/io/anuke/mindustry/world/blocks/BuildBlock.java b/core/src/io/anuke/mindustry/world/blocks/BuildBlock.java index c8d571a395..a1a7f153c8 100644 --- a/core/src/io/anuke/mindustry/world/blocks/BuildBlock.java +++ b/core/src/io/anuke/mindustry/world/blocks/BuildBlock.java @@ -54,7 +54,7 @@ public class BuildBlock extends Block{ Effects.effect(Fx.breakBlock, tile.drawx(), tile.drawy(), block.size); world.removeBlock(tile); Events.fire(new BlockBuildEndEvent(tile, team, true)); - Sounds.breaks.at(tile); + Sounds.breaks.at(tile, Mathf.random(0.7f, 1.4f)); } @Remote(called = Loc.server) @@ -75,7 +75,7 @@ public class BuildBlock extends Block{ Core.app.post(() -> tile.block().playerPlaced(tile)); } Core.app.post(() -> Events.fire(new BlockBuildEndEvent(tile, team, false))); - Sounds.place.at(tile); + Sounds.place.at(tile, Mathf.random(0.7f, 1.4f)); } @Override diff --git a/core/src/io/anuke/mindustry/world/blocks/defense/turrets/LaserTurret.java b/core/src/io/anuke/mindustry/world/blocks/defense/turrets/LaserTurret.java index ecaba6b3b5..3c283e877b 100644 --- a/core/src/io/anuke/mindustry/world/blocks/defense/turrets/LaserTurret.java +++ b/core/src/io/anuke/mindustry/world/blocks/defense/turrets/LaserTurret.java @@ -105,7 +105,7 @@ public class LaserTurret extends PowerTurret{ } @Override - public boolean shouldIdleSound(Tile tile){ + public boolean shouldActiveSound(Tile tile){ LaserTurretEntity entity = tile.entity(); return entity.bulletLife > 0 && entity.bullet != null; diff --git a/core/src/io/anuke/mindustry/world/blocks/defense/turrets/LiquidTurret.java b/core/src/io/anuke/mindustry/world/blocks/defense/turrets/LiquidTurret.java index 1b6f59d41c..4cbcb4a680 100644 --- a/core/src/io/anuke/mindustry/world/blocks/defense/turrets/LiquidTurret.java +++ b/core/src/io/anuke/mindustry/world/blocks/defense/turrets/LiquidTurret.java @@ -5,6 +5,7 @@ import io.anuke.mindustry.entities.*; import io.anuke.mindustry.entities.bullet.*; import io.anuke.mindustry.entities.effect.*; import io.anuke.mindustry.entities.type.*; +import io.anuke.mindustry.gen.*; import io.anuke.mindustry.type.*; import io.anuke.mindustry.world.*; import io.anuke.mindustry.world.consumers.*; @@ -19,6 +20,7 @@ public abstract class LiquidTurret extends Turret{ public LiquidTurret(String name){ super(name); hasLiquids = true; + activeSound = Sounds.spray; } /** Initializes accepted ammo map. Format: [liquid1, bullet1, liquid2, bullet2...] */ @@ -44,6 +46,12 @@ public abstract class LiquidTurret extends Turret{ }); } + @Override + public boolean shouldActiveSound(Tile tile){ + TurretEntity entity = tile.entity(); + return entity.target != null && hasAmmo(tile); + } + @Override protected boolean validateTarget(Tile tile){ TurretEntity entity = tile.entity(); @@ -79,7 +87,7 @@ public abstract class LiquidTurret extends Turret{ Effects.effect(type.shootEffect, entity.liquids.current().color, tile.drawx() + tr.x, tile.drawy() + tr.y, entity.rotation); Effects.effect(type.smokeEffect, entity.liquids.current().color, tile.drawx() + tr.x, tile.drawy() + tr.y, entity.rotation); - shootSound.at(tile); + //shootSound.at(tile); if(shootShake > 0){ Effects.shake(shootShake, shootShake, tile.entity); diff --git a/core/src/io/anuke/mindustry/world/blocks/defense/turrets/Turret.java b/core/src/io/anuke/mindustry/world/blocks/defense/turrets/Turret.java index 7c8d9e51f1..3873f2177d 100644 --- a/core/src/io/anuke/mindustry/world/blocks/defense/turrets/Turret.java +++ b/core/src/io/anuke/mindustry/world/blocks/defense/turrets/Turret.java @@ -279,7 +279,7 @@ public abstract class Turret extends Block{ Effects.effect(shootEffect, tile.drawx() + tr.x, tile.drawy() + tr.y, entity.rotation); Effects.effect(smokeEffect, tile.drawx() + tr.x, tile.drawy() + tr.y, entity.rotation); - shootSound.at(tile); + shootSound.at(tile, Mathf.random(0.9f, 1.1f)); if(shootShake > 0){ Effects.shake(shootShake, shootShake, tile.entity); diff --git a/core/src/io/anuke/mindustry/world/blocks/distribution/Conveyor.java b/core/src/io/anuke/mindustry/world/blocks/distribution/Conveyor.java index a2cbf90315..de6c98d3e3 100644 --- a/core/src/io/anuke/mindustry/world/blocks/distribution/Conveyor.java +++ b/core/src/io/anuke/mindustry/world/blocks/distribution/Conveyor.java @@ -1,19 +1,17 @@ package io.anuke.mindustry.world.blocks.distribution; -import io.anuke.arc.Core; -import io.anuke.arc.collection.LongArray; -import io.anuke.arc.graphics.g2d.Draw; -import io.anuke.arc.graphics.g2d.TextureRegion; -import io.anuke.arc.math.Mathf; +import io.anuke.arc.*; +import io.anuke.arc.collection.*; +import io.anuke.arc.graphics.g2d.*; +import io.anuke.arc.math.*; import io.anuke.arc.math.geom.*; import io.anuke.arc.util.*; -import io.anuke.mindustry.entities.type.TileEntity; -import io.anuke.mindustry.entities.type.Unit; -import io.anuke.mindustry.graphics.Layer; -import io.anuke.mindustry.input.InputHandler.PlaceDraw; -import io.anuke.mindustry.type.Item; -import io.anuke.mindustry.world.Block; -import io.anuke.mindustry.world.Tile; +import io.anuke.mindustry.entities.type.*; +import io.anuke.mindustry.gen.*; +import io.anuke.mindustry.graphics.*; +import io.anuke.mindustry.input.InputHandler.*; +import io.anuke.mindustry.type.*; +import io.anuke.mindustry.world.*; import io.anuke.mindustry.world.meta.*; import java.io.*; @@ -41,6 +39,9 @@ public class Conveyor extends Block{ group = BlockGroup.transportation; hasItems = true; itemCapacity = 4; + + idleSound = Sounds.conveyor; + idleSoundVolume = 0.004f; } private static int compareItems(long a, long b){ @@ -76,6 +77,12 @@ public class Conveyor extends Block{ tilesize * entity.blendsclx, tilesize * entity.blendscly, rotation * 90); } + @Override + public boolean shouldIdleSound(Tile tile){ + ConveyorEntity entity = tile.entity(); + return entity.clogHeat <= 0.5f ; + } + @Override public void onProximityUpdate(Tile tile){ super.onProximityUpdate(tile); diff --git a/core/src/io/anuke/mindustry/world/blocks/power/PowerNode.java b/core/src/io/anuke/mindustry/world/blocks/power/PowerNode.java index 77b4e8716f..86220b6acc 100644 --- a/core/src/io/anuke/mindustry/world/blocks/power/PowerNode.java +++ b/core/src/io/anuke/mindustry/world/blocks/power/PowerNode.java @@ -11,6 +11,7 @@ import io.anuke.arc.util.*; import io.anuke.mindustry.entities.type.*; import io.anuke.mindustry.gen.*; import io.anuke.mindustry.graphics.*; +import io.anuke.mindustry.net.Net; import io.anuke.mindustry.ui.*; import io.anuke.mindustry.world.*; import io.anuke.mindustry.world.blocks.*; @@ -106,6 +107,14 @@ public class PowerNode extends PowerBlock{ Call.linkPowerNodes(null, tile, before); } + lastPlaced = tile.pos(); + super.playerPlaced(tile); + } + + @Override + public void placed(Tile tile){ + if(Net.client()) return; + Predicate valid = other -> other != null && other != tile && ((!other.block().outputsPower && other.block().consumesPower) || (other.block().outputsPower && !other.block().consumesPower)) && linkValid(tile, other) && !other.entity.proximity().contains(tile) && other.entity.power.graph != tile.entity.power.graph; @@ -120,8 +129,7 @@ public class PowerNode extends PowerBlock{ tempTiles.sort(Structs.comparingFloat(t -> t.dst2(tile))); tempTiles.each(valid, other -> Call.linkPowerNodes(null, tile, other)); - lastPlaced = tile.pos(); - super.playerPlaced(tile); + super.placed(tile); } @Override diff --git a/core/src/io/anuke/mindustry/world/blocks/power/ThermalGenerator.java b/core/src/io/anuke/mindustry/world/blocks/power/ThermalGenerator.java index be88b2ff01..092fcbd3e8 100644 --- a/core/src/io/anuke/mindustry/world/blocks/power/ThermalGenerator.java +++ b/core/src/io/anuke/mindustry/world/blocks/power/ThermalGenerator.java @@ -29,11 +29,6 @@ public class ThermalGenerator extends PowerGenerator{ drawPlaceText(Core.bundle.formatFloat("bar.efficiency", sumAttribute(Attribute.heat, x, y) * 100, 1), x, y, valid); } - @Override - public void placed(Tile tile){ - super.placed(tile); - } - @Override public void onProximityAdded(Tile tile){ super.onProximityAdded(tile); diff --git a/core/src/io/anuke/mindustry/world/blocks/production/Drill.java b/core/src/io/anuke/mindustry/world/blocks/production/Drill.java index 60ea278080..232d704d09 100644 --- a/core/src/io/anuke/mindustry/world/blocks/production/Drill.java +++ b/core/src/io/anuke/mindustry/world/blocks/production/Drill.java @@ -10,6 +10,7 @@ import io.anuke.mindustry.content.*; import io.anuke.mindustry.entities.*; import io.anuke.mindustry.entities.Effects.*; import io.anuke.mindustry.entities.type.*; +import io.anuke.mindustry.gen.*; import io.anuke.mindustry.graphics.*; import io.anuke.mindustry.type.*; import io.anuke.mindustry.ui.*; @@ -65,8 +66,8 @@ public class Drill extends Block{ liquidCapacity = 5f; hasItems = true; - //idleSound = Sounds.drill; - //idleSoundVolume = 0.5f; + idleSound = Sounds.drill; + idleSoundVolume = 0.002f; } @Override diff --git a/core/src/io/anuke/mindustry/world/blocks/production/GenericCrafter.java b/core/src/io/anuke/mindustry/world/blocks/production/GenericCrafter.java index 661b007331..428697d853 100644 --- a/core/src/io/anuke/mindustry/world/blocks/production/GenericCrafter.java +++ b/core/src/io/anuke/mindustry/world/blocks/production/GenericCrafter.java @@ -1,21 +1,18 @@ package io.anuke.mindustry.world.blocks.production; -import io.anuke.arc.function.Consumer; -import io.anuke.arc.function.Supplier; -import io.anuke.arc.graphics.g2d.TextureRegion; -import io.anuke.arc.math.Mathf; -import io.anuke.arc.util.Time; -import io.anuke.mindustry.content.Fx; -import io.anuke.mindustry.entities.Effects; -import io.anuke.mindustry.entities.Effects.Effect; -import io.anuke.mindustry.entities.type.TileEntity; +import io.anuke.arc.function.*; +import io.anuke.arc.graphics.g2d.*; +import io.anuke.arc.math.*; +import io.anuke.arc.util.*; +import io.anuke.mindustry.content.*; +import io.anuke.mindustry.entities.*; +import io.anuke.mindustry.entities.Effects.*; +import io.anuke.mindustry.entities.type.*; +import io.anuke.mindustry.gen.*; import io.anuke.mindustry.type.*; -import io.anuke.mindustry.world.Block; -import io.anuke.mindustry.world.Tile; -import io.anuke.mindustry.world.consumers.ConsumeLiquidBase; -import io.anuke.mindustry.world.consumers.ConsumeType; -import io.anuke.mindustry.world.meta.BlockStat; -import io.anuke.mindustry.world.meta.StatUnit; +import io.anuke.mindustry.world.*; +import io.anuke.mindustry.world.consumers.*; +import io.anuke.mindustry.world.meta.*; import java.io.*; @@ -37,6 +34,8 @@ public class GenericCrafter extends Block{ solid = true; hasItems = true; health = 60; + idleSound = Sounds.machine; + idleSoundVolume = 0.03f; } @Override @@ -58,6 +57,11 @@ public class GenericCrafter extends Block{ } } + @Override + public boolean shouldIdleSound(Tile tile){ + return tile.entity.cons.valid(); + } + @Override public void init(){ outputsLiquid = outputLiquid != null; diff --git a/core/src/io/anuke/mindustry/world/blocks/storage/CoreBlock.java b/core/src/io/anuke/mindustry/world/blocks/storage/CoreBlock.java index 1d6c4ee369..b4f02e1fc0 100644 --- a/core/src/io/anuke/mindustry/world/blocks/storage/CoreBlock.java +++ b/core/src/io/anuke/mindustry/world/blocks/storage/CoreBlock.java @@ -30,8 +30,8 @@ public class CoreBlock extends StorageBlock{ update = true; hasItems = true; flags = EnumSet.of(BlockFlag.target, BlockFlag.producer); - idleSound = Sounds.respawning; - idleSoundVolume = 1f; + activeSound = Sounds.respawning; + activeSoundVolume = 1f; } @Remote(called = Loc.server) @@ -79,6 +79,7 @@ public class CoreBlock extends StorageBlock{ @Override public void placed(Tile tile){ + super.placed(tile); state.teams.get(tile.getTeam()).cores.add(tile); } @@ -155,7 +156,7 @@ public class CoreBlock extends StorageBlock{ } @Override - public boolean shouldIdleSound(Tile tile){ + public boolean shouldActiveSound(Tile tile){ CoreEntity entity = tile.entity(); return entity.spawnPlayer != null; diff --git a/desktop-sdl/build.gradle b/desktop-sdl/build.gradle index 2434010234..006fda77da 100644 --- a/desktop-sdl/build.gradle +++ b/desktop-sdl/build.gradle @@ -37,10 +37,7 @@ task dist(type: Jar, dependsOn: classes){ //use target = all for all platforms def target = getTarget() - if(target.contains("windows")){ - def prefix = target.contains("32") ? "64" : "" - exclude('**.so', "**.dylib", "sdl-arc${prefix}.dll", "gdx${prefix}.dll", "gdx-freetype${prefix}.dll", "**/music/**", "**/sounds/**") - } + if(target.contains("windows")) exclude('**.so', "**.dylib") if(target == "mac") exclude('**.so', "**.dll") if(target == "linux") exclude('**.dll', "**.dylib") archivesBaseName = appName + "-" + target @@ -54,7 +51,7 @@ task ikZip(type: Zip){ def filename = "$appName-${getTarget()}-${version}" from "build/libs/$filename" - archiveName = "$appName-${getTarget()}-${getVersionString()}.zip" + archiveName = "${generateDeployName(getTarget())}.zip" } task ikdist{ @@ -81,16 +78,6 @@ task ikdist{ into file(folder) } - copy{ - from files("../core/assets/music") - into file(folder + "/music") - } - - copy{ - from files("../core/assets/sounds") - into file(folder + "/sounds") - } - copy{ from(getTarget().contains("32") ? "$IKVM_DIR/libraries_32" : "$IKVM_DIR/libraries") into folder diff --git a/desktop-sdl/src/io/anuke/mindustry/desktopsdl/DesktopPlatform.java b/desktop-sdl/src/io/anuke/mindustry/desktopsdl/DesktopPlatform.java index e055f2c684..420ef0260c 100644 --- a/desktop-sdl/src/io/anuke/mindustry/desktopsdl/DesktopPlatform.java +++ b/desktop-sdl/src/io/anuke/mindustry/desktopsdl/DesktopPlatform.java @@ -1,6 +1,7 @@ package io.anuke.mindustry.desktopsdl; import club.minnced.discord.rpc.*; +import io.anuke.arc.backends.sdl.jni.SDL; import io.anuke.arc.collection.*; import io.anuke.arc.files.*; import io.anuke.arc.function.*; @@ -10,7 +11,6 @@ import io.anuke.mindustry.core.GameState.*; import io.anuke.mindustry.core.*; import io.anuke.mindustry.net.*; import io.anuke.mindustry.ui.dialogs.*; -import sdl.*; import java.net.*; import java.util.*; diff --git a/desktop/build.gradle b/desktop/build.gradle index 97449ed185..65139a81c3 100644 --- a/desktop/build.gradle +++ b/desktop/build.gradle @@ -169,7 +169,7 @@ task packrZip(){ task rzip(type: Zip){ from "packr-out/" - archiveName "$appName-${getPlatform()}-${getVersionString()}.zip" + archiveName "${generateDeployName(getPlatform().toString())}.zip" destinationDir(file("packr-export")) } diff --git a/ios/Info.plist.xml b/ios/Info.plist.xml index abd81b462c..4dee6ec646 100644 --- a/ios/Info.plist.xml +++ b/ios/Info.plist.xml @@ -71,32 +71,10 @@ LSItemContentTypes io.anuke.mindustry.mapfile - io.anuke.mindustry.savefile - UTExportedTypeDeclarations - - - UTTypeConformsTo - - public.data - - UTTypeDescription - Mindustry Save File - UTTypeIdentifier - io.anuke.mindustry.savefile - UTTypeTagSpecification - - public.filename-extension - msav - public.mime-type - mindustry/msav - - - - UTExportedTypeDeclarations @@ -111,9 +89,9 @@ UTTypeTagSpecification public.filename-extension - mmap + msav public.mime-type - mindustry/mmap + mindustry/msav diff --git a/ios/build.gradle b/ios/build.gradle index 4859a5c758..6fc88382bb 100644 --- a/ios/build.gradle +++ b/ios/build.gradle @@ -7,6 +7,37 @@ ext{ mainClassName = "io.anuke.mindustry.IOSLauncher" } +task copyAssets(){ + doLast{ + delete{ + delete "assets/" + } + + copy{ + from "../core/assets" + into "assets/" + } + + exec{ + ignoreExitValue true + commandLine "sh", "./convert_audio.sh", "assets/sounds" + } + + exec{ + ignoreExitValue true + commandLine "sh", "./convert_audio.sh", "assets/music" + } + + delete{ + delete fileTree('assets') { + include '**/*.ogg' + } + } + } +} + +build.dependsOn copyAssets + launchIPhoneSimulator.dependsOn build launchIPadSimulator.dependsOn build launchIOSDevice.dependsOn build @@ -14,4 +45,4 @@ createIPA.dependsOn build robovm{ archs = "thumbv7:arm64" -} \ No newline at end of file +} diff --git a/ios/convert_audio.sh b/ios/convert_audio.sh new file mode 100755 index 0000000000..c4772fadc3 --- /dev/null +++ b/ios/convert_audio.sh @@ -0,0 +1,7 @@ +#!/usr/bin/bash + +#convert ogg to .caf files for iOS +for i in $1/*.ogg; do + echo $i + ffmpeg -i "$i" "${i%.*}.caf" +done \ No newline at end of file diff --git a/ios/data/Assets.xcassets/AppIcon.appiconset/icon-100.png b/ios/data/Assets.xcassets/AppIcon.appiconset/icon-100.png index 778158f1a2..1d4a214925 100644 Binary files a/ios/data/Assets.xcassets/AppIcon.appiconset/icon-100.png and b/ios/data/Assets.xcassets/AppIcon.appiconset/icon-100.png differ diff --git a/ios/data/Assets.xcassets/AppIcon.appiconset/icon-114.png b/ios/data/Assets.xcassets/AppIcon.appiconset/icon-114.png index 29db05c2f7..ecb76ce9c9 100644 Binary files a/ios/data/Assets.xcassets/AppIcon.appiconset/icon-114.png and b/ios/data/Assets.xcassets/AppIcon.appiconset/icon-114.png differ diff --git a/ios/data/Assets.xcassets/AppIcon.appiconset/icon-120.png b/ios/data/Assets.xcassets/AppIcon.appiconset/icon-120.png index 28ce08fa07..02bcb81568 100644 Binary files a/ios/data/Assets.xcassets/AppIcon.appiconset/icon-120.png and b/ios/data/Assets.xcassets/AppIcon.appiconset/icon-120.png differ diff --git a/ios/data/Assets.xcassets/AppIcon.appiconset/icon-128.png b/ios/data/Assets.xcassets/AppIcon.appiconset/icon-128.png index cbf7402fc9..cf755232af 100644 Binary files a/ios/data/Assets.xcassets/AppIcon.appiconset/icon-128.png and b/ios/data/Assets.xcassets/AppIcon.appiconset/icon-128.png differ diff --git a/ios/data/Assets.xcassets/AppIcon.appiconset/icon-144.png b/ios/data/Assets.xcassets/AppIcon.appiconset/icon-144.png index 92b596b098..5069932875 100644 Binary files a/ios/data/Assets.xcassets/AppIcon.appiconset/icon-144.png and b/ios/data/Assets.xcassets/AppIcon.appiconset/icon-144.png differ diff --git a/ios/data/Assets.xcassets/AppIcon.appiconset/icon-152.png b/ios/data/Assets.xcassets/AppIcon.appiconset/icon-152.png index 2c65bbbe6c..a89acddc7d 100644 Binary files a/ios/data/Assets.xcassets/AppIcon.appiconset/icon-152.png and b/ios/data/Assets.xcassets/AppIcon.appiconset/icon-152.png differ diff --git a/ios/data/Assets.xcassets/AppIcon.appiconset/icon-16.png b/ios/data/Assets.xcassets/AppIcon.appiconset/icon-16.png index cf8c679245..85a9288fc8 100644 Binary files a/ios/data/Assets.xcassets/AppIcon.appiconset/icon-16.png and b/ios/data/Assets.xcassets/AppIcon.appiconset/icon-16.png differ diff --git a/ios/data/Assets.xcassets/AppIcon.appiconset/icon-167.png b/ios/data/Assets.xcassets/AppIcon.appiconset/icon-167.png index babd1dc34b..5d02280904 100644 Binary files a/ios/data/Assets.xcassets/AppIcon.appiconset/icon-167.png and b/ios/data/Assets.xcassets/AppIcon.appiconset/icon-167.png differ diff --git a/ios/data/Assets.xcassets/AppIcon.appiconset/icon-172.png b/ios/data/Assets.xcassets/AppIcon.appiconset/icon-172.png index 3c54d648b0..a21a920786 100644 Binary files a/ios/data/Assets.xcassets/AppIcon.appiconset/icon-172.png and b/ios/data/Assets.xcassets/AppIcon.appiconset/icon-172.png differ diff --git a/ios/data/Assets.xcassets/AppIcon.appiconset/icon-180.png b/ios/data/Assets.xcassets/AppIcon.appiconset/icon-180.png index 047a0fb8f1..4167d6cb07 100644 Binary files a/ios/data/Assets.xcassets/AppIcon.appiconset/icon-180.png and b/ios/data/Assets.xcassets/AppIcon.appiconset/icon-180.png differ diff --git a/ios/data/Assets.xcassets/AppIcon.appiconset/icon-196.png b/ios/data/Assets.xcassets/AppIcon.appiconset/icon-196.png index ebc6adf844..512515e596 100644 Binary files a/ios/data/Assets.xcassets/AppIcon.appiconset/icon-196.png and b/ios/data/Assets.xcassets/AppIcon.appiconset/icon-196.png differ diff --git a/ios/data/Assets.xcassets/AppIcon.appiconset/icon-20.png b/ios/data/Assets.xcassets/AppIcon.appiconset/icon-20.png index f9ba0b1279..0d1d833145 100644 Binary files a/ios/data/Assets.xcassets/AppIcon.appiconset/icon-20.png and b/ios/data/Assets.xcassets/AppIcon.appiconset/icon-20.png differ diff --git a/ios/data/Assets.xcassets/AppIcon.appiconset/icon-256.png b/ios/data/Assets.xcassets/AppIcon.appiconset/icon-256.png index f93e754b74..6cb18bea1f 100644 Binary files a/ios/data/Assets.xcassets/AppIcon.appiconset/icon-256.png and b/ios/data/Assets.xcassets/AppIcon.appiconset/icon-256.png differ diff --git a/ios/data/Assets.xcassets/AppIcon.appiconset/icon-29.png b/ios/data/Assets.xcassets/AppIcon.appiconset/icon-29.png index 3f6e0441f7..4e4e211967 100644 Binary files a/ios/data/Assets.xcassets/AppIcon.appiconset/icon-29.png and b/ios/data/Assets.xcassets/AppIcon.appiconset/icon-29.png differ diff --git a/ios/data/Assets.xcassets/AppIcon.appiconset/icon-32.png b/ios/data/Assets.xcassets/AppIcon.appiconset/icon-32.png index e3a7001b36..efbc1500d0 100644 Binary files a/ios/data/Assets.xcassets/AppIcon.appiconset/icon-32.png and b/ios/data/Assets.xcassets/AppIcon.appiconset/icon-32.png differ diff --git a/ios/data/Assets.xcassets/AppIcon.appiconset/icon-40.png b/ios/data/Assets.xcassets/AppIcon.appiconset/icon-40.png index 6720dea79f..d1640f717e 100644 Binary files a/ios/data/Assets.xcassets/AppIcon.appiconset/icon-40.png and b/ios/data/Assets.xcassets/AppIcon.appiconset/icon-40.png differ diff --git a/ios/data/Assets.xcassets/AppIcon.appiconset/icon-48.png b/ios/data/Assets.xcassets/AppIcon.appiconset/icon-48.png index fa5a086244..6ad87a04c7 100644 Binary files a/ios/data/Assets.xcassets/AppIcon.appiconset/icon-48.png and b/ios/data/Assets.xcassets/AppIcon.appiconset/icon-48.png differ diff --git a/ios/data/Assets.xcassets/AppIcon.appiconset/icon-50.png b/ios/data/Assets.xcassets/AppIcon.appiconset/icon-50.png index fbed9e0e77..fbd86da944 100644 Binary files a/ios/data/Assets.xcassets/AppIcon.appiconset/icon-50.png and b/ios/data/Assets.xcassets/AppIcon.appiconset/icon-50.png differ diff --git a/ios/data/Assets.xcassets/AppIcon.appiconset/icon-512.png b/ios/data/Assets.xcassets/AppIcon.appiconset/icon-512.png index 63ec39615b..02f71580ec 100644 Binary files a/ios/data/Assets.xcassets/AppIcon.appiconset/icon-512.png and b/ios/data/Assets.xcassets/AppIcon.appiconset/icon-512.png differ diff --git a/ios/data/Assets.xcassets/AppIcon.appiconset/icon-55.png b/ios/data/Assets.xcassets/AppIcon.appiconset/icon-55.png index a8c01fd243..b3069fa00e 100644 Binary files a/ios/data/Assets.xcassets/AppIcon.appiconset/icon-55.png and b/ios/data/Assets.xcassets/AppIcon.appiconset/icon-55.png differ diff --git a/ios/data/Assets.xcassets/AppIcon.appiconset/icon-57.png b/ios/data/Assets.xcassets/AppIcon.appiconset/icon-57.png index 76d4f73f48..11f3369a21 100644 Binary files a/ios/data/Assets.xcassets/AppIcon.appiconset/icon-57.png and b/ios/data/Assets.xcassets/AppIcon.appiconset/icon-57.png differ diff --git a/ios/data/Assets.xcassets/AppIcon.appiconset/icon-58.png b/ios/data/Assets.xcassets/AppIcon.appiconset/icon-58.png index 726f314250..0570ccc764 100644 Binary files a/ios/data/Assets.xcassets/AppIcon.appiconset/icon-58.png and b/ios/data/Assets.xcassets/AppIcon.appiconset/icon-58.png differ diff --git a/ios/data/Assets.xcassets/AppIcon.appiconset/icon-60.png b/ios/data/Assets.xcassets/AppIcon.appiconset/icon-60.png index 1034d116e6..66c96be55a 100644 Binary files a/ios/data/Assets.xcassets/AppIcon.appiconset/icon-60.png and b/ios/data/Assets.xcassets/AppIcon.appiconset/icon-60.png differ diff --git a/ios/data/Assets.xcassets/AppIcon.appiconset/icon-64.png b/ios/data/Assets.xcassets/AppIcon.appiconset/icon-64.png index 12833da797..a53a80d9bc 100644 Binary files a/ios/data/Assets.xcassets/AppIcon.appiconset/icon-64.png and b/ios/data/Assets.xcassets/AppIcon.appiconset/icon-64.png differ diff --git a/ios/data/Assets.xcassets/AppIcon.appiconset/icon-72.png b/ios/data/Assets.xcassets/AppIcon.appiconset/icon-72.png index 8c4244d967..700b08fa9d 100644 Binary files a/ios/data/Assets.xcassets/AppIcon.appiconset/icon-72.png and b/ios/data/Assets.xcassets/AppIcon.appiconset/icon-72.png differ diff --git a/ios/data/Assets.xcassets/AppIcon.appiconset/icon-76.png b/ios/data/Assets.xcassets/AppIcon.appiconset/icon-76.png index 816dadd6c6..a6f2830967 100644 Binary files a/ios/data/Assets.xcassets/AppIcon.appiconset/icon-76.png and b/ios/data/Assets.xcassets/AppIcon.appiconset/icon-76.png differ diff --git a/ios/data/Assets.xcassets/AppIcon.appiconset/icon-80.png b/ios/data/Assets.xcassets/AppIcon.appiconset/icon-80.png index 77609f4795..3511b2f3a4 100644 Binary files a/ios/data/Assets.xcassets/AppIcon.appiconset/icon-80.png and b/ios/data/Assets.xcassets/AppIcon.appiconset/icon-80.png differ diff --git a/ios/data/Assets.xcassets/AppIcon.appiconset/icon-87.png b/ios/data/Assets.xcassets/AppIcon.appiconset/icon-87.png index 2164c2a24f..187d809c8d 100644 Binary files a/ios/data/Assets.xcassets/AppIcon.appiconset/icon-87.png and b/ios/data/Assets.xcassets/AppIcon.appiconset/icon-87.png differ diff --git a/ios/data/Assets.xcassets/AppIcon.appiconset/icon-88.png b/ios/data/Assets.xcassets/AppIcon.appiconset/icon-88.png index 8d3a995317..82fa08f7f1 100644 Binary files a/ios/data/Assets.xcassets/AppIcon.appiconset/icon-88.png and b/ios/data/Assets.xcassets/AppIcon.appiconset/icon-88.png differ diff --git a/ios/data/Assets.xcassets/AppIcon.appiconset/icon-main.png b/ios/data/Assets.xcassets/AppIcon.appiconset/icon-main.png index 2604a0c85d..96cf6643f1 100644 Binary files a/ios/data/Assets.xcassets/AppIcon.appiconset/icon-main.png and b/ios/data/Assets.xcassets/AppIcon.appiconset/icon-main.png differ diff --git a/ios/data/Default-568h@2x~iphone.png b/ios/data/Default-568h@2x~iphone.png index f557df3353..153c6efdf4 100644 Binary files a/ios/data/Default-568h@2x~iphone.png and b/ios/data/Default-568h@2x~iphone.png differ diff --git a/ios/data/Default-667h.png b/ios/data/Default-667h.png index 53540c0bee..b3acc10e67 100644 Binary files a/ios/data/Default-667h.png and b/ios/data/Default-667h.png differ diff --git a/ios/data/Default-736h.png b/ios/data/Default-736h.png index 93870ef71e..f5a22468a3 100644 Binary files a/ios/data/Default-736h.png and b/ios/data/Default-736h.png differ diff --git a/ios/data/Default-Landscape-736h.png b/ios/data/Default-Landscape-736h.png index f7e12aa617..04e32d4d7e 100644 Binary files a/ios/data/Default-Landscape-736h.png and b/ios/data/Default-Landscape-736h.png differ diff --git a/ios/data/Default-Landscape@2x~ipad.png b/ios/data/Default-Landscape@2x~ipad.png index 303312fd8a..239e218934 100644 Binary files a/ios/data/Default-Landscape@2x~ipad.png and b/ios/data/Default-Landscape@2x~ipad.png differ diff --git a/ios/data/Default-Landscape~ipad.png b/ios/data/Default-Landscape~ipad.png index a454227fe4..7374a80f75 100644 Binary files a/ios/data/Default-Landscape~ipad.png and b/ios/data/Default-Landscape~ipad.png differ diff --git a/ios/data/Default-Portrait@2x~ipad.png b/ios/data/Default-Portrait@2x~ipad.png index d37ccb0ee8..c00e06f4e4 100644 Binary files a/ios/data/Default-Portrait@2x~ipad.png and b/ios/data/Default-Portrait@2x~ipad.png differ diff --git a/ios/data/Default-Portrait~ipad.png b/ios/data/Default-Portrait~ipad.png index 2a421f9359..030e88c898 100644 Binary files a/ios/data/Default-Portrait~ipad.png and b/ios/data/Default-Portrait~ipad.png differ diff --git a/ios/data/Default@2x~iphone.png b/ios/data/Default@2x~iphone.png index 3071d29ad1..5724809f89 100644 Binary files a/ios/data/Default@2x~iphone.png and b/ios/data/Default@2x~iphone.png differ diff --git a/ios/data/Default~iphone.png b/ios/data/Default~iphone.png index 9f3ae021da..fa72316347 100644 Binary files a/ios/data/Default~iphone.png and b/ios/data/Default~iphone.png differ diff --git a/ios/robovm.xml b/ios/robovm.xml index 146861dd40..a1ce5b92bc 100644 --- a/ios/robovm.xml +++ b/ios/robovm.xml @@ -7,7 +7,7 @@ Info.plist.xml - ../core/assets + ../ios/assets ** @@ -33,6 +33,7 @@ com.android.org.bouncycastle.crypto.digests.AndroidDigestFactoryOpenSSL org.apache.harmony.security.provider.cert.DRLCertFactory org.apache.harmony.security.provider.crypto.CryptoProvider + org.robovm.apple.foundation.NSKeyValueCoder z diff --git a/ios/src/io/anuke/mindustry/IOSLauncher.java b/ios/src/io/anuke/mindustry/IOSLauncher.java index 520fb4e494..15988c3424 100644 --- a/ios/src/io/anuke/mindustry/IOSLauncher.java +++ b/ios/src/io/anuke/mindustry/IOSLauncher.java @@ -1,23 +1,22 @@ package io.anuke.mindustry; -import com.badlogic.gdx.backends.iosrobovm.IOSApplication; -import com.badlogic.gdx.backends.iosrobovm.IOSApplicationConfiguration; -import io.anuke.arc.Core; -import io.anuke.arc.files.FileHandle; -import io.anuke.arc.scene.ui.layout.UnitScl; -import io.anuke.arc.util.Strings; -import io.anuke.mindustry.core.Platform; -import io.anuke.mindustry.game.Saves.SaveSlot; -import io.anuke.mindustry.io.SaveIO; +import com.badlogic.gdx.backends.iosrobovm.*; +import io.anuke.arc.*; +import io.anuke.arc.files.*; +import io.anuke.arc.scene.ui.layout.*; +import io.anuke.arc.util.*; +import io.anuke.arc.util.io.*; +import io.anuke.mindustry.core.*; +import io.anuke.mindustry.game.Saves.*; +import io.anuke.mindustry.io.*; import io.anuke.mindustry.net.Net; -import io.anuke.mindustry.net.ArcNetClient; -import io.anuke.mindustry.net.ArcNetServer; -import org.robovm.apple.foundation.NSAutoreleasePool; -import org.robovm.apple.foundation.NSURL; +import io.anuke.mindustry.net.*; +import org.robovm.apple.foundation.*; import org.robovm.apple.uikit.*; -import java.io.IOException; -import java.util.Collections; +import java.io.*; +import java.util.*; +import java.util.zip.*; import static io.anuke.mindustry.Vars.*; import static org.robovm.apple.foundation.NSPathUtilities.getDocumentsDirectory; @@ -40,7 +39,8 @@ public class IOSLauncher extends IOSApplication.Delegate{ @Override public void shareFile(FileHandle file){ - FileHandle to = Core.files.absolute(getDocumentsDirectory()).child(file.name()); + Log.info("Attempting to share file " + file); + FileHandle to = Core.files.absolute(getDocumentsDirectory()).child(file.name()/* + ".png"*/); file.copyTo(to); NSURL url = new NSURL(to.file()); @@ -53,12 +53,15 @@ public class IOSLauncher extends IOSApplication.Delegate{ @Override public void beginForceLandscape(){ + Log.info("begin force landscape"); forced = true; + UINavigationController.attemptRotationToDeviceOrientation(); } @Override public void endForceLandscape(){ forced = false; + UINavigationController.attemptRotationToDeviceOrientation(); } }; @@ -71,6 +74,7 @@ public class IOSLauncher extends IOSApplication.Delegate{ return forced ? UIInterfaceOrientationMask.Landscape : UIInterfaceOrientationMask.All; } + @Override public boolean openURL(UIApplication app, NSURL url, UIApplicationOpenURLOptions options){ System.out.println("Opened URL: " + url.getPath()); @@ -87,22 +91,43 @@ public class IOSLauncher extends IOSApplication.Delegate{ openURL(((NSURL)options.get(UIApplicationLaunchOptions.Keys.URL()))); } + Core.app.post(() -> Core.app.post(() -> { + Core.scene.table("dialogDim", t -> { + t.visible(() -> { + if(!forced) return false; + t.toFront(); + UIInterfaceOrientation o = UIApplication.getSharedApplication().getStatusBarOrientation(); + return forced && (o == UIInterfaceOrientation.Portrait || o == UIInterfaceOrientation.PortraitUpsideDown); + }); + t.add("Please rotate the device to landscape orientation to use the editor.").wrap().grow(); + }); + })); + return b; } void openURL(NSURL url){ - Core.app.post(() -> { + Core.app.post(() -> Core.app.post(() -> { FileHandle file = Core.files.absolute(getDocumentsDirectory()).child(url.getLastPathComponent()); Core.files.absolute(url.getPath()).copyTo(file); - //TODO detect if it's a map or save if(file.extension().equalsIgnoreCase(saveExtension)){ //open save if(SaveIO.isSaveValid(file)){ try{ - SaveSlot slot = control.saves.importSave(file); - ui.load.runLoadSave(slot); + SaveMeta meta = SaveIO.getMeta(new DataInputStream(new InflaterInputStream(file.read(Streams.DEFAULT_BUFFER_SIZE)))); + if(meta.tags.containsKey("name")){ + //is map + if(!ui.editor.isShown()){ + ui.editor.show(); + } + + ui.editor.beginEditMap(file); + }else{ + SaveSlot slot = control.saves.importSave(file); + ui.load.runLoadSave(slot); + } }catch(IOException e){ ui.showError(Core.bundle.format("save.import.fail", Strings.parseException(e, true))); } @@ -110,16 +135,8 @@ public class IOSLauncher extends IOSApplication.Delegate{ ui.showError("save.import.invalid"); } - }else if(file.extension().equalsIgnoreCase(mapExtension)){ //open map - Core.app.post(() -> { - if(!ui.editor.isShown()){ - ui.editor.show(); - } - - ui.editor.beginEditMap(file); - }); } - }); + })); } public static void main(String[] argv){ diff --git a/server/build.gradle b/server/build.gradle index 8e7f98fafc..0118bb0f76 100644 --- a/server/build.gradle +++ b/server/build.gradle @@ -51,7 +51,7 @@ task dist(type: Jar){ task dzip(type: Zip){ from getServerFolder() - archiveName "$appName-server-${getVersionString()}.zip" + archiveName "${generateDeployName('server')}.zip" destinationDir(file("../deploy/")) finalizedBy 'cleanup' diff --git a/server/server_template/run_server.bat b/server/server_template/run_server.bat index 64cc23a20c..26d919a77b 100644 --- a/server/server_template/run_server.bat +++ b/server/server_template/run_server.bat @@ -1,5 +1 @@ -@Echo Off -Set "JV=" -For /F "Tokens=3" %%A In ('java -version 2^>^&1') Do If Not Defined JV Set "JV=%%~A" -If /I "%JV%"=="not" (Echo Java is not installed, this server requires Java to run.) Else (start java -jar server.jar) -Pause +java -jar server.jar \ No newline at end of file diff --git a/update_wiki.sh b/update_wiki.sh index f18e7a651c..a3ed44ee33 100755 --- a/update_wiki.sh +++ b/update_wiki.sh @@ -5,5 +5,5 @@ cd ../Mindustry-Wiki-Generator ./gradlew run cd ../wiki git add . -git commit -m "Update to match commit ${TRAVIS_COMMIT}" +git commit -m "Update to match build ${TRAVIS_TAG}" git push https://Anuken:${GH_PUSH_TOKEN}@github.com/MindustryGame/wiki