Compare commits
41 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
999cc9c651 | ||
|
|
9537051590 | ||
|
|
827372633d | ||
|
|
dcf0b15b2c | ||
|
|
c93bc0e457 | ||
|
|
1460a15942 | ||
|
|
15a07a4a18 | ||
|
|
e07a203d56 | ||
|
|
cead92b2c7 | ||
|
|
8d4ab2d7fb | ||
|
|
9bd2057237 | ||
|
|
5ec5f1aa93 | ||
|
|
5e10c9d416 | ||
|
|
849943a0de | ||
|
|
b5abc23c9d | ||
|
|
c2b03a3fdc | ||
|
|
4e1d999838 | ||
|
|
4af971776f | ||
|
|
86d2788232 | ||
|
|
5654e3120d | ||
|
|
b4e7928622 | ||
|
|
25125f5a9b | ||
|
|
5d4b8a43e3 | ||
|
|
557cb1c532 | ||
|
|
5594395ac1 | ||
|
|
2a1ddf2573 | ||
|
|
fdb8da5767 | ||
|
|
738aa26a20 | ||
|
|
5e0ba2f4af | ||
|
|
91b2d1a9bf | ||
|
|
e636ceb317 | ||
|
|
2eeb230694 | ||
|
|
70cc6d07b0 | ||
|
|
4d5c2c83fd | ||
|
|
cf91bcbd49 | ||
|
|
dd6ae80817 | ||
|
|
58c1718d01 | ||
|
|
db76ffe46a | ||
|
|
a687aeb789 | ||
|
|
6ececea004 | ||
|
|
df418c5a7d |
@@ -2,8 +2,8 @@ credits.text = Entwickelt von [royal]Anuken[] - [sky]anukendev@gmail.com[]\n\n[g
|
|||||||
credits = Danksagungen
|
credits = Danksagungen
|
||||||
contributors = Übersetzer und Mitwirkende
|
contributors = Übersetzer und Mitwirkende
|
||||||
discord = Tritt dem Mindustry-Discord bei!
|
discord = Tritt dem Mindustry-Discord bei!
|
||||||
link.discord.description = Der offizielle Mindustry Discord Server
|
link.discord.description = Der offizielle Mindustry Discord-Server
|
||||||
link.reddit.description = Der Mindustry Subreddit
|
link.reddit.description = Mindustry-Subreddit
|
||||||
link.github.description = Quellcode des Spiels
|
link.github.description = Quellcode des Spiels
|
||||||
link.changelog.description = Liste der Änderungen
|
link.changelog.description = Liste der Änderungen
|
||||||
link.dev-builds.description = Entwicklungs-Builds (instabil)
|
link.dev-builds.description = Entwicklungs-Builds (instabil)
|
||||||
@@ -11,7 +11,7 @@ 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.itch.io.description = itch.io-Seite mit Downloads und der Web-Version des Spiels
|
||||||
link.google-play.description = Google Play Store-Seite
|
link.google-play.description = Google Play Store-Seite
|
||||||
link.f-droid.description = F-Droid-Seite
|
link.f-droid.description = F-Droid-Seite
|
||||||
link.wiki.description = Offizelles Mindustry-Wiki
|
link.wiki.description = Offizielles Mindustry-Wiki
|
||||||
link.suggestions.description = Neue Ideen einbringen
|
link.suggestions.description = Neue Ideen einbringen
|
||||||
linkfail = Fehler beim Öffnen des Links!\nDie URL wurde in die Zwischenablage kopiert.
|
linkfail = Fehler beim Öffnen des Links!\nDie URL wurde in die Zwischenablage kopiert.
|
||||||
screenshot = Screenshot gespeichert unter {0}
|
screenshot = Screenshot gespeichert unter {0}
|
||||||
@@ -23,7 +23,7 @@ gameover.waiting = [accent]Warte auf neue Karte...
|
|||||||
highscore = [accent]Neuer Highscore!
|
highscore = [accent]Neuer Highscore!
|
||||||
copied = Kopiert.
|
copied = Kopiert.
|
||||||
indev.notready = Dieser Teil vom Spiel ist noch unfertig.
|
indev.notready = Dieser Teil vom Spiel ist noch unfertig.
|
||||||
indev.campaign = [accent]Du hast das Ende der Kampagne erreicht![]\n\nMehr gibt es noch nicht. In einem zukünfttigen Update wird interplanetarisches Reisen möglich werden.
|
indev.campaign = [accent]Du hast das Ende der Kampagne erreicht![]\n\nMehr gibt es noch nicht. In einem zukünftigen Update wird interplanetarisches Reisen möglich werden.
|
||||||
|
|
||||||
load.sound = Audio
|
load.sound = Audio
|
||||||
load.map = Karten
|
load.map = Karten
|
||||||
@@ -101,9 +101,9 @@ uploadingcontent = Inhalt hochladen
|
|||||||
uploadingpreviewfile = Vorschaudatei hochladen
|
uploadingpreviewfile = Vorschaudatei hochladen
|
||||||
committingchanges = Veränderungen übernehmen
|
committingchanges = Veränderungen übernehmen
|
||||||
done = Fertig
|
done = Fertig
|
||||||
feature.unsupported = Dein System unsterstützt dieses Feature nicht.
|
feature.unsupported = Dein System unterstützt dieses Feature nicht.
|
||||||
|
|
||||||
mods.alphainfo = Vergiss nicht, dass Mods in der Alpha sind, und[scarlet] sehr fehlerhaft sein können[].\nMelde alle Probleme an den Mindustry GitHub oder Discord.
|
mods.alphainfo = Vergiss nicht, dass Mods in der Alpha sind und[scarlet] sehr fehlerhaft sein können[].\nMelde alle Probleme auf GitHub oder Discord.
|
||||||
mods = Mods
|
mods = Mods
|
||||||
mods.none = [lightgray]Keine Mods gefunden!
|
mods.none = [lightgray]Keine Mods gefunden!
|
||||||
mods.guide = Modding-Anleitung
|
mods.guide = Modding-Anleitung
|
||||||
@@ -131,13 +131,13 @@ mod.import = Mod importieren
|
|||||||
mod.import.file = Datei importieren
|
mod.import.file = Datei importieren
|
||||||
mod.import.github = GitHub-Mod importieren
|
mod.import.github = GitHub-Mod importieren
|
||||||
mod.jarwarn = [scarlet]JAR Mods sind nicht sicher.[]\nInstalliere nur Mods von vertrauenswürdigen Quellen!
|
mod.jarwarn = [scarlet]JAR Mods sind nicht sicher.[]\nInstalliere nur Mods von vertrauenswürdigen Quellen!
|
||||||
mod.item.remove = Dies ist Teil vom [accent] '{0}'[] Mod. Deaktivieren sie diesen Mod, um dies zu entfernen.
|
mod.item.remove = Dies ist Teil vom [accent] '{0}'[] Mod. Deaktivieren Sie diesen Mod, um dies zu entfernen.
|
||||||
mod.remove.confirm = Dieser Mod wird gelöscht.
|
mod.remove.confirm = Dieser Mod wird gelöscht.
|
||||||
mod.author = [lightgray]Autor:[] {0}
|
mod.author = [lightgray]Autor:[] {0}
|
||||||
mod.missing = Dieser Spielstand enthält Mods, welche nicht mehr vorhanden oder aktualisiert wurden. Spielstandfehler könnten passieren. Bist du dir sicher, das du ihn laden möchtest?\n[lightgray]Mods:\n{0}
|
mod.missing = Dieser Spielstand enthält Mods, welche nicht mehr vorhanden sind oder aktualisiert wurden. Spielstandfehler könnten passieren. Bist du dir sicher, dass du ihn laden möchtest?\n[lightgray]Mods:\n{0}
|
||||||
mod.preview.missing = Bevor du diesen Mod hochladen kannst, musst du eine Bildvorschau einbinden.\nLade ein Bild namens[accent] preview.png[] in den Modordner und versuche es nochmal.
|
mod.preview.missing = Bevor du diesen Mod hochladen kannst, musst du eine Bildvorschau einbinden.\nLade ein Bild namens[accent] preview.png[] in den Modordner und versuche es nochmal.
|
||||||
mod.folder.missing = Nur Mods in Ordnerform können in den Workshop hochgeladen werden.\nUm einen Mod in einen Ordner zu konvertieren, extrahiere das Archiv und lösche das alte Archiv danach. Starte dann das Spiel neu oder lade die Mods neu.
|
mod.folder.missing = Nur Mods in Ordnerform können in den Workshop hochgeladen werden.\nUm einen Mod in einen Ordner zu konvertieren, extrahiere das Archiv und lösche das alte Archiv danach. Starte dann das Spiel neu oder lade die Mods neu.
|
||||||
mod.scripts.disable = Ihr Gerät unterstüzt keine Mods mit Scripts. Du musst diese Mods deaktivieren, um spielen zu können.
|
mod.scripts.disable = Ihr Gerät unterstützt keine Mods mit Scripts. Du musst diese Mods deaktivieren, um spielen zu können.
|
||||||
|
|
||||||
about.button = Info
|
about.button = Info
|
||||||
name = Name:
|
name = Name:
|
||||||
@@ -146,7 +146,7 @@ planetmap = Planetenkarte
|
|||||||
launchcore = Kern starten
|
launchcore = Kern starten
|
||||||
filename = Dateiname:
|
filename = Dateiname:
|
||||||
unlocked = Neuer Inhalt freigeschaltet!
|
unlocked = Neuer Inhalt freigeschaltet!
|
||||||
available = Neue Forschung möchlich!
|
available = Neue Forschung möglich
|
||||||
completed = [accent]Abgeschlossen
|
completed = [accent]Abgeschlossen
|
||||||
techtree = Forschung
|
techtree = Forschung
|
||||||
research.legacy = [accent]5.0[] Forschungsdaten gefunden.\nMöchtest du [accent]diese Daten behalten[] oder [accent]sie löschen[] und neu anfangen (empfohlen)?
|
research.legacy = [accent]5.0[] Forschungsdaten gefunden.\nMöchtest du [accent]diese Daten behalten[] oder [accent]sie löschen[] und neu anfangen (empfohlen)?
|
||||||
@@ -170,7 +170,7 @@ server.kicked.serverOutdated = Veralteter Server! Bitte den Host um ein Update!
|
|||||||
server.kicked.banned = Du wurdest vom Server verbannt.
|
server.kicked.banned = Du wurdest vom Server verbannt.
|
||||||
server.kicked.typeMismatch = Dieser Server ist nicht mit deinem Buildtyp kompatibel.
|
server.kicked.typeMismatch = Dieser Server ist nicht mit deinem Buildtyp kompatibel.
|
||||||
server.kicked.playerLimit = Dieser Server ist voll. Warte auf einen freien Platz.
|
server.kicked.playerLimit = Dieser Server ist voll. Warte auf einen freien Platz.
|
||||||
server.kicked.recentKick = Du wurdest gerade gekickt.\nWarte bevor du dich wieder verbindest.
|
server.kicked.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.nameInUse = Es ist bereits ein Spieler \nmit diesem Namen auf dem Server.
|
||||||
server.kicked.nameEmpty = Dein Name muss mindestens 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.idInUse = Du bist bereits auf dem Server! Anmeldungen mit zwei Accounts sind nicht gestattet.
|
||||||
@@ -178,7 +178,7 @@ server.kicked.customClient = Der Server akzeptiert keine Custom Builds von Mindu
|
|||||||
server.kicked.gameover = Game Over!
|
server.kicked.gameover = Game Over!
|
||||||
server.kicked.serverRestarting = Der Server startet neu.
|
server.kicked.serverRestarting = Der Server startet neu.
|
||||||
server.versions = Deine Version:[accent] {0}[]\nServerversion:[accent] {1}[]
|
server.versions = Deine Version:[accent] {0}[]\nServerversion:[accent] {1}[]
|
||||||
host.info = Der [accent]Server hosten[]-Knopf startet einen Server auf den Ports [scarlet]6567[] und [scarlet]6568.[]\nJeder im gleichen [lightgray]W-Lan oder lokalen Netzwerk[] sollte deinen Server in seiner Serverliste sehen können.\n\nWenn du anderen die Verbindung über deine IP-Adresse ermöglichen willst, musst du [accent]Port-Forwarding[] durchführen.\n\n[lightgray]Hinweis: Falls es Probleme mit der Verbindung im Netzwerk gibt, stelle sicher, dass Mindustry in deinen Firewall-Einstellungen Zugriff auf das lokale Netzwerk hat.
|
host.info = Der [accent]'Server hosten'[]-Knopf startet einen Server auf den Ports [scarlet]6567[] und [scarlet]6568.[]\nJeder im gleichen [lightgray]W-Lan oder lokalen Netzwerk[] sollte deinen Server in seiner Serverliste sehen können.\n\nWenn du anderen die Verbindung über deine IP-Adresse ermöglichen willst, musst du [accent]Port-Forwarding[] durchführen.\n\n[lightgray]Hinweis: Falls es Probleme mit der Verbindung im Netzwerk gibt, stelle sicher, dass Mindustry in deinen Firewall-Einstellungen Zugriff auf das lokale Netzwerk hat.
|
||||||
join.info = Hier kannst du eine [accent]Server-IP[] eingeben, um dich zu verbinden, oder Server im [accent]lokalen Netzwerk[] entdecken und dich mit ihnen verbinden.\nSowohl Spielen über das lokale Netzwerk als auch Spielen über das Internet werden unterstützt.\n\n[lightgray]Hinweis: Es gibt keine globale Serverliste; wenn du dich mit jemandem per IP-Adresse verbinden willst, musst du den Host nach seiner IP-Adresse fragen.
|
join.info = Hier kannst du eine [accent]Server-IP[] eingeben, um dich zu verbinden, oder Server im [accent]lokalen Netzwerk[] entdecken und dich mit ihnen verbinden.\nSowohl Spielen über das lokale Netzwerk als auch Spielen über das Internet werden unterstützt.\n\n[lightgray]Hinweis: Es gibt keine globale Serverliste; wenn du dich mit jemandem per IP-Adresse verbinden willst, musst du den Host nach seiner IP-Adresse fragen.
|
||||||
hostserver = Mehrspieler hosten
|
hostserver = Mehrspieler hosten
|
||||||
invitefriends = Freunde einladen
|
invitefriends = Freunde einladen
|
||||||
@@ -196,8 +196,9 @@ servers.local = Lokale Server
|
|||||||
servers.remote = Andere Server
|
servers.remote = Andere Server
|
||||||
servers.global = Community-Server
|
servers.global = Community-Server
|
||||||
|
|
||||||
|
servers.disclaimer = Community-Server werden vom Entwickler [accent]nicht[] geprüft.\n\Sie können Inhalte, die nicht für jedes Alter geeignet sind, enthalten.
|
||||||
servers.showhidden = Versteckte Server anzeigen
|
servers.showhidden = Versteckte Server anzeigen
|
||||||
server.shown = Angeziegt
|
server.shown = Angezeigt
|
||||||
server.hidden = Versteckt
|
server.hidden = Versteckt
|
||||||
|
|
||||||
trace = Spieler verfolgen
|
trace = Spieler verfolgen
|
||||||
@@ -287,7 +288,7 @@ data.import = Daten importieren
|
|||||||
data.openfolder = Datenordner öffnen
|
data.openfolder = Datenordner öffnen
|
||||||
data.exported = Daten exportiert.
|
data.exported = Daten exportiert.
|
||||||
data.invalid = Dies sind keine gültigen Spieldaten.
|
data.invalid = Dies sind keine gültigen Spieldaten.
|
||||||
data.import.confirm = Der Import von externen Daten wird [scarlet] alle[] deine gegenwärtigen Spieldaten löschen.\n[accent]Das kann nicht rückgängig gemacht werden![]Sobald der Import abeschlossen ist, wird dein Spiel sofort beendet.
|
data.import.confirm = Der Import von externen Daten wird [scarlet] alle[] deine gegenwärtigen Spieldaten löschen.\n[accent]Das kann nicht rückgängig gemacht werden![]\n\nSobald der Import abgeschlossen ist, wird dein Spiel sofort beendet.
|
||||||
quit.confirm = Willst du wirklich aufhören?
|
quit.confirm = Willst du wirklich aufhören?
|
||||||
quit.confirm.tutorial = Weißt du, was du tust?\nDu kannst das Tutorial unter[accent] Einstellungen->Spiel->Tutorial wiederholen[] erneut spielen.
|
quit.confirm.tutorial = Weißt du, was du tust?\nDu kannst das Tutorial unter[accent] Einstellungen->Spiel->Tutorial wiederholen[] erneut spielen.
|
||||||
loading = [accent]Wird geladen...
|
loading = [accent]Wird geladen...
|
||||||
@@ -298,7 +299,7 @@ cancelbuilding = [accent][[{0}][] um den Plan zu leeren
|
|||||||
selectschematic = [accent][[{0}][] zum Auswählen+Kopieren
|
selectschematic = [accent][[{0}][] zum Auswählen+Kopieren
|
||||||
pausebuilding = [accent][[{0}][] um das Bauen zu pausieren
|
pausebuilding = [accent][[{0}][] um das Bauen zu pausieren
|
||||||
resumebuilding = [scarlet][[{0}][] um das Bauen fortzusetzen
|
resumebuilding = [scarlet][[{0}][] um das Bauen fortzusetzen
|
||||||
showui = Bedienflächen versteckt.\nDrücke [accent][[{0}][] um sie wieder anzuzeigen.
|
showui = Bedienflächen versteckt.\nDrücke [accent][[{0}][], um sie wieder anzuzeigen.
|
||||||
wave = [accent]Welle {0}
|
wave = [accent]Welle {0}
|
||||||
wave.cap = [accent]Welle {0}/{1}
|
wave.cap = [accent]Welle {0}/{1}
|
||||||
wave.waiting = Welle in {0}
|
wave.waiting = Welle in {0}
|
||||||
@@ -316,11 +317,11 @@ saveimage = Bild speichern
|
|||||||
unknown = Unbekannt
|
unknown = Unbekannt
|
||||||
custom = Benutzerdefiniert
|
custom = Benutzerdefiniert
|
||||||
builtin = Enthalten
|
builtin = Enthalten
|
||||||
map.delete.confirm = Bist du sicher, dass du diese Karte löschen willst? Dies kann nicht rückgänig gemacht werden!
|
map.delete.confirm = Bist du sicher, dass du diese Karte löschen willst? Dies kann nicht rückgängig gemacht werden!
|
||||||
map.random = [accent]Zufällige Karte
|
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 = Diese Karte hat keine Kerne, in denen die Spieler beginnen können! Füge einen [royal]orangen[] Kern zu dieser Karte im Editor hinzu.
|
||||||
map.nospawn.pvp = Diese Karte hat keine gegnerischen Kerne in denen Gegner starten können! Füge über den Editor [scarlet] rote[] Kerne zu dieser Karte hinzu.
|
map.nospawn.pvp = Diese Karte hat keine Kerne für die gegnerischen Spieler! Füge über den Editor [scarlet] nicht-orange[] Kerne zu dieser Karte hinzu.
|
||||||
map.nospawn.attack = Diese Karte hat keine gengnerischen Kerne, die Spieler angreifen können! Füge über den Editor [scarlet] rote[] Kerne zu dieser Karte hinzu.
|
map.nospawn.attack = Diese Karte hat keine gegnerischen 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ädigte oder ungültige Kartendatei.
|
map.invalid = Fehler beim Laden der Karte: Beschädigte oder ungültige Kartendatei.
|
||||||
workshop.update = Objekt aktualisieren
|
workshop.update = Objekt aktualisieren
|
||||||
workshop.error = Fehler beim Laden von Workshop-Details: {0}
|
workshop.error = Fehler beim Laden von Workshop-Details: {0}
|
||||||
@@ -333,7 +334,7 @@ missing = Dieses Objekt wurde gelöscht oder verschoben.\n[lightgray]Die Worksho
|
|||||||
publishing = [accent]Veröffentlichen...
|
publishing = [accent]Veröffentlichen...
|
||||||
publish.confirm = Willst du das wirklich veröffentlichen?\n\n[lightgray]Vergewissere dich, dass du der Workshop-EULA zugestimmt hast, sonst tauchen deine Objekte nicht auf!
|
publish.confirm = Willst du das wirklich veröffentlichen?\n\n[lightgray]Vergewissere dich, dass du der Workshop-EULA zugestimmt hast, sonst tauchen deine Objekte nicht auf!
|
||||||
publish.error = Fehler beim Veröffentlichen des Objekts: {0}
|
publish.error = Fehler beim Veröffentlichen des Objekts: {0}
|
||||||
steam.error = Fehler beim laden der Steam-Dienste.\nError: {0}
|
steam.error = Fehler beim Laden der Steam-Dienste.\nError: {0}
|
||||||
|
|
||||||
editor.brush = Pinsel
|
editor.brush = Pinsel
|
||||||
editor.openin = Öffne im Editor
|
editor.openin = Öffne im Editor
|
||||||
@@ -342,11 +343,11 @@ editor.oregen.info = Erze generiert:
|
|||||||
editor.mapinfo = Karten-Info
|
editor.mapinfo = Karten-Info
|
||||||
editor.author = Autor:
|
editor.author = Autor:
|
||||||
editor.description = Beschreibung:
|
editor.description = Beschreibung:
|
||||||
editor.nodescription = Eine Karte benötigt eine Beschreibung mit mindestens 4 Buchstaben, bevor sie veröffentlich werden kann.
|
editor.nodescription = Eine Karte benötigt eine Beschreibung mit mindestens 4 Buchstaben, bevor sie veröffentlicht werden kann.
|
||||||
editor.waves = Wellen:
|
editor.waves = Wellen:
|
||||||
editor.rules = Regeln:
|
editor.rules = Regeln:
|
||||||
editor.generation = Generator:
|
editor.generation = Generator:
|
||||||
editor.ingame = Im Spiel Bearbeiten
|
editor.ingame = Im Spiel bearbeiten
|
||||||
editor.publish.workshop = Im Workshop veröffentlichen
|
editor.publish.workshop = Im Workshop veröffentlichen
|
||||||
editor.newmap = Neue Karte
|
editor.newmap = Neue Karte
|
||||||
editor.center = Zur Mitte
|
editor.center = Zur Mitte
|
||||||
@@ -382,7 +383,7 @@ editor.removeunit = Bereich entfernen
|
|||||||
editor.teams = Teams
|
editor.teams = Teams
|
||||||
editor.errorload = Fehler beim Laden der Datei:\n[accent]{0}
|
editor.errorload = Fehler beim Laden der Datei:\n[accent]{0}
|
||||||
editor.errorsave = Fehler beim Speichern der Datei:\n[accent]{0}
|
editor.errorsave = Fehler beim Speichern der Datei:\n[accent]{0}
|
||||||
editor.errorimage = Das ist ein Bild, keine Karte. Wechsle nicht den Dateityp und erwarte, dass es funktioniert.\n\nWenn du eine 3.5/build 40-Karte importieren möchtest, benutze den 'Importiere Terrainbild' Knopf im Editor.
|
editor.errorimage = Das ist ein Bild, keine Karte. Wechsle nicht den Dateityp und erwarte, dass es funktioniert.\n\nWenn du eine 'v3.5/build 40'-Karte importieren möchtest, benutze den 'Importiere Terrainbild'-Knopf im Editor.
|
||||||
editor.errorlegacy = Diese Karte ist zu alt und benutzt ein veraltetes Kartenformat, das nicht mehr unterstützt wird.
|
editor.errorlegacy = Diese Karte ist zu alt und benutzt ein veraltetes Kartenformat, das nicht mehr unterstützt wird.
|
||||||
editor.errornot = Dies ist keine Kartendatei.
|
editor.errornot = Dies ist keine Kartendatei.
|
||||||
editor.errorheader = Diese Karte ist entweder nicht gültig oder beschädigt.
|
editor.errorheader = Diese Karte ist entweder nicht gültig oder beschädigt.
|
||||||
@@ -395,9 +396,9 @@ editor.resize = Größe\nanpassen
|
|||||||
editor.loadmap = Karte\nladen
|
editor.loadmap = Karte\nladen
|
||||||
editor.savemap = Karte\nspeichern
|
editor.savemap = Karte\nspeichern
|
||||||
editor.saved = Gespeichert!
|
editor.saved = Gespeichert!
|
||||||
editor.save.noname = Deine Karte hat keinen Namen! Setze einen Namen im [accent]Karten Info[] Menu.
|
editor.save.noname = Deine Karte hat keinen Namen! Setze einen Namen im [accent]Karten-Info[]-Menü.
|
||||||
editor.save.overwrite = Deine Karte überschreibt eine built-in Karte! Wähle einen anderen Karten Namen im [accent]'Karten info'[] Menu.
|
editor.save.overwrite = Deine Karte überschreibt eine Standardkarte! Wähle einen anderen Karten Namen im [accent]Karten-Info[]-Menü.
|
||||||
editor.import.exists = [scarlet]Fehler beim Import:[] Ein built-in Karte namens '{0}' existiert bereits!
|
editor.import.exists = [scarlet]Fehler beim Import:[] Ein Standardkarte namens '{0}' existiert bereits!
|
||||||
editor.import = Importieren...
|
editor.import = Importieren...
|
||||||
editor.importmap = Importiere Karte
|
editor.importmap = Importiere Karte
|
||||||
editor.importmap.description = Importiere von einer bestehenden Karte
|
editor.importmap.description = Importiere von einer bestehenden Karte
|
||||||
@@ -432,7 +433,7 @@ toolmode.eraseores = Erze löschen
|
|||||||
toolmode.eraseores.description = Löscht nur Erze.
|
toolmode.eraseores.description = Löscht nur Erze.
|
||||||
toolmode.fillteams = Teams ausfüllen
|
toolmode.fillteams = Teams ausfüllen
|
||||||
toolmode.fillteams.description = Füllt Teams aus statt Blöcke.
|
toolmode.fillteams.description = Füllt Teams aus statt Blöcke.
|
||||||
toolmode.drawteams = Teams Zeichnen
|
toolmode.drawteams = Teams zeichnen
|
||||||
toolmode.drawteams.description = Zeichnet Teams statt Blöcke.
|
toolmode.drawteams.description = Zeichnet Teams statt Blöcke.
|
||||||
|
|
||||||
filters.empty = [lightgray]Keine Filter! Füge einen mit dem unteren Knopf hinzu.
|
filters.empty = [lightgray]Keine Filter! Füge einen mit dem unteren Knopf hinzu.
|
||||||
@@ -463,7 +464,7 @@ filter.option.angle = Winkel
|
|||||||
filter.option.amount = Menge
|
filter.option.amount = Menge
|
||||||
filter.option.block = Block
|
filter.option.block = Block
|
||||||
filter.option.floor = Boden
|
filter.option.floor = Boden
|
||||||
filter.option.flooronto = Ziel Boden
|
filter.option.flooronto = Zielboden
|
||||||
filter.option.target = Ziel
|
filter.option.target = Ziel
|
||||||
filter.option.wall = Wand
|
filter.option.wall = Wand
|
||||||
filter.option.ore = Erz
|
filter.option.ore = Erz
|
||||||
@@ -542,12 +543,12 @@ sectors.wave = Welle:
|
|||||||
sectors.stored = Gelagert:
|
sectors.stored = Gelagert:
|
||||||
sectors.resume = Weiterspielen
|
sectors.resume = Weiterspielen
|
||||||
sectors.launch = Start
|
sectors.launch = Start
|
||||||
sectors.select = Select
|
sectors.select = Auswählen
|
||||||
sectors.nonelaunch = [lightgray]none (sun)
|
sectors.nonelaunch = [lightgray]none (sun)
|
||||||
sectors.rename = Sektor umbenennen
|
sectors.rename = Sektor umbenennen
|
||||||
sectors.enemybase = [scarlet]Gegnerische Basis
|
sectors.enemybase = [scarlet]Gegnerische Basis
|
||||||
sectors.vulnerable = [scarlet]Angriffsgefährdet
|
sectors.vulnerable = [scarlet]Angriffsgefährdet
|
||||||
sectors.underattack = [scarlet]Wird angegriffen! [accent]{0}% damaged
|
sectors.underattack = [scarlet]Wird angegriffen! [accent]{0}% geschädigt
|
||||||
sectors.survives = [accent]Kann {0} Wellen überleben
|
sectors.survives = [accent]Kann {0} Wellen überleben
|
||||||
sectors.go = Hingehen
|
sectors.go = Hingehen
|
||||||
sector.curcapture = Sektor erfolgreich erobert
|
sector.curcapture = Sektor erfolgreich erobert
|
||||||
@@ -586,21 +587,21 @@ sector.windsweptIslands.name = Windswept Islands
|
|||||||
sector.extractionOutpost.name = Extraction Outpost
|
sector.extractionOutpost.name = Extraction Outpost
|
||||||
sector.planetaryTerminal.name = Planetary Launch Terminal
|
sector.planetaryTerminal.name = Planetary Launch Terminal
|
||||||
|
|
||||||
sector.groundZero.description = Der optimale Ort um anzufangen. Schwache Gegner und weniger Ressourcen.\nSammele so viel Kupfer und Blei wie möglich.\nGeh weiter.
|
sector.groundZero.description = Der optimale Ort, um anzufangen. Schwache Gegner und weniger Ressourcen.\nSammele so viel Kupfer und Blei wie möglich.\nGeh weiter.
|
||||||
sector.frozenForest.description = Auch hier, näher an den Bergen, sind die Sporen. Sogar die niedrigen Temperaturen können sie nicht zurückhalten.\n\nLerne, Strom zu verwenden. Baue Verbrennungsgeneratoren und Reparateure.
|
sector.frozenForest.description = Auch hier, näher an den Bergen, sind die Sporen. Sogar die niedrigen Temperaturen können sie nicht zurückhalten.\n\nLerne, Strom zu verwenden. Baue Verbrennungsgeneratoren und Reparateure.
|
||||||
sector.saltFlats.description = Du befindest dich in der Nähe der Wüste. Hier gibt es nur wenige Ressourcen.\n\nDer Gegner hat hier ein Lager aufgestellt. Zerstöre es. Lasse nichts stehen.
|
sector.saltFlats.description = Du befindest dich in der Nähe der Wüste. Hier gibt es nur wenige Ressourcen.\n\nDer Gegner hat hier ein Lager aufgestellt. Zerstöre es. Lasse nichts stehen.
|
||||||
sector.craters.description = Wasser hat sich hier, in diesem Überbleibsel aus dem alten Krieg, versammelt. Sammele Sand. Stelle Metaglas her. Benutze Wasser, um Bohrer und Geschütze zu kühlen.
|
sector.craters.description = Wasser hat sich hier, in diesem Überbleibsel aus dem alten Krieg, versammelt. Sammele Sand. Stelle Metaglas her. Benutze Wasser, um Bohrer und Geschütze zu kühlen.
|
||||||
sector.ruinousShores.description = Hinter der Wüste ist das Ufer. Es gab hier vor langer Zeit ein Uferabwehrsystem. Heute sind nur noch die einfachsten Abwehrgeschütze vorhanden, der Rest wurde verschrottet.\nBreite dich weiter aus. Finde die verlorenen Technologien wieder.
|
sector.ruinousShores.description = Hinter der Wüste ist das Ufer. Es gab hier vor langer Zeit ein Uferabwehrsystem. Heute sind nur noch die einfachsten Abwehrgeschütze vorhanden, der Rest wurde verschrottet.\nBreite dich weiter aus. Finde die verlorenen Technologien wieder.
|
||||||
sector.stainedMountains.description = Im Landesinneren sind die Berge, noch unversehrt von den Sporen.\nNutze das reichliche vorhandene Titan und lerne, es zu benutzen.\n\nDie Gegner hier sind stärker. Gib ihnen keine Zeit, um ihre stärksten Einheiten zu schicken.
|
sector.stainedMountains.description = Im Landesinneren sind die Berge, noch unversehrt von den Sporen.\nNutze das reichliche vorhandene Titan und lerne, es zu benutzen.\n\nDie Gegner hier sind stärker. Gib ihnen keine Zeit, um ihre stärksten Einheiten zu schicken.
|
||||||
sector.overgrowth.description = Dieser Bereich ist überwuchert, näher an die Quelle der Sporen.\nDer Gegner hat hier einen Außenposten errichtet. Baue Mace-Einheiten. Zerstöre ihn.
|
sector.overgrowth.description = Dieser Bereich ist überwuchert, näher an die Quelle der Sporen.\nDer Gegner hat hier einen Außenposten errichtet. Baue Mace-Einheiten. Zerstöre ihn.
|
||||||
sector.tarFields.description = Der Rand einer Ölproduktionszone, swischen den Bergen und der Wüste. Einer der wenigen Orte mit brauchbaren Ölquellen.\nObwohl er vergessen wurde, hat dieser Ort mächtige Gegnerische Lager in der Nähe. Unterschätze sie nicht.\n\n[lightgray]Erforsche, falls mögloch, die Ölverarbeitung.
|
sector.tarFields.description = Der Rand einer Ölproduktionszone, zwischen den Bergen und der Wüste. Einer der wenigen Orte mit brauchbaren Ölquellen.\nObwohl er vergessen wurde, hat dieser Ort mächtige gegnerische Lager in der Nähe. Unterschätze sie nicht.\n\n[lightgray]Erforsche, falls möglich, die Ölverarbeitung.
|
||||||
sector.desolateRift.description = Eine besonders gefährliche Zone. Viele Ressourcen aber wenig Platz. Hohe Wahrscheinlichkeit, vernichtet zu werden. Verlasse diesen Ort so bald wie möglich. Lass dich nicht durch die langen Abstände zwischen gegnerischen Angriffen täuschen.
|
sector.desolateRift.description = Eine besonders gefährliche Zone. Viele Ressourcen aber wenig Platz. Hohe Wahrscheinlichkeit, vernichtet zu werden. Verlasse diesen Ort so bald wie möglich. Lass dich nicht durch die langen Abstände zwischen gegnerischen Angriffen täuschen.
|
||||||
sector.nuclearComplex.description = Diese Ruine war vor langer Zeit eine Anlage zur Verarbeitung von Thorium.\n[lightgray]Erforsche Thorium und dessen Anwendungen.\n\nDer Gegner ist hier stark vertreten, auf der Suche nach Angreifern.
|
sector.nuclearComplex.description = Diese Ruine war vor langer Zeit eine Anlage zur Verarbeitung von Thorium.\n[lightgray]Erforsche Thorium und dessen Anwendungen.\n\nDer Gegner ist hier stark vertreten und hält nach Angreifern Ausschau.
|
||||||
sector.fungalPass.description = Eine Übergangszone zwischen den Bergen und den niedrigeren, Sporen-Infestierten Gebieten. Hier ist eine kleine gegnerische Basis.\nZerstöre sie.\nBenutze Dagger- und Crawler-Einheiten. Vernichte die beiden Kerne.
|
sector.fungalPass.description = Eine Übergangszone zwischen den Bergen und den niedrigeren, von Sporen befallenen Gebieten. Hier ist eine kleine gegnerische Basis.\nZerstöre sie.\nBenutze Dagger- und Crawler-Einheiten. Vernichte die beiden Kerne.
|
||||||
sector.biomassFacility.description = Die Sporenquelle. Dies ist der Ort, wo sie erforscht und hergestellt wurden.\nErforsche die Technologie, die sich hier versteckt. Stellen Sporen her, um Plastanium und Öl herzustellen.\n\n[lightgray]Als diese Anlage zerstört wurde, wurden die Sporen freigesetzt. Nichts im lokalen Ökosystem konnte so ein eindringliches Lebenwesen bekämpfen.
|
sector.biomassFacility.description = Die Sporenquelle. Dies ist der Ort, wo sie erforscht und hergestellt wurden.\nErforsche die Technologie, die sich hier versteckt. Stellen Sporen her, um Plastanium und Öl herzustellen.\n\n[lightgray]Als diese Anlage zerstört wurde, wurden die Sporen freigesetzt. Nichts im lokalen Ökosystem konnte so ein eindringliches Lebewesen bekämpfen.
|
||||||
sector.windsweptIslands.description = Diese Inseln befinden sich in der Nähe vom Ufer. Manche Aufzeichnungen behaupten, hier seien Fabriken, die [accent]Plastanium[] herstellen können.\n\nWehre dich gegen die gegnerischen Wassereinheiten. Stelle eine Basis auf den Inseln auf. Erforsche diese Fabriken.
|
sector.windsweptIslands.description = Diese Inseln befinden sich in der Nähe vom Ufer. Manche Aufzeichnungen behaupten, hier seien Fabriken, die [accent]Plastanium[] herstellen können.\n\nWehre dich gegen die gegnerischen Wassereinheiten. Stelle eine Basis auf den Inseln auf. Erforsche diese Fabriken.
|
||||||
sector.extractionOutpost.description = Ein Außenposten, der vom Gegner erstellt wurde, um Ressourcen in andere Sektoren zu transportieren.\n\nTrans-Sektorischer Transport ist nötig, um weiter voranzuschreiten. Zerstöre den Posten. Erforsche deren Launchpads.
|
sector.extractionOutpost.description = Ein Außenposten, der vom Gegner erstellt wurde, um Ressourcen in andere Sektoren zu transportieren.\n\nTrans-Sektorischer Transport ist nötig, um weiter voranzuschreiten. Zerstöre den Posten. Erforsche deren Launchpads.
|
||||||
sector.impact0078.description = Here liegen Reste der interplanetarischen Transporteinheit, die dieses Sonnensystem zuerst betreten hat.\n\nRette so viel wie möglich von den Ruinen. Erforsche jede intakte Technologie.
|
sector.impact0078.description = Hier liegen Reste der interplanetarischen Transporteinheit, die dieses Sonnensystem zuerst betreten hat.\n\nRette so viel wie möglich von den Ruinen. Erforsche jede intakte Technologie.
|
||||||
sector.planetaryTerminal.description = Das Endziel.\n\nDiese Uferbasis besitzt ein Gerät, mit dem es möglich ist, Kerne auf andere Planeten zu schicken. Es ist [accent]sehr[] gut beschützt.\n\nStelle Wassereinheiten her. Eliminiere den Gegner so schnell wie möglich. Erforsche das Launchgerät.
|
sector.planetaryTerminal.description = Das Endziel.\n\nDiese Uferbasis besitzt ein Gerät, mit dem es möglich ist, Kerne auf andere Planeten zu schicken. Es ist [accent]sehr[] gut beschützt.\n\nStelle Wassereinheiten her. Eliminiere den Gegner so schnell wie möglich. Erforsche das Launchgerät.
|
||||||
settings.language = Sprache
|
settings.language = Sprache
|
||||||
settings.data = Spieldaten
|
settings.data = Spieldaten
|
||||||
@@ -623,7 +624,6 @@ settings.clearcampaignsaves.confirm = Möchtest du wirklich alle Kampagne-Speich
|
|||||||
paused = [accent]< Pausiert >
|
paused = [accent]< Pausiert >
|
||||||
clear = Leeren
|
clear = Leeren
|
||||||
banned = [scarlet]Verbannt
|
banned = [scarlet]Verbannt
|
||||||
unplaceable.sectorcaptured = [scarlet]Erfordert erforderter Sektor
|
|
||||||
yes = Ja
|
yes = Ja
|
||||||
no = Nein
|
no = Nein
|
||||||
info.title = Info
|
info.title = Info
|
||||||
@@ -692,7 +692,7 @@ stat.speed = Geschwindigkeit
|
|||||||
stat.buildspeed = Baugeschwindigkeit
|
stat.buildspeed = Baugeschwindigkeit
|
||||||
stat.minespeed = Abbaugeschwindigkeit
|
stat.minespeed = Abbaugeschwindigkeit
|
||||||
stat.minetier = Abbau-Kraft
|
stat.minetier = Abbau-Kraft
|
||||||
stat.payloadcapacity = Payload Capacity
|
stat.payloadcapacity = Einheitenkapazität
|
||||||
stat.commandlimit = Kommandier-Limit
|
stat.commandlimit = Kommandier-Limit
|
||||||
stat.abilities = Fähigkeiten
|
stat.abilities = Fähigkeiten
|
||||||
stat.canboost = Kann boosten
|
stat.canboost = Kann boosten
|
||||||
@@ -705,7 +705,7 @@ ability.unitspawn = {0} Fabrik
|
|||||||
ability.shieldregenfield = Schild-regenerations-Feld
|
ability.shieldregenfield = Schild-regenerations-Feld
|
||||||
ability.movelightning = Bewegungsblitze
|
ability.movelightning = Bewegungsblitze
|
||||||
|
|
||||||
bar.drilltierreq = Besserer Bohrer Benötigt
|
bar.drilltierreq = Besserer Bohrer benötigt
|
||||||
bar.noresources = Fehlende Ressourcen
|
bar.noresources = Fehlende Ressourcen
|
||||||
bar.corereq = Kern-Basis erforderlich
|
bar.corereq = Kern-Basis erforderlich
|
||||||
bar.drillspeed = Bohrgeschwindigkeit: {0}/s
|
bar.drillspeed = Bohrgeschwindigkeit: {0}/s
|
||||||
@@ -777,7 +777,7 @@ setting.shadows.name = Schatten
|
|||||||
setting.blockreplace.name = Automatische Blockvorschläge
|
setting.blockreplace.name = Automatische Blockvorschläge
|
||||||
setting.linear.name = Lineare Filterung
|
setting.linear.name = Lineare Filterung
|
||||||
setting.hints.name = Tipps
|
setting.hints.name = Tipps
|
||||||
setting.flow.name = Ressourcen-Fluss anzeigen [scarlet] (experimentell)
|
setting.flow.name = Ressourcen-Fluss anzeigen
|
||||||
setting.backgroundpause.name = Im Hintergrund pausieren
|
setting.backgroundpause.name = Im Hintergrund pausieren
|
||||||
setting.buildautopause.name = Bauen automatisch pausieren
|
setting.buildautopause.name = Bauen automatisch pausieren
|
||||||
setting.animatedwater.name = Animiertes Wasser
|
setting.animatedwater.name = Animiertes Wasser
|
||||||
@@ -786,7 +786,7 @@ setting.antialias.name = Antialias[lightgray] (Neustart erforderlich)[]
|
|||||||
setting.playerindicators.name = Spieler-Indikatoren
|
setting.playerindicators.name = Spieler-Indikatoren
|
||||||
setting.indicators.name = Verbündeten-Indikatoren
|
setting.indicators.name = Verbündeten-Indikatoren
|
||||||
setting.autotarget.name = Auto-Zielauswahl
|
setting.autotarget.name = Auto-Zielauswahl
|
||||||
setting.keyboard.name = Maus+Tastatur Steuerung
|
setting.keyboard.name = Maus+Tastatur-Steuerung
|
||||||
setting.touchscreen.name = Touchscreen-Steuerung
|
setting.touchscreen.name = Touchscreen-Steuerung
|
||||||
setting.fpscap.name = Max. FPS
|
setting.fpscap.name = Max. FPS
|
||||||
setting.fpscap.none = Kein(e)
|
setting.fpscap.none = Kein(e)
|
||||||
@@ -831,13 +831,13 @@ setting.chatopacity.name = Chat-Deckkraft
|
|||||||
setting.lasersopacity.name = Power-Laser-Deckkraft
|
setting.lasersopacity.name = Power-Laser-Deckkraft
|
||||||
setting.bridgeopacity.name = Brücken-Deckkraft
|
setting.bridgeopacity.name = Brücken-Deckkraft
|
||||||
setting.playerchat.name = Chat im Spiel anzeigen
|
setting.playerchat.name = Chat im Spiel anzeigen
|
||||||
public.confirm = Willst du dein Spiel öffentlich zugänglich machen?\n[accent]Jeder kann deinem Spiel beitreten.\n[lightgray]Dies kann später in den Einstellung->Spielt->Öffentliches Spiel geändert werden.
|
public.confirm = Willst du dein Spiel öffentlich zugänglich machen?\n[accent]Jeder kann deinem Spiel beitreten.\n[lightgray]Dies kann später in den Einstellungen->Spiel->Öffentliches Spiel geändert werden.
|
||||||
public.beta = Bemerke: Beta-Versionen des Spiels können keine öffentlichen Spiele machen.
|
public.beta = Bemerke: Beta-Versionen des Spiels können keine öffentlichen Spiele machen.
|
||||||
uiscale.reset = UI-Skalierung wurde geändert.\nDrücke "OK", um diese Skalierung zu bestätigen.\n[scarlet]Zurückkehren und Beenden in[accent] {0}[] Einstellungen...
|
uiscale.reset = UI-Skalierung wurde geändert.\nDrücke "OK", um diese Skalierung zu bestätigen.\n[scarlet]Zurückkehren und Beenden in[accent] {0}[] Einstellungen...
|
||||||
uiscale.cancel = Abbrechen & Beenden
|
uiscale.cancel = Abbrechen & Beenden
|
||||||
setting.bloom.name = Bloom
|
setting.bloom.name = Bloom
|
||||||
keybind.title = Tasten zuweisen
|
keybind.title = Tasten zuweisen
|
||||||
keybinds.mobile = [scarlet]Die meisten Tastenzuweisungen hier funktionieren auf z.B. mobilen Geräten nicht. Nur grundlegende Bewegung wird unterstützt.
|
keybinds.mobile = [scarlet]Die meisten Tastenzuweisungen hier funktionieren auf mobilen Geräten nicht. Nur grundlegende Bewegung wird unterstützt.
|
||||||
category.general.name = Allgemein
|
category.general.name = Allgemein
|
||||||
category.view.name = Ansicht
|
category.view.name = Ansicht
|
||||||
category.multiplayer.name = Mehrspieler
|
category.multiplayer.name = Mehrspieler
|
||||||
@@ -845,7 +845,7 @@ category.blocks.name = Blockauswahl
|
|||||||
command.attack = Angreifen
|
command.attack = Angreifen
|
||||||
command.rally = Patrouillieren
|
command.rally = Patrouillieren
|
||||||
command.retreat = Rückzug
|
command.retreat = Rückzug
|
||||||
command.idle = Idle
|
command.idle = Stehen bleiben
|
||||||
placement.blockselectkeys = \n[lightgray]Taste: [{0},
|
placement.blockselectkeys = \n[lightgray]Taste: [{0},
|
||||||
keybind.respawn.name = Respawn
|
keybind.respawn.name = Respawn
|
||||||
keybind.control.name = Einheit steuern
|
keybind.control.name = Einheit steuern
|
||||||
@@ -888,7 +888,7 @@ keybind.break_block.name = Block zerstören
|
|||||||
keybind.deselect.name = Auswahl aufheben
|
keybind.deselect.name = Auswahl aufheben
|
||||||
keybind.pickupCargo.name = Block aufheben
|
keybind.pickupCargo.name = Block aufheben
|
||||||
keybind.dropCargo.name = Block fallen lassen
|
keybind.dropCargo.name = Block fallen lassen
|
||||||
keybind.command.name = Eineiten kommandieren
|
keybind.command.name = Einheiten kommandieren
|
||||||
keybind.shoot.name = Schießen
|
keybind.shoot.name = Schießen
|
||||||
keybind.zoom.name = Zoomen
|
keybind.zoom.name = Zoomen
|
||||||
keybind.menu.name = Menü
|
keybind.menu.name = Menü
|
||||||
@@ -933,7 +933,7 @@ rules.blockdamagemultiplier = Block-Schaden-Multiplikator
|
|||||||
rules.unitbuildspeedmultiplier = Baugeschwindigkeit-Einheit Multiplikator
|
rules.unitbuildspeedmultiplier = Baugeschwindigkeit-Einheit Multiplikator
|
||||||
rules.unithealthmultiplier = Lebenspunkte-Einheit Multiplikator
|
rules.unithealthmultiplier = Lebenspunkte-Einheit Multiplikator
|
||||||
rules.unitdamagemultiplier = Schaden-Einheit Multiplikator
|
rules.unitdamagemultiplier = Schaden-Einheit Multiplikator
|
||||||
rules.enemycorebuildradius = Bauverbot Radius druch feindlichen Kern:[lightgray] (Kacheln)
|
rules.enemycorebuildradius = Bauverbot-Radius durch feindlichen Kern:[lightgray] (Kacheln)
|
||||||
rules.wavespacing = Wellen-Abstand:[lightgray] (Sek)
|
rules.wavespacing = Wellen-Abstand:[lightgray] (Sek)
|
||||||
rules.buildcostmultiplier = Bau-Kosten Multiplikator
|
rules.buildcostmultiplier = Bau-Kosten Multiplikator
|
||||||
rules.buildspeedmultiplier = Bau-Schnelligkeit Multiplikator
|
rules.buildspeedmultiplier = Bau-Schnelligkeit Multiplikator
|
||||||
@@ -1217,7 +1217,7 @@ block.multiplicative-reconstructor.name = Multiplikativer Rekonstrukteur
|
|||||||
block.exponential-reconstructor.name = Exponentieller Rekonstrukteur
|
block.exponential-reconstructor.name = Exponentieller Rekonstrukteur
|
||||||
block.tetrative-reconstructor.name = Tetrativer Rekonstrukteur
|
block.tetrative-reconstructor.name = Tetrativer Rekonstrukteur
|
||||||
block.payload-conveyor.name = Einheitenförderband
|
block.payload-conveyor.name = Einheitenförderband
|
||||||
block.payload-router.name = Einheitverteiler
|
block.payload-router.name = Einheitenverteiler
|
||||||
block.disassembler.name = Großer Trenner
|
block.disassembler.name = Großer Trenner
|
||||||
block.silicon-crucible.name = Silizium Schmelztiegel
|
block.silicon-crucible.name = Silizium Schmelztiegel
|
||||||
block.overdrive-dome.name = Beschleunigungs-Maschine
|
block.overdrive-dome.name = Beschleunigungs-Maschine
|
||||||
@@ -1230,7 +1230,7 @@ block.interplanetary-accelerator.name = Interplanetarischer Beschleuniger
|
|||||||
block.switch.name = Schalter
|
block.switch.name = Schalter
|
||||||
block.micro-processor.name = Mikroprozessor
|
block.micro-processor.name = Mikroprozessor
|
||||||
block.logic-processor.name = Logikprozessor
|
block.logic-processor.name = Logikprozessor
|
||||||
block.hyper-processor.name = Hyperprocessor
|
block.hyper-processor.name = Hyperprozessor
|
||||||
block.logic-display.name = Logik-Bildschirm
|
block.logic-display.name = Logik-Bildschirm
|
||||||
block.large-logic-display.name = Großer Logik-Bildschirm
|
block.large-logic-display.name = Großer Logik-Bildschirm
|
||||||
block.memory-cell.name = Speicherzelle
|
block.memory-cell.name = Speicherzelle
|
||||||
@@ -1245,83 +1245,86 @@ team.green.name = Grün
|
|||||||
team.purple.name = Lila
|
team.purple.name = Lila
|
||||||
|
|
||||||
hint.skip = Überspringen
|
hint.skip = Überspringen
|
||||||
hint.desktopMove = Drücke [accent][[WASD][] um dich zu bewegen.
|
hint.desktopMove = Drücke [accent][[WASD][], um dich zu bewegen.
|
||||||
hint.zoom = [accent]Scrolle[] um rein oder raus zu zoomen.
|
hint.zoom = [accent]Scrolle[], um rein oder raus zu zoomen.
|
||||||
hint.mine = Bewege dich zum \uf8c4 Kupfererz und [accent]tippe darauf[], um es manuell abzubauen.
|
hint.mine = Bewege dich zum \uf8c4 Kupfererz und [accent]tippe darauf[], um es manuell abzubauen.
|
||||||
hint.desktopShoot = Benutze [accent][[Links-Click][] um zu schießen.
|
hint.desktopShoot = Benutze [accent][[Linksklick][], um zu schießen.
|
||||||
hint.depositItems = Um Materialien in den Kern zu tun, ziehe sie von dir zum Kern.
|
hint.depositItems = Um Materialien in den Kern zu tun, ziehe sie von dir zum Kern.
|
||||||
hint.respawn = Um im Kern zu respawnen, drücke [accent][[V][].
|
hint.respawn = Um im Kern zu respawnen, drücke [accent][[V][].
|
||||||
hint.respawn.mobile = Du steuerst nun eine Einheit oder einen Block. Um wieder zur normalen Einheit zu werden, [accent]drücke die Abbildung von dir oben links.[]
|
hint.respawn.mobile = Du steuerst nun eine Einheit oder einen Block. Um wieder zur normalen Einheit zu werden, [accent]drücke die Abbildung von dir oben links.[]
|
||||||
hint.desktopPause = Benutze [accent][[Leertaste][] um das Spiel zu pausieren oder entpausieren.
|
hint.desktopPause = Benutze [accent][[Leertaste][], um das Spiel zu pausieren oder entpausieren.
|
||||||
hint.placeDrill = Wähle die \ue85e [accent]Bohrer[]-Kategorie im Menü unten rechts aus, drücke dann auf den \uf870 [accent]Bohrer[] und clicke auf ein Feld mit Kupfererz, um ihn zu platzieren.
|
hint.placeDrill = Wähle die \ue85e [accent]Bohrer[]-Kategorie im Menü unten rechts aus, drücke dann auf den \uf870 [accent]Bohrer[] und klicke auf ein Feld mit Kupfererz, um ihn zu platzieren.
|
||||||
hint.placeDrill.mobile = Wähle die \ue85e[accent]Bohrer[]-Kategorie im Menü unten rechts aus, drücke dann auf den \uf870 [accent]Bohrer[] und clicke auf ein Feld mit Kupfererz, um ihn zu platzieren.\n\nGehe zuletzt auf das \ue800 [accent]Häkchen[] unten rechts, um dies zu bestätigen.
|
hint.placeDrill.mobile = Wähle die \ue85e[accent]Bohrer[]-Kategorie im Menü unten rechts aus, drücke dann auf den \uf870 [accent]Bohrer[] und klicke auf ein Feld mit Kupfererz, um ihn zu platzieren.\n\nGehe zuletzt auf das \ue800 [accent]Häkchen[] unten rechts, um dies zu bestätigen.
|
||||||
hint.placeConveyor = Förderbänder bewegen Materialen zwischen verschiedene Blöcke. Wähle ein \uf896 [accent]Förderband[] aus der \ue814 [accent]Verteilung[]-Kategorie aus.\n\nClicke und bewege deine Maus, um mehrere Förderbänder zu setzen.\n[accent]Scrolle[] um sie zu drehen.
|
hint.placeConveyor = Förderbänder bewegen Materialien zwischen verschiedenen Blöcken. Wähle ein \uf896 [accent]Förderband[] aus der \ue814 [accent]Verteilung[]-Kategorie aus.\n\nKlicke und bewege deine Maus, um mehrere Förderbänder zu setzen.\n[accent]Scrolle[] um sie zu drehen.
|
||||||
hint.placeConveyor.mobile = Förderbänder bewegen Materialen zwischen verschiedene Blöcke. Wähle ein \uf896 [accent]Förderband[] aus der \ue814 [accent]Verteilung[]-Kategorie aus.\n\nHalte deinen Finger eine Sekunde auf dem Bildschirmund bewege ihn dann, um mehrere Förderbänder zu setzen.
|
hint.placeConveyor.mobile = Förderbänder bewegen Materialien zwischen verschiedenen Blöcken. Wähle ein \uf896 [accent]Förderband[] aus der \ue814 [accent]Verteilung[]-Kategorie aus.\n\nHalte deinen Finger eine Sekunde auf dem Bildschirm und bewege ihn dann, um mehrere Förderbänder zu setzen.
|
||||||
hint.placeTurret = Platziere \uf861 [accent]Geschütze[] um deine Basis vor Gegnern zu beschützen.\n\nGeschütze benötigen Munition - in diesem Fall \uf838Kupfer.\nBenutze Bohrer und Förderbänder, um dies zu besorgen.
|
hint.placeTurret = Platziere \uf861 [accent]Geschütze[], um deine Basis vor Gegnern zu beschützen.\n\nGeschütze benötigen Munition - in diesem Fall \uf838Kupfer.\nBenutze Bohrer und Förderbänder, um dies zu besorgen.
|
||||||
hint.breaking = Benutze [accent]Rechts-Click[] und bewege deine Maus, um zu zerstören.
|
hint.breaking = Benutze [accent]Rechtsklick[] und bewege deine Maus, um zu zerstören.
|
||||||
hint.breaking.mobile = Aktiviere den \ue817 [accent]Hammer[] unten rechts and tippe, um Blöcke zu zerstören.\n\nHalte deinen Finger auf dem Bildschirm um eine Fläche auszuwählen.
|
hint.breaking.mobile = Aktiviere den \ue817 [accent]Hammer[] unten rechts und tippe, um Blöcke zu zerstören.\n\nHalte deinen Finger auf dem Bildschirm, um eine Fläche auszuwählen.
|
||||||
hint.research = Nehme den \ue875 [accent]Forschen[]-Knopf um neue Technologien zu erforschen.
|
hint.research = Nehme den \ue875 [accent]Forschen[]-Knopf um neue Technologien zu erforschen.
|
||||||
hint.research.mobile = Nehme den \ue875 [accent]Forschen[]-Knopf im \ue88c [accent]Menü[] um neue Technologien zu erforschen.
|
hint.research.mobile = Nehme den \ue875 [accent]Forschen[]-Knopf im \ue88c [accent]Menü[], um neue Technologien zu erforschen.
|
||||||
hint.unitControl = Halte [accent][[L-STRG][] und [accent]clicke[] um alliierte Einheiten oder Geschütze zu steuern.
|
hint.unitControl = Halte [accent][[L-STRG][] und [accent]klicke[], um alliierte Einheiten oder Geschütze zu steuern.
|
||||||
hint.unitControl.mobile = [accent][Doppel-Clicke[], um alliierte Einheiten oder Geschütze zu steuern.
|
hint.unitControl.mobile = [accent][Doppelklicke[], um alliierte Einheiten oder Geschütze zu steuern.
|
||||||
hint.launch = Sobald du genug Ressourcen gesammelt hast, kannst du [accent]Starten[], indem du andere Sektoren auf der \ue827 [accent]Karte[] unten rechts auswählst.
|
hint.launch = Sobald du genug Ressourcen gesammelt hast, kannst du [accent]Starten[], indem du andere Sektoren auf der \ue827 [accent]Karte[] unten rechts auswählst.
|
||||||
hint.launch.mobile = Sobald du genug Ressourcen gesammelt hast, kannst du [accent]Starten[], indem du andere Sektoren auf der \ue827 [accent]Karte[] im \ue88c [accent]Menu[] auswählst.
|
hint.launch.mobile = Sobald du genug Ressourcen gesammelt hast, kannst du [accent]Starten[], indem du andere Sektoren auf der \ue827 [accent]Karte[] im \ue88c [accent]Menü[] auswählst.
|
||||||
hint.schematicSelect = Halte [accent][[F][] gedrückt und bewege deine Maus, um Blöcke zu kopieren.\n\nMit [accent][[Mittel-Click][] kannst du einen einzelnen Block kopieren.
|
hint.schematicSelect = Halte [accent][[F][] gedrückt und bewege deine Maus, um Blöcke zu kopieren.\n\nMit [accent][[Mittelklick][] kannst du einen einzelnen Block kopieren.
|
||||||
hint.conveyorPathfind = Halte [accent][[L-STRG][] während du Förderbänder baust, um automatisch einen Weg zu finden.
|
hint.conveyorPathfind = Halte [accent][[L-STRG][] während du Förderbänder baust, um automatisch einen Weg zu finden.
|
||||||
hint.conveyorPathfind.mobile = Aktiviere den \ue844 [accent]Diagonal-Modus[] unten rechts und platziere Förderbänder, um automatisch einen Weg zu generieren.
|
hint.conveyorPathfind.mobile = Aktiviere den \ue844 [accent]Diagonal-Modus[] unten rechts und platziere Förderbänder, um automatisch einen Weg zu generieren.
|
||||||
hint.boost = Halte [accent][[L-Shift][] gedrückt um über Hindernisse zu boosten.\n\nNur manche Bodeneinheiten können das.
|
hint.boost = Halte [accent][[L-Shift][] gedrückt, um über Hindernisse zu boosten.\n\nNur manche Bodeneinheiten können das.
|
||||||
hint.command = Drücke [accent][[G][] um [accent]ähnliche[] Einheiten in Formation zu steuern.\n\nUm Bodeneinheiten zu steuern musst du zuerst eine Bodeneinheite werden.
|
hint.command = Drücke [accent][[G][], um [accent]ähnliche[] Einheiten in Formation zu steuern.\n\nUm Bodeneinheiten zu steuern, musst du zuerst eine Bodeneinheit werden.
|
||||||
hint.command.mobile = [accent][[Doppel-Clicke][] deine Einheit um [accent]ähnliche[] Einheiten in Formation zu steuern.
|
hint.command.mobile = [accent][[Doppelklicke][] deine Einheit, um [accent]ähnliche[] Einheiten in Formation zu steuern.
|
||||||
hint.payloadPickup = Du kannst [accent][[[] drücken, um kleine Einheiten oder Blöcke hochzuheben.
|
hint.payloadPickup = Du kannst [accent][[[] drücken, um kleine Einheiten oder Blöcke hochzuheben.
|
||||||
hint.payloadPickup.mobile = [accent]Halte deinen Finger[] auf eine kleine Einheit oder einen kleinen Block, um ihn aufzuheben.
|
hint.payloadPickup.mobile = [accent]Halte deinen Finger[] auf eine kleine Einheit oder einen kleinen Block, um ihn aufzuheben.
|
||||||
hint.payloadDrop = Drücke [accent]][] um etwas fallen zu lassen.
|
hint.payloadDrop = Drücke [accent]][], um etwas fallen zu lassen.
|
||||||
hint.payloadDrop.mobile = [accent]Halte deinen Finger[] auf einen Freien Ort um eine Einheit oder einen Block da fallen zu lassen.
|
hint.payloadDrop.mobile = [accent]Halte deinen Finger[] auf einen freien Ort, um eine Einheit oder einen Block da fallen zu lassen.
|
||||||
hint.waveFire = [accent]Wellen[]-Geschütze mit Wassermunition löschen automatisch Feuer.
|
hint.waveFire = [accent]Wellen[]-Geschütze mit Wassermunition löschen automatisch Feuer.
|
||||||
hint.generator = \uf879 [accent]Verbrennungsgeneratoren[] verbrennen Kohle und übertragen diesen Strom in angrenzende Blöcke.\n\nDie Reichweite der Stromübertragung kann mit \uf87f [accent]Stromknoten[] erweitert werden.
|
hint.generator = \uf879 [accent]Verbrennungsgeneratoren[] verbrennen Kohle und übertragen diesen Strom in angrenzende Blöcke.\n\nDie Reichweite der Stromübertragung kann mit \uf87f [accent]Stromknoten[] erweitert werden.
|
||||||
hint.guardian = [accent]Boss[]-Einheiten sind gepanzert. Schwache Munition wie [accent]Kupfer[] und [accent]Blei[] sind [scarlet]nicht ausreichend[].\n\nBenutze bessere Geschütze oder \uf835 [accent]Graphit[] als \uf861Duo-/\uf859Salvenmunition um einen Boss zu besiegen.
|
hint.guardian = [accent]Boss[]-Einheiten sind gepanzert. Schwache Munition wie [accent]Kupfer[] und [accent]Blei[] sind [scarlet]nicht effektiv[].\n\nBenutze bessere Geschütze oder \uf835 [accent]Graphit[] als \uf861Duo-/\uf859Salvenmunition um einen Boss zu besiegen.
|
||||||
|
hint.coreUpgrade = Kerne können aufgerüstet werden, indem man [accent]bessere Kerne über sie platziert[].\n\nPlatziere einen [accent]Fundament[]-Kern über einen [accent]Scherben[]-Kern. Stelle sicher, dass ausreichend Platz verfügbar ist.
|
||||||
|
hint.presetLaunch = Zu grauen [accent]Sektoren[] wie dem [accent]Frozen Forest[] kann man von überall aus hin starten. Es ist nicht nötig, benachbarte Sektoren zu erobern.\n\n[accent]Nummerierte Sektoren[] wie dieser hier sind [accent]optional[].
|
||||||
|
hint.coreIncinerate = Wenn dem Kern Materialien zugeführt werden, für die er keinen Platz mehr hat, werden diese [accent]verbrannt[].
|
||||||
|
|
||||||
item.copper.description = Wird als Baumaterial oder Munition verwendet.
|
item.copper.description = Wird als Baumaterial oder Munition verwendet.
|
||||||
item.copper.details = Kupfer. Auf Serpulo reichlich vorhanden. Strukturell schwach, solange es nicht verstärkt wird.
|
item.copper.details = Kupfer. Auf Serpulo reichlich vorhanden. Strukturell schwach, solange es nicht verstärkt wird.
|
||||||
item.lead.description = Wird in elektrischen Blöcken oder beim Flüssigkeitstransport verwendet.
|
item.lead.description = Wird in elektrischen Blöcken oder beim Flüssigkeitstransport verwendet.
|
||||||
item.lead.details = Dicht. Träge. Wird sehr oft in Batterien verwendet.\nInfo: Wahrscheinlich giftig für biologische Lebenwesen, obwohl es sowieso nicht mehr viele von denen gibt.
|
item.lead.details = Dicht. Träge. Wird sehr oft in Batterien verwendet.\nInfo: Wahrscheinlich giftig für biologische Lebewesen, obwohl es sowieso nicht mehr viele von denen gibt.
|
||||||
item.metaglass.description = Wird beim Flüssigkeitstransport und -lagerung verwendet.
|
item.metaglass.description = Wird beim Flüssigkeitstransport und -lagerung verwendet.
|
||||||
item.graphite.description = Wird als Munition oder elektrischer Leiter eingesetzt.
|
item.graphite.description = Wird als Munition oder elektrischer Leiter eingesetzt.
|
||||||
item.sand.description = Nützlich für die Herstellung vieler anderer Materialen.
|
item.sand.description = Nützlich für die Herstellung vieler anderer Materialien.
|
||||||
item.coal.description = Kann als Brennstoff oder zur Herstellung anderer Materialen verwendet werden.
|
item.coal.description = Kann als Brennstoff oder zur Herstellung anderer Materialien verwendet werden.
|
||||||
item.coal.details = Scheint versteinerte Pflanzenmasse zu sein, die sich schon lange vor dem Seeding gebildet hat.
|
item.coal.details = Scheint versteinerte Pflanzenmasse zu sein, die sich schon lange vor dem Seeding gebildet hat.
|
||||||
item.titanium.description = Wird im Flüssigkeitsbereich, im Bohrerbereich und für Flugzeuge vielfältig eingesetzt.
|
item.titanium.description = Wird im Flüssigkeitsbereich, im Bohrerbereich und für Flugzeuge vielfältig eingesetzt.
|
||||||
item.thorium.description = Wird als festes Baumaterial oder radioaktiver Kraftstoff verwendet.
|
item.thorium.description = Wird als festes Baumaterial oder radioaktiver Kraftstoff verwendet.
|
||||||
item.scrap.description = Wird in Pulverisierer und Schmelzer zu anderen Materialen bearbeitet.
|
item.scrap.description = Wird in Pulverisierer und Schmelzer zu anderen Materialien bearbeitet.
|
||||||
item.scrap.details = Übriggebliebene Reste alter Gebäude oder Einheiten.
|
item.scrap.details = Übriggebliebene Reste alter Gebäude oder Einheiten.
|
||||||
item.silicon.description = Wird in Solarzellen, komplizierte Elektronik und als zielsuchende Munition verwendet.
|
item.silicon.description = Wird in Solarzellen, komplizierter Elektronik und als zielsuchende Munition verwendet.
|
||||||
item.plastanium.description = Wird für fortgeschrittene Einheiten, Isolation und Munition eingesetzt.
|
item.plastanium.description = Wird für fortgeschrittene Einheiten, Isolation und Munition eingesetzt.
|
||||||
item.phase-fabric.description = Kann in Elektronik und selbstreparierende Blöcke verwendet werden.
|
item.phase-fabric.description = Kann in Elektronik und selbstreparierende Blöcke verwendet werden.
|
||||||
item.surge-alloy.description = Wird in sehr fortgeschrittenen Waffen und Abwehrsystemen benutzt.
|
item.surge-alloy.description = Wird in sehr fortgeschrittenen Waffen und Abwehrsystemen benutzt.
|
||||||
item.spore-pod.description = Wird zur Umwandlung in Öl, Sprengstoff und Kraftstoff verwendet.
|
item.spore-pod.description = Wird zur Umwandlung in Öl, Sprengstoff und Kraftstoff verwendet.
|
||||||
item.spore-pod.details = Sporen. Wahrscheinlich ein künstlich erschaffenes Lebenwesen. Geben giftige Gase für andere Lebenwesen ab. Sehr invasiv. Unter bestimmten Bedingungen sehr brennbar.
|
item.spore-pod.details = Sporen. Wahrscheinlich ein künstlich erschaffenes Lebewesen. Geben giftige Gase für andere Lebewesen ab. Sehr invasiv. Unter bestimmten Bedingungen sehr brennbar.
|
||||||
item.blast-compound.description = Wird in Bomben oder als explosive Munition verwendet.
|
item.blast-compound.description = Wird in Bomben oder als explosive Munition verwendet.
|
||||||
item.pyratite.description = Kann in Verbrennungsgeneratoren oder als brennende Munition verbrannt werden.
|
item.pyratite.description = Kann in Verbrennungsgeneratoren oder als brennende Munition verbrannt werden.
|
||||||
|
|
||||||
liquid.water.description = Wird üblicherweise zum Kühlen von Maschinen und zur Müllverarbeitung verwendet.
|
liquid.water.description = Wird üblicherweise zum Kühlen von Maschinen und zur Müllverarbeitung verwendet.
|
||||||
liquid.slag.description = Kann in Trennern verfeinert oder als Waffe gegen Gegner verwendet werden.
|
liquid.slag.description = Kann in Trennern verfeinert oder als Waffe gegen Gegner verwendet werden.
|
||||||
liquid.oil.description = Used in advanced material production and as incendiary ammunition.
|
liquid.oil.description = Wird in fortgeschrittener Materialgewinnung und als brennende Munition verwendet.
|
||||||
liquid.cryofluid.description = Used as coolant in reactors, turrets and factories. Wird als Kühlung in Geschütze, Fabriken oder Reaktoren verwendet.
|
liquid.cryofluid.description = Wird als Kühlung in Geschützen, Fabriken oder Reaktoren verwendet.
|
||||||
|
|
||||||
block.resupply-point.description = Füllt Einheiten in der Nähe mit Kupfermunition wieder auf. Nicht mit Einheiten kompatibel, die Strom benötigen.
|
block.resupply-point.description = Füllt Einheiten in der Nähe mit Kupfermunition wieder auf. Nicht mit Einheiten kompatibel, die Strom benötigen.
|
||||||
block.armored-conveyor.description = Bewegt Materialen foran. Materialen können von der Seite nicht auf das Förderband.
|
block.armored-conveyor.description = Bewegt Materialien voran. Materialien können von der Seite nicht auf das Förderband.
|
||||||
block.illuminator.description = Eine Lichtquelle.
|
block.illuminator.description = Eine Lichtquelle.
|
||||||
block.message.description = Speichert eine Nachricht, die genutzt wird, um mit Verbündeten zu kommunizieren.
|
block.message.description = Speichert eine Nachricht, die genutzt wird, um mit Verbündeten zu kommunizieren.
|
||||||
block.graphite-press.description = Komprimiert Kohle zu Graphit.
|
block.graphite-press.description = Komprimiert Kohle zu Graphit.
|
||||||
block.multi-press.description = Komprimiert Kohle zu Graphit. Braucht für die Kühlung Wasser.
|
block.multi-press.description = Komprimiert Kohle zu Graphit. Braucht für die Kühlung Wasser.
|
||||||
block.silicon-smelter.description = Stellt aus Sand und Kohle Silizium her.
|
block.silicon-smelter.description = Stellt aus Sand und Kohle Silizium her.
|
||||||
block.kiln.description = Schmelzt Sand und Blei zu Metaglass.
|
block.kiln.description = Schmelzt Sand und Blei zu Metaglas.
|
||||||
block.plastanium-compressor.description = Produziert Plastanium aus Öl und Titan.
|
block.plastanium-compressor.description = Produziert Plastanium aus Öl und Titan.
|
||||||
block.phase-weaver.description = Produziert Phasengewebe aus Thorium und Sand.
|
block.phase-weaver.description = Produziert Phasengewebe aus Thorium und Sand.
|
||||||
block.alloy-smelter.description = Verschmilzt Titan, Blei, Silizium und Kupfer zu einer Stromstoßlegierung.
|
block.alloy-smelter.description = Verschmilzt Titan, Blei, Silizium und Kupfer zu einer Stromstoßlegierung.
|
||||||
block.cryofluid-mixer.description = Verarbeitet Wasser mit Titan zu einer Kryoflüssigkeit, die viel effizienter kühlt.
|
block.cryofluid-mixer.description = Verarbeitet Wasser mit Titan zu einer Kryoflüssigkeit, die viel effizienter kühlt.
|
||||||
block.blast-mixer.description = Stellt aus Sporen und Pyratit eine explosive Mischung her.
|
block.blast-mixer.description = Stellt aus Sporen und Pyratit eine explosive Mischung her.
|
||||||
block.pyratite-mixer.description = Vermischt Kohle, Blei und Sand zu hochentzündlichem Pyratit.
|
block.pyratite-mixer.description = Vermischt Kohle, Blei und Sand zu hochentzündlichem Pyratit.
|
||||||
block.melter.description = Erhitzt Schrott um Schlacke zu erhalten.
|
block.melter.description = Erhitzt Schrott, um Schlacke zu erhalten.
|
||||||
block.separator.description = Trennt Schlacke in seine Bestandteile.
|
block.separator.description = Trennt Schlacke in seine Bestandteile.
|
||||||
block.spore-press.description = Komprimiert Sporen-Pods zu Öl.
|
block.spore-press.description = Komprimiert Sporen-Pods zu Öl.
|
||||||
block.pulverizer.description = Zertrümmert Schrott zu Sand.
|
block.pulverizer.description = Zertrümmert Schrott zu Sand.
|
||||||
@@ -1354,24 +1357,24 @@ block.force-projector.description = Erzeugt ein sechseckiges Kraftfeld um sich h
|
|||||||
block.shock-mine.description = Greift Gegner mit Lichtbögen an, wenn sie über sie laufen.
|
block.shock-mine.description = Greift Gegner mit Lichtbögen an, wenn sie über sie laufen.
|
||||||
block.conveyor.description = Bewegt Materialien vorwärts.
|
block.conveyor.description = Bewegt Materialien vorwärts.
|
||||||
block.titanium-conveyor.description = Bewegt Materialien vorwärts, aber schneller als ein normales Förderband.
|
block.titanium-conveyor.description = Bewegt Materialien vorwärts, aber schneller als ein normales Förderband.
|
||||||
block.plastanium-conveyor.description = Bewegt Materialen in Gruppen.\nNimmt hinten Materialien an und gibt sie vorne in drei Richtungen aus. Erfordert für maximale Effizienz mehrere Ein- und Ausgänge.
|
block.plastanium-conveyor.description = Bewegt Materialien in Gruppen.\nNimmt hinten Materialien an und gibt sie vorne in drei Richtungen aus. Erfordert für maximale Effizienz mehrere Ein- und Ausgänge.
|
||||||
block.junction.description = Fungiert als Brücke zwischen zwei kreuzenden Förderbändern.
|
block.junction.description = Fungiert als Brücke zwischen zwei kreuzenden Förderbändern.
|
||||||
block.bridge-conveyor.description = Transportiert Materialien über Terrain oder über Blöcke.
|
block.bridge-conveyor.description = Transportiert Materialien über Terrain oder über Blöcke.
|
||||||
block.phase-conveyor.description = Transportiert Materialien sofort über Terrain oder über Blöcke. Höhere Reichweite als Brückenförderbänder, braucht aber Strom.
|
block.phase-conveyor.description = Transportiert Materialien sofort über Terrain oder über Blöcke. Höhere Reichweite als Brückenförderbänder, braucht aber Strom.
|
||||||
block.sorter.description = Sortiert Materialien. Wenn ein Gegenstand der Auswahl entspricht, wird er vorne herausgegeben. Andernfalls wird er links oder rechts ausgegeben.
|
block.sorter.description = Sortiert Materialien. Wenn ein Gegenstand der Auswahl entspricht, wird er vorne herausgegeben. Andernfalls wird er links oder rechts ausgegeben.
|
||||||
block.inverted-sorter.description = Wie ein normaler Sortierer, aber gibt das ausgewählte Material seitwärts aus.
|
block.inverted-sorter.description = Wie ein normaler Sortierer, aber gibt das ausgewählte Material seitwärts aus.
|
||||||
block.router.description = Verteilt Materialen auf bis zu drei Richtungen.
|
block.router.description = Verteilt Materialien auf bis zu drei Richtungen.
|
||||||
block.router.details = Ein nötiges Übel. Es is nicht empfehlenswert, ihn neben Fabriken zu setzen, da er sich dort verstopfen kann.
|
block.router.details = Ein nötiges Übel. Es ist nicht empfehlenswert, ihn neben Fabriken zu setzen, da er sich dort verstopfen kann.
|
||||||
block.distributor.description = Verteilt Materialen auf bis zu sieben Richtungen.
|
block.distributor.description = Verteilt Materialien auf bis zu sieben Richtungen.
|
||||||
block.overflow-gate.description = Gibt Materialen nur zu den Seiten heraus, wenn der fordere Ausgang blockiert ist. Kann nicht neben anderen Überlauf- oder Unterlauftoren verwendet werden.
|
block.overflow-gate.description = Gibt Materialien nur zu den Seiten heraus, wenn der fordere Ausgang blockiert ist. Kann nicht neben anderen Überlauf- oder Unterlauftoren verwendet werden.
|
||||||
block.underflow-gate.description = Das Gegenteil eines Überlauftors. Gibt Materialen nur nach vorne heraus, wenn die Seiten blockiert sind. Kann nicht neben anderen Überlauf- oder Unterlauftoren verwendet werden.
|
block.underflow-gate.description = Das Gegenteil eines Überlauftors. Gibt Materialien nur nach vorne heraus, wenn die Seiten blockiert sind. Kann nicht neben anderen Überlauf- oder Unterlauftoren verwendet werden.
|
||||||
block.mass-driver.description = Ein Transportblock mit sehr hoher Reichweite. Sammelt mehrere Materialien und schießt sie zu einem verbundenen Massenbeschleuniger.
|
block.mass-driver.description = Ein Transportblock mit sehr hoher Reichweite. Sammelt mehrere Materialien und schießt sie zu einem verbundenen Massenbeschleuniger.
|
||||||
block.mechanical-pump.description = Eine Pumpe, die keinen Strom benötigt.
|
block.mechanical-pump.description = Eine Pumpe, die keinen Strom benötigt.
|
||||||
block.rotary-pump.description = Eine Pumpe, die Strom verbraucht.
|
block.rotary-pump.description = Eine Pumpe, die Strom verbraucht.
|
||||||
block.thermal-pump.description = Eine Pumpe.
|
block.thermal-pump.description = Eine Pumpe.
|
||||||
block.conduit.description = Transportiert Flüssigkeiten. Wird mit Extraktoren, Pumpen oder anderen Kanälen benutzt.
|
block.conduit.description = Transportiert Flüssigkeiten. Wird mit Extraktoren, Pumpen oder anderen Kanälen benutzt.
|
||||||
block.pulse-conduit.description = Transportiert Flüssigkeiten. Transportiert Flüssigkeiten schneller und speichert mehr als ein Leitungsrohr.
|
block.pulse-conduit.description = Transportiert Flüssigkeiten. Transportiert Flüssigkeiten schneller und speichert mehr als ein Leitungsrohr.
|
||||||
block.plated-conduit.description = Transportiert Flüssigkeiten. Nimmt keine Flüssigkeiten von der Seite an.\nHat keine Leks.
|
block.plated-conduit.description = Transportiert Flüssigkeiten. Nimmt keine Flüssigkeiten von der Seite an.\nHat keine Lecks.
|
||||||
block.liquid-router.description = Verteilt Flüssigkeiten auf bis zu drei Richtungen. Speicher außerdem eine kleine Menge an Flüssigkeit.
|
block.liquid-router.description = Verteilt Flüssigkeiten auf bis zu drei Richtungen. Speicher außerdem eine kleine Menge an Flüssigkeit.
|
||||||
block.liquid-tank.description = Speichert eine große Menge an Flüssigkeiten. Ähnlich wie ein Flüssigkeitsverteiler.
|
block.liquid-tank.description = Speichert eine große Menge an Flüssigkeiten. Ähnlich wie ein Flüssigkeitsverteiler.
|
||||||
block.liquid-junction.description = Fungiert als Brücke über zwei kreuzende Kanäle.
|
block.liquid-junction.description = Fungiert als Brücke über zwei kreuzende Kanäle.
|
||||||
@@ -1385,37 +1388,37 @@ block.battery.description = Speichert Strom, solange ein Überschuss besteht, un
|
|||||||
block.battery-large.description = Speichert Strom, solange ein Überschuss besteht, und gibt ihn bei Knappheit ab, solange Kapazität vorhanden ist. Speichert mehr Strom als eine normale Batterie.
|
block.battery-large.description = Speichert Strom, solange ein Überschuss besteht, und gibt ihn bei Knappheit ab, solange Kapazität vorhanden ist. Speichert mehr Strom als eine normale Batterie.
|
||||||
block.combustion-generator.description = Generiert Strom, indem Kohle oder andere entzündliche Materialien verbrannt werden.
|
block.combustion-generator.description = Generiert Strom, indem Kohle oder andere entzündliche Materialien verbrannt werden.
|
||||||
block.thermal-generator.description = Erzeugt an heißen Orten große Mengen Strom.
|
block.thermal-generator.description = Erzeugt an heißen Orten große Mengen Strom.
|
||||||
block.steam-generator.description = Wandelt mit endzündlichen Materialen Wasser zu Wasserdampf um und benutzt diesen dann, um Strom zu generieren.
|
block.steam-generator.description = Wandelt mit entzündlichen Materialien Wasser zu Wasserdampf um und benutzt diesen dann, um Strom zu generieren.
|
||||||
block.differential-generator.description = Erzeugt große Mengen an Energie. Nutzt den Temperaturunterschied zwischen Kryofluid und brennendem Pyratit.
|
block.differential-generator.description = Erzeugt große Mengen an Energie. Nutzt den Temperaturunterschied zwischen Kryoflüssigkeit und brennendem Pyratit.
|
||||||
block.rtg-generator.description = Ein Radioisotopengenerator, der aus radioaktivem Zerfall Energie herstellt.
|
block.rtg-generator.description = Ein Radioisotopengenerator, der aus radioaktivem Zerfall Energie herstellt.
|
||||||
block.solar-panel.description = Erzeugt kleine Mengen an Strom aus Sonnenenergie.
|
block.solar-panel.description = Erzeugt kleine Mengen an Strom aus Sonnenenergie.
|
||||||
block.solar-panel-large.description = Erzeugt kleine Mengen an Strom aus Sonnenenergie. Effizienter als eine normale Solarzelle.
|
block.solar-panel-large.description = Erzeugt kleine Mengen an Strom aus Sonnenenergie. Effizienter als eine normale Solarzelle.
|
||||||
block.thorium-reactor.description = Erzeugt riesige Mengen Strom aus Thorium. Benötigt konstante Kühlung. Explodiert gewaltsam, wenn unzureichende Kühlung vorhanden ist.
|
block.thorium-reactor.description = Erzeugt riesige Mengen Strom aus Thorium. Benötigt konstante Kühlung. Explodiert gewaltsam, wenn unzureichende Kühlung vorhanden ist.
|
||||||
block.impact-reactor.description = Ein Generator, der bei höchster Effizienz enorme Mengen an Leistung erzeugen kann. Erfordert eine erhebliche Leistungsaufnahme, um den Prozess zu starten.
|
block.impact-reactor.description = Ein Generator, der bei höchster Effizienz enorme Mengen an Leistung erzeugen kann. Erfordert eine erhebliche Leistungsaufnahme, um den Prozess zu starten.
|
||||||
block.mechanical-drill.description = Ein günstiger Bohrer. Wenn er auf Erz gesetzt wird, baut er unbegrenzt das Erz mit geringer Geschwindigkeit ab. Kann nur einfach Ressourcen abbauen.
|
block.mechanical-drill.description = Ein günstiger Bohrer. Wenn er auf Erz gesetzt wird, baut er unbegrenzt das Erz mit geringer Geschwindigkeit ab. Kann nur einfach Ressourcen abbauen.
|
||||||
block.pneumatic-drill.description = Ein verbesserter Bohrer, der schneller ist und in der Lage ist, härtere Erze abzubauen, indem er von Luftdruck gebrauch macht.
|
block.pneumatic-drill.description = Ein verbesserter Bohrer, der schneller ist und in der Lage ist, härtere Erze abzubauen, indem er von Luftdruck Gebrauch macht.
|
||||||
block.laser-drill.description = Erlaubt es, durch Lasertechnologie noch schneller zu bohren, benötigt aber Strom. Erlaubt zusätzlich das Abbauen von radioaktivem Thorium.
|
block.laser-drill.description = Erlaubt es, durch Lasertechnologie noch schneller zu bohren, benötigt aber Strom. Erlaubt zusätzlich das Abbauen von radioaktivem Thorium.
|
||||||
block.blast-drill.description = Der ultimative Bohrer. Benötigt große Mengen an Strom.
|
block.blast-drill.description = Der ultimative Bohrer. Benötigt große Mengen an Strom.
|
||||||
block.water-extractor.description = Extrahiert Wasser aus dem Boden. Verwende ihn, wenn es keinen See in der Nähe gibt.
|
block.water-extractor.description = Extrahiert Wasser aus dem Boden. Verwende ihn, wenn es keinen See in der Nähe gibt.
|
||||||
block.cultivator.description = Kultiviert winzige Mengen atmosphärischer Mikrosporen in Sporen-Pods.
|
block.cultivator.description = Kultiviert winzige Mengen atmosphärischer Mikrosporen in Sporen-Pods.
|
||||||
block.cultivator.details = Zurückgewonnene Technologie. Wird benutzt, um große Mengen Biomasse so effizient wie möglich herzustellen. Wahrscheinlich der ehemaliger Inkbator der Sporen, die Serpulo heute bedecken.
|
block.cultivator.details = Zurückgewonnene Technologie. Wird benutzt, um große Mengen Biomasse so effizient wie möglich herzustellen. Wahrscheinlich der ehemaliger Inkubator der Sporen, die Serpulo heute bedecken.
|
||||||
block.oil-extractor.description = Verwendet große Mengen an Strom, Sand und Wasser um Öl zu extrahieren.
|
block.oil-extractor.description = Verwendet große Mengen an Strom, Sand und Wasser, um Öl zu extrahieren.
|
||||||
block.core-shard.description = Kern der Basis. Einmal zerstört, ist jeglicher Kontakt zum Sektor verloren.
|
block.core-shard.description = Kern der Basis. Einmal zerstört, ist jeglicher Kontakt zum Sektor verloren.
|
||||||
block.core-shard.details = The erste Version. Kompakt. Selbstduplizierend. Mit Einwmalraketen ausgestattet. Nicht für Interplanetarische Reisen geeignet.
|
block.core-shard.details = Die erste Version. Kompakt. Selbstduplizierend. Mit Einmalraketen ausgestattet. Nicht für Interplanetarische Reisen geeignet.
|
||||||
block.core-foundation.description = Kern der Basis. Besser gepanzert. Speichert mehr Ressourcen.
|
block.core-foundation.description = Kern der Basis. Besser gepanzert. Speichert mehr Ressourcen.
|
||||||
block.core-foundation.details = Die zeite Version.
|
block.core-foundation.details = Die zweite Version.
|
||||||
block.core-nucleus.description = Kern der Basis. Sehr gut gepanzert. Speichert enorme Mengen an Ressourcen.
|
block.core-nucleus.description = Kern der Basis. Sehr gut gepanzert. Speichert enorme Mengen an Ressourcen.
|
||||||
block.core-nucleus.details = Die dritte und letzte Version.
|
block.core-nucleus.details = Die dritte und letzte Version.
|
||||||
block.vault.description = Speichert eine große Menge an Materialien pro Typ. Ein[lightgray] Entlader[] kann verwendet werden, um Materialien auszuladen.
|
block.vault.description = Speichert eine große Menge an Materialien pro Typ. Ein[lightgray] Entlader[] kann verwendet werden, um Materialien auszuladen.
|
||||||
block.container.description = Speichert eine kleine Menge an Materialien pro Typ. Ein[lightgray] Entlader[] kann verwendet werden, um Materialien auszuladen.
|
block.container.description = Speichert eine kleine Menge an Materialien pro Typ. Ein[lightgray] Entlader[] kann verwendet werden, um Materialien auszuladen.
|
||||||
block.unloader.description = Entlädt Materialien aus einem Block.
|
block.unloader.description = Entlädt Materialien aus einem Block.
|
||||||
block.launch-pad.description = Startet Materialen in andere Sektoren.
|
block.launch-pad.description = Startet Materialien in andere Sektoren.
|
||||||
block.duo.description = Schießt auf Gegner.
|
block.duo.description = Schießt auf Gegner.
|
||||||
block.scatter.description = Ein mittelgroßer Anti-Luft-Turm. Sprüht Blei- oder Schrottklumpen auf feindliche Lufteinheiten.
|
block.scatter.description = Ein mittelgroßer Anti-Luft-Turm. Sprüht Blei- oder Schrottklumpen auf feindliche Lufteinheiten.
|
||||||
block.scorch.description = Verbrennt alle Bodenfeinde in der Nähe. Hochwirksam im Nahbereich.
|
block.scorch.description = Verbrennt alle Bodenfeinde in der Nähe. Hochwirksam im Nahbereich.
|
||||||
block.hail.description = Schießt kleine Geschosse auf weit entfernte Gegner.
|
block.hail.description = Schießt kleine Geschosse auf weit entfernte Gegner.
|
||||||
block.wave.description = Schießt Flüssigkeiten auf Gegner. Löscht Feuer automatisch, wenn Wasser aks Munition verwendet wird.
|
block.wave.description = Schießt Flüssigkeiten auf Gegner. Löscht Feuer automatisch, wenn Wasser als Munition verwendet wird.
|
||||||
block.lancer.description = Läd sich auf und schießt kräftige Laserstrahlen auf Feinde.
|
block.lancer.description = Lädt sich auf und schießt kräftige Laserstrahlen auf Feinde.
|
||||||
block.arc.description = Schießt Lichtbögen in Richtung des Gegners.
|
block.arc.description = Schießt Lichtbögen in Richtung des Gegners.
|
||||||
block.swarmer.description = Schießt zielsuchende Raketenschwärme ab.
|
block.swarmer.description = Schießt zielsuchende Raketenschwärme ab.
|
||||||
block.salvo.description = Schießt Schüsse in Salven ab.
|
block.salvo.description = Schießt Schüsse in Salven ab.
|
||||||
@@ -1423,16 +1426,16 @@ block.fuse.description = Schießt drei starke Strahlen mit kurzer Reichweite ab.
|
|||||||
block.ripple.description = Schießt mehrere Schüsse gleichzeitig auf weit entfernte Gegner.
|
block.ripple.description = Schießt mehrere Schüsse gleichzeitig auf weit entfernte Gegner.
|
||||||
block.cyclone.description = Schießt explodierende Geschosse auf Gegner.
|
block.cyclone.description = Schießt explodierende Geschosse auf Gegner.
|
||||||
block.spectre.description = Schießt große, panzerbrechende Kugeln auf Luft- und Bodenziele.
|
block.spectre.description = Schießt große, panzerbrechende Kugeln auf Luft- und Bodenziele.
|
||||||
block.meltdown.description = Läd sich auf und schießt einen starken, durchgängigen Laser auf Gegner. Braucht Kühlung.
|
block.meltdown.description = Lädt sich auf und schießt einen starken, durchgängigen Laser auf Gegner. Braucht Kühlung.
|
||||||
block.foreshadow.description = Schießt einen eingizen Schuss mit einem einzigen Ziel über eine erstaunlich große Distanz.
|
block.foreshadow.description = Schießt einen einzigen Schuss mit einem einzigen Ziel über eine erstaunlich große Distanz.
|
||||||
block.repair-point.description = Heilt durchgehend die nächste befreundete, beschädigte Einheit in der Umgebung.
|
block.repair-point.description = Heilt durchgehend die nächste befreundete, beschädigte Einheit in der Umgebung.
|
||||||
block.segment.description = Beschädigt und zerstört gegnerische Projektile. Laser werden nicht anvisiert.
|
block.segment.description = Beschädigt und zerstört gegnerische Projektile. Laser werden nicht anvisiert.
|
||||||
block.parallax.description = Benutzt einen Traktorstrahl, um Gegner heranzuziehen und sie dabei anzugreifen.
|
block.parallax.description = Benutzt einen Traktorstrahl, um Gegner heranzuziehen und sie dabei anzugreifen.
|
||||||
block.tsunami.description = Schießt mit einem kräftgem Strahl aus Flüssigkeit auf Gegner. Löscht Feuer automatisch, wenn Wasser aks Munition verwendet wird.
|
block.tsunami.description = Schießt mit einem kräftigen Strahl aus Flüssigkeit auf Gegner. Löscht Feuer automatisch, wenn Wasser als Munition verwendet wird.
|
||||||
block.silicon-crucible.description = Benutzt Pyratit als Hitzequelle, um aus Sand und Kohle Silizium herzustellen. Die Effizienz wird an heißen Orten erhöht.
|
block.silicon-crucible.description = Benutzt Pyratit als Hitzequelle, um aus Sand und Kohle Silizium herzustellen. Die Effizienz wird an heißen Orten erhöht.
|
||||||
block.disassembler.description = Trennt Schlacke in winzige Mengen exotischer Mineralien, verliert dafür aber an Effizienz. Kann Thorium herstellen.
|
block.disassembler.description = Trennt Schlacke in winzige Mengen exotischer Mineralien, verliert dafür aber an Effizienz. Kann Thorium herstellen.
|
||||||
block.overdrive-dome.description = Erhöht die Geschwindigkeit von nahegelegenen Blöcken. \nBenötigt Phasengewebe und Silizium.
|
block.overdrive-dome.description = Erhöht die Geschwindigkeit von nahegelegenen Blöcken. \nBenötigt Phasengewebe und Silizium.
|
||||||
block.payload-conveyor.description = Bewegt größere Objeke, zum Beispiel Einheiten.
|
block.payload-conveyor.description = Bewegt größere Objekte, zum Beispiel Einheiten.
|
||||||
block.payload-router.description = Verteilt Einheiten auf bis zu drei Richtungen.
|
block.payload-router.description = Verteilt Einheiten auf bis zu drei Richtungen.
|
||||||
block.command-center.description = Steuert Einheiten mit verschiedenen Befehlen.
|
block.command-center.description = Steuert Einheiten mit verschiedenen Befehlen.
|
||||||
block.ground-factory.description = Stellt Bodeneinheiten her. Einheiten können einfach so verwendet oder in einem Rekonstrukteur verbessert werden.
|
block.ground-factory.description = Stellt Bodeneinheiten her. Einheiten können einfach so verwendet oder in einem Rekonstrukteur verbessert werden.
|
||||||
@@ -1450,7 +1453,7 @@ block.memory-cell.description = Speichert Informationen für einen Prozessor.
|
|||||||
block.memory-bank.description = Speichert Informationen für einen Prozessor. Hohe Kapazität.
|
block.memory-bank.description = Speichert Informationen für einen Prozessor. Hohe Kapazität.
|
||||||
block.logic-display.description = Zeigt mithilfe eines Prozessors Beliebiges an.
|
block.logic-display.description = Zeigt mithilfe eines Prozessors Beliebiges an.
|
||||||
block.large-logic-display.description = Zeigt mithilfe eines Prozessors Beliebiges an.
|
block.large-logic-display.description = Zeigt mithilfe eines Prozessors Beliebiges an.
|
||||||
block.interplanetary-accelerator.description = Ein riesen Railgun-Turm, der mithilfe des Elektromagnetismuses Kerne auf die nötige Geschwindigkeit bringt, um interplanetarisches Reisen zu ermöglichen.
|
block.interplanetary-accelerator.description = Ein Riesen-Railgun-Turm, der mithilfe des Elektromagnetismus Kerne auf die nötige Geschwindigkeit bringt, um interplanetarisches Reisen zu ermöglichen.
|
||||||
|
|
||||||
unit.dagger.description = Schießt normale Kugeln auf alle Feinde in der Nähe.
|
unit.dagger.description = Schießt normale Kugeln auf alle Feinde in der Nähe.
|
||||||
unit.mace.description = Schießt Feuer auf alle Gegner in der Nähe.
|
unit.mace.description = Schießt Feuer auf alle Gegner in der Nähe.
|
||||||
@@ -1475,7 +1478,7 @@ unit.eclipse.description = Feuert zwei durchdringende Laser und einen Flaksperrf
|
|||||||
unit.mono.description = Baut Automatisch Blei und Kupfer ab. Dieses wird in den Kern gebracht.
|
unit.mono.description = Baut Automatisch Blei und Kupfer ab. Dieses wird in den Kern gebracht.
|
||||||
unit.poly.description = Baut zerstörte Blöcke wieder auf und hilft anderen Einheiten beim Bauen.
|
unit.poly.description = Baut zerstörte Blöcke wieder auf und hilft anderen Einheiten beim Bauen.
|
||||||
unit.mega.description = Heilt automatisch beschädigte Blöcke. Kann kleine Blöcke oder Bodeneinheiten tragen.
|
unit.mega.description = Heilt automatisch beschädigte Blöcke. Kann kleine Blöcke oder Bodeneinheiten tragen.
|
||||||
unit.quad.description = Wirft große Bomben auf Bodenziele ab, welche Gegnern schaden und eingene Blöcke heilen. Kann Bodeneinheiten tragen.
|
unit.quad.description = Wirft große Bomben auf Bodenziele ab, welche Gegnern schaden und einige Blöcke heilen. Kann Bodeneinheiten tragen.
|
||||||
unit.oct.description = Schützt mithilfe eines regenerierenden Schildes andere Einheiten. Kann die meisten Bodeneinheiten tragen.
|
unit.oct.description = Schützt mithilfe eines regenerierenden Schildes andere Einheiten. Kann die meisten Bodeneinheiten tragen.
|
||||||
unit.risso.description = Schießt ein Sperrfeuer aus Raketen und Kugeln auf alle Gegner in der Nähe.
|
unit.risso.description = Schießt ein Sperrfeuer aus Raketen und Kugeln auf alle Gegner in der Nähe.
|
||||||
unit.minke.description = Schießt Geschosse und Kugeln auf Feinde.
|
unit.minke.description = Schießt Geschosse und Kugeln auf Feinde.
|
||||||
|
|||||||
@@ -196,6 +196,7 @@ servers.local = Serwery Lokalne
|
|||||||
servers.remote = Serwery Zdalne
|
servers.remote = Serwery Zdalne
|
||||||
servers.global = Serwery Publiczne
|
servers.global = Serwery Publiczne
|
||||||
|
|
||||||
|
servers.disclaimer = Serwery społeczności [accent]nie są[] w posiadaniu ani nie moderuje nimi twórca gry.\n\nSerwery mogą posiadać zawartość stworzoną przez graczy, która może być nieodpowiednia dla wszystkich grup wiekowych.
|
||||||
servers.showhidden = Pokaż Ukryte Serwery
|
servers.showhidden = Pokaż Ukryte Serwery
|
||||||
server.shown = Pokazane
|
server.shown = Pokazane
|
||||||
server.hidden = Ukryte
|
server.hidden = Ukryte
|
||||||
@@ -1279,6 +1280,10 @@ hint.payloadDrop.mobile = [accent]Kliknij i przytrzymaj[] w puste miejsce by opu
|
|||||||
hint.waveFire = [accent]Strumień[] wypełniony wodą będzie gasić pobiskie pożary.
|
hint.waveFire = [accent]Strumień[] wypełniony wodą będzie gasić pobiskie pożary.
|
||||||
hint.generator = \uf879 [accent]Generatory Spalinowe[] spalają węgiel i przekuzują moc do pobliskich bloków.\n\nMożesz powiększyć odległość transmitowanej mocy używająć \uf87f [accent]Węzeły Prądu[].
|
hint.generator = \uf879 [accent]Generatory Spalinowe[] spalają węgiel i przekuzują moc do pobliskich bloków.\n\nMożesz powiększyć odległość transmitowanej mocy używająć \uf87f [accent]Węzeły Prądu[].
|
||||||
hint.guardian = Jednostki [accent]Strażnicze[] są uzbrojone. Słaba amunicja - taka jak [accent]Miedź[] oraz [accent]Ołów[] [scarlet]nie jest efektywna[].\n\nUżyj lepszych działek takich jak \uf835 [accent]Naładowane Grafitem[] \uf861Duo/\uf859Salwa by pozbyć się strażników.
|
hint.guardian = Jednostki [accent]Strażnicze[] są uzbrojone. Słaba amunicja - taka jak [accent]Miedź[] oraz [accent]Ołów[] [scarlet]nie jest efektywna[].\n\nUżyj lepszych działek takich jak \uf835 [accent]Naładowane Grafitem[] \uf861Duo/\uf859Salwa by pozbyć się strażników.
|
||||||
|
hint.coreUpgrade = Rdzenie mogą być ulepszone poprzez [accent]płożenie na nich rdzeń wyższego poziomu[].\n\nPołóż rdzeń [accent]Fundacji[] na rdzeń:[accent]Odłamek[] core. Żadna przeszkoda ani blok nie może stać na miejscu rdzenia.
|
||||||
|
hint.presetLaunch = Szare [accent]sektory[], takie jak [accent]Zamrożony Las[], to sektory do których możesz dotrzeć z każdego miejsca. Nie wymagają podbicia pobliskiego terenu.\n\n[accent]Ponumerowane sektory[], takie jak ten, [accent]są dodatkowe[].
|
||||||
|
hint.coreIncinerate = Jak rdzeń zostanie w pełni wypełniony danym przedmiotem, reszta przedmiotów tego typu zostanie [accent]spalona[].
|
||||||
|
hint.coopCampaign = Gdy grasz [accent]kooperacyjną kampanie[], przedmioty które są produkowane na mapie trafią także [accent]dotwoich lokalnych sektorów[].\n\nWszelkie nowe badania przeprowadzone przez hosta są również przenoszone.
|
||||||
|
|
||||||
item.copper.description = Przydatny materiał budowlany. Szeroko używany w prawie każdej konstrukcji.
|
item.copper.description = Przydatny materiał budowlany. Szeroko używany w prawie każdej konstrukcji.
|
||||||
item.copper.details = Miedź. Nienormalnie obfity metal na Serpulo. Strukturalnie słaba, chyba że zostanie wzmocniona.
|
item.copper.details = Miedź. Nienormalnie obfity metal na Serpulo. Strukturalnie słaba, chyba że zostanie wzmocniona.
|
||||||
@@ -1424,7 +1429,7 @@ block.ripple.description = Duża wieża artyleryjska, która strzela jednocześn
|
|||||||
block.cyclone.description = Duża szybkostrzelna wieża.
|
block.cyclone.description = Duża szybkostrzelna wieża.
|
||||||
block.spectre.description = Duże działo dwulufowe, które strzela potężnymi pociskami przebijającymi pancerz w jednostki naziemne i powietrzne.
|
block.spectre.description = Duże działo dwulufowe, które strzela potężnymi pociskami przebijającymi pancerz w jednostki naziemne i powietrzne.
|
||||||
block.meltdown.description = Duże działo laserowe, które strzela potężnymi wiązkami dalekiego zasięgu. Wymaga chłodzenia.
|
block.meltdown.description = Duże działo laserowe, które strzela potężnymi wiązkami dalekiego zasięgu. Wymaga chłodzenia.
|
||||||
block.foreshadow.description = Fires a large single-target bolt over long distances.
|
block.foreshadow.description = Strzela potężnym pociskiem z daleka we wrogów.
|
||||||
block.repair-point.description = Bez przerw naprawia najbliższą uszkodzoną jednostkę w jego zasięgu.
|
block.repair-point.description = Bez przerw naprawia najbliższą uszkodzoną jednostkę w jego zasięgu.
|
||||||
block.segment.description = Uszkadza i niszczy wrogie pociskiski poza laserami.
|
block.segment.description = Uszkadza i niszczy wrogie pociskiski poza laserami.
|
||||||
block.parallax.description = Wykorzystuje laser, który przyciąga do siebie wrogów, zadając im obrażenia.
|
block.parallax.description = Wykorzystuje laser, który przyciąga do siebie wrogów, zadając im obrażenia.
|
||||||
|
|||||||
@@ -1283,6 +1283,7 @@ hint.guardian = Unitățile [accent]Gardian[] au armuri puternice. Munițiile sl
|
|||||||
hint.coreUpgrade = Un nucleu poate pot fi îmbunătățit [accent]plasând o alt nucleu mai bun peste el[].\n\nPlasează un nucleu [accent]Foundation[] peste nucleul [accent]Shard[]. Nucleul nu poate fi plasat decât pe alte nuclee. Asigură-te că nu sunt alte benzi sau obstacole care să împiedice plasarea.
|
hint.coreUpgrade = Un nucleu poate pot fi îmbunătățit [accent]plasând o alt nucleu mai bun peste el[].\n\nPlasează un nucleu [accent]Foundation[] peste nucleul [accent]Shard[]. Nucleul nu poate fi plasat decât pe alte nuclee. Asigură-te că nu sunt alte benzi sau obstacole care să împiedice plasarea.
|
||||||
hint.presetLaunch = Poți lansa de oriunde în sectoarele gri, precum [accent]Pădurea Glacială[]. Ele sunt [accent]zone[] speciale [accent]de aterizare[]. Nu ai nevoie să capturezi sectoarele învecinate pt a lansa.\n\n[accent]Sectoarele numerotate[], ca acesta, sunt [accent]opționale[].
|
hint.presetLaunch = Poți lansa de oriunde în sectoarele gri, precum [accent]Pădurea Glacială[]. Ele sunt [accent]zone[] speciale [accent]de aterizare[]. Nu ai nevoie să capturezi sectoarele învecinate pt a lansa.\n\n[accent]Sectoarele numerotate[], ca acesta, sunt [accent]opționale[].
|
||||||
hint.coreIncinerate = După ce nucleul se umple până la refuz cu un tip de material, toate materialele în plus de acel tip care încearcă să între în nucleu sunt [accent]incinerate[].
|
hint.coreIncinerate = După ce nucleul se umple până la refuz cu un tip de material, toate materialele în plus de acel tip care încearcă să între în nucleu sunt [accent]incinerate[].
|
||||||
|
hint.coopCampaign = Când joci [accent]campania cooperând cu alți jucători[], materialele produse în sectorul curent vor fi transferate și către [accent]sectoarele tale locale[].\n\nDe asemenea, vei debloca tot ceea ce cercetează gazda.
|
||||||
|
|
||||||
item.copper.description = Folosit în tot felul de construcții și muniție.
|
item.copper.description = Folosit în tot felul de construcții și muniție.
|
||||||
item.copper.details = Cupru. Metal anormal de abundent pe Serpulo. Structural slab dacă nu este consolidat.
|
item.copper.details = Cupru. Metal anormal de abundent pe Serpulo. Structural slab dacă nu este consolidat.
|
||||||
|
|||||||
@@ -84,6 +84,7 @@ amrsoll
|
|||||||
ねらひかだ
|
ねらひかだ
|
||||||
Draco
|
Draco
|
||||||
Quezler
|
Quezler
|
||||||
|
killall -q
|
||||||
Alicila
|
Alicila
|
||||||
Daniel Dusek
|
Daniel Dusek
|
||||||
DeltaNedas
|
DeltaNedas
|
||||||
|
|||||||
Binary file not shown.
@@ -17,6 +17,7 @@ import mindustry.game.*;
|
|||||||
import mindustry.gen.*;
|
import mindustry.gen.*;
|
||||||
import mindustry.input.*;
|
import mindustry.input.*;
|
||||||
import mindustry.io.*;
|
import mindustry.io.*;
|
||||||
|
import mindustry.logic.*;
|
||||||
import mindustry.maps.Map;
|
import mindustry.maps.Map;
|
||||||
import mindustry.maps.*;
|
import mindustry.maps.*;
|
||||||
import mindustry.mod.*;
|
import mindustry.mod.*;
|
||||||
@@ -67,6 +68,8 @@ public class Vars implements Loadable{
|
|||||||
public static final String reportIssueURL = "https://github.com/Anuken/Mindustry/issues/new?labels=bug&template=bug_report.md";
|
public static final String reportIssueURL = "https://github.com/Anuken/Mindustry/issues/new?labels=bug&template=bug_report.md";
|
||||||
/** list of built-in servers.*/
|
/** list of built-in servers.*/
|
||||||
public static final Seq<ServerGroup> defaultServers = Seq.with();
|
public static final Seq<ServerGroup> defaultServers = Seq.with();
|
||||||
|
/** maximum size of any block, do not change unless you know what you're doing */
|
||||||
|
public static final int maxBlockSize = 16;
|
||||||
/** maximum distance between mine and core that supports automatic transferring */
|
/** maximum distance between mine and core that supports automatic transferring */
|
||||||
public static final float mineTransferRange = 220f;
|
public static final float mineTransferRange = 220f;
|
||||||
/** max chat message length */
|
/** max chat message length */
|
||||||
@@ -193,6 +196,7 @@ public class Vars implements Loadable{
|
|||||||
public static BeControl becontrol;
|
public static BeControl becontrol;
|
||||||
public static AsyncCore asyncCore;
|
public static AsyncCore asyncCore;
|
||||||
public static BaseRegistry bases;
|
public static BaseRegistry bases;
|
||||||
|
public static GlobalConstants constants;
|
||||||
|
|
||||||
public static Universe universe;
|
public static Universe universe;
|
||||||
public static World world;
|
public static World world;
|
||||||
@@ -266,6 +270,7 @@ public class Vars implements Loadable{
|
|||||||
indexer = new BlockIndexer();
|
indexer = new BlockIndexer();
|
||||||
pathfinder = new Pathfinder();
|
pathfinder = new Pathfinder();
|
||||||
bases = new BaseRegistry();
|
bases = new BaseRegistry();
|
||||||
|
constants = new GlobalConstants();
|
||||||
|
|
||||||
state = new GameState();
|
state = new GameState();
|
||||||
|
|
||||||
|
|||||||
@@ -55,6 +55,12 @@ public class WaveSpawner{
|
|||||||
public void spawnEnemies(){
|
public void spawnEnemies(){
|
||||||
spawning = true;
|
spawning = true;
|
||||||
|
|
||||||
|
eachGroundSpawn((spawnX, spawnY, doShockwave) -> {
|
||||||
|
if(doShockwave){
|
||||||
|
doShockwave(spawnX, spawnY);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
for(SpawnGroup group : state.rules.spawns){
|
for(SpawnGroup group : state.rules.spawns){
|
||||||
if(group.type == null) continue;
|
if(group.type == null) continue;
|
||||||
|
|
||||||
@@ -86,18 +92,12 @@ public class WaveSpawner{
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
eachGroundSpawn((spawnX, spawnY, doShockwave) -> {
|
|
||||||
if(doShockwave){
|
|
||||||
doShockwave(spawnX, spawnY);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
Time.runTask(121f, () -> spawning = false);
|
Time.runTask(121f, () -> spawning = false);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void doShockwave(float x, float y){
|
public void doShockwave(float x, float y){
|
||||||
Time.run(20f, () -> Fx.spawnShockwave.at(x, y, state.rules.dropZoneRadius));
|
Fx.spawnShockwave.at(x, y, state.rules.dropZoneRadius);
|
||||||
Time.run(40f, () -> Damage.damage(state.rules.waveTeam, x, y, state.rules.dropZoneRadius, 99999999f, true));
|
Damage.damage(state.rules.waveTeam, x, y, state.rules.dropZoneRadius, 99999999f, true);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void eachGroundSpawn(Intc2 cons){
|
public void eachGroundSpawn(Intc2 cons){
|
||||||
|
|||||||
@@ -45,8 +45,18 @@ public class BuilderAI extends AIController{
|
|||||||
//approach request if building
|
//approach request if building
|
||||||
BuildPlan req = unit.buildPlan();
|
BuildPlan req = unit.buildPlan();
|
||||||
|
|
||||||
|
//clear break plan if another player is breaking something.
|
||||||
|
if(!req.breaking && timer.get(timerTarget2, 40f)){
|
||||||
|
for(Player player : Groups.player){
|
||||||
|
if(player.isBuilder() && player.unit().activelyBuilding() && player.unit().buildPlan().samePos(req) && player.unit().buildPlan().breaking){
|
||||||
|
unit.plans.removeFirst();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
boolean valid =
|
boolean valid =
|
||||||
(req.tile() != null && req.tile().build instanceof ConstructBuild && req.tile().<ConstructBuild>bc().cblock == req.block) ||
|
(req.tile() != null && req.tile().build instanceof ConstructBuild cons && cons.cblock == req.block) ||
|
||||||
(req.breaking ?
|
(req.breaking ?
|
||||||
Build.validBreak(unit.team(), req.x, req.y) :
|
Build.validBreak(unit.team(), req.x, req.y) :
|
||||||
Build.validPlace(req.block, unit.team(), req.x, req.y, req.rotation));
|
Build.validPlace(req.block, unit.team(), req.x, req.y, req.rotation));
|
||||||
|
|||||||
@@ -103,7 +103,7 @@ public class LogicAI extends AIController{
|
|||||||
//look where moving if there's nothing to aim at
|
//look where moving if there's nothing to aim at
|
||||||
if(!shoot){
|
if(!shoot){
|
||||||
unit.lookAt(unit.prefRotation());
|
unit.lookAt(unit.prefRotation());
|
||||||
}else if(unit.hasWeapons()){ //if there is, look at the object
|
}else if(unit.hasWeapons() && unit.mounts.length > 0){ //if there is, look at the object
|
||||||
unit.lookAt(unit.mounts[0].aimX, unit.mounts[0].aimY);
|
unit.lookAt(unit.mounts[0].aimX, unit.mounts[0].aimY);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -4,6 +4,7 @@ import arc.*;
|
|||||||
import arc.graphics.*;
|
import arc.graphics.*;
|
||||||
import arc.graphics.g2d.*;
|
import arc.graphics.g2d.*;
|
||||||
import arc.struct.*;
|
import arc.struct.*;
|
||||||
|
import mindustry.*;
|
||||||
import mindustry.ctype.*;
|
import mindustry.ctype.*;
|
||||||
import mindustry.entities.bullet.*;
|
import mindustry.entities.bullet.*;
|
||||||
import mindustry.gen.*;
|
import mindustry.gen.*;
|
||||||
@@ -134,7 +135,7 @@ public class Blocks implements ContentList{
|
|||||||
|
|
||||||
//Registers build blocks
|
//Registers build blocks
|
||||||
//no reference is needed here since they can be looked up by name later
|
//no reference is needed here since they can be looked up by name later
|
||||||
for(int i = 1; i <= ConstructBlock.maxSize; i++){
|
for(int i = 1; i <= Vars.maxBlockSize; i++){
|
||||||
new ConstructBlock(i);
|
new ConstructBlock(i);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -613,6 +614,7 @@ public class Blocks implements ContentList{
|
|||||||
craftTime = 75f;
|
craftTime = 75f;
|
||||||
size = 3;
|
size = 3;
|
||||||
hasPower = true;
|
hasPower = true;
|
||||||
|
itemCapacity = 20;
|
||||||
|
|
||||||
consumes.power(4f);
|
consumes.power(4f);
|
||||||
consumes.items(with(Items.copper, 3, Items.lead, 4, Items.titanium, 2, Items.silicon, 3));
|
consumes.items(with(Items.copper, 3, Items.lead, 4, Items.titanium, 2, Items.silicon, 3));
|
||||||
@@ -1514,7 +1516,7 @@ public class Blocks implements ContentList{
|
|||||||
}};
|
}};
|
||||||
|
|
||||||
lancer = new PowerTurret("lancer"){{
|
lancer = new PowerTurret("lancer"){{
|
||||||
requirements(Category.turret, with(Items.copper, 25, Items.lead, 50, Items.silicon, 45));
|
requirements(Category.turret, with(Items.copper, 60, Items.lead, 70, Items.silicon, 50));
|
||||||
range = 165f;
|
range = 165f;
|
||||||
chargeTime = 40f;
|
chargeTime = 40f;
|
||||||
chargeMaxDelay = 30f;
|
chargeMaxDelay = 30f;
|
||||||
@@ -1547,7 +1549,7 @@ public class Blocks implements ContentList{
|
|||||||
}};
|
}};
|
||||||
|
|
||||||
arc = new PowerTurret("arc"){{
|
arc = new PowerTurret("arc"){{
|
||||||
requirements(Category.turret, with(Items.copper, 35, Items.lead, 50));
|
requirements(Category.turret, with(Items.copper, 50, Items.lead, 50));
|
||||||
shootType = new LightningBulletType(){{
|
shootType = new LightningBulletType(){{
|
||||||
damage = 20;
|
damage = 20;
|
||||||
lightningLength = 25;
|
lightningLength = 25;
|
||||||
@@ -1601,7 +1603,7 @@ public class Blocks implements ContentList{
|
|||||||
}};
|
}};
|
||||||
|
|
||||||
salvo = new ItemTurret("salvo"){{
|
salvo = new ItemTurret("salvo"){{
|
||||||
requirements(Category.turret, with(Items.copper, 105, Items.graphite, 95, Items.titanium, 60));
|
requirements(Category.turret, with(Items.copper, 100, Items.graphite, 90, Items.titanium, 60));
|
||||||
ammo(
|
ammo(
|
||||||
Items.copper, Bullets.standardCopper,
|
Items.copper, Bullets.standardCopper,
|
||||||
Items.graphite, Bullets.standardDense,
|
Items.graphite, Bullets.standardDense,
|
||||||
|
|||||||
@@ -18,7 +18,7 @@ public class Liquids implements ContentList{
|
|||||||
|
|
||||||
slag = new Liquid("slag", Color.valueOf("ffa166")){{
|
slag = new Liquid("slag", Color.valueOf("ffa166")){{
|
||||||
temperature = 1f;
|
temperature = 1f;
|
||||||
viscosity = 0.8f;
|
viscosity = 0.7f;
|
||||||
effect = StatusEffects.melting;
|
effect = StatusEffects.melting;
|
||||||
lightColor = Color.valueOf("f0511d").a(0.4f);
|
lightColor = Color.valueOf("f0511d").a(0.4f);
|
||||||
}};
|
}};
|
||||||
|
|||||||
@@ -96,6 +96,7 @@ public class ContentLoader{
|
|||||||
/** Calls Content#init() on everything. Use only after all modules have been created.*/
|
/** Calls Content#init() on everything. Use only after all modules have been created.*/
|
||||||
public void init(){
|
public void init(){
|
||||||
initialize(Content::init);
|
initialize(Content::init);
|
||||||
|
if(constants != null) constants.init();
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Calls Content#load() on everything. Use only after all modules have been created on the client.*/
|
/** Calls Content#load() on everything. Use only after all modules have been created on the client.*/
|
||||||
|
|||||||
@@ -41,7 +41,7 @@ public class NetServer implements ApplicationListener{
|
|||||||
private static final Vec2 vector = new Vec2();
|
private static final Vec2 vector = new Vec2();
|
||||||
private static final Rect viewport = new Rect();
|
private static final Rect viewport = new Rect();
|
||||||
/** If a player goes away of their server-side coordinates by this distance, they get teleported back. */
|
/** If a player goes away of their server-side coordinates by this distance, they get teleported back. */
|
||||||
private static final float correctDist = tilesize * 8f;
|
private static final float correctDist = tilesize * 12f;
|
||||||
|
|
||||||
public final Administration admins = new Administration();
|
public final Administration admins = new Administration();
|
||||||
public final CommandHandler clientCommands = new CommandHandler("/");
|
public final CommandHandler clientCommands = new CommandHandler("/");
|
||||||
|
|||||||
@@ -102,13 +102,11 @@ abstract class BuilderComp implements Posc, Teamc, Rotc{
|
|||||||
}
|
}
|
||||||
|
|
||||||
//if there is no core to build with or no build entity, stop building!
|
//if there is no core to build with or no build entity, stop building!
|
||||||
if((core == null && !infinite) || !(tile.build instanceof ConstructBuild)){
|
if((core == null && !infinite) || !(tile.build instanceof ConstructBuild entity)){
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
//otherwise, update it.
|
//otherwise, update it.
|
||||||
ConstructBuild entity = tile.bc();
|
|
||||||
|
|
||||||
if(current.breaking){
|
if(current.breaking){
|
||||||
entity.deconstruct(self(), core, 1f / entity.buildCost * Time.delta * type.buildSpeed * state.rules.buildSpeedMultiplier);
|
entity.deconstruct(self(), core, 1f / entity.buildCost * Time.delta * type.buildSpeed * state.rules.buildSpeedMultiplier);
|
||||||
}else{
|
}else{
|
||||||
@@ -182,8 +180,8 @@ abstract class BuilderComp implements Posc, Teamc, Rotc{
|
|||||||
plans.remove(replace);
|
plans.remove(replace);
|
||||||
}
|
}
|
||||||
Tile tile = world.tile(place.x, place.y);
|
Tile tile = world.tile(place.x, place.y);
|
||||||
if(tile != null && tile.build instanceof ConstructBuild){
|
if(tile != null && tile.build instanceof ConstructBuild cons){
|
||||||
place.progress = tile.<ConstructBuild>bc().progress;
|
place.progress = cons.progress;
|
||||||
}
|
}
|
||||||
if(tail){
|
if(tail){
|
||||||
plans.addLast(place);
|
plans.addLast(place);
|
||||||
|
|||||||
@@ -201,7 +201,7 @@ abstract class BuildingComp implements Posc, Teamc, Healthc, Buildingc, Timerc,
|
|||||||
|
|
||||||
if(self() instanceof ConstructBuild entity){
|
if(self() instanceof ConstructBuild entity){
|
||||||
//update block to reflect the fact that something was being constructed
|
//update block to reflect the fact that something was being constructed
|
||||||
if(entity.cblock != null && entity.cblock.synthetic()){
|
if(entity.cblock != null && entity.cblock.synthetic() && entity.wasConstructing){
|
||||||
block = entity.cblock;
|
block = entity.cblock;
|
||||||
}else{
|
}else{
|
||||||
//otherwise this was a deconstruction that was interrupted, don't want to rebuild that
|
//otherwise this was a deconstruction that was interrupted, don't want to rebuild that
|
||||||
|
|||||||
@@ -117,6 +117,8 @@ abstract class PayloadComp implements Posc, Rotc, Hitboxc, Unitc{
|
|||||||
u.rotation(rotation);
|
u.rotation(rotation);
|
||||||
//reset the ID to a new value to make sure it's synced
|
//reset the ID to a new value to make sure it's synced
|
||||||
u.id = EntityGroup.nextId();
|
u.id = EntityGroup.nextId();
|
||||||
|
//decrement count to prevent double increment
|
||||||
|
if(!u.isAdded()) u.team.data().updateCount(u.type, -1);
|
||||||
u.add();
|
u.add();
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
|
|||||||
@@ -61,6 +61,10 @@ public class BuildPlan implements Position{
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public boolean samePos(BuildPlan other){
|
||||||
|
return x == other.x && y == other.y;
|
||||||
|
}
|
||||||
|
|
||||||
/** Transforms the internal position of this config using the specified function, and return the result. */
|
/** Transforms the internal position of this config using the specified function, and return the result. */
|
||||||
public static Object pointConfig(Block block, Object config, Cons<Point2> cons){
|
public static Object pointConfig(Block block, Object config, Cons<Point2> cons){
|
||||||
if(config instanceof Point2){
|
if(config instanceof Point2){
|
||||||
|
|||||||
@@ -91,18 +91,23 @@ public class MinimapRenderer implements Disposable{
|
|||||||
rect.set((dx - sz) * tilesize, (dy - sz) * tilesize, sz * 2 * tilesize, sz * 2 * tilesize);
|
rect.set((dx - sz) * tilesize, (dy - sz) * tilesize, sz * 2 * tilesize, sz * 2 * tilesize);
|
||||||
|
|
||||||
for(Unit unit : units){
|
for(Unit unit : units){
|
||||||
float rx = !withLabels ? (unit.x() - rect.x) / rect.width * w : unit.x() / (world.width() * tilesize) * w;
|
float rx = !withLabels ? (unit.x - rect.x) / rect.width * w : unit.x / (world.width() * tilesize) * w;
|
||||||
float ry = !withLabels ? (unit.y() - rect.y) / rect.width * h : unit.y() / (world.height() * tilesize) * h;
|
float ry = !withLabels ? (unit.y - rect.y) / rect.width * h : unit.y / (world.height() * tilesize) * h;
|
||||||
|
|
||||||
Draw.mixcol(unit.team().color, 1f);
|
Draw.mixcol(unit.team().color, 1f);
|
||||||
float scale = Scl.scl(1f) / 2f * scaling * 32f;
|
float scale = Scl.scl(1f) / 2f * scaling * 32f;
|
||||||
Draw.rect(unit.type.icon(Cicon.full), x + rx, y + ry, scale, scale, unit.rotation() - 90);
|
Draw.rect(unit.type.icon(Cicon.full), x + rx, y + ry, scale, scale, unit.rotation() - 90);
|
||||||
Draw.reset();
|
Draw.reset();
|
||||||
|
}
|
||||||
|
|
||||||
//only disable player names in multiplayer
|
if(withLabels && net.active()){
|
||||||
if(withLabels && unit.isPlayer() && net.active()){
|
for(Player player : Groups.player){
|
||||||
Player pl = unit.getPlayer();
|
if(!player.dead()){
|
||||||
drawLabel(x + rx, y + ry, pl.name, unit.team().color);
|
float rx = player.x / (world.width() * tilesize) * w;
|
||||||
|
float ry = player.y / (world.height() * tilesize) * h;
|
||||||
|
|
||||||
|
drawLabel(x + rx, y + ry, player.name, player.team().color);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -278,8 +278,10 @@ public abstract class InputHandler implements InputProcessor, GestureListener{
|
|||||||
throw new ValidateException(player, "Player cannot drop an item.");
|
throw new ValidateException(player, "Player cannot drop an item.");
|
||||||
}
|
}
|
||||||
|
|
||||||
Fx.dropItem.at(player.x, player.y, angle, Color.white, player.unit().item());
|
player.unit().eachGroup(unit -> {
|
||||||
player.unit().clearItem();
|
Fx.dropItem.at(unit.x, unit.y, angle, Color.white, unit.item());
|
||||||
|
unit.clearItem();
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
@Remote(targets = Loc.both, called = Loc.server, forward = true, unreliable = true)
|
@Remote(targets = Loc.both, called = Loc.server, forward = true, unreliable = true)
|
||||||
@@ -514,7 +516,7 @@ public abstract class InputHandler implements InputProcessor, GestureListener{
|
|||||||
|
|
||||||
public boolean requestMatches(BuildPlan request){
|
public boolean requestMatches(BuildPlan request){
|
||||||
Tile tile = world.tile(request.x, request.y);
|
Tile tile = world.tile(request.x, request.y);
|
||||||
return tile != null && tile.block() instanceof ConstructBlock && tile.<ConstructBuild>bc().cblock == request.block;
|
return tile != null && tile.build instanceof ConstructBuild cons && cons.cblock == request.block;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void drawBreaking(int x, int y){
|
public void drawBreaking(int x, int y){
|
||||||
|
|||||||
78
core/src/mindustry/logic/GlobalConstants.java
Normal file
78
core/src/mindustry/logic/GlobalConstants.java
Normal file
@@ -0,0 +1,78 @@
|
|||||||
|
package mindustry.logic;
|
||||||
|
|
||||||
|
import arc.struct.*;
|
||||||
|
import mindustry.*;
|
||||||
|
import mindustry.content.*;
|
||||||
|
import mindustry.logic.LExecutor.*;
|
||||||
|
import mindustry.type.*;
|
||||||
|
import mindustry.world.*;
|
||||||
|
|
||||||
|
/** Stores global constants for logic processors. */
|
||||||
|
public class GlobalConstants{
|
||||||
|
private ObjectIntMap<String> namesToIds = new ObjectIntMap<>();
|
||||||
|
private Seq<Var> vars = new Seq<>(Var.class);
|
||||||
|
|
||||||
|
public void init(){
|
||||||
|
put("the end", null);
|
||||||
|
//add default constants
|
||||||
|
put("false", 0);
|
||||||
|
put("true", 1);
|
||||||
|
put("null", null);
|
||||||
|
|
||||||
|
//store base content
|
||||||
|
|
||||||
|
for(Item item : Vars.content.items()){
|
||||||
|
put("@" + item.name, item);
|
||||||
|
}
|
||||||
|
|
||||||
|
for(Liquid liquid : Vars.content.liquids()){
|
||||||
|
put("@" + liquid.name, liquid);
|
||||||
|
}
|
||||||
|
|
||||||
|
for(Block block : Vars.content.blocks()){
|
||||||
|
if(block.synthetic()){
|
||||||
|
put("@" + block.name, block);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//used as a special value for any environmental solid block
|
||||||
|
put("@solid", Blocks.stoneWall);
|
||||||
|
put("@air", Blocks.air);
|
||||||
|
|
||||||
|
for(UnitType type : Vars.content.units()){
|
||||||
|
put("@" + type.name, type);
|
||||||
|
}
|
||||||
|
|
||||||
|
//store sensor constants
|
||||||
|
for(LAccess sensor : LAccess.all){
|
||||||
|
put("@" + sensor.name(), sensor);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/** @return a constant ID > 0 if there is a constant with this name, otherwise -1. */
|
||||||
|
public int get(String name){
|
||||||
|
return namesToIds.get(name, -1);
|
||||||
|
}
|
||||||
|
|
||||||
|
/** @return a constant variable by ID. ID is not bound checked and must be positive. */
|
||||||
|
public Var get(int id){
|
||||||
|
return vars.items[id];
|
||||||
|
}
|
||||||
|
|
||||||
|
/** Adds a constant value by name. */
|
||||||
|
public Var put(String name, Object value){
|
||||||
|
Var var = new Var(name);
|
||||||
|
var.constant = true;
|
||||||
|
if(value instanceof Number num){
|
||||||
|
var.numval = num.doubleValue();
|
||||||
|
}else{
|
||||||
|
var.isobj = true;
|
||||||
|
var.objval = value;
|
||||||
|
}
|
||||||
|
|
||||||
|
int index = vars.size;
|
||||||
|
namesToIds.put(name, index);
|
||||||
|
vars.add(var);
|
||||||
|
return var;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -4,12 +4,9 @@ import arc.func.*;
|
|||||||
import arc.struct.*;
|
import arc.struct.*;
|
||||||
import arc.util.*;
|
import arc.util.*;
|
||||||
import mindustry.*;
|
import mindustry.*;
|
||||||
import mindustry.content.*;
|
|
||||||
import mindustry.gen.*;
|
import mindustry.gen.*;
|
||||||
import mindustry.logic.LExecutor.*;
|
import mindustry.logic.LExecutor.*;
|
||||||
import mindustry.logic.LStatements.*;
|
import mindustry.logic.LStatements.*;
|
||||||
import mindustry.type.*;
|
|
||||||
import mindustry.world.*;
|
|
||||||
|
|
||||||
/** "Compiles" a sequence of statements into instructions. */
|
/** "Compiles" a sequence of statements into instructions. */
|
||||||
public class LAssembler{
|
public class LAssembler{
|
||||||
@@ -31,42 +28,6 @@ public class LAssembler{
|
|||||||
putConst("@unit", null);
|
putConst("@unit", null);
|
||||||
//reference to self
|
//reference to self
|
||||||
putConst("@this", null);
|
putConst("@this", null);
|
||||||
|
|
||||||
//add default constants
|
|
||||||
putConst("false", 0);
|
|
||||||
putConst("true", 1);
|
|
||||||
putConst("null", null);
|
|
||||||
|
|
||||||
//store base content (TODO hacky?)
|
|
||||||
|
|
||||||
for(Item item : Vars.content.items()){
|
|
||||||
putConst("@" + item.name, item);
|
|
||||||
}
|
|
||||||
|
|
||||||
for(Liquid liquid : Vars.content.liquids()){
|
|
||||||
putConst("@" + liquid.name, liquid);
|
|
||||||
}
|
|
||||||
|
|
||||||
for(Block block : Vars.content.blocks()){
|
|
||||||
if(block.synthetic()){
|
|
||||||
putConst("@" + block.name, block);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
//used as a special value for any environmental solid block
|
|
||||||
putConst("@solid", Blocks.stoneWall);
|
|
||||||
|
|
||||||
putConst("@air", Blocks.air);
|
|
||||||
|
|
||||||
for(UnitType type : Vars.content.units()){
|
|
||||||
putConst("@" + type.name, type);
|
|
||||||
}
|
|
||||||
|
|
||||||
//store sensor constants
|
|
||||||
|
|
||||||
for(LAccess sensor : LAccess.all){
|
|
||||||
putConst("@" + sensor.name(), sensor);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public static LAssembler assemble(String data, int maxInstructions){
|
public static LAssembler assemble(String data, int maxInstructions){
|
||||||
@@ -185,6 +146,12 @@ public class LAssembler{
|
|||||||
/** @return a variable ID by name.
|
/** @return a variable ID by name.
|
||||||
* This may be a constant variable referring to a number or object. */
|
* This may be a constant variable referring to a number or object. */
|
||||||
public int var(String symbol){
|
public int var(String symbol){
|
||||||
|
int constId = Vars.constants.get(symbol);
|
||||||
|
if(constId > 0){
|
||||||
|
//global constants are *negated* and stored separately
|
||||||
|
return -constId;
|
||||||
|
}
|
||||||
|
|
||||||
symbol = symbol.trim();
|
symbol = symbol.trim();
|
||||||
|
|
||||||
//string case
|
//string case
|
||||||
|
|||||||
@@ -97,28 +97,33 @@ public class LExecutor{
|
|||||||
|
|
||||||
//region utility
|
//region utility
|
||||||
|
|
||||||
|
public Var var(int index){
|
||||||
|
//global constants have variable IDs < 0, and they are fetched from the global constants object after being negated
|
||||||
|
return index < 0 ? constants.get(-index) : vars[index];
|
||||||
|
}
|
||||||
|
|
||||||
public @Nullable Building building(int index){
|
public @Nullable Building building(int index){
|
||||||
Object o = vars[index].objval;
|
Object o = var(index).objval;
|
||||||
return vars[index].isobj && o instanceof Building building ? building : null;
|
return var(index).isobj && o instanceof Building building ? building : null;
|
||||||
}
|
}
|
||||||
|
|
||||||
public @Nullable Object obj(int index){
|
public @Nullable Object obj(int index){
|
||||||
Object o = vars[index].objval;
|
Object o = var(index).objval;
|
||||||
return vars[index].isobj ? o : null;
|
return var(index).isobj ? o : null;
|
||||||
}
|
}
|
||||||
|
|
||||||
public boolean bool(int index){
|
public boolean bool(int index){
|
||||||
Var v = vars[index];
|
Var v = var(index);
|
||||||
return v.isobj ? v.objval != null : Math.abs(v.numval) >= 0.00001;
|
return v.isobj ? v.objval != null : Math.abs(v.numval) >= 0.00001;
|
||||||
}
|
}
|
||||||
|
|
||||||
public double num(int index){
|
public double num(int index){
|
||||||
Var v = vars[index];
|
Var v = var(index);
|
||||||
return v.isobj ? v.objval != null ? 1 : 0 : Double.isNaN(v.numval) || Double.isInfinite(v.numval) ? 0 : v.numval;
|
return v.isobj ? v.objval != null ? 1 : 0 : Double.isNaN(v.numval) || Double.isInfinite(v.numval) ? 0 : v.numval;
|
||||||
}
|
}
|
||||||
|
|
||||||
public float numf(int index){
|
public float numf(int index){
|
||||||
Var v = vars[index];
|
Var v = var(index);
|
||||||
return v.isobj ? v.objval != null ? 1 : 0 : Double.isNaN(v.numval) || Double.isInfinite(v.numval) ? 0 : (float)v.numval;
|
return v.isobj ? v.objval != null ? 1 : 0 : Double.isNaN(v.numval) || Double.isInfinite(v.numval) ? 0 : (float)v.numval;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -131,7 +136,7 @@ public class LExecutor{
|
|||||||
}
|
}
|
||||||
|
|
||||||
public void setnum(int index, double value){
|
public void setnum(int index, double value){
|
||||||
Var v = vars[index];
|
Var v = var(index);
|
||||||
if(v.constant) return;
|
if(v.constant) return;
|
||||||
v.numval = Double.isNaN(value) || Double.isInfinite(value) ? 0 : value;
|
v.numval = Double.isNaN(value) || Double.isInfinite(value) ? 0 : value;
|
||||||
v.objval = null;
|
v.objval = null;
|
||||||
@@ -139,20 +144,21 @@ public class LExecutor{
|
|||||||
}
|
}
|
||||||
|
|
||||||
public void setobj(int index, Object value){
|
public void setobj(int index, Object value){
|
||||||
Var v = vars[index];
|
Var v = var(index);
|
||||||
if(v.constant) return;
|
if(v.constant) return;
|
||||||
v.objval = value;
|
v.objval = value;
|
||||||
v.isobj = true;
|
v.isobj = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void setconst(int index, Object value){
|
public void setconst(int index, Object value){
|
||||||
Var v = vars[index];
|
Var v = var(index);
|
||||||
v.objval = value;
|
v.objval = value;
|
||||||
v.isobj = true;
|
v.isobj = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
//endregion
|
//endregion
|
||||||
|
|
||||||
|
/** A logic variable. */
|
||||||
public static class Var{
|
public static class Var{
|
||||||
public final String name;
|
public final String name;
|
||||||
|
|
||||||
@@ -735,8 +741,8 @@ public class LExecutor{
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void run(LExecutor exec){
|
public void run(LExecutor exec){
|
||||||
Var v = exec.vars[to];
|
Var v = exec.var(to);
|
||||||
Var f = exec.vars[from];
|
Var f = exec.var(from);
|
||||||
|
|
||||||
//TODO error out when the from-value is a constant
|
//TODO error out when the from-value is a constant
|
||||||
if(!v.constant){
|
if(!v.constant){
|
||||||
@@ -769,8 +775,8 @@ public class LExecutor{
|
|||||||
if(op.unary){
|
if(op.unary){
|
||||||
exec.setnum(dest, op.function1.get(exec.num(a)));
|
exec.setnum(dest, op.function1.get(exec.num(a)));
|
||||||
}else{
|
}else{
|
||||||
Var va = exec.vars[a];
|
Var va = exec.var(a);
|
||||||
Var vb = exec.vars[b];
|
Var vb = exec.var(b);
|
||||||
|
|
||||||
if(op.objFunction2 != null && (va.isobj || vb.isobj)){
|
if(op.objFunction2 != null && (va.isobj || vb.isobj)){
|
||||||
//use object function if provided, and one of the variables is an object
|
//use object function if provided, and one of the variables is an object
|
||||||
@@ -788,7 +794,7 @@ public class LExecutor{
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void run(LExecutor exec){
|
public void run(LExecutor exec){
|
||||||
exec.vars[varCounter].numval = exec.instructions.length;
|
exec.var(varCounter).numval = exec.instructions.length;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -876,7 +882,7 @@ public class LExecutor{
|
|||||||
if(exec.textBuffer.length() >= maxTextBuffer) return;
|
if(exec.textBuffer.length() >= maxTextBuffer) return;
|
||||||
|
|
||||||
//this should avoid any garbage allocation
|
//this should avoid any garbage allocation
|
||||||
Var v = exec.vars[value];
|
Var v = exec.var(value);
|
||||||
if(v.isobj && value != 0){
|
if(v.isobj && value != 0){
|
||||||
String strValue =
|
String strValue =
|
||||||
v.objval == null ? "null" :
|
v.objval == null ? "null" :
|
||||||
@@ -940,8 +946,8 @@ public class LExecutor{
|
|||||||
@Override
|
@Override
|
||||||
public void run(LExecutor exec){
|
public void run(LExecutor exec){
|
||||||
if(address != -1){
|
if(address != -1){
|
||||||
Var va = exec.vars[value];
|
Var va = exec.var(value);
|
||||||
Var vb = exec.vars[compare];
|
Var vb = exec.var(compare);
|
||||||
boolean cmp;
|
boolean cmp;
|
||||||
|
|
||||||
if(op.objFunction != null && (va.isobj || vb.isobj)){
|
if(op.objFunction != null && (va.isobj || vb.isobj)){
|
||||||
@@ -952,7 +958,7 @@ public class LExecutor{
|
|||||||
}
|
}
|
||||||
|
|
||||||
if(cmp){
|
if(cmp){
|
||||||
exec.vars[varCounter].numval = address;
|
exec.var(varCounter).numval = address;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -39,6 +39,8 @@ import mindustry.world.meta.*;
|
|||||||
import java.lang.reflect.*;
|
import java.lang.reflect.*;
|
||||||
import java.util.*;
|
import java.util.*;
|
||||||
|
|
||||||
|
import static mindustry.Vars.*;
|
||||||
|
|
||||||
@SuppressWarnings("unchecked")
|
@SuppressWarnings("unchecked")
|
||||||
public class ContentParser{
|
public class ContentParser{
|
||||||
private static final boolean ignoreUnknownFields = true;
|
private static final boolean ignoreUnknownFields = true;
|
||||||
@@ -250,8 +252,8 @@ public class ContentParser{
|
|||||||
|
|
||||||
readFields(block, value, true);
|
readFields(block, value, true);
|
||||||
|
|
||||||
if(block.size > ConstructBlock.maxSize){
|
if(block.size > maxBlockSize){
|
||||||
throw new IllegalArgumentException("Blocks cannot be larger than " + ConstructBlock.maxSize);
|
throw new IllegalArgumentException("Blocks cannot be larger than " + maxBlockSize);
|
||||||
}
|
}
|
||||||
|
|
||||||
//make block visible by default if there are requirements and no visibility set
|
//make block visible by default if there are requirements and no visibility set
|
||||||
|
|||||||
@@ -82,6 +82,10 @@ public class Bar extends Element{
|
|||||||
lastValue = computed;
|
lastValue = computed;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if(Float.isNaN(lastValue)) lastValue = 0;
|
||||||
|
if(Float.isInfinite(lastValue)) lastValue = 1f;
|
||||||
|
if(Float.isNaN(value)) value = 0;
|
||||||
|
if(Float.isInfinite(value)) value = 1f;
|
||||||
if(Float.isNaN(computed)) computed = 0;
|
if(Float.isNaN(computed)) computed = 0;
|
||||||
if(Float.isInfinite(computed)) computed = 1f;
|
if(Float.isInfinite(computed)) computed = 1f;
|
||||||
|
|
||||||
|
|||||||
@@ -413,6 +413,10 @@ public class PlanetDialog extends BaseDialog implements PlanetInterfaceRenderer{
|
|||||||
public void tap(InputEvent event, float x, float y, int count, KeyCode button){
|
public void tap(InputEvent event, float x, float y, int count, KeyCode button){
|
||||||
if(showing()) return;
|
if(showing()) return;
|
||||||
|
|
||||||
|
if(hovered != null && selected == hovered && count == 2){
|
||||||
|
playSelected();
|
||||||
|
}
|
||||||
|
|
||||||
if(hovered != null && (canSelect(hovered) || debugSelect)){
|
if(hovered != null && (canSelect(hovered) || debugSelect)){
|
||||||
selected = hovered;
|
selected = hovered;
|
||||||
}
|
}
|
||||||
@@ -762,7 +766,36 @@ public class PlanetDialog extends BaseDialog implements PlanetInterfaceRenderer{
|
|||||||
sector.isBeingPlayed() ? "@sectors.resume" :
|
sector.isBeingPlayed() ? "@sectors.resume" :
|
||||||
sector.hasBase() ? "@sectors.go" :
|
sector.hasBase() ? "@sectors.go" :
|
||||||
locked ? "@locked" : "@sectors.launch",
|
locked ? "@locked" : "@sectors.launch",
|
||||||
locked ? Icon.lock :Icon.play, () -> {
|
locked ? Icon.lock : Icon.play, () -> {
|
||||||
|
playSelected();
|
||||||
|
}).growX().height(54f).minWidth(170f).padTop(4).disabled(locked);
|
||||||
|
}
|
||||||
|
|
||||||
|
stable.pack();
|
||||||
|
stable.setPosition(x, y, Align.center);
|
||||||
|
|
||||||
|
stable.update(() -> {
|
||||||
|
if(selected != null){
|
||||||
|
if(launching){
|
||||||
|
stable.color.sub(0, 0, 0, 0.05f * Time.delta);
|
||||||
|
}else{
|
||||||
|
//fade out UI when not facing selected sector
|
||||||
|
Tmp.v31.set(selected.tile.v).rotate(Vec3.Y, -planets.planet.getRotation()).scl(-1f).nor();
|
||||||
|
float dot = planets.cam.direction.dot(Tmp.v31);
|
||||||
|
stable.color.a = Math.max(dot, 0f)*2f;
|
||||||
|
if(dot*2f <= -0.1f){
|
||||||
|
selected = null;
|
||||||
|
updateSelected();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
stable.act(0f);
|
||||||
|
}
|
||||||
|
|
||||||
|
void playSelected(){
|
||||||
|
Sector sector = selected;
|
||||||
|
|
||||||
if(sector.isBeingPlayed()){
|
if(sector.isBeingPlayed()){
|
||||||
//already at this sector
|
//already at this sector
|
||||||
@@ -815,30 +848,6 @@ public class PlanetDialog extends BaseDialog implements PlanetInterfaceRenderer{
|
|||||||
}
|
}
|
||||||
|
|
||||||
if(shouldHide) hide();
|
if(shouldHide) hide();
|
||||||
}).growX().height(54f).minWidth(170f).padTop(4).disabled(locked);
|
|
||||||
}
|
|
||||||
|
|
||||||
stable.pack();
|
|
||||||
stable.setPosition(x, y, Align.center);
|
|
||||||
|
|
||||||
stable.update(() -> {
|
|
||||||
if(selected != null){
|
|
||||||
if(launching){
|
|
||||||
stable.color.sub(0, 0, 0, 0.05f * Time.delta);
|
|
||||||
}else{
|
|
||||||
//fade out UI when not facing selected sector
|
|
||||||
Tmp.v31.set(selected.tile.v).rotate(Vec3.Y, -planets.planet.getRotation()).scl(-1f).nor();
|
|
||||||
float dot = planets.cam.direction.dot(Tmp.v31);
|
|
||||||
stable.color.a = Math.max(dot, 0f)*2f;
|
|
||||||
if(dot*2f <= -0.1f){
|
|
||||||
selected = null;
|
|
||||||
updateSelected();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
stable.act(0f);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public enum Mode{
|
public enum Mode{
|
||||||
|
|||||||
@@ -26,7 +26,7 @@ public class HintsFragment extends Fragment{
|
|||||||
private static final float foutTime = 0.6f;
|
private static final float foutTime = 0.6f;
|
||||||
|
|
||||||
/** All hints to be displayed in the game. */
|
/** All hints to be displayed in the game. */
|
||||||
public Seq<Hint> hints = Seq.with(DefaultHint.values());
|
public Seq<Hint> hints = new Seq<>().and(DefaultHint.values()).as();
|
||||||
|
|
||||||
@Nullable Hint current;
|
@Nullable Hint current;
|
||||||
Group group = new WidgetGroup();
|
Group group = new WidgetGroup();
|
||||||
|
|||||||
@@ -6,6 +6,7 @@ import arc.scene.*;
|
|||||||
import arc.scene.event.*;
|
import arc.scene.event.*;
|
||||||
import arc.scene.ui.*;
|
import arc.scene.ui.*;
|
||||||
import arc.scene.ui.layout.*;
|
import arc.scene.ui.layout.*;
|
||||||
|
import arc.struct.*;
|
||||||
import arc.util.*;
|
import arc.util.*;
|
||||||
import mindustry.gen.*;
|
import mindustry.gen.*;
|
||||||
import mindustry.graphics.*;
|
import mindustry.graphics.*;
|
||||||
@@ -21,6 +22,7 @@ public class PlayerListFragment extends Fragment{
|
|||||||
private Interval timer = new Interval();
|
private Interval timer = new Interval();
|
||||||
private TextField sField;
|
private TextField sField;
|
||||||
private boolean found = false;
|
private boolean found = false;
|
||||||
|
private Seq<Player> players = new Seq<>();
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void build(Group parent){
|
public void build(Group parent){
|
||||||
@@ -78,8 +80,12 @@ public class PlayerListFragment extends Fragment{
|
|||||||
float h = 74f;
|
float h = 74f;
|
||||||
found = false;
|
found = false;
|
||||||
|
|
||||||
Groups.player.sort(Structs.comparing(Player::team));
|
players.clear();
|
||||||
Groups.player.each(user -> {
|
Groups.player.copy(players);
|
||||||
|
|
||||||
|
players.sort(Structs.comps(Structs.comparing(Player::team), Structs.comparingBool(p -> !p.admin)));
|
||||||
|
|
||||||
|
for(var user : players){
|
||||||
found = true;
|
found = true;
|
||||||
NetConnection connection = user.con;
|
NetConnection connection = user.con;
|
||||||
|
|
||||||
@@ -159,7 +165,7 @@ public class PlayerListFragment extends Fragment{
|
|||||||
content.row();
|
content.row();
|
||||||
content.image().height(4f).color(state.rules.pvp ? user.team().color : Pal.gray).growX();
|
content.image().height(4f).color(state.rules.pvp ? user.team().color : Pal.gray).growX();
|
||||||
content.row();
|
content.row();
|
||||||
});
|
}
|
||||||
|
|
||||||
if(!found){
|
if(!found){
|
||||||
content.add(Core.bundle.format("players.notfound")).padBottom(6).width(350f).maxHeight(h + 14);
|
content.add(Core.bundle.format("players.notfound")).padBottom(6).width(350f).maxHeight(h + 14);
|
||||||
|
|||||||
@@ -287,7 +287,7 @@ public class Block extends UnlockableContent{
|
|||||||
Tile tile = world.tile(x, y);
|
Tile tile = world.tile(x, y);
|
||||||
if(tile == null) return 0;
|
if(tile == null) return 0;
|
||||||
return tile.getLinkedTilesAs(this, tempTiles)
|
return tile.getLinkedTilesAs(this, tempTiles)
|
||||||
.sumf(other -> other.floor().attributes.get(attr));
|
.sumf(other -> !floating && other.floor().isDeep() ? 0 : other.floor().attributes.get(attr));
|
||||||
}
|
}
|
||||||
|
|
||||||
public TextureRegion getDisplayIcon(Tile tile){
|
public TextureRegion getDisplayIcon(Tile tile){
|
||||||
|
|||||||
@@ -41,8 +41,9 @@ public class Build{
|
|||||||
if(tile.build != null) prevBuild.add(tile.build);
|
if(tile.build != null) prevBuild.add(tile.build);
|
||||||
|
|
||||||
tile.setBlock(sub, team, rotation);
|
tile.setBlock(sub, team, rotation);
|
||||||
tile.<ConstructBuild>bc().setDeconstruct(previous);
|
var build = (ConstructBuild)tile.build;
|
||||||
tile.<ConstructBuild>bc().prevBuild = prevBuild;
|
build.setDeconstruct(previous);
|
||||||
|
build.prevBuild = prevBuild;
|
||||||
tile.build.health = tile.build.maxHealth * prevPercent;
|
tile.build.health = tile.build.maxHealth * prevPercent;
|
||||||
if(unit != null && unit.isPlayer()) tile.build.lastAccessed = unit.getPlayer().name;
|
if(unit != null && unit.isPlayer()) tile.build.lastAccessed = unit.getPlayer().name;
|
||||||
|
|
||||||
@@ -85,7 +86,7 @@ public class Build{
|
|||||||
|
|
||||||
tile.setBlock(sub, team, rotation);
|
tile.setBlock(sub, team, rotation);
|
||||||
|
|
||||||
ConstructBuild build = tile.bc();
|
var build = (ConstructBuild)tile.build;
|
||||||
|
|
||||||
build.setConstruct(previous.size == sub.size ? previous : Blocks.air, result);
|
build.setConstruct(previous.size == sub.size ? previous : Blocks.air, result);
|
||||||
build.prevBuild = prevBuild;
|
build.prevBuild = prevBuild;
|
||||||
@@ -150,10 +151,10 @@ public class Build{
|
|||||||
!check.floor().placeableOn || //solid wall
|
!check.floor().placeableOn || //solid wall
|
||||||
!((type.canReplace(check.block()) || //can replace type
|
!((type.canReplace(check.block()) || //can replace type
|
||||||
//controversial change: allow rebuilding damaged blocks
|
//controversial change: allow rebuilding damaged blocks
|
||||||
//this could be buggy and abusable, so I'm not enabling it yet
|
//this could be buggy and abuse-able, so I'm not enabling it yet
|
||||||
//note that this requires a change in BuilderComp as well
|
//note that this requires a change in BuilderComp as well
|
||||||
//(type == check.block() && check.centerX() == x && check.centerY() == y && check.build != null && check.build.health < check.build.maxHealth - 0.0001f) ||
|
//(type == check.block() && check.centerX() == x && check.centerY() == y && check.build != null && check.build.health < check.build.maxHealth - 0.0001f) ||
|
||||||
(check.block instanceof ConstructBlock && check.<ConstructBuild>bc().cblock == type && check.centerX() == tile.x && check.centerY() == tile.y)) && //same type in construction
|
(check.build instanceof ConstructBuild build && build.cblock == type && check.centerX() == tile.x && check.centerY() == tile.y)) && //same type in construction
|
||||||
type.bounds(tile.x, tile.y, Tmp.r1).grow(0.01f).contains(check.block.bounds(check.centerX(), check.centerY(), Tmp.r2))) || //no replacement
|
type.bounds(tile.x, tile.y, Tmp.r1).grow(0.01f).contains(check.block.bounds(check.centerX(), check.centerY(), Tmp.r2))) || //no replacement
|
||||||
(type.requiresWater && check.floor().liquidDrop != Liquids.water) //requires water but none found
|
(type.requiresWater && check.floor().liquidDrop != Liquids.water) //requires water but none found
|
||||||
) return false;
|
) return false;
|
||||||
|
|||||||
@@ -9,10 +9,9 @@ import java.util.*;
|
|||||||
import static mindustry.Vars.*;
|
import static mindustry.Vars.*;
|
||||||
|
|
||||||
public class Edges{
|
public class Edges{
|
||||||
private static final int maxSize = 14;
|
|
||||||
private static final int maxRadius = 12;
|
private static final int maxRadius = 12;
|
||||||
private static Point2[][] edges = new Point2[maxSize][0];
|
private static Point2[][] edges = new Point2[maxBlockSize][0];
|
||||||
private static Point2[][] edgeInside = new Point2[maxSize][0];
|
private static Point2[][] edgeInside = new Point2[maxBlockSize][0];
|
||||||
private static Vec2[][] polygons = new Vec2[maxRadius * 2][0];
|
private static Vec2[][] polygons = new Vec2[maxRadius * 2][0];
|
||||||
|
|
||||||
static{
|
static{
|
||||||
@@ -20,7 +19,7 @@ public class Edges{
|
|||||||
polygons[i] = Geometry.pixelCircle((i + 1) / 2f);
|
polygons[i] = Geometry.pixelCircle((i + 1) / 2f);
|
||||||
}
|
}
|
||||||
|
|
||||||
for(int i = 0; i < maxSize; i++){
|
for(int i = 0; i < maxBlockSize; i++){
|
||||||
int bot = -(int)(i / 2f) - 1;
|
int bot = -(int)(i / 2f) - 1;
|
||||||
int top = (int)(i / 2f + 0.5f) + 1;
|
int top = (int)(i / 2f + 0.5f) + 1;
|
||||||
edges[i] = new Point2[(i + 1) * 4];
|
edges[i] = new Point2[(i + 1) * 4];
|
||||||
@@ -72,13 +71,13 @@ public class Edges{
|
|||||||
}
|
}
|
||||||
|
|
||||||
public static Point2[] getEdges(int size){
|
public static Point2[] getEdges(int size){
|
||||||
if(size < 0 || size > maxSize) throw new RuntimeException("Block size must be between 0 and " + maxSize);
|
if(size < 0 || size > maxBlockSize) throw new RuntimeException("Block size must be between 0 and " + maxBlockSize);
|
||||||
|
|
||||||
return edges[size - 1];
|
return edges[size - 1];
|
||||||
}
|
}
|
||||||
|
|
||||||
public static Point2[] getInsideEdges(int size){
|
public static Point2[] getInsideEdges(int size){
|
||||||
if(size < 0 || size > maxSize) throw new RuntimeException("Block size must be between 0 and " + maxSize);
|
if(size < 0 || size > maxBlockSize) throw new RuntimeException("Block size must be between 0 and " + maxBlockSize);
|
||||||
|
|
||||||
return edgeInside[size - 1];
|
return edgeInside[size - 1];
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -125,13 +125,6 @@ public class Tile implements Position, QuadTreeObject, Displayable{
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Convenience method that returns the building of this tile with a cast.
|
|
||||||
* Method name is shortened to prevent conflict. */
|
|
||||||
@SuppressWarnings("unchecked")
|
|
||||||
public <T extends Building> T bc(){
|
|
||||||
return (T)build;
|
|
||||||
}
|
|
||||||
|
|
||||||
public float worldx(){
|
public float worldx(){
|
||||||
return x * tilesize;
|
return x * tilesize;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -26,8 +26,7 @@ import static mindustry.Vars.*;
|
|||||||
|
|
||||||
/** A block in the process of construction. */
|
/** A block in the process of construction. */
|
||||||
public class ConstructBlock extends Block{
|
public class ConstructBlock extends Block{
|
||||||
public static final int maxSize = 16;
|
private static final ConstructBlock[] consBlocks = new ConstructBlock[maxBlockSize];
|
||||||
private static final ConstructBlock[] consBlocks = new ConstructBlock[maxSize];
|
|
||||||
|
|
||||||
private static long lastTime = 0;
|
private static long lastTime = 0;
|
||||||
private static int pitchSeq = 0;
|
private static int pitchSeq = 0;
|
||||||
@@ -46,7 +45,7 @@ public class ConstructBlock extends Block{
|
|||||||
|
|
||||||
/** Returns a ConstructBlock by size. */
|
/** Returns a ConstructBlock by size. */
|
||||||
public static ConstructBlock get(int size){
|
public static ConstructBlock get(int size){
|
||||||
if(size > maxSize) throw new IllegalArgumentException("No. Don't place ConstructBlock of size greater than " + maxSize);
|
if(size > maxBlockSize) throw new IllegalArgumentException("No. Don't place ConstructBlock of size greater than " + maxBlockSize);
|
||||||
return consBlocks[size - 1];
|
return consBlocks[size - 1];
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -147,6 +146,7 @@ public class ConstructBlock extends Block{
|
|||||||
*/
|
*/
|
||||||
public Block previous;
|
public Block previous;
|
||||||
public Object lastConfig;
|
public Object lastConfig;
|
||||||
|
public boolean wasConstructing;
|
||||||
|
|
||||||
@Nullable
|
@Nullable
|
||||||
public Unit lastBuilder;
|
public Unit lastBuilder;
|
||||||
@@ -218,6 +218,7 @@ public class ConstructBlock extends Block{
|
|||||||
}
|
}
|
||||||
|
|
||||||
public void construct(Unit builder, @Nullable Building core, float amount, Object config){
|
public void construct(Unit builder, @Nullable Building core, float amount, Object config){
|
||||||
|
wasConstructing = true;
|
||||||
if(cblock == null){
|
if(cblock == null){
|
||||||
kill();
|
kill();
|
||||||
return;
|
return;
|
||||||
@@ -252,6 +253,7 @@ public class ConstructBlock extends Block{
|
|||||||
}
|
}
|
||||||
|
|
||||||
public void deconstruct(Unit builder, @Nullable Building core, float amount){
|
public void deconstruct(Unit builder, @Nullable Building core, float amount){
|
||||||
|
wasConstructing = false;
|
||||||
float deconstructMultiplier = state.rules.deconstructRefundMultiplier;
|
float deconstructMultiplier = state.rules.deconstructRefundMultiplier;
|
||||||
|
|
||||||
if(builder.isPlayer()){
|
if(builder.isPlayer()){
|
||||||
@@ -331,6 +333,7 @@ public class ConstructBlock extends Block{
|
|||||||
}
|
}
|
||||||
|
|
||||||
public void setConstruct(Block previous, Block block){
|
public void setConstruct(Block previous, Block block){
|
||||||
|
wasConstructing = true;
|
||||||
this.cblock = block;
|
this.cblock = block;
|
||||||
this.previous = previous;
|
this.previous = previous;
|
||||||
this.accumulator = new float[block.requirements.length];
|
this.accumulator = new float[block.requirements.length];
|
||||||
@@ -340,6 +343,7 @@ public class ConstructBlock extends Block{
|
|||||||
|
|
||||||
public void setDeconstruct(Block previous){
|
public void setDeconstruct(Block previous){
|
||||||
if(previous == null) return;
|
if(previous == null) return;
|
||||||
|
wasConstructing = false;
|
||||||
this.previous = previous;
|
this.previous = previous;
|
||||||
this.progress = 1f;
|
this.progress = 1f;
|
||||||
if(previous.buildCost >= 0.01f){
|
if(previous.buildCost >= 0.01f){
|
||||||
|
|||||||
@@ -21,7 +21,7 @@ public class Accelerator extends Block{
|
|||||||
public @Load("launch-arrow") TextureRegion arrowRegion;
|
public @Load("launch-arrow") TextureRegion arrowRegion;
|
||||||
|
|
||||||
public Block launching = Blocks.coreNucleus;
|
public Block launching = Blocks.coreNucleus;
|
||||||
public int[] capacities = new int[content.items().size];
|
public int[] capacities;
|
||||||
|
|
||||||
public Accelerator(String name){
|
public Accelerator(String name){
|
||||||
super(name);
|
super(name);
|
||||||
@@ -35,6 +35,7 @@ public class Accelerator extends Block{
|
|||||||
@Override
|
@Override
|
||||||
public void init(){
|
public void init(){
|
||||||
itemCapacity = 0;
|
itemCapacity = 0;
|
||||||
|
capacities = new int[content.items().size];
|
||||||
for(ItemStack stack : launching.requirements){
|
for(ItemStack stack : launching.requirements){
|
||||||
capacities[stack.item.id] = stack.amount;
|
capacities[stack.item.id] = stack.amount;
|
||||||
itemCapacity += stack.amount;
|
itemCapacity += stack.amount;
|
||||||
|
|||||||
@@ -209,7 +209,7 @@ public class Turret extends ReloadTurret{
|
|||||||
}
|
}
|
||||||
|
|
||||||
public void targetPosition(Posc pos){
|
public void targetPosition(Posc pos){
|
||||||
if(!hasAmmo()) return;
|
if(!hasAmmo() || target == null) return;
|
||||||
BulletType bullet = peekAmmo();
|
BulletType bullet = peekAmmo();
|
||||||
float speed = bullet.speed;
|
float speed = bullet.speed;
|
||||||
//slow bullets never intersect
|
//slow bullets never intersect
|
||||||
|
|||||||
@@ -120,7 +120,7 @@ public class ItemBridge extends Block{
|
|||||||
|
|
||||||
return ((other.block() == tile.block() && tile.block() == this) || (!(tile.block() instanceof ItemBridge) && other.block() == this))
|
return ((other.block() == tile.block() && tile.block() == this) || (!(tile.block() instanceof ItemBridge) && other.block() == this))
|
||||||
&& (other.team() == tile.team() || tile.block() != this)
|
&& (other.team() == tile.team() || tile.block() != this)
|
||||||
&& (!checkDouble || other.<ItemBridgeBuild>bc().link != tile.pos());
|
&& (!checkDouble || ((ItemBridgeBuild)other.build).link != tile.pos());
|
||||||
}
|
}
|
||||||
|
|
||||||
public Tile findLink(int x, int y){
|
public Tile findLink(int x, int y){
|
||||||
@@ -238,7 +238,7 @@ public class ItemBridge extends Block{
|
|||||||
while(it.hasNext){
|
while(it.hasNext){
|
||||||
int i = it.next();
|
int i = it.next();
|
||||||
Tile other = world.tile(i);
|
Tile other = world.tile(i);
|
||||||
if(!linkValid(tile, other, false) || other.<ItemBridgeBuild>bc().link != tile.pos()){
|
if(!linkValid(tile, other, false) || ((ItemBridgeBuild)other.build).link != tile.pos()){
|
||||||
it.remove();
|
it.remove();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -302,8 +302,7 @@ public class MassDriver extends Block{
|
|||||||
|
|
||||||
protected boolean shooterValid(Tile other){
|
protected boolean shooterValid(Tile other){
|
||||||
if(other == null) return true;
|
if(other == null) return true;
|
||||||
if(!(other.block() instanceof MassDriver)) return false;
|
if(!(other.build instanceof MassDriverBuild entity)) return false;
|
||||||
MassDriverBuild entity = other.bc();
|
|
||||||
return entity.link == tile.pos() && tile.dst(other) <= range;
|
return entity.link == tile.pos() && tile.dst(other) <= range;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -43,7 +43,8 @@ public class Sorter extends Block{
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public int minimapColor(Tile tile){
|
public int minimapColor(Tile tile){
|
||||||
return tile.<SorterBuild>bc().sortItem == null ? 0 : tile.<SorterBuild>bc().sortItem.color.rgba();
|
var build = (SorterBuild)tile.build;
|
||||||
|
return build == null || build.sortItem == null ? 0 : build.sortItem.color.rgba();
|
||||||
}
|
}
|
||||||
|
|
||||||
public class SorterBuild extends Building{
|
public class SorterBuild extends Building{
|
||||||
|
|||||||
@@ -119,7 +119,7 @@ public class Floor extends Block{
|
|||||||
if(wall == null) wall = Blocks.air;
|
if(wall == null) wall = Blocks.air;
|
||||||
|
|
||||||
if(decoration == Blocks.air){
|
if(decoration == Blocks.air){
|
||||||
decoration = content.blocks().min(b -> b instanceof Boulder && b.breakable ? mapColor.diff(b.mapColor) : Float.POSITIVE_INFINITY);
|
decoration = content.blocks().min(b -> b instanceof Boulder && b.minfo.mod == null && b.breakable ? mapColor.diff(b.mapColor) : Float.POSITIVE_INFINITY);
|
||||||
}
|
}
|
||||||
|
|
||||||
if(isLiquid && walkEffect == Fx.none){
|
if(isLiquid && walkEffect == Fx.none){
|
||||||
|
|||||||
@@ -17,8 +17,12 @@ public class LiquidConverter extends GenericCrafter{
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void init(){
|
public void init(){
|
||||||
ConsumeLiquidBase cl = consumes.get(ConsumeType.liquid);
|
if(!consumes.has(ConsumeType.liquid) || !(consumes.get(ConsumeType.liquid) instanceof ConsumeLiquid)){
|
||||||
cl.update(true);
|
throw new RuntimeException("LiquidsConverters must have a ConsumeLiquid. Note that filters are not supported.");
|
||||||
|
}
|
||||||
|
|
||||||
|
ConsumeLiquid cl = consumes.get(ConsumeType.liquid);
|
||||||
|
cl.update(false);
|
||||||
outputLiquid.amount = cl.amount;
|
outputLiquid.amount = cl.amount;
|
||||||
super.init();
|
super.init();
|
||||||
}
|
}
|
||||||
@@ -40,11 +44,13 @@ public class LiquidConverter extends GenericCrafter{
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void updateTile(){
|
public void updateTile(){
|
||||||
ConsumeLiquidBase cl = consumes.get(ConsumeType.liquid);
|
ConsumeLiquid cl = consumes.get(ConsumeType.liquid);
|
||||||
|
|
||||||
if(cons.valid()){
|
if(cons.valid()){
|
||||||
float use = Math.min(cl.amount * edelta(), liquidCapacity - liquids.get(outputLiquid.liquid));
|
float use = Math.min(cl.amount * edelta(), liquidCapacity - liquids.get(outputLiquid.liquid));
|
||||||
|
|
||||||
|
liquids.remove(cl.liquid, Math.min(use, liquids.get(cl.liquid)));
|
||||||
|
|
||||||
progress += use / cl.amount;
|
progress += use / cl.amount;
|
||||||
liquids.add(outputLiquid.liquid, use);
|
liquids.add(outputLiquid.liquid, use);
|
||||||
if(progress >= craftTime){
|
if(progress >= craftTime){
|
||||||
|
|||||||
@@ -58,9 +58,8 @@ public class CoreBlock extends StorageBlock{
|
|||||||
|
|
||||||
@Remote(called = Loc.server)
|
@Remote(called = Loc.server)
|
||||||
public static void playerSpawn(Tile tile, Player player){
|
public static void playerSpawn(Tile tile, Player player){
|
||||||
if(player == null || tile == null) return;
|
if(player == null || tile == null || !(tile.build instanceof CoreBuild entity)) return;
|
||||||
|
|
||||||
CoreBuild entity = tile.bc();
|
|
||||||
CoreBlock block = (CoreBlock)tile.block();
|
CoreBlock block = (CoreBlock)tile.block();
|
||||||
Fx.spawn.at(entity);
|
Fx.spawn.at(entity);
|
||||||
|
|
||||||
|
|||||||
@@ -10,6 +10,7 @@ import mindustry.*;
|
|||||||
import mindustry.content.*;
|
import mindustry.content.*;
|
||||||
import mindustry.entities.*;
|
import mindustry.entities.*;
|
||||||
import mindustry.entities.units.*;
|
import mindustry.entities.units.*;
|
||||||
|
import mindustry.game.EventType.*;
|
||||||
import mindustry.gen.*;
|
import mindustry.gen.*;
|
||||||
import mindustry.graphics.*;
|
import mindustry.graphics.*;
|
||||||
import mindustry.type.*;
|
import mindustry.type.*;
|
||||||
@@ -174,6 +175,7 @@ public class Reconstructor extends UnitBlock{
|
|||||||
Effect.shake(2f, 3f, this);
|
Effect.shake(2f, 3f, this);
|
||||||
Fx.producesmoke.at(this);
|
Fx.producesmoke.at(this);
|
||||||
consume();
|
consume();
|
||||||
|
Events.fire(new UnitCreateEvent(payload.unit));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -27,8 +27,8 @@ public class UnitBlock extends PayloadAcceptor{
|
|||||||
|
|
||||||
@Remote(called = Loc.server)
|
@Remote(called = Loc.server)
|
||||||
public static void unitBlockSpawn(Tile tile){
|
public static void unitBlockSpawn(Tile tile){
|
||||||
if(!(tile.build instanceof UnitBuild)) return;
|
if(!(tile.build instanceof UnitBuild build)) return;
|
||||||
tile.<UnitBuild>bc().spawned();
|
build.spawned();
|
||||||
}
|
}
|
||||||
|
|
||||||
public class UnitBuild extends PayloadAcceptorBuild<UnitPayload>{
|
public class UnitBuild extends PayloadAcceptorBuild<UnitPayload>{
|
||||||
|
|||||||
@@ -461,9 +461,10 @@ public class SNet implements SteamNetworkingCallback, SteamMatchmakingCallback,
|
|||||||
writeBuffer.limit(writeBuffer.capacity());
|
writeBuffer.limit(writeBuffer.capacity());
|
||||||
writeBuffer.position(0);
|
writeBuffer.position(0);
|
||||||
serializer.write(writeBuffer, object);
|
serializer.write(writeBuffer, object);
|
||||||
|
int length = writeBuffer.position();
|
||||||
writeBuffer.flip();
|
writeBuffer.flip();
|
||||||
|
|
||||||
snet.sendP2PPacket(sid, writeBuffer, mode == SendMode.tcp ? object instanceof StreamChunk ? P2PSend.ReliableWithBuffering : P2PSend.Reliable : P2PSend.UnreliableNoDelay, 0);
|
snet.sendP2PPacket(sid, writeBuffer, mode == SendMode.tcp || length >= 1200 ? object instanceof StreamChunk ? P2PSend.ReliableWithBuffering : P2PSend.Reliable : P2PSend.UnreliableNoDelay, 0);
|
||||||
}catch(Exception e){
|
}catch(Exception e){
|
||||||
Log.err(e);
|
Log.err(e);
|
||||||
Log.info("Error sending packet. Disconnecting invalid client!");
|
Log.info("Error sending packet. Disconnecting invalid client!");
|
||||||
|
|||||||
@@ -28,7 +28,7 @@ public enum SStat{
|
|||||||
|
|
||||||
public void max(int amount){
|
public void max(int amount){
|
||||||
if(amount > get()){
|
if(amount > get()){
|
||||||
add(amount - get());
|
set(amount);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -42,7 +42,7 @@ public enum SStat{
|
|||||||
}
|
}
|
||||||
|
|
||||||
public void add(int amount){
|
public void add(int amount){
|
||||||
set(get() + 1);
|
set(get() + amount);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void add(){
|
public void add(){
|
||||||
|
|||||||
@@ -1,7 +1,6 @@
|
|||||||
package mindustry.desktop.steam;
|
package mindustry.desktop.steam;
|
||||||
|
|
||||||
import arc.*;
|
import arc.*;
|
||||||
import arc.math.*;
|
|
||||||
import arc.struct.*;
|
import arc.struct.*;
|
||||||
import arc.util.*;
|
import arc.util.*;
|
||||||
import com.codedisaster.steamworks.*;
|
import com.codedisaster.steamworks.*;
|
||||||
@@ -22,18 +21,18 @@ public class SStats implements SteamUserStatsCallback{
|
|||||||
public final SteamUserStats stats = new SteamUserStats(this);
|
public final SteamUserStats stats = new SteamUserStats(this);
|
||||||
|
|
||||||
private boolean updated = false;
|
private boolean updated = false;
|
||||||
//private ObjectSet<String> mechs = new ObjectSet<>();
|
|
||||||
private int statSavePeriod = 4; //in minutes
|
private int statSavePeriod = 4; //in minutes
|
||||||
|
|
||||||
private ObjectSet<String> blocksBuilt = new ObjectSet<>(), unitsBuilt = new ObjectSet<>();
|
private ObjectSet<String> blocksBuilt = new ObjectSet<>(), unitsBuilt = new ObjectSet<>();
|
||||||
private ObjectSet<UnitType> t5s = new ObjectSet<>();
|
private ObjectSet<UnitType> t5s = new ObjectSet<>();
|
||||||
private ObjectSet<UnitType> tmpSet = new ObjectSet<>();
|
|
||||||
|
|
||||||
public SStats(){
|
public SStats(){
|
||||||
stats.requestCurrentStats();
|
stats.requestCurrentStats();
|
||||||
|
|
||||||
Events.on(ClientLoadEvent.class, e -> {
|
Events.on(ClientLoadEvent.class, e -> {
|
||||||
//mechs = Core.settings.getObject("mechs", ObjectSet.class, ObjectSet::new);
|
unitsBuilt = Core.settings.getJson("units-built" , ObjectSet.class, String.class, ObjectSet::new);
|
||||||
|
blocksBuilt = Core.settings.getJson("blocks-built" , ObjectSet.class, String.class, ObjectSet::new);
|
||||||
|
t5s = ObjectSet.with(UnitTypes.omura, UnitTypes.reign, UnitTypes.toxopid, UnitTypes.eclipse, UnitTypes.oct, UnitTypes.corvus);
|
||||||
|
|
||||||
Core.app.addListener(new ApplicationListener(){
|
Core.app.addListener(new ApplicationListener(){
|
||||||
Interval i = new Interval();
|
Interval i = new Interval();
|
||||||
@@ -76,14 +75,9 @@ public class SStats implements SteamUserStatsCallback{
|
|||||||
}
|
}
|
||||||
|
|
||||||
private void registerEvents(){
|
private void registerEvents(){
|
||||||
Events.on(ClientLoadEvent.class, e -> {
|
|
||||||
unitsBuilt = Core.settings.getJson("units-built" , ObjectSet.class, String.class, ObjectSet::new);
|
|
||||||
blocksBuilt = Core.settings.getJson("blocks-built" , ObjectSet.class, String.class, ObjectSet::new);
|
|
||||||
t5s = ObjectSet.with(UnitTypes.omura, UnitTypes.reign, UnitTypes.toxopid, UnitTypes.eclipse, UnitTypes.oct, UnitTypes.corvus);
|
|
||||||
});
|
|
||||||
|
|
||||||
Events.on(UnitDestroyEvent.class, e -> {
|
Events.on(UnitDestroyEvent.class, e -> {
|
||||||
if(ncustom()){
|
if(campaign()){
|
||||||
if(e.unit.team != Vars.player.team()){
|
if(e.unit.team != Vars.player.team()){
|
||||||
SStat.unitsDestroyed.add();
|
SStat.unitsDestroyed.add();
|
||||||
|
|
||||||
@@ -106,7 +100,7 @@ public class SStats implements SteamUserStatsCallback{
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
SStat.maxProduction.max(Mathf.round(total));
|
SStat.maxProduction.max(Math.round(total));
|
||||||
});
|
});
|
||||||
|
|
||||||
Events.run(Trigger.newGame, () -> Core.app.post(() -> {
|
Events.run(Trigger.newGame, () -> Core.app.post(() -> {
|
||||||
@@ -249,15 +243,6 @@ public class SStats implements SteamUserStatsCallback{
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
Events.on(LoseEvent.class, e -> {
|
|
||||||
if(campaign()){
|
|
||||||
//TODO implement
|
|
||||||
//if(state.getSector().metCondition() && (state.wave - state.getSector().conditionWave) / state.getSector().launchPeriod >= 1){
|
|
||||||
// skipLaunching2Death.complete();
|
|
||||||
//}
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
Events.on(SectorLaunchEvent.class, e -> {
|
Events.on(SectorLaunchEvent.class, e -> {
|
||||||
SStat.timesLaunched.add();
|
SStat.timesLaunched.add();
|
||||||
});
|
});
|
||||||
@@ -267,7 +252,7 @@ public class SStats implements SteamUserStatsCallback{
|
|||||||
});
|
});
|
||||||
|
|
||||||
Events.on(WaveEvent.class, e -> {
|
Events.on(WaveEvent.class, e -> {
|
||||||
if(ncustom()){
|
if(campaign()){
|
||||||
SStat.maxWavesSurvived.max(Vars.state.wave);
|
SStat.maxWavesSurvived.max(Vars.state.wave);
|
||||||
|
|
||||||
if(state.stats.buildingsBuilt == 0 && state.wave >= 10){
|
if(state.stats.buildingsBuilt == 0 && state.wave >= 10){
|
||||||
@@ -301,6 +286,7 @@ public class SStats implements SteamUserStatsCallback{
|
|||||||
});
|
});
|
||||||
|
|
||||||
Events.on(SectorCaptureEvent.class, e -> {
|
Events.on(SectorCaptureEvent.class, e -> {
|
||||||
|
if(e.sector.isBeingPlayed() || net.client()){
|
||||||
if(Vars.state.wave <= 5 && state.rules.attackMode){
|
if(Vars.state.wave <= 5 && state.rules.attackMode){
|
||||||
defeatAttack5Waves.complete();
|
defeatAttack5Waves.complete();
|
||||||
}
|
}
|
||||||
@@ -308,6 +294,7 @@ public class SStats implements SteamUserStatsCallback{
|
|||||||
if(state.stats.buildingsDestroyed == 0){
|
if(state.stats.buildingsDestroyed == 0){
|
||||||
captureNoBlocksBroken.complete();
|
captureNoBlocksBroken.complete();
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if(Vars.state.rules.attackMode){
|
if(Vars.state.rules.attackMode){
|
||||||
SStat.attacksWon.add();
|
SStat.attacksWon.add();
|
||||||
@@ -323,16 +310,6 @@ public class SStats implements SteamUserStatsCallback{
|
|||||||
|
|
||||||
SStat.sectorsControlled.set(e.sector.planet.sectors.count(Sector::hasBase));
|
SStat.sectorsControlled.set(e.sector.planet.sectors.count(Sector::hasBase));
|
||||||
});
|
});
|
||||||
|
|
||||||
//TODO dead achievement
|
|
||||||
/*
|
|
||||||
Events.on(MechChangeEvent.class, e -> {
|
|
||||||
if(campaign()){
|
|
||||||
if(mechs.add(e.mech.name)){
|
|
||||||
SStat.zoneMechsUsed.max(mechs.size);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
});*/
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private void save(){
|
private void save(){
|
||||||
@@ -348,10 +325,6 @@ public class SStats implements SteamUserStatsCallback{
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
private boolean ncustom(){
|
|
||||||
return campaign();
|
|
||||||
}
|
|
||||||
|
|
||||||
private boolean campaign(){
|
private boolean campaign(){
|
||||||
return Vars.state.isCampaign();
|
return Vars.state.isCampaign();
|
||||||
}
|
}
|
||||||
|
|||||||
11
fastlane/metadata/android/de-DE/full_description.txt
Normal file
11
fastlane/metadata/android/de-DE/full_description.txt
Normal file
@@ -0,0 +1,11 @@
|
|||||||
|
Baue komplexe Produktionsketten aus Förderbändern, um deine Geschütztürme mit Munition zu versorgen. Stelle Materialien her, um deine Fabrik zu vergrößern und sie vor Gegnerwellen zu schützen. Spiele mit deinen Freunden in plattformübergreifenden Partien oder fordere sie zum Kampf heraus.
|
||||||
|
|
||||||
|
Dieses Tower-Defense-Spiel bietet:
|
||||||
|
- 24 Karten
|
||||||
|
- Eine Kampagne, die ins Spiel einführt und einen Forschungsbaum enthält
|
||||||
|
- 4 mächtige Bosse
|
||||||
|
- Transportsysteme für Materialien, Flüssigkeiten und Strom
|
||||||
|
- 19 verschiedene Einheiten, die du kommandieren kannst
|
||||||
|
- Mehrspielerpartien im lokalen Netzwerk oder über einen Server
|
||||||
|
|
||||||
|
Mithilfe eines eingebauten Editors können eigene Karten und Gegnerwellen erstellt werden. Die Spielregeln kannst du flexibel nach deinen Wünschen anpassen.
|
||||||
1
fastlane/metadata/android/de-DE/short_description.txt
Normal file
1
fastlane/metadata/android/de-DE/short_description.txt
Normal file
@@ -0,0 +1 @@
|
|||||||
|
Verteidige deine Basis mit einer Fabrik in diesem Sandbox-Spiel.
|
||||||
1
fastlane/metadata/android/de-DE/summary.txt
Normal file
1
fastlane/metadata/android/de-DE/summary.txt
Normal file
@@ -0,0 +1 @@
|
|||||||
|
Verteidige deine Basis mit einer Fabrik in diesem Sandbox-Spiel.
|
||||||
1
fastlane/metadata/android/de-DE/title.txt
Normal file
1
fastlane/metadata/android/de-DE/title.txt
Normal file
@@ -0,0 +1 @@
|
|||||||
|
Mindustry
|
||||||
10
fastlane/metadata/android/en-US/changelogs/29769.txt
Normal file
10
fastlane/metadata/android/en-US/changelogs/29769.txt
Normal file
@@ -0,0 +1,10 @@
|
|||||||
|
[This is a truncated changelog, see Github for full notes]
|
||||||
|
- Fixed rebuilding a core near vault causing resources to drop to 1K
|
||||||
|
- Fixed captured sectors getting locked
|
||||||
|
|
||||||
|
Campaign multiplayer changes:
|
||||||
|
|
||||||
|
- New host research is now carried over to clients
|
||||||
|
- Clients can now use their research even if the host doesn't have it
|
||||||
|
- Clients can now research new tech in multiplayer
|
||||||
|
- Added a hint that explains this information
|
||||||
8
fastlane/metadata/android/en-US/changelogs/29772.txt
Normal file
8
fastlane/metadata/android/en-US/changelogs/29772.txt
Normal file
@@ -0,0 +1,8 @@
|
|||||||
|
[This is a truncated changelog, see Github for full notes]
|
||||||
|
- Slightly increased Lancer build cost
|
||||||
|
- Double-tapping now enters a campaign map (Contributed by @joshuaptfan)
|
||||||
|
- Minor logic memory optimizations - block/sensor constants are no longer stored in every processor
|
||||||
|
- Doubled surge smelter item capacity
|
||||||
|
- Made Fungal Pass slightly easier
|
||||||
|
- Fixed some rare crashes
|
||||||
|
- Fixed unit spawn shockwave appearing too late
|
||||||
@@ -32,7 +32,7 @@
|
|||||||
"NEW_ACHIEVEMENT_20_14_NAME" "Stromschlag"
|
"NEW_ACHIEVEMENT_20_14_NAME" "Stromschlag"
|
||||||
"NEW_ACHIEVEMENT_20_14_DESC" "Treffe einen nassen Gegner mit Elektrizität."
|
"NEW_ACHIEVEMENT_20_14_DESC" "Treffe einen nassen Gegner mit Elektrizität."
|
||||||
"NEW_ACHIEVEMENT_20_15_NAME" "Zurück zum Sender"
|
"NEW_ACHIEVEMENT_20_15_NAME" "Zurück zum Sender"
|
||||||
"NEW_ACHIEVEMENT_20_15_DESC" "Zerstöre eine Einheit mit dessem eigenem reflektiertem Projektiel."
|
"NEW_ACHIEVEMENT_20_15_DESC" "Zerstöre eine Einheit mit dessen eigenem reflektierten Projektil."
|
||||||
"NEW_ACHIEVEMENT_20_17_NAME" "Ein schwerer Fehler..."
|
"NEW_ACHIEVEMENT_20_17_NAME" "Ein schwerer Fehler..."
|
||||||
"NEW_ACHIEVEMENT_20_17_DESC" "Erforsche den Verteiler."
|
"NEW_ACHIEVEMENT_20_17_DESC" "Erforsche den Verteiler."
|
||||||
"NEW_ACHIEVEMENT_20_18_NAME" "Erschaffen"
|
"NEW_ACHIEVEMENT_20_18_NAME" "Erschaffen"
|
||||||
@@ -66,15 +66,15 @@
|
|||||||
"NEW_ACHIEVEMENT_21_3_NAME" "Schwarm"
|
"NEW_ACHIEVEMENT_21_3_NAME" "Schwarm"
|
||||||
"NEW_ACHIEVEMENT_21_3_DESC" "Habe 100 Einheiten auf einmal aktiv."
|
"NEW_ACHIEVEMENT_21_3_DESC" "Habe 100 Einheiten auf einmal aktiv."
|
||||||
"NEW_ACHIEVEMENT_21_4_NAME" "Schar"
|
"NEW_ACHIEVEMENT_21_4_NAME" "Schar"
|
||||||
"NEW_ACHIEVEMENT_21_4_DESC" "Habe 10 Phantom-Drone auf einmal aktiv."
|
"NEW_ACHIEVEMENT_21_4_DESC" "Habe 10 Phantom-Drohnen auf einmal aktiv."
|
||||||
"NEW_ACHIEVEMENT_21_5_NAME" "Instabile Armee"
|
"NEW_ACHIEVEMENT_21_5_NAME" "Instabile Armee"
|
||||||
"NEW_ACHIEVEMENT_21_5_DESC" "Habe 50 Crawler auf einmal aktiv."
|
"NEW_ACHIEVEMENT_21_5_DESC" "Habe 50 Crawler auf einmal aktiv."
|
||||||
"NEW_ACHIEVEMENT_21_6_NAME" "Legion"
|
"NEW_ACHIEVEMENT_21_6_NAME" "Legion"
|
||||||
"NEW_ACHIEVEMENT_21_6_DESC" "Baue 1.000 Einheiten insgesamt."
|
"NEW_ACHIEVEMENT_21_6_DESC" "Baue 1.000 Einheiten insgesamt."
|
||||||
"NEW_ACHIEVEMENT_21_7_NAME" "Super"
|
"NEW_ACHIEVEMENT_21_7_NAME" "Super"
|
||||||
"NEW_ACHIEVEMENT_21_7_DESC" "Verdiene den S Rank in einer Zone."
|
"NEW_ACHIEVEMENT_21_7_DESC" "Verdiene den S-Rank in einer Zone."
|
||||||
"NEW_ACHIEVEMENT_21_8_NAME" "Super Super"
|
"NEW_ACHIEVEMENT_21_8_NAME" "Super Super"
|
||||||
"NEW_ACHIEVEMENT_21_8_DESC" "Verdiene den SS Rank in einer Zone."
|
"NEW_ACHIEVEMENT_21_8_DESC" "Verdiene den SS-Rank in einer Zone."
|
||||||
"NEW_ACHIEVEMENT_21_9_NAME" "Du Solltest Zuhören..."
|
"NEW_ACHIEVEMENT_21_9_NAME" "Du Solltest Zuhören..."
|
||||||
"NEW_ACHIEVEMENT_21_9_DESC" "Stirb im Gegnerspawn."
|
"NEW_ACHIEVEMENT_21_9_DESC" "Stirb im Gegnerspawn."
|
||||||
"NEW_ACHIEVEMENT_21_10_NAME" "Drück einfach Umschalt"
|
"NEW_ACHIEVEMENT_21_10_NAME" "Drück einfach Umschalt"
|
||||||
|
|||||||
56
fastlane/metadata/steam/german/description.txt
Normal file
56
fastlane/metadata/steam/german/description.txt
Normal file
@@ -0,0 +1,56 @@
|
|||||||
|
[img]{STEAM_APP_IMAGE}/extras/ezgif-4-0e70c282f775.gif[/img]
|
||||||
|
|
||||||
|
[h2]Spielmechanik[/h2]
|
||||||
|
|
||||||
|
[list]
|
||||||
|
[*] Baue komplexe Produktionsketten aus Förderbändern, um deine Geschütztürme mit Munition zu versorgen
|
||||||
|
[*] Stelle Materialien her, um deine Fabrik zu vergrößern und sie vor Gegnerwellen zu schützen
|
||||||
|
[*] Spiele mit deinen Freunden in plattformübergreifenden Partien oder fordere sie zum Kampf heraus
|
||||||
|
[*] Es gibt immer etwas zu tun: Wenn du deine Kühlsysteme nicht im Blick behältst, könnte dein Reaktor explodieren!
|
||||||
|
[*] Produziere Einheiten, die bei deiner Basis helfen oder den Gegner angreifen
|
||||||
|
[/list]
|
||||||
|
|
||||||
|
[img]{STEAM_APP_IMAGE}/extras/ezgif-1-8679abe089cd.gif[/img]
|
||||||
|
|
||||||
|
[h2]Kampagne[/h2]
|
||||||
|
|
||||||
|
[list]
|
||||||
|
[*] Erobere den Planeten Serpulo, indem du über 250 prozedural generierte Sektoren und 16 handgemachte Karten eroberst
|
||||||
|
[*] Stelle Materialien in eroberten Sektoren her, während du den nächsten Sektor eroberst
|
||||||
|
[*] Verteidige deine Sektoren vor regelmäßigen Invasionen
|
||||||
|
[*] Transportiere Materialien zwischen deinen Sektoren
|
||||||
|
[*] Schalte neue Blöcke in der Forschung frei
|
||||||
|
[*] Schließe Missionen zusammen mit deinen Freunden ab
|
||||||
|
[*] 33 verschiedene Einheiten
|
||||||
|
[*] über 50 Erfolge
|
||||||
|
[/list]
|
||||||
|
|
||||||
|
[h2]Spielmodi[/h2]
|
||||||
|
|
||||||
|
[list]
|
||||||
|
[*] [b]Überleben[/b]: Baue Geschütztürme und verteidige Wellen von Gegnern. Bereite dich auf zwischenzeitliche Zerstörungsangriffe von flugfähigen Einheiten vor.
|
||||||
|
[*] [b]Angriff[/b]: Stelle Einheiten her, um den gegnerischen Kern zu zerstören. Vergesse dabei nicht, deinen eigenen Kern zu schützen!
|
||||||
|
[*] [b]PvP[/b]: Kämpfe gegen andere Spieler in Teams und zerstöre die gegnerischen Kerne.
|
||||||
|
[*] [b]Sandkasten[/b]: Probiere deine Designs mit unendlichen Ressourcen und Gegnerwellen auf Anfrage aus.
|
||||||
|
[/list]
|
||||||
|
|
||||||
|
[img]{STEAM_APP_IMAGE}/extras/2020-11-30_10-46-02.gif[/img]
|
||||||
|
|
||||||
|
[h2]Mehrspielermodus[/h2]
|
||||||
|
|
||||||
|
[list]
|
||||||
|
[*] Trete einem öffentlichen Server bei oder eröffne ein Spiel für deine Freunde
|
||||||
|
[*] Ändere die Spielregeln: Kosten, Schadenswerte und mehr!
|
||||||
|
[*] Kombiniere PvP und PvE (player versus enemies)
|
||||||
|
[/list]
|
||||||
|
|
||||||
|
[h2]Karteneditor[/h2]
|
||||||
|
|
||||||
|
[list]
|
||||||
|
[*] Passe die Werkzeuge nach deinen Vorstellungen an
|
||||||
|
[*] Viele Filter für das prozedurale Generieren der Umgebung
|
||||||
|
[*] Verschönere die Landschaft mit Rauschen, Verzerrungen, Erosion, Symmetrie und Zufallsgenerierung
|
||||||
|
[*] Modifiziere die Gegnerwellen
|
||||||
|
[*] Teile deine Karten im Steam-Workshop
|
||||||
|
[*] Nutze über 80 verschiedene Umgebungsblöcke
|
||||||
|
[/list]
|
||||||
1
fastlane/metadata/steam/german/short-description.txt
Normal file
1
fastlane/metadata/steam/german/short-description.txt
Normal file
@@ -0,0 +1 @@
|
|||||||
|
Ein offenes Tower-Defense-Spiel mit Fokus auf Ressourcenverwaltung
|
||||||
@@ -1,3 +1,3 @@
|
|||||||
org.gradle.daemon=true
|
org.gradle.daemon=true
|
||||||
org.gradle.jvmargs=-Xms256m -Xmx1024m
|
org.gradle.jvmargs=-Xms256m -Xmx1024m
|
||||||
archash=d9f2b846e51e511aa4985c32297f6cdc8552ca87
|
archash=08d81cd26f74ea2e490c5ddc6e5a509f30f48368
|
||||||
|
|||||||
@@ -31,6 +31,10 @@
|
|||||||
"name": "Ranked",
|
"name": "Ranked",
|
||||||
"address": ["mindustryranked.ddns.net:16567"]
|
"address": ["mindustryranked.ddns.net:16567"]
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"name": "TWS",
|
||||||
|
"address": ["twsmindustry.24x7.hk:6701", "twsmindustry.24x7.hk:6702"]
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"address": "cheginde.ddns.net"
|
"address": "cheginde.ddns.net"
|
||||||
|
|
||||||
|
|||||||
@@ -54,7 +54,7 @@ public class ItemLiquidGeneratorTests extends PowerTestFixture{
|
|||||||
};
|
};
|
||||||
|
|
||||||
tile = createFakeTile(0, 0, generator);
|
tile = createFakeTile(0, 0, generator);
|
||||||
entity = tile.bc();
|
entity = (ItemLiquidGeneratorBuild)tile.build;
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Tests the consumption and efficiency when being supplied with liquids. */
|
/** Tests the consumption and efficiency when being supplied with liquids. */
|
||||||
|
|||||||
@@ -55,7 +55,7 @@ public class PowerTests extends PowerTestFixture{
|
|||||||
|
|
||||||
void simulateDirectConsumption(float producedPower, float requiredPower, float expectedSatisfaction, String parameterDescription){
|
void simulateDirectConsumption(float producedPower, float requiredPower, float expectedSatisfaction, String parameterDescription){
|
||||||
Tile producerTile = createFakeTile(0, 0, createFakeProducerBlock(producedPower));
|
Tile producerTile = createFakeTile(0, 0, createFakeProducerBlock(producedPower));
|
||||||
producerTile.<GeneratorBuild>bc().productionEfficiency = 1f;
|
((GeneratorBuild)producerTile.build).productionEfficiency = 1f;
|
||||||
Tile directConsumerTile = createFakeTile(0, 1, createFakeDirectConsumer(requiredPower));
|
Tile directConsumerTile = createFakeTile(0, 1, createFakeDirectConsumer(requiredPower));
|
||||||
|
|
||||||
PowerGraph powerGraph = new PowerGraph();
|
PowerGraph powerGraph = new PowerGraph();
|
||||||
@@ -95,7 +95,7 @@ public class PowerTests extends PowerTestFixture{
|
|||||||
|
|
||||||
if(producedPower > 0.0f){
|
if(producedPower > 0.0f){
|
||||||
Tile producerTile = createFakeTile(0, 0, createFakeProducerBlock(producedPower));
|
Tile producerTile = createFakeTile(0, 0, createFakeProducerBlock(producedPower));
|
||||||
producerTile.<GeneratorBuild>bc().productionEfficiency = 1f;
|
((GeneratorBuild)producerTile.build).productionEfficiency = 1f;
|
||||||
powerGraph.add(producerTile.build);
|
powerGraph.add(producerTile.build);
|
||||||
}
|
}
|
||||||
Tile directConsumerTile = null;
|
Tile directConsumerTile = null;
|
||||||
@@ -120,7 +120,7 @@ public class PowerTests extends PowerTestFixture{
|
|||||||
@Test
|
@Test
|
||||||
void directConsumptionStopsWithNoPower(){
|
void directConsumptionStopsWithNoPower(){
|
||||||
Tile producerTile = createFakeTile(0, 0, createFakeProducerBlock(10.0f));
|
Tile producerTile = createFakeTile(0, 0, createFakeProducerBlock(10.0f));
|
||||||
producerTile.<GeneratorBuild>bc().productionEfficiency = 1.0f;
|
((GeneratorBuild)producerTile.build).productionEfficiency = 1.0f;
|
||||||
Tile consumerTile = createFakeTile(0, 1, createFakeDirectConsumer(5.0f));
|
Tile consumerTile = createFakeTile(0, 1, createFakeDirectConsumer(5.0f));
|
||||||
|
|
||||||
PowerGraph powerGraph = new PowerGraph();
|
PowerGraph powerGraph = new PowerGraph();
|
||||||
@@ -137,7 +137,7 @@ public class PowerTests extends PowerTestFixture{
|
|||||||
assertEquals(0.0f, consumerTile.build.power.status, Mathf.FLOAT_ROUNDING_ERROR);
|
assertEquals(0.0f, consumerTile.build.power.status, Mathf.FLOAT_ROUNDING_ERROR);
|
||||||
if(consumerTile.block().consumes.hasPower()){
|
if(consumerTile.block().consumes.hasPower()){
|
||||||
ConsumePower consumePower = consumerTile.block().consumes.getPower();
|
ConsumePower consumePower = consumerTile.block().consumes.getPower();
|
||||||
assertFalse(consumePower.valid(consumerTile.bc()));
|
assertFalse(consumePower.valid(consumerTile.build));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user