Compare commits

..

71 Commits
v133 ... v134

Author SHA1 Message Date
Catchears
15396b6032 update german translation (#6085)
* update german translation to 30e6bb2625

* typo
2021-10-27 11:38:03 -04:00
彭瑞暄
75a520c3ae Update TW translations (#6092) 2021-10-27 11:36:13 -04:00
JrTRinny
d7fd7db3cc Update bundle_th.properties (#6187)
* Update bundle_th.properties

* Update bundle_th.properties

* Update bundle_th.properties

* Update bundle_th.properties

* Update bundle_th.properties
2021-10-27 11:26:02 -04:00
Prosta4okua
144731bfb0 Update bundle_uk_UA.properties (#6213) 2021-10-27 11:25:48 -04:00
VizardAlpha
7c1d4a092e Update bundle_fr.properties (#6227) 2021-10-27 11:25:37 -04:00
kituta
a28ece6424 Update bundle_ja.properties (#6232)
Add. //追加
2021-10-27 11:25:30 -04:00
RebornTrack970
39c5c6a6f0 TR Translation (#6239) 2021-10-27 11:25:19 -04:00
Sharlotte
77975a710c Update bundle_ko.properties (#6185)
* Update bundle_ko.properties

* Update bundle_ko.properties

* Update bundle_ko.properties

* Skskskskskk
2021-10-27 11:25:15 -04:00
Rex
d95dc98652 Update bundle_es.properties (#6238)
* Update bundle_es.properties

please see #6226 too.

* Update bundle_es.properties
2021-10-27 11:25:10 -04:00
Thomas Widyantoko
7afa6a7f44 Update bundle_in_ID.properties (#6240)
i am speed
2021-10-27 11:25:01 -04:00
Anuken
a4339b8b2b I should really rebind my aseprite zoom hotkeys 2021-10-27 10:24:13 -04:00
Anuken
7897ca9b97 Merge remote-tracking branch 'origin/master' 2021-10-27 10:13:59 -04:00
Anuken
4f957017ab Offset ping order 2021-10-27 10:13:49 -04:00
Rex
fa60ff2814 Update servers_v7.json (#6226) 2021-10-27 09:51:45 -04:00
Hexrotor
65ef189921 Corrected wrong zh_CN translation (#6224) 2021-10-27 09:32:08 -04:00
Lin
5b3b2cf4d5 Update bundle_zh_CN.properties (#6216) 2021-10-27 08:38:37 -04:00
Darkness#3729
d89184da43 [RU] Translation of save search & map search (#6219) 2021-10-26 10:46:29 -04:00
Anuken
898bddee7c Merge remote-tracking branch 'origin/master' 2021-10-26 09:52:07 -04:00
Anuken
860e4a2999 Clamp pixelator FBO size 2021-10-26 09:52:02 -04:00
Valeriy
39ef3ab4ce My fault (#6236)
Anuke, excuse me plz.
2021-10-26 09:51:03 -04:00
Valeriy
e57f4c9877 Rebeanding SMoA (#6235)
I think, comments is less
2021-10-26 09:19:13 -04:00
Phinner
30214e68b3 Add Xpdustry to V7 server list... (#6173)
They want a V7 server, I say why not ? Mindustry can run on a potato after all...
2021-10-25 19:30:00 -04:00
hortiSquash
59a480cb30 hortiloaders 1.0.3.0 bug fix (#6233)
* hortiloaders 1.0.3.0 bug fix

it didnt unload from StackConveyors/Storage when they had the same loadfactor as the factory

* unloader fix, using fields
2021-10-25 18:22:56 -04:00
Zelaux
46c6a6f6f7 Fixed using wrong weapon outline height (#6228) 2021-10-24 20:56:15 -04:00
Anuken
b6acf1af0a Comparator cleanup 2021-10-24 15:18:21 -04:00
hortiSquash
16f4e300a8 fixed the full factory priority bug (#6211) 2021-10-24 15:14:36 -04:00
Anuken
b18b4cdc90 Fixed #6222 2021-10-23 19:59:20 -04:00
Anuken
79d90ca75d Merge remote-tracking branch 'origin/master' 2021-10-23 14:35:59 -04:00
Anuken
b2b47353bf Fixed kotlin daemon randomly crashing 2021-10-23 14:35:54 -04:00
lifestarse
b7fe2bedae Update servers_v7.json (#6214)
lostdustry.northeurope.cloudapp.azure.com
2021-10-23 14:22:01 -04:00
Anuken
00e1d69348 Merge remote-tracking branch 'origin/master' 2021-10-23 09:26:35 -04:00
Anuken
88d1165909 Fixed #6220 / Fixed #6217 2021-10-23 09:26:30 -04:00
TranquillyUnpleasant
b22efb8c83 fix block picker working while logic dialog is open (#6215) 2021-10-22 18:52:08 -04:00
Anuken
a7c78c4193 Bundle case fixes 2021-10-22 18:17:25 -04:00
TranquillyUnpleasant
5c5acb2d48 Saved games search & Mapsearch filter improvements (#6194)
* better filter menu

* remove unused bundle property

* indent

* Add text instead of using labels

* Saved game search

* Save not map

* auto cursor to search bar

* change icon to terrain
2021-10-22 18:14:33 -04:00
Anuken
414f27a3b6 Merge remote-tracking branch 'origin/master' 2021-10-22 17:47:22 -04:00
Anuken
009eea1988 Cloud rendering overlap fix 2021-10-22 17:47:17 -04:00
hortiSquash
c9eed5a936 horti and the better unloaders (#6201)
* hortiloaders 0.9.8.1 seq fix

* tiny fixes
added more comments

* a tiny fix, and rewriting of a comment
2021-10-22 10:57:16 -04:00
Anuken
5d20f3a89b Merge remote-tracking branch 'origin/master' 2021-10-22 09:04:06 -04:00
Anuken
677e0e6f58 Fixed #6207 2021-10-22 09:04:00 -04:00
Fernando
49c64faece Update servers_v6.json and servers_v7.json (#6206)
* Update servers_v6.json

Update IPs

* Update servers_v7.json
2021-10-21 14:46:13 -04:00
JrTRinny
f944d3d579 deselectable content selection UI (#6205) 2021-10-21 12:40:34 -04:00
Anuken
4dc2164468 Merge remote-tracking branch 'origin/master' 2021-10-21 12:11:59 -04:00
Anuken
e9612ce9f0 Fixed #6203 / Minor block requirement changes 2021-10-21 12:11:54 -04:00
Darkness#3729
b19eb3fc04 AdminRequestEvent (#6198)
* AdminRequest event

* Lol

* Revert
2021-10-21 09:38:28 -04:00
Anuken
699364580e Added hiddenBuildItems rule 2021-10-20 16:25:24 -04:00
Anuken
085a974350 Cleanup 2021-10-20 14:34:27 -04:00
Anuken
4436a5ced9 An experiment 2021-10-20 14:30:06 -04:00
Anuken
a21f6d335f Fixed incorrect waves on serpulo sectors 2021-10-19 18:18:58 -04:00
Anuken
2469cf0851 Added isPayload utility for buildings 2021-10-19 12:13:29 -04:00
Anuken
a82ba0567b Merge remote-tracking branch 'origin/master' 2021-10-19 09:19:51 -04:00
Anuken
6022fcd109 Removed unused iOS splash screen 2021-10-19 09:19:46 -04:00
Fernando
038d132da9 Update servers_v7.json (#6183)
Add brazillian V7 servers
2021-10-19 00:13:58 -04:00
buthed010203
52238e3aa4 Remove redundant cast (#6193)
* Remove redundant cast

* dumb
2021-10-18 21:57:05 -04:00
MrDuck557
f2ce32cbb2 LogicDisable (#6191)
* LogicDisable

* I have read CONTRIBUTING.md

I forgot one space

Co-authored-by: Lele567 <48808663+Lele567@users.noreply.github.com>
2021-10-18 20:17:57 -04:00
Anuken
7dc492892e Fixed #6190 2021-10-18 16:28:52 -04:00
Anuken
4e92aa2000 Turret payload shoot fix 2021-10-18 11:48:44 -04:00
Anuken
3c8e21ac6a Remove debug write test 2021-10-18 11:37:52 -04:00
Anuken
8f5aa02428 Merge remote-tracking branch 'origin/master' 2021-10-18 11:37:32 -04:00
Anuken
f31759bb96 Update/draw payload buildings (broken) 2021-10-18 11:37:26 -04:00
Skin
938b4e5a00 Update servers_v7.json (#6186)
Mistake №2
2021-10-18 11:35:45 -04:00
Anuken
c6f6b8e46e Fixed legged units using wrong pathfinder 2021-10-18 09:58:01 -04:00
Anuken
3a9c0377ac Merge remote-tracking branch 'origin/master' 2021-10-17 22:40:26 -04:00
Anuken
324e5151aa Block cleanup 2021-10-17 22:40:21 -04:00
Skin
ad8455377c Update servers_v7.json (#6181)
* Update servers_v7.json

Pandorum is back

* Update servers_v7.json

Mistake
2021-10-17 21:56:02 -04:00
Anuken
3c963fb1bc Merge remote-tracking branch 'origin/master' 2021-10-17 19:55:45 -04:00
Anuken
af3467035b Building tile referernce cleanup 2021-10-17 19:55:37 -04:00
Bill Arndt
b57abf8b60 Update servers_v6.json (#6093)
Add server running my Eviction plugin to community list.
2021-10-17 17:40:20 -04:00
Anuken
0acd339e33 Payload loader crash fix 2021-10-17 16:46:39 -04:00
Anuken
e897458e94 Sound codegen fixes 2021-10-17 16:12:47 -04:00
Anuken
a72adef051 Fixed off-tinted cells 2021-10-17 16:03:05 -04:00
103 changed files with 971 additions and 326 deletions

View File

@@ -165,7 +165,7 @@ public class AssetsProcess extends BaseProcessor{
loadBegin.addStatement("$T.assets.load($S, $L.class).loaded = a -> { $L = ($L)a; soundToId.put(a, $L); idToSound.put($L, a); }", loadBegin.addStatement("$T.assets.load($S, $L.class).loaded = a -> { $L = ($L)a; soundToId.put(a, $L); idToSound.put($L, a); }",
Core.class, filepath, rtype, name, rtype, id, id); Core.class, filepath, rtype, name, rtype, id, id);
}else{ }else{
loadBegin.addStatement("$T.assets.load($S, $L.class)", Core.class, filepath, rtype); loadBegin.addStatement("$T.assets.load($S, $L.class).loaded = a -> { $L = ($L)a; }", Core.class, filepath, rtype, name, rtype);
} }
type.addField(FieldSpec.builder(ClassName.bestGuess(rtype), name, Modifier.STATIC, Modifier.PUBLIC).initializer("new " + rtype + "()").build()); type.addField(FieldSpec.builder(ClassName.bestGuess(rtype), name, Modifier.STATIC, Modifier.PUBLIC).initializer("new " + rtype + "()").build());

View File

@@ -23,8 +23,8 @@ buildscript{
} }
plugins{ plugins{
id 'org.jetbrains.kotlin.jvm' version '1.5.31' id 'org.jetbrains.kotlin.jvm' version '1.6.0-RC'
id "org.jetbrains.kotlin.kapt" version "1.5.31" id "org.jetbrains.kotlin.kapt" version "1.6.0-RC"
} }
allprojects{ allprojects{

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.6 KiB

After

Width:  |  Height:  |  Size: 2.6 KiB

View File

@@ -288,6 +288,7 @@ save.corrupted = Save file corrupted or invalid!
empty = <empty> empty = <empty>
on = On on = On
off = Off off = Off
save.search = Search saved games...
save.autosave = Autosave: {0} save.autosave = Autosave: {0}
save.map = Map: {0} save.map = Map: {0}
save.wave = Wave {0} save.wave = Wave {0}
@@ -379,9 +380,13 @@ editor.ingame = Edit In-Game
editor.publish.workshop = Publish On Workshop editor.publish.workshop = Publish On Workshop
editor.newmap = New Map editor.newmap = New Map
editor.center = Center editor.center = Center
editor.search = Search Maps... editor.search = Search maps...
editor.filters = Filter Maps editor.filters = Filter Maps
editor.showAll = Show Default Maps editor.filters.mode = Gamemodes:
editor.filters.type = Map Type:
editor.filters.search = Search In:
editor.filters.author = Author
editor.filters.description = Description
workshop = Workshop workshop = Workshop
waves.title = Waves waves.title = Waves
waves.remove = Remove waves.remove = Remove

View File

@@ -78,13 +78,12 @@ schematic.tagexists = Dieses Tag gibt es schon.
stats = Statistiken stats = Statistiken
stat.wave = Wellen besiegt:[accent] {0} stat.wave = Wellen besiegt:[accent] {0}
stat.unitsCreated = Einheiten erzeugt:[accent] {0}
stat.enemiesDestroyed = Gegner zerstört:[accent] {0} stat.enemiesDestroyed = Gegner zerstört:[accent] {0}
stat.built = Blöcke gebaut:[accent] {0} stat.built = Blöcke gebaut:[accent] {0}
stat.destroyed = Blöcke zerstört:[accent] {0} stat.destroyed = Blöcke zerstört:[accent] {0}
stat.deconstructed = Blöcke abgebaut:[accent] {0} stat.deconstructed = Blöcke abgebaut:[accent] {0}
stat.delivered = Übertragene Ressourcen:
stat.playtime = Spielzeit:[accent] {0} stat.playtime = Spielzeit:[accent] {0}
stat.rank = Finaler Rang:[accent] {0}
globalitems = [accent]Gesamtitems globalitems = [accent]Gesamtitems
map.delete = Bist du sicher, dass du die Karte "[accent]{0}[]" löschen möchtest? map.delete = Bist du sicher, dass du die Karte "[accent]{0}[]" löschen möchtest?
@@ -94,6 +93,7 @@ level.mode = Spielmodus:
coreattack = < Der Kern wird angegriffen! > coreattack = < Der Kern wird angegriffen! >
nearpoint = [[ [scarlet]SOFORT DEN SPAWNPUNKT VERLASSEN[] ]\nVernichtung droht nearpoint = [[ [scarlet]SOFORT DEN SPAWNPUNKT VERLASSEN[] ]\nVernichtung droht
database = Kern-Datenbank database = Kern-Datenbank
database.button = Datenbank
savegame = Spiel speichern savegame = Spiel speichern
loadgame = Spiel laden loadgame = Spiel laden
joingame = Spiel beitreten joingame = Spiel beitreten
@@ -169,6 +169,7 @@ launchcore = Kern starten
filename = Dateiname: filename = Dateiname:
unlocked = Neuer Inhalt freigeschaltet! unlocked = Neuer Inhalt freigeschaltet!
available = Neue Forschung möglich available = Neue Forschung möglich
unlock.incampaign = < Für Details in Kampagne freischalten >
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)?
@@ -215,6 +216,7 @@ hosts.none = [lightgray]Keine LAN-Spiele gefunden!
host.invalid = [scarlet]Kann keine Verbindung zum Host herstellen. host.invalid = [scarlet]Kann keine Verbindung zum Host herstellen.
servers.local = Lokale Server servers.local = Lokale Server
servers.local.steam = Offene Spiele & Lokale Server
servers.remote = Andere Server servers.remote = Andere Server
servers.global = Community-Server servers.global = Community-Server
@@ -316,7 +318,7 @@ 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![]\n\nSobald der Import abgeschlossen 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?
loading = [accent]Wird geladen... loading = [accent]Wird geladen...
reloading = [accent]Lade Mods neu... downloading = [accent]Herunterladen...
saving = [accent]Speichere... saving = [accent]Speichere...
respawn = [accent][[{0}][] um im Kern zu spawnen respawn = [accent][[{0}][] um im Kern zu spawnen
cancelbuilding = [accent][[{0}][] um den Plan zu leeren cancelbuilding = [accent][[{0}][] um den Plan zu leeren
@@ -344,9 +346,9 @@ custom = Benutzerdefiniert
builtin = Enthalten builtin = Enthalten
map.delete.confirm = Bist du sicher, dass du diese Karte löschen willst? Dies kann nicht rückgängig 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]orangen[] Kern zu dieser Karte im Editor hinzu. map.nospawn = Diese Karte hat keine Kerne, in denen die Spieler beginnen können! Füge einen [#{0}]{1}[] Kern zu dieser Karte im Editor 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.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 gegnerischen 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 a [#{0}]{1}[] 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}
@@ -361,6 +363,7 @@ publish.confirm = Willst du das wirklich veröffentlichen?\n\n[lightgray]Vergewi
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.cliffs = Wände zu Klippen
editor.brush = Pinsel editor.brush = Pinsel
editor.openin = Öffne im Editor editor.openin = Öffne im Editor
editor.oregen = Erze generieren editor.oregen = Erze generieren
@@ -376,6 +379,9 @@ 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
editor.search = Karten durchsuchen...
editor.filters = Karten filtern
editor.showAll = Standard-Karten anzeigen
workshop = Workshop workshop = Workshop
waves.title = Wellen waves.title = Wellen
waves.remove = Entfernen waves.remove = Entfernen
@@ -384,6 +390,7 @@ waves.waves = Welle(n)
waves.perspawn = pro Spawn waves.perspawn = pro Spawn
waves.shields = Schilder pro Welle waves.shields = Schilder pro Welle
waves.to = bis waves.to = bis
waves.max = maximale Einheiten
waves.guardian = Boss waves.guardian = Boss
waves.preview = Vorschau waves.preview = Vorschau
waves.edit = Bearbeiten... waves.edit = Bearbeiten...
@@ -392,6 +399,13 @@ waves.load = Aus der Zwischenablage laden
waves.invalid = Ungültige Wellen in der Zwischenablage. waves.invalid = Ungültige Wellen in der Zwischenablage.
waves.copied = Wellen kopiert. waves.copied = Wellen kopiert.
waves.none = Keine Gegner definiert.\nInfo: Leere Wellenentwürfe werden automatisch mit dem Standard-Entwurf ersetzt. waves.none = Keine Gegner definiert.\nInfo: Leere Wellenentwürfe werden automatisch mit dem Standard-Entwurf ersetzt.
waves.sort = Sortieren nach
waves.sort.reverse = Rückwärts sortieren
waves.sort.begin = Anfang
waves.sort.health = Lebenspunkte
waves.sort.type = Sorte
waves.units.hide = Alle verstecken
waves.units.show = Alle anzeigen
wavemode.counts = Menge wavemode.counts = Menge
@@ -538,6 +552,7 @@ configure = Anfangsressourcen festlegen
loadout = Anfangsressourcen loadout = Anfangsressourcen
resources = Ressourcen resources = Ressourcen
bannedblocks = Gesperrte Blöcke bannedblocks = Gesperrte Blöcke
bannedunits = Gesperrte Einheiten
addall = Alle hinzufügen addall = Alle hinzufügen
launch.from = Items werden von [accent]{0} []gestartet launch.from = Items werden von [accent]{0} []gestartet
launch.destination = Ziel: {0} launch.destination = Ziel: {0}
@@ -562,6 +577,8 @@ weather.sandstorm.name = Sandsturm
weather.sporestorm.name = Sporensturm weather.sporestorm.name = Sporensturm
weather.fog.name = Nebel weather.fog.name = Nebel
sectorlist = Sektoren
sectorlist.attacked = {0} wird angegriffen
sectors.unexplored = [lightgray]Unentdeckt sectors.unexplored = [lightgray]Unentdeckt
sectors.resources = Ressourcen: sectors.resources = Ressourcen:
sectors.production = Produktion: sectors.production = Produktion:
@@ -617,6 +634,8 @@ sector.biomassFacility.name = Biomass Synthesis Facility
sector.windsweptIslands.name = Windswept Islands 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.coastline.name = Küstenlinie
sector.navalFortress.name = Wasserfestung
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.
@@ -644,10 +663,12 @@ status.sapped.name = Schwächend
status.electrified.name = Elektrisch status.electrified.name = Elektrisch
status.spore-slowed.name = Sporen-verlangsamt status.spore-slowed.name = Sporen-verlangsamt
status.tarred.name = Teerend status.tarred.name = Teerend
status.overdrive.name = Overdrive
status.overclock.name = Übertaktend status.overclock.name = Übertaktend
status.shocked.name = Schockend status.shocked.name = Schockend
status.blasted.name = Sprengend status.blasted.name = Sprengend
status.unmoving.name = Unbeweglich status.unmoving.name = Unbeweglich
status.boss.name = Boss
settings.language = Sprache settings.language = Sprache
settings.data = Spieldaten settings.data = Spieldaten
@@ -875,6 +896,7 @@ setting.seconds = {0} Sekunden
setting.milliseconds = {0} Millisekunden setting.milliseconds = {0} Millisekunden
setting.fullscreen.name = Vollbild setting.fullscreen.name = Vollbild
setting.borderlesswindow.name = Randloses Fenster setting.borderlesswindow.name = Randloses Fenster
setting.borderlesswindow.name.windows = Randloses Vollbild
setting.borderlesswindow.description = Neustart vielleicht erforderlich. setting.borderlesswindow.description = Neustart vielleicht erforderlich.
setting.fps.name = FPS anzeigen setting.fps.name = FPS anzeigen
setting.smoothcamera.name = Sanfte Kamerabewegungen setting.smoothcamera.name = Sanfte Kamerabewegungen
@@ -998,6 +1020,7 @@ rules.wavetimer = Wellen-Timer
rules.waves = Wellen rules.waves = Wellen
rules.attack = Angriff-Modus rules.attack = Angriff-Modus
rules.buildai = KI kann bauen rules.buildai = KI kann bauen
rules.aitier = KI Stärke
rules.cleanupdeadteams = Blöcke von erorberten Teams zerstören (PvP) rules.cleanupdeadteams = Blöcke von erorberten Teams zerstören (PvP)
rules.corecapture = Kern nach Zerstörung einnehmen rules.corecapture = Kern nach Zerstörung einnehmen
rules.polygoncoreprotection = Polygonaler Kernschutz rules.polygoncoreprotection = Polygonaler Kernschutz
@@ -1017,12 +1040,15 @@ rules.deconstructrefundmultiplier = Abbau Ressourcen-Rückerstattung
rules.waitForWaveToEnd = Warten bis Welle endet rules.waitForWaveToEnd = Warten bis Welle endet
rules.dropzoneradius = Drop-Zonen-Radius:[lightgray] (Kacheln) rules.dropzoneradius = Drop-Zonen-Radius:[lightgray] (Kacheln)
rules.unitammo = Einheiten benötigen Munition rules.unitammo = Einheiten benötigen Munition
rules.enemyteam = Gegnerteam
rules.playerteam = Spielerteam
rules.title.waves = Wellen rules.title.waves = Wellen
rules.title.resourcesbuilding = Ressourcen & Blöcke rules.title.resourcesbuilding = Ressourcen & Blöcke
rules.title.enemy = Gegner rules.title.enemy = Gegner
rules.title.unit = Einheiten rules.title.unit = Einheiten
rules.title.experimental = Experimentell rules.title.experimental = Experimentell
rules.title.environment = Umgebung rules.title.environment = Umgebung
rules.title.teams = Teams
rules.lighting = Blitze rules.lighting = Blitze
rules.enemyLights = Gegnerisches Licht rules.enemyLights = Gegnerisches Licht
rules.fire = Feuer rules.fire = Feuer
@@ -1101,13 +1127,13 @@ unit.reign.name = Reign
unit.vela.name = Vela unit.vela.name = Vela
unit.corvus.name = Korvus unit.corvus.name = Korvus
block.resupply-point.name = Munitionsvorrat
block.parallax.name = Parallax block.parallax.name = Parallax
block.cliff.name = Klippe block.cliff.name = Klippe
block.sand-boulder.name = Sandbrocken block.sand-boulder.name = Sandbrocken
block.basalt-boulder.name = Basaltbrocken block.basalt-boulder.name = Basaltbrocken
block.grass.name = Gras block.grass.name = Gras
block.molten-slag.name = Schlacke block.molten-slag.name = Schlacke
block.pooled-cryofluid.name = Cryoflüssigkeit
block.space.name = Weltall block.space.name = Weltall
block.salt.name = Salz block.salt.name = Salz
block.salt-wall.name = Salzwand block.salt-wall.name = Salzwand
@@ -1141,6 +1167,7 @@ block.core-nucleus.name = Kern: Nukleus
block.deep-water.name = Tiefes Wasser block.deep-water.name = Tiefes Wasser
block.shallow-water.name = Wasser block.shallow-water.name = Wasser
block.tainted-water.name = Dreckiges Wasser block.tainted-water.name = Dreckiges Wasser
block.deep-tainted-water.name = Tiefes dreckiges Wasser
block.darksand-tainted-water.name = Dreckiges Wasser (Dunkler Sand) block.darksand-tainted-water.name = Dreckiges Wasser (Dunkler Sand)
block.tar.name = Teer block.tar.name = Teer
block.stone.name = Stein block.stone.name = Stein
@@ -1352,6 +1379,7 @@ hint.placeTurret = Platziere \uf861 [accent]Geschütze[], um deine Basis vor Geg
hint.breaking = Benutze [accent]Rechtsklick[] 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 und 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.blockInfo = Genauere Blockinformationen können im [accent]Baumenü[] rechts beim [accent][[?][]-Symbol gefunden werden. hint.blockInfo = Genauere Blockinformationen können im [accent]Baumenü[] rechts beim [accent][[?][]-Symbol gefunden werden.
hint.derelict = [accent]Derelikte[] Blöcke sind kaputte Teile alter Basen, die nicht mehr funktionieren.\n\nSie können für Ressourcen [accent]abgebaut[] werden.
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]klicke[], 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.
@@ -1373,6 +1401,7 @@ hint.generator = \uf879 [accent]Verbrennungsgeneratoren[] verbrennen Kohle und
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.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.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.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.presetDifficulty = Dieser Sektor hat eine [scarlet]hohe Gefahrenstufe[].\nOhne richtige Technologie und Vorbereitung ist es [accent]nicht empfohlen[], zu diesem Sektor zu starten.
hint.coreIncinerate = Wenn dem Kern Materialien zugeführt werden, für die er keinen Platz mehr hat, werden diese [accent]verbrannt[]. hint.coreIncinerate = Wenn dem Kern Materialien zugeführt werden, für die er keinen Platz mehr hat, werden diese [accent]verbrannt[].
hint.coopCampaign = Wenn du die [accent]Mehrspielerkampagne[] spielst, werden produzierte Items [accent]zu deinen lokalen Sektoren[] geschickt.\n\nNeuen Erforschungen vom Host werden auch übertragen. hint.coopCampaign = Wenn du die [accent]Mehrspielerkampagne[] spielst, werden produzierte Items [accent]zu deinen lokalen Sektoren[] geschickt.\n\nNeuen Erforschungen vom Host werden auch übertragen.
@@ -1403,7 +1432,7 @@ liquid.slag.description = Kann in Trennern verfeinert oder als Waffe gegen Gegne
liquid.oil.description = Wird in fortgeschrittener Materialgewinnung und als brennende Munition verwendet. liquid.oil.description = Wird in fortgeschrittener Materialgewinnung und als brennende Munition verwendet.
liquid.cryofluid.description = Wird als Kühlung in Geschützen, 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.derelict =  [lightgray]Derelikt
block.armored-conveyor.description = Bewegt Materialien voran. Materialien 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.
@@ -1429,6 +1458,8 @@ block.item-source.description = Produziert unendlich viele Gegenstände. Nur im
block.item-void.description = Zerstört Materialien, die hereingegeben werden, ohne Strom zu verbrauchen. Nur im Sandkasten-Modus verfügbar. block.item-void.description = Zerstört Materialien, die hereingegeben werden, ohne Strom zu verbrauchen. Nur im Sandkasten-Modus verfügbar.
block.liquid-source.description = Produziert unendlich Flüssigkeiten. Nur im Sandkasten-Modus verfügbar. block.liquid-source.description = Produziert unendlich Flüssigkeiten. Nur im Sandkasten-Modus verfügbar.
block.liquid-void.description = Entfernt jegliche Flüssigkeiten. Nur im Sandkasten-Modus verfügbar. block.liquid-void.description = Entfernt jegliche Flüssigkeiten. Nur im Sandkasten-Modus verfügbar.
block.payload-source.description = Produziert unendlich Einheiten. Nur im Sandkasten-Modus verfügbar.
block.payload-void.description = Entfernt jegliche Einheiten. Nur im Sandkasten-Modus verfügbar.
block.copper-wall.description = Beschützt Blöcke vor Gegnern. block.copper-wall.description = Beschützt Blöcke vor Gegnern.
block.copper-wall-large.description = Beschützt Blöcke vor Gegnern. block.copper-wall-large.description = Beschützt Blöcke vor Gegnern.
block.titanium-wall.description = Beschützt Blöcke vor Gegnern. block.titanium-wall.description = Beschützt Blöcke vor Gegnern.
@@ -1583,7 +1614,7 @@ unit.omura.description = Schießt eine Railgun mit hoher Reichweite, um Gegner z
unit.alpha.description = Beschützt den Scherbenkern vor Feinden. Baut Blöcke. unit.alpha.description = Beschützt den Scherbenkern vor Feinden. Baut Blöcke.
unit.beta.description = Beschützt den Fundamentkern vor Feinden. Baut Blöcke. unit.beta.description = Beschützt den Fundamentkern vor Feinden. Baut Blöcke.
unit.gamma.description = Beschützt den Nukleuskern vor Feinden. Baut Blöcke. unit.gamma.description = Beschützt den Nukleuskern vor Feinden. Baut Blöcke.
unit.retusa.description = Platziert Minen und heilt verbündete Einheiten. unit.retusa.description = Schießt zielsuchende Torpedos auf Gegner und heilt verbündete Einheiten.
unit.oxynoe.description = Schießt Block-heilendes Feuer auf Gegner und zerstört gegnerische Projektile. unit.oxynoe.description = Schießt Block-heilendes Feuer auf Gegner und zerstört gegnerische Projektile.
unit.cyerce.description = Schießt zielsuchende Cluster-Raketen auf Gegner und heilt verbündete Einheiten. unit.cyerce.description = Schießt zielsuchende Cluster-Raketen auf Gegner und heilt verbündete Einheiten.
unit.aegires.description = Schockt alle gegnerische Einheiten und Blöcke, die das Energiefeld betreten. Heilt alle verbündete. unit.aegires.description = Schockt alle gegnerische Einheiten und Blöcke, die das Energiefeld betreten. Heilt alle verbündete.

View File

@@ -379,6 +379,13 @@ editor.ingame = Editar dentro del juego
editor.publish.workshop = Publicar en el Steam Workshop editor.publish.workshop = Publicar en el Steam Workshop
editor.newmap = Nuevo Mapa editor.newmap = Nuevo Mapa
editor.center = Centrar editor.center = Centrar
editor.search = Buscar mapas...
editor.filters = Filtrar Mapas
editor.filters.mode = Modos de juego:
editor.filters.type = Tipo de mapa:
editor.filters.search = Buscar en:
editor.filters.author = Autor
editor.filters.description = Descripción
workshop = Steam Workshop workshop = Steam Workshop
waves.title = Oleadas waves.title = Oleadas
waves.remove = Borrar waves.remove = Borrar
@@ -412,6 +419,7 @@ wavemode.health = por salud
editor.default = [lightgray]<Por defecto> editor.default = [lightgray]<Por defecto>
details = Detalles... details = Detalles...
edit = Editar... edit = Editar...
variables = Variables
editor.name = Nombre: editor.name = Nombre:
editor.spawn = Aparecer unidad editor.spawn = Aparecer unidad
editor.removeunit = Borrar Unidad editor.removeunit = Borrar Unidad
@@ -1291,6 +1299,7 @@ block.plated-conduit.name = Conducto Acorazado
block.phase-conduit.name = Conducto de Fase block.phase-conduit.name = Conducto de Fase
block.liquid-router.name = Enrutador de Líquidos block.liquid-router.name = Enrutador de Líquidos
block.liquid-tank.name = Tanque de Líquidos block.liquid-tank.name = Tanque de Líquidos
block.liquid-container.name = Contenedor de Líquidos
block.liquid-junction.name = Cruce de Líquidos block.liquid-junction.name = Cruce de Líquidos
block.bridge-conduit.name = Conducto Puente block.bridge-conduit.name = Conducto Puente
block.rotary-pump.name = Bomba Rotatoria block.rotary-pump.name = Bomba Rotatoria
@@ -1337,13 +1346,19 @@ block.disassembler.name = Desensamblador
block.silicon-crucible.name = Crisol de silicio block.silicon-crucible.name = Crisol de silicio
block.overdrive-dome.name = Campo de Aceleración block.overdrive-dome.name = Campo de Aceleración
block.interplanetary-accelerator.name = Acelerador Interplanetario block.interplanetary-accelerator.name = Acelerador Interplanetario
#experimental, puede ser eliminado block.constructor.name = Constructor
block.block-forge.name = Forja de Carga block.constructor.description = Construye estructuras de hasta un tamaño de 2x2.
block.block-loader.name = Cargador de Carga block.large-constructor.name = Constructor grande
block.block-unloader.name = Descargador de Carga block.large-constructor.description = Construye estructuras de hasta un tamaño de 4x4.
block.deconstructor.name = Deconstructor
block.deconstructor.description = Deconstruye estructuras y unidades, devuelve el 100% de su costo original.
block.payload-loader.name = Cargador de carga útil
block.payload-loader.description = Carga objetos y líquidos en los bloques.
block.payload-unloader.name = Descargador de carga útil
block.payload-unloader.description = Descarga objetos y líquidos de los bloques.
block.switch.name = Interruptor block.switch.name = Interruptor
block.micro-processor.name = Micro Processador block.micro-processor.name = Micro Procesador
block.logic-processor.name = Procesador lógico block.logic-processor.name = Procesador lógico
block.hyper-processor.name = Hiperprocesador block.hyper-processor.name = Hiperprocesador
block.logic-display.name = Pantalla lógica block.logic-display.name = Pantalla lógica
@@ -1496,6 +1511,7 @@ block.conduit.description = Mueve líquidos hacia delante. Se usa junto con bomb
block.pulse-conduit.description = Transporta líquidos rápidamente y almacena más que los conductos estándar. block.pulse-conduit.description = Transporta líquidos rápidamente y almacena más que los conductos estándar.
block.plated-conduit.description = Transporta líquidos rápidamente pero no acepta líquidos por los lados. Resiste más ante fugas, por lo que no gotea. block.plated-conduit.description = Transporta líquidos rápidamente pero no acepta líquidos por los lados. Resiste más ante fugas, por lo que no gotea.
block.liquid-router.description = Acepta líquidos de una dirección y los reparte en hasta 3 direcciones equitativamente. También puede almacenar cierta capacidad de líquido. block.liquid-router.description = Acepta líquidos de una dirección y los reparte en hasta 3 direcciones equitativamente. También puede almacenar cierta capacidad de líquido.
block-liquid-container.description = Almacena una cantidad considerable de líquidos. Lo devuelve en todas las direcciones de salida válidas, como un enrutador de líquidos.
block.liquid-tank.description = Almacena una gran cantidad de líquidos. Lo devuelve en todas direcciones de salida válidas, como un enrutador de líquidos. block.liquid-tank.description = Almacena una gran cantidad de líquidos. Lo devuelve en todas direcciones de salida válidas, como un enrutador de líquidos.
block.liquid-junction.description = Actúa como un puente para dos conductos que se cruzan. block.liquid-junction.description = Actúa como un puente para dos conductos que se cruzan.
block.bridge-conduit.description = Permite transportar líquidos sobre cualquier terreno o estructura. block.bridge-conduit.description = Permite transportar líquidos sobre cualquier terreno o estructura.

View File

@@ -288,6 +288,7 @@ save.corrupted = Fichier de sauvegarde corrompu ou invalide !
empty = <vide> empty = <vide>
on = Activé on = Activé
off = Désactivé off = Désactivé
save.search = Recherche de parties sauvegardées...
save.autosave = Sauvegarde automatique : {0} save.autosave = Sauvegarde automatique : {0}
save.map = Carte : {0} save.map = Carte : {0}
save.wave = Vague {0} save.wave = Vague {0}
@@ -381,7 +382,11 @@ editor.newmap = Nouvelle carte
editor.center = Centrer editor.center = Centrer
editor.search = Recherche de cartes... editor.search = Recherche de cartes...
editor.filters = Filtrer les cartes editor.filters = Filtrer les cartes
editor.showAll = Afficher les cartes par défaut editor.filters.mode = Modes de jeu :
editor.filters.type = Type de carte :
editor.filters.search = Rechercher dans :
editor.filters.author = Auteur
editor.filters.description = Description
workshop = Steam Workshop workshop = Steam Workshop
waves.title = Vagues waves.title = Vagues
waves.remove = Supprimer waves.remove = Supprimer

View File

@@ -78,13 +78,12 @@ schematic.tagexists = Tanda ini sudah ada.
stats = Statistik stats = Statistik
stat.wave = Gelombang Terkalahkan:[accent] {0} stat.wave = Gelombang Terkalahkan:[accent] {0}
stat.unitsCreated = Unit Terbentuk:[accent] {0}
stat.enemiesDestroyed = Musuh Terhancurkan:[accent] {0} stat.enemiesDestroyed = Musuh Terhancurkan:[accent] {0}
stat.built = Jumlah Blok yang Dibangun:[accent] {0} stat.built = Jumlah Blok yang Dibangun:[accent] {0}
stat.destroyed = Jumlah Blok Dihancurkan Musuh:[accent] {0} stat.destroyed = Jumlah Blok Dihancurkan Musuh:[accent] {0}
stat.deconstructed = Jumlah Blok Dihancurkan Pemain:[accent] {0} stat.deconstructed = Jumlah Blok Dihancurkan Pemain:[accent] {0}
stat.delivered = Sumber Daya yang Diluncurkan:
stat.playtime = Waktu Bermain:[accent] {0} stat.playtime = Waktu Bermain:[accent] {0}
stat.rank = Nilai Akhir: [accent]{0}
globalitems = [accent]Bahan Keseluruhan globalitems = [accent]Bahan Keseluruhan
map.delete = Apakah Anda yakin ingin menghapus peta "[accent]{0}[]"? map.delete = Apakah Anda yakin ingin menghapus peta "[accent]{0}[]"?
@@ -94,6 +93,7 @@ level.mode = Mode Permainan:
coreattack = < Inti sedang diserang! > coreattack = < Inti sedang diserang! >
nearpoint = [[ [scarlet]TINGGALKAN TITIK JATUH SEGERA[] ]\npenghancuran akan terjadi nearpoint = [[ [scarlet]TINGGALKAN TITIK JATUH SEGERA[] ]\npenghancuran akan terjadi
database = Basis Data Inti database = Basis Data Inti
database.button = Basis Data
savegame = Simpan Permainan savegame = Simpan Permainan
loadgame = Muat Permainan loadgame = Muat Permainan
joingame = Bermain Bersama joingame = Bermain Bersama
@@ -169,6 +169,7 @@ launchcore = Luncurkan Inti
filename = Nama File: filename = Nama File:
unlocked = Konten baru terbuka! unlocked = Konten baru terbuka!
available = Penelitian baru tersedia! available = Penelitian baru tersedia!
unlock.incampaign = < Buka dalam kampanye untuk detail lebih lanjut >
completed = [accent]Terselesaikan completed = [accent]Terselesaikan
techtree = Cabang Teknologi techtree = Cabang Teknologi
research.legacy = Data penelitian [accent]5.0[] ditemukan.\nApakah kamu ingin [accent]memuat data ini[], atau [accent]mengabaikannya[] dan memulai ulang penelitian di kampanye terbaru (disarankan)? research.legacy = Data penelitian [accent]5.0[] ditemukan.\nApakah kamu ingin [accent]memuat data ini[], atau [accent]mengabaikannya[] dan memulai ulang penelitian di kampanye terbaru (disarankan)?
@@ -287,6 +288,7 @@ save.corrupted = [accent]File simpanan rusak atau tidak sah!\nJika Anda baru saj
empty = <kosong> empty = <kosong>
on = Aktif on = Aktif
off = Nonaktif off = Nonaktif
save.search = Cari permainan tersimpan...
save.autosave = Simpan otomatis: {0} save.autosave = Simpan otomatis: {0}
save.map = Peta: {0} save.map = Peta: {0}
save.wave = Gelombang {0} save.wave = Gelombang {0}
@@ -362,6 +364,7 @@ publish.confirm = Apakah Anda yakin untuk menerbitkan item ini?\n\n[lightgray]Pa
publish.error = Terjadi kesalahan saat menerbitkan item: {0} publish.error = Terjadi kesalahan saat menerbitkan item: {0}
steam.error = Gagal untuk menjalankan layanan Steam.\nKesalahan: {0} steam.error = Gagal untuk menjalankan layanan Steam.\nKesalahan: {0}
editor.cliffs = Dinding Ke Jurang
editor.brush = Kuas editor.brush = Kuas
editor.openin = Buka di Penyunting editor.openin = Buka di Penyunting
editor.oregen = Generasi Sumber Daya editor.oregen = Generasi Sumber Daya
@@ -377,6 +380,13 @@ editor.ingame = Sunting dalam Permainan
editor.publish.workshop = Terbitkan di Workshop editor.publish.workshop = Terbitkan di Workshop
editor.newmap = Peta Baru editor.newmap = Peta Baru
editor.center = Pusat editor.center = Pusat
editor.search = Cari peta...
editor.filters = Filter Peta
editor.filters.mode = Mode Permainan:
editor.filters.type = Tipe Peta:
editor.filters.search = Cari Dalam:
editor.filters.author = Pembuat
editor.filters.description = Deskripsi
workshop = Workshop workshop = Workshop
waves.title = Gelombang waves.title = Gelombang
waves.remove = Hapus waves.remove = Hapus
@@ -385,6 +395,7 @@ waves.waves = gelombang
waves.perspawn = per muncul waves.perspawn = per muncul
waves.shields = perisai/gelombang waves.shields = perisai/gelombang
waves.to = sampai waves.to = sampai
waves.max = unit maks
waves.guardian = Penjaga waves.guardian = Penjaga
waves.preview = Pratinjau waves.preview = Pratinjau
waves.edit = Sunting... waves.edit = Sunting...
@@ -393,6 +404,13 @@ waves.load = Tempel dari Papan klip
waves.invalid = Gelombang tidak valid di papan klip. waves.invalid = Gelombang tidak valid di papan klip.
waves.copied = Gelombang tersalin. waves.copied = Gelombang tersalin.
waves.none = Tidak ada musuh yang didefinisikan.\nIngat bahwa susunan gelombang yang kosong akan diubah menjadi susunan gelombang standar secara otomatis. waves.none = Tidak ada musuh yang didefinisikan.\nIngat bahwa susunan gelombang yang kosong akan diubah menjadi susunan gelombang standar secara otomatis.
waves.sort = Urut Berdasarkan
waves.sort.reverse = Urut Balik
waves.sort.begin = Mulai
waves.sort.health = Darah
waves.sort.type = Tipe
waves.units.hide = Sembunyikan Semua
waves.units.show = Lihat Semua
#memang sengaja diberi huruf kecil #memang sengaja diberi huruf kecil
wavemode.counts = jumlah wavemode.counts = jumlah
@@ -402,6 +420,7 @@ wavemode.health = darah
editor.default = [lightgray]<Standar> editor.default = [lightgray]<Standar>
details = Detail... details = Detail...
edit = Sunting... edit = Sunting...
variables = Vars
editor.name = Nama: editor.name = Nama:
editor.spawn = Munculkan Unit editor.spawn = Munculkan Unit
editor.removeunit = Hapus Unit editor.removeunit = Hapus Unit
@@ -538,7 +557,8 @@ configure = Konfigurasi Muatan
loadout = Muatan loadout = Muatan
resources = Sumber Daya resources = Sumber Daya
bannedblocks = Balok yang dilarang bannedblocks = Balok yang Dilarang
bannedunits = Unit yang Dilarang
addall = Tambah Semua addall = Tambah Semua
launch.from = Meluncurkan Dari: [accent]{0} launch.from = Meluncurkan Dari: [accent]{0}
launch.destination = Destinasi: {0} launch.destination = Destinasi: {0}
@@ -563,6 +583,8 @@ weather.sandstorm.name = Badai Pasir
weather.sporestorm.name = Badai Spora weather.sporestorm.name = Badai Spora
weather.fog.name = Kabut weather.fog.name = Kabut
sectorlist = Sektor
sectorlist.attacked = {0} sedang diserang
sectors.unexplored = [lightgray]Belum Ditelusuri sectors.unexplored = [lightgray]Belum Ditelusuri
sectors.resources = Sumber Daya: sectors.resources = Sumber Daya:
sectors.production = Produksi: sectors.production = Produksi:
@@ -618,6 +640,8 @@ sector.biomassFacility.name = Pabrik Sintesis Biomassa
sector.windsweptIslands.name = Pulau Bersemilir sector.windsweptIslands.name = Pulau Bersemilir
sector.extractionOutpost.name = Pos Ekstraksi Terdepan sector.extractionOutpost.name = Pos Ekstraksi Terdepan
sector.planetaryTerminal.name = Pusat Peluncuran Planet sector.planetaryTerminal.name = Pusat Peluncuran Planet
sector.coastline.name = Tepi Pantai
sector.navalFortress.name = Benteng Laut
sector.groundZero.description = Lokasi yang optimal untuk bermain satu kali lagi. Sangat sedikit musuh. Beberapa sumber daya dapat dikumpulkan.\nKumpulkan timah dan tembaga sebanyak yang kamu bisa.\nMulai dari sini. sector.groundZero.description = Lokasi yang optimal untuk bermain satu kali lagi. Sangat sedikit musuh. Beberapa sumber daya dapat dikumpulkan.\nKumpulkan timah dan tembaga sebanyak yang kamu bisa.\nMulai dari sini.
sector.frozenForest.description = Disini, dekat dengan gunung, spora sudah menyebar. Suhu dingin tidak dapat menahannya.\n\nHasilkan listrik. Bangun generator pembakar. Pelajari cara menggunakan mender. sector.frozenForest.description = Disini, dekat dengan gunung, spora sudah menyebar. Suhu dingin tidak dapat menahannya.\n\nHasilkan listrik. Bangun generator pembakar. Pelajari cara menggunakan mender.
@@ -645,10 +669,12 @@ status.sapped.name = Melemahkan
status.electrified.name = Dialiri Listrik status.electrified.name = Dialiri Listrik
status.spore-slowed.name = Spora Melambat status.spore-slowed.name = Spora Melambat
status.tarred.name = Berminyak status.tarred.name = Berminyak
status.overdrive.name = Dipercepat
status.overclock.name = Melebihi Batas status.overclock.name = Melebihi Batas
status.shocked.name = Mengkejut status.shocked.name = Mengkejut
status.blasted.name = Meledak status.blasted.name = Meledak
status.unmoving.name = Terdiam status.unmoving.name = Terdiam
status.boss.name = Guardian
settings.language = Bahasa settings.language = Bahasa
settings.data = Data Game settings.data = Data Game
@@ -875,7 +901,8 @@ setting.saveinterval.name = Jarak Menyimpan
setting.seconds = {0} detik setting.seconds = {0} detik
setting.milliseconds = {0} milidetik setting.milliseconds = {0} milidetik
setting.fullscreen.name = Layar Penuh setting.fullscreen.name = Layar Penuh
setting.borderlesswindow.name = Jendela tak Berbatas[lightgray] setting.borderlesswindow.name = Jendela tak Berbatas
setting.borderlesswindow.name.windows = Layar Penuh tak Berbatas
setting.borderlesswindow.description = Mulai ulang mungkin diperlukan untuk menerapkan perubahan. setting.borderlesswindow.description = Mulai ulang mungkin diperlukan untuk menerapkan perubahan.
setting.fps.name = Tunjukkan FPS setting.fps.name = Tunjukkan FPS
setting.smoothcamera.name = Kamera Halus setting.smoothcamera.name = Kamera Halus
@@ -999,10 +1026,11 @@ rules.wavetimer = Pengaturan Waktu Gelombang
rules.waves = Gelombang rules.waves = Gelombang
rules.attack = Mode Penyerangan rules.attack = Mode Penyerangan
rules.buildai = Bangunan A.I. rules.buildai = Bangunan A.I.
rules.aitier = Tingkatan A.I.
rules.cleanupdeadteams = Bersihkan Bangunan Tim yang Kalah (PvP) rules.cleanupdeadteams = Bersihkan Bangunan Tim yang Kalah (PvP)
rules.corecapture = Tangkap Inti Saat Kehancuran rules.corecapture = Tangkap Inti Saat Kehancuran
rules.polygoncoreprotection = Poligon Pelindung Inti rules.polygoncoreprotection = Poligon Pelindung Inti
rules.enemyCheat = Sumber Daya A.I. Musuh (Tim Merah) Tak Terbatas rules.enemyCheat = Sumber Daya A.I. (Tim Merah) Tak Terbatas
rules.blockhealthmultiplier = Penggandaan Darah Blok rules.blockhealthmultiplier = Penggandaan Darah Blok
rules.blockdamagemultiplier = Penggandaan Kekuatan Blok rules.blockdamagemultiplier = Penggandaan Kekuatan Blok
rules.unitbuildspeedmultiplier = Penggandaan Kecepatan Munculnya Unit rules.unitbuildspeedmultiplier = Penggandaan Kecepatan Munculnya Unit
@@ -1018,12 +1046,15 @@ rules.deconstructrefundmultiplier = Penggandaan Kembalinya Bahan Bangunan yang D
rules.waitForWaveToEnd = Gelombang Menunggu Musuh rules.waitForWaveToEnd = Gelombang Menunggu Musuh
rules.dropzoneradius = Radius Titik Muncul:[lightgray] (Blok) rules.dropzoneradius = Radius Titik Muncul:[lightgray] (Blok)
rules.unitammo = Unit Membutuhkan Amunisi rules.unitammo = Unit Membutuhkan Amunisi
rules.enemyteam = Tim Musuh
rules.playerteam = Tim Pemain
rules.title.waves = Gelombang rules.title.waves = Gelombang
rules.title.resourcesbuilding = Sumber Daya & Bangunan rules.title.resourcesbuilding = Sumber Daya & Bangunan
rules.title.enemy = Musuh rules.title.enemy = Musuh
rules.title.unit = Unit rules.title.unit = Unit
rules.title.experimental = Eksperimental rules.title.experimental = Eksperimental
rules.title.environment = Lingkungan rules.title.environment = Lingkungan
rules.title.teams = Tim
rules.lighting = Penerangan rules.lighting = Penerangan
rules.enemyLights = Sinar dari Musuh rules.enemyLights = Sinar dari Musuh
rules.fire = Api rules.fire = Api
@@ -1102,13 +1133,13 @@ unit.reign.name = Reign
unit.vela.name = Vela unit.vela.name = Vela
unit.corvus.name = Corvus unit.corvus.name = Corvus
block.resupply-point.name = Titik Pemasok Ulang
block.parallax.name = Parallax block.parallax.name = Parallax
block.cliff.name = Cliff block.cliff.name = Cliff
block.sand-boulder.name = Batu Pasir Besar block.sand-boulder.name = Batu Pasir Besar
block.basalt-boulder.name = Batu Basal Besar block.basalt-boulder.name = Batu Basal Besar
block.grass.name = Rumput block.grass.name = Rumput
block.molten-slag.name = Lahar block.molten-slag.name = Lahar
block.pooled-cryofluid.name = Cairan Dingin
block.space.name = Luar Angkasa block.space.name = Luar Angkasa
block.salt.name = Garam block.salt.name = Garam
block.salt-wall.name = Bukit Garam block.salt-wall.name = Bukit Garam
@@ -1142,6 +1173,7 @@ block.core-nucleus.name = Inti: Nukleus
block.deep-water.name = Air Dalam block.deep-water.name = Air Dalam
block.shallow-water.name = Air block.shallow-water.name = Air
block.tainted-water.name = Air Ternoda block.tainted-water.name = Air Ternoda
block.deep-tainted-water.name = Air Dalam Ternoda
block.darksand-tainted-water.name = Air Ternodai Pasir Hitam block.darksand-tainted-water.name = Air Ternodai Pasir Hitam
block.tar.name = Minyak Mentah block.tar.name = Minyak Mentah
block.stone.name = Batu block.stone.name = Batu
@@ -1268,7 +1300,8 @@ block.pulse-conduit.name = Selang Denyut
block.plated-conduit.name = Pipa Terlapis block.plated-conduit.name = Pipa Terlapis
block.phase-conduit.name = Selang Phase block.phase-conduit.name = Selang Phase
block.liquid-router.name = Pengarah Cairan block.liquid-router.name = Pengarah Cairan
block.liquid-tank.name = Bak Cairan block.liquid-tank.name = Tangki Cairan
block.liquid-container.name = Kontainer Cairan
block.liquid-junction.name = Simpangan Cairan block.liquid-junction.name = Simpangan Cairan
block.bridge-conduit.name = Jembatan Saluran block.bridge-conduit.name = Jembatan Saluran
block.rotary-pump.name = Pompa Putaran block.rotary-pump.name = Pompa Putaran
@@ -1315,10 +1348,16 @@ block.disassembler.name = Pembongkar
block.silicon-crucible.name = Pelebur Raksasa block.silicon-crucible.name = Pelebur Raksasa
block.overdrive-dome.name = Kubah Projektor Pemercepat block.overdrive-dome.name = Kubah Projektor Pemercepat
block.interplanetary-accelerator.name = Akselerator Antarplanet block.interplanetary-accelerator.name = Akselerator Antarplanet
#experimental, may be removed block.constructor.name = Konstruktor
block.block-forge.name = Pemadu Blok block.constructor.description = Membuat struktur hingga ubin berukuran 2x2.
block.block-loader.name = Pemuat Blok block.large-constructor.name = Konstruktor Besar
block.block-unloader.name = Pembongkar Blok block.large-constructor.description = Membuat struktur hingga ubin berukuran 4x4.
block.deconstructor.name = Deskontruktor
block.deconstructor.description = Mendekonstruksi bangunan dan unit. Mengembalikan 100% dari biaya bahan.
block.payload-loader.name = Pemuat Blok
block.payload-loader.description = Memuat cairan dan item ke dalam blok.
block.payload-unloader.name = Pembongkar Blok
block.payload-unloader.description = Membongkar cairan dan item dari blok.
block.switch.name = Saklar block.switch.name = Saklar
block.micro-processor.name = Prosesor Mikro block.micro-processor.name = Prosesor Mikro
@@ -1375,6 +1414,7 @@ hint.generator = \uf879 [accent]Generator Pembakar[] membakar batu bara dan meng
hint.guardian = Unit [accent]Penjaga[] adalah unit yang diperkuat. Amunisi lemah seperti [accent]Tembaga[] dan [accent]Timah[] [scarlet]tidak efektif[].\n\nGunakan menara yang lebih bagus atau amunisi yang lebih kuat seperti \uf835 [accent]Grafit[] \uf861Duo/\uf859Salvo untuk menghancurkan Penjaga. hint.guardian = Unit [accent]Penjaga[] adalah unit yang diperkuat. Amunisi lemah seperti [accent]Tembaga[] dan [accent]Timah[] [scarlet]tidak efektif[].\n\nGunakan menara yang lebih bagus atau amunisi yang lebih kuat seperti \uf835 [accent]Grafit[] \uf861Duo/\uf859Salvo untuk menghancurkan Penjaga.
hint.coreUpgrade = Inti dapat ditingkatkan dengan cara [accent]meletakkan yang lebih besar diatasnya[].\n\nLetakan sebuah inti  [accent]Fondasi[] diatas inti  [accent]Shard[]. Pastikan terdapat ruang kosong dari bangunan yang lain. hint.coreUpgrade = Inti dapat ditingkatkan dengan cara [accent]meletakkan yang lebih besar diatasnya[].\n\nLetakan sebuah inti  [accent]Fondasi[] diatas inti  [accent]Shard[]. Pastikan terdapat ruang kosong dari bangunan yang lain.
hint.presetLaunch = [accent]Zona pendaratan[] yang berwarna abu-abu, seperti [accent]Hutan yang Beku[], dapat diluncurkan dari mana saja. Sektor seperti ini tidak perlu diluncurkan dari sektor terdekat milik kamu.\n\n[accent]Sektor yang bernomor[], seperti yang ini, bisa [accent]dikuasai atau diabaikan[]. hint.presetLaunch = [accent]Zona pendaratan[] yang berwarna abu-abu, seperti [accent]Hutan yang Beku[], dapat diluncurkan dari mana saja. Sektor seperti ini tidak perlu diluncurkan dari sektor terdekat milik kamu.\n\n[accent]Sektor yang bernomor[], seperti yang ini, bisa [accent]dikuasai atau diabaikan[].
hint.presetDifficulty = Sektor ini memiliki [scarlet]ancaman bahaya musuh yang tinggi[].\nMeluncurkan ke sektor tersebut [accent]tidak disarankan[] tanpa teknologi yang sesuai dan persiapan yang matang.
hint.coreIncinerate = Setelah inti penuh dengan suatu barang, barang yang setipe akan [accent]dihancurkan[]. hint.coreIncinerate = Setelah inti penuh dengan suatu barang, barang yang setipe akan [accent]dihancurkan[].
hint.coopCampaign = Ketika bermain [accent]kampanye multiplayer[], barang yang diproduksi di map ini akan diberikan ke [accent]sektor kamu juga[].\n\nSetiap penelitian baru yang dilakukan oleh host juga akan diberikan kepadamu. hint.coopCampaign = Ketika bermain [accent]kampanye multiplayer[], barang yang diproduksi di map ini akan diberikan ke [accent]sektor kamu juga[].\n\nSetiap penelitian baru yang dilakukan oleh host juga akan diberikan kepadamu.
@@ -1406,7 +1446,6 @@ liquid.oil.description = Digunakan di produksi material lanjutan dan sebagai amu
liquid.cryofluid.description = Digunakan sebagai pendingin di reaktor, menara, dan pabrik. liquid.cryofluid.description = Digunakan sebagai pendingin di reaktor, menara, dan pabrik.
block.derelict = [lightgray] Derelik block.derelict = [lightgray] Derelik
block.resupply-point.description = Mengisi ulang amunisi unit terdekat dengan tembaga. Tidak dapat mengisi ulang unit yang menggunakan tenaga baterai.
block.armored-conveyor.description = Memindahkan barang ke depan. Tidak dapat menerima masukan dari samping. block.armored-conveyor.description = Memindahkan barang ke depan. Tidak dapat menerima masukan dari samping.
block.illuminator.description = Memancarkan cahaya. block.illuminator.description = Memancarkan cahaya.
block.message.description = Menyimpan pesan untuk komunikasi antar sekutu. block.message.description = Menyimpan pesan untuk komunikasi antar sekutu.
@@ -1417,7 +1456,7 @@ block.kiln.description = Membakar pasir dan timah menjadi metaglass.
block.plastanium-compressor.description = Memproduksi plastanium dari minyak dan titanium. block.plastanium-compressor.description = Memproduksi plastanium dari minyak dan titanium.
block.phase-weaver.description = Memproduksi kain phase dari thorium dan banyak pasir. block.phase-weaver.description = Memproduksi kain phase dari thorium dan banyak pasir.
block.alloy-smelter.description = Memproduksi campuran logam dari titanium, timah, silikon dan tembaga. block.alloy-smelter.description = Memproduksi campuran logam dari titanium, timah, silikon dan tembaga.
block.cryofluidmixer.description = Mencampur air dan titanium menjadi cairan dingin. block.cryofluid-mixer.description = Mencampur air dan titanium menjadi cairan dingin.
block.blast-mixer.description = Memproduksi senyawa peledak dari pyratit dan polong spora. block.blast-mixer.description = Memproduksi senyawa peledak dari pyratit dan polong spora.
block.pyratite-mixer.description = Mencampur batu bara, timah dan pasir menjadi pyratit. block.pyratite-mixer.description = Mencampur batu bara, timah dan pasir menjadi pyratit.
block.melter.description = Melelehkan rongsokan menjadi lava. block.melter.description = Melelehkan rongsokan menjadi lava.
@@ -1432,6 +1471,8 @@ block.item-source.description = Mengeluarkan bahan tak terhingga. Sandbox eksklu
block.item-void.description = Menghancurkan bahan apa saja. Sandbox eksklusif. block.item-void.description = Menghancurkan bahan apa saja. Sandbox eksklusif.
block.liquid-source.description = Mengeluarkan zat cair tak terhingga. Sandbox eksklusif. block.liquid-source.description = Mengeluarkan zat cair tak terhingga. Sandbox eksklusif.
block.liquid-void.description = Menghancurkan zat cair apa saja. Sandbox eksklusif. block.liquid-void.description = Menghancurkan zat cair apa saja. Sandbox eksklusif.
block.payload-source.description = Infinitely outputs payloads. Sandbox only.
block.payload-void.description = Destroys any payloads. Sandbox only.
block.copper-wall.description = Melindungi bangunan dari tembakan musuh. block.copper-wall.description = Melindungi bangunan dari tembakan musuh.
block.copper-wall-large.description = Melindungi bangunan dari tembakan musuh. block.copper-wall-large.description = Melindungi bangunan dari tembakan musuh.
block.titanium-wall.description = Melindungi bangunan dari tembakan musuh. block.titanium-wall.description = Melindungi bangunan dari tembakan musuh.
@@ -1472,7 +1513,8 @@ block.conduit.description = Memindahkan cairan ke depan. Digunakan dengan pompa
block.pulse-conduit.description = Memindahkan cairan ke depan. Mengantarkan lebih cepat dan banyak daripada saluran biasa. block.pulse-conduit.description = Memindahkan cairan ke depan. Mengantarkan lebih cepat dan banyak daripada saluran biasa.
block.plated-conduit.description = Memindahkan cairan ke depan. Tidak menerima cairan dari samping. Tidak bocor. block.plated-conduit.description = Memindahkan cairan ke depan. Tidak menerima cairan dari samping. Tidak bocor.
block.liquid-router.description = Menerima cairan dari satu arah dan mengeluarkannya ke 3 arah secara rata. Dapat digunakan untuk menyimpan sejumlah cairan. block.liquid-router.description = Menerima cairan dari satu arah dan mengeluarkannya ke 3 arah secara rata. Dapat digunakan untuk menyimpan sejumlah cairan.
block.liquid-tank.description = Menyimpan jumlah cairan yang banyak. Mengeluarkan cairan ke segala arah, sama seperti pengarah cairan. block.liquid-container.description = Menyimpan jumlah cairan yang banyak. Mengeluarkan cairan ke segala arah, sama seperti pengarah cairan.
block.liquid-tank.description = Menyimpan jumlah cairan yang sangat banyak. Mengeluarkan cairan ke segala arah, sama seperti pengarah cairan.
block.liquid-junction.description = Berguna seperti jembatan untuk dua saluran yang bersimpangan. block.liquid-junction.description = Berguna seperti jembatan untuk dua saluran yang bersimpangan.
block.bridge-conduit.description = Memindahkan cairan melewati tanah atau bangunan. block.bridge-conduit.description = Memindahkan cairan melewati tanah atau bangunan.
block.phase-conduit.description = Memindahkan cairan melewati tanah atau bangunan. Memiliki jarak yang lebih jauh daripada jembatan cairan, namun memerlukan tenaga. block.phase-conduit.description = Memindahkan cairan melewati tanah atau bangunan. Memiliki jarak yang lebih jauh daripada jembatan cairan, namun memerlukan tenaga.
@@ -1737,6 +1779,7 @@ lenum.itemdrop = Menjatuhkan bahan.
lenum.itemtake = Mengambil bahan dari suatu bangunan. lenum.itemtake = Mengambil bahan dari suatu bangunan.
lenum.paydrop = Menurunkan muatan yang ada. lenum.paydrop = Menurunkan muatan yang ada.
lenum.paytake = Mengangkut muatan pada lokasi ini. lenum.paytake = Mengangkut muatan pada lokasi ini.
lenum.payenter = Masuk/mendarat pada blok muatan yang saat ini unit sedang berdiri.
lenum.flag = Tanda numerik unit. lenum.flag = Tanda numerik unit.
lenum.mine = Menambang pada sebuah posisi. lenum.mine = Menambang pada sebuah posisi.
lenum.build = Membangun sebuah sttruktur. lenum.build = Membangun sebuah sttruktur.

View File

@@ -288,6 +288,7 @@ save.corrupted = [accent]セーブファイルが無効、または破損しま
empty = <空> empty = <空>
on = オン on = オン
off = オフ off = オフ
save.search = セーブデータを検索...
save.autosave = 自動保存: {0} save.autosave = 自動保存: {0}
save.map = マップ: {0} save.map = マップ: {0}
save.wave = ウェーブ {0} save.wave = ウェーブ {0}
@@ -381,7 +382,11 @@ editor.newmap = 新しいマップ
editor.center = 中心 editor.center = 中心
editor.search = マップを検索... editor.search = マップを検索...
editor.filters = マップをフィルターする editor.filters = マップをフィルターする
editor.showAll = デフォルトマップを表示 editor.filters.mode = ゲームモード:
editor.filters.type = マップタイプ:
editor.filters.search = 検索:
editor.filters.author = 作者
editor.filters.description = 説明
workshop = ワークショップ workshop = ワークショップ
waves.title = ウェーブ waves.title = ウェーブ
waves.remove = 削除 waves.remove = 削除
@@ -415,6 +420,7 @@ wavemode.health = 総体力
editor.default = [lightgray]<デフォルト> editor.default = [lightgray]<デフォルト>
details = 詳細... details = 詳細...
edit = 編集... edit = 編集...
variables = 変数
editor.name = 名前: editor.name = 名前:
editor.spawn = ユニットを出す editor.spawn = ユニットを出す
editor.removeunit = ユニットを消す editor.removeunit = ユニットを消す
@@ -1299,6 +1305,7 @@ block.plated-conduit.name = メッキパイプ
block.phase-conduit.name = フェーズパイプ block.phase-conduit.name = フェーズパイプ
block.liquid-router.name = 液体ルーター block.liquid-router.name = 液体ルーター
block.liquid-tank.name = 液体タンク block.liquid-tank.name = 液体タンク
block.liquid-container.name = 液体コンテナ
block.liquid-junction.name = 液体ジャンクション block.liquid-junction.name = 液体ジャンクション
block.bridge-conduit.name = ブリッジパイプ block.bridge-conduit.name = ブリッジパイプ
block.rotary-pump.name = ロータリーポンプ block.rotary-pump.name = ロータリーポンプ
@@ -1345,10 +1352,16 @@ block.disassembler.name = ディスアセンブラー
block.silicon-crucible.name = シリコンクルーシブル block.silicon-crucible.name = シリコンクルーシブル
block.overdrive-dome.name = 加速ドーム block.overdrive-dome.name = 加速ドーム
block.interplanetary-accelerator.name = 惑星間加速器 block.interplanetary-accelerator.name = 惑星間加速器
#experimental, may be removed block.constructor.name = コンストラクター
block.block-forge.name = ブロックフォージ block.constructor.description = 最大で2x2の大きさの構造物を建造します。
block.block-loader.name = ブロック積載機 block.large-constructor.name = 大型コンストラクター
block.block-unloader.name = ブロック搬出機 block.large-constructor.description = 最大で4x4の大きさの構造物を建造します。
block.deconstructor.name = デコンストラクター
block.deconstructor.description = 構造物やユニットを解体します。建造費の100が戻ってきます。
block.payload-loader.name = ペイロード搬入機
block.payload-loader.description = 液体や資源をブロックに搬入します。
block.payload-unloader.name = ペイロード搬出機
block.payload-unloader.description = ブロックから液体や資源を搬出します。
block.switch.name = スイッチ block.switch.name = スイッチ
block.micro-processor.name = マイクロプロセッサー block.micro-processor.name = マイクロプロセッサー
@@ -1505,6 +1518,7 @@ block.conduit.description = 一般的な液体輸送ブロックです。液体
block.pulse-conduit.description = 高度な液体輸送ブロックです。通常のパイプより速くたくさんの液体を輸送することができます。 block.pulse-conduit.description = 高度な液体輸送ブロックです。通常のパイプより速くたくさんの液体を輸送することができます。
block.plated-conduit.description = パルスパイプと同じ速度で液体を輸送することができ、耐久性に優れています。\nまた、パイプ以外による側面への入力を受け入れません。 block.plated-conduit.description = パルスパイプと同じ速度で液体を輸送することができ、耐久性に優れています。\nまた、パイプ以外による側面への入力を受け入れません。
block.liquid-router.description = 搬入したアイテムをほかの3方向へ均等に搬出します。液体の漏れを防ぐことができます。一つの資源から複数に分ける際などに使われます。 block.liquid-router.description = 搬入したアイテムをほかの3方向へ均等に搬出します。液体の漏れを防ぐことができます。一つの資源から複数に分ける際などに使われます。
block.liquid-container.description = 中量の液体を保管しておくことができます。液体ルーターと同様に四方へ搬出できます。
block.liquid-tank.description = 大量の液体を保管しておくことができます。需要が不安定な製造設備や重要な施設の冷却水の予備などとして使用されます。 block.liquid-tank.description = 大量の液体を保管しておくことができます。需要が不安定な製造設備や重要な施設の冷却水の予備などとして使用されます。
block.liquid-junction.description = パイプを他のパイプと交差できるようにします。それぞれ搬入した液体を前方に搬出します。パイプで複雑な構造を組み立てるときなどに使われます。 block.liquid-junction.description = パイプを他のパイプと交差できるようにします。それぞれ搬入した液体を前方に搬出します。パイプで複雑な構造を組み立てるときなどに使われます。
block.bridge-conduit.description = 高度な液体輸送ブロックです。地形や建物を超えて、3ブロック離れた場所に液体を輸送することができます。 block.bridge-conduit.description = 高度な液体輸送ブロックです。地形や建物を超えて、3ブロック離れた場所に液体を輸送することができます。

View File

@@ -288,6 +288,7 @@ save.corrupted = [accent]손상되었거나 잘못된 저장 파일입니다!
empty = <비어있음> empty = <비어있음>
on = 활성화 on = 활성화
off = 비활성화 off = 비활성화
save.search = 세이브 파일 검색
save.autosave = 자동저장: {0} save.autosave = 자동저장: {0}
save.map = 맵: {0} save.map = 맵: {0}
save.wave = {0} 단계 save.wave = {0} 단계
@@ -381,7 +382,11 @@ editor.newmap = 신규 맵
editor.center = 중앙 editor.center = 중앙
editor.search = 맵 검색하기 editor.search = 맵 검색하기
editor.filters = 맵 필터링하기 editor.filters = 맵 필터링하기
editor.showAll = 기본 맵 보기 editor.filters.mode = 게임 모드:
editor.filters.type = 맵 유형:
editor.filters.search = 검색:
editor.filters.author = 제작자
editor.filters.description = 설명
workshop = 창작마당 workshop = 창작마당
waves.title = 단계 waves.title = 단계
waves.remove = 삭제 waves.remove = 삭제
@@ -415,6 +420,7 @@ wavemode.health = 체력
editor.default = [lightgray]<기본값> editor.default = [lightgray]<기본값>
details = 설명... details = 설명...
edit = 편집... edit = 편집...
variables = 변수
editor.name = 이름: editor.name = 이름:
editor.spawn = 유닛 생성 editor.spawn = 유닛 생성
editor.removeunit = 유닛 삭제 editor.removeunit = 유닛 삭제
@@ -1342,15 +1348,15 @@ block.disassembler.name = 광재 분해기
block.silicon-crucible.name = 실리콘 도가니 block.silicon-crucible.name = 실리콘 도가니
block.overdrive-dome.name = 대형 과부하 프로젝터 block.overdrive-dome.name = 대형 과부하 프로젝터
block.interplanetary-accelerator.name = 성간 코어 가속기 block.interplanetary-accelerator.name = 성간 코어 가속기
block.constructor.name = 제작대 block.constructor.name = 블록 제작대
block.constructor.description = 최대 2x2 크기의 블록을 제작합니다. block.constructor.description = 최대 2x2 크기의 블록을 제작합니다.
block.large-constructor.name = 대형 제작대 block.large-constructor.name = 대형 블록 제작대
block.large-constructor.description = 최대 4x4 크기의 블록을 제작합니다. block.large-constructor.description = 최대 4x4 크기의 블록을 제작합니다.
block.deconstructor.name = 분해 block.deconstructor.name = 화물 해체
block.deconstructor.description = 블록과 유닛을 분해합니다. 건설 비용의 100%를 돌려받습니다. block.deconstructor.description = 블록과 유닛을 분해합니다. 건설 비용의 100%를 돌려받습니다.
block.payload-loader.name = 블록 로더 block.payload-loader.name = 화물 로더
block.payload-loader.description = 들어간 블록에 액체와 아이템을 저장합니다. block.payload-loader.description = 들어간 블록에 액체와 아이템을 저장합니다.
block.payload-unloader.name = 블록 언로더 block.payload-unloader.name = 화물 언로더
block.payload-unloader.description = 들어간 블록에서 액체와 아이템을 가져옵니다. block.payload-unloader.description = 들어간 블록에서 액체와 아이템을 가져옵니다.
block.switch.name = 스위치 block.switch.name = 스위치

View File

@@ -286,6 +286,7 @@ save.corrupted = [accent]Сохранённый файл повреждён ил
empty = <пусто> empty = <пусто>
on = Вкл on = Вкл
off = Выкл off = Выкл
save.search = Поиск сохранений...
save.autosave = Автосохранение: {0} save.autosave = Автосохранение: {0}
save.map = Карта: {0} save.map = Карта: {0}
save.wave = Волна {0} save.wave = Волна {0}
@@ -378,7 +379,11 @@ editor.newmap = Новая карта
editor.center = Центрировать editor.center = Центрировать
editor.search = Поиск карт... editor.search = Поиск карт...
editor.filters = Фильтры editor.filters = Фильтры
editor.showAll = Показать карты по умолчанию editor.filters.mode = Режимы игры:
editor.filters.type = Тип карты
editor.filters.search = Искать по
editor.filters.author = Автору
editor.filters.description = Описанию
workshop = Мастерская workshop = Мастерская
waves.title = Волны waves.title = Волны
waves.remove = Удалить waves.remove = Удалить

View File

@@ -154,7 +154,7 @@ mod.import.file = นำเข้าไฟล์
mod.import.github = นำเข้าม็อดจาก Github mod.import.github = นำเข้าม็อดจาก Github
mod.jarwarn = [scarlet]ม็อดไฟล์ JAR นั้นค่อนข้างไม่ปลอดภัย[]\nกรุณาเช็กให้แน่ใจว่าคุณนำเข้าม็อดนี้จะแหล่งที่เชื่อถือได้! mod.jarwarn = [scarlet]ม็อดไฟล์ JAR นั้นค่อนข้างไม่ปลอดภัย[]\nกรุณาเช็กให้แน่ใจว่าคุณนำเข้าม็อดนี้จะแหล่งที่เชื่อถือได้!
mod.item.remove = ไอเท็มนี้เป็นส่วนหนึ่งของม็อด [accent]'{0}'[] หากต้องการนำออก กรุณาถอนการติดตั้งม็อดนั้น mod.item.remove = ไอเท็มนี้เป็นส่วนหนึ่งของม็อด [accent]'{0}'[] หากต้องการนำออก กรุณาถอนการติดตั้งม็อดนั้น
mod.remove.confirm = ม็อดนี้จะถูกลบ mod.remove.confirm = ม็อดนี้จะถูกลบออกไป
mod.author = [lightgray]ผู้สร้าง:[] {0} mod.author = [lightgray]ผู้สร้าง:[] {0}
mod.missing = เซฟนี้มีม็อดที่คุณพึ่งอัปเดตหรือไม่ได้ติดตั้งแล้ว อาจทำให้เซฟเสีย คุณแน่จะหรือว่าจะโหลดเซฟนี้?\n[lightgray]ม็อดที่ใช้:\n{0} mod.missing = เซฟนี้มีม็อดที่คุณพึ่งอัปเดตหรือไม่ได้ติดตั้งแล้ว อาจทำให้เซฟเสีย คุณแน่จะหรือว่าจะโหลดเซฟนี้?\n[lightgray]ม็อดที่ใช้:\n{0}
mod.preview.missing = ก่อนที่จะนำม็อดไปลงในเวิร์กช็อป คุณต้องใส่รูปพรีวิวก่อน\nใส่รูปชื่อ[accent] preview.png[] ลงในโฟลเดอร์ของม็อดแล้วลองอีกครั้ง mod.preview.missing = ก่อนที่จะนำม็อดไปลงในเวิร์กช็อป คุณต้องใส่รูปพรีวิวก่อน\nใส่รูปชื่อ[accent] preview.png[] ลงในโฟลเดอร์ของม็อดแล้วลองอีกครั้ง
@@ -233,7 +233,7 @@ trace.mobile = ไคลเอนต์โทรศัพท์: [accent]{0}
trace.modclient = ไคลเอนต์ปรับแต่ง: [accent]{0} trace.modclient = ไคลเอนต์ปรับแต่ง: [accent]{0}
trace.times.joined = เวลาเข้า: [accent]{0} trace.times.joined = เวลาเข้า: [accent]{0}
trace.times.kicked = เวลาโดนเตะ: [accent]{0} trace.times.kicked = เวลาโดนเตะ: [accent]{0}
invalidid = client ID ไม่ถูกต้อง! กรุณารายงานบัคนี้ invalidid = ไคลเอนต์ ID ไม่ถูกต้อง! กรุณารายงานบัคนี้
server.bans = แบน server.bans = แบน
server.bans.none = ไม่พบผู้เล่นที่ถูกแบน! server.bans.none = ไม่พบผู้เล่นที่ถูกแบน!
server.admins = แอดมิน server.admins = แอดมิน
@@ -282,12 +282,13 @@ save.newslot = ชื่อเซฟ:
save.rename = เปลี่ยนชื่อ save.rename = เปลี่ยนชื่อ
save.rename.text = ชื่อใหม่: save.rename.text = ชื่อใหม่:
selectslot = เลือกเซฟ selectslot = เลือกเซฟ
slot = [accent]Slot {0} slot = [accent]สล็อต {0}
editmessage = แก้ไขข้อความ editmessage = แก้ไขข้อความ
save.corrupted = ไฟล์เซฟเสียหายหรือไม่ถูกต้อง! save.corrupted = ไฟล์เซฟเสียหายหรือไม่ถูกต้อง!
empty = <ว่างเปล่า> empty = <ว่างเปล่า>
on = เปิด on = เปิด
off = ปิด off = ปิด
save.search = ค้นหาเซฟเกม...
save.autosave = เซฟอัตโนมัติ: {0} save.autosave = เซฟอัตโนมัติ: {0}
save.map = แมพ: {0} save.map = แมพ: {0}
save.wave = คลื่นที่ {0} save.wave = คลื่นที่ {0}
@@ -361,14 +362,14 @@ missing = ไอเท็มนี้ถูกลบหรือย้าย\n[l
publishing = [accent]กำลังเผยแพร่... publishing = [accent]กำลังเผยแพร่...
publish.confirm = คุณแน่ใจหรือว่าจะเผยแพร่สิ่งนี้?\n\n[lightgray]คุณต้องแน่ใจก่อนว่าคุณเห็นด้วยกับ Workshop EULA มิฉนั้นไอเท็มของคุณจะไม่ปรากฏ! publish.confirm = คุณแน่ใจหรือว่าจะเผยแพร่สิ่งนี้?\n\n[lightgray]คุณต้องแน่ใจก่อนว่าคุณเห็นด้วยกับ Workshop EULA มิฉนั้นไอเท็มของคุณจะไม่ปรากฏ!
publish.error = เกิดข้อผิดพลาดการเผยแพร่ไอเท็มดังต่อไปนี้: {0} publish.error = เกิดข้อผิดพลาดการเผยแพร่ไอเท็มดังต่อไปนี้: {0}
steam.error = ไม่สามารถเริ่ม Steam service ได้\nError: {0} steam.error = ไม่สามารถเริ่ม Steam service ได้\nข้อผิดพลาด: {0}
editor.cliffs = เปลี่ยนกำแพงเป็นหน้าผา editor.cliffs = เปลี่ยนกำแพงเป็นหน้าผา
editor.brush = แปรง editor.brush = แปรง
editor.openin = เปิดในตัวแก้ไข editor.openin = เปิดในตัวแก้ไข
editor.oregen = การเกิดของแร่ editor.oregen = การเกิดของแร่
editor.oregen.info = การเกิดของแร่: editor.oregen.info = การเกิดของแร่:
editor.mapinfo = ข้อมูลของแมพ editor.mapinfo = ข้อมูลแมพ
editor.author = ผู้สร้าง: editor.author = ผู้สร้าง:
editor.description = คำอธิบาย: editor.description = คำอธิบาย:
editor.nodescription = แมพจำเป็นต้องมีคำอธิบายอย่างน้อย 4 ตัวอักษรจึงจะสามารถเผยแพร่ได้ editor.nodescription = แมพจำเป็นต้องมีคำอธิบายอย่างน้อย 4 ตัวอักษรจึงจะสามารถเผยแพร่ได้
@@ -381,7 +382,11 @@ editor.newmap = แมพใหม่
editor.center = ศูนย์กลางแมพ editor.center = ศูนย์กลางแมพ
editor.search = ค้นหาแมพ... editor.search = ค้นหาแมพ...
editor.filters = ตัวกรองแมพ editor.filters = ตัวกรองแมพ
editor.showAll = แสดงแมพค่าเริ่มต้น editor.filters.mode = เกมโหมด:
editor.filters.type = ประเภทแมพ:
editor.filters.search = ค้นหาจาก:
editor.filters.author = ผู้สร้าง
editor.filters.description = คำอธิบาย
workshop = เวิร์กช็อป workshop = เวิร์กช็อป
waves.title = คลื่น waves.title = คลื่น
waves.remove = ลบ waves.remove = ลบ
@@ -415,6 +420,7 @@ wavemode.health = พลังชีวิต
editor.default = [lightgray]<ค่าเริ่มต้น> editor.default = [lightgray]<ค่าเริ่มต้น>
details = รายละเอียด... details = รายละเอียด...
edit = แก้ไข... edit = แก้ไข...
variables = ตัวแปร
editor.name = ชื่อ: editor.name = ชื่อ:
editor.spawn = สร้างยูนิต editor.spawn = สร้างยูนิต
editor.removeunit = ลบยูนิต editor.removeunit = ลบยูนิต
@@ -425,7 +431,7 @@ editor.errorimage = ไฟล์นั้นคือไฟล์รูป ไ
editor.errorlegacy = แมพนี้เก่าเกินไปและใช้รูปแบบแมพแบบเก่าที่ไม่สนับสนุนแล้ว editor.errorlegacy = แมพนี้เก่าเกินไปและใช้รูปแบบแมพแบบเก่าที่ไม่สนับสนุนแล้ว
editor.errornot = นี่ไม่ใช้ไฟล์แมพ editor.errornot = นี่ไม่ใช้ไฟล์แมพ
editor.errorheader = ไฟล์แมพนี้เสียหรือไม่ถูกต้อง editor.errorheader = ไฟล์แมพนี้เสียหรือไม่ถูกต้อง
editor.errorname = แมพไม่มีการกำหนดชื่อ คุณกำลังโหลดไฟล์เซฟอยู่หรือป่าว? editor.errorname = แมพไม่มีการกำหนดชื่อ คุณกำลังพยายามโหลดไฟล์เซฟอยู่หรือไม่?
editor.update = อัปเดต editor.update = อัปเดต
editor.randomize = สุ่ม editor.randomize = สุ่ม
editor.apply = ใช้ editor.apply = ใช้
@@ -563,12 +569,12 @@ guardian = ผู้พิทักษ์
connectfail = [crimson]การเชื่อมต่อผิดพลาด:\n\n[accent]{0} connectfail = [crimson]การเชื่อมต่อผิดพลาด:\n\n[accent]{0}
error.unreachable = เซิร์ฟเวอร์ไม่สามารถเข้าถึงได้\nแน่ใจหรือว่าที่อยู่เขียนถูกต้อง? error.unreachable = เซิร์ฟเวอร์ไม่สามารถเข้าถึงได้\nแน่ใจหรือว่าที่อยู่เขียนถูกต้อง?
error.invalidaddress = ที่อยู่ไม่ถูกต้อง error.invalidaddress = ที่อยู่ไม่ถูกต้อง
error.timedout = Timed out!\nเช็กให้แน่ใจว่า port forwarding ของโฮสต์เปิดอยู่และที่อยู่นั้นถูกต้อง! error.timedout = หมดเวลา!\nเช็กให้แน่ใจว่า port forwarding ของโฮสต์เปิดอยู่และที่อยู่นั้นถูกต้อง!
error.mismatch = Packet error:\nอาจเกิดจากเวอร์ชั่นของ ไคลเอนต์/เซิร์ฟเวอร์ ไม่ตรงกัน\nเช็กให้แน่ใจว่าคุณและโฮสต์ใช้ Mindustry เวอร์ชั่นล่าสุด! error.mismatch = ข้อผิดพลาดของแพ็คเก็ต:\nอาจเกิดจากเวอร์ชั่นของ ไคลเอนต์/เซิร์ฟเวอร์ ไม่ตรงกัน\nเช็กให้แน่ใจว่าคุณและโฮสต์ใช้ Mindustry เวอร์ชั่นล่าสุด!
error.alreadyconnected = เชื่อมต่ออยู่แล้ว error.alreadyconnected = เชื่อมต่ออยู่แล้ว
error.mapnotfound = ไม่พบไฟล์แมพ error.mapnotfound = ไม่พบไฟล์แมพ
error.io = Network I/O error error.io = ข้อผิดพลาด I/O ของเครือข่าย
error.any = Error: เครือข่ายที่ไม่รู้จัก error.any = ข้อผิดพลาด: เครือข่ายที่ไม่รู้จัก
error.bloom = ไม่สามารถเริ่มต้นบลูมได้\nอุปกรณ์ของคุณอาจไม่รองรับ error.bloom = ไม่สามารถเริ่มต้นบลูมได้\nอุปกรณ์ของคุณอาจไม่รองรับ
weather.rain.name = ฝน weather.rain.name = ฝน
@@ -610,8 +616,8 @@ sector.changeicon = เปลี่ยนไอคอน
threat.low = ต่ำ threat.low = ต่ำ
threat.medium = กลาง threat.medium = กลาง
threat.high = สูง threat.high = สูง
threat.extreme = ร้ายแรง threat.extreme = วิบัติภัย
threat.eradication = มหาวิบัติ threat.eradication = ทำลายล้าง
planets = ดาวเคราะห์ planets = ดาวเคราะห์
@@ -630,8 +636,8 @@ sector.overgrowth.name = โอเวอร์โกรว์ด
sector.tarFields.name = ราบลุ่มน้ำมัน sector.tarFields.name = ราบลุ่มน้ำมัน
sector.saltFlats.name = ที่ราบเกลือ sector.saltFlats.name = ที่ราบเกลือ
sector.fungalPass.name = ทางผ่านฟังกัล sector.fungalPass.name = ทางผ่านฟังกัล
sector.biomassFacility.name = แหล่งสังเคราะห์ชีวมวล sector.biomassFacility.name = สถานสังเคราะห์ชีวมวล
sector.windsweptIslands.name = หมู่เกาะวินด์สเวปท์ sector.windsweptIslands.name = หมู่เกาะพหุวายุ
sector.extractionOutpost.name = ด่านส่งทรัพยากร sector.extractionOutpost.name = ด่านส่งทรัพยากร
sector.planetaryTerminal.name = ท่าปล่อยจรวดอวกาศยาน sector.planetaryTerminal.name = ท่าปล่อยจรวดอวกาศยาน
sector.coastline.name = แนวชายฝั่ง sector.coastline.name = แนวชายฝั่ง
@@ -1138,7 +1144,7 @@ block.space.name = อวกาศ
block.salt.name = เกลือ block.salt.name = เกลือ
block.salt-wall.name = กำแพงเกลือ block.salt-wall.name = กำแพงเกลือ
block.pebbles.name = ก้อนกรวด block.pebbles.name = ก้อนกรวด
block.tendrils.name = ไม้เลื้อย block.tendrils.name = เถาวัลย์
block.sand-wall.name = กำแพงทราย block.sand-wall.name = กำแพงทราย
block.spore-pine.name = ต้นสนสปอร์ block.spore-pine.name = ต้นสนสปอร์
block.spore-wall.name = กำแพงสปอร์ block.spore-wall.name = กำแพงสปอร์
@@ -1343,15 +1349,10 @@ block.silicon-crucible.name = เบ้าหลอมซิลิคอน
block.overdrive-dome.name = โดมเร่งประสิทธิภาพ block.overdrive-dome.name = โดมเร่งประสิทธิภาพ
block.interplanetary-accelerator.name = ฐานเร่งความเร็วระหว่างดาวเคราะห์ block.interplanetary-accelerator.name = ฐานเร่งความเร็วระหว่างดาวเคราะห์
block.constructor.name = เครื่องก่อสร้าง block.constructor.name = เครื่องก่อสร้าง
block.constructor.description = สรรค์สร้างสิ่งก่อสร้างขนาดจนถึง 2x2 ช่อง
block.large-constructor.name = เครื่องก่อสร้างขนาดใหญ่ block.large-constructor.name = เครื่องก่อสร้างขนาดใหญ่
block.large-constructor.description = สรรค์สร้างสิ่งก่อสร้างขนาดจนถึง 4x4 ช่อง
block.deconstructor.name = เครื่องลบทำลาย block.deconstructor.name = เครื่องลบทำลาย
block.deconstructor.description = ลบทำลายสิ่งก่อสร้างและยูนิต คืน 100% ของทรัพยากรที่ใช้ในการสร้าง
block.payload-loader.name = เครื่องโหลดสิ่งบรรทุก block.payload-loader.name = เครื่องโหลดสิ่งบรรทุก
block.payload-loader.description = โหลดของเหลวและไอเท็มเข้าไปในบล็อก
block.payload-unloader.name = เครื่องถ่ายสิ่งบรรทุก block.payload-unloader.name = เครื่องถ่ายสิ่งบรรทุก
block.payload-unloader.description = ถ่ายของเหลวและไอเท็มออกจากบล็อก
block.switch.name = สวิตช์ block.switch.name = สวิตช์
block.micro-processor.name = ตัวประมวลผลขนาดเล็ก block.micro-processor.name = ตัวประมวลผลขนาดเล็ก
@@ -1522,7 +1523,7 @@ block.conduit.description = เคลื่อนย้ายของเหล
block.pulse-conduit.description = เคลื่อนย้ายของเหลวไปข้างหน้า เคลื่อนย้ายได้เร็วขึ้นและเก็บของเหลวได้เยอะกว่าท่อน้ำธรรมดา block.pulse-conduit.description = เคลื่อนย้ายของเหลวไปข้างหน้า เคลื่อนย้ายได้เร็วขึ้นและเก็บของเหลวได้เยอะกว่าท่อน้ำธรรมดา
block.plated-conduit.description = เคลื่อนย้ายของเหลวไปข้างหน้า ไม่รับของเหลวจากด้านข้างนอกจากท่อน้ำด้วยกันเอง\nไม่รั่ว และมีเกราะที่หนากว่า block.plated-conduit.description = เคลื่อนย้ายของเหลวไปข้างหน้า ไม่รับของเหลวจากด้านข้างนอกจากท่อน้ำด้วยกันเอง\nไม่รั่ว และมีเกราะที่หนากว่า
block.liquid-router.description = รับของเหลวจากทางเดียวแล้วส่งออกสามทางเท่าๆกัน สามารถเก็บของเหลวได้จำนวนหนึ่ง\nมีประโยชน์สำหรับการส่งของเหลวจากปั้มไปยังหลายที่ block.liquid-router.description = รับของเหลวจากทางเดียวแล้วส่งออกสามทางเท่าๆกัน สามารถเก็บของเหลวได้จำนวนหนึ่ง\nมีประโยชน์สำหรับการส่งของเหลวจากปั้มไปยังหลายที่
block.liquid-container.description = เก็บของเหลวจำนวนปานกลาง ส่งออกไปรอบด้านคล้ายกับเร้าเตอร์ของเหลว\nเหมาะในการใช้กับเครื่องโหลดและถ่ายสิ่งบรรทุกสำหรับการขนส่งของเหลวทางไกล block.liquid-container.description = เก็บของเหลวจำนวนปานกลาง ส่งออกไปรอบด้านคล้ายกับ\nเร้าเตอร์ของเหลว เหมาะในการใช้กับเครื่องโหลดและถ่ายสิ่งบรรทุกสำหรับ\nการขนส่งของเหลวทางไกล
block.liquid-tank.description = เก็บของเหลวจำนวนมาก ส่งออกไปรอบด้านคล้ายกับเร้าเตอร์ของเหลว\nเหมาะในการใช้เพื่อสร้างกันชนในเวลาที่ของเหลวไม่คงที่\nหรือเวลาที่ใช้ของเหลวเป็นจำนวนมาก block.liquid-tank.description = เก็บของเหลวจำนวนมาก ส่งออกไปรอบด้านคล้ายกับเร้าเตอร์ของเหลว\nเหมาะในการใช้เพื่อสร้างกันชนในเวลาที่ของเหลวไม่คงที่\nหรือเวลาที่ใช้ของเหลวเป็นจำนวนมาก
block.liquid-junction.description = ทำหน้าที่เป็นสะพานสำหรับท่อน้ำสองท่อตัดกันที่มีของเหลวสองชนิดแล้วจะไปคนละที่ block.liquid-junction.description = ทำหน้าที่เป็นสะพานสำหรับท่อน้ำสองท่อตัดกันที่มีของเหลวสองชนิดแล้วจะไปคนละที่
block.bridge-conduit.description = เคลื่อนย้ายของเหลวข้ามสิ่งก่อสร้างหรือกำแพง block.bridge-conduit.description = เคลื่อนย้ายของเหลวข้ามสิ่งก่อสร้างหรือกำแพง
@@ -1604,6 +1605,11 @@ block.large-logic-display.description = แสดงกราฟิกโดย
block.interplanetary-accelerator.description = หอคอยเรลกันแม่เหล็กไฟฟ้าขนาดมหึมา เร่งความเร็วแกนกลางเพื่อบินสู่อวกาศไปยังดาวเคราะห์อื่นๆ block.interplanetary-accelerator.description = หอคอยเรลกันแม่เหล็กไฟฟ้าขนาดมหึมา เร่งความเร็วแกนกลางเพื่อบินสู่อวกาศไปยังดาวเคราะห์อื่นๆ
block.repair-turret.description = ซ่อมแซมยูนิตที่อยู่ในรัศมีของมันอย่างต่อเนื่อง สามารถใช้ของเหลวมาหล่อเย็นเพื่อเพิ่มประสิทธิภาพได้ block.repair-turret.description = ซ่อมแซมยูนิตที่อยู่ในรัศมีของมันอย่างต่อเนื่อง สามารถใช้ของเหลวมาหล่อเย็นเพื่อเพิ่มประสิทธิภาพได้
block.payload-propulsion-tower.description = บล็อกขนส่งสิ่งบรรทุกทางไกล\nยิงสิ่งบรรทุกไปยังหอเคลื่อนย้ายสิ่งบรรทุกอีกเครื่องที่เชื่อมต่อไว้ block.payload-propulsion-tower.description = บล็อกขนส่งสิ่งบรรทุกทางไกล\nยิงสิ่งบรรทุกไปยังหอเคลื่อนย้ายสิ่งบรรทุกอีกเครื่องที่เชื่อมต่อไว้
block.constructor.description = สรรค์สร้างสิ่งก่อสร้างขนาดจนถึง 2x2 ช่อง
block.large-constructor.description = สรรค์สร้างสิ่งก่อสร้างขนาดจนถึง 4x4 ช่อง
block.deconstructor.description = ลบทำลายสิ่งก่อสร้างและยูนิต คืนทรัพยากรทั้งหมดที่ใช้ในการก่อสร้าง
block.payload-loader.description = โหลดของเหลวและไอเท็มเข้าไปในบล็อก
block.payload-unloader.description = ถ่ายของเหลวและไอเท็มออกจากบล็อก
unit.dagger.description = ยิงกระสุนธรรมดาใส่ศัตรูที่อยู่ใกล้เคียง unit.dagger.description = ยิงกระสุนธรรมดาใส่ศัตรูที่อยู่ใกล้เคียง
unit.mace.description = ยิงเปลวไฟเผาไหม้ใส่ศัตรูที่อยู่ใกล้เคียง unit.mace.description = ยิงเปลวไฟเผาไหม้ใส่ศัตรูที่อยู่ใกล้เคียง

View File

@@ -288,6 +288,7 @@ save.corrupted = [accent]Kayıt dosyası bozuk veya geçersiz!
empty = <boş> empty = <boş>
on = on =
off = Kapa off = Kapa
save.search = Kayıtlı Oyun Ara...
save.autosave = Otomatik kayıt: {0} save.autosave = Otomatik kayıt: {0}
save.map = Harita: {0} save.map = Harita: {0}
save.wave = Dalga {0} save.wave = Dalga {0}
@@ -381,7 +382,11 @@ editor.newmap = Yeni Harita
editor.center = Ortala editor.center = Ortala
editor.search = Harita Ara... editor.search = Harita Ara...
editor.filters = Harita Filtrele editor.filters = Harita Filtrele
editor.showAll = Varsayılan Haritaları Göster editor.filters.mode = Oyun Modları:
editor.filters.type = Harita Türleri:
editor.filters.search = Ara:
editor.filters.author = Yapımcı
editor.filters.description = ıklama
workshop = Atölye workshop = Atölye
waves.title = Dalgalar waves.title = Dalgalar
waves.remove = Kaldır waves.remove = Kaldır

View File

@@ -350,6 +350,7 @@ workshop.error = Помилка під час отримання інформа
map.publish.confirm = Ви дійсно хочете опублікувати цю мапу?\n\n[lightgray]Спершу переконайтеся, що ви згодні з Ліцензійною угодою Steam, або ваші мапи не з’являться! map.publish.confirm = Ви дійсно хочете опублікувати цю мапу?\n\n[lightgray]Спершу переконайтеся, що ви згодні з Ліцензійною угодою Steam, або ваші мапи не з’являться!
workshop.menu = Виберіть, що ви хочете зробити з цим предметом. workshop.menu = Виберіть, що ви хочете зробити з цим предметом.
workshop.info = Інформація про предмет workshop.info = Інформація про предмет
workshop.info = Інформація про предмет
changelog = Змінопис (за бажанням): changelog = Змінопис (за бажанням):
eula = Ліцензійна угода Steam eula = Ліцензійна угода Steam
missing = Цей предмет було видалено або переміщено.\n[lightgray]Список Майстерні тепер автоматично від’єднано. missing = Цей предмет було видалено або переміщено.\n[lightgray]Список Майстерні тепер автоматично від’єднано.
@@ -643,6 +644,7 @@ status.overclock.name = Прискорений
status.shocked.name = Шокований status.shocked.name = Шокований
status.blasted.name = Підірваний status.blasted.name = Підірваний
status.unmoving.name = Незворушний status.unmoving.name = Незворушний
status.boss.name = Вартовий
settings.language = Мова settings.language = Мова
settings.data = Ігрові дані settings.data = Ігрові дані
@@ -1422,6 +1424,8 @@ block.item-source.description = Постійно створює предмети
block.item-void.description = Руйнує будь-які предмети. Тільки пісочниця. block.item-void.description = Руйнує будь-які предмети. Тільки пісочниця.
block.liquid-source.description = Постійно виробляє рідини. Тільки пісочниця. block.liquid-source.description = Постійно виробляє рідини. Тільки пісочниця.
block.liquid-void.description = Випаровує будь-які рідини. Тільки пісочниця. block.liquid-void.description = Випаровує будь-які рідини. Тільки пісочниця.
block.payload-source.description = Нескінченно створює і виводить вантажі. Тільки пісочниця.
block.payload-void.description = Знищує будь-які вантажі. Тільки пісочниця.
block.copper-wall.description = Захищає споруди від ворожих снарядів. block.copper-wall.description = Захищає споруди від ворожих снарядів.
block.copper-wall-large.description = Захищає споруди від ворожих снарядів. block.copper-wall-large.description = Захищає споруди від ворожих снарядів.
block.titanium-wall.description = Захищає споруди від ворожих снарядів. block.titanium-wall.description = Захищає споруди від ворожих снарядів.
@@ -1454,7 +1458,7 @@ block.router.details = Необхідне зло. Не використовуй
block.distributor.description = Розділяє предмети до 7 інших напрямків порівну. block.distributor.description = Розділяє предмети до 7 інших напрямків порівну.
block.overflow-gate.description = Вивантажує лише ліворуч і праворуч, якщо передній шлях заблокований. block.overflow-gate.description = Вивантажує лише ліворуч і праворуч, якщо передній шлях заблокований.
block.underflow-gate.description = Повна протилежність надмірному затвору. Виводить предмет прямо, якщо лівий і правий шлях заблоковано. block.underflow-gate.description = Повна протилежність надмірному затвору. Виводить предмет прямо, якщо лівий і правий шлях заблоковано.
block.mass-driver.description = Найкращий блок для транспортування предметів. Збирає кілька предметів, а потім вистрілює їх до іншої електромагнітної катапульти на велику відстань. Для роботи потребує енергія. block.mass-driver.description = Найкращий блок для транспортування предметів. Збирає кілька предметів, а потім вистрілює їх до іншої електромагнітної катапульти на велику відстань. Для роботи потребує енергію.
block.mechanical-pump.description = Дешевий насос із повільним виходом, але не потребує енергоспоживання. block.mechanical-pump.description = Дешевий насос із повільним виходом, але не потребує енергоспоживання.
block.rotary-pump.description = Удосконалений насос. Насоси більше викачують, але потребують енергію. block.rotary-pump.description = Удосконалений насос. Насоси більше викачують, але потребують енергію.
block.thermal-pump.description = Найкращий насос. block.thermal-pump.description = Найкращий насос.

View File

@@ -122,7 +122,7 @@ committingchanges = 正在提交更改
done = 完成 done = 完成
feature.unsupported = 您的设备不支持此特性。 feature.unsupported = 您的设备不支持此特性。
mods.initfailed = [red]⚠[]Mindustry的上一次启动失败了可能是异常的模组导致的。 \n\n为了防止连续崩溃[red]所有模组都被禁用了。 []\n\n这个功能可以在[accent]设置->游戏->游戏启动崩溃后禁用模组[]里关闭。 mods.initfailed = [red]⚠[]Mindustry的上一次启动失败了可能是异常的模组导致的。 \n\n为了防止连续崩溃[red]所有模组都被禁用了。 []
mods = 模组 mods = 模组
mods.none = [lightgray]没有找到模组! mods.none = [lightgray]没有找到模组!
mods.guide = 模组制作教程 mods.guide = 模组制作教程
@@ -288,6 +288,7 @@ save.corrupted = 存档损坏或无效!
empty = < 空 > empty = < 空 >
on = on =
off = off =
save.search = 搜索已保存的游戏…
save.autosave = 自动保存:{0} save.autosave = 自动保存:{0}
save.map = 地图:{0} save.map = 地图:{0}
save.wave = 波次:{0} save.wave = 波次:{0}
@@ -379,6 +380,14 @@ editor.ingame = 游戏内编辑
editor.publish.workshop = 上传到创意工坊 editor.publish.workshop = 上传到创意工坊
editor.newmap = 新地图 editor.newmap = 新地图
editor.center = 居中 editor.center = 居中
editor.search = 搜索地图…
editor.filters = 筛选地图
editor.showAll = 显示默认地图
editor.filters.mode = 游戏模式:
editor.filters.type = 地图类型:
editor.filters.search = 关键词搜索:
editor.filters.author = 作者
editor.filters.description = 描述
workshop = 创意工坊 workshop = 创意工坊
waves.title = 波次 waves.title = 波次
waves.remove = 移除 waves.remove = 移除
@@ -412,6 +421,7 @@ wavemode.health = 生命值
editor.default = [lightgray]<默认> editor.default = [lightgray]<默认>
details = 详情… details = 详情…
edit = 编辑… edit = 编辑…
variables = 变量
editor.name = 名称: editor.name = 名称:
editor.spawn = 生成单位 editor.spawn = 生成单位
editor.removeunit = 移除单位 editor.removeunit = 移除单位
@@ -593,7 +603,7 @@ sectors.rename = 重命名区块
sectors.enemybase = [scarlet]敌方基地 sectors.enemybase = [scarlet]敌方基地
sectors.vulnerable = [scarlet]易受攻击 sectors.vulnerable = [scarlet]易受攻击
sectors.underattack = [scarlet]遭到攻击![accent]{0}%损毁度 sectors.underattack = [scarlet]遭到攻击![accent]{0}%损毁度
sectors.survives = [accent]已坚持{0}波 sectors.survives = [accent]预测可守{0}波
sectors.go = 进入 sectors.go = 进入
sector.curcapture = 区块已占领 sector.curcapture = 区块已占领
sector.curlost = 区块已丢失 sector.curlost = 区块已丢失
@@ -635,7 +645,7 @@ sector.coastline.name = 边际海湾
sector.navalFortress.name = 海军要塞 sector.navalFortress.name = 海军要塞
sector.groundZero.description = 踏上旅程的最佳位置。 这里的敌人威胁很小,但资源也少。 \n\n尽你所能收集铅和铜出发吧 sector.groundZero.description = 踏上旅程的最佳位置。 这里的敌人威胁很小,但资源也少。 \n\n尽你所能收集铅和铜出发吧
sector.frozenForest.description = 一个靠近山脉的地方。 哪怕是在这里,也有了孢子扩散的痕迹。 \n不过它们无法在低温下长期存活。 \n\n开始运用电力建造火力发电机并学会使用修理器。 sector.frozenForest.description = 一个靠近山脉的地方。 哪怕是在这里,也有了孢子扩散的痕迹。 \n连极寒也无法长久地约束它们。 \n\n开始运用电力建造火力发电机并学会使用修理器。
sector.saltFlats.description = 盐碱荒滩,位于沙漠的边缘地带,几乎没有什么资源。 \n敌人在这里建立了一个资源存储区。 \n\n摧毁他们的核心片甲不留。 sector.saltFlats.description = 盐碱荒滩,位于沙漠的边缘地带,几乎没有什么资源。 \n敌人在这里建立了一个资源存储区。 \n\n摧毁他们的核心片甲不留。
sector.craters.description = 这片陨石地带有积水,它也是旧时战争的遗迹。 \n\n夺下该区块收集沙子来冶炼玻璃。 \n用水泵抽水来加速炮塔和钻头。 sector.craters.description = 这片陨石地带有积水,它也是旧时战争的遗迹。 \n\n夺下该区块收集沙子来冶炼玻璃。 \n用水泵抽水来加速炮塔和钻头。
sector.ruinousShores.description = 穿过荒地就是海滩。 \n这里曾经有一条海岸防线但现在已所剩无几。 \n一些基础的防御建筑还完好无损除此之外都变成了废墟。 \n\n继续向外扩张并研究科技。 sector.ruinousShores.description = 穿过荒地就是海滩。 \n这里曾经有一条海岸防线但现在已所剩无几。 \n一些基础的防御建筑还完好无损除此之外都变成了废墟。 \n\n继续向外扩张并研究科技。
@@ -694,7 +704,7 @@ no = 否
info.title = 详情 info.title = 详情
error.title = [scarlet]发生了一个错误 error.title = [scarlet]发生了一个错误
error.crashtitle = 发生了一个错误 error.crashtitle = 发生了一个错误
unit.nobuild = [scarlet]不能建造单位 unit.nobuild = [scarlet]单位不可建造
lastaccessed = [lightgray]上次操作:{0} lastaccessed = [lightgray]上次操作:{0}
block.unknown = [lightgray] block.unknown = [lightgray]
@@ -1075,7 +1085,7 @@ item.phase-fabric.name = 相位织物
item.surge-alloy.name = 巨浪合金 item.surge-alloy.name = 巨浪合金
item.spore-pod.name = 孢子荚 item.spore-pod.name = 孢子荚
item.sand.name = item.sand.name =
item.blast-compound.name = 炸药 item.blast-compound.name = 爆炸混合物
item.pyratite.name = 硫化物 item.pyratite.name = 硫化物
item.metaglass.name = 钢化玻璃 item.metaglass.name = 钢化玻璃
item.scrap.name = 废料 item.scrap.name = 废料
@@ -1130,6 +1140,7 @@ block.sand-boulder.name = 砂岩
block.basalt-boulder.name = 玄武岩巨石 block.basalt-boulder.name = 玄武岩巨石
block.grass.name = 草地 block.grass.name = 草地
block.molten-slag.name = 矿渣液 block.molten-slag.name = 矿渣液
block.pooled-cryofluid.name = 冷冻液
block.space.name = 太空 block.space.name = 太空
block.salt.name = 盐碱地 block.salt.name = 盐碱地
block.salt-wall.name = 盐墙 block.salt-wall.name = 盐墙
@@ -1280,7 +1291,7 @@ block.phase-conveyor.name = 相位传送带桥
block.bridge-conveyor.name = 传送带桥 block.bridge-conveyor.name = 传送带桥
block.plastanium-compressor.name = 塑钢压缩机 block.plastanium-compressor.name = 塑钢压缩机
block.pyratite-mixer.name = 硫化物混合器 block.pyratite-mixer.name = 硫化物混合器
block.blast-mixer.name = 炸药混合器 block.blast-mixer.name = 爆炸物混合器
block.solar-panel.name = 太阳能板 block.solar-panel.name = 太阳能板
block.solar-panel-large.name = 大型太阳能板 block.solar-panel-large.name = 大型太阳能板
block.oil-extractor.name = 石油钻井 block.oil-extractor.name = 石油钻井
@@ -1291,6 +1302,7 @@ block.plated-conduit.name = 电镀导管
block.phase-conduit.name = 相位导管桥 block.phase-conduit.name = 相位导管桥
block.liquid-router.name = 液体路由器 block.liquid-router.name = 液体路由器
block.liquid-tank.name = 储液罐 block.liquid-tank.name = 储液罐
block.liquid-container.name = 储液容器
block.liquid-junction.name = 液体交叉器 block.liquid-junction.name = 液体交叉器
block.bridge-conduit.name = 导管桥 block.bridge-conduit.name = 导管桥
block.rotary-pump.name = 回转泵 block.rotary-pump.name = 回转泵
@@ -1337,10 +1349,16 @@ block.disassembler.name = 解离机
block.silicon-crucible.name = 热能坩埚 block.silicon-crucible.name = 热能坩埚
block.overdrive-dome.name = 超速穹顶投射器 block.overdrive-dome.name = 超速穹顶投射器
block.interplanetary-accelerator.name = 行星际加速器 block.interplanetary-accelerator.name = 行星际加速器
#experimental, may be removed (仅供测试,行将移除) block.constructor.name = 构造器
block.block-forge.name = 方块建造厂 block.constructor.description = 制造尺寸不超过2x2方块的建筑。
block.block-loader.name = 方块装载机 block.large-constructor.name = 大型构造器
block.block-unloader.name = 方块卸载机 block.large-constructor.description = 制造尺寸不超过4x4方块的建筑。
block.deconstructor.name = 解构器
block.deconstructor.description = 解构建筑与单位并返还100%的制造成本。
block.payload-loader.name = 荷载装载器
block.payload-loader.description = 将液体和物品装载进方块中。
block.payload-unloader.name = 荷载卸载器
block.payload-unloader.description = 将液体和物品从方块中卸载。
block.switch.name = 开关 block.switch.name = 开关
block.micro-processor.name = 微型处理器 block.micro-processor.name = 微型处理器
@@ -1418,7 +1436,7 @@ item.silicon.description = 用于太阳能板、 复杂的电气元件或作为
item.plastanium.description = 用于高级单位、 绝缘材料,或作为分裂性弹药。 item.plastanium.description = 用于高级单位、 绝缘材料,或作为分裂性弹药。
item.phase-fabric.description = 用于高级电子设备和自修复建筑。 item.phase-fabric.description = 用于高级电子设备和自修复建筑。
item.surge-alloy.description = 用于先进武器和反应防御建筑。 item.surge-alloy.description = 用于先进武器和反应防御建筑。
item.spore-pod.description = 用于转化成石油、 炸药或作为燃料。 item.spore-pod.description = 用于转化成石油、 爆炸混合物或作为燃料。
item.spore-pod.details = 孢子。 可能是人工合成的生命形式,释放对其他生物有毒的气体,极具侵略性。 在某些条件下高度易燃。 item.spore-pod.details = 孢子。 可能是人工合成的生命形式,释放对其他生物有毒的气体,极具侵略性。 在某些条件下高度易燃。
item.blast-compound.description = 用作炸弹或爆炸性弹药。 item.blast-compound.description = 用作炸弹或爆炸性弹药。
item.pyratite.description = 用于火焰发射类武器和使用燃料的发电设备。 item.pyratite.description = 用于火焰发射类武器和使用燃料的发电设备。
@@ -1440,7 +1458,7 @@ block.plastanium-compressor.description = 用石油和钛生产塑钢。
block.phase-weaver.description = 用钍和沙合成相位织物。 block.phase-weaver.description = 用钍和沙合成相位织物。
block.alloy-smelter.description = 将钛、 铅、 硅和铜熔合成巨浪合金。 block.alloy-smelter.description = 将钛、 铅、 硅和铜熔合成巨浪合金。
block.cryofluid-mixer.description = 将水和细钛粉混合制成冷冻液。 block.cryofluid-mixer.description = 将水和细钛粉混合制成冷冻液。
block.blast-mixer.description = 利用硫化物和孢子荚生产炸药 block.blast-mixer.description = 利用硫化物和孢子荚生产爆炸混合物
block.pyratite-mixer.description = 把煤炭、 铅和沙子混合成硫化物。 block.pyratite-mixer.description = 把煤炭、 铅和沙子混合成硫化物。
block.melter.description = 将废料熔化成矿渣液。 block.melter.description = 将废料熔化成矿渣液。
block.separator.description = 将矿渣液分离成矿物成分。 block.separator.description = 将矿渣液分离成矿物成分。
@@ -1496,7 +1514,8 @@ block.conduit.description = 向前方传输液体。 与泵或者其他导管联
block.pulse-conduit.description = 向前方传输液体。 比普通导管传输液体更快,且能储存更多液体。 block.pulse-conduit.description = 向前方传输液体。 比普通导管传输液体更快,且能储存更多液体。
block.plated-conduit.description = 向前方传输液体,不接受侧面输入。 不会发生泄露。 block.plated-conduit.description = 向前方传输液体,不接受侧面输入。 不会发生泄露。
block.liquid-router.description = 接受一个方向的液体输入并平均输出到其他3个方向。 可以储存一定量的液体。 block.liquid-router.description = 接受一个方向的液体输入并平均输出到其他3个方向。 可以储存一定量的液体。
block.liquid-tank.description = 储存大量液体,并像液体路由器一样朝各个方向输出液体。 block.liquid-container.description = 储存可观数量的液体,并像液体路由器一样朝各个方向输出液体。
block.liquid-tank.description = 储存大量的液体,并像液体路由器一样朝各个方向输出液体。
block.liquid-junction.description = 两条交叉导管的桥梁。 block.liquid-junction.description = 两条交叉导管的桥梁。
block.bridge-conduit.description = 跨越任意地形或建筑物传输液体。 block.bridge-conduit.description = 跨越任意地形或建筑物传输液体。
block.phase-conduit.description = 跨越任意地形或建筑物传输液体。 比导管桥范围更大,但需要电力。 block.phase-conduit.description = 跨越任意地形或建筑物传输液体。 比导管桥范围更大,但需要电力。
@@ -1610,7 +1629,7 @@ unit.omura.description = 向敌人发射远程穿透轨道炮。 可自动生产
unit.alpha.description = 保护初代核心,可建造建筑。 unit.alpha.description = 保护初代核心,可建造建筑。
unit.beta.description = 保护次代核心,可建造建筑。 unit.beta.description = 保护次代核心,可建造建筑。
unit.gamma.description = 保护终代核心,可建造建筑。 unit.gamma.description = 保护终代核心,可建造建筑。
unit.retusa.description = 放置水雷,并修复友方单位。 unit.retusa.description = 向附近的敌人发射追踪鱼雷,并修复友方单位。
unit.oxynoe.description = 向附近的敌人发射火焰束,并修复友方建筑。 具备一台单点防御炮塔,能够防御来袭的子弹。 unit.oxynoe.description = 向附近的敌人发射火焰束,并修复友方建筑。 具备一台单点防御炮塔,能够防御来袭的子弹。
unit.cyerce.description = 向敌人发射追踪集束导弹,并修复友方单位。 unit.cyerce.description = 向敌人发射追踪集束导弹,并修复友方单位。
unit.aegires.description = 产生能量场,使范围内的敌方建筑与单位受到电击,对友方则进行修复。 unit.aegires.description = 产生能量场,使范围内的敌方建筑与单位受到电击,对友方则进行修复。
@@ -1761,6 +1780,7 @@ lenum.itemdrop = 将携带的物品放入一座建筑
lenum.itemtake = 从建筑中取出某种物品 lenum.itemtake = 从建筑中取出某种物品
lenum.paydrop = 卸下当前载荷 lenum.paydrop = 卸下当前载荷
lenum.paytake = 从当前位置拾取载荷 lenum.paytake = 从当前位置拾取载荷
lenum.payenter = 进入/降落到单位下方的荷载方块中
lenum.flag = 给单位赋予数字形式的标记 lenum.flag = 给单位赋予数字形式的标记
lenum.mine = 从某个位置采集矿物 lenum.mine = 从某个位置采集矿物
lenum.build = 建造建筑 lenum.build = 建造建筑

View File

@@ -122,7 +122,7 @@ committingchanges = 遞交變更
done = 完成 done = 完成
feature.unsupported = 您的裝置不支援此功能。 feature.unsupported = 您的裝置不支援此功能。
mods.initfailed = [red]⚠[] Mindustry 無法啟動。這可能是因模組造成。\n\n為了避免不斷閃退[red]所有的模組已被停用。[]\n\n若要取消此設定可在[accent]設定->遊戲->閃退後停用模組[]關閉設定. mods.initfailed = [red]⚠[] Mindustry 無法啟動。這可能是因模組造成。\n\n為了避免不斷閃退[red]所有的模組已被停用。[]
mods = 模組 mods = 模組
mods.none = [lightgray]找不到模組! mods.none = [lightgray]找不到模組!
mods.guide = 模組指南 mods.guide = 模組指南
@@ -363,6 +363,7 @@ publish.confirm = 您確定要發布嗎?\n\n[lightgray]首先確定您同意 W
publish.error = 發佈項目時發生問題:{0} publish.error = 發佈項目時發生問題:{0}
steam.error = Steam 服務初始化失敗。\n錯誤{0} steam.error = Steam 服務初始化失敗。\n錯誤{0}
editor.cliffs = 牆轉為懸崖
editor.brush = 筆刷 editor.brush = 筆刷
editor.openin = 在編輯器中開啟 editor.openin = 在編輯器中開啟
editor.oregen = 礦石生成 editor.oregen = 礦石生成
@@ -378,6 +379,9 @@ editor.ingame = 在遊戲中編輯
editor.publish.workshop = 在工作坊上發佈 editor.publish.workshop = 在工作坊上發佈
editor.newmap = 新地圖 editor.newmap = 新地圖
editor.center = 中心 editor.center = 中心
editor.search = 尋找地圖...
editor.filters = 篩選地圖
editor.showAll = 顯示內建地圖
workshop = 工作坊 workshop = 工作坊
waves.title = 波次 waves.title = 波次
waves.remove = 移除 waves.remove = 移除
@@ -400,6 +404,8 @@ waves.sort.reverse = 反向排序
waves.sort.begin = 開始 waves.sort.begin = 開始
waves.sort.health = 血量 waves.sort.health = 血量
waves.sort.type = 兵種 waves.sort.type = 兵種
waves.units.hide = 全部隱藏
waves.units.show = 全部顯示
#校正用空行 #校正用空行
wavemode.counts = 數量 wavemode.counts = 數量
@@ -628,6 +634,8 @@ sector.biomassFacility.name = 生物質合成工廠
sector.windsweptIslands.name = 風之島 sector.windsweptIslands.name = 風之島
sector.extractionOutpost.name = 萃取哨站 sector.extractionOutpost.name = 萃取哨站
sector.planetaryTerminal.name = 星際發射站 sector.planetaryTerminal.name = 星際發射站
sector.coastline.name = 海岸
sector.navalFortress.name = 海上要塞
sector.groundZero.description = 再次開始的最佳位置。敵人威脅程度低。資源少。\n盡可能地採集鉛與銅。\n繼續前進。 sector.groundZero.description = 再次開始的最佳位置。敵人威脅程度低。資源少。\n盡可能地採集鉛與銅。\n繼續前進。
sector.frozenForest.description = 即使是在如此靠近山脈的地方,孢子也已經擴散了。如此低溫也無法永遠遏止它們。\n\n開始冒險發電。建造火力發電機。並學習使用修理單位。 sector.frozenForest.description = 即使是在如此靠近山脈的地方,孢子也已經擴散了。如此低溫也無法永遠遏止它們。\n\n開始冒險發電。建造火力發電機。並學習使用修理單位。
@@ -1125,6 +1133,7 @@ block.sand-boulder.name = 沙礫巨岩
block.basalt-boulder.name = 玄武岩巨石 block.basalt-boulder.name = 玄武岩巨石
block.grass.name = block.grass.name =
block.molten-slag.name = 熔渣 block.molten-slag.name = 熔渣
block.pooled-cryofluid.name = 冷凍液
block.space.name = 太空 block.space.name = 太空
block.salt.name = block.salt.name =
block.salt-wall.name = 鹽牆 block.salt-wall.name = 鹽牆
@@ -1158,6 +1167,7 @@ block.core-nucleus.name = 核心:核子
block.deep-water.name = 深水 block.deep-water.name = 深水
block.shallow-water.name = block.shallow-water.name =
block.tainted-water.name = 污水 block.tainted-water.name = 污水
block.deep-tainted-water.name = 深汙水
block.darksand-tainted-water.name = 黑沙污水 block.darksand-tainted-water.name = 黑沙污水
block.tar.name = 焦油 block.tar.name = 焦油
block.stone.name = 石頭 block.stone.name = 石頭
@@ -1390,7 +1400,8 @@ hint.waveFire = 以[accent]水[]裝填的[accent]波浪[]會自動撲滅附近
hint.generator = \uf879 [accent]燃燒發電機[]消耗煤炭產生能源給相鄰的方塊。\n\n使用 \uf87f [accent]能量節點[]增加電力涵蓋範圍。 hint.generator = \uf879 [accent]燃燒發電機[]消耗煤炭產生能源給相鄰的方塊。\n\n使用 \uf87f [accent]能量節點[]增加電力涵蓋範圍。
hint.guardian = [accent]頭目[]擁有厚實的裝甲。較弱的彈藥如[accent]銅[]和[accent]鉛[]並[scarlet]沒有效果[].\n\n使用更高等的砲臺或以\uf835 [accent]石墨[]配合\uf861雙砲、\uf859齊射砲摧毀頭目。 hint.guardian = [accent]頭目[]擁有厚實的裝甲。較弱的彈藥如[accent]銅[]和[accent]鉛[]並[scarlet]沒有效果[].\n\n使用更高等的砲臺或以\uf835 [accent]石墨[]配合\uf861雙砲、\uf859齊射砲摧毀頭目。
hint.coreUpgrade = 核心可以透過在上面[accent]覆蓋一個更高等級的核心[]來升級。\n\n放置  [accent]核心:基地[] 到  [accent]核心:碎片[] 上. 確保沒有其他障礙物。 hint.coreUpgrade = 核心可以透過在上面[accent]覆蓋一個更高等級的核心[]來升級。\n\n放置  [accent]核心:基地[] 到  [accent]核心:碎片[] 上. 確保沒有其他障礙物。
hint.presetLaunch = 灰色的[accent]降落地區[],例如[accent]冰凍森林[],可由任何地區發射。這類地區無須由相鄰地區進攻。\n\n[accent]數字編號地區[]像是這一個,不是完成戰役的必要條件。 hint.presetLaunch = 灰色的[accent]降落地區[],例如[accent]冰凍森林[],可由任何地區發射。這類地區無須由相鄰地區進攻。\n\n[accent]數字編號地區[]如同這一個,不是完成戰役的必要條件。
hint.presetDifficulty = 此地區為[scarlet]高危險等級[]區域。\n[accent]不建議[]在準備好科技和資源以前發射至此區域。
hint.coreIncinerate = 當任一物品的核心庫存滿了後,後續進入的同種資源會被[accent]銷毀[]。 hint.coreIncinerate = 當任一物品的核心庫存滿了後,後續進入的同種資源會被[accent]銷毀[]。
hint.coopCampaign = 遊玩[accent]多人合作戰役[]時,同地圖所生產的資源皆會被送入[accent]自己的地區[]。\n\n任何新科技也會單向同步到自己的科技。 hint.coopCampaign = 遊玩[accent]多人合作戰役[]時,同地圖所生產的資源皆會被送入[accent]自己的地區[]。\n\n任何新科技也會單向同步到自己的科技。
@@ -1603,7 +1614,7 @@ unit.omura.description = 對敵人發射遠程穿透型砲彈。建造曳光戰
unit.alpha.description = 抵禦敵軍對核心:碎片的攻擊。建造建築物。 unit.alpha.description = 抵禦敵軍對核心:碎片的攻擊。建造建築物。
unit.beta.description = 抵禦敵軍對核心:基地的攻擊。建造建築物。 unit.beta.description = 抵禦敵軍對核心:基地的攻擊。建造建築物。
unit.gamma.description = 抵禦敵軍對核心:核子的攻擊。建造建築物。 unit.gamma.description = 抵禦敵軍對核心:核子的攻擊。建造建築物。
unit.retusa.description = 布置水雷。修復友方單位。 unit.retusa.description = 對周遭敵人發射追蹤魚雷。修復友方單位。
unit.oxynoe.description = 射出帶回復建築的火焰。具小型方陣炮。 unit.oxynoe.description = 射出帶回復建築的火焰。具小型方陣炮。
unit.cyerce.description = 發射追蹤集束飛彈。修復友方單位。 unit.cyerce.description = 發射追蹤集束飛彈。修復友方單位。
unit.aegires.description = 電擊所有在能量場內的敵方單位、建築。修復友方單位。 unit.aegires.description = 電擊所有在能量場內的敵方單位、建築。修復友方單位。

View File

@@ -128,3 +128,4 @@ SAMBUYYA
genNAowl genNAowl
TranquillyUnpleasant TranquillyUnpleasant
Darkness6030 Darkness6030
hortiSquash

View File

@@ -26,6 +26,7 @@ import mindustry.maps.*;
import mindustry.mod.*; import mindustry.mod.*;
import mindustry.net.*; import mindustry.net.*;
import mindustry.service.*; import mindustry.service.*;
import mindustry.world.*;
import java.io.*; import java.io.*;
import java.nio.charset.*; import java.nio.charset.*;
@@ -195,6 +196,8 @@ public class Vars implements Loadable{
public static Fi launchIDFile; public static Fi launchIDFile;
/** empty map, indicates no current map */ /** empty map, indicates no current map */
public static Map emptyMap; public static Map emptyMap;
/** empty tile for payloads */
public static Tile emptyTile;
/** map file extension */ /** map file extension */
public static final String mapExtension = "msav"; public static final String mapExtension = "msav";
/** save file extension */ /** save file extension */
@@ -310,6 +313,10 @@ public class Vars implements Loadable{
modDirectory.mkdirs(); modDirectory.mkdirs();
Events.on(ContentInitEvent.class, e -> {
emptyTile = new Tile(Short.MAX_VALUE - 20, Short.MAX_VALUE - 20);
});
mods.load(); mods.load();
maps.load(); maps.load();
} }

View File

@@ -901,7 +901,7 @@ public class Blocks implements ContentList{
}}; }};
mendProjector = new MendProjector("mend-projector"){{ mendProjector = new MendProjector("mend-projector"){{
requirements(Category.effect, with(Items.lead, 100, Items.titanium, 25, Items.silicon, 40)); requirements(Category.effect, with(Items.lead, 100, Items.titanium, 25, Items.silicon, 40, Items.copper, 50));
consumes.power(1.5f); consumes.power(1.5f);
size = 2; size = 2;
reload = 250f; reload = 250f;
@@ -1346,7 +1346,7 @@ public class Blocks implements ContentList{
}}; }};
waterExtractor = new SolidPump("water-extractor"){{ waterExtractor = new SolidPump("water-extractor"){{
requirements(Category.production, with(Items.metaglass, 30, Items.graphite, 30, Items.lead, 30)); requirements(Category.production, with(Items.metaglass, 30, Items.graphite, 30, Items.lead, 30, Items.copper, 30));
result = Liquids.water; result = Liquids.water;
pumpAmount = 0.11f; pumpAmount = 0.11f;
size = 2; size = 2;
@@ -1645,7 +1645,7 @@ public class Blocks implements ContentList{
shots = 4; shots = 4;
burstSpacing = 5; burstSpacing = 5;
inaccuracy = 10f; inaccuracy = 10f;
range = 235f; range = 240f;
xRand = 6f; xRand = 6f;
size = 2; size = 2;
health = 300 * size * size; health = 300 * size * size;
@@ -2062,12 +2062,12 @@ public class Blocks implements ContentList{
//region payloads //region payloads
payloadConveyor = new PayloadConveyor("payload-conveyor"){{ payloadConveyor = new PayloadConveyor("payload-conveyor"){{
requirements(Category.units, with(Items.graphite, 10, Items.copper, 20)); requirements(Category.units, with(Items.graphite, 10, Items.lead, 10));
canOverdrive = false; canOverdrive = false;
}}; }};
payloadRouter = new PayloadRouter("payload-router"){{ payloadRouter = new PayloadRouter("payload-router"){{
requirements(Category.units, with(Items.graphite, 15, Items.copper, 20)); requirements(Category.units, with(Items.graphite, 15, Items.lead, 15));
canOverdrive = false; canOverdrive = false;
}}; }};
@@ -2163,14 +2163,12 @@ public class Blocks implements ContentList{
requirements(Category.units, BuildVisibility.sandboxOnly, with()); requirements(Category.units, BuildVisibility.sandboxOnly, with());
size = 5; size = 5;
alwaysUnlocked = true; alwaysUnlocked = true;
group = BlockGroup.units;
}}; }};
payloadVoid = new PayloadVoid("payload-void"){{ payloadVoid = new PayloadVoid("payload-void"){{
requirements(Category.units, BuildVisibility.sandboxOnly, with()); requirements(Category.units, BuildVisibility.sandboxOnly, with());
size = 5; size = 5;
alwaysUnlocked = true; alwaysUnlocked = true;
group = BlockGroup.units;
}}; }};
//TODO move //TODO move

View File

@@ -275,7 +275,7 @@ public class NetServer implements ApplicationListener{
int page = args.length > 0 ? Strings.parseInt(args[0]) : 1; int page = args.length > 0 ? Strings.parseInt(args[0]) : 1;
int pages = Mathf.ceil((float)clientCommands.getCommandList().size / commandsPerPage); int pages = Mathf.ceil((float)clientCommands.getCommandList().size / commandsPerPage);
page --; page--;
if(page >= pages || page < 0){ if(page >= pages || page < 0){
player.sendMessage("[scarlet]'page' must be a number between[orange] 1[] and[orange] " + pages + "[scarlet]."); player.sendMessage("[scarlet]'page' must be a number between[orange] 1[] and[orange] " + pages + "[scarlet].");
@@ -724,6 +724,8 @@ public class NetServer implements ApplicationListener{
return; return;
} }
Events.fire(new EventType.AdminRequestEvent(player, other, action));
if(action == AdminAction.wave){ if(action == AdminAction.wave){
//no verification is done, so admins can hypothetically spam waves //no verification is done, so admins can hypothetically spam waves
//not a real issue, because server owners may want to do just that //not a real issue, because server owners may want to do just that

View File

@@ -18,7 +18,7 @@ abstract class BlockUnitComp implements Unitc{
//sets up block stats //sets up block stats
maxHealth(tile.block.health); maxHealth(tile.block.health);
health(tile.health()); health(tile.health);
hitSize(tile.block.size * tilesize * 0.7f); hitSize(tile.block.size * tilesize * 0.7f);
set(tile); set(tile);
} }

View File

@@ -291,7 +291,7 @@ abstract class BuildingComp implements Posc, Teamc, Healthc, Buildingc, Timerc,
} }
public byte relativeTo(Building tile){ public byte relativeTo(Building tile){
return relativeTo(tile.tile()); return relativeTo(tile.tile);
} }
public byte relativeToEdge(Tile other){ public byte relativeToEdge(Tile other){
@@ -923,6 +923,10 @@ abstract class BuildingComp implements Posc, Teamc, Healthc, Buildingc, Timerc,
drawTeamTop(); drawTeamTop();
} }
public void payloadDraw(){
draw();
}
public void drawTeamTop(){ public void drawTeamTop(){
if(block.teamRegion.found()){ if(block.teamRegion.found()){
if(block.teamRegions[team.id] == block.teamRegion) Draw.color(team.color); if(block.teamRegions[team.id] == block.teamRegion) Draw.color(team.color);
@@ -974,6 +978,11 @@ abstract class BuildingComp implements Posc, Teamc, Healthc, Buildingc, Timerc,
} }
} }
/** @return whether this building is in a payload */
public boolean isPayload(){
return tile == emptyTile;
}
/** /**
* Called when a block is placed over some other blocks. This seq will always have at least one item. * Called when a block is placed over some other blocks. This seq will always have at least one item.
* Should load some previous state, if necessary. */ * Should load some previous state, if necessary. */
@@ -1062,7 +1071,7 @@ abstract class BuildingComp implements Posc, Teamc, Healthc, Buildingc, Timerc,
for(int i = 0; i < Mathf.clamp(amount / 5, 0, 30); i++){ for(int i = 0; i < Mathf.clamp(amount / 5, 0, 30); i++){
Time.run(i / 2f, () -> { Time.run(i / 2f, () -> {
Tile other = world.tile(tileX() + Mathf.range(block.size / 2), tileY() + Mathf.range(block.size / 2)); Tile other = world.tileWorld(x + Mathf.range(block.size * tilesize / 2), y + Mathf.range(block.size * tilesize / 2));
if(other != null){ if(other != null){
Puddles.deposit(other, liquid, splash); Puddles.deposit(other, liquid, splash);
} }

View File

@@ -36,7 +36,7 @@ abstract class LegsComp implements Posc, Rotc, Hitboxc, Flyingc, Unitc{
@Override @Override
@Replace @Replace
public int pathType(){ public int pathType(){
return type.allowLegStep ? Pathfinder.costGround : Pathfinder.costLegs; return type.allowLegStep ? Pathfinder.costLegs : Pathfinder.costGround;
} }
@Override @Override

View File

@@ -24,6 +24,38 @@ abstract class PayloadComp implements Posc, Rotc, Hitboxc, Unitc{
Seq<Payload> payloads = new Seq<>(); Seq<Payload> payloads = new Seq<>();
//uncomment for insanity
/*
private transient @Nullable PowerGraph payloadPower;
@Override
public void update(){
if(payloadPower != null){
payloadPower.clear();
}
//update power graph first, resolve everything
for(Payload pay : payloads){
if(pay instanceof BuildPayload pb && pb.build.power != null){
if(payloadPower == null) payloadPower = new PowerGraph();
pb.build.power.graph = null;
payloadPower.add(pb.build);
}
}
if(payloadPower != null){
payloadPower.update();
}
for(Payload pay : payloads){
pay.set(x, y, rotation);
pay.update(true);
}
}*/
float payloadUsed(){ float payloadUsed(){
return payloads.sumf(p -> p.size() * p.size()); return payloads.sumf(p -> p.size() * p.size());
} }
@@ -50,7 +82,7 @@ abstract class PayloadComp implements Posc, Rotc, Hitboxc, Unitc{
void pickup(Unit unit){ void pickup(Unit unit){
unit.remove(); unit.remove();
payloads.add(new UnitPayload(unit)); addPayload(new UnitPayload(unit));
Fx.unitPickup.at(unit); Fx.unitPickup.at(unit);
if(Vars.net.client()){ if(Vars.net.client()){
Vars.netClient.clearRemovedEntity(unit.id); Vars.netClient.clearRemovedEntity(unit.id);
@@ -61,7 +93,8 @@ abstract class PayloadComp implements Posc, Rotc, Hitboxc, Unitc{
void pickup(Building tile){ void pickup(Building tile){
tile.pickedUp(); tile.pickedUp();
tile.tile.remove(); tile.tile.remove();
payloads.add(new BuildPayload(tile)); tile.tile = Vars.emptyTile;
addPayload(new BuildPayload(tile));
Fx.unitPickup.at(tile); Fx.unitPickup.at(tile);
Events.fire(new PickupEvent(self(), tile)); Events.fire(new PickupEvent(self(), tile));
} }

View File

@@ -544,4 +544,15 @@ public class EventType{
} }
} }
public static class AdminRequestEvent{
public final Player player;
public final @Nullable Player other;
public final AdminAction action;
public AdminRequestEvent(Player player, Player other, AdminAction action){
this.player = player;
this.other = other;
this.action = action;
}
}
} }

View File

@@ -101,6 +101,8 @@ public class Rules{
public ObjectSet<Block> revealedBlocks = new ObjectSet<>(); public ObjectSet<Block> revealedBlocks = new ObjectSet<>();
/** Unlocked content names. Only used in multiplayer when the campaign is enabled. */ /** Unlocked content names. Only used in multiplayer when the campaign is enabled. */
public ObjectSet<String> researched = new ObjectSet<>(); public ObjectSet<String> researched = new ObjectSet<>();
/** Block containing these items as requirements are hidden. */
public ObjectSet<Item> hiddenBuildItems = new ObjectSet<>();
/** Whether ambient lighting is enabled. */ /** Whether ambient lighting is enabled. */
public boolean lighting = false; public boolean lighting = false;
/** Whether enemy lighting is visible. /** Whether enemy lighting is visible.

View File

@@ -155,6 +155,7 @@ public class Saves{
SaveSlot slot = new SaveSlot(getNextSlotFile()); SaveSlot slot = new SaveSlot(getNextSlotFile());
slot.importFile(file); slot.importFile(file);
slot.setName(file.nameWithoutExtension()); slot.setName(file.nameWithoutExtension());
saves.add(slot); saves.add(slot);
slot.meta = SaveIO.getMeta(slot.file); slot.meta = SaveIO.getMeta(slot.file);
current = slot; current = slot;
@@ -330,6 +331,10 @@ public class Saves{
public void importFile(Fi from) throws IOException{ public void importFile(Fi from) throws IOException{
try{ try{
from.copyTo(file); from.copyTo(file);
if(previewFile().exists()){
requestedPreview = false;
previewFile().delete();
}
}catch(Exception e){ }catch(Exception e){
throw new IOException(e); throw new IOException(e);
} }

View File

@@ -285,7 +285,7 @@ public class Waves{
if(naval){ if(naval){
species = Structs.filter(UnitType[].class, species, v -> v[0].flying || v[0].naval); species = Structs.filter(UnitType[].class, species, v -> v[0].flying || v[0].naval);
}else{ }else{
species = Structs.filter(UnitType[].class, species, v -> v[0].flying && !v[0].naval); species = Structs.filter(UnitType[].class, species, v -> !v[0].naval);
} }
UnitType[][] fspec = species; UnitType[][] fspec = species;

View File

@@ -5,6 +5,7 @@ import arc.graphics.*;
import arc.graphics.Texture.*; import arc.graphics.Texture.*;
import arc.graphics.g2d.*; import arc.graphics.g2d.*;
import arc.graphics.gl.*; import arc.graphics.gl.*;
import arc.math.*;
import arc.util.*; import arc.util.*;
import static arc.Core.*; import static arc.Core.*;
@@ -35,6 +36,8 @@ public class Pixelator implements Disposable{
w = (int)(Core.camera.width * renderer.landScale() / renderer.getScale()); w = (int)(Core.camera.width * renderer.landScale() / renderer.getScale());
h = (int)(Core.camera.height * renderer.landScale() / renderer.getScale()); h = (int)(Core.camera.height * renderer.landScale() / renderer.getScale());
} }
w = Mathf.clamp(w, 2, graphics.getWidth());
h = Mathf.clamp(h, 2, graphics.getHeight());
buffer.resize(w, h); buffer.resize(w, h);

View File

@@ -1,6 +1,7 @@
package mindustry.graphics.g3d; package mindustry.graphics.g3d;
import arc.graphics.*; import arc.graphics.*;
import arc.math.*;
import arc.math.geom.*; import arc.math.geom.*;
import arc.util.*; import arc.util.*;
import arc.util.noise.*; import arc.util.noise.*;
@@ -42,6 +43,9 @@ public class HexSkyMesh extends PlanetMesh{
@Override @Override
public void render(PlanetParams params, Mat3D projection, Mat3D transform){ public void render(PlanetParams params, Mat3D projection, Mat3D transform){
//don't waste performance rendering 0-alpha clouds
if(Mathf.zero(1f - params.uiAlpha, 0.01f)) return;
preRender(params); preRender(params);
shader.bind(); shader.bind();
shader.setUniformMatrix4("u_proj", projection.val); shader.setUniformMatrix4("u_proj", projection.val);

View File

@@ -19,8 +19,7 @@ public abstract class PlanetMesh implements GenericMesh{
public PlanetMesh(){} public PlanetMesh(){}
/** Should be overridden to set up any shader parameters such as planet position, normals, etc. /** Should be overridden to set up any shader parameters such as planet position, normals, etc. */
* @param params*/
public void preRender(PlanetParams params){ public void preRender(PlanetParams params){
} }

View File

@@ -176,7 +176,7 @@ public class GameService{
}); });
Events.on(UnitControlEvent.class, e -> { Events.on(UnitControlEvent.class, e -> {
if(e.unit instanceof BlockUnitc && ((BlockUnitc)e.unit).tile().block == Blocks.router){ if(e.unit instanceof BlockUnitc unit && unit.tile().block == Blocks.router){
becomeRouter.complete(); becomeRouter.complete();
} }
}); });

View File

@@ -155,7 +155,7 @@ public class Weapon implements Cloneable{
Draw.rect(outlineRegion, Draw.rect(outlineRegion,
wx, wy, wx, wy,
outlineRegion.width * Draw.scl * -Mathf.sign(flipSprite), outlineRegion.width * Draw.scl * -Mathf.sign(flipSprite),
region.height * Draw.scl, outlineRegion.height * Draw.scl,
weaponRotation); weaponRotation);
} }
} }

View File

@@ -259,15 +259,6 @@ public class FileChooser extends BaseDialog{
Core.settings.put("lastDirectory", directory.absolutePath()); Core.settings.put("lastDirectory", directory.absolutePath());
} }
private String shorten(String string){
int max = 30;
if(string.length() <= max){
return string;
}else{
return string.substring(0, max - 3).concat("...");
}
}
public class FileHistory{ public class FileHistory{
private Seq<Fi> history = new Seq<>(); private Seq<Fi> history = new Seq<>();
private int index; private int index;
@@ -305,19 +296,5 @@ public class FileChooser extends BaseDialog{
public boolean canBack(){ public boolean canBack(){
return !(index == 1) && index > 0; return !(index == 1) && index > 0;
} }
void print(){
System.out.println("\n\n\n\n\n\n");
int i = 0;
for(Fi file : history){
i++;
if(index == i){
System.out.println("[[" + file.toString() + "]]");
}else{
System.out.println("--" + file.toString() + "--");
}
}
}
} }
} }

View File

@@ -365,7 +365,8 @@ public class JoinDialog extends BaseDialog{
global.clear(); global.clear();
global.background(null); global.background(null);
for(ServerGroup group : defaultServers){ for(int i = 0; i < defaultServers.size; i ++){
ServerGroup group = defaultServers.get((i + defaultServers.size/2) % defaultServers.size);
boolean hidden = group.hidden(); boolean hidden = group.hidden();
if(hidden && !showHidden){ if(hidden && !showHidden){
continue; continue;

View File

@@ -8,7 +8,9 @@ import arc.scene.ui.*;
import arc.scene.ui.layout.*; import arc.scene.ui.layout.*;
import arc.struct.*; import arc.struct.*;
import arc.util.*; import arc.util.*;
import mindustry.*;
import mindustry.core.GameState.*; import mindustry.core.GameState.*;
import mindustry.game.*;
import mindustry.game.Saves.*; import mindustry.game.Saves.*;
import mindustry.gen.*; import mindustry.gen.*;
import mindustry.io.*; import mindustry.io.*;
@@ -20,8 +22,12 @@ import java.io.*;
import static mindustry.Vars.*; import static mindustry.Vars.*;
public class LoadDialog extends BaseDialog{ public class LoadDialog extends BaseDialog{
ScrollPane pane;
Table slots; Table slots;
String searchString;
Gamemode filteredMode;
TextField searchField;
ScrollPane pane;
BaseDialog dialog;
public LoadDialog(){ public LoadDialog(){
this("@loadgame"); this("@loadgame");
@@ -43,9 +49,38 @@ public class LoadDialog extends BaseDialog{
slots = new Table(); slots = new Table();
pane = new ScrollPane(slots); pane = new ScrollPane(slots);
rebuild();
Table search = new Table();
search.image(Icon.zoom);
searchField = search.field("", t -> {
searchString = t.length() > 0 ? t.toLowerCase() : null;
rebuild();
}).maxTextLength(50).growX().get();
searchField.setMessageText("@save.search");
for(Gamemode mode : Gamemode.all){
TextureRegionDrawable icon = Vars.ui.getIcon("mode" + Strings.capitalize(mode.name()));
boolean sandbox = mode == Gamemode.sandbox;
if(Core.atlas.isFound(icon.getRegion()) || sandbox){
search.button(sandbox ? Icon.terrain : icon, Styles.emptytogglei, () -> {
filteredMode = filteredMode == mode ? null : mode;
rebuild();
}).size(60f).checked(b -> filteredMode == mode).tooltip("@mode." + mode.name() + ".name");
}
}
pane.setFadeScrollBars(false); pane.setFadeScrollBars(false);
pane.setScrollingDisabled(true, false); pane.setScrollingDisabled(true, false);
cont.add(search).growX();
cont.row();
cont.add(pane).growY();
}
public void rebuild(){
slots.clear();
slots.marginRight(24).marginLeft(20f); slots.marginRight(24).marginLeft(20f);
Time.runTask(2f, () -> Core.scene.setScrollFocus(pane)); Time.runTask(2f, () -> Core.scene.setScrollFocus(pane));
@@ -58,7 +93,11 @@ public class LoadDialog extends BaseDialog{
boolean any = false; boolean any = false;
for(SaveSlot slot : array){ for(SaveSlot slot : array){
if(slot.isHidden()) continue; if(slot.isHidden()
|| (searchString != null && !Strings.stripColors(slot.getName()).toLowerCase().contains(searchString))
|| (filteredMode != null && filteredMode != slot.mode())){
continue;
}
any = true; any = true;
@@ -82,14 +121,14 @@ public class LoadDialog extends BaseDialog{
t.button(Icon.trash, Styles.emptyi, () -> { t.button(Icon.trash, Styles.emptyi, () -> {
ui.showConfirm("@confirm", "@save.delete.confirm", () -> { ui.showConfirm("@confirm", "@save.delete.confirm", () -> {
slot.delete(); slot.delete();
setup(); rebuild();
}); });
}).right(); }).right();
t.button(Icon.pencil, Styles.emptyi, () -> { t.button(Icon.pencil, Styles.emptyi, () -> {
ui.showTextInput("@save.rename", "@save.rename.text", slot.getName(), text -> { ui.showTextInput("@save.rename", "@save.rename.text", slot.getName(), text -> {
slot.setName(text); slot.setName(text);
setup(); rebuild();
}); });
}).right(); }).right();
@@ -141,10 +180,8 @@ public class LoadDialog extends BaseDialog{
} }
if(!any){ if(!any){
slots.button("@save.none", () -> {}).disabled(true).fillX().margin(20f).minWidth(340f).height(80f).pad(4f); slots.add("@save.none");
} }
cont.add(pane);
} }
public void addSetup(){ public void addSetup(){
@@ -154,7 +191,7 @@ public class LoadDialog extends BaseDialog{
if(SaveIO.isSaveValid(file)){ if(SaveIO.isSaveValid(file)){
try{ try{
control.saves.importSave(file); control.saves.importSave(file);
setup(); rebuild();
}catch(IOException e){ }catch(IOException e){
e.printStackTrace(); e.printStackTrace();
ui.showException("@save.import.fail", e); ui.showException("@save.import.fail", e);
@@ -193,4 +230,15 @@ public class LoadDialog extends BaseDialog{
} }
}); });
} }
@Override
public Dialog show(){
super.show();
if(Core.app.isDesktop() && searchField != null){
Core.scene.setKeyboardFocus(searchField);
}
return this;
}
} }

View File

@@ -25,7 +25,10 @@ public class MapsDialog extends BaseDialog{
private Table mapTable = new Table(); private Table mapTable = new Table();
private TextField searchField; private TextField searchField;
private boolean showAll = Core.settings.getBool("editorShowAllMaps", true); private boolean showBuiltIn = Core.settings.getBool("editorshowbuiltinmaps", true);
private boolean showCustom = Core.settings.getBool("editorshowcustommaps", true);
private boolean searchAuthor = Core.settings.getBool("editorsearchauthor", false);
private boolean searchDescription = Core.settings.getBool("editorsearchdescription", false);
public MapsDialog(){ public MapsDialog(){
super("@maps"); super("@maps");
@@ -87,7 +90,7 @@ public class MapsDialog extends BaseDialog{
String name = map.tags.get("name", () -> { String name = map.tags.get("name", () -> {
String result = "unknown"; String result = "unknown";
int number = 0; int number = 0;
while(maps.byName(result + number++) != null); while(maps.byName(result + number++) != null) ;
return result + number; return result + number;
}); });
@@ -153,35 +156,43 @@ public class MapsDialog extends BaseDialog{
int i = 0; int i = 0;
Seq<Map> mapList = showAll ? Vars.maps.all() : Vars.maps.customMaps(); Seq<Map> mapList = showCustom ?
for(Map map : mapList){ showBuiltIn ? maps.all() : maps.customMaps() :
showBuiltIn ? maps.defaultMaps() : null;
boolean invalid = false; if(mapList != null){
for(Gamemode mode : modes){ for(Map map : mapList){
invalid |= !mode.valid(map);
boolean invalid = false;
for(Gamemode mode : modes){
invalid |= !mode.valid(map);
}
if(invalid || (searchString != null
&& !Strings.stripColors(map.name()).toLowerCase().contains(searchString)
&& (!searchAuthor || !Strings.stripColors(map.author()).toLowerCase().contains(searchString))
&& (!searchDescription || !Strings.stripColors(map.description()).toLowerCase().contains(searchString)))){
continue;
}
noMapsShown = false;
if(i % maxwidth == 0){
mapTable.row();
}
TextButton button = mapTable.button("", Styles.cleart, () -> showMapInfo(map)).width(mapsize).pad(8).get();
button.clearChildren();
button.margin(9);
button.add(map.name()).width(mapsize - 18f).center().get().setEllipsis(true);
button.row();
button.image().growX().pad(4).color(Pal.gray);
button.row();
button.stack(new Image(map.safeTexture()).setScaling(Scaling.fit), new BorderImage(map.safeTexture()).setScaling(Scaling.fit)).size(mapsize - 20f);
button.row();
button.add(map.custom ? "@custom" : map.workshop ? "@workshop" : map.mod != null ? "[lightgray]" + map.mod.meta.displayName() : "@builtin").color(Color.gray).padTop(3);
i++;
} }
if(invalid || (searchString != null && !Strings.stripColors(map.name()).toLowerCase().contains(searchString))){
continue;
}
noMapsShown = false;
if(i % maxwidth == 0){
mapTable.row();
}
TextButton button = mapTable.button("", Styles.cleart, () -> showMapInfo(map)).width(mapsize).pad(8).get();
button.clearChildren();
button.margin(9);
button.add(map.name()).width(mapsize - 18f).center().get().setEllipsis(true);
button.row();
button.image().growX().pad(4).color(Pal.gray);
button.row();
button.stack(new Image(map.safeTexture()).setScaling(Scaling.fit), new BorderImage(map.safeTexture()).setScaling(Scaling.fit)).size(mapsize - 20f);
button.row();
button.add(map.custom ? "@custom" : map.workshop ? "@workshop" : map.mod != null ? "[lightgray]" + map.mod.meta.displayName() : "@builtin").color(Color.gray).padTop(3);
i++;
} }
if(noMapsShown){ if(noMapsShown){
@@ -192,30 +203,57 @@ public class MapsDialog extends BaseDialog{
void showMapFilters(){ void showMapFilters(){
dialog = new BaseDialog("@editor.filters"); dialog = new BaseDialog("@editor.filters");
dialog.addCloseButton(); dialog.addCloseButton();
dialog.setFillParent(false); dialog.cont.table(menu -> {
dialog.cont.table(Tex.button, t -> { menu.add("@editor.filters.mode").width(150f).left();
int i = 0; menu.table(t -> {
for(Gamemode mode : Gamemode.all){ for(Gamemode mode : Gamemode.all){
TextureRegionDrawable icon = Vars.ui.getIcon("mode" + Strings.capitalize(mode.name())); TextureRegionDrawable icon = Vars.ui.getIcon("mode" + Strings.capitalize(mode.name()));
if(Core.atlas.isFound(icon.getRegion())){ if(Core.atlas.isFound(icon.getRegion())){
t.button(mode.name(), icon, Styles.clearTogglet, () -> { t.button(icon, Styles.emptytogglei, () -> {
if(modes.contains(mode)){ if(modes.contains(mode)){
modes.remove(mode); modes.remove(mode);
}else{ }else{
modes.add(mode); modes.add(mode);
} }
rebuildMaps(); rebuildMaps();
}).size(150f, 60f).marginLeft(6f).checked(modes.contains(mode)); }).size(60f).checked(modes.contains(mode)).tooltip("@mode." + mode.name() + ".name");
if(++i % 3 == 0) t.row(); }
} }
} }).padBottom(10f);
t.row(); menu.row();
t.button("@editor.showAll", Styles.clearTogglet, () -> {
showAll = !showAll; menu.add("@editor.filters.type").width(150f).left();
Core.settings.put("editorShowAllMaps", showAll); menu.table(Tex.button, t -> {
Core.settings.forceSave(); t.button("@custom", Styles.clearTogglet, () -> {
rebuildMaps(); showCustom = !showCustom;
}).checked(b -> showAll).colspan(3).growX().height(40f); Core.settings.put("editorshowcustommaps", showCustom);
Core.settings.forceSave();
rebuildMaps();
}).size(150f, 60f).checked(showCustom);
t.button("@builtin", Styles.clearTogglet, () -> {
showBuiltIn = !showBuiltIn;
Core.settings.put("editorshowbuiltinmaps", showBuiltIn);
Core.settings.forceSave();
rebuildMaps();
}).size(150f, 60f).checked(showBuiltIn);
}).padBottom(10f);
menu.row();
menu.add("@editor.filters.search").width(150f).left();
menu.table(Tex.button, t -> {
t.button("@editor.filters.author", Styles.clearTogglet, () -> {
searchAuthor = !searchAuthor;
Core.settings.put("editorsearchauthor", searchAuthor);
Core.settings.forceSave();
rebuildMaps();
}).size(150f, 60f).checked(searchAuthor);
t.button("@editor.filters.description", Styles.clearTogglet, () -> {
searchDescription = !searchDescription;
Core.settings.put("editorsearchdescription", searchDescription);
Core.settings.forceSave();
rebuildMaps();
}).size(150f, 60f).checked(searchDescription);
});
}); });
dialog.show(); dialog.show();

View File

@@ -151,13 +151,13 @@ public class PlanetDialog extends BaseDialog implements PlanetInterfaceRenderer{
} }
zoom = (Mathf.clamp(initialDistance / distance * lastZoom, state.planet.minZoom, 2f)); zoom = (Mathf.clamp(initialDistance / distance * lastZoom, state.planet.minZoom, 2f));
} }
@Override @Override
public void touchUp(InputEvent event, float x, float y, int pointer, KeyCode button){ public void touchUp(InputEvent event, float x, float y, int pointer, KeyCode button){
lastZoom = zoom; lastZoom = zoom;
} }
}); });
shown(this::setup); shown(this::setup);
} }

View File

@@ -98,7 +98,7 @@ public class PlacementFragment extends Fragment{
boolean gridUpdate(InputHandler input){ boolean gridUpdate(InputHandler input){
scrollPositions.put(currentCategory, blockPane.getScrollY()); scrollPositions.put(currentCategory, blockPane.getScrollY());
if(Core.input.keyTap(Binding.pick) && player.isBuilder()){ //mouse eyedropper select if(Core.input.keyTap(Binding.pick) && player.isBuilder() && !Core.scene.hasDialog()){ //mouse eyedropper select
var build = world.buildWorld(Core.input.mouseWorld().x, Core.input.mouseWorld().y); var build = world.buildWorld(Core.input.mouseWorld().x, Core.input.mouseWorld().y);
Block tryRecipe = build == null ? null : build instanceof ConstructBuild c ? c.current : build.block; Block tryRecipe = build == null ? null : build instanceof ConstructBuild c ? c.current : build.block;
Object tryConfig = build == null || !build.block.copyConfig ? null : build.config(); Object tryConfig = build == null || !build.block.copyConfig ? null : build.config();
@@ -445,7 +445,7 @@ public class PlacementFragment extends Fragment{
} }
boolean unlocked(Block block){ boolean unlocked(Block block){
return block.unlockedNow() && block.placeablePlayer; return block.unlockedNow() && block.placeablePlayer && (state.rules.hiddenBuildItems.isEmpty() || !Structs.contains(block.requirements, i -> state.rules.hiddenBuildItems.contains(i.item)));
} }
boolean hasInfoBox(){ boolean hasInfoBox(){

View File

@@ -1,10 +1,12 @@
package mindustry.ui.fragments; package mindustry.ui.fragments;
import arc.*; import arc.*;
import arc.graphics.*;
import arc.graphics.g2d.*; import arc.graphics.g2d.*;
import arc.scene.*; import arc.scene.*;
import arc.scene.event.*; import arc.scene.event.*;
import arc.scene.ui.*; import arc.scene.ui.*;
import arc.scene.ui.ImageButton.*;
import arc.scene.ui.layout.*; import arc.scene.ui.layout.*;
import arc.struct.*; import arc.struct.*;
import arc.util.*; import arc.util.*;
@@ -115,6 +117,23 @@ public class PlayerListFragment extends Fragment{
button.image(Icon.admin).visible(() -> user.admin && !(!user.isLocal() && net.server())).padRight(5).get().updateVisibility(); button.image(Icon.admin).visible(() -> user.admin && !(!user.isLocal() && net.server())).padRight(5).get().updateVisibility();
var style = new ImageButtonStyle(){{
down = Styles.none;
up = Styles.none;
imageCheckedColor = Pal.accent;
imageDownColor = Pal.accent;
imageUpColor = Color.white;
imageOverColor = Color.lightGray;
}};
var ustyle = new ImageButtonStyle(){{
down = Styles.none;
up = Styles.none;
imageDownColor = Pal.accent;
imageUpColor = Color.white;
imageOverColor = Color.lightGray;
}};
if((net.server() || player.admin) && !user.isLocal() && (!user.admin || net.server())){ if((net.server() || player.admin) && !user.isLocal() && (!user.admin || net.server())){
button.add().growY(); button.add().growY();
@@ -123,35 +142,41 @@ public class PlayerListFragment extends Fragment{
button.table(t -> { button.table(t -> {
t.defaults().size(bs); t.defaults().size(bs);
t.button(Icon.hammer, Styles.clearPartiali, t.button(Icon.hammer, ustyle,
() -> ui.showConfirm("@confirm", Core.bundle.format("confirmban", user.name()), () -> Call.adminRequest(user, AdminAction.ban))); () -> ui.showConfirm("@confirm", Core.bundle.format("confirmban", user.name()), () -> Call.adminRequest(user, AdminAction.ban)));
t.button(Icon.cancel, Styles.clearPartiali, t.button(Icon.cancel, ustyle,
() -> ui.showConfirm("@confirm", Core.bundle.format("confirmkick", user.name()), () -> Call.adminRequest(user, AdminAction.kick))); () -> ui.showConfirm("@confirm", Core.bundle.format("confirmkick", user.name()), () -> Call.adminRequest(user, AdminAction.kick)));
t.row(); t.row();
t.button(Icon.admin, Styles.clearTogglePartiali, () -> { t.button(Icon.admin, style, () -> {
if(net.client()) return; if(net.client()) return;
String id = user.uuid(); String id = user.uuid();
if(netServer.admins.isAdmin(id, connection.address)){ if(user.admin){
ui.showConfirm("@confirm", Core.bundle.format("confirmunadmin", user.name()), () -> netServer.admins.unAdminPlayer(id)); ui.showConfirm("@confirm", Core.bundle.format("confirmunadmin", user.name()), () -> {
netServer.admins.unAdminPlayer(id);
user.admin = false;
});
}else{ }else{
ui.showConfirm("@confirm", Core.bundle.format("confirmadmin", user.name()), () -> netServer.admins.adminPlayer(id, user.usid())); ui.showConfirm("@confirm", Core.bundle.format("confirmadmin", user.name()), () -> {
netServer.admins.adminPlayer(id, user.usid());
user.admin = true;
});
} }
}).update(b -> b.setChecked(user.admin)) }).update(b -> b.setChecked(user.admin))
.disabled(b -> net.client()) .disabled(b -> net.client())
.touchable(() -> net.client() ? Touchable.disabled : Touchable.enabled) .touchable(() -> net.client() ? Touchable.disabled : Touchable.enabled)
.checked(user.admin); .checked(user.admin);
t.button(Icon.zoom, Styles.clearPartiali, () -> Call.adminRequest(user, AdminAction.trace)); t.button(Icon.zoom, ustyle, () -> Call.adminRequest(user, AdminAction.trace));
}).padRight(12).size(bs + 10f, bs); }).padRight(12).size(bs + 10f, bs);
}else if(!user.isLocal() && !user.admin && net.client() && Groups.player.size() >= 3 && player.team() == user.team()){ //votekick }else if(!user.isLocal() && !user.admin && net.client() && Groups.player.size() >= 3 && player.team() == user.team()){ //votekick
button.add().growY(); button.add().growY();
button.button(Icon.hammer, Styles.clearPartiali, button.button(Icon.hammer, ustyle,
() -> { () -> {
ui.showConfirm("@confirm", Core.bundle.format("confirmvotekick", user.name()), () -> { ui.showConfirm("@confirm", Core.bundle.format("confirmvotekick", user.name()), () -> {
Call.sendChatMessage("/votekick " + user.name()); Call.sendChatMessage("/votekick " + user.name());

View File

@@ -120,6 +120,8 @@ public class Block extends UnlockableContent{
public boolean autoResetEnabled = true; public boolean autoResetEnabled = true;
/** if true, the block stops updating when disabled */ /** if true, the block stops updating when disabled */
public boolean noUpdateDisabled = false; public boolean noUpdateDisabled = false;
/** if true, this block updates when a payload of a unit. Currently unused! */
public boolean updateInUnits = true;
/** Whether to use this block's color in the minimap. Only used for overlays. */ /** Whether to use this block's color in the minimap. Only used for overlays. */
public boolean useColor = true; public boolean useColor = true;
/** item that drops from this block, used for drills */ /** item that drops from this block, used for drills */
@@ -152,7 +154,7 @@ public class Block extends UnlockableContent{
public boolean alwaysReplace = false; public boolean alwaysReplace = false;
/** if false, this block can never be replaced. */ /** if false, this block can never be replaced. */
public boolean replaceable = true; public boolean replaceable = true;
/** The block group. Unless {@link #canReplace} is overriden, blocks in the same group can replace each other. */ /** The block group. Unless {@link #canReplace} is overridden, blocks in the same group can replace each other. */
public BlockGroup group = BlockGroup.none; public BlockGroup group = BlockGroup.none;
/** List of block flags. Used for AI indexing. */ /** List of block flags. Used for AI indexing. */
public EnumSet<BlockFlag> flags = EnumSet.of(); public EnumSet<BlockFlag> flags = EnumSet.of();
@@ -263,7 +265,10 @@ public class Block extends UnlockableContent{
public boolean quickRotate = true; public boolean quickRotate = true;
/** Main subclass. Non-anonymous. */ /** Main subclass. Non-anonymous. */
public @Nullable Class<?> subclass; public @Nullable Class<?> subclass;
/** Determines if this block gets a higher unloader priority. */
public boolean highUnloadPriority = false;
public float selectScroll; //scroll position for certain blocks
public Prov<Building> buildType = null; //initialized later public Prov<Building> buildType = null; //initialized later
public ObjectMap<Class<?>, Cons2> configurations = new ObjectMap<>(); public ObjectMap<Class<?>, Cons2> configurations = new ObjectMap<>();

View File

@@ -5,20 +5,29 @@ import arc.scene.style.*;
import arc.scene.ui.*; import arc.scene.ui.*;
import arc.scene.ui.layout.*; import arc.scene.ui.layout.*;
import arc.struct.*; import arc.struct.*;
import arc.util.*;
import mindustry.ctype.*; import mindustry.ctype.*;
import mindustry.gen.*; import mindustry.gen.*;
import mindustry.ui.*; import mindustry.ui.*;
import mindustry.world.*;
import static mindustry.Vars.*; import static mindustry.Vars.*;
public class ItemSelection{ public class ItemSelection{
private static float scrollPos = 0f;
public static <T extends UnlockableContent> void buildTable(Table table, Seq<T> items, Prov<T> holder, Cons<T> consumer){ public static <T extends UnlockableContent> void buildTable(Table table, Seq<T> items, Prov<T> holder, Cons<T> consumer){
buildTable(table, items, holder, consumer, true); buildTable(table, items, holder, consumer, true);
} }
public static <T extends UnlockableContent> void buildTable(Block block, Table table, Seq<T> items, Prov<T> holder, Cons<T> consumer){
buildTable(block, table, items, holder, consumer, true);
}
public static <T extends UnlockableContent> void buildTable(Table table, Seq<T> items, Prov<T> holder, Cons<T> consumer, boolean closeSelect){ public static <T extends UnlockableContent> void buildTable(Table table, Seq<T> items, Prov<T> holder, Cons<T> consumer, boolean closeSelect){
buildTable(null, table, items, holder, consumer, closeSelect);
}
public static <T extends UnlockableContent> void buildTable(@Nullable Block block, Table table, Seq<T> items, Prov<T> holder, Cons<T> consumer, boolean closeSelect){
ButtonGroup<ImageButton> group = new ButtonGroup<>(); ButtonGroup<ImageButton> group = new ButtonGroup<>();
group.setMinCheckCount(0); group.setMinCheckCount(0);
@@ -52,10 +61,13 @@ public class ItemSelection{
ScrollPane pane = new ScrollPane(cont, Styles.smallPane); ScrollPane pane = new ScrollPane(cont, Styles.smallPane);
pane.setScrollingDisabled(true, false); pane.setScrollingDisabled(true, false);
pane.setScrollYForce(scrollPos);
pane.update(() -> { if(block != null){
scrollPos = pane.getScrollY(); pane.setScrollYForce(block.selectScroll);
}); pane.update(() -> {
block.selectScroll = pane.getScrollY();
});
}
pane.setOverscroll(false, false); pane.setOverscroll(false, false);
table.add(pane).maxHeight(Scl.scl(40 * 5)); table.add(pane).maxHeight(Scl.scl(40 * 5));

View File

@@ -109,7 +109,7 @@ public class OverdriveProjector extends Block{
float realRange = range + phaseHeat * phaseRangeBoost; float realRange = range + phaseHeat * phaseRangeBoost;
charge = 0f; charge = 0f;
indexer.eachBlock(this, realRange, other -> true, other -> other.applyBoost(realBoost(), reload + 1f)); indexer.eachBlock(this, realRange, other -> other.block.canOverdrive, other -> other.applyBoost(realBoost(), reload + 1f));
} }
if(timer(timerUse, useTime) && efficiency() > 0 && consValid()){ if(timer(timerUse, useTime) && efficiency() > 0 && consValid()){

View File

@@ -31,6 +31,7 @@ public class BaseTurret extends Block{
priority = TargetPriority.turret; priority = TargetPriority.turret;
group = BlockGroup.turrets; group = BlockGroup.turrets;
flags = EnumSet.of(BlockFlag.turret); flags = EnumSet.of(BlockFlag.turret);
updateInUnits = false;
} }
@Override @Override

View File

@@ -106,7 +106,7 @@ public class LaserTurret extends PowerTurret{
@Override @Override
protected void bullet(BulletType type, float angle){ protected void bullet(BulletType type, float angle){
bullet = type.create(tile.build, team, x + tr.x, y + tr.y, angle); bullet = type.create(this, team, x + tr.x, y + tr.y, angle);
bulletLife = shootDuration; bulletLife = shootDuration;
} }

View File

@@ -4,6 +4,7 @@ import arc.graphics.g2d.*;
import arc.struct.*; import arc.struct.*;
import mindustry.annotations.Annotations.*; import mindustry.annotations.Annotations.*;
import mindustry.content.*; import mindustry.content.*;
import mindustry.core.*;
import mindustry.entities.*; import mindustry.entities.*;
import mindustry.entities.bullet.*; import mindustry.entities.bullet.*;
import mindustry.gen.*; import mindustry.gen.*;
@@ -90,9 +91,7 @@ public class LiquidTurret extends Turret{
@Override @Override
public void updateTile(){ public void updateTile(){
if(unit != null){ unit.ammo(unit.type().ammoCapacity * liquids.currentAmount() / liquidCapacity);
unit.ammo(unit.type().ammoCapacity * liquids.currentAmount() / liquidCapacity);
}
super.updateTile(); super.updateTile();
} }
@@ -100,13 +99,14 @@ public class LiquidTurret extends Turret{
@Override @Override
protected void findTarget(){ protected void findTarget(){
if(extinguish && liquids.current().canExtinguish()){ if(extinguish && liquids.current().canExtinguish()){
int tx = World.toTile(x), ty = World.toTile(y);
Fire result = null; Fire result = null;
float mindst = 0f; float mindst = 0f;
int tr = (int)(range / tilesize); int tr = (int)(range / tilesize);
for(int x = -tr; x <= tr; x++){ for(int x = -tr; x <= tr; x++){
for(int y = -tr; y <= tr; y++){ for(int y = -tr; y <= tr; y++){
Tile other = world.tile(x + tile.x, y + tile.y); Tile other = world.tile(x + tx, y + ty);
var fire = Fires.get(x + tile.x, y + tile.y); var fire = Fires.get(x + tx, y + ty);
float dst = fire == null ? 0 : dst2(fire); float dst = fire == null ? 0 : dst2(fire);
//do not extinguish fires on other team blocks //do not extinguish fires on other team blocks
if(other != null && fire != null && Fires.has(other.x, other.y) && dst <= range * range && (result == null || dst < mindst) && (other.build == null || other.team() == team)){ if(other != null && fire != null && Fires.has(other.x, other.y) && dst <= range * range && (result == null || dst < mindst) && (other.build == null || other.team() == team)){

View File

@@ -31,9 +31,7 @@ public class PowerTurret extends Turret{
@Override @Override
public void updateTile(){ public void updateTile(){
if(unit != null){ unit.ammo(power.status * unit.type().ammoCapacity);
unit.ammo(power.status * unit.type().ammoCapacity);
}
super.updateTile(); super.updateTile();
} }

View File

@@ -149,15 +149,9 @@ public class Turret extends ReloadTurret{
public boolean logicShooting = false; public boolean logicShooting = false;
public @Nullable Posc target; public @Nullable Posc target;
public Vec2 targetPos = new Vec2(); public Vec2 targetPos = new Vec2();
public @Nullable BlockUnitc unit; public BlockUnitc unit = (BlockUnitc)UnitTypes.block.create(team);
public boolean wasShooting, charging; public boolean wasShooting, charging;
@Override
public void created(){
unit = (BlockUnitc)UnitTypes.block.create(team);
unit.tile(this);
}
@Override @Override
public boolean canControl(){ public boolean canControl(){
return playerControllable; return playerControllable;
@@ -165,7 +159,7 @@ public class Turret extends ReloadTurret{
@Override @Override
public void control(LAccess type, double p1, double p2, double p3, double p4){ public void control(LAccess type, double p1, double p2, double p3, double p4){
if(type == LAccess.shoot && (unit == null || !unit.isPlayer())){ if(type == LAccess.shoot && !unit.isPlayer()){
targetPos.set(World.unconv((float)p1), World.unconv((float)p2)); targetPos.set(World.unconv((float)p1), World.unconv((float)p2));
logicControlTime = logicControlCooldown; logicControlTime = logicControlCooldown;
logicShooting = !Mathf.zero(p3); logicShooting = !Mathf.zero(p3);
@@ -203,15 +197,14 @@ public class Turret extends ReloadTurret{
} }
public boolean isShooting(){ public boolean isShooting(){
return (isControlled() ? (unit != null && unit.isShooting()) : logicControlled() ? logicShooting : target != null); return (isControlled() ? unit.isShooting() : logicControlled() ? logicShooting : target != null);
} }
@Override @Override
public Unit unit(){ public Unit unit(){
if(unit == null){ //make sure stats are correct
unit = (BlockUnitc)UnitTypes.block.create(team); unit.tile(this);
unit.tile(this); unit.team(team);
}
return (Unit)unit; return (Unit)unit;
} }
@@ -267,12 +260,9 @@ public class Turret extends ReloadTurret{
recoil = Mathf.lerpDelta(recoil, 0f, restitution); recoil = Mathf.lerpDelta(recoil, 0f, restitution);
heat = Mathf.lerpDelta(heat, 0f, cooldown); heat = Mathf.lerpDelta(heat, 0f, cooldown);
if(unit != null){ unit.tile(this);
unit.health(health); unit.rotation(rotation);
unit.rotation(rotation); unit.team(team);
unit.team(team);
unit.set(x, y);
}
if(logicControlTime > 0){ if(logicControlTime > 0){
logicControlTime -= Time.delta; logicControlTime -= Time.delta;
@@ -338,7 +328,7 @@ public class Turret extends ReloadTurret{
if(targetAir && !targetGround){ if(targetAir && !targetGround){
target = Units.bestEnemy(team, x, y, range, e -> !e.dead() && !e.isGrounded(), unitSort); target = Units.bestEnemy(team, x, y, range, e -> !e.dead() && !e.isGrounded(), unitSort);
}else{ }else{
target = Units.bestTarget(team, x, y, range, e -> !e.dead() && (e.isGrounded() || targetAir) && (!e.isGrounded() || targetGround), b -> true, unitSort); target = Units.bestTarget(team, x, y, range, e -> !e.dead() && (e.isGrounded() || targetAir) && (!e.isGrounded() || targetGround), b -> targetGround, unitSort);
if(target == null && canHeal()){ if(target == null && canHeal()){
target = Units.findAllyTile(team, x, y, range, b -> b.damaged() && b != this); target = Units.findAllyTile(team, x, y, range, b -> b.damaged() && b != this);
@@ -405,7 +395,7 @@ public class Turret extends ReloadTurret{
for(int i = 0; i < chargeEffects; i++){ for(int i = 0; i < chargeEffects; i++){
Time.run(Mathf.random(chargeMaxDelay), () -> { Time.run(Mathf.random(chargeMaxDelay), () -> {
if(!isValid()) return; if(dead) return;
tr.trns(rotation, shootLength); tr.trns(rotation, shootLength);
chargeEffect.at(x + tr.x, y + tr.y, rotation); chargeEffect.at(x + tr.x, y + tr.y, rotation);
}); });
@@ -414,7 +404,7 @@ public class Turret extends ReloadTurret{
charging = true; charging = true;
Time.run(chargeTime, () -> { Time.run(chargeTime, () -> {
if(!isValid()) return; if(dead) return;
tr.trns(rotation, shootLength); tr.trns(rotation, shootLength);
recoil = recoilAmount; recoil = recoilAmount;
heat = 1f; heat = 1f;
@@ -428,7 +418,7 @@ public class Turret extends ReloadTurret{
for(int i = 0; i < shots; i++){ for(int i = 0; i < shots; i++){
int ii = i; int ii = i;
Time.run(burstSpacing * i, () -> { Time.run(burstSpacing * i, () -> {
if(!isValid() || !hasAmmo()) return; if(dead || !hasAmmo()) return;
recoil = recoilAmount; recoil = recoilAmount;
@@ -488,7 +478,7 @@ public class Turret extends ReloadTurret{
} }
protected void ejectEffects(){ protected void ejectEffects(){
if(!isValid()) return; if(dead) return;
//alternate sides when using a double turret //alternate sides when using a double turret
float scl = (shots == 2 && alternate && shotCounter % 2 == 1 ? -1f : 1f); float scl = (shots == 2 && alternate && shotCounter % 2 == 1 ? -1f : 1f);

View File

@@ -132,7 +132,7 @@ public class Conveyor extends Block implements Autotiler{
public float minitem = 1; public float minitem = 1;
public int blendbits, blending; public int blendbits, blending;
public int blendsclx, blendscly; public int blendsclx = 1, blendscly = 1;
public float clogHeat = 0f; public float clogHeat = 0f;
@@ -163,12 +163,17 @@ public class Conveyor extends Block implements Autotiler{
tr2.trns(rotation * 90, -tilesize / 2f, xs[i] * tilesize / 2f); tr2.trns(rotation * 90, -tilesize / 2f, xs[i] * tilesize / 2f);
Draw.rect(item.fullIcon, Draw.rect(item.fullIcon,
(tile.x * tilesize + tr1.x * ys[i] + tr2.x), (x + tr1.x * ys[i] + tr2.x),
(tile.y * tilesize + tr1.y * ys[i] + tr2.y), (y + tr1.y * ys[i] + tr2.y),
itemSize, itemSize); itemSize, itemSize);
} }
} }
@Override
public void payloadDraw(){
Draw.rect(block.fullIcon,x, y);
}
@Override @Override
public void drawCracks(){ public void drawCracks(){
Draw.z(Layer.block - 0.15f); Draw.z(Layer.block - 0.15f);

View File

@@ -184,6 +184,11 @@ public class ItemBridge extends Block{
public boolean wasMoved, moved; public boolean wasMoved, moved;
public float transportCounter; public float transportCounter;
@Override
public void pickedUp(){
link = -1;
}
@Override @Override
public void playerPlaced(Object config){ public void playerPlaced(Object config){
super.playerPlaced(config); super.playerPlaced(config);

View File

@@ -165,7 +165,7 @@ public class MassDriver extends Block{
} }
//align to shooter rotation //align to shooter rotation
rotation = Angles.moveToward(rotation, tile.angleTo(currentShooter()), rotateSpeed * efficiency()); rotation = Angles.moveToward(rotation, angleTo(currentShooter()), rotateSpeed * efficiency());
}else if(state == DriverState.shooting){ }else if(state == DriverState.shooting){
//if there's nothing to shoot at OR someone wants to shoot at this thing, bail //if there's nothing to shoot at OR someone wants to shoot at this thing, bail
if(!hasLink || (!waitingShooters.isEmpty() && (itemCapacity - items.total() >= minDistribute))){ if(!hasLink || (!waitingShooters.isEmpty() && (itemCapacity - items.total() >= minDistribute))){
@@ -173,7 +173,7 @@ public class MassDriver extends Block{
return; return;
} }
float targetRotation = tile.angleTo(link); float targetRotation = angleTo(link);
if( if(
items.total() >= minDistribute && //must shoot minimum amount of items items.total() >= minDistribute && //must shoot minimum amount of items

View File

@@ -126,6 +126,10 @@ public class PayloadConveyor extends Block{
public void updateTile(){ public void updateTile(){
if(!enabled) return; if(!enabled) return;
if(item != null){
item.update(false);
}
lastInterp = curInterp; lastInterp = curInterp;
curInterp = fract(); curInterp = fract();
//rollover skip //rollover skip
@@ -231,6 +235,11 @@ public class PayloadConveyor extends Block{
} }
} }
@Override
public void payloadDraw(){
Draw.rect(block.fullIcon,x, y);
}
public float time(){ public float time(){
return Time.time; return Time.time;
} }

View File

@@ -124,7 +124,7 @@ public class Sorter extends Block{
@Override @Override
public void buildConfiguration(Table table){ public void buildConfiguration(Table table){
ItemSelection.buildTable(table, content.items(), () -> sortItem, this::configure); ItemSelection.buildTable(Sorter.this, table, content.items(), () -> sortItem, this::configure);
} }
@Override @Override

View File

@@ -42,6 +42,7 @@ public class StackConveyor extends Block implements Autotiler{
hasItems = true; hasItems = true;
itemCapacity = 10; itemCapacity = 10;
conveyorPlacement = true; conveyorPlacement = true;
highUnloadPriority = true;
ambientSound = Sounds.conveyor; ambientSound = Sounds.conveyor;
ambientSoundVolume = 0.004f; ambientSoundVolume = 0.004f;
@@ -312,7 +313,7 @@ public class StackConveyor extends Block implements Autotiler{
@Override @Override
public boolean acceptItem(Building source, Item item){ public boolean acceptItem(Building source, Item item){
if(this == source) return true; //player threw items if(this == source) return items.total() < itemCapacity && (!items.any() || items.has(item)); //player threw items
if(cooldown > recharge - 1f) return false; //still cooling down if(cooldown > recharge - 1f) return false; //still cooling down
return !((state != stateLoad) //not a loading dock return !((state != stateLoad) //not a loading dock
|| (items.any() && !items.has(item)) //incompatible items || (items.any() && !items.has(item)) //incompatible items

View File

@@ -97,7 +97,7 @@ public class Conduit extends LiquidBlock implements Autotiler{
public class ConduitBuild extends LiquidBuild implements ChainedBuilding{ public class ConduitBuild extends LiquidBuild implements ChainedBuilding{
public float smoothLiquid; public float smoothLiquid;
public int blendbits, xscl, yscl, blending; public int blendbits, xscl = 1, yscl = 1, blending;
public boolean capped; public boolean capped;
@Override @Override

View File

@@ -119,7 +119,7 @@ public class MessageBlock extends Block{
dialog.hide(); dialog.hide();
}).size(130f, 60f); }).size(130f, 60f);
dialog.update(() -> { dialog.update(() -> {
if(tile.block() != MessageBlock.this){ if(tile.build != this){
dialog.hide(); dialog.hide();
} }
}); });

View File

@@ -78,6 +78,7 @@ public abstract class BlockProducer extends PayloadBlock{
@Override @Override
public void updateTile(){ public void updateTile(){
super.updateTile();
var recipe = recipe(); var recipe = recipe();
boolean produce = recipe != null && consValid() && payload == null; boolean produce = recipe != null && consValid() && payload == null;

View File

@@ -1,6 +1,7 @@
package mindustry.world.blocks.payloads; package mindustry.world.blocks.payloads;
import arc.graphics.g2d.*; import arc.graphics.g2d.*;
import arc.math.*;
import arc.util.io.*; import arc.util.io.*;
import mindustry.game.*; import mindustry.game.*;
import mindustry.gen.*; import mindustry.gen.*;
@@ -15,6 +16,7 @@ public class BuildPayload implements Payload{
public BuildPayload(Block block, Team team){ public BuildPayload(Block block, Team team){
this.build = block.newBuilding().create(block, team); this.build = block.newBuilding().create(block, team);
this.build.tile = emptyTile;
} }
public BuildPayload(Building build){ public BuildPayload(Building build){
@@ -34,6 +36,14 @@ public class BuildPayload implements Payload{
build.dropped(); build.dropped();
} }
@Override
public void update(boolean inUnit){
if(inUnit && !build.block.updateInUnits) return;
if(build.tile == null) build.tile = emptyTile;
build.update();
}
@Override @Override
public ItemStack[] requirements(){ public ItemStack[] requirements(){
return build.block.requirements; return build.block.requirements;
@@ -80,7 +90,10 @@ public class BuildPayload implements Payload{
@Override @Override
public void draw(){ public void draw(){
drawShadow(1f); drawShadow(1f);
Draw.rect(build.block.fullIcon, build.x, build.y); float prevZ = Draw.z();
Draw.zTransform(z -> 0.0011f + Mathf.clamp(z, prevZ - 0.001f, prevZ + 0.9f));
build.payloadDraw();
Draw.zTransform();
} }
@Override @Override

View File

@@ -6,6 +6,7 @@ import arc.scene.ui.layout.*;
import arc.util.*; import arc.util.*;
import arc.util.io.*; import arc.util.io.*;
import mindustry.*; import mindustry.*;
import mindustry.gen.*;
import mindustry.world.*; import mindustry.world.*;
import mindustry.world.blocks.*; import mindustry.world.blocks.*;
import mindustry.world.blocks.storage.*; import mindustry.world.blocks.storage.*;
@@ -54,7 +55,18 @@ public class Constructor extends BlockProducer{
@Override @Override
public void buildConfiguration(Table table){ public void buildConfiguration(Table table){
ItemSelection.buildTable(table, content.blocks().select(Constructor.this::canProduce), () -> recipe, this::configure); ItemSelection.buildTable(Constructor.this, table, content.blocks().select(Constructor.this::canProduce), () -> recipe, this::configure);
}
@Override
public boolean onConfigureTileTapped(Building other){
if(this == other){
deselect();
configure(null);
return false;
}
return true;
} }
@Override @Override

View File

@@ -36,6 +36,10 @@ public interface Payload extends Position{
/** @return the time taken to build this payload. */ /** @return the time taken to build this payload. */
float buildTime(); float buildTime();
/** update this payload if it is a block
* @param inUnit whether this payload is in a unit */
default void update(boolean inUnit){}
/** @return whether this payload was dumped. */ /** @return whether this payload was dumped. */
default boolean dump(){ default boolean dump(){
return false; return false;
@@ -94,6 +98,7 @@ public interface Payload extends Position{
BuildPayload payload = new BuildPayload(block, Team.derelict); BuildPayload payload = new BuildPayload(block, Team.derelict);
byte version = read.b(); byte version = read.b();
payload.build.readAll(read, version); payload.build.readAll(read, version);
payload.build.tile = emptyTile;
return (T)payload; return (T)payload;
}else if(type == payloadUnit){ }else if(type == payloadUnit){
byte id = read.b(); byte id = read.b();

View File

@@ -135,6 +135,13 @@ public class PayloadBlock extends Block{
if(payload != null && !carried) payload.dump(); if(payload != null && !carried) payload.dump();
} }
@Override
public void updateTile(){
if(payload != null){
payload.update(false);
}
}
public boolean blends(int direction){ public boolean blends(int direction){
return PayloadBlock.blends(this, direction); return PayloadBlock.blends(this, direction);
} }

View File

@@ -103,6 +103,7 @@ public class PayloadDeconstructor extends PayloadBlock{
@Override @Override
public void updateTile(){ public void updateTile(){
super.updateTile();
if(items.total() > 0){ if(items.total() > 0){
for(int i = 0; i < dumpRate; i++){ for(int i = 0; i < dumpRate; i++){
dumpAccumulate(); dumpAccumulate();

View File

@@ -3,6 +3,7 @@ package mindustry.world.blocks.payloads;
import arc.*; import arc.*;
import arc.graphics.g2d.*; import arc.graphics.g2d.*;
import arc.util.*; import arc.util.*;
import arc.util.io.*;
import mindustry.entities.units.*; import mindustry.entities.units.*;
import mindustry.gen.*; import mindustry.gen.*;
import mindustry.graphics.*; import mindustry.graphics.*;
@@ -58,6 +59,7 @@ public class PayloadLoader extends PayloadBlock{
} }
public class PayloadLoaderBuild extends PayloadBlockBuild<BuildPayload>{ public class PayloadLoaderBuild extends PayloadBlockBuild<BuildPayload>{
public boolean exporting = false;
@Override @Override
public boolean acceptPayload(Building source, Payload payload){ public boolean acceptPayload(Building source, Payload payload){
@@ -68,6 +70,12 @@ public class PayloadLoader extends PayloadBlock{
build.build.block().hasLiquids && build.block().liquidCapacity >= 10f); build.build.block().hasLiquids && build.block().liquidCapacity >= 10f);
} }
@Override
public void handlePayload(Building source, Payload payload){
super.handlePayload(source, payload);
exporting = false;
}
@Override @Override
public boolean acceptItem(Building source, Item item){ public boolean acceptItem(Building source, Item item){
return items.total() < itemCapacity; return items.total() < itemCapacity;
@@ -103,6 +111,7 @@ public class PayloadLoader extends PayloadBlock{
@Override @Override
public void updateTile(){ public void updateTile(){
super.updateTile();
if(shouldExport()){ if(shouldExport()){
moveOutPayload(); moveOutPayload();
}else if(moveInPayload()){ }else if(moveInPayload()){
@@ -120,6 +129,9 @@ public class PayloadLoader extends PayloadBlock{
payload.build.handleItem(payload.build, item); payload.build.handleItem(payload.build, item);
items.remove(item, 1); items.remove(item, 1);
break; break;
}else if(payload.block().separateItemCapacity || payload.block().consumes.consumesItem(item)){
exporting = true;
break;
} }
} }
} }
@@ -147,11 +159,28 @@ public class PayloadLoader extends PayloadBlock{
public boolean shouldExport(){ public boolean shouldExport(){
return payload != null && ( return payload != null && (
exporting ||
(payload.block().hasLiquids && payload.build.liquids.total() >= payload.block().liquidCapacity - 0.001f) || (payload.block().hasLiquids && payload.build.liquids.total() >= payload.block().liquidCapacity - 0.001f) ||
(payload.block().hasItems && (payload.block().hasItems && payload.block().separateItemCapacity && content.items().contains(i -> payload.build.items.get(i) >= payload.block().itemCapacity)));
payload.block().separateItemCapacity ? }
content.items().contains(i -> payload.build.items.get(i) >= payload.block().itemCapacity) :
payload.build.items.total() >= payload.block().itemCapacity)); @Override
public byte version(){
return 1;
}
@Override
public void write(Writes write){
super.write(write);
write.bool(exporting);
}
@Override
public void read(Reads read, byte revision){
super.read(read, revision);
if(revision >= 1){
exporting = read.bool();
}
} }
} }
} }

View File

@@ -143,6 +143,7 @@ public class PayloadMassDriver extends PayloadBlock{
@Override @Override
public void updateTile(){ public void updateTile(){
super.updateTile();
Building link = world.build(this.link); Building link = world.build(this.link);
boolean hasLink = linkValid(); boolean hasLink = linkValid();
@@ -233,7 +234,7 @@ public class PayloadMassDriver extends PayloadBlock{
} }
//align to shooter rotation //align to shooter rotation
turretRotation = Angles.moveToward(turretRotation, tile.angleTo(currentShooter()), rotateSpeed * efficiency()); turretRotation = Angles.moveToward(turretRotation, angleTo(currentShooter()), rotateSpeed * efficiency());
}else if(state == shooting){ }else if(state == shooting){
//if there's nothing to shoot at OR someone wants to shoot at this thing, bail //if there's nothing to shoot at OR someone wants to shoot at this thing, bail
if(!hasLink || (!waitingShooters.isEmpty() && payload == null)){ if(!hasLink || (!waitingShooters.isEmpty() && payload == null)){
@@ -241,7 +242,7 @@ public class PayloadMassDriver extends PayloadBlock{
return; return;
} }
float targetRotation = tile.angleTo(link); float targetRotation = angleTo(link);
boolean movedOut = false; boolean movedOut = false;
payRotation = Angles.moveToward(payRotation, turretRotation, payloadRotateSpeed * delta()); payRotation = Angles.moveToward(payRotation, turretRotation, payloadRotateSpeed * delta());

View File

@@ -85,12 +85,23 @@ public class PayloadSource extends PayloadBlock{
@Override @Override
public void buildConfiguration(Table table){ public void buildConfiguration(Table table){
ItemSelection.buildTable(table, ItemSelection.buildTable(PayloadSource.this, table,
content.blocks().select(PayloadSource.this::canProduce).<UnlockableContent>as() content.blocks().select(PayloadSource.this::canProduce).<UnlockableContent>as()
.and(content.units().select(PayloadSource.this::canProduce).as()), .and(content.units().select(PayloadSource.this::canProduce).as()),
() -> (UnlockableContent)config(), this::configure); () -> (UnlockableContent)config(), this::configure);
} }
@Override
public boolean onConfigureTileTapped(Building other){
if(this == other){
deselect();
configure(null);
return false;
}
return true;
}
@Override @Override
public Object config(){ public Object config(){
return unit == null ? block : unit; return unit == null ? block : unit;
@@ -103,6 +114,7 @@ public class PayloadSource extends PayloadBlock{
@Override @Override
public void updateTile(){ public void updateTile(){
super.updateTile();
if(payload == null){ if(payload == null){
scl = 0f; scl = 0f;
if(unit != null){ if(unit != null){

View File

@@ -36,6 +36,7 @@ public class PayloadUnloader extends PayloadLoader{
@Override @Override
public void updateTile(){ public void updateTile(){
super.updateTile();
if(shouldExport()){ if(shouldExport()){
//one-use, disposable block //one-use, disposable block
if(payload.block().instantDeconstruct){ if(payload.block().instantDeconstruct){

View File

@@ -55,6 +55,7 @@ public class PayloadVoid extends PayloadBlock{
@Override @Override
public void updateTile(){ public void updateTile(){
super.updateTile();
if(moveInPayload(false) && cons.valid()){ if(moveInPayload(false) && cons.valid()){
payload = null; payload = null;
incinerateEffect.at(this); incinerateEffect.at(this);

View File

@@ -141,7 +141,7 @@ public class ImpactReactor extends PowerGenerator{
if(warmup < 0.3f || !state.rules.reactorExplosions) return; if(warmup < 0.3f || !state.rules.reactorExplosions) return;
Sounds.explosionbig.at(tile); Sounds.explosionbig.at(this);
Damage.damage(x, y, explosionRadius * tilesize, explosionDamage * 4); Damage.damage(x, y, explosionRadius * tilesize, explosionDamage * 4);

View File

@@ -49,6 +49,7 @@ public class NuclearReactor extends PowerGenerator{
public NuclearReactor(String name){ public NuclearReactor(String name){
super(name); super(name);
updateInUnits = false;
itemCapacity = 30; itemCapacity = 30;
liquidCapacity = 30; liquidCapacity = 30;
hasItems = true; hasItems = true;
@@ -76,6 +77,7 @@ public class NuclearReactor extends PowerGenerator{
public class NuclearReactorBuild extends GeneratorBuild{ public class NuclearReactorBuild extends GeneratorBuild{
public float heat; public float heat;
public float flash;
@Override @Override
public void updateTile(){ public void updateTile(){
@@ -130,13 +132,14 @@ public class NuclearReactor extends PowerGenerator{
public void onDestroyed(){ public void onDestroyed(){
super.onDestroyed(); super.onDestroyed();
Sounds.explosionbig.at(tile); Sounds.explosionbig.at(this);
int fuel = items.get(consumes.<ConsumeItems>get(ConsumeType.item).items[0].item); int fuel = items.get(consumes.<ConsumeItems>get(ConsumeType.item).items[0].item);
if((fuel < 5 && heat < 0.5f) || !state.rules.reactorExplosions) return; if((fuel < 5 && heat < 0.5f) || !state.rules.reactorExplosions) return;
Effect.shake(6f, 16f, x, y); Effect.shake(6f, 16f, x, y);
// * ((float)fuel / itemCapacity) to scale based on fullness
Damage.damage(x, y, explosionRadius * tilesize, explosionDamage * 4); Damage.damage(x, y, explosionRadius * tilesize, explosionDamage * 4);
explodeEffect.at(x, y); explodeEffect.at(x, y);
@@ -160,10 +163,9 @@ public class NuclearReactor extends PowerGenerator{
Draw.rect(topRegion, x, y); Draw.rect(topRegion, x, y);
if(heat > flashThreshold){ if(heat > flashThreshold){
float flash = 1f + ((heat - flashThreshold) / (1f - flashThreshold)) * 5.4f; flash += (1f + ((heat - flashThreshold) / (1f - flashThreshold)) * 5.4f) * Time.delta;
flash += flash * Time.delta;
Draw.color(Color.red, Color.yellow, Mathf.absin(flash, 9f, 1f)); Draw.color(Color.red, Color.yellow, Mathf.absin(flash, 9f, 1f));
Draw.alpha(0.6f); Draw.alpha(0.3f);
Draw.rect(lightsRegion, x, y); Draw.rect(lightsRegion, x, y);
} }

View File

@@ -56,7 +56,7 @@ public class PowerDiode extends Block{
public void updateTile(){ public void updateTile(){
super.updateTile(); super.updateTile();
if(front() == null || back() == null || !back().block.hasPower || !front().block.hasPower || back().team != front().team) return; if(tile == null || front() == null || back() == null || !back().block.hasPower || !front().block.hasPower || back().team != front().team) return;
PowerGraph backGraph = back().power.graph; PowerGraph backGraph = back().power.graph;
PowerGraph frontGraph = front().power.graph; PowerGraph frontGraph = front().power.graph;

View File

@@ -280,6 +280,13 @@ public class PowerGraph{
} }
} }
public void clear(){
all.clear();
producers.clear();
consumers.clear();
batteries.clear();
}
public void reflow(Building tile){ public void reflow(Building tile){
queue.clear(); queue.clear();
queue.addLast(tile); queue.addLast(tile);

View File

@@ -444,7 +444,7 @@ public class PowerNode extends PowerBlock{
public void draw(){ public void draw(){
super.draw(); super.draw();
if(Mathf.zero(Renderer.laserOpacity)) return; if(Mathf.zero(Renderer.laserOpacity) || isPayload()) return;
Draw.z(Layer.power); Draw.z(Layer.power);
setupColor(power.graph.getSatisfaction()); setupColor(power.graph.getSatisfaction());

View File

@@ -52,6 +52,11 @@ public class AttributeCrafter extends GenericCrafter{
return baseEfficiency + Math.min(maxBoost, boostScale * attrsum) + attribute.env(); return baseEfficiency + Math.min(maxBoost, boostScale * attrsum) + attribute.env();
} }
@Override
public void pickedUp(){
attrsum = 0f;
}
@Override @Override
public void onProximityUpdate(){ public void onProximityUpdate(){
super.onProximityUpdate(); super.onProximityUpdate();

View File

@@ -243,6 +243,11 @@ public class Drill extends Block{
} }
} }
@Override
public void pickedUp(){
dominantItem = null;
}
@Override @Override
public void onProximityUpdate(){ public void onProximityUpdate(){
super.onProximityUpdate(); super.onProximityUpdate();

View File

@@ -91,6 +91,11 @@ public class Pump extends LiquidBlock{
Drawf.liquid(liquidRegion, x, y, liquids.currentAmount() / liquidCapacity, liquids.current().color); Drawf.liquid(liquidRegion, x, y, liquids.currentAmount() / liquidCapacity, liquids.current().color);
} }
@Override
public void pickedUp(){
amount = 0f;
}
@Override @Override
public void onProximityUpdate(){ public void onProximityUpdate(){
super.onProximityUpdate(); super.onProximityUpdate();

View File

@@ -95,6 +95,11 @@ public class SolidPump extends Pump{
@Override @Override
public void drawCracks(){} public void drawCracks(){}
@Override
public void pickedUp(){
boost = validTiles = 0f;
}
@Override @Override
public void draw(){ public void draw(){
Draw.rect(region, x, y); Draw.rect(region, x, y);

View File

@@ -73,7 +73,7 @@ public class ItemSource extends Block{
@Override @Override
public void buildConfiguration(Table table){ public void buildConfiguration(Table table){
ItemSelection.buildTable(table, content.items(), () -> outputItem, this::configure); ItemSelection.buildTable(ItemSource.this, table, content.items(), () -> outputItem, this::configure);
} }
@Override @Override

View File

@@ -73,7 +73,7 @@ public class LiquidSource extends Block{
@Override @Override
public void buildConfiguration(Table table){ public void buildConfiguration(Table table){
ItemSelection.buildTable(table, content.liquids(), () -> source, this::configure); ItemSelection.buildTable(LiquidSource.this, table, content.liquids(), () -> source, this::configure);
} }
@Override @Override

View File

@@ -25,6 +25,7 @@ public class StorageBlock extends Block{
flags = EnumSet.of(BlockFlag.storage); flags = EnumSet.of(BlockFlag.storage);
allowResupply = true; allowResupply = true;
envEnabled = Env.any; envEnabled = Env.any;
highUnloadPriority = true;
} }
@Override @Override

View File

@@ -3,6 +3,7 @@ package mindustry.world.blocks.storage;
import arc.graphics.*; import arc.graphics.*;
import arc.graphics.g2d.*; import arc.graphics.g2d.*;
import arc.scene.ui.layout.*; import arc.scene.ui.layout.*;
import arc.struct.*;
import arc.util.*; import arc.util.*;
import arc.util.io.*; import arc.util.io.*;
import mindustry.entities.units.*; import mindustry.entities.units.*;
@@ -54,56 +55,131 @@ public class Unloader extends Block{
public class UnloaderBuild extends Building{ public class UnloaderBuild extends Building{
public float unloadTimer = 0f; public float unloadTimer = 0f;
public Item sortItem = null; public Item sortItem = null;
public Building dumpingTo;
public int offset = 0; public int offset = 0;
public int[] rotations; public int rotations = 0;
public Seq<ContainerStat> possibleBlocks = new Seq<>();
public class ContainerStat{
Building building;
float loadFactor;
boolean canLoad;
boolean canUnload;
}
@Override @Override
public void updateTile(){ public void updateTile(){
if((unloadTimer += delta()) >= speed){ if(((unloadTimer += delta()) < speed) || (proximity.size < 2)) return;
boolean any = false; Item item = null;
if(rotations == null || rotations.length != proximity.size){ boolean any = false;
rotations = new int[proximity.size]; int itemslength = content.items().size;
//initialize possibleBlocks only if the new size is bigger than the previous, to avoid unnecessary allocations
if(possibleBlocks.size != proximity.size){
int tmp = possibleBlocks.size;
possibleBlocks.setSize(proximity.size);
for(int i = tmp; i < proximity.size; i++){
possibleBlocks.set(i, new ContainerStat());
}
}
if(sortItem != null){
item = sortItem;
for(int pos = 0; pos < proximity.size; pos++){
var other = proximity.get(pos);
boolean interactable = other.interactable(team);
//set the stats of all buildings in possibleBlocks
ContainerStat pb = possibleBlocks.get(pos);
pb.building = other;
pb.canUnload = interactable && other.canUnload() && other.items != null && other.items.has(sortItem);
pb.canLoad = interactable && !(other.block instanceof StorageBlock) && other.acceptItem(this, sortItem);
}
}else{
//select the next item for nulloaders
//inspired of nextIndex() but for all proximity at once, and also way more powerful
for(int i = 0; i < itemslength; i++){
int total = (rotations + i + 1) % itemslength;
boolean hasProvider = false;
boolean hasReceiver = false;
boolean isDistinct = false;
Item possibleItem = content.item(total);
for(int pos = 0; pos < proximity.size; pos++){
var other = proximity.get(pos);
boolean interactable = other.interactable(team);
//set the stats of all buildings in possibleBlocks while we are at it
ContainerStat pb = possibleBlocks.get(pos);
pb.building = other;
pb.canUnload = interactable && other.canUnload() && other.items != null && other.items.has(possibleItem);
pb.canLoad = interactable && !(other.block instanceof StorageBlock) && other.acceptItem(this, possibleItem);
//the part handling framerate issues and slow conveyor belts, to avoid skipping items
if(hasProvider && pb.canLoad) isDistinct = true;
if(hasReceiver && pb.canUnload) isDistinct = true;
hasProvider = hasProvider || pb.canUnload;
hasReceiver = hasReceiver || pb.canLoad;
}
if(isDistinct){
item = possibleItem;
break;
}
}
}
if(item != null){
//only compute the load factor if a transfer is possible
for(int pos = 0; pos < proximity.size; pos++){
ContainerStat pb = possibleBlocks.get(pos);
var other = pb.building;
pb.loadFactor = (other.getMaximumAccepted(item) == 0) || (other.items == null) ? 0 : other.items.get(item) / (float)other.getMaximumAccepted(item);
} }
for(int i = 0; i < proximity.size; i++){ //sort so it gives full priority to blocks that can give but not receive (stackConveyors and Storage), and then by load
int pos = (offset + i) % proximity.size; possibleBlocks.sort(Structs.comps(
var other = proximity.get(pos); Structs.comparingBool(e -> e.building.block.highUnloadPriority),
Structs.comparingFloat(e -> e.loadFactor)
));
if(other.interactable(team) && other.block.unloadable && other.canUnload() && other.block.hasItems ContainerStat dumpingFrom = null;
&& ((sortItem == null && other.items.total() > 0) || (sortItem != null && other.items.has(sortItem)))){ ContainerStat dumpingTo = null;
//make sure the item can't be dumped back into this block
dumpingTo = other;
//get item to be taken //choose the building to accept the item
Item item = sortItem == null ? other.items.takeIndex(rotations[pos]) : sortItem; for(int i = 0; i < possibleBlocks.size; i++){
if(possibleBlocks.get(i).canLoad){
//remove item if it's dumped correctly dumpingTo = possibleBlocks.get(i);
if(put(item)){ break;
other.items.remove(item, 1);
any = true;
if(sortItem == null){
rotations[pos] = item.id + 1;
}
other.itemTaken(item);
}else if(sortItem == null){
rotations[pos] = other.items.nextIndex(rotations[pos]);
}
} }
} }
if(any){ //choose the building to give the item
unloadTimer %= speed; for(int i = possibleBlocks.size - 1; i >= 0; i--){
}else{ if(possibleBlocks.get(i).canUnload){
unloadTimer = Math.min(unloadTimer, speed); dumpingFrom = possibleBlocks.get(i);
break;
}
} }
if(proximity.size > 0){ //trade the items
offset ++; if(dumpingFrom != null && dumpingTo != null && (dumpingFrom.loadFactor != dumpingTo.loadFactor || dumpingFrom.building.block.highUnloadPriority)){
offset %= proximity.size; dumpingTo.building.handleItem(this, item);
dumpingFrom.building.removeStack(item, 1);
any = true;
} }
if(sortItem == null) rotations = item.id;
}
if(any){
unloadTimer %= speed;
}else{
unloadTimer = Math.min(unloadTimer, speed);
}
if(proximity.size > 0){
offset++;
offset %= proximity.size;
} }
} }
@@ -118,7 +194,7 @@ public class Unloader extends Block{
@Override @Override
public void buildConfiguration(Table table){ public void buildConfiguration(Table table){
ItemSelection.buildTable(table, content.items(), () -> sortItem, this::configure); ItemSelection.buildTable(Unloader.this, table, content.items(), () -> sortItem, this::configure);
} }
@Override @Override
@@ -132,11 +208,6 @@ public class Unloader extends Block{
return true; return true;
} }
@Override
public boolean canDump(Building to, Item item){
return !(to.block instanceof StorageBlock) && to != dumpingTo;
}
@Override @Override
public Item config(){ public Item config(){
return sortItem; return sortItem;

View File

@@ -97,9 +97,9 @@ public class CommandCenter extends Block{
float size = 6f; float size = 6f;
Draw.color(bottomColor); Draw.color(bottomColor);
Draw.rect(commandRegions[team.data().command.ordinal()].getRegion(), tile.drawx(), tile.drawy() - 1, size, size); Draw.rect(commandRegions[team.data().command.ordinal()].getRegion(), x, y - 1, size, size);
Draw.color(topColor == null ? team.color : topColor); Draw.color(topColor == null ? team.color : topColor);
Draw.rect(commandRegions[team.data().command.ordinal()].getRegion(), tile.drawx(), tile.drawy(), size, size); Draw.rect(commandRegions[team.data().command.ordinal()].getRegion(), x, y, size, size);
Draw.color(); Draw.color();
} }

View File

@@ -231,7 +231,7 @@ public class Reconstructor extends UnitBlock{
@Override @Override
public boolean shouldConsume(){ public boolean shouldConsume(){
return constructing(); return constructing() && enabled;
} }
public UnitType unit(){ public UnitType unit(){

View File

@@ -176,7 +176,7 @@ public class RepairPoint extends Block{
multiplier = liq.valid(this) ? 1f + liquids.current().heatCapacity * coolantMultiplier : 1f; multiplier = liq.valid(this) ? 1f + liquids.current().heatCapacity * coolantMultiplier : 1f;
} }
if(target != null && (target.dead() || target.dst(tile) - target.hitSize/2f > repairRadius || target.health() >= target.maxHealth())){ if(target != null && (target.dead() || target.dst(this) - target.hitSize/2f > repairRadius || target.health() >= target.maxHealth())){
target = null; target = null;
} }

View File

@@ -160,12 +160,23 @@ public class UnitFactory extends UnitBlock{
Seq<UnitType> units = Seq.with(plans).map(u -> u.unit).filter(u -> u.unlockedNow() && !u.isBanned()); Seq<UnitType> units = Seq.with(plans).map(u -> u.unit).filter(u -> u.unlockedNow() && !u.isBanned());
if(units.any()){ if(units.any()){
ItemSelection.buildTable(table, units, () -> currentPlan == -1 ? null : plans.get(currentPlan).unit, unit -> configure(plans.indexOf(u -> u.unit == unit))); ItemSelection.buildTable(UnitFactory.this, table, units, () -> currentPlan == -1 ? null : plans.get(currentPlan).unit, unit -> configure(plans.indexOf(u -> u.unit == unit)));
}else{ }else{
table.table(Styles.black3, t -> t.add("@none").color(Color.lightGray)); table.table(Styles.black3, t -> t.add("@none").color(Color.lightGray));
} }
} }
@Override
public boolean onConfigureTileTapped(Building other){
if(this == other){
deselect();
configure(null);
return false;
}
return true;
}
@Override @Override
public boolean acceptPayload(Building source, Payload payload){ public boolean acceptPayload(Building source, Payload payload){
return false; return false;

View File

@@ -68,7 +68,8 @@ public class ConsumePower extends Consume{
* @return The amount of power which is requested per tick. * @return The amount of power which is requested per tick.
*/ */
public float requestedPower(Building entity){ public float requestedPower(Building entity){
if(entity.tile().build == null) return 0f; if(entity == null) return 0f;
if(buffered){ if(buffered){
return (1f-entity.power.status)*capacity; return (1f-entity.power.status)*capacity;
}else{ }else{

View File

@@ -16,6 +16,14 @@ public class Consumers{
public final Bits itemFilters = new Bits(Vars.content.items().size); public final Bits itemFilters = new Bits(Vars.content.items().size);
public final Bits liquidfilters = new Bits(Vars.content.liquids().size); public final Bits liquidfilters = new Bits(Vars.content.liquids().size);
public boolean consumesItem(Item item){
return itemFilters.get(item.id);
}
public boolean consumesLiquid(Liquid liq){
return liquidfilters.get(liq.id);
}
public boolean any(){ public boolean any(){
return results != null && results.length > 0; return results != null && results.length > 0;
} }

View File

@@ -6,7 +6,8 @@ import mindustry.graphics.*;
public enum BlockStatus{ public enum BlockStatus{
active(Color.valueOf("5ce677")), active(Color.valueOf("5ce677")),
noOutput(Color.orange), noOutput(Color.orange),
noInput(Pal.remove); noInput(Pal.remove),
logicDisable(Color.valueOf("8a73c6"));
public final Color color; public final Color color;

View File

@@ -14,6 +14,10 @@ public class ConsumeModule extends BlockModule{
} }
public BlockStatus status(){ public BlockStatus status(){
if(entity.enabledControlTime > 0 && !entity.enabled){
return BlockStatus.logicDisable;
}
if(!entity.shouldConsume()){ if(!entity.shouldConsume()){
return BlockStatus.noOutput; return BlockStatus.noOutput;
} }

View File

@@ -24,4 +24,4 @@ android.useAndroidX=true
#used for slow jitpack builds; TODO see if this actually works #used for slow jitpack builds; TODO see if this actually works
org.gradle.internal.http.socketTimeout=100000 org.gradle.internal.http.socketTimeout=100000
org.gradle.internal.http.connectionTimeout=100000 org.gradle.internal.http.connectionTimeout=100000
archash=6c228e534e3950e6254d6e7af4c6db67f834bc1d archash=026c9216c893c9b768748cc63b4c2b8c3739f892

Binary file not shown.

Before

Width:  |  Height:  |  Size: 706 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 905 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.0 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.6 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.8 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 632 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.1 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 725 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 598 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 204 KiB

View File

@@ -4,8 +4,8 @@
"address": ["185.104.248.61", "easyplay.su"] "address": ["185.104.248.61", "easyplay.su"]
}, },
{ {
"name": "SMokeOfAnarchy.duckdns.org", "name": "SkaarjDustry",
"address": ["smokeofanarchy.duckdns.org:6853"] "address": ["skaarjproject.duckdns.org"]
}, },
{ {
"name": "{AA}", "name": "{AA}",
@@ -117,6 +117,10 @@
}, },
{ {
"name": "MindustryBR", "name": "MindustryBR",
"address": ["mindustryptbr.ddns.net", "mindustryptbr.myddns.me", "mindustry.me:4447"] "address": ["mindustryptbr.ddns.net", "mindustryptbr.myddns.me", "n2.mindustry.me:4002", "n2.mindustry.me:4007"]
},
{
"name": "Conservatory",
"address": ["143.198.71.232"]
} }
] ]

Some files were not shown because too many files have changed in this diff Show More