Compare commits

..

109 Commits
v133 ... v134.1

Author SHA1 Message Date
Anuken
779bab0344 Merge remote-tracking branch 'origin/master' 2021-11-01 09:41:39 -04:00
Anuken
0639e3eedb Power pickup bugfixes 2021-11-01 09:41:33 -04:00
Yuri Polyakov
450f651c8f Update bundle_ru.properties (#6267)
* Update bundle_ru.properties

* Update bundle_ru.properties
2021-11-01 09:32:57 -04:00
Darkness#3729
13d16f1883 InvalidCommandHandler (#6247)
* InvalidCommandHandler

* Update NetClient.java

* Add player

* And here

* :thonk:

* And this

* Update NetClient.java
2021-11-01 09:32:22 -04:00
NgLam is SIMP
4cbc4a0bca Update Vietnamese translation for V7 (#6246) 2021-11-01 09:31:34 -04:00
VizardAlpha
99e7fcd2d2 Update bundle_fr.properties (#6241)
* Update bundle_fr.properties

After checking, there was some text missing to be translated.

* Minor modification
2021-11-01 09:31:25 -04:00
Matthew Peng
223fb8d6f5 Basic unitsorts for hjson (#6280)
* Create some basic unitSorts

* Set as defaults

* add to ContentParser
2021-10-31 21:30:35 -04:00
Anuken
e1bf1a1b92 Merge remote-tracking branch 'origin/master' 2021-10-31 13:28:05 -04:00
Anuken
5d93362741 Added support for env flags as arrays of json strings 2021-10-31 13:27:59 -04:00
buthed010203
34180a6602 AdoptOpenJDK -> Adoptium (#6275)
AdoptOpenJDK has been replaced by adoptium
2021-10-31 13:19:37 -04:00
Matthew Peng
4999c25723 Homing on healing bullets does not take collided into account (#6276) 2021-10-31 13:03:19 -04:00
Zelaux
24810ddbf5 Block classes are now responsible for flipping of blocks in schematics. (#6254) 2021-10-31 09:35:16 -04:00
Leonid Skorospelov
d16739f86a Add event PlayerConnectionConfirmed (#6274) 2021-10-31 09:31:53 -04:00
TranquillyUnpleasant
1a6d2e9dd6 fix ai (#6273) 2021-10-31 09:30:33 -04:00
Anuken
1a0bcfc745 Added unit build requirements to stats 2021-10-30 22:49:53 -04:00
Anuken
4a94d9f2b3 Remove mod count from crash 2021-10-30 22:30:00 -04:00
Anuken
312f4d8462 Only log enabled mods in crash 2021-10-30 22:24:48 -04:00
Anuken
859c2987f0 Merge remote-tracking branch 'origin/master' 2021-10-30 21:02:54 -04:00
Anuken
a3f4dc7d1d Fixed #6272 2021-10-30 21:02:45 -04:00
Leonid Skorospelov
2e036c6efe Fix MenuOptionChooseEvent not being fired from client (#6265) 2021-10-30 09:23:30 -04:00
Anuken
c0d8ce2803 Fixed #6268 2021-10-30 09:18:06 -04:00
Anuken
f1d1f935fb Fixed #6264 2021-10-29 22:36:24 -04:00
Anuken
338f7b840c Merge remote-tracking branch 'origin/master' 2021-10-29 20:16:41 -04:00
Anuken
828464a449 Why was this false 2021-10-29 20:16:37 -04:00
Rex
49f35c6977 Update servers_v6.json (#6261) 2021-10-29 11:30:20 -04:00
Rex
a0fbf5f00f Update servers_v7.json (#6260) 2021-10-29 11:30:13 -04:00
Anuken
26045904f4 Fixed #6259 2021-10-29 11:29:38 -04:00
Anuken
fc900bec58 Merge remote-tracking branch 'origin/master' 2021-10-28 22:27:26 -04:00
Anuken
850a3cfb4e Fixed #6256 2021-10-28 22:27:22 -04:00
Rex
330ed9d390 Update servers_v6.json (#6255) 2021-10-28 21:08:46 -04:00
Zelaux
95b6ac36fc Fixed wrong weapon outline height and code duplication (#6250)
* Fixed wrong weapon outline height and code duplication

* Correct formatting
2021-10-28 17:19:00 -04:00
Fernando
cd5fb71b34 Update servers_v7.json (#6252)
Update server IP
2021-10-28 14:59:17 -04:00
hortiSquash
10f2a7b59c hortiloader hotfix (#6248)
Added an offset so they cycle through all buildings having the same load
2021-10-28 10:01:05 -04:00
TranquillyUnpleasant
09f718ba3d fix rare crash when someone spawns a lot of units (#6243) 2021-10-27 21:38:32 -04:00
Anuken
324c19e425 Merge remote-tracking branch 'origin/master' 2021-10-27 15:51:50 -04:00
Anuken
be5c46beb8 Weapon layerOffset 2021-10-27 15:51:46 -04:00
Fernando
c15f82297d Update bundle_pt_BR.properties (#6127)
* Update bundle_pt_BR.properties

Add missing translations

* Update contributors

* Update bundle_pt_BR.properties

* Update bundle_pt_BR.properties

* h

* Update bundle_pt_BR.properties
2021-10-27 14:39:30 -04:00
Anuken
a441c0bdcb Added deprecated chat method for mod compat 2021-10-27 12:17:24 -04:00
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
120 changed files with 1299 additions and 430 deletions

View File

@@ -18,7 +18,7 @@ See [CONTRIBUTING](CONTRIBUTING.md).
Bleeding-edge builds are generated automatically for every commit. You can see them [here](https://github.com/Anuken/MindustryBuilds/releases). Bleeding-edge builds are generated automatically for every commit. You can see them [here](https://github.com/Anuken/MindustryBuilds/releases).
If you'd rather compile on your own, follow these instructions. If you'd rather compile on your own, follow these instructions.
First, make sure you have [JDK 16-17](https://adoptopenjdk.net/archive.html?variant=openjdk16&jvmVariant=hotspot) installed. **Other JDK versions will not work.** Open a terminal in the Mindustry directory and run the following commands: First, make sure you have [JDK 16-17](https://adoptium.net/archive.html?variant=openjdk17&jvmVariant=hotspot) installed. **Other JDK versions will not work.** Open a terminal in the Mindustry directory and run the following commands:
### Windows ### Windows

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
@@ -578,6 +583,8 @@ weather.sandstorm.name = Tempête de sable
weather.sporestorm.name = Tempête de spores weather.sporestorm.name = Tempête de spores
weather.fog.name = Brouillard weather.fog.name = Brouillard
sectorlist = Secteurs
sectorlist.attacked = {0} pris d'assaut
sectors.unexplored = [lightgray]Inexploré sectors.unexplored = [lightgray]Inexploré
sectors.resources = Ressources : sectors.resources = Ressources :
sectors.production = Production : sectors.production = Production :

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

@@ -18,10 +18,12 @@ linkfail = Falha ao abrir o link\nO Url foi copiado para a área de transferênc
screenshot = Screenshot salvo para {0} screenshot = Screenshot salvo para {0}
screenshot.invalid = Este mapa é grande demais, você pode estar potencialmente sem memória suficiente para captura de tela. screenshot.invalid = Este mapa é grande demais, você pode estar potencialmente sem memória suficiente para captura de tela.
gameover = O núcleo foi destruído. gameover = O núcleo foi destruído.
gameover.disconnect = Desconectado
gameover.pvp = O time[accent] {0}[] ganhou! gameover.pvp = O time[accent] {0}[] ganhou!
gameover.waiting = [accent]Esperando pelo próximo mapa...
highscore = [accent]Novo recorde! highscore = [accent]Novo recorde!
copied = Copiado copied = Copiado
indev.popup = [accent]v6[] está atualmente em [accent]alpha[].\n[lightgray]Isso significa:[]\n[scarlet]- A campanha está inacabada[]\n- Está faltando conteúdo\n - A maioria das [scarlet]IAs das unidades[] não funciona adequadamente\n- A maioria das unidades estão inacabadas\n- Tudo o que você ver está sujeito a mudanças ou remoção.\n\nReporte bugs ou crashes em [accent]Github[]. indev.campaign = [accent]Parabéns! Você chegou ao fim da campanha![]\n\nEsse é todo o conteudo do jogo até o momento. Viagem interplanetária será adicionada em futuras atualizações.
indev.notready = Essa parte do jogo ainda não esta pronta indev.notready = Essa parte do jogo ainda não esta pronta
load.sound = Sons load.sound = Sons
@@ -39,11 +41,19 @@ be.ignore = Ignorar
be.noupdates = Nenhuma atualização encontrada. be.noupdates = Nenhuma atualização encontrada.
be.check = Checar por atualizações be.check = Checar por atualizações
mods.browser = Mod Browser
mods.browser.selected = Mod selecionado
mods.browser.add = Instalar
mods.browser.reinstall = Reinstalar
mods.github.open = Repo
mods.browser.sortdate = Ordenar por mais recente
mods.browser.sortstars = Ordenar por estrelas
schematic = Esquema schematic = Esquema
schematic.add = Salvar esquema schematic.add = Salvar esquema
schematics = Esquemas schematics = Esquemas
schematic.replace = Um esquema com esse nome já existe. Substituí-lo? schematic.replace = Um esquema com esse nome já existe. Substituí-lo?
schematic.exists = Um esquema com esse nome já existe. Substituí-lo? schematic.exists = Um esquema com esse nome já existe.
schematic.import = Importar esquema... schematic.import = Importar esquema...
schematic.exportfile = Exportar arquivo schematic.exportfile = Exportar arquivo
schematic.importfile = Importar arquivo schematic.importfile = Importar arquivo
@@ -56,7 +66,7 @@ schematic.saved = Esquema salvo.
schematic.delete.confirm = Esse esquema será apagado. Tem certeza? schematic.delete.confirm = Esse esquema será apagado. Tem certeza?
schematic.rename = Renomear esquema schematic.rename = Renomear esquema
schematic.info = {0}x{1}, {2} blocos schematic.info = {0}x{1}, {2} blocos
schematic.disabled = [scarlet]Esquemas desativados[]\nVocê precisa de permissão para usar esquemas nesse [accent]mapa[] ou [accent]servidor. schematic.disabled = [scarlet]Esquemas desativados[]\nVocê não tem permissão para usar esquemas nesse [accent]mapa[] ou [accent]servidor.
schematic.tags = Tags: schematic.tags = Tags:
schematic.edittags = Editar Tags schematic.edittags = Editar Tags
schematic.addtag = Adicionar Tag schematic.addtag = Adicionar Tag
@@ -66,6 +76,7 @@ schematic.renametag = Renomear Tag
schematic.tagdelconfirm = Deletar essa tag completamente? schematic.tagdelconfirm = Deletar essa tag completamente?
schematic.tagexists = Essa tag já existe. schematic.tagexists = Essa tag já existe.
stats = Estatísticas
stat.wave = Hordas derrotadas:[accent] {0} stat.wave = Hordas derrotadas:[accent] {0}
stat.enemiesDestroyed = Inimigos destruídos:[accent] {0} stat.enemiesDestroyed = Inimigos destruídos:[accent] {0}
stat.built = Construções construídas:[accent] {0} stat.built = Construções construídas:[accent] {0}
@@ -73,7 +84,6 @@ stat.destroyed = Construções destruídas:[accent] {0}
stat.deconstructed = Construções desconstruídas:[accent] {0} stat.deconstructed = Construções desconstruídas:[accent] {0}
stat.delivered = Recursos lançados: stat.delivered = Recursos lançados:
stat.playtime = Tempo jogado:[accent] {0} stat.playtime = Tempo jogado:[accent] {0}
stat.rank = Classificação final: [accent]{0}
globalitems = [accent]Itens Globais globalitems = [accent]Itens Globais
map.delete = Certeza que quer deletar o mapa "[accent]{0}[]"? map.delete = Certeza que quer deletar o mapa "[accent]{0}[]"?
@@ -82,13 +92,16 @@ level.select = Seleção de fase
level.mode = Modo de jogo: level.mode = Modo de jogo:
coreattack = < O núcleo está sob ataque! > coreattack = < O núcleo está sob ataque! >
nearpoint = [[ [scarlet]SAIA DO PONTO DE SPAWN IMEDIATAMENTE[] ]\nANIQUILAÇÃO IMINENTE nearpoint = [[ [scarlet]SAIA DO PONTO DE SPAWN IMEDIATAMENTE[] ]\nANIQUILAÇÃO IMINENTE
database = Banco de dados database = Banco de dados do núcleo
database.button = Banco de dados
savegame = Salvar jogo savegame = Salvar jogo
loadgame = Carregar jogo loadgame = Carregar jogo
joingame = Entrar no jogo joingame = Entrar no jogo
customgame = Jogo customi-\nzado customgame = Jogo customi-\nzado
newgame = Novo jogo newgame = Novo jogo
none = <nenhum> none = <nenhum>
none.found = [lightgray]<nenhum encontrado>
none.inmap = [lightgray]<nenhum no mapa>
minimap = Mini-mapa minimap = Mini-mapa
position = Posição position = Posição
close = Fechar close = Fechar
@@ -109,17 +122,20 @@ committingchanges = Enviando mudanças
done = Feito done = Feito
feature.unsupported = Seu dispositivo não suporta essa função. feature.unsupported = Seu dispositivo não suporta essa função.
mods.alphainfo = Lembre-se que o sistema de mods está em alpha, e[scarlet] que eles talvez contenham erros e instabilidades[].\nReporte quaisquer problemas no Discord ou GitHub do Mindustry. mods.initfailed = [red]⚠[] A instância anterior do Mindustry falhou ao inicializar. Provavelmente causado por mods com problema.\n\nPara previnir um loop de crash, [red]todos os mods foram desativados.[]
mods = Mods mods = Mods
mods.none = [lightgray]Nenhum mod encontrado! mods.none = [lightgray]Nenhum mod encontrado!
mods.guide = Guia de mods mods.guide = Guia de mods
mods.report = Reportar um Bug mods.report = Reportar um Bug
mods.openfolder = Abrir pasta de mods mods.openfolder = Abrir pasta de mods
mods.viewcontent = Ver conteúdo
mods.reload = Recarregar mods.reload = Recarregar
mods.reloadexit = O jogo vai fechar, para poder recarregar os mods. mods.reloadexit = O jogo vai fechar, para poder recarregar os mods.
mod.installed = [[Instalado]
mod.display = [gray]Mod:[orange] {0} mod.display = [gray]Mod:[orange] {0}
mod.enabled = [lightgray]Ativado mod.enabled = [lightgray]Ativado
mod.disabled = [scarlet]Desativado mod.disabled = [scarlet]Desativado
mod.multiplayer.compatible = [gray]Compatível com multiplayer
mod.disable = Desati-\nvar mod.disable = Desati-\nvar
mod.content = Conteúdo: mod.content = Conteúdo:
mod.delete.error = Incapaz de deletar o mod. O arquivo talvez esteja em uso. mod.delete.error = Incapaz de deletar o mod. O arquivo talvez esteja em uso.
@@ -152,8 +168,13 @@ planetmap = Mapa do Planeta
launchcore = Lançar núcleo launchcore = Lançar núcleo
filename = Nome do arquivo: filename = Nome do arquivo:
unlocked = Novo bloco desbloqueado! unlocked = Novo bloco desbloqueado!
available = Nova pesquisa disponível!
unlock.incampaign = < Desbloqueie na campanha para mais detalhes >
completed = [accent]Completado completed = [accent]Completado
techtree = Árvore Tecnológica techtree = Árvore Tecnológica
research.legacy = dados de pesquisa da versão [accent]5.0[] encontrados.\nVocê quer [accent]carregar esses dados[], ou [accent]descartar eles[] e recomeçar as pesquisas da nova campanha (recomendado)?
research.load = Carregar
research.discard = Descartar
research.list = [lightgray]Pesquise: research.list = [lightgray]Pesquise:
research = Pesquisar research = Pesquisar
researched = [lightgray]{0} Pesquisado. researched = [lightgray]{0} Pesquisado.
@@ -188,22 +209,30 @@ hostserver.mobile = Hospedar\nJogo
host = Hospedar host = Hospedar
hosting = [accent]Abrindo servidor... hosting = [accent]Abrindo servidor...
hosts.refresh = Recarregar hosts.refresh = Recarregar
hosts.discovering = Descobrindo jogos em lan hosts.discovering = Descobrindo jogos em LAN
hosts.discovering.any = Descobrindo jogos hosts.discovering.any = Descobrindo jogos
server.refreshing = Atualizando servidor server.refreshing = Atualizando servidor
hosts.none = [lightgray]Nenhum jogo LAN encontrado! hosts.none = [lightgray]Nenhum jogo LAN encontrado!
host.invalid = [scarlet]Não foi possivel hospedar host.invalid = [scarlet]Não foi possivel hospedar
servers.local = Servidores locais servers.local = Servidores locais
servers.local.steam = Jogos públicos e servidores locais
servers.remote = Servidores remotos servers.remote = Servidores remotos
servers.global = Servidores da comunidade servers.global = Servidores da comunidade
servers.disclaimer = Servidores da comunidade [accent]não[] controlados pelo desenvolvedor.\n\nOs servidores podem conter conteúdo não apropriado para todas as idades.
servers.showhidden = Mostrar servidores escondidos
server.shown = Mostrar
server.hidden = Esconder
trace = Rastrear jogador trace = Rastrear jogador
trace.playername = Nome do jogador: [accent]{0} trace.playername = Nome do jogador: [accent]{0}
trace.ip = IP: [accent]{0} trace.ip = IP: [accent]{0}
trace.id = ID unico: [accent]{0} trace.id = ID: [accent]{0}
trace.mobile = Cliente móvel: [accent]{0} trace.mobile = Cliente móvel: [accent]{0}
trace.modclient = Cliente customizado: [accent]{0} trace.modclient = Cliente customizado: [accent]{0}
trace.times.joined = Vezes que entrou: [accent]{0}
trace.times.kicked = Vezes que foi expulso: [accent]{0}
invalidid = ID do cliente invalido! Reporte o bug invalidid = ID do cliente invalido! Reporte o bug
server.bans = Banidos server.bans = Banidos
server.bans.none = Nenhum jogador banido encontrado! server.bans.none = Nenhum jogador banido encontrado!
@@ -216,29 +245,30 @@ server.outdated = [crimson]Servidor desatualizado![]
server.outdated.client = [crimson]Cliente desatualizado![] server.outdated.client = [crimson]Cliente desatualizado![]
server.version = [lightgray]Versão: {0} server.version = [lightgray]Versão: {0}
server.custombuild = [accent]Versão customizada server.custombuild = [accent]Versão customizada
confirmban = Certeza que quer banir este jogador? confirmban = Certeza que quer banir "{0}[white]"?
confirmkick = Certeza que quer expulsar o jogador? confirmkick = Certeza que quer expulsar "{0}[white]"?
confirmvotekick = Você tem certeza de que quer votar para expulsar este jogador? confirmvotekick = Você tem certeza de que quer votar para expulsar "{0}[white]"?
confirmunban = Certeza que quer desbanir este jogador? confirmunban = Certeza que quer desbanir este jogador?
confirmadmin = Certeza que quer fazer este jogador um administrador? confirmadmin = Certeza que quer fazer "{0}[white]" um administrador?
confirmunadmin = Certeza que quer remover o status de adminstrador deste jogador? confirmunadmin = Certeza que quer remover o status de adminstrador do "{0}[white]"?
joingame.title = Entrar no jogo joingame.title = Entrar no jogo
joingame.ip = IP: joingame.ip = IP:
disconnect = Desconectado. disconnect = Desconectado.
disconnect.error = Erro de conexão. disconnect.error = Erro de conexão.
disconnect.closed = Conexão fechada. disconnect.closed = Conexão fechada.
disconnect.timeout = Tempo esgotado. disconnect.timeout = Tempo esgotado.
disconnect.data = Falha ao abrir os dados do mundo! disconnect.data = Falha ao carregar os dados do mundo!
cantconnect = Impossível conectar ([accent]{0}[]). cantconnect = Impossível conectar ([accent]{0}[]).
connecting = [accent]Conectando... connecting = [accent]Conectando...
reconnecting = [accent]Reconectando...
connecting.data = [accent]Carregando dados do mundo... connecting.data = [accent]Carregando dados do mundo...
server.port = Port: server.port = Porta:
server.addressinuse = Senha em uso! server.addressinuse = Porta em uso!
server.invalidport = Numero de port inválido! server.invalidport = Numero de port inválido!
server.error = [crimson]Erro ao hospedar o servidor: [accent]{0} server.error = [crimson]Erro ao hospedar o servidor: [accent]{0}
save.new = Novo save save.new = Novo save
save.overwrite = Você tem certeza que quer sobrescrever este save? save.overwrite = Você tem certeza que quer sobrescrever este save?
overwrite = sobrescrever overwrite = Sobrescrever
save.none = Nenhum save encontrado! save.none = Nenhum save encontrado!
savefail = Falha ao salvar jogo! savefail = Falha ao salvar jogo!
save.delete.confirm = Certeza que quer deletar este save? save.delete.confirm = Certeza que quer deletar este save?
@@ -252,12 +282,13 @@ save.newslot = Nome do save:
save.rename = Renomear save.rename = Renomear
save.rename.text = Novo jogo: save.rename.text = Novo jogo:
selectslot = Selecione um lugar para salvar. selectslot = Selecione um lugar para salvar.
slot = [accent]Conexões {0} slot = [accent]Slot {0}
editmessage = Editar mensagem editmessage = Editar mensagem
save.corrupted = [accent]Save corrompido ou inválido! save.corrupted = [accent]Save corrompido ou inválido!
empty = <vazio> empty = <vazio>
on = Ligado on = Ligado
off = Desligado off = Desligado
save.search = Procurando jogos salvos...
save.autosave = Salvar automaticamente: {0} save.autosave = Salvar automaticamente: {0}
save.map = Mapa: {0} save.map = Mapa: {0}
save.wave = Horda {0} save.wave = Horda {0}
@@ -276,6 +307,7 @@ cancel = Cancelar
openlink = Abrir Link openlink = Abrir Link
copylink = Copiar link copylink = Copiar link
back = Voltar back = Voltar
max = Máximo
crash.export = Exportar Históricos de Crashes. crash.export = Exportar Históricos de Crashes.
crash.none = Nenhum Histórico de Crashes Encontrado. crash.none = Nenhum Histórico de Crashes Encontrado.
crash.exported = Históricos de Crashes Exportado. crash.exported = Históricos de Crashes Exportado.
@@ -286,25 +318,28 @@ data.exported = Dados exportados.
data.invalid = Estes dados de jogo não são válidos. data.invalid = Estes dados de jogo não são válidos.
data.import.confirm = Importar dados externos irá deletar[scarlet] todos[] os seus dados atuais.\n[accent]Isso não pode ser desfeito![]\n\nQuando seus dados serão importados, seu jogo irá sair imediatamente. data.import.confirm = Importar dados externos irá deletar[scarlet] todos[] os seus dados atuais.\n[accent]Isso não pode ser desfeito![]\n\nQuando seus dados serão importados, seu jogo irá sair imediatamente.
quit.confirm = Você tem certeza que quer sair? quit.confirm = Você tem certeza que quer sair?
quit.confirm.tutorial = Você tem certeza que você sabe o que você esta fazendo?\nO tutorial pode ser refeito nas [accent] Configurações->Jogo->Refazer Tutorial.[]
loading = [accent]Carregando... loading = [accent]Carregando...
reloading = [accent]Recarregando mods... reloading = [accent]Recarregando...
saving = [accent]Salvando... saving = [accent]Salvando...
respawn = [accent][[{0}][] para nascer no núcleo respawn = [accent][[{0}][] para nascer no núcleo
cancelbuilding = [accent][[{0}][] para cancelar a construção cancelbuilding = [accent][[{0}][] para cancelar a construção
selectschematic = [accent][[{0}][] para selecionar + copiar selectschematic = [accent][[{0}][] para selecionar + copiar
pausebuilding = [accent][[{0}][] para parar a construção pausebuilding = [accent][[{0}][] para parar a construção
resumebuilding = [scarlet][[{0}][] para continuar a construção resumebuilding = [scarlet][[{0}][] para continuar a construção
enablebuilding = [scarlet][[{0}][] para habilitar construção
showui = Interface escondida.\nPressione [accent][[{0}][] para mostrar a interface.
wave = [accent]Horda {0} wave = [accent]Horda {0}
wave.cap = [accent]Horda {0}/{1} wave.cap = [accent]Horda {0}/{1}
wave.waiting = Proxima horda em {0} wave.waiting = Proxima horda em {0}
wave.waveInProgress = [lightgray]Horda em progresso wave.waveInProgress = [lightgray]Horda em progresso
waiting = Aguardando... waiting = Esperando...
waiting.players = Esperando por jogadores... waiting.players = Esperando por jogadores...
wave.enemies = [lightgray]{0} inimigos restantes wave.enemies = [lightgray]{0} inimigos restantes
wave.enemy = [lightgray]{0} inimigo restante wave.enemy = [lightgray]{0} inimigo restante
wave.guardianwarn = Guardião se aproximando em [accent]{0}[] Hordas. wave.enemycores = [accent]{0}[lightgray] núcleos inimigos
wave.guardianwarn.one = Guardião se aproximando em [accent]{0}[] Horda. wave.enemycore = [accent]{0}[lightgray] núcleo inimigo
wave.guardianwarn = Guardião se aproximando em [accent]{0}[] hordas.
wave.guardianwarn.one = Guardião se aproximando em [accent]{0}[] horda.
loadimage = Carregar\nimagem loadimage = Carregar\nimagem
saveimage = Salvar\nimagem saveimage = Salvar\nimagem
unknown = Desconhecido unknown = Desconhecido
@@ -329,6 +364,7 @@ publish.confirm = Você tem certeza de que quer publicar isso?\n\n[lightgray]Pri
publish.error = Erro publicando o item: {0} publish.error = Erro publicando o item: {0}
steam.error = Falha em iniciar os serviços da Steam.\nErro: {0} steam.error = Falha em iniciar os serviços da Steam.\nErro: {0}
editor.cliffs = Paredes para Penhascos
editor.brush = Pincel editor.brush = Pincel
editor.openin = Abrir no editor editor.openin = Abrir no editor
editor.oregen = Geração de minério editor.oregen = Geração de minério
@@ -344,15 +380,22 @@ editor.ingame = Editar em jogo
editor.publish.workshop = Publicar na oficina editor.publish.workshop = Publicar na oficina
editor.newmap = Novo mapa editor.newmap = Novo mapa
editor.center = Centro editor.center = Centro
editor.search = Procurar mapas...
editor.filters = Filtrar mapas
editor.filters.mode = Modos de jogo:
editor.filters.type = Tipo:
editor.filters.search = Procurar em:
editor.filters.author = Autor
editor.filters.description = Descrição
workshop = Oficina workshop = Oficina
waves.title = Hordas waves.title = Hordas
waves.remove = Remover waves.remove = Remover
waves.never = <nunca>
waves.every = a cada waves.every = a cada
waves.waves = Horda(s) waves.waves = Horda(s)
waves.perspawn = por spawn waves.perspawn = por spawn
waves.shields = Escudo/Horda waves.shields = Escudo/Horda
waves.to = para waves.to = para
waves.max = quantidade máxima
waves.guardian = Guardião waves.guardian = Guardião
waves.preview = Pré-visualizar waves.preview = Pré-visualizar
waves.edit = Editar... waves.edit = Editar...
@@ -361,7 +404,15 @@ waves.load = Carregar da área de transferência
waves.invalid = Hordas inválidas na área de transferência. waves.invalid = Hordas inválidas na área de transferência.
waves.copied = Hordas copiadas. waves.copied = Hordas copiadas.
waves.none = Sem hordas definidas.\nNote que layouts vazios de hordas serão automaticamente substituídos pelo layout padrão. waves.none = Sem hordas definidas.\nNote que layouts vazios de hordas serão automaticamente substituídos pelo layout padrão.
waves.sort = Ordenar por
waves.sort.reverse = Inverter ordem
waves.sort.begin = Começar
waves.sort.health = Vida
waves.sort.type = Tipo
waves.units.hide = Esconder tudo
waves.units.show = Mostrar tudo
# esses são intencionalmente em letras minúsculas
wavemode.counts = quantidade wavemode.counts = quantidade
wavemode.totals = total wavemode.totals = total
wavemode.health = vida wavemode.health = vida
@@ -369,6 +420,7 @@ wavemode.health = vida
editor.default = [lightgray]<padrão> editor.default = [lightgray]<padrão>
details = Detalhes... details = Detalhes...
edit = Editar... edit = Editar...
variables = Variáveis
editor.name = Nome: editor.name = Nome:
editor.spawn = Criar unidade editor.spawn = Criar unidade
editor.removeunit = Remover unidade editor.removeunit = Remover unidade

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 = Удалить
@@ -386,6 +391,11 @@ waves.every = каждый
waves.waves = волна(ы) waves.waves = волна(ы)
waves.perspawn = за появление waves.perspawn = за появление
waves.shields = ед. щита/волну waves.shields = ед. щита/волну
waves.sort = Сортировать по
waves.sort.reverse = Обратная сортировка
waves.sort.begin = Начало
waves.sort.health = Здоровье
waves.sort.type = Тип
waves.to = до waves.to = до
waves.max = максимум единиц waves.max = максимум единиц
waves.guardian = Страж waves.guardian = Страж
@@ -890,6 +900,7 @@ setting.seconds = {0} секунд
setting.milliseconds = {0} миллисекунд setting.milliseconds = {0} миллисекунд
setting.fullscreen.name = Полноэкранный режим setting.fullscreen.name = Полноэкранный режим
setting.borderlesswindow.name = Безрамочное окно setting.borderlesswindow.name = Безрамочное окно
setting.borderlesswindow.description = Для вступления изменений в силу может потребоваться перезагрузка игры.
setting.fps.name = Показывать FPS и пинг setting.fps.name = Показывать FPS и пинг
setting.smoothcamera.name = Плавная камера setting.smoothcamera.name = Плавная камера
setting.vsync.name = Вертикальная синхронизация setting.vsync.name = Вертикальная синхронизация
@@ -1508,7 +1519,7 @@ block.liquid-router.description = Принимает жидкости из од
block.liquid-tank.description = Хранит большое количество жидкости. Выводит жидкости во все стороны, подобно жидкостному маршрутизатору. block.liquid-tank.description = Хранит большое количество жидкости. Выводит жидкости во все стороны, подобно жидкостному маршрутизатору.
block.liquid-junction.description = Действует как мост для двух пересекающихся трубопроводов. block.liquid-junction.description = Действует как мост для двух пересекающихся трубопроводов.
block.bridge-conduit.description = Перемещает жидкости над любой местностью или зданиями. block.bridge-conduit.description = Перемещает жидкости над любой местностью или зданиями.
block.liquid-container.description = Хранит большое количество жидкости. Выводит их во все стороны, как жидкостный маршрутизатор. block.liquid-container.description = Хранит небольшое количество жидкости. Выводит жидкости во все стороны, подобно жидкостному маршрутизатору.
block.phase-conduit.description = Перемещает жидкости над любой местностью или зданиями. Большая дистанция, чем у жидкостного моста, но требует энергию. block.phase-conduit.description = Перемещает жидкости над любой местностью или зданиями. Большая дистанция, чем у жидкостного моста, но требует энергию.
block.power-node.description = Передает питание на подключенные узлы. Узел будет получать питание или поставлять питание на любые соседние блоки. block.power-node.description = Передает питание на подключенные узлы. Узел будет получать питание или поставлять питание на любые соседние блоки.
block.power-node-large.description = Усовершенствованный силовой узел с большей дальностью. block.power-node-large.description = Усовершенствованный силовой узел с большей дальностью.

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

@@ -78,13 +78,12 @@ schematic.tagexists = Thẻ đã tồn tại.
stats = Thống kê stats = Thống kê
stat.wave = Đợt đã vượt qua:[accent] {0} stat.wave = Đợt đã vượt qua:[accent] {0}
stat.unitsCreated = Quân lính đã tạo:[accent] {0}
stat.enemiesDestroyed = Kẻ thù bị tiêu diệt:[accent] {0} stat.enemiesDestroyed = Kẻ thù bị tiêu diệt:[accent] {0}
stat.built = Số công trình đã xây dựng:[accent] {0} stat.built = Số công trình đã xây dựng:[accent] {0}
stat.destroyed = Số công trình đã bị phá:[accent] {0} stat.destroyed = Số công trình đã bị phá:[accent] {0}
stat.deconstructed = Số công trình được xây dựng lại:[accent] {0} stat.deconstructed = Số công trình được xây dựng lại:[accent] {0}
stat.delivered = Lượng tài nguyên được phóng:
stat.playtime = Thời gian chơi:[accent] {0} stat.playtime = Thời gian chơi:[accent] {0}
stat.rank = Xếp hạng: [accent]{0}
globalitems = [accent]Toàn bộ vật phẩm globalitems = [accent]Toàn bộ vật phẩm
map.delete = Bạn có chắc chắn muốn xóa bản đồ "[accent]{0}[]"? map.delete = Bạn có chắc chắn muốn xóa bản đồ "[accent]{0}[]"?
@@ -94,6 +93,7 @@ level.mode = Chế độ:
coreattack = < Căn cứ đang bị tấn công! > coreattack = < Căn cứ đang bị tấn công! >
nearpoint = [[ [scarlet]RỜI KHỎI KHU VỰC ĐÁP NGAY LẬP TỨC[] ]\nsự hủy diệt sắp xảy ra nearpoint = [[ [scarlet]RỜI KHỎI KHU VỰC ĐÁP NGAY LẬP TỨC[] ]\nsự hủy diệt sắp xảy ra
database = Cơ sở dữ liệu database = Cơ sở dữ liệu
database.button = Cơ sở dữ liệu
savegame = Lưu trò chơi savegame = Lưu trò chơi
loadgame = Tải lại màn chơi loadgame = Tải lại màn chơi
joingame = Tham gia trò chơi joingame = Tham gia trò chơi
@@ -101,6 +101,7 @@ customgame = Tùy chỉnh
newgame = Trò chơi mới newgame = Trò chơi mới
none = <trống> none = <trống>
none.found = [lightgray]<không tìm thấy> none.found = [lightgray]<không tìm thấy>
none.inmap = [lightgray]<không có trong bản đồ>
minimap = Bản đồ nhỏ minimap = Bản đồ nhỏ
position = Vị trí position = Vị trí
close = Đóng close = Đóng
@@ -168,6 +169,7 @@ launchcore = Phóng căn cứ
filename = Tên tệp: filename = Tên tệp:
unlocked = Đã mở khóa nội dung mới! unlocked = Đã mở khóa nội dung mới!
available = Đã có mục nghiên cứu mới! available = Đã có mục nghiên cứu mới!
unlock.incampaign = < Mở khóa trong chiến dịch để biết chi tiết >
completed = [accent]Hoàn tất completed = [accent]Hoàn tất
techtree = Tiến trình techtree = Tiến trình
research.legacy = Dữ liệu nghiên cứu từ phiên bản[accent]5.0[] được tìm thấy.\nBạn có muốn [accent]tải dữ liệu này[], hoặc [accent]bỏ qua[] và bắt đầu nghiên cứu lại trong chiến dịch mới (khuyến nghị)? research.legacy = Dữ liệu nghiên cứu từ phiên bản[accent]5.0[] được tìm thấy.\nBạn có muốn [accent]tải dữ liệu này[], hoặc [accent]bỏ qua[] và bắt đầu nghiên cứu lại trong chiến dịch mới (khuyến nghị)?
@@ -214,6 +216,7 @@ hosts.none = [lightgray]Không có máy chủ cục bộ nào được tìm th
host.invalid = [scarlet]Không thể kết nối đến máy chủ. host.invalid = [scarlet]Không thể kết nối đến máy chủ.
servers.local = Máy chủ cục bộ servers.local = Máy chủ cục bộ
servers.local.steam = Màn chơi hiện có & Máy chủ cục bộ
servers.remote = Máy chủ tùy chỉnh servers.remote = Máy chủ tùy chỉnh
servers.global = Máy chủ từ cộng đồng servers.global = Máy chủ từ cộng đồng
@@ -285,6 +288,7 @@ save.corrupted = Tệp bản lưu bị hỏng hoặc không hợp lệ!
empty = <trống> empty = <trống>
on = Bật on = Bật
off = Tắt off = Tắt
save.search = Tìm kiếm màn chơi đã lưu...
save.autosave = Tự động lưu: {0} save.autosave = Tự động lưu: {0}
save.map = Bản đồ: {0} save.map = Bản đồ: {0}
save.wave = Đợt {0} save.wave = Đợt {0}
@@ -315,7 +319,7 @@ data.invalid = Đây không phải dữ liệu trò chơi hợp lệ.
data.import.confirm = Nhập dữ liệu bên ngoài sẽ ghi đè[scarlet] tất cả[] dữ liệu trò chơi hiện tại.\n[accent]Điều này không thể hoàn tác![]\n\nSau khi dữ liệu được nhập, trò chơi của bạn sẽ thoát ngay lập tức. data.import.confirm = Nhập dữ liệu bên ngoài sẽ ghi đè[scarlet] tất cả[] dữ liệu trò chơi hiện tại.\n[accent]Điều này không thể hoàn tác![]\n\nSau khi dữ liệu được nhập, trò chơi của bạn sẽ thoát ngay lập tức.
quit.confirm = Bạn có chắc muốn thoát? quit.confirm = Bạn có chắc muốn thoát?
loading = [accent]Đang tải... loading = [accent]Đang tải...
reloading = [accent]Đang tải lại Mods... downloading = [accent]Đang tải xuống...
saving = [accent]Đang lưu... saving = [accent]Đang lưu...
respawn = [accent][[{0}][] để hồi sinh tại căn cứ respawn = [accent][[{0}][] để hồi sinh tại căn cứ
cancelbuilding = [accent][[{0}][] để hủy xây cancelbuilding = [accent][[{0}][] để hủy xây
@@ -360,6 +364,7 @@ publish.confirm = Bạn có chắc chắn muốn xuất bản không?\n\n[lightg
publish.error = Lỗi khi xuất bản: {0} publish.error = Lỗi khi xuất bản: {0}
steam.error = Không thể khởi chạy dịch vụ Steam.\nLỗi: {0} steam.error = Không thể khởi chạy dịch vụ Steam.\nLỗi: {0}
editor.cliffs = Chuyển tường thành vách đá
editor.brush = Kích thước editor.brush = Kích thước
editor.openin = Mở trong trình chỉnh sửa editor.openin = Mở trong trình chỉnh sửa
editor.oregen = Cấu trúc quặng editor.oregen = Cấu trúc quặng
@@ -375,6 +380,13 @@ editor.ingame = Chỉnh sửa trong trò chơi
editor.publish.workshop = Xuất bản lên Workshop editor.publish.workshop = Xuất bản lên Workshop
editor.newmap = Bản đồ mới editor.newmap = Bản đồ mới
editor.center = Trung tâm editor.center = Trung tâm
editor.search = Tìm kiếm bản đồ...
editor.filters = Lọc bản đồ
editor.filters.mode = Chế độ:
editor.filters.type = Kiểu bản đồ:
editor.filters.search = Tìm kiếm trongtrong:
editor.filters.author = Tác giả
editor.filters.description = Miêu tả
workshop = Workshop workshop = Workshop
waves.title = Đợt waves.title = Đợt
waves.remove = Xóa waves.remove = Xóa
@@ -383,6 +395,7 @@ waves.waves = đợt
waves.perspawn = mỗi lần xuất hiện waves.perspawn = mỗi lần xuất hiện
waves.shields = khiên/đợt waves.shields = khiên/đợt
waves.to = đến waves.to = đến
waves.max = Số lượng quân lính tối đa
waves.guardian = Boss waves.guardian = Boss
waves.preview = Xem trước waves.preview = Xem trước
waves.edit = Chỉnh sửa... waves.edit = Chỉnh sửa...
@@ -391,6 +404,13 @@ waves.load = Lấy từ bộ nhớ tạm
waves.invalid = Lượt không hợp lệ trong bộ nhớ tạm. waves.invalid = Lượt không hợp lệ trong bộ nhớ tạm.
waves.copied = Đã sao chép lượt. waves.copied = Đã sao chép lượt.
waves.none = Không có kẻ thù được xác định.\nLưu ý rằng bố cục mỗi đợt trống sẽ tự động được thay thế bằng bố cục mặc định. waves.none = Không có kẻ thù được xác định.\nLưu ý rằng bố cục mỗi đợt trống sẽ tự động được thay thế bằng bố cục mặc định.
waves.sort = Sắp xếp theo
waves.sort.reverse = Đảo ngược sắp xếp
waves.sort.begin = Bắt đầu
waves.sort.health = Máu
waves.sort.type = Thể loại
waves.units.hide = Ẩn tất cả
waves.units.show = Hiện tất cả
#these are intentionally in lower case #these are intentionally in lower case
wavemode.counts = số lượng wavemode.counts = số lượng
@@ -400,6 +420,7 @@ wavemode.health = máu
editor.default = [lightgray]<Mặc định> editor.default = [lightgray]<Mặc định>
details = Chi tiết... details = Chi tiết...
edit = Chỉnh sửa... edit = Chỉnh sửa...
variables = Thông số
editor.name = Tên: editor.name = Tên:
editor.spawn = Thêm kẻ địch editor.spawn = Thêm kẻ địch
editor.removeunit = Xóa kẻ địch editor.removeunit = Xóa kẻ địch
@@ -537,6 +558,7 @@ configure = Tùy chỉnh vật phẩm
loadout = Vật phẩm loadout = Vật phẩm
resources = Tài nguyên resources = Tài nguyên
bannedblocks = Khối bị cấm bannedblocks = Khối bị cấm
bannedunits = Quân lính bị cấm
addall = Thêm tất cả addall = Thêm tất cả
launch.from = Đang phóng từ: [accent]{0} launch.from = Đang phóng từ: [accent]{0}
launch.destination = Đích đến: {0} launch.destination = Đích đến: {0}
@@ -561,10 +583,13 @@ weather.sandstorm.name = Bão cát
weather.sporestorm.name = Bão bào tử weather.sporestorm.name = Bão bào tử
weather.fog.name = Sương mù weather.fog.name = Sương mù
sectorlist = Khu vực
sectorlist.attacked = {0} đang bị tấn công
sectors.unexplored = [lightgray]Chưa được khám phá sectors.unexplored = [lightgray]Chưa được khám phá
sectors.resources = Tài nguyên: sectors.resources = Tài nguyên:
sectors.production = Sản lượng: sectors.production = Sản lượng:
sectors.export = Xuất: sectors.export = Xuất:
sectors.import = Nhập:
sectors.time = Thời gian: sectors.time = Thời gian:
sectors.threat = Mối đe dọa: sectors.threat = Mối đe dọa:
sectors.wave = Đợt: sectors.wave = Đợt:
@@ -632,6 +657,8 @@ sector.windsweptIslands.description = Xa hơn đường bờ biển là chuỗi
sector.extractionOutpost.description = Một tiền đồn xa, được kẻ thù xây dựng với mục đích phóng nguồn lực sang các khu vực khác.\n\nCông nghệ vận tải xuyên ngành là điều cần thiết để chinh phục hơn nữa. Phá hủy căn cứ. Nghiên cứu bệ phóng của họ. sector.extractionOutpost.description = Một tiền đồn xa, được kẻ thù xây dựng với mục đích phóng nguồn lực sang các khu vực khác.\n\nCông nghệ vận tải xuyên ngành là điều cần thiết để chinh phục hơn nữa. Phá hủy căn cứ. Nghiên cứu bệ phóng của họ.
sector.impact0078.description = Đây là tàn tích của tàu vận chuyển giữa các vì sao lần đầu tiên đi vào hệ thống này.\n\nLấy càng nhiều càng tốt từ đống đổ nát. Nghiên cứu bất kỳ công nghệ nguyên vẹn nào. sector.impact0078.description = Đây là tàn tích của tàu vận chuyển giữa các vì sao lần đầu tiên đi vào hệ thống này.\n\nLấy càng nhiều càng tốt từ đống đổ nát. Nghiên cứu bất kỳ công nghệ nguyên vẹn nào.
sector.planetaryTerminal.description = Mục tiêu cuối cùng.\n\nCăn cứ ven biển này chứa một cấu trúc có khả năng phóng căn cứ tới các hành tinh địa phương. Nó được bảo vệ cực kỳ cẩn thận.\n\nSản xuất quân lính hải quân. Loại bỏ kẻ thù càng nhanh càng tốt. Nghiên cứu cấu trúc phóng. sector.planetaryTerminal.description = Mục tiêu cuối cùng.\n\nCăn cứ ven biển này chứa một cấu trúc có khả năng phóng căn cứ tới các hành tinh địa phương. Nó được bảo vệ cực kỳ cẩn thận.\n\nSản xuất quân lính hải quân. Loại bỏ kẻ thù càng nhanh càng tốt. Nghiên cứu cấu trúc phóng.
sector.coastline.name = Coastline
sector.navalFortress.name = Naval Fortress
status.burning.name = Cháy status.burning.name = Cháy
status.freezing.name = Đóng băng status.freezing.name = Đóng băng
@@ -643,9 +670,11 @@ status.electrified.name = Electrified
status.spore-slowed.name = Spore Slowed status.spore-slowed.name = Spore Slowed
status.tarred.name = Tarred status.tarred.name = Tarred
status.overclock.name = Overclock status.overclock.name = Overclock
status.overdrive.name = Overdrive
status.shocked.name = Shock status.shocked.name = Shock
status.blasted.name = Nổ status.blasted.name = Nổ
status.unmoving.name = Bất động status.unmoving.name = Bất động
status.boss.name = Guardian
settings.language = Ngôn ngữ settings.language = Ngôn ngữ
settings.data = Dữ liệu trò chơi settings.data = Dữ liệu trò chơi
@@ -794,7 +823,7 @@ bullet.splashdamage = [stat]{0}[lightgray] sát thương diện rộng ~[stat] {
bullet.incendiary = [stat]cháy bullet.incendiary = [stat]cháy
bullet.homing = [stat]truy đuổi bullet.homing = [stat]truy đuổi
bullet.buildingdamage = [stat]{0}%[lightgray] sát thương khối bullet.buildingdamage = [stat]{0}%[lightgray] sát thương khối
bullet.frag = [stat]phá mảnh bullet.frags = [stat]phá mảnh
bullet.lightning = [stat]{0}[lightgray]x tia chớp ~ [stat]{1}[lightgray] sát thương bullet.lightning = [stat]{0}[lightgray]x tia chớp ~ [stat]{1}[lightgray] sát thương
bullet.knockback = [stat]{0}[lightgray] bật lùi bullet.knockback = [stat]{0}[lightgray] bật lùi
bullet.pierce = [stat]{0}[lightgray]x xuyên giáp bullet.pierce = [stat]{0}[lightgray]x xuyên giáp
@@ -806,6 +835,7 @@ bullet.reload = [stat]{0}[lightgray]x tốc độ bắn
unit.blocks = Khối unit.blocks = Khối
unit.blockssquared = Khối² unit.blockssquared = Khối²
unit.powersecond = đơn vị năng lượng/giây unit.powersecond = đơn vị năng lượng/giây
unit.tilessecond = ô/giây
unit.liquidsecond = đơn vị chất lỏng/giây unit.liquidsecond = đơn vị chất lỏng/giây
unit.itemssecond = vật phẩm/giây unit.itemssecond = vật phẩm/giây
unit.liquidunits = đơn vị chất lỏng unit.liquidunits = đơn vị chất lỏng
@@ -831,20 +861,19 @@ category.items = Vật phẩm
category.crafting = Vào/Sản phẩm category.crafting = Vào/Sản phẩm
category.function = Chức năng category.function = Chức năng
category.optional = Cải tiến category.optional = Cải tiến
setting.skipcoreanimation.name = Bỏ qua hiệu ứng phóng/đáp căn cứcứ
setting.landscape.name = Khóa ngang setting.landscape.name = Khóa ngang
setting.shadows.name = Bóng đổ setting.shadows.name = Bóng đổ
setting.blockreplace.name = Tự động đề xuất khối setting.blockreplace.name = Tự động đề xuất khối
setting.linear.name = Lọc tuyến tính setting.linear.name = Lọc tuyến tính
setting.hints.name = Gợi ý setting.hints.name = Gợi ý
setting.logichints.name = Gợi ý Logic setting.logichints.name = Gợi ý Logic
setting.flow.name = Hiện thị tốc độ chuyền tài nguyên
setting.backgroundpause.name = Tạm dừng trong nền setting.backgroundpause.name = Tạm dừng trong nền
setting.buildautopause.name = Tự động dừng xây dựng setting.buildautopause.name = Tự động dừng xây dựng
setting.doubletapmine.name = Nhấn đúp để Đào setting.doubletapmine.name = Nhấn đúp để Đào
setting.modcrashdisable.name = Tắt các mod khi gặp sự cố trong khởi động setting.modcrashdisable.name = Tắt các mod khi gặp sự cố trong khởi động
setting.animatedwater.name = Hiệu ứng nước setting.animatedwater.name = Hiệu ứng nước
setting.animatedshields.name = Hiệu ứng khiên setting.animatedshields.name = Hiệu ứng khiên
setting.antialias.name = Khử răng cưa[lightgray] (yêu cầu khởi động lại)[]
setting.playerindicators.name = Hướng người chơi setting.playerindicators.name = Hướng người chơi
setting.indicators.name = Hướng kẻ địch setting.indicators.name = Hướng kẻ địch
setting.autotarget.name = Tự động nhắm mục tiêu setting.autotarget.name = Tự động nhắm mục tiêu
@@ -853,7 +882,8 @@ setting.touchscreen.name = Điều khiển bằng màn hình cảm ứng
setting.fpscap.name = FPS tối đa setting.fpscap.name = FPS tối đa
setting.fpscap.none = Không giới hạn setting.fpscap.none = Không giới hạn
setting.fpscap.text = {0} FPS setting.fpscap.text = {0} FPS
setting.uiscale.name = Kích thước UI[lightgray] (yêu cầu khởi động lại)[] setting.uiscale.name = Kích thước UI
setting.uiscale.description = Trò chơi sẽ khởi động lại để áp dụng các thay đổi.
setting.swapdiagonal.name = Đặt luôn theo đường chéo setting.swapdiagonal.name = Đặt luôn theo đường chéo
setting.difficulty.training = Luyện tập setting.difficulty.training = Luyện tập
setting.difficulty.easy = Dễ setting.difficulty.easy = Dễ
@@ -871,7 +901,9 @@ setting.saveinterval.name = Khoảng thời gian lưu
setting.seconds = {0} giây setting.seconds = {0} giây
setting.milliseconds = {0} mili giây setting.milliseconds = {0} mili giây
setting.fullscreen.name = Toàn màn hình setting.fullscreen.name = Toàn màn hình
setting.borderlesswindow.name = Không viền[lightgray] (yêu cầu khởi động lại) setting.borderlesswindow.name = Không viền
setting.borderlesswindow.name.windows = Toàn màng hình (không viền)
setting.borderlesswindow.description = Trò chơi có thể sẽ khởi động lại để áp dụng các thay đổi
setting.fps.name = Hiển thị FPS & Ping setting.fps.name = Hiển thị FPS & Ping
setting.smoothcamera.name = Chế độ mượt mà setting.smoothcamera.name = Chế độ mượt mà
setting.vsync.name = VSync setting.vsync.name = VSync
@@ -994,6 +1026,8 @@ rules.wavetimer = Đếm ngược đợt
rules.waves = Đợt rules.waves = Đợt
rules.attack = Chế độ tấn công rules.attack = Chế độ tấn công
rules.buildai = AI Xây dựng rules.buildai = AI Xây dựng
rules.aitier = Cấp độ AI
rules.cleanupdeadteams = Xóa công trình của đội bị đánh bại (PvP)
rules.corecapture = Chiếm căn cứ khi phá hủy rules.corecapture = Chiếm căn cứ khi phá hủy
rules.polygoncoreprotection = Bảo vệ lõi kiểu đa giác. rules.polygoncoreprotection = Bảo vệ lõi kiểu đa giác.
rules.enemyCheat = Tài nguyên vô hạn (kẻ địch) rules.enemyCheat = Tài nguyên vô hạn (kẻ địch)
@@ -1012,12 +1046,15 @@ rules.deconstructrefundmultiplier = Hệ số số vật phẩm hoàn lại khi
rules.waitForWaveToEnd = Đợt chờ hết kẻ địch rules.waitForWaveToEnd = Đợt chờ hết kẻ địch
rules.dropzoneradius = Bán kính vùng thả:[lightgray] (ô) rules.dropzoneradius = Bán kính vùng thả:[lightgray] (ô)
rules.unitammo = Quân lính cần đạn rules.unitammo = Quân lính cần đạn
rules.enemyteam = Đội quân địch
rules.playerteam = Đội người chơi
rules.title.waves = Đợt rules.title.waves = Đợt
rules.title.resourcesbuilding = Tài nguyên & Xây dựng rules.title.resourcesbuilding = Tài nguyên & Xây dựng
rules.title.enemy = Kẻ địch rules.title.enemy = Kẻ địch
rules.title.unit = Quân lính rules.title.unit = Quân lính
rules.title.experimental = Thực nghiệm rules.title.experimental = Thực nghiệm
rules.title.environment = Môi trường rules.title.environment = Môi trường
rules.title.teams = Đội
rules.lighting = Ánh sáng rules.lighting = Ánh sáng
rules.enemyLights = Đèn địch rules.enemyLights = Đèn địch
rules.fire = Lửa rules.fire = Lửa
@@ -1096,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 = Điểm tiếp tế
block.parallax.name = Parallax block.parallax.name = Parallax
block.cliff.name = Vách đá block.cliff.name = Vách đá
block.sand-boulder.name = Tường cát block.sand-boulder.name = Tường cát
block.basalt-boulder.name = Tường đá basalt block.basalt-boulder.name = Tường đá basalt
block.grass.name = Cỏ block.grass.name = Cỏ
block.molten-slag.name = Xỉ nóng chảy block.molten-slag.name = Xỉ nóng chảy
block.pooled-cryofluid.name = Chất làm lạnh
block.space.name = Không gian block.space.name = Không gian
block.salt.name = Muối block.salt.name = Muối
block.salt-wall.name = Tường muối block.salt-wall.name = Tường muối
@@ -1136,6 +1173,7 @@ block.core-nucleus.name = Căn cứ: Trung tâm
block.deep-water.name = Nước sâu block.deep-water.name = Nước sâu
block.shallow-water.name = Nước block.shallow-water.name = Nước
block.tainted-water.name = Nước nhiểm bẩn block.tainted-water.name = Nước nhiểm bẩn
block.deep-tainted-water.name = Nước nhiểm bẩn sâu
block.darksand-tainted-water.name = Nước nhiễm bẩn cát đen block.darksand-tainted-water.name = Nước nhiễm bẩn cát đen
block.tar.name = Dầu block.tar.name = Dầu
block.stone.name = Đá block.stone.name = Đá
@@ -1263,6 +1301,7 @@ block.plated-conduit.name = Ống dẫn bọc giáp
block.phase-conduit.name = Ống dẫn Phase block.phase-conduit.name = Ống dẫn Phase
block.liquid-router.name = Bộ phân phát chất lỏng block.liquid-router.name = Bộ phân phát chất lỏng
block.liquid-tank.name = Thùng chất lỏng block.liquid-tank.name = Thùng chất lỏng
block.liquid-container.name = Bình chất lỏng
block.liquid-junction.name = Giao điểm chất lỏng block.liquid-junction.name = Giao điểm chất lỏng
block.bridge-conduit.name = Cầu dẫn chất lỏng block.bridge-conduit.name = Cầu dẫn chất lỏng
block.rotary-pump.name = Bơm điện block.rotary-pump.name = Bơm điện
@@ -1288,7 +1327,6 @@ block.meltdown.name = Meltdown
block.foreshadow.name = Foreshadow block.foreshadow.name = Foreshadow
block.container.name = Container block.container.name = Container
block.launch-pad.name = Bệ phóng block.launch-pad.name = Bệ phóng
block.launch-pad-large.name = Bệ phóng lớn
block.segment.name = Segment block.segment.name = Segment
block.command-center.name = Trung tâm chỉ huy block.command-center.name = Trung tâm chỉ huy
block.ground-factory.name = Nhà máy bộ binh block.ground-factory.name = Nhà máy bộ binh
@@ -1303,17 +1341,23 @@ block.payload-router.name = Bộ định tuyến khối hàng
block.duct.name = Duct block.duct.name = Duct
block.duct-router.name = Duct Router block.duct-router.name = Duct Router
block.duct-bridge.name = Duct Bridge block.duct-bridge.name = Duct Bridge
block.payload-propulsion-tower.name = Payload Propulsion Tower block.payload-propulsion-tower.name = Tháp đẩy khối hàng
block.payload-void.name = Payload Void block.payload-void.name = Payload Void
block.payload-source.name = Payload Source block.payload-source.name = Payload Source
block.disassembler.name = Máy phân tách lớn block.disassembler.name = Máy phân tách lớn
block.silicon-crucible.name = Máy nấu Silicon lớn block.silicon-crucible.name = Máy nấu Silicon lớn
block.overdrive-dome.name = Máy tăng tốc lớn block.overdrive-dome.name = Máy tăng tốc lớn
#experimental, may be removed
block.block-forge.name = Block Forge
block.block-loader.name = Block Loader
block.block-unloader.name = Điểm dỡ hàng
block.interplanetary-accelerator.name = Máy gia tốc liên hành tinh block.interplanetary-accelerator.name = Máy gia tốc liên hành tinh
block.constructor.name = Máy chế tạo
block.constructor.description = Chế tạo các khối có kích thước 2x2 ô.
block.large-constructor.name = Máy chế tạo lớn
block.large-constructor.description = Chế tạo các khối có kích thước lên đến 4x4 ô.
block.deconstructor.name = Máy tháo dỡ
block.deconstructor.description = Tháo dỡ khối và quân lính, trả lại 100% nguyên liệu.
block.payload-loader.name = Payload Loader
block.payload-loader.description = Nạp chất lỏng và vật phẩm vào khối.
block.payload-unloader.name = Payload Unloader
block.payload-unloader.description = Lấy chất lỏng và vật phẩm từ khối.
block.switch.name = Công tắc block.switch.name = Công tắc
block.micro-processor.name = Bộ xử lí nhỏ block.micro-processor.name = Bộ xử lí nhỏ
@@ -1348,6 +1392,7 @@ hint.placeTurret = Đặt \uf861 [accent]Súng[] để bảo vệ căn cứ củ
hint.breaking = [accent]Chuột phải[] và kéo để phá vỡ các khối. hint.breaking = [accent]Chuột phải[] và kéo để phá vỡ các khối.
hint.breaking.mobile = Kích hoạt \ue817 [accent]Cây búa[] ở phía dưới cùng bên phải và nhấn để phá vỡ các khối.\n\nGiữ ngón tay của bạn trong một giây và kéo để phá khối trong vùng được chọn. hint.breaking.mobile = Kích hoạt \ue817 [accent]Cây búa[] ở phía dưới cùng bên phải và nhấn để phá vỡ các khối.\n\nGiữ ngón tay của bạn trong một giây và kéo để phá khối trong vùng được chọn.
hint.blockInfo = Xem thông tin của một khối bằng cách chọn nó trong [accent]menu xây dựng[], Sau đó chọn nút [accent][[?][] ở bên phải. hint.blockInfo = Xem thông tin của một khối bằng cách chọn nó trong [accent]menu xây dựng[], Sau đó chọn nút [accent][[?][] ở bên phải.
hint.derelict = [accent]Derelict[] structures are broken remnants of old bases that no longer function.\n\nThese structures can be [accent]deconstructed[] for resources.
hint.research = Sử dụng nút \ue875 [accent]Nghiên cứu[] để nghiên cứu công nghệ mới. hint.research = Sử dụng nút \ue875 [accent]Nghiên cứu[] để nghiên cứu công nghệ mới.
hint.research.mobile = Sử dụng nút \ue875 [accent]Nghiên cứu[] trong \ue88c [accent]Menu[] để nghiên cứu công nghệ mới. hint.research.mobile = Sử dụng nút \ue875 [accent]Nghiên cứu[] trong \ue88c [accent]Menu[] để nghiên cứu công nghệ mới.
hint.unitControl = Giữ [accent][[L-ctrl][] và [accent]click[] để điều khiển quân lính của bạn hoặc súng. hint.unitControl = Giữ [accent][[L-ctrl][] và [accent]click[] để điều khiển quân lính của bạn hoặc súng.
@@ -1369,6 +1414,7 @@ hint.generator = \uf879 [accent]Máy phát điện đốt cháy[] đốt than v
hint.guardian = [accent]Boss[] được bọc giáp. Sử dụng loại đạn yếu chẳng hạn như [accent]Đồng[] và [accent]Chì[] là [scarlet]không hiệu quả[].\n\nSử dụng súng tiên tiến hơn hoặc sử dụng \uf835 [accent]Than chì làm đạn [] \uf861Duo/\uf859Salvo đạn dược để hạ gục Boss. hint.guardian = [accent]Boss[] được bọc giáp. Sử dụng loại đạn yếu chẳng hạn như [accent]Đồng[] và [accent]Chì[] là [scarlet]không hiệu quả[].\n\nSử dụng súng tiên tiến hơn hoặc sử dụng \uf835 [accent]Than chì làm đạn [] \uf861Duo/\uf859Salvo đạn dược để hạ gục Boss.
hint.coreUpgrade = Các căn cứ có thể được nâng cấp bằng cách [accent]đặt căn cứ cấp cao hơn trên chúng[].\n\nĐặt một căn cứ  [accent]Trụ sở[] trên căn cứ  [accent]Cơ sở[]. Đảm bảo không có vật cản gần đó. hint.coreUpgrade = Các căn cứ có thể được nâng cấp bằng cách [accent]đặt căn cứ cấp cao hơn trên chúng[].\n\nĐặt một căn cứ  [accent]Trụ sở[] trên căn cứ  [accent]Cơ sở[]. Đảm bảo không có vật cản gần đó.
hint.presetLaunch = Khác khu vực đáp [accent] xám[], như [accent]Frozen Forest[], có thể được phóng đến từ bất cứ đâu. Nó không yêu cầu chiếm các khu vực lân cận.\n\n[accent]Các khu vực được đánh số[], chẳng hạn như cái này, là [accent]không bắt buộc[]. hint.presetLaunch = Khác khu vực đáp [accent] xám[], như [accent]Frozen Forest[], có thể được phóng đến từ bất cứ đâu. Nó không yêu cầu chiếm các khu vực lân cận.\n\n[accent]Các khu vực được đánh số[], chẳng hạn như cái này, là [accent]không bắt buộc[].
hint.presetDifficulty = This sector has a [scarlet]high enemy threat level[].\nLaunching to such sectors is [accent]not recommended[] without proper technology and preparation.
hint.coreIncinerate = Sau khi căn cứ đầy vật phẩm, bất kì vật phẩm vào thuộc loại đó nhận được sẽ bị [accent]tiêu hủy[]. hint.coreIncinerate = Sau khi căn cứ đầy vật phẩm, bất kì vật phẩm vào thuộc loại đó nhận được sẽ bị [accent]tiêu hủy[].
hint.coopCampaign = Khi chơi chiến dịch[accent]co-op[], các vật phẩm được sản xuất trong bản đồ hiện tại cũng sẽ được gửi [accent]đến các khu vực của bạn[].\n\nBất kỳ nghiên cứu mới nào được thực hiện đều được lưu lại. hint.coopCampaign = Khi chơi chiến dịch[accent]co-op[], các vật phẩm được sản xuất trong bản đồ hiện tại cũng sẽ được gửi [accent]đến các khu vực của bạn[].\n\nBất kỳ nghiên cứu mới nào được thực hiện đều được lưu lại.
@@ -1399,7 +1445,7 @@ liquid.slag.description = Dùng để tách các kim loại, hoặc phun vào k
liquid.oil.description = Dùng trong sản xuất vật liệu tiên tiến và làm đạn gây cháy. liquid.oil.description = Dùng trong sản xuất vật liệu tiên tiến và làm đạn gây cháy.
liquid.cryofluid.description = Dùng làm chất làm mát trong lò phản ứng, súng và nhà máy. liquid.cryofluid.description = Dùng làm chất làm mát trong lò phản ứng, súng và nhà máy.
block.resupply-point.description = Cung cấp đạn đồng cho các quân lính ở gần. Không tương thích với quân lính sử dụng điện. block.derelict =  [lightgray]Derelict
block.armored-conveyor.description = Vận chuyển vật phẩm về phía trước. Không nhận đầu vào từ phía bên cạnh. block.armored-conveyor.description = Vận chuyển vật phẩm về phía trước. Không nhận đầu vào từ phía bên cạnh.
block.illuminator.description = Phát sáng. block.illuminator.description = Phát sáng.
block.message.description = Lưu trữ tin nhắn giao tiếp giữa đồng đội. block.message.description = Lưu trữ tin nhắn giao tiếp giữa đồng đội.
@@ -1425,6 +1471,8 @@ block.item-source.description = Tạo ra vật phẩm mãi mãi. Chỉ có trong
block.item-void.description = Hủy mọi vật phẩm. Chỉ có trong chế độ tự do. block.item-void.description = Hủy mọi vật phẩm. Chỉ có trong chế độ tự do.
block.liquid-source.description = Tạo ra chất lỏng mãi mãi. Chỉ có trong chế độ tự do. block.liquid-source.description = Tạo ra chất lỏng mãi mãi. Chỉ có trong chế độ tự do.
block.liquid-void.description = Loại bỏ mọi chất lỏng. Chỉ có trong chế độ tự do. block.liquid-void.description = Loại bỏ mọi chất lỏng. Chỉ có trong chế độ tự do.
block.payload-source.description = Tạo ra bất kì khối hàng nào. Chỉ có trong chế độ tự do.
block.payload-void.description = Phá hủy bất kì khối hàng nào. Chỉ có trong chế độ tự do.
block.copper-wall.description = Bảo vệ các công trình khỏi đạn của kẻ thù. block.copper-wall.description = Bảo vệ các công trình khỏi đạn của kẻ thù.
block.copper-wall-large.description = Bảo vệ nhiều công trình khỏi đạn của kẻ thù. block.copper-wall-large.description = Bảo vệ nhiều công trình khỏi đạn của kẻ thù.
block.titanium-wall.description = Bảo vệ các công trình khỏi đạn của kẻ thù. block.titanium-wall.description = Bảo vệ các công trình khỏi đạn của kẻ thù.
@@ -1465,7 +1513,8 @@ block.conduit.description = Đẩy chất lỏng đến trước, dùng với b
block.pulse-conduit.description = Đẩy chất lỏng đến trước, vận chuyển nhanh và trữ nhiều hơn so với ống tiêu chuẩn. block.pulse-conduit.description = Đẩy chất lỏng đến trước, vận chuyển nhanh và trữ nhiều hơn so với ống tiêu chuẩn.
block.plated-conduit.description = Đẩy chất lỏng đến trước, không nhận đầu vào ở bên, không bị rò rỉ. block.plated-conduit.description = Đẩy chất lỏng đến trước, không nhận đầu vào ở bên, không bị rò rỉ.
block.liquid-router.description = Nhận chất lỏng từ một phía và đưa đều ra ba phía còn lại. Có thể trữ một lượng chất lỏng nhất định. block.liquid-router.description = Nhận chất lỏng từ một phía và đưa đều ra ba phía còn lại. Có thể trữ một lượng chất lỏng nhất định.
block.liquid-tank.description = Trữ được nhiều chất lỏng. Đưa đều ra mọi phía như bộ phân nnh chất lỏng. block.liquid-tank.description = Trữ được một lượng lớn chất lỏng. Đưa đều ra mọi phía như bộ phân pt chất lỏng.
block.liquid-container.description = Lưu trữ một lượng vừa phải chất lỏng. Đưa đều ra mọi phía như bộ phân phát chất lỏng.
block.liquid-junction.description = Chức năng như cầu cho hai ống nước băng chéo nhau. block.liquid-junction.description = Chức năng như cầu cho hai ống nước băng chéo nhau.
block.bridge-conduit.description = Vận chuyển chất lỏng qua nhiều loại địa hình hoặc công trình. block.bridge-conduit.description = Vận chuyển chất lỏng qua nhiều loại địa hình hoặc công trình.
block.phase-conduit.description = Vận chuyển chất lỏng qua địa hình hoặc công trình. Phạm vi dài hơn cầu nối, nhưng cần năng lượng. block.phase-conduit.description = Vận chuyển chất lỏng qua địa hình hoặc công trình. Phạm vi dài hơn cầu nối, nhưng cần năng lượng.
@@ -1543,6 +1592,8 @@ block.memory-bank.description = Lưu trữ thông tin cho bộ xử lí. Dung l
block.logic-display.description = Hiển thị đồ họa tùy ý từ bộ xử lí. block.logic-display.description = Hiển thị đồ họa tùy ý từ bộ xử lí.
block.large-logic-display.description = Hiển thị đồ họa tùy ý từ bộ xử lí. block.large-logic-display.description = Hiển thị đồ họa tùy ý từ bộ xử lí.
block.interplanetary-accelerator.description = Tòa súng từ trường cỡ lớn. Tăng tốc vật phóng đến vận tốc thoát để di chuyển giữa các hành tinh. block.interplanetary-accelerator.description = Tòa súng từ trường cỡ lớn. Tăng tốc vật phóng đến vận tốc thoát để di chuyển giữa các hành tinh.
block.repair-turret.description = Sửa chữa những quân lính bị hư hỏng trong khu vực nhất địnhđịnh. Có thể làm mát để tăng hiệu quả.
block.payload-propulsion-tower.description = Cơ cấu vận chuyển các khối hàng tầm xa. Bắn khối hàng cho các tháp đẩy khối hàng kháckhác.
unit.dagger.description = Bắn đạn tiêu chuẩn vào tất cả kẻ địch xung quanh. unit.dagger.description = Bắn đạn tiêu chuẩn vào tất cả kẻ địch xung quanh.
unit.mace.description = Phun lửa vào tất cả kẻ địch xung quanh. unit.mace.description = Phun lửa vào tất cả kẻ địch xung quanh.
@@ -1577,6 +1628,11 @@ unit.omura.description = Bắn đạn từ trường xuyên giáp tầm xa vào
unit.alpha.description = Bảo vệ căn cứ cơ sở khỏi kẻ thù. Có thể xây dựng. unit.alpha.description = Bảo vệ căn cứ cơ sở khỏi kẻ thù. Có thể xây dựng.
unit.beta.description = Bảo vệ căn cứ trụ sở khỏi kẻ thù. Có thể xây dựng. unit.beta.description = Bảo vệ căn cứ trụ sở khỏi kẻ thù. Có thể xây dựng.
unit.gamma.description = Bảo vệ căn cứ trung tâm khỏi kẻ thù. Có thể xây dựng. unit.gamma.description = Bảo vệ căn cứ trung tâm khỏi kẻ thù. Có thể xây dựng.
unit.retusa.description = Fires homing torpedoes at nearby enemies. Repairs allied units.
unit.oxynoe.description = Fires structure-repairing streams of flame at nearby enemies. Targets nearby enemy projectiles with a point defense turret.
unit.cyerce.description = Fires seeking cluster-missiles at enemies. Repairs allied units.
unit.aegires.description = Shocks all enemy units and structures that enter its energy field. Repairs all allies.
unit.navanax.description = Fires explosive EMP projectiles, dealing significant damage to enemy power networks and repairing allied structures. Melts nearby enemies with 4 autonomous laser turrets.
lst.read = Đọc một số từ bộ nhớ được liên kết. lst.read = Đọc một số từ bộ nhớ được liên kết.
lst.write = Ghi một số vào bộ nhớ được liên kết. lst.write = Ghi một số vào bộ nhớ được liên kết.
@@ -1591,6 +1647,8 @@ lst.sensor = Lấy dữ liệu từ một khối hoặc quân lính.
lst.set = Đặt một biến. lst.set = Đặt một biến.
lst.operation = Thực hiện thao tác trên 1-2 biến. lst.operation = Thực hiện thao tác trên 1-2 biến.
lst.end = Chuyển đến lệnh đầu tiên. lst.end = Chuyển đến lệnh đầu tiên.
lst.wait = Chờ trong khoảng thời gian nhất định.
lst.lookup = Look up an item/liquid/unit/block type by ID.\nTotal counts of each type can be accessed with:\n[accent]@unitCount[] / [accent]@itemCount[] / [accent]@liquidCount[] / [accent]@blockCount[]
lst.jump = Chuyển qua lệnh khác nếu điều kiện đúng. lst.jump = Chuyển qua lệnh khác nếu điều kiện đúng.
lst.unitbind = Bind to the next unit of a type, and store it in [accent]@unit[]. lst.unitbind = Bind to the next unit of a type, and store it in [accent]@unit[].
lst.unitcontrol = Control the currently bound unit. lst.unitcontrol = Control the currently bound unit.
@@ -1689,13 +1747,13 @@ sensor.in = The building/unit to sense.
radar.from = Building to sense from.\nSensor range is limited by building range. radar.from = Building to sense from.\nSensor range is limited by building range.
radar.target = Filter for units to sense. radar.target = Filter for units to sense.
radar.and = Additional filters. radar.and = Additional filters.
radar.order = Sorting order. 0 to reverse. radar.order = Sắp xếp theo thứ tự. đặt giá trị 0 để đảo ngược.
radar.sort = Metric to sort results by. radar.sort = Metric to sort results by.
radar.output = Variable to write output unit to. radar.output = Variable to write output unit to.
unitradar.target = Filter for units to sense. unitradar.target = Filter for units to sense.
unitradar.and = Additional filters. unitradar.and = Additional filters.
unitradar.order = Sorting order. 0 to reverse. unitradar.order = Sắp xếp theo thứ tự. đặt giá trị 0 để đảo ngược.
unitradar.sort = Metric to sort results by. unitradar.sort = Metric to sort results by.
unitradar.output = Variable to write output unit to. unitradar.output = Variable to write output unit to.
@@ -1706,8 +1764,8 @@ control.shoot = Whether to shoot.
unitlocate.enemy = Whether to locate enemy buildings. unitlocate.enemy = Whether to locate enemy buildings.
unitlocate.found = Whether the object was found. unitlocate.found = Whether the object was found.
unitlocate.building = Output variable for located building. unitlocate.building = Output variable for located building.
unitlocate.outx = Output X coordinate. unitlocate.outx = Cho ra tọa độ X.
unitlocate.outy = Output Y coordinate. unitlocate.outy = Cho ra tọa độ Y.
unitlocate.group = Building group to look for. unitlocate.group = Building group to look for.
lenum.idle = Không di chuyển, nhưng vẫn xây dựng/đào.\nTrạng thái mặc định. lenum.idle = Không di chuyển, nhưng vẫn xây dựng/đào.\nTrạng thái mặc định.
@@ -1721,6 +1779,7 @@ lenum.itemdrop = Thả vật phẩm.
lenum.itemtake = Lấy vật phẩm từ khối. lenum.itemtake = Lấy vật phẩm từ khối.
lenum.paydrop = Thả khối hàng hiện tại. lenum.paydrop = Thả khối hàng hiện tại.
lenum.paytake = Nhất khối hàng tại vị trí hiện tại. lenum.paytake = Nhất khối hàng tại vị trí hiện tại.
lenum.payenter = Enter/land on the payload block the unit is on.
lenum.flag = Numeric unit flag. lenum.flag = Numeric unit flag.
lenum.mine = Đào tại vị trí. lenum.mine = Đào tại vị trí.
lenum.build = Xây công trình. lenum.build = Xây công trình.

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,5 @@ SAMBUYYA
genNAowl genNAowl
TranquillyUnpleasant TranquillyUnpleasant
Darkness6030 Darkness6030
hortiSquash
King-BR

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

@@ -54,9 +54,9 @@ public class Pathfinder implements Runnable{
(PathTile.solid(tile) ? 5 : 0), (PathTile.solid(tile) ? 5 : 0),
//water //water
(team, tile) -> PathTile.solid(tile) || !PathTile.liquid(tile) ? 200 : 2 + (team, tile) -> (PathTile.solid(tile) || !PathTile.liquid(tile) ? 6000 : 1) +
(PathTile.nearGround(tile) || PathTile.nearSolid(tile) ? 14 : 0) + (PathTile.nearGround(tile) || PathTile.nearSolid(tile) ? 14 : 0) +
(PathTile.deep(tile) ? -1 : 0) + (PathTile.deep(tile) ? 0 : 1) +
(PathTile.damages(tile) ? 35 : 0) (PathTile.damages(tile) ? 35 : 0)
); );

View File

@@ -38,7 +38,7 @@ public class PhysicsProcess implements AsyncProcess{
//find Unit without bodies and assign them //find Unit without bodies and assign them
for(Unit entity : group){ for(Unit entity : group){
if(entity.type == null) continue; if(entity == null || entity.type == null) continue;
if(entity.physref == null){ if(entity.physref == null){
PhysicsBody body = new PhysicsBody(); PhysicsBody body = new PhysicsBody();

View File

@@ -5,6 +5,7 @@ import arc.math.*;
import arc.struct.*; import arc.struct.*;
import mindustry.*; import mindustry.*;
import mindustry.ctype.*; import mindustry.ctype.*;
import mindustry.entities.*;
import mindustry.entities.bullet.*; import mindustry.entities.bullet.*;
import mindustry.gen.*; import mindustry.gen.*;
import mindustry.graphics.*; import mindustry.graphics.*;
@@ -901,7 +902,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 +1347,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 +1646,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;
@@ -1839,7 +1840,7 @@ public class Blocks implements ContentList{
size = 4; size = 4;
shootCone = 2f; shootCone = 2f;
shootSound = Sounds.railgun; shootSound = Sounds.railgun;
unitSort = (u, x, y) -> -u.maxHealth + Mathf.dst2(u.x, u.y, x, y) / 6400f; unitSort = UnitSorts.strongest;
coolantMultiplier = 0.4f; coolantMultiplier = 0.4f;
@@ -2062,12 +2063,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 +2164,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

@@ -260,36 +260,13 @@ public class NetClient implements ApplicationListener{
//a command was sent, now get the output //a command was sent, now get the output
if(response.type != ResponseType.valid){ if(response.type != ResponseType.valid){
String text; String text = netServer.invalidHandler.handle(player, response);
if(text != null){
//send usage
if(response.type == ResponseType.manyArguments){
text = "[scarlet]Too many arguments. Usage:[lightgray] " + response.command.text + "[gray] " + response.command.paramText;
}else if(response.type == ResponseType.fewArguments){
text = "[scarlet]Too few arguments. Usage:[lightgray] " + response.command.text + "[gray] " + response.command.paramText;
}else{ //unknown command
int minDst = 0;
Command closest = null;
for(Command command : netServer.clientCommands.getCommandList()){
int dst = Strings.levenshtein(command.text, response.runCommand);
if(dst < 3 && (closest == null || dst < minDst)){
minDst = dst;
closest = command;
}
}
if(closest != null){
text = "[scarlet]Unknown command. Did you mean \"[lightgray]" + closest.text + "[]\"?";
}else{
text = "[scarlet]Unknown command. Check [lightgray]/help[scarlet].";
}
}
player.sendMessage(text); player.sendMessage(text);
} }
} }
} }
}
@Remote(called = Loc.client, variants = Variant.one) @Remote(called = Loc.client, variants = Variant.one)
public static void connect(String ip, int port){ public static void connect(String ip, int port){

View File

@@ -67,6 +67,32 @@ public class NetServer implements ApplicationListener{
/** Converts a message + NULLABLE player sender into a single string. Override for custom prefixes/suffixes. */ /** Converts a message + NULLABLE player sender into a single string. Override for custom prefixes/suffixes. */
public ChatFormatter chatFormatter = (player, message) -> player == null ? message : "[coral][[" + player.coloredName() + "[coral]]:[white] " + message; public ChatFormatter chatFormatter = (player, message) -> player == null ? message : "[coral][[" + player.coloredName() + "[coral]]:[white] " + message;
/** Handles an incorrect command response. Returns text that will be sent to player. Override for customisation. */
public InvalidCommandHandler invalidHandler = (player, response) -> {
if(response.type == ResponseType.manyArguments){
return "[scarlet]Too many arguments. Usage:[lightgray] " + response.command.text + "[gray] " + response.command.paramText;
}else if(response.type == ResponseType.fewArguments){
return "[scarlet]Too few arguments. Usage:[lightgray] " + response.command.text + "[gray] " + response.command.paramText;
}else{ //unknown command
int minDst = 0;
Command closest = null;
for(Command command : netServer.clientCommands.getCommandList()){
int dst = Strings.levenshtein(command.text, response.runCommand);
if(dst < 3 && (closest == null || dst < minDst)){
minDst = dst;
closest = command;
}
}
if(closest != null){
return "[scarlet]Unknown command. Did you mean \"[lightgray]" + closest.text + "[]\"?";
}else{
return "[scarlet]Unknown command. Check [lightgray]/help[scarlet].";
}
}
};
private boolean closing = false; private boolean closing = false;
private Interval timer = new Interval(); private Interval timer = new Interval();
@@ -275,7 +301,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 +750,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
@@ -755,6 +783,8 @@ public class NetServer implements ApplicationListener{
player.add(); player.add();
Events.fire(new PlayerConnectionConfirmed(player));
if(player.con == null || player.con.hasConnected) return; if(player.con == null || player.con.hasConnected) return;
player.con.hasConnected = true; player.con.hasConnected = true;
@@ -990,4 +1020,8 @@ public class NetServer implements ApplicationListener{
/** @return text to be placed before player name */ /** @return text to be placed before player name */
String format(@Nullable Player player, String message); String format(@Nullable Player player, String message);
} }
public interface InvalidCommandHandler{
String handle(Player player, CommandResponse response);
}
} }

View File

@@ -35,7 +35,7 @@ public class Effect{
/** Amount added to rotation */ /** Amount added to rotation */
public float baseRotation; public float baseRotation;
/** If true, parent unit is data are followed. */ /** If true, parent unit is data are followed. */
public boolean followParent; public boolean followParent = true;
/** If this and followParent are true, the effect will offset and rotate with the parent's rotation. */ /** If this and followParent are true, the effect will offset and rotate with the parent's rotation. */
public boolean rotWithParent; public boolean rotWithParent;

View File

@@ -0,0 +1,14 @@
package mindustry.entities;
import arc.math.*;
import mindustry.entities.Units.*;
import mindustry.gen.*;
public class UnitSorts{
public static Sortf
closest = Unit::dst2,
farthest = (u, x, y) -> -u.dst2(x, y),
strongest = (u, x, y) -> -u.maxHealth + Mathf.dst2(u.x, u.y, x, y) / 6400f,
weakest = (u, x, y) -> u.maxHealth + Mathf.dst2(u.x, u.y, x, y) / 6400f;
}

View File

@@ -359,8 +359,9 @@ public class BulletType extends Content implements Cloneable{
//home in on allies if possible //home in on allies if possible
if(healPercent > 0){ if(healPercent > 0){
target = Units.closestTarget(null, b.x, b.y, homingRange, target = Units.closestTarget(null, b.x, b.y, homingRange,
e -> e.checkTarget(collidesAir, collidesGround) && e.team != b.team, e -> e.checkTarget(collidesAir, collidesGround) && e.team != b.team && !b.hasCollided(e.id),
t -> collidesGround && (t.team != b.team || t.damaged())); t -> collidesGround && (t.team != b.team || t.damaged()) && !b.hasCollided(t.id)
);
}else{ }else{
target = Units.closestTarget(b.team, b.x, b.y, homingRange, e -> e.checkTarget(collidesAir, collidesGround) && !b.hasCollided(e.id), t -> collidesGround && !b.hasCollided(t.id)); target = Units.closestTarget(b.team, b.x, b.y, homingRange, e -> e.checkTarget(collidesAir, collidesGround) && !b.hasCollided(e.id), t -> collidesGround && !b.hasCollided(t.id));
} }

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);
} }
@@ -1284,8 +1293,19 @@ abstract class BuildingComp implements Posc, Teamc, Healthc, Buildingc, Timerc,
return true; return true;
} }
/** Called right before this building is picked up. */
public void pickedUp(){ public void pickedUp(){
}
/** Called right after this building is picked up. */
public void afterPickedUp(){
if(power != null){
power.graph = new PowerGraph();
power.links.clear();
power.status = 0f;
}
} }
public void removeFromProximity(){ public void removeFromProximity(){

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.afterPickedUp();
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

@@ -480,7 +480,19 @@ public class EventType{
} }
} }
/** Called after connecting; when a player receives world data and is ready to play.*/ /**
* Called after player confirmed it has received world data and is ready to play.
* Note that if this is the first world receival, then player.con.hasConnected is false.
*/
public static class PlayerConnectionConfirmed{
public final Player player;
public PlayerConnectionConfirmed(Player player){
this.player = player;
}
}
/** Called after connecting; when a player receives world data and is ready to play. Fired only once, after initial connection. */
public static class PlayerJoin{ public static class PlayerJoin{
public final Player player; public final Player player;
@@ -544,4 +556,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

@@ -62,7 +62,7 @@ public class Layer{
//flying units //flying units
flyingUnit = 115, flyingUnit = 115,
//overlaied UI, like block config guides //overlaid UI, like block config guides
overlayUI = 120, overlayUI = 120,
//build beam effects //build beam effects

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

@@ -696,9 +696,7 @@ public abstract class InputHandler implements InputProcessor, GestureListener{
}); });
//flip rotation //flip rotation
if(x == (req.rotation % 2 == 0)){ req.block.flipRotation(req, x);
req.rotation = Mathf.mod(req.rotation + 2, 4);
}
}); });
} }
@@ -1113,7 +1111,7 @@ public abstract class InputHandler implements InputProcessor, GestureListener{
} }
Building build = world.buildWorld(Core.input.mouseWorld().x, Core.input.mouseWorld().y); Building build = world.buildWorld(Core.input.mouseWorld().x, Core.input.mouseWorld().y);
if(build instanceof ControlBlock cont && cont.canControl() && build.team == player.team()){ if(build instanceof ControlBlock cont && cont.canControl() && build.team == player.team() && cont.unit() != player.unit()){
return cont.unit(); return cont.unit();
} }

View File

@@ -20,6 +20,7 @@ import mindustry.content.*;
import mindustry.content.TechTree.*; import mindustry.content.TechTree.*;
import mindustry.ctype.*; import mindustry.ctype.*;
import mindustry.entities.*; import mindustry.entities.*;
import mindustry.entities.Units.*;
import mindustry.entities.abilities.*; import mindustry.entities.abilities.*;
import mindustry.entities.bullet.*; import mindustry.entities.bullet.*;
import mindustry.entities.effect.*; import mindustry.entities.effect.*;
@@ -61,6 +62,7 @@ public class ContentParser{
readFields(result, data); readFields(result, data);
return result; return result;
}); });
put(Sortf.class, (type, data) -> field(UnitSorts.class, data));
put(Interp.class, (type, data) -> field(Interp.class, data)); put(Interp.class, (type, data) -> field(Interp.class, data));
put(CacheLayer.class, (type, data) -> field(CacheLayer.class, data)); put(CacheLayer.class, (type, data) -> field(CacheLayer.class, data));
put(Attribute.class, (type, data) -> Attribute.get(data.asString())); put(Attribute.class, (type, data) -> Attribute.get(data.asString()));
@@ -196,6 +198,18 @@ public class ContentParser{
} }
} }
//try to parse env bits
if((type == int.class || type == Integer.class) && jsonData.isArray()){
int value = 0;
for(var str : jsonData){
if(!str.isString()) throw new SerializationException("Integer bitfield values must all be strings. Found: " + str);
String field = str.asString();
value |= Reflect.<Integer>get(Env.class, field);
}
return (T)(Integer)value;
}
//try to parse "item/amount" syntax //try to parse "item/amount" syntax
if(type == ItemStack.class && jsonData.isString() && jsonData.asString().contains("/")){ if(type == ItemStack.class && jsonData.isString() && jsonData.asString().contains("/")){
String[] split = jsonData.asString().split("/"); String[] split = jsonData.asString().split("/");

View File

@@ -8,6 +8,7 @@ import arc.util.*;
import arc.util.io.*; import arc.util.io.*;
import mindustry.*; import mindustry.*;
import mindustry.core.*; import mindustry.core.*;
import mindustry.mod.Mods.*;
import java.io.*; import java.io.*;
import java.text.*; import java.text.*;
@@ -27,7 +28,7 @@ public class CrashSender{
+ "Version: " + Version.combined() + (Vars.headless ? " (Server)" : "") + "\n" + "Version: " + Version.combined() + (Vars.headless ? " (Server)" : "") + "\n"
+ "OS: " + OS.osName + " x" + (OS.osArchBits) + " (" + OS.osArch + ")\n" + "OS: " + OS.osName + " x" + (OS.osArchBits) + " (" + OS.osArch + ")\n"
+ "Java Version: " + OS.javaVersion + "\n" + "Java Version: " + OS.javaVersion + "\n"
+ (mods == null ? "<no mod init>" : mods.list().size + " Mods" + (mods.list().isEmpty() ? "" : ": " + mods.list().toString(", ", mod -> mod.name + ":" + mod.meta.version))) + (mods == null ? "<no mod init>" : "Mods: " + (!mods.list().contains(LoadedMod::shouldBeEnabled) ? "none (vanilla)" : mods.list().select(LoadedMod::shouldBeEnabled).toString(", ", mod -> mod.name + ":" + mod.meta.version)))
+ "\n\n" + error; + "\n\n" + error;
} }

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

@@ -141,8 +141,7 @@ public class UnitType extends UnlockableContent{
public TextureRegion[] wreckRegions; public TextureRegion[] wreckRegions;
protected float buildTime = -1f; protected float buildTime = -1f;
protected @Nullable ItemStack[] cachedRequirements; protected @Nullable ItemStack[] totalRequirements, cachedRequirements, firstRequirements;
protected @Nullable ItemStack[] totalRequirements;
public UnitType(String name){ public UnitType(String name){
super(name); super(name);
@@ -307,6 +306,12 @@ public class UnitType extends UnlockableContent{
stats.add(Stat.payloadCapacity, (payloadCapacity / (tilesize * tilesize)), StatUnit.blocksSquared); stats.add(Stat.payloadCapacity, (payloadCapacity / (tilesize * tilesize)), StatUnit.blocksSquared);
} }
var reqs = getFirstRequirements();
if(reqs != null){
stats.add(Stat.buildCost, StatValues.items(reqs));
}
if(weapons.any()){ if(weapons.any()){
stats.add(Stat.weapons, StatValues.weapons(this, weapons)); stats.add(Stat.weapons, StatValues.weapons(this, weapons));
} }
@@ -547,6 +552,13 @@ public class UnitType extends UnlockableContent{
return null; return null;
} }
public @Nullable ItemStack[] getFirstRequirements(){
if(firstRequirements == null){
firstRequirements = getRequirements(null, null);
}
return firstRequirements;
}
@Override @Override
public ItemStack[] researchRequirements(){ public ItemStack[] researchRequirements(){
if(cachedRequirements != null){ if(cachedRequirements != null){

View File

@@ -97,6 +97,8 @@ public class Weapon implements Cloneable{
public boolean parentizeEffects; public boolean parentizeEffects;
/** internal value used for alternation - do not change! */ /** internal value used for alternation - do not change! */
public int otherSide = -1; public int otherSide = -1;
/** draw Z offset relative to the default value */
public float layerOffset = 0f;
/** sound used for shooting */ /** sound used for shooting */
public Sound shootSound = Sounds.pew; public Sound shootSound = Sounds.pew;
/** sound used for weapons that have a delay */ /** sound used for weapons that have a delay */
@@ -155,12 +157,16 @@ 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);
} }
} }
public void draw(Unit unit, WeaponMount mount){ public void draw(Unit unit, WeaponMount mount){
//apply layer offset, roll it back at the end
float z = Draw.z();
Draw.z(z + layerOffset);
float float
rotation = unit.rotation - 90, rotation = unit.rotation - 90,
weaponRotation = rotation + (rotate ? mount.rotation : 0), weaponRotation = rotation + (rotate ? mount.rotation : 0),
@@ -171,12 +177,8 @@ public class Weapon implements Cloneable{
Drawf.shadow(wx, wy, shadow); Drawf.shadow(wx, wy, shadow);
} }
if(outlineRegion.found() && top){ if(top){
Draw.rect(outlineRegion, drawOutline(unit, mount);
wx, wy,
outlineRegion.width * Draw.scl * -Mathf.sign(flipSprite),
region.height * Draw.scl,
weaponRotation);
} }
Draw.rect(region, Draw.rect(region,
@@ -196,6 +198,8 @@ public class Weapon implements Cloneable{
Draw.blend(); Draw.blend();
Draw.color(); Draw.color();
} }
Draw.z(z);
} }
public void update(Unit unit, WeaponMount mount){ public void update(Unit unit, WeaponMount mount){

View File

@@ -31,11 +31,13 @@ public class Menus{
@Remote(targets = Loc.both, called = Loc.both) @Remote(targets = Loc.both, called = Loc.both)
public static void menuChoose(@Nullable Player player, int menuId, int option){ public static void menuChoose(@Nullable Player player, int menuId, int option){
if(player != null && menuId >= 0 && menuId < menuListeners.size){ if(player != null){
Events.fire(new MenuOptionChooseEvent(player, menuId, option)); Events.fire(new MenuOptionChooseEvent(player, menuId, option));
if(menuId >= 0 && menuId < menuListeners.size){
menuListeners.get(menuId).get(player, option); menuListeners.get(menuId).get(player, option);
} }
} }
}
@Remote(variants = Variant.both, unreliable = true) @Remote(variants = Variant.both, unreliable = true)
public static void setHudText(String message){ public static void setHudText(String message){

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,14 +156,21 @@ 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 ?
showBuiltIn ? maps.all() : maps.customMaps() :
showBuiltIn ? maps.defaultMaps() : null;
if(mapList != null){
for(Map map : mapList){ for(Map map : mapList){
boolean invalid = false; boolean invalid = false;
for(Gamemode mode : modes){ for(Gamemode mode : modes){
invalid |= !mode.valid(map); invalid |= !mode.valid(map);
} }
if(invalid || (searchString != null && !Strings.stripColors(map.name()).toLowerCase().contains(searchString))){ 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; continue;
} }
@@ -183,6 +193,7 @@ public class MapsDialog extends BaseDialog{
i++; i++;
} }
}
if(noMapsShown){ if(noMapsShown){
mapTable.add("@maps.none"); mapTable.add("@maps.none");
@@ -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();
} }
} }
t.row(); }).padBottom(10f);
t.button("@editor.showAll", Styles.clearTogglet, () -> { menu.row();
showAll = !showAll;
Core.settings.put("editorShowAllMaps", showAll); menu.add("@editor.filters.type").width(150f).left();
menu.table(Tex.button, t -> {
t.button("@custom", Styles.clearTogglet, () -> {
showCustom = !showCustom;
Core.settings.put("editorshowcustommaps", showCustom);
Core.settings.forceSave(); Core.settings.forceSave();
rebuildMaps(); rebuildMaps();
}).checked(b -> showAll).colspan(3).growX().height(40f); }).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

@@ -257,6 +257,12 @@ public class ChatFragment extends Table{
return shown; return shown;
} }
/** @deprecated prefixes are ignored now, just add raw messages */
@Deprecated
public void addMessage(String pointless, String message){
addMessage(message);
}
public void addMessage(String message){ public void addMessage(String message){
if(message == null) return; if(message == null) return;
messages.insert(0, message); messages.insert(0, message);

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<>();
@@ -984,4 +989,9 @@ public class Block extends UnlockableContent{
packer.add(PageType.editor, name + "-icon-editor", editorBase); packer.add(PageType.editor, name + "-icon-editor", editorBase);
} }
public void flipRotation(BuildPlan req, boolean x){
if(x == (req.rotation % 2 == 0)){
req.rotation = Mathf.mod(req.rotation + 2, 4);
}
}
} }

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);
if(block != null){
pane.setScrollYForce(block.selectScroll);
pane.update(() -> { pane.update(() -> {
scrollPos = pane.getScrollY(); 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

@@ -122,6 +122,12 @@ public class ForceProjector extends Block{
super.onRemoved(); super.onRemoved();
} }
@Override
public void pickedUp(){
super.pickedUp();
radscl = warmup = 0f;
}
@Override @Override
public void updateTile(){ public void updateTile(){
boolean phaseValid = consumes.get(ConsumeType.item).valid(this); boolean phaseValid = consumes.get(ConsumeType.item).valid(this);

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

@@ -76,7 +76,7 @@ public class Turret extends ReloadTurret{
public Effect chargeBeginEffect = Fx.none; public Effect chargeBeginEffect = Fx.none;
public Sound chargeSound = Sounds.none; public Sound chargeSound = Sounds.none;
public Sortf unitSort = Unit::dst2; public Sortf unitSort = UnitSorts.closest;
protected Vec2 tr = new Vec2(); protected Vec2 tr = new Vec2();
protected Vec2 tr2 = new Vec2(); protected Vec2 tr2 = new Vec2();
@@ -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;
build.tile = emptyTile;
build.update();
}
@Override @Override
public ItemStack[] requirements(){ public ItemStack[] requirements(){
return build.block.requirements; return build.block.requirements;
@@ -80,7 +90,12 @@ 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 -> z >= Layer.flyingUnitLow ? z : 0.0011f + Mathf.clamp(z, prevZ - 0.001f, prevZ + 0.9f));
build.tile = emptyTile;
build.payloadDraw();
Draw.zTransform();
Draw.z(prevZ);
} }
@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 && (
(payload.block().hasLiquids && payload.build.liquids.total() >= payload.block().liquidCapacity - 0.001f) || exporting ||
(payload.block().hasItems && (payload.block().hasLiquids && liquids.total() >= 0.1f && payload.build.liquids.total() >= payload.block().liquidCapacity - 0.001f) ||
payload.block().separateItemCapacity ? (payload.block().hasItems && items.any() && payload.block().separateItemCapacity && content.items().contains(i -> payload.build.items.get(i) >= payload.block().itemCapacity)));
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,44 +55,122 @@ 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;
Item item = null;
boolean any = false; boolean any = false;
if(rotations == null || rotations.length != proximity.size){ int itemslength = content.items().size;
rotations = new int[proximity.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());
}
} }
for(int i = 0; i < proximity.size; i++){ if(sortItem != null){
int pos = (offset + i) % proximity.size; item = sortItem;
var other = proximity.get(pos);
if(other.interactable(team) && other.block.unloadable && other.canUnload() && other.block.hasItems for(int j = 0; j < proximity.size; j++){
&& ((sortItem == null && other.items.total() > 0) || (sortItem != null && other.items.has(sortItem)))){ int pos = (offset + j) % proximity.size;
//make sure the item can't be dumped back into this block var other = proximity.get(j);
dumpingTo = other; boolean interactable = other.interactable(team);
//get item to be taken //set the stats of all buildings in possibleBlocks
Item item = sortItem == null ? other.items.takeIndex(rotations[pos]) : sortItem; 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);
//remove item if it's dumped correctly for(int j = 0; j < proximity.size; j++){
if(put(item)){ int pos = (offset + j) % proximity.size;
other.items.remove(item, 1); var other = proximity.get(j);
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);
}
//sort so it gives full priority to blocks that can give but not receive (stackConveyors and Storage), and then by load
possibleBlocks.sort(Structs.comps(
Structs.comparingBool(e -> e.building.block.highUnloadPriority),
Structs.comparingFloat(e -> e.loadFactor)
));
ContainerStat dumpingFrom = null;
ContainerStat dumpingTo = null;
//choose the building to accept the item
for(int i = 0; i < possibleBlocks.size; i++){
if(possibleBlocks.get(i).canLoad){
dumpingTo = possibleBlocks.get(i);
break;
}
}
//choose the building to give the item
for(int i = possibleBlocks.size - 1; i >= 0; i--){
if(possibleBlocks.get(i).canUnload){
dumpingFrom = possibleBlocks.get(i);
break;
}
}
//trade the items
if(dumpingFrom != null && dumpingTo != null && (dumpingFrom.loadFactor != dumpingTo.loadFactor || dumpingFrom.building.block.highUnloadPriority)){
dumpingTo.building.handleItem(this, item);
dumpingFrom.building.removeStack(item, 1);
any = true; any = true;
if(sortItem == null){
rotations[pos] = item.id + 1;
} }
other.itemTaken(item); if(sortItem == null) rotations = item.id;
}else if(sortItem == null){
rotations[pos] = other.items.nextIndex(rotations[pos]);
}
}
} }
if(any){ if(any){
@@ -101,11 +180,10 @@ public class Unloader extends Block{
} }
if(proximity.size > 0){ if(proximity.size > 0){
offset ++; offset++;
offset %= proximity.size; offset %= proximity.size;
} }
} }
}
@Override @Override
public void draw(){ public void draw(){
@@ -118,7 +196,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 +210,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;

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