diff --git a/build.gradle b/build.gradle index d1d219b811..af80efa582 100644 --- a/build.gradle +++ b/build.gradle @@ -25,7 +25,7 @@ allprojects { appName = 'Mindustry' gdxVersion = '1.9.8' aiVersion = '1.8.1' - uCoreVersion = 'f484468' + uCoreVersion = '1b29d6c' getVersionString = { String buildVersion = getBuildVersion() diff --git a/core/assets/bundles/bundle_de.properties b/core/assets/bundles/bundle_de.properties index 1e7258c48a..be8fa12cf5 100644 --- a/core/assets/bundles/bundle_de.properties +++ b/core/assets/bundles/bundle_de.properties @@ -18,7 +18,7 @@ text.public = Öffentlich text.players = {0} Spieler online text.players.single = {0} Spieler online text.server.mismatch = Paketfehler: Mögliche Client / Server-Version stimmt nicht überein. Stell sicher, dass du und der Host die neueste Version von Mindustry haben! -text.server.closing = [accent] Server wird geschlossen... +.server.closing = [accent] Server wird geschlossen... text.server.kicked.kick = Du wurdest vom Server gekickt! text.server.kicked.invalidPassword = Falsches Passwort. text.server.connected = {0} ist beigetreten @@ -94,18 +94,18 @@ text.editor.badsize = [orange]Ungültige Bildabmessungen! [] Gültige Kartenabme text.editor.errorimageload = Fehler beim Laden des Bildes: [orange] {0} text.editor.errorimagesave = Fehler beim Speichern des Bildes: [orange] {0} text.editor.generate = Generieren -text.editor.resize = Größe anpassen -text.editor.loadmap = Karte laden -text.editor.savemap = Karte speichern -text.editor.loadimage = Bild laden -text.editor.saveimage = Bild speichern +text.editor.resize = Grösse\nanpassen +text.editor.loadmap = Karte\nladen +text.editor.savemap = Karte\nspeichern +text.editor.loadimage = Bild\nladen +text.editor.saveimage = Bild\nspeichern text.editor.unsaved = [crimson] Du hast Änderungen nicht gespeichert [] Möchtest du wirklich aufhören? -text.editor.brushsize = Pinselgröße: {0} +text.editor.brushsize = Pinselgrösse: {0} text.editor.noplayerspawn = Diese Karte hat keinen Spielerspawnpunkt! text.editor.manyplayerspawns = Maps können nicht mehr als einen Spawnpunkt des Spielers haben! text.editor.manyenemyspawns = Kann nicht mehr als {0} feindliche Spawnpunkte haben! -text.editor.resizemap = Größe der Karte ändern -text.editor.resizebig = [crimson] Warnung! [] Karten, die größer als 256 Einheiten sind, können ruckeln und instabil sein. +text.editor.resizemap = Grösse der Karte ändern +text.editor.resizebig = [crimson] Warnung! [] Karten, die grösser als 256 Einheiten sind, können ruckeln und instabil sein. text.editor.mapname = Map Name text.editor.overwrite = [accent] Warnung! Dies überschreibt eine vorhandene Map. text.editor.failoverwrite = [crimson] Die Standardkarte kann nicht überschrieben werden! @@ -155,7 +155,7 @@ text.blocks.powerdraindamage = Energieabnahme / Schaden text.blocks.shieldradius = Schildradius text.blocks.itemspeedsecond = Gegenstands Geschwindigkeit / Sekunde text.blocks.range = Reichweite -text.blocks.size = Größe +text.blocks.size = Grösse text.blocks.powerliquid = Energie / Flüssigkeit text.blocks.maxliquidsecond = Max Flüssigkeit / Sekunde text.blocks.liquidcapacity = Flüssigkeitskapazität @@ -229,9 +229,9 @@ map.tundra.name = Kältesteppe map.spiral.name = Spirale map.tutorial.name = Tutorial tutorial.intro.text = [gelb] Willkommen zum Tutorial [] Um zu beginnen, drücke 'weiter'. -tutorial.moveDesktop.text = Verwende zum Verschieben die Tasten [orange] [[WASD] []. Halte [orange] Shift [] gedrückt, um zu erhöhen. Halte [orange] CTRL/STRG [] gedrückt, während du das [orange] Scrollrad [] zum Vergrößern oder Verkleinern verwendest. -tutorial.shoot.text = Ziele mit der Maus, halte die [orange] linke Maustaste [] gedrückt, um zu schießen. Versuche es mit dem [gelben] Ziel []. -tutorial.moveAndroid.text = Um die Ansicht zu verschieben, ziehe einen Finger über den Bildschirm. Drücke und ziehe, um zu vergrößern oder zu verkleinern. +tutorial.moveDesktop.text = Verwende zum Verschieben die Tasten [orange] [[WASD] []. Halte [orange] Shift [] gedrückt, um zu erhöhen. Halte [orange] CTRL/STRG [] gedrückt, während du das [orange] Scrollrad [] zum Vergrössern oder Verkleinern verwendest. +tutorial.shoot.text = Ziele mit der Maus, halte die [orange] linke Maustaste [] gedrückt, um zu schiessen. Versuche es mit dem [gelben] Ziel []. +tutorial.moveAndroid.text = Um die Ansicht zu verschieben, ziehe einen Finger über den Bildschirm. Drücke und ziehe, um zu vergrössern oder zu verkleinern. tutorial.placeSelect.text = Versuche, ein [gelbes] Förderband [] aus dem Blockmenü unten rechts auszuwählen. tutorial.placeConveyorDesktop.text = Verwende das [orange] [[scrollwheel] [], um das Förderband nach vorne zu bewegen [orange] vorwärts [], und platziere es dann an der [gelben] markierten Stelle [] mit [orange] [[linke Maustaste] []. tutorial.placeConveyorAndroid.text = Verwende die [orange] [[rotieren-Taste] [], um das Förderband nach vorne [orange] zu drehen [], ziehe es mit einem Finger in Position und platziere es dann an der [gelben] markierten Stelle [] mit der [Orange] [[Häkchen][]. @@ -245,19 +245,19 @@ tutorial.drillInfo.text = Verschiedene Erze benötigen unterschiedliche Bohrer. tutorial.drillPlaced2.text = Wenn du Gegenstände in den Kern verschiebst, steckst du sie in dein [gelbes] Inventar [] oben links. Das Platzieren von Blöcken verwendet Gegenstände aus deinem Inventar. tutorial.moreDrills.text = Du kannst so viele Bohrer und Förderer miteinander verbinden wie du lust hast. tutorial.deleteBlock.text = Du kannst Blöcke löschen, indem du mit der [orange] rechte Maustaste [] auf dem Block klickst, den du löschen möchtest. Versuche, dieses Förderband zu löschen. -tutorial.deleteBlockAndroid.text = Du kannst Blöcke löschen, indem du [orange] das Fadenkreuz [] im [orange] Pausenmodusmenü [] links unten auswählst und auf einen Block tippst. Versuche, dieses Fließband zu löschen. +tutorial.deleteBlockAndroid.text = Du kannst Blöcke löschen, indem du [orange] das Fadenkreuz [] im [orange] Pausenmodusmenü [] links unten auswählst und auf einen Block tippst. Versuche, dieses Fliessband zu löschen. tutorial.placeTurret.text = Wähle nun einen [gelben] Turm [] an der [gelben] markierten Stelle [] und platziere ihn. tutorial.placedTurretAmmo.text = Dieser Turm nimmt nun [gelbe] Munition [] vom Förderband an. Du kannst sehen, wie viel Munition es hat, indem du darüber schweben und den [grünen] grünen Balken [] prüfen. -tutorial.turretExplanation.text = Geschütze schießen automatisch auf den nächsten Feind in Reichweite, solange sie genug Munition haben. +tutorial.turretExplanation.text = Geschütze schiessen automatisch auf den nächsten Feind in Reichweite, solange sie genug Munition haben. tutorial.waves.text = Jede [yellow] 60 [] Sekunden wird eine Welle von [coral] Feinden [] an einem bestimmten Orten erscheinen und versuchen, den Kern zu zerstören. tutorial.coreDestruction.text = Dein Ziel ist es, den Kern [yellow] zu verteidigen. Wenn der Kern zerstört wird, verlierst du [coral] das Spiel []. -tutorial.pausingDesktop.text = Wenn du jemals eine Pause machen möchtest, drücke die [orange] Pause-Taste [] oben links oder [orange]space[], um das Spiel anzuhalten. Du kannst auch Blöcke immer noch auswählen und platzieren, während du das Spiel pausiert ist, aber Sie können sich nicht bewegen oder schießen. +tutorial.pausingDesktop.text = Wenn du jemals eine Pause machen möchtest, drücke die [orange] Pause-Taste [] oben links oder [orange]space[], um das Spiel anzuhalten. Du kannst auch Blöcke immer noch auswählen und platzieren, während du das Spiel pausiert ist, aber Sie können sich nicht bewegen oder schiessen. tutorial.pausingAndroid.text = Wenn du jemals eine Pause machen willst, drück einfach die [orange] Pause-Taste [] oben links, um das Spiel anzuhalten. Sie können immer noch Sachen auswählen und Blöcke während der Pause platzieren. tutorial.purchaseWeapons.text = Du kannst neue [yellow] Waffen [] für deinen Mech kaufen, indem du das Verbesserungs-Menü unten links öffnest. tutorial.switchWeapons.text = Schalte Waffen, indem du entweder auf das Symbol unten links klickst oder Nummern verwendest [orange] [[1-9] []. tutorial.spawnWave.text = Hier kommt die erste Welle. Zerstöre sie. tutorial.pumpDesc.text = In späteren Wellen müsst du möglicherweise [yellow] Pumpen [] verwenden, um Flüssigkeiten für Generatoren oder Extraktoren zu verteilen. -tutorial.pumpPlace.text = Pumpen arbeiten ähnlich wie Bohrer, außer dass sie anstelle von Gegenständen Flüssigkeiten produzieren. Versuch mal, eine Pumpe auf das [yellow] gekennzeichnete Öl [] zu setzen. +tutorial.pumpPlace.text = Pumpen arbeiten ähnlich wie Bohrer, ausser dass sie anstelle von Gegenständen Flüssigkeiten produzieren. Versuch mal, eine Pumpe auf das [yellow] gekennzeichnete Öl [] zu setzen. tutorial.conduitUse.text = Stellen Sie nun eine [orange] Leitungsrohr [] von der Pumpe weg. tutorial.conduitUse2.text = Und noch ein paar mehr ... tutorial.conduitUse3.text = Und noch ein paar mehr ... @@ -275,7 +275,7 @@ keybind.move_x.name = bewege_x keybind.move_y.name = bewege_y keybind.select.name = wählen keybind.break.name = Unterbrechung -keybind.shoot.name = Schieß +keybind.shoot.name = Schiess keybind.zoom_hold.name = zoomen_halten keybind.zoom.name = zoomen keybind.menu.name = Menü @@ -295,17 +295,17 @@ mode.freebuild.name = Freier Bau upgrade.standard.name = Standard upgrade.standard.description = Der Standardmech. upgrade.blaster.name = Blaster -upgrade.blaster.description = Schießt eine langsame, schwache Kugel. +upgrade.blaster.description = Schiesst eine langsame, schwache Kugel. upgrade.triblaster.name = Dreifach-Blaster -upgrade.triblaster.description = Schießt 3 Kugeln in einer Ausbreitung. +upgrade.triblaster.description = Schiesst 3 Kugeln in einer Ausbreitung. upgrade.clustergun.name = Klumpen-Waffe -upgrade.clustergun.description = Schießt eine ungenaue Verbreitung von explosiven Granaten. +upgrade.clustergun.description = Schiesst eine ungenaue Verbreitung von explosiven Granaten. upgrade.beam.name = Strahlkanone -upgrade.beam.description = Schießt einen weitreichenden durchdringenden Laserstrahl. +upgrade.beam.description = Schiesst einen weitreichenden durchdringenden Laserstrahl. upgrade.vulcan.name = Vulkan -upgrade.vulcan.description = Schießt eine Flut von schnellen Kugeln. +upgrade.vulcan.description = Schiesst eine Flut von schnellen Kugeln. upgrade.shockgun.name = Schock-Waffe -upgrade.shockgun.description = Erschießt eine verheerende Explosion von geladenen Granatsplittern. +upgrade.shockgun.description = Erschiesst eine verheerende Explosion von geladenen Granatsplittern. item.stone.name = Stein item.iron.name = Eisen item.coal.name = Kohle @@ -358,12 +358,12 @@ block.titaniumwall.fulldescription = Eine starke Abwehrblockade. Bietet Schutz v block.duriumwall.name = Diriumwand block.duriumwall.fulldescription = Eine sehr starke Abwehrblockade. Bietet guten Schutz vor Feinden. block.compositewall.name = Verbundende Wand -block.steelwall-large.name = große Stahlwand -block.steelwall-large.fulldescription = Ein Standard-Verteidigungsblock. Mehrere Blöcke groß. -block.titaniumwall-large.name = große Titanwand -block.titaniumwall-large.fulldescription = Eine starke Abwehrblockade. Mehrere Blöcke groß. -block.duriumwall-large.name = große Diriumwand -block.duriumwall-large.fulldescription = Eine sehr starke Abwehrblockade. Mehrere Blöcke groß. +block.steelwall-large.name = grosse Stahlwand +block.steelwall-large.fulldescription = Ein Standard-Verteidigungsblock. Mehrere Blöcke gross. +block.titaniumwall-large.name = grosse Titanwand +block.titaniumwall-large.fulldescription = Eine starke Abwehrblockade. Mehrere Blöcke gross. +block.duriumwall-large.name = grosse Diriumwand +block.duriumwall-large.fulldescription = Eine sehr starke Abwehrblockade. Mehrere Blöcke gross. block.titaniumshieldwall.name = geschützte Wand block.titaniumshieldwall.fulldescription = Ein starker Abwehrblock mit einem extra eingebauten Schild. Benötigt Energie. Verwendet Energie, um feindliche Kugeln zu absorbieren. Es wird empfohlen, Verstärker zu verwenden, um diesem Block Energie zuzuführen. block.repairturret.name = Reparaturgeschütz @@ -374,8 +374,8 @@ block.shieldgenerator.name = Schildgenerator block.shieldgenerator.fulldescription = Ein fortgeschrittener Verteidigungsblock. Schützt alle Blöcke in einem Radius vor Angriffen. Bei keinem Betrieb langsamer Strom verbrauch, verliert bei Kugelkontakt jedoch schnell Energie. block.door.name = Tür block.door.fulldescription = Ein Block, der durch Antippen geöffnet und geschlossen werden kann. -block.door-large.name = große Tür -block.door-large.fulldescription = Ein Block der mehrere Felder groß ist und der durch Antippen geöffnet und geschlossen werden kann. +block.door-large.name = grosse Tür +block.door-large.fulldescription = Ein Block der mehrere Felder gross ist und der durch Antippen geöffnet und geschlossen werden kann. block.conduit.name = Leitungsrohr block.conduit.fulldescription = Grundlegender Flüssigkeitstransportblock. Funktioniert wie ein Förderband, aber mit Flüssigkeiten. Am besten mit Pumpen oder anderen Leitungen verwenden. Kann als Brücke für Gegner und Spieler verwendet werden. block.pulseconduit.name = Pulsleitungsrohr @@ -393,7 +393,7 @@ block.router.fulldescription = Akzeptiert Objekte aus einer Richtung und gibt si block.junction.name = Kreuzung block.junction.fulldescription = Fungiert als Brücke für zwei kreuzende Förderbänder. Nützlich in Situationen mit zwei verschiedenen Förderbänder, die unterschiedliche Materialien zu verschiedenen Orten transportieren. block.conveyortunnel.name = Förderbandtunnel -block.conveyortunnel.fulldescription = Transportiert Artikel unter Blöcken. Verwendung für einen Tunnel, der in den zu untertunnelnden Block führt, und einen auf der anderen Seite. Stellen Sie sicher, dass beide Tunnel in entgegengesetzte Richtungen weisen, das heißt das die Tunnel voneinander weggucken. +block.conveyortunnel.fulldescription = Transportiert Artikel unter Blöcken. Verwendung für einen Tunnel, der in den zu untertunnelnden Block führt, und einen auf der anderen Seite. Stellen Sie sicher, dass beide Tunnel in entgegengesetzte Richtungen weisen, das heisst das die Tunnel voneinander weggucken. block.liquidjunction.name = flüssigkeite Kreuzung block.liquidjunction.fulldescription = Funktioniert als Brücke für zwei kreuzende Leitungsrohre. Nützlich in Situationen mit zwei verschiedenen Leitungen, die unterschiedliche Flüssigkeiten zu verschiedenen Orten transportieren. block.liquiditemjunction.name = Flüssigkeit-Gegenstand-Kreuzung @@ -420,13 +420,13 @@ block.smelter.fulldescription = Der essentielle Bastelblock. Wenn 1x Eisen und 1 block.crucible.name = Tiegel block.crucible.fulldescription = Ein fortgeschrittener Handwerksblock. Braucht Kohle um zu funktionieren. Wenn 1x Titan und 1x Stahl eingegeben wird, wird 1x Dirium ausgegeben. block.coalpurifier.name = Kohle-Extraktor -block.coalpurifier.fulldescription = Ein einfacher Extraktorblock. Gibt Kohle aus, wenn der Block mit großen Mengen Wasser und Stein gefüllt wird. +block.coalpurifier.fulldescription = Ein einfacher Extraktorblock. Gibt Kohle aus, wenn der Block mit grossen Mengen Wasser und Stein gefüllt wird. block.titaniumpurifier.name = Titan-Extraktor -block.titaniumpurifier.fulldescription = Ein Standard-Extraktorblock. Gibt Titan aus wenn er mit großen Mengen Wasser und Eisen gefüllt wird. +block.titaniumpurifier.fulldescription = Ein Standard-Extraktorblock. Gibt Titan aus wenn er mit grossen Mengen Wasser und Eisen gefüllt wird. block.oilrefinery.name = Ölraffinerie -block.oilrefinery.fulldescription = Veredelt große Mengen Öl zu Kohle. Nützlich für die Betankung von Blöcken die Kohle benutzen wie z.b. Waffentürme, wenn Kohleadern knapp sind. +block.oilrefinery.fulldescription = Veredelt grosse Mengen Öl zu Kohle. Nützlich für die Betankung von Blöcken die Kohle benutzen wie z.b. Waffentürme, wenn Kohleadern knapp sind. block.stoneformer.name = Steinformer -block.stoneformer.fulldescription = Verfestigt flüssige Lava zu Stein. Nützlich für die Herstellung von großen Mengen von Stein für Kohle-Extraktor. +block.stoneformer.fulldescription = Verfestigt flüssige Lava zu Stein. Nützlich für die Herstellung von grossen Mengen von Stein für Kohle-Extraktor. block.lavasmelter.name = Lava-Schmelzer block.lavasmelter.fulldescription = Verwendet Lava, um Eisen zu Stahl schmelzen. Eine Alternative zum Schmelzer. Nützlich in Situationen, in denen Kohle knapp ist. block.stonedrill.name = Steinbohrer @@ -450,21 +450,21 @@ block.combustiongenerator.fulldescription = Erzeugt Energie aus Öl. Gibt Energi block.rtgenerator.name = RTG-Generator block.rtgenerator.fulldescription = Erzeugt geringe Mengen an Energie aus dem radioaktiven Zerfall von Uran. Gibt Energie als Laser an seine 4 Seiten aus. block.nuclearreactor.name = Kernreaktor -block.nuclearreactor.fulldescription = Eine erweiterte Version des RTG-Generators und der ultimative Energie Generator. Erzeugt Strom aus Uran. Erfordert konstante Wasserkühlung. Sehr heiß; explodiert heftig, wenn zu wenig Kühlmittel zugeführt wird. +block.nuclearreactor.fulldescription = Eine erweiterte Version des RTG-Generators und der ultimative Energie Generator. Erzeugt Strom aus Uran. Erfordert konstante Wasserkühlung. Sehr heiss; explodiert heftig, wenn zu wenig Kühlmittel zugeführt wird. block.turret.name = Geschütz block.turret.fulldescription = Ein einfacher, billiger Turm. Verwendet Stein für Munition. Hat etwas mehr Reichweite als das Doppelgeschütz. block.doubleturret.name = Doppelgeschütz -block.doubleturret.fulldescription = Eine etwas stärkere Version des Geschützes. Verwendet Stein für Munition. Hat deutlich mehr Schaden, hat aber eine geringere Reichweite. Schießt zwei Kugeln. +block.doubleturret.fulldescription = Eine etwas stärkere Version des Geschützes. Verwendet Stein für Munition. Hat deutlich mehr Schaden, hat aber eine geringere Reichweite. Schiesst zwei Kugeln. block.machineturret.name = Gatling Geschütz block.machineturret.fulldescription = Ein Standard-Allround-Turm. Verwendet Eisen für Munition. Hat eine schnelle Feuerrate mit gutem Schaden. block.shotgunturret.name = Splittergeschütz -block.shotgunturret.fulldescription = Ein Standard-Turm. Verwendet Eisen für Munition. Schießt 7 Kugeln auf einmal. Geringere Reichweite, aber höhere Schadensleistung als das Gatling Geschütz +block.shotgunturret.fulldescription = Ein Standard-Turm. Verwendet Eisen für Munition. Schiesst 7 Kugeln auf einmal. Geringere Reichweite, aber höhere Schadensleistung als das Gatling Geschütz block.flameturret.name = Flammenwerfer block.flameturret.fulldescription = Fortschrittlicher Nahbereichswaffe. Verwendet Kohle für Munition. Hat eine sehr geringe Reichweite, aber sehr hohen Schaden. Gut für Nahkampf. Empfohlen für den Einsatz hinter Mauern. block.sniperturret.name = Schienenkanone block.sniperturret.fulldescription = Fortschrittliches Reichweitengeschütz. Verwendet Stahl für Munition. Sehr hoher Schaden, aber niedrige Feuerrate. Teuer zu verwenden, kann aber aufgrund seiner Reichweite weit entfernt von den feindlichen Linien platziert werden. block.mortarturret.name = Flakgeschütz -block.mortarturret.fulldescription = Fortschrittlicher Flächen-Schaden Turm. Verwendet Kohle für Munition. Sehr langsame Feuerrate und Geschosse, aber sehr hoher Einzelziel- und Flächenschaden. Nützlich gegen große Mengen von Feinden. +block.mortarturret.fulldescription = Fortschrittlicher Flächen-Schaden Turm. Verwendet Kohle für Munition. Sehr langsame Feuerrate und Geschosse, aber sehr hoher Einzelziel- und Flächenschaden. Nützlich gegen grosse Mengen von Feinden. block.laserturret.name = Laserturm block.laserturret.fulldescription = Fortschrittlicher Einzelziel-Turm. Verwendet Strom. Guter Allround-Revolver für mittlere Reichweiten. Nur Einzelziel. Verfehlt nie. block.waveturret.name = Teslakanone @@ -472,8 +472,8 @@ block.waveturret.fulldescription = Erweiterter Mehrfach-Ziele-Turm. Verwendet St block.plasmaturret.name = Plasmageschütz block.plasmaturret.fulldescription = Hochentwickelte Version des Flammenwerfers. Verwendet Kohle als Munition. Sehr hoher Schaden, niedriger bis mittlerer Reichweite. block.chainturret.name = Kettengeschütz -block.chainturret.fulldescription = Die ultimative Schnellfeuer Waffe. Verwendet Uran als Munition. Schießt große Kugeln mit hoher Feuerrate. Mittlere Reichweite. Mehrere Felder groß. Hält extrem viel aus. +block.chainturret.fulldescription = Die ultimative Schnellfeuer Waffe. Verwendet Uran als Munition. Schiesst grosse Kugeln mit hoher Feuerrate. Mittlere Reichweite. Mehrere Felder gross. Hält extrem viel aus. block.titancannon.name = Titan Kanone -block.titancannon.fulldescription = Die ultimative Langstrecken Kanone. Verwendet Uran als Munition. Schießt große Flächen-Schadenden-Granaten mit einer mittleren Feuerrate ab. Lange Reichweite. Ist mehrere Felder groß. Hält extrem viel aus. +block.titancannon.fulldescription = Die ultimative Langstrecken Kanone. Verwendet Uran als Munition. Schiesst grosse Flächen-Schadenden-Granaten mit einer mittleren Feuerrate ab. Lange Reichweite. Ist mehrere Felder gross. Hält extrem viel aus. block.playerspawn.name = Spielerspawn block.enemyspawn.name = Gegnerspawn diff --git a/core/assets/version.properties b/core/assets/version.properties index 7fe28e0b4f..0013aa0d32 100644 --- a/core/assets/version.properties +++ b/core/assets/version.properties @@ -1,7 +1,7 @@ #Autogenerated file. Do not modify. -#Fri Feb 23 15:06:51 EST 2018 +#Fri Feb 23 21:37:45 EST 2018 version=release -androidBuildCode=267 +androidBuildCode=275 name=Mindustry code=3.3 -build=28 +build=custom build diff --git a/core/src/io/anuke/mindustry/core/NetClient.java b/core/src/io/anuke/mindustry/core/NetClient.java index 97d037ec44..13b9b687b1 100644 --- a/core/src/io/anuke/mindustry/core/NetClient.java +++ b/core/src/io/anuke/mindustry/core/NetClient.java @@ -329,12 +329,6 @@ public class NetClient extends Module { } } - //TODO remove. - public void test(){ - gotData = false; - connecting = true; - } - public boolean hasData(){ return gotData; } diff --git a/core/src/io/anuke/mindustry/entities/enemies/EnemyType.java b/core/src/io/anuke/mindustry/entities/enemies/EnemyType.java index bdf27ae16c..3fb7a182b3 100644 --- a/core/src/io/anuke/mindustry/entities/enemies/EnemyType.java +++ b/core/src/io/anuke/mindustry/entities/enemies/EnemyType.java @@ -17,6 +17,7 @@ import io.anuke.ucore.core.Graphics; import io.anuke.ucore.core.Timers; import io.anuke.ucore.entities.Entities; import io.anuke.ucore.graphics.Draw; +import io.anuke.ucore.graphics.Lines; import io.anuke.ucore.util.Mathf; import io.anuke.ucore.util.Strings; @@ -82,6 +83,12 @@ public class EnemyType { Graphics.flush(); + if(isCalculating(enemy)){ + Draw.color(Color.SKY); + Lines.polySeg(20, 0, 5, enemy.x, enemy.y, 11f, Timers.time() * 2f + enemy.id*52153f); + Draw.color(); + } + if(showPaths){ Draw.tscl(0.25f); Draw.text((int)enemy.idletime + " " + enemy.node + " " + enemy.id + "\n" + Strings.toFixed(enemy.totalMove.x, 2) + ", " @@ -157,6 +164,8 @@ public class EnemyType { Tile core = world.getCore(); + if(core == null) return; + if(enemy.idletime > maxIdleLife && enemy.node > 0){ enemy.onDeath(); return; @@ -190,7 +199,7 @@ public class EnemyType { }else if(dst < avoidRange){ calc.set((enemy.x - other.x), (enemy.y - other.y)).setLength(avoidSpeed); shift.add(calc.scl(1.1f)); - }else if(dst < attractRange && !nearCore){ + }else if(dst < attractRange && !nearCore && !isCalculating(enemy)){ calc.set((enemy.x - other.x), (enemy.y - other.y)).setLength(avoidSpeed); shift.add(calc.scl(-1)); } @@ -268,6 +277,10 @@ public class EnemyType { } } + public boolean isCalculating(Enemy enemy){ + return enemy.node < 0 && !Net.client(); + } + public static EnemyType getByID(byte id){ return types.get(id); } diff --git a/core/src/io/anuke/mindustry/net/Net.java b/core/src/io/anuke/mindustry/net/Net.java index 6473924085..5fe94ccade 100644 --- a/core/src/io/anuke/mindustry/net/Net.java +++ b/core/src/io/anuke/mindustry/net/Net.java @@ -210,7 +210,7 @@ public class Net{ } /**Pings a host in an new thread. If an error occured, failed() should be called with the exception. */ - public static void pingHost(String address, int port, Consumer valid, Consumer failed){ + public static void pingHost(String address, int port, Consumer valid, Consumer failed){ clientProvider.pingHost(address, port, valid, failed); } @@ -285,7 +285,7 @@ public class Net{ * Callback should be run on libGDX main thread.*/ void discover(Consumer> callback); /**Ping a host. If an error occured, failed() should be called with the exception. */ - void pingHost(String address, int port, Consumer valid, Consumer failed); + void pingHost(String address, int port, Consumer valid, Consumer failed); /**Close all connections.*/ void dispose(); } diff --git a/core/src/io/anuke/mindustry/ui/fragments/MenuFragment.java b/core/src/io/anuke/mindustry/ui/fragments/MenuFragment.java index 9dd218414c..c972b744d6 100644 --- a/core/src/io/anuke/mindustry/ui/fragments/MenuFragment.java +++ b/core/src/io/anuke/mindustry/ui/fragments/MenuFragment.java @@ -16,10 +16,10 @@ import static io.anuke.mindustry.Vars.*; public class MenuFragment implements Fragment{ public void build(){ - if(!android){ - //menu table - new table(){{ - + new table(){{ + visible(() -> state.is(State.menu)); + + if(!android){ new table(){{ PressGroup group = new PressGroup(); @@ -53,37 +53,32 @@ public class MenuFragment implements Fragment{ } get().margin(16); }}.end(); - - visible(() -> state.is(State.menu)); - }}.end(); - }else{ - new table(){{ - new table(){{ + + }else { + new table() {{ defaults().size(120f).pad(5); - float isize = 14f*4; - + float isize = 14f * 4; + new imagebutton("icon-play-2", isize, ui.levels::show).text("$text.play").padTop(4f); - + new imagebutton("icon-tutorial", isize, () -> control.playMap(world.maps().getMap("tutorial"))).text("$text.tutorial").padTop(4f); - + new imagebutton("icon-load", isize, ui.load::show).text("$text.load").padTop(4f); new imagebutton("icon-add", isize, ui.join::show).text("$text.joingame").padTop(4f); - + row(); new imagebutton("icon-editor", isize, ui.editor::show).text("$text.editor").padTop(4f); - + new imagebutton("icon-tools", isize, ui.settings::show).text("$text.settings").padTop(4f); new imagebutton("icon-info", isize, ui.about::show).text("$text.about.button").padTop(4f); new imagebutton("icon-donate", isize, Platform.instance::openDonations).text("$text.donate").padTop(4f); - - visible(() -> state.is(State.menu)); }}.end(); - }}.end(); - } + } + }}.end(); //extra icons in top right new table(){{ diff --git a/kryonet/src/io/anuke/kryonet/KryoClient.java b/kryonet/src/io/anuke/kryonet/KryoClient.java index 0940f4e517..4a946541f3 100644 --- a/kryonet/src/io/anuke/kryonet/KryoClient.java +++ b/kryonet/src/io/anuke/kryonet/KryoClient.java @@ -13,6 +13,7 @@ import io.anuke.mindustry.net.Net.SendMode; import io.anuke.mindustry.net.Packets.Connect; import io.anuke.mindustry.net.Packets.Disconnect; import io.anuke.ucore.function.Consumer; +import io.anuke.ucore.util.Strings; import java.io.IOException; import java.net.DatagramPacket; @@ -140,7 +141,7 @@ public class KryoClient implements ClientProvider{ } @Override - public void pingHost(String address, int port, Consumer valid, Consumer invalid){ + public void pingHost(String address, int port, Consumer valid, Consumer invalid){ runAsync(() -> { try { DatagramSocket socket = new DatagramSocket(); @@ -162,7 +163,7 @@ public class KryoClient implements ClientProvider{ } else { Gdx.app.postRunnable(() -> invalid.accept(new IOException("Outdated server."))); } - } catch (IOException e) { + } catch (Exception e) { Gdx.app.postRunnable(() -> invalid.accept(e)); } }); @@ -209,7 +210,7 @@ public class KryoClient implements ClientProvider{ if(e instanceof KryoNetException){ Gdx.app.postRunnable(() -> Net.showError("$text.server.mismatch")); }else{ - //TODO better exception handling. + Net.showError(Strings.parseException(e, true)); disconnect(); } } diff --git a/server/src/io/anuke/mindustry/server/ServerControl.java b/server/src/io/anuke/mindustry/server/ServerControl.java index ab51272464..6c54e11028 100644 --- a/server/src/io/anuke/mindustry/server/ServerControl.java +++ b/server/src/io/anuke/mindustry/server/ServerControl.java @@ -99,7 +99,7 @@ public class ServerControl extends Module { handler.register("help", "Displays this command list.", arg -> { info("Commands:"); for(Command command : handler.getCommandList()){ - print(" &y" + command.text + (command.params.isEmpty() ? "" : " ") + command.params + " - &lm" + command.description); + print(" &y" + command.text + (command.paramText.isEmpty() ? "" : " ") + command.paramText + " - &lm" + command.description); } }); @@ -184,7 +184,7 @@ public class ServerControl extends Module { } }); - handler.register("say", "", "Send a message to all players.", arg -> { + handler.register("say", "", "Send a message to all players.", arg -> { if(!state.is(State.playing)) { err("Not hosting. Host a game first."); return; @@ -192,7 +192,7 @@ public class ServerControl extends Module { netCommon.sendMessage("[GRAY][[Server]:[] " + arg[0]); info("&lyServer: &lb{0}", arg[0]); - }).mergeArgs(); + }); handler.register("difficulty", "", "Set game difficulty.", arg -> { try{ @@ -355,8 +355,10 @@ public class ServerControl extends Module { if (response.type == ResponseType.unknownCommand) { err("Invalid command. Type 'help' for help."); - } else if (response.type == ResponseType.invalidArguments) { - err("Invalid command arguments. Usage: " + response.command.text + " " + response.command.params); + }else if (response.type == ResponseType.fewArguments) { + err("Too few command arguments. Usage: " + response.command.text + " " + response.command.paramText); + }else if (response.type == ResponseType.manyArguments) { + err("Too many command arguments. Usage: " + response.command.text + " " + response.command.paramText); } }); }