Compare commits

..

122 Commits
v126 ... v126.2

Author SHA1 Message Date
OSP
afbac48a45 Change ip hub (#5014)
transition to new hosting
2021-03-29 09:38:56 -04:00
liuxilu
e7d9cddbae update zh-CN for logic hints (#4655)
* add new logic hints to zh-CN

* logic hints for zh-CN completed

* more hints and fix

* draw operations

* update command hint

* 载荷

* up to d7f848f
2021-03-28 18:44:29 -04:00
YellOw139
a6fe1275c7 [Bundle][RO] Update (#4860)
* [Bundle][RO] Update

This PR ~~was~~ will soon be tested in-game ~~and is ready to merge at any time~~.

Changelog:

- New strings/changes up to commit b75a8d5260
- Typo fixes & various other improvements

* Status effects

* Minor change

* Improve, adapt

* After test bundles be like

* cleanup

* typo

* options, options...

* Added block_info keybind name
2021-03-28 18:42:50 -04:00
Prosta4okua
2f3fd9de3b [Bundle][uk_UA] Update Ukrainian (#4868)
* Update bundle_uk_UA.properties

* Update bundle_uk_UA.properties

03.06.2021

* Update bundle_uk_UA.properties

* Update bundle_uk_UA.properties

* Update bundle_uk_UA.properties

* Update bundle_uk_UA.properties
2021-03-28 18:42:41 -04:00
MEEP of Faith
8b2e78ab1e maxRange overriding on laser bulllets (#4873) 2021-03-28 18:42:26 -04:00
Catchears
d04eaa81e0 german translation (#4897)
* update german translation to b75a8d5260

* update german translation to 8e52d8a272

* foreshadow improvements

* block info keybind
2021-03-28 18:41:06 -04:00
cinnx
b71d5837e9 Update bundle_pl.properties (#4910)
Added missing part of the translation from the English bundle file, fixed a lot of typos.

Huge thanks to:
Somka#9325
count sudoku#9564
Zielony Trójkąt#9074
for pointing out those errors :D
2021-03-28 18:40:55 -04:00
MEEP of Faith
332b1ce100 collidesGround targetting in GroundAI (#4911) 2021-03-28 18:40:47 -04:00
Vanguard
c17040b1ab [Bundle][RU] Update (#4927)
* 21 new, 4 changed, 4 deleted

New:
status.burning.name
status.freezing.name
status.wet.name
status.muddy.name
status.melting.name
status.sapped.name
status.spore-slowed.name
status.tarred.name
status.overclock.name
status.shocked.name
status.blasted.name
status.unmoving.name
stat.opposites
stat.damagemultiplier
stat.healthmultiplier
stat.speedmultiplier
stat.reloadmultiplier
stat.buildspeedmultiplier
stat.reactive
bullet.lightning
content.status.name

Changed:
wavemode.health
boss.health
rules.blockhealthmultiplier
rules.unithealthmultiplier

Deleted:
bullet.sapping
bullet.shock
bullet.freezing
bullet.tarred

* 1 new line

keybind.block_info.name
2021-03-28 18:38:50 -04:00
Sharlotte
a3bd7ba3ad [KO]Update Bundle (#4935) 2021-03-28 18:38:44 -04:00
MEEP of Faith
2a7525cdf1 Allow for dynamic counting (#4988) 2021-03-28 18:38:16 -04:00
AzCraft
43602caab2 Added Bulgarian translations. [bundle_bg.properties] (#5013) 2021-03-28 09:42:37 -04:00
RebornTrack970
793e957d0d OmegaHub Updated (#5011)
Moved Annexation and Rush from Minecraft hosting to Mindustry host and improved ping.
Added Castle Wars by Xusx.
2021-03-28 09:42:03 -04:00
Anuken
66594a2b32 Fixed #5012 2021-03-28 09:41:08 -04:00
Anuken
e81219dd3e Merge remote-tracking branch 'origin/master' 2021-03-27 22:12:54 -04:00
Anuken
d11a26c568 Pack effect icons in UI spritesheet 2021-03-27 22:12:47 -04:00
Skat
cf3543ec07 Change int parameters to long type (#5008) 2021-03-27 17:38:55 -04:00
Valeriy
886d8752b7 Update servers_v6.json (#4753) 2021-03-27 16:45:52 -04:00
fuzzbuck
496d6b139e Update servers_v6.json (#5003)
TLD change
2021-03-26 20:30:42 -04:00
Darkness6030
3ce064ca11 Update mindurka ip (#5002)
Mindurka.ru come back!)
[RU]Заспидранил восстановление сервера с нуля за один день!) Гений мысли...
2021-03-26 14:17:48 -04:00
Anuken
1be7f3b36c Merge remote-tracking branch 'origin/master' 2021-03-26 10:13:46 -04:00
Anuken
3fddd6eea7 .size 2021-03-26 10:13:42 -04:00
CxZxRainzz
339fc8113b Shutting down CxZx (#4996)
* Shutting down CxZx

I shutting down the servers because of family issues i hope to rejoin the community later

* Update servers_v6.json

Co-authored-by: Joshua Fan <joshuaptfan@gmail.com>

Co-authored-by: Joshua Fan <joshuaptfan@gmail.com>
2021-03-25 23:00:37 -04:00
Anuken
025bf5ffc3 Merge remote-tracking branch 'origin/master' 2021-03-25 22:42:01 -04:00
Anuken
1dc2906343 Fixed #4997 2021-03-25 22:41:55 -04:00
L0615T1C5-216AC-9437
eea276118f Add more ports for Chaotic Neutral (#4981) 2021-03-25 16:33:12 -04:00
Anuken
36aa9d5696 Fixed #4994 2021-03-25 13:51:13 -04:00
Anuken
1fc1efc410 Merge remote-tracking branch 'origin/master' 2021-03-25 12:51:31 -04:00
Anuken
7924d9b9ef Fixed #4993 2021-03-25 12:51:24 -04:00
Patrick 'Quezler' Mounier
3336e6cdde Exclude derelict targets from Units.bestEnemy (#4990) 2021-03-25 09:52:35 -04:00
MEEP of Faith
4ec81b0669 Make Repair Points affected by overdrive (#4985) 2021-03-24 19:09:20 -04:00
Anuken
d10123295c More pattern variables 2021-03-24 12:55:57 -04:00
Anuken
0929593efc Buildscript cleanup 2021-03-24 12:41:50 -04:00
way-zer
ace6eed653 Add assetsJar artifact for core (#4983)
* Add assetsJar artifact for core

* Add musicJar artifact for core
2021-03-24 12:38:02 -04:00
키에르
a40731624a Add uuid return to PlayerBanEvent (#4982)
* Update EventType.java

* Update Administration.java
2021-03-24 10:02:21 -04:00
VizardAlpha
268672adb8 Update bundle_fr.properties (#4973)
* Update bundle_fr.properties

Minor correction on the translation.
Addition of commits validated in the translation of Mar 10, 2021 ...

* Update bundle_fr.properties

* Update bundle_fr.properties

* Update bundle_fr.properties
2021-03-23 13:03:23 -04:00
Patrick 'Quezler' Mounier
af20db4cf7 Colorize the inner corners of other conduit sprites (#4978) 2021-03-23 09:44:09 -04:00
OSP
8a76e7ea25 Add Mindustry.Defense to global server list (#4960) 2021-03-23 09:23:12 -04:00
Anuken
d72db58b3f Minor ConstructBlock logic tweak 2021-03-22 17:02:09 -04:00
Anuken
975043d439 Use more ping threads 2021-03-22 12:47:02 -04:00
Anuken
40b5ee391d Merge remote-tracking branch 'origin/master' 2021-03-22 11:32:44 -04:00
Anuken
e87e678d0f Use AsyncExecutor for pings 2021-03-22 11:32:36 -04:00
Susideur-YT
d098a9ddc2 Just some change in frensh (#4862) 2021-03-22 10:20:30 -04:00
Joshua Fan
7145ffaf28 Add block info keybind (#4284)
* Add block info keybind

* Change block info keybind to backtick

* Change block info keybind to F1
2021-03-21 14:08:53 -04:00
彭瑞暄
d4afc3ecde Large Update & Sync (#4968) 2021-03-20 21:02:44 -04:00
MEEP of Faith
1ecc49f9b7 Use continuous damage (#4966) 2021-03-20 08:38:17 -04:00
Anuken
7ffd46aee9 #4964 2021-03-19 14:36:25 -04:00
Anuken
afd6570ced More floor render optimization 2021-03-18 22:18:21 -04:00
Anuken
49c099a03c Minor floor renderer optimization 2021-03-18 21:55:33 -04:00
Anuken
851fa09e0c More dispose() cleanup 2021-03-18 16:29:40 -04:00
Anuken
b0c8426d0f arc 2021-03-18 16:16:28 -04:00
Anuken
9384d661c1 Removed unnecessary dispose() 2021-03-18 16:14:53 -04:00
Anuken
a06e0a325b Kill Android app on exit (Arc) 2021-03-18 15:39:26 -04:00
Anuken
a8c31d838f Mesh attribute cleanup 2021-03-18 15:18:59 -04:00
Anuken
46cf48e012 Reverted IntelliJ's "cleanup" 2021-03-18 12:58:57 -04:00
Anuken
bfa9d65314 Ban player ID before IP 2021-03-18 12:57:27 -04:00
Anuken
aa7936100e Merge remote-tracking branch 'origin/master' 2021-03-17 20:53:09 -04:00
Anuken
b20ef104b9 Fixed #4952 2021-03-17 20:53:04 -04:00
Anuken
53b99a650c Update Damage.java 2021-03-17 19:32:32 -04:00
Anuken
2025d6ad2d Merge remote-tracking branch 'origin/master' 2021-03-17 17:40:14 -04:00
Anuken
c7cbe50876 More misc cleanup 2021-03-17 17:39:50 -04:00
Darkness6030
267d822771 Change mindurka's ip address (#4939)
I've changed ip address of Mindurka.ru
2021-03-17 09:16:30 -04:00
Anuken
786d638ad0 Misc cleanup 2021-03-16 21:51:12 -04:00
Anuken
89997ad8d4 Merge remote-tracking branch 'origin/master' 2021-03-16 21:29:22 -04:00
Anuken
036ab282e0 Update bug_report.md 2021-03-16 18:26:19 -04:00
Anuken
e9df213d0a Decreased sector damage check radius 2021-03-16 18:25:30 -04:00
Anuken
150aab3530 Server crash fix / Disabled logic config sync / Faster logic parsing 2021-03-15 17:13:27 -04:00
Anuken
96607ef753 Non-recursive door floodfill 2021-03-15 11:39:06 -04:00
Anuken
075ddf104b Merge remote-tracking branch 'origin/master' 2021-03-13 20:01:14 -05:00
Anuken
671ca5c94f Disabled logicUnitBuild on servers by default 2021-03-13 20:01:01 -05:00
CxZxRainzz
e7ed7c0765 Update servers_v6.json (#4933)
Remove 1 server and add another
2021-03-13 09:13:53 -05:00
Anuken
92db8349dc Don't log irrelevant payload errors 2021-03-12 18:31:41 -05:00
Anuken
ea3f6cf4a0 PowerNode link cleanup & bugfixes 2021-03-12 13:38:28 -05:00
Anuken
dd191493c0 Merge remote-tracking branch 'origin/master' 2021-03-12 13:16:39 -05:00
Anuken
2c08b82fef Fixed blocks linking through insulated walls 2021-03-12 13:16:35 -05:00
thedimas3007
f7c5315599 Update servers_v6.json (#4834)
* Update servers_v6.json

* missing `,`

Co-authored-by: Кусь Пчелов <srthmnt@gmail.com>
Co-authored-by: Anuken <arnukren@gmail.com>
2021-03-12 09:49:30 -05:00
Noah van der Aa
ad6e458636 Add mindustry.party server to server list. (#4926) 2021-03-12 09:48:03 -05:00
Anuken
f04e763667 Merge remote-tracking branch 'origin/master' 2021-03-12 09:35:37 -05:00
Anuken
d545dc0d02 Logic negative coordinate support 2021-03-12 09:35:32 -05:00
Sunny Kim
f895dfe341 dragMultiplier for status effects (#4870) 2021-03-11 18:41:03 -05:00
Anuken
c5bea40e7d Votekick cleanup 2021-03-11 16:55:00 -05:00
TranquillyUnpleasant
e08052d7d6 Votekick edit (#4924)
* Add "yes" and "no" compatibility to votekicks

* Lowercase
2021-03-11 16:54:10 -05:00
Anuken
78a7d15f3e Merge remote-tracking branch 'origin/master' 2021-03-11 10:53:01 -05:00
Anuken
b2e2cfb48d Log client commands before handling 2021-03-11 10:52:53 -05:00
BasedUser
f694e42c78 Add mindustry.ru to global server list (#4697) 2021-03-10 20:52:57 -05:00
Anuken
8e52d8a272 Stat reactivity cleanup 2021-03-10 17:34:39 -05:00
Anuken
1a6843ef2c Re-added unused corroded effect to ensure compatibility 2021-03-10 17:15:18 -05:00
Anuken
4b9fa9a79e Status effect display for bullets 2021-03-10 16:42:28 -05:00
Anuken
c15a8b52d2 Status sprites 2021-03-10 16:22:35 -05:00
Anuken
bd36ca821d Improvements of status effects in database 2021-03-10 16:22:07 -05:00
MEEP of Faith
d4e6817232 Boosting Rise Speed (#4918) 2021-03-10 13:48:33 -05:00
genNAowl
096b54305d Add Status Effect Stats to Core Database (#4883)
* Status Effect Stats

* import cleanup

* Add Sk7725's icons

Tinting still a WIP

Co-authored-by: Leonwang4234 <62972692+Leonwang4234@users.noreply.github.com>
2021-03-10 12:04:09 -05:00
RebornTrack970
8b52561a31 Added the Expansion gamemode to Omega Hub (#4913) 2021-03-10 09:38:56 -05:00
Anuken
b1e8001ae8 Minor cleanup 2021-03-09 19:04:29 -05:00
Anuken
8aba480148 Merge remote-tracking branch 'origin/master' 2021-03-09 15:52:29 -05:00
Anuken
429ff738f9 Error on unknown jump locations 2021-03-09 15:51:36 -05:00
Anuken
ae2736d393 New logic parser 2021-03-09 15:47:19 -05:00
Niels Horn
fc28fbc662 Translate the entire bundle into Danish. (#4900)
* Translate the entire bundle into Danish.

There were close to no existing translations of Mindustry in Danish, and the ones there were had concord issues, spelling issues or contained a mix of Danish and English.
This pull-request provides a thourough translation, covering all names - unit names have remained mostly the same, - as well as tutorials and descriptions.

A collaborative effort with @AsgerHB.

* Update contributors
2021-03-09 09:56:22 -05:00
Anuken
4f37f29ae8 progress 2021-03-09 09:51:37 -05:00
MEEP of Faith
c4da670a7c do not the multi charge (#4905) 2021-03-08 19:14:04 -05:00
Anuken
57dca33c2b Merge branch 'master' into new-logic-parser
# Conflicts:
#	gradle.properties
2021-03-08 18:03:00 -05:00
Anuken
4a1419af0e Merge remote-tracking branch 'origin/master' 2021-03-08 17:12:56 -05:00
Anuken
25c61590d1 Minor cleanup / Another slight vela buff 2021-03-08 17:12:53 -05:00
CxZxRainzz
f6925953ad Update servers_v6.json (#4901)
add PvP server for CxZx
2021-03-08 15:05:26 -05:00
Anuken
e1b0e07f3c Return 1 for sensing dead in null objects 2021-03-08 09:52:36 -05:00
Anuken
b2d16f69da Merge remote-tracking branch 'origin/master' 2021-03-07 17:54:47 -05:00
Anuken
a60772a81e Fixed #4891 2021-03-07 17:54:43 -05:00
buthed010203
6151ebf716 Fix button background (#4892)
This button had a black background which stuck out from everything else on the page, this fixes that.
2021-03-07 16:35:04 -05:00
Anuken
cccb8d6d19 Fixed #4890 2021-03-07 15:45:28 -05:00
Anuken
a2c7c38a3e Reduced Nova range 2021-03-07 09:32:52 -05:00
Anuken
b51d34e893 Fixed #4882 2021-03-06 17:25:03 -05:00
Anuken
79a62cd74c Merge remote-tracking branch 'origin/master' 2021-03-06 14:23:14 -05:00
Anuken
18c669ae3e Fixed #4879 / Fixed server speed validation check 2021-03-06 14:23:10 -05:00
buthed010203
8474c921ec Fix indentation (#4877)
Indents are 4 spaces not 3
2021-03-06 11:11:17 -05:00
Anuken
7c7c57c64e Various parsing bugfixes 2021-03-06 11:10:32 -05:00
Anuken
f7e8412b4b Fixed #4875 2021-03-06 10:41:31 -05:00
Anuken
0d3be917b2 Extra checks for crash fix 2021-03-06 00:05:15 -05:00
Anuken
5c85ba84db Actual JSON weather (?) 2021-03-05 23:20:19 -05:00
Anuken
07d11f02d8 Fixed #4869 2021-03-05 22:16:29 -05:00
Anuken
fce30e6ae5 Sync based on system time 2021-03-05 17:22:44 -05:00
Anuken
315cbaec47 progress 2021-01-05 11:17:20 -05:00
Anuken
68535bfcaa progress 2021-01-03 16:21:17 -05:00
135 changed files with 4528 additions and 1941 deletions

View File

@@ -17,7 +17,7 @@ assignees: ''
**Link(s) to mod(s) used**: *The mod repositories or zip files that are related to the issue, if applicable.* **Link(s) to mod(s) used**: *The mod repositories or zip files that are related to the issue, if applicable.*
**Save file**: *The (zipped) save file you were playing on when the bug happened. THIS IS REQUIRED FOR ANY ISSUE HAPPENING IN-GAME OR IN MULTIPLAYER, REGARDLESS OF WHETHER YOU THINK IT HAPPENS EVERYWHERE. DO NOT DELETE OR OMIT THIS LINE UNLESS YOU ARE SURE THAT THE ISSUE DOES NOT HAPPEN IN-GAME.* **Save file**: *The (zipped) save file you were playing on when the bug happened. THIS IS REQUIRED FOR ANY ISSUE HAPPENING IN-GAME OR IN MULTIPLAYER, REGARDLESS OF WHETHER YOU THINK IT HAPPENS EVERYWHERE. DO NOT DELETE OR OMIT THIS LINE UNLESS YOU ARE SURE THAT THE ISSUE DOES NOT HAPPEN IN-GAME. IF YOU DO NOT HAVE A SAVE, DON'T WASTE TIME OPENING THIS ISSUE.*
If you remove the line above without reading it properly and understanding what it means, I will reap your soul. Even if you're playing on someone's server, you can still save the game to a slot. If you remove the line above without reading it properly and understanding what it means, I will reap your soul. Even if you're playing on someone's server, you can still save the game to a slot.

View File

@@ -44,7 +44,6 @@ public class AndroidLauncher extends AndroidApplication{
if(handler != null){ if(handler != null){
handler.uncaughtException(thread, error); handler.uncaughtException(thread, error);
}else{ }else{
error.printStackTrace();
Log.err(error); Log.err(error);
System.exit(1); System.exit(1);
} }

View File

@@ -117,7 +117,6 @@ public class AssetsProcess extends BaseProcessor{
void processSounds(String classname, String path, String rtype) throws Exception{ void processSounds(String classname, String path, String rtype) throws Exception{
TypeSpec.Builder type = TypeSpec.classBuilder(classname).addModifiers(Modifier.PUBLIC); TypeSpec.Builder type = TypeSpec.classBuilder(classname).addModifiers(Modifier.PUBLIC);
MethodSpec.Builder dispose = MethodSpec.methodBuilder("dispose").addModifiers(Modifier.PUBLIC, Modifier.STATIC);
MethodSpec.Builder loadBegin = MethodSpec.methodBuilder("load").addModifiers(Modifier.PUBLIC, Modifier.STATIC); MethodSpec.Builder loadBegin = MethodSpec.methodBuilder("load").addModifiers(Modifier.PUBLIC, Modifier.STATIC);
HashSet<String> names = new HashSet<>(); HashSet<String> names = new HashSet<>();
@@ -137,8 +136,6 @@ public class AssetsProcess extends BaseProcessor{
String filename = "\"" + filepath + "\""; String filename = "\"" + filepath + "\"";
loadBegin.addStatement("arc.Core.assets.load(" + filename + ", " + rtype + ".class).loaded = a -> " + name + " = (" + rtype + ")a", filepath, filepath.replace(".ogg", ".mp3")); loadBegin.addStatement("arc.Core.assets.load(" + filename + ", " + rtype + ".class).loaded = a -> " + name + " = (" + rtype + ")a", filepath, filepath.replace(".ogg", ".mp3"));
dispose.addStatement("arc.Core.assets.unload(" + filename + ")");
dispose.addStatement(name + " = null");
type.addField(FieldSpec.builder(ClassName.bestGuess(rtype), name, Modifier.STATIC, Modifier.PUBLIC).initializer("new arc.audio." + rtype.substring(rtype.lastIndexOf(".") + 1) + "()").build()); type.addField(FieldSpec.builder(ClassName.bestGuess(rtype), name, Modifier.STATIC, Modifier.PUBLIC).initializer("new arc.audio." + rtype.substring(rtype.lastIndexOf(".") + 1) + "()").build());
}); });
@@ -147,7 +144,6 @@ public class AssetsProcess extends BaseProcessor{
} }
type.addMethod(loadBegin.build()); type.addMethod(loadBegin.build());
type.addMethod(dispose.build());
JavaFile.builder(packageName, type.build()).build().writeTo(BaseProcessor.filer); JavaFile.builder(packageName, type.build()).build().writeTo(BaseProcessor.filer);
} }

View File

@@ -26,7 +26,8 @@ public class LogicStatementProcessor extends BaseProcessor{
MethodSpec.Builder reader = MethodSpec.methodBuilder("read") MethodSpec.Builder reader = MethodSpec.methodBuilder("read")
.addModifiers(Modifier.PUBLIC, Modifier.STATIC) .addModifiers(Modifier.PUBLIC, Modifier.STATIC)
.returns(tname("mindustry.logic.LStatement")) .returns(tname("mindustry.logic.LStatement"))
.addParameter(String[].class, "tokens"); .addParameter(String[].class, "tokens")
.addParameter(int.class, "length");
Seq<Stype> types = types(RegisterStatement.class); Seq<Stype> types = types(RegisterStatement.class);
@@ -76,7 +77,7 @@ public class LogicStatementProcessor extends BaseProcessor{
""); "");
//reading primitives, strings and enums is supported; nothing else is //reading primitives, strings and enums is supported; nothing else is
reader.addStatement("if(tokens.length > $L) result.$L = $L(tokens[$L])", reader.addStatement("if(length > $L) result.$L = $L(tokens[$L])",
index + 1, index + 1,
field.name(), field.name(),
field.mirror().toString().equals("java.lang.String") ? field.mirror().toString().equals("java.lang.String") ?

View File

@@ -319,12 +319,27 @@ project(":core"){
} }
task sourcesJar(type: Jar, dependsOn: classes){ task sourcesJar(type: Jar, dependsOn: classes){
classifier = 'sources' archiveClassifier = 'sources'
from sourceSets.main.allSource from sourceSets.main.allSource
} }
task assetsJar(type: Jar, dependsOn: ":tools:pack"){
archiveClassifier = 'assets'
from files("assets"){
exclude "config", "cache", "music", "sounds"
}
}
task musicJar(type: Jar){
archiveClassifier = 'music'
from files("assets"){
include "music/*", "sounds/*"
}
}
artifacts{ artifacts{
archives sourcesJar archives sourcesJar
archives assetsJar
} }
dependencies{ dependencies{

Binary file not shown.

Before

Width:  |  Height:  |  Size: 178 B

After

Width:  |  Height:  |  Size: 1.2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 499 B

After

Width:  |  Height:  |  Size: 2.0 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 420 B

After

Width:  |  Height:  |  Size: 1.7 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 405 B

After

Width:  |  Height:  |  Size: 1.8 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 382 B

After

Width:  |  Height:  |  Size: 2.2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 353 B

After

Width:  |  Height:  |  Size: 2.0 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 339 B

After

Width:  |  Height:  |  Size: 2.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 298 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 276 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 324 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 343 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 329 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 304 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 286 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 387 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 387 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 274 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 232 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 274 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 322 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 286 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 197 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 283 B

View File

@@ -620,6 +620,19 @@ sector.extractionOutpost.description = A remote outpost, constructed by the enem
sector.impact0078.description = Here lie remnants of the interstellar transport vessel that first entered this system.\n\nSalvage as much as possible from the wreckage. Research any intact technology. sector.impact0078.description = Here lie remnants of the interstellar transport vessel that first entered this system.\n\nSalvage as much as possible from the wreckage. Research any intact technology.
sector.planetaryTerminal.description = The final target.\n\nThis coastal base contains a structure capable of launching Cores to local planets. It is extremely well guarded.\n\nProduce naval units. Eliminate the enemy as quickly as possible. Research the launch structure. sector.planetaryTerminal.description = The final target.\n\nThis coastal base contains a structure capable of launching Cores to local planets. It is extremely well guarded.\n\nProduce naval units. Eliminate the enemy as quickly as possible. Research the launch structure.
status.burning.name = Burning
status.freezing.name = Freezing
status.wet.name = Wet
status.muddy.name = Muddy
status.melting.name = Melting
status.sapped.name = Sapped
status.spore-slowed.name = Spore Slowed
status.tarred.name = Tarred
status.overclock.name = Overclock
status.shocked.name = Shocked
status.blasted.name = Blasted
status.unmoving.name = Unmoving
settings.language = Language settings.language = Language
settings.data = Game Data settings.data = Game Data
settings.reset = Reset to Defaults settings.reset = Reset to Defaults
@@ -656,6 +669,7 @@ stat.output = Output
stat.booster = Booster stat.booster = Booster
stat.tiles = Required Tiles stat.tiles = Required Tiles
stat.affinities = Affinities stat.affinities = Affinities
stat.opposites = Opposites
stat.powercapacity = Power Capacity stat.powercapacity = Power Capacity
stat.powershot = Power/Shot stat.powershot = Power/Shot
stat.damage = Damage stat.damage = Damage
@@ -717,6 +731,12 @@ stat.abilities = Abilities
stat.canboost = Can Boost stat.canboost = Can Boost
stat.flying = Flying stat.flying = Flying
stat.ammouse = Ammo Use stat.ammouse = Ammo Use
stat.damagemultiplier = Damage Multiplier
stat.healthmultiplier = Health Multiplier
stat.speedmultiplier = Speed Multiplier
stat.reloadmultiplier = Reload Multiplier
stat.buildspeedmultiplier = Build Speed Multiplier
stat.reactive = Reacts
ability.forcefield = Force Field ability.forcefield = Force Field
ability.repairfield = Repair Field ability.repairfield = Repair Field
@@ -752,17 +772,14 @@ units.processorcontrol = [lightgray]Processor Controlled
bullet.damage = [stat]{0}[lightgray] damage bullet.damage = [stat]{0}[lightgray] damage
bullet.splashdamage = [stat]{0}[lightgray] area dmg ~[stat] {1}[lightgray] tiles bullet.splashdamage = [stat]{0}[lightgray] area dmg ~[stat] {1}[lightgray] tiles
bullet.incendiary = [stat]incendiary bullet.incendiary = [stat]incendiary
bullet.sapping = [stat]sapping
bullet.homing = [stat]homing bullet.homing = [stat]homing
bullet.shock = [stat]shock
bullet.frag = [stat]frag bullet.frag = [stat]frag
bullet.lightning = [stat]{0}[lightgray]x lightning ~[stat]{1}[lightgray] damage
bullet.buildingdamage = [stat]{0}%[lightgray] building damage bullet.buildingdamage = [stat]{0}%[lightgray] building damage
bullet.knockback = [stat]{0}[lightgray] knockback bullet.knockback = [stat]{0}[lightgray] knockback
bullet.pierce = [stat]{0}[lightgray]x pierce bullet.pierce = [stat]{0}[lightgray]x pierce
bullet.infinitepierce = [stat]pierce bullet.infinitepierce = [stat]pierce
bullet.healpercent = [stat]{0}[lightgray]% healing bullet.healpercent = [stat]{0}[lightgray]% healing
bullet.freezing = [stat]freezing
bullet.tarred = [stat]tarred
bullet.multiplier = [stat]{0}[lightgray]x ammo multiplier bullet.multiplier = [stat]{0}[lightgray]x ammo multiplier
bullet.reload = [stat]{0}[lightgray]x fire rate bullet.reload = [stat]{0}[lightgray]x fire rate
@@ -924,6 +941,7 @@ keybind.pause_building.name = Pause/Resume Building
keybind.minimap.name = Minimap keybind.minimap.name = Minimap
keybind.planet_map.name = Planet Map keybind.planet_map.name = Planet Map
keybind.research.name = Research keybind.research.name = Research
keybind.block_info.name = Block Info
keybind.chat.name = Chat keybind.chat.name = Chat
keybind.player_list.name = Player List keybind.player_list.name = Player List
keybind.console.name = Console keybind.console.name = Console
@@ -992,6 +1010,7 @@ content.item.name = Items
content.liquid.name = Liquids content.liquid.name = Liquids
content.unit.name = Units content.unit.name = Units
content.block.name = Blocks content.block.name = Blocks
content.status.name = Status Effects
content.sector.name = Sectors content.sector.name = Sectors
item.copper.name = Copper item.copper.name = Copper

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@@ -126,6 +126,7 @@ mod.installed = [[Installiert]
mod.display = [gray]Mod:[orange] {0} mod.display = [gray]Mod:[orange] {0}
mod.enabled = [lightgray]Aktiviert mod.enabled = [lightgray]Aktiviert
mod.disabled = [scarlet]Deaktiviert mod.disabled = [scarlet]Deaktiviert
mod.multiplayer.compatible = [gray]Mehrspieler-kompatibel
mod.disable = Deaktivieren mod.disable = Deaktivieren
mod.content = Inhalt: mod.content = Inhalt:
mod.delete.error = Unfähig Mod zu löschen. Datei könnte in Benutzung sein. mod.delete.error = Unfähig Mod zu löschen. Datei könnte in Benutzung sein.
@@ -619,6 +620,19 @@ sector.extractionOutpost.description = Ein Außenposten, der vom Gegner erstellt
sector.impact0078.description = Hier liegen Reste der interplanetarischen Transporteinheit, die dieses Sonnensystem zuerst betreten hat.\n\nRette so viel wie möglich von den Ruinen. Erforsche jede intakte Technologie. sector.impact0078.description = Hier liegen Reste der interplanetarischen Transporteinheit, die dieses Sonnensystem zuerst betreten hat.\n\nRette so viel wie möglich von den Ruinen. Erforsche jede intakte Technologie.
sector.planetaryTerminal.description = Das Endziel.\n\nDiese Uferbasis besitzt ein Gerät, mit dem es möglich ist, Kerne auf andere Planeten zu schicken. Es ist [accent]sehr[] gut beschützt.\n\nStelle Wassereinheiten her. Eliminiere den Gegner so schnell wie möglich. Erforsche das Launchgerät. sector.planetaryTerminal.description = Das Endziel.\n\nDiese Uferbasis besitzt ein Gerät, mit dem es möglich ist, Kerne auf andere Planeten zu schicken. Es ist [accent]sehr[] gut beschützt.\n\nStelle Wassereinheiten her. Eliminiere den Gegner so schnell wie möglich. Erforsche das Launchgerät.
status.burning.name = Brennend
status.freezing.name = Frierend
status.wet.name = Nass
status.muddy.name = Schlammig
status.melting.name = Schmelzend
status.sapped.name = Schwächend
status.spore-slowed.name = Sporen-verlangsamt
status.tarred.name = Teerend
status.overclock.name = Übertaktend
status.shocked.name = Schockend
status.blasted.name = Sprengend
status.unmoving.name = Unbeweglich
settings.language = Sprache settings.language = Sprache
settings.data = Spieldaten settings.data = Spieldaten
settings.reset = Auf Standard zurücksetzen settings.reset = Auf Standard zurücksetzen
@@ -655,6 +669,7 @@ stat.output = Ausgang
stat.booster = Verstärkung stat.booster = Verstärkung
stat.tiles = Erforderte Untergründe stat.tiles = Erforderte Untergründe
stat.affinities = Affinitäten stat.affinities = Affinitäten
stat.opposites = Gegenteile
stat.powercapacity = Kapazität stat.powercapacity = Kapazität
stat.powershot = Stromverbrauch/Schuss stat.powershot = Stromverbrauch/Schuss
stat.damage = Schaden stat.damage = Schaden
@@ -716,6 +731,12 @@ stat.abilities = Fähigkeiten
stat.canboost = Kann boosten stat.canboost = Kann boosten
stat.flying = Flug stat.flying = Flug
stat.ammouse = Muntionsverbrauch stat.ammouse = Muntionsverbrauch
stat.damagemultiplier = Schaden-Multiplikator
stat.healthmultiplier = Lebenspunkte-Multiplikator
stat.speedmultiplier = Geschwindigkeit-Multiplikator
stat.reloadmultiplier = Nachlade-Multiplikator
stat.buildspeedmultiplier = Baugeschwindigkeit-Multiplikator
stat.reactive = Reagiert mit
ability.forcefield = Kraftfeld ability.forcefield = Kraftfeld
ability.repairfield = Heilungsfeld ability.repairfield = Heilungsfeld
@@ -752,16 +773,13 @@ bullet.damage = [stat]{0}[lightgray] Schaden
bullet.splashdamage = [stat]{0}[lightgray] Flächenschaden ~[stat] {1}[lightgray] Kacheln bullet.splashdamage = [stat]{0}[lightgray] Flächenschaden ~[stat] {1}[lightgray] Kacheln
bullet.incendiary = [stat]entzündend bullet.incendiary = [stat]entzündend
bullet.homing = [stat]zielsuchend bullet.homing = [stat]zielsuchend
bullet.sapping = [stat]entzieht Lebenspunkte
bullet.shock = [stat]schockend
bullet.frag = [stat]explosiv bullet.frag = [stat]explosiv
bullet.lightning = [stat]{0}[lightgray]x Blitz ~[stat]{1}[lightgray] Schaden
bullet.buildingdamage = [stat]{0}%[lightgray]Blockschaden bullet.buildingdamage = [stat]{0}%[lightgray]Blockschaden
bullet.knockback = [stat]{0}[lightgray] zurückstoßend bullet.knockback = [stat]{0}[lightgray] zurückstoßend
bullet.pierce = [stat]{0}[lightgray]x Durchstechkraft bullet.pierce = [stat]{0}[lightgray]x Durchstechkraft
bullet.infinitepierce = [stat]Durchstechkraft bullet.infinitepierce = [stat]Durchstechkraft
bullet.freezing = [stat]frierend
bullet.healpercent = [stat]{0}[lightgray]% Heilung bullet.healpercent = [stat]{0}[lightgray]% Heilung
bullet.tarred = [stat]teerend
bullet.multiplier = [stat]{0}[lightgray]x Munition Multiplikator bullet.multiplier = [stat]{0}[lightgray]x Munition Multiplikator
bullet.reload = [stat]{0}[lightgray]x Feuerrate bullet.reload = [stat]{0}[lightgray]x Feuerrate
@@ -923,6 +941,7 @@ keybind.pause_building.name = Pausieren/Fortsetzen des Bauens
keybind.minimap.name = Minimap keybind.minimap.name = Minimap
keybind.planet_map.name = Planetenkarte keybind.planet_map.name = Planetenkarte
keybind.research.name = Forschen keybind.research.name = Forschen
keybind.block_info.name = Blockinformationen anzeigen
keybind.chat.name = Chat keybind.chat.name = Chat
keybind.player_list.name = Spielerliste keybind.player_list.name = Spielerliste
keybind.console.name = Konsole keybind.console.name = Konsole
@@ -991,6 +1010,7 @@ content.item.name = Materialien
content.liquid.name = Flüssigkeiten content.liquid.name = Flüssigkeiten
content.unit.name = Einheiten content.unit.name = Einheiten
content.block.name = Blöcke content.block.name = Blöcke
content.status.name = Effekte
content.sector.name = Sektoren content.sector.name = Sektoren
item.copper.name = Kupfer item.copper.name = Kupfer
@@ -1459,7 +1479,7 @@ block.ripple.description = Schießt mehrere Schüsse gleichzeitig auf weit entfe
block.cyclone.description = Schießt explodierende Geschosse auf Gegner. block.cyclone.description = Schießt explodierende Geschosse auf Gegner.
block.spectre.description = Schießt große, panzerbrechende Kugeln auf Luft- und Bodenziele. block.spectre.description = Schießt große, panzerbrechende Kugeln auf Luft- und Bodenziele.
block.meltdown.description = Lädt sich auf und schießt einen starken, durchgängigen Laser auf Gegner. Braucht Kühlung. block.meltdown.description = Lädt sich auf und schießt einen starken, durchgängigen Laser auf Gegner. Braucht Kühlung.
block.foreshadow.description = Schießt einen einzigen Schuss mit einem einzigen Ziel über eine erstaunlich große Distanz. block.foreshadow.description = Schießt einen starken Schuss auf ein einziges Ziel über hohe Distanzen. Zielt auf Gegner mit den meisten Lebenspunkten.
block.repair-point.description = Heilt durchgehend die nächste befreundete, beschädigte Einheit in der Umgebung. block.repair-point.description = Heilt durchgehend die nächste befreundete, beschädigte Einheit in der Umgebung.
block.segment.description = Beschädigt und zerstört gegnerische Projektile. Laser werden nicht anvisiert. block.segment.description = Beschädigt und zerstört gegnerische Projektile. Laser werden nicht anvisiert.
block.parallax.description = Benutzt einen Traktorstrahl, um Gegner heranzuziehen und sie dabei anzugreifen. block.parallax.description = Benutzt einen Traktorstrahl, um Gegner heranzuziehen und sie dabei anzugreifen.

File diff suppressed because it is too large Load Diff

View File

@@ -126,6 +126,7 @@ mod.installed = [[설치됨]
mod.display = [gray]모드:[orange] {0} mod.display = [gray]모드:[orange] {0}
mod.enabled = [lightgray]활성화됨 mod.enabled = [lightgray]활성화됨
mod.disabled = [scarlet]비활성화됨 mod.disabled = [scarlet]비활성화됨
mod.multiplayer.compatible = [gray]멀티플레이어 호환 가능
mod.disable = 비활성화 mod.disable = 비활성화
mod.content = 콘텐츠: mod.content = 콘텐츠:
mod.delete.error = 모드를 삭제할 수 없습니다. 파일이 사용 중일 수 있습니다. mod.delete.error = 모드를 삭제할 수 없습니다. 파일이 사용 중일 수 있습니다.
@@ -619,6 +620,19 @@ sector.extractionOutpost.description = 적이 다른 지역에 자원을 보내
sector.impact0078.description = 이곳에는 시스템에 처음 진입한 우주 수송선의 잔해가 있습니다.\n\n우주선이 파괴된 잔해에서 최대한 많은 자원을 회수하고, 손상되지 않은 그들의 기술을 획득하세요. sector.impact0078.description = 이곳에는 시스템에 처음 진입한 우주 수송선의 잔해가 있습니다.\n\n우주선이 파괴된 잔해에서 최대한 많은 자원을 회수하고, 손상되지 않은 그들의 기술을 획득하세요.
sector.planetaryTerminal.description = 이 행성에서의 마지막 전투를 준비하세요.\n\n적이 필사의 각오로 지키고 있는 이 해안 기지엔 우주에 코어를 발사할 수 있는 시설이 있습니다.\n\n해군을 생산하여 적을 신속하게 제거하고, 그들의 코어 발사 기술을 약탈하십시오.\n\n[royal] 건투를 빕니다.[] sector.planetaryTerminal.description = 이 행성에서의 마지막 전투를 준비하세요.\n\n적이 필사의 각오로 지키고 있는 이 해안 기지엔 우주에 코어를 발사할 수 있는 시설이 있습니다.\n\n해군을 생산하여 적을 신속하게 제거하고, 그들의 코어 발사 기술을 약탈하십시오.\n\n[royal] 건투를 빕니다.[]
status.burning.name = 방화
status.freezing.name = 빙결
status.wet.name = 젖음
status.muddy.name = 질척해짐
status.melting.name = 융해
status.sapped.name = 흡혈됨
status.spore-slowed.name = 포자 느려짐
status.tarred.name = Tarred
status.overclock.name = 과부하
status.shocked.name = 충격
status.blasted.name = 폭파됨
status.unmoving.name = 멈춤
settings.language = 언어 settings.language = 언어
settings.data = 게임 데이터 settings.data = 게임 데이터
settings.reset = 기본값으로 초기화 settings.reset = 기본값으로 초기화
@@ -655,6 +669,7 @@ stat.output = 출력
stat.booster = 가속 stat.booster = 가속
stat.tiles = 필요한 타일 stat.tiles = 필요한 타일
stat.affinities = 친화력 stat.affinities = 친화력
stat.opposites = 상성
stat.powercapacity = 전력 용량 stat.powercapacity = 전력 용량
stat.powershot = 전력/발 stat.powershot = 전력/발
stat.damage = 피해량 stat.damage = 피해량
@@ -716,6 +731,12 @@ stat.abilities = 능력
stat.canboost = 이륙 가능 stat.canboost = 이륙 가능
stat.flying = 비행 stat.flying = 비행
stat.ammouse = 탄약 사용 stat.ammouse = 탄약 사용
stat.damagemultiplier = 피해량 배수
stat.healthmultiplier = 체력 배수
stat.speedmultiplier = 이동속도 배수
stat.reloadmultiplier = 재장전 배수
stat.buildspeedmultiplier = 건설속도 배수
stat.reactive = 반응성
ability.forcefield = 보호막 필드 ability.forcefield = 보호막 필드
ability.repairfield = 수리 필드 ability.repairfield = 수리 필드
@@ -751,17 +772,14 @@ units.processorcontrol = [lightgray]프로세서 제어됨
bullet.damage = [stat]{0}[lightgray] 피해량 bullet.damage = [stat]{0}[lightgray] 피해량
bullet.splashdamage = [stat]{0}[lightgray] 범위 피해량 ~ [stat] {1}[lightgray] 타일 bullet.splashdamage = [stat]{0}[lightgray] 범위 피해량 ~ [stat] {1}[lightgray] 타일
bullet.incendiary = [stat]방화 bullet.incendiary = [stat]방화
bullet.sapping = [stat]흡혈
bullet.homing = [stat]유도 bullet.homing = [stat]유도
bullet.shock = [stat]전격
bullet.frag = [stat]파편 bullet.frag = [stat]파편
bullet.lightning = [stat]{0}[lightgray]x 전격 ~[stat]{1}[lightgray] 피해량
bullet.buildingdamage = [stat]{0}%[lightgray] 건물 피해량 bullet.buildingdamage = [stat]{0}%[lightgray] 건물 피해량
bullet.knockback = [stat]{0}[lightgray] 넉백 bullet.knockback = [stat]{0}[lightgray] 넉백
bullet.pierce = [stat]{0}[lightgray]번 관통 bullet.pierce = [stat]{0}[lightgray]번 관통
bullet.infinitepierce = [stat]관통 bullet.infinitepierce = [stat]관통
bullet.healpercent = [stat]{0}[lightgray]% 회복 bullet.healpercent = [stat]{0}[lightgray]% 회복
bullet.freezing = [stat]빙결
bullet.tarred = [stat]타르
bullet.multiplier = [stat]{0}[lightgray]배 탄약 배수 bullet.multiplier = [stat]{0}[lightgray]배 탄약 배수
bullet.reload = [stat]{0}[lightgray]배 발사 속도 bullet.reload = [stat]{0}[lightgray]배 발사 속도
@@ -923,6 +941,7 @@ keybind.pause_building.name = 건설 일시정지/재개
keybind.minimap.name = 미니맵 keybind.minimap.name = 미니맵
keybind.planet_map.name = 행성 지도 keybind.planet_map.name = 행성 지도
keybind.research.name = 연구 keybind.research.name = 연구
keybind.block_info.name = 블록 정보
keybind.chat.name = 채팅 keybind.chat.name = 채팅
keybind.player_list.name = 플레이어 목록 keybind.player_list.name = 플레이어 목록
keybind.console.name = 콘솔 keybind.console.name = 콘솔
@@ -991,6 +1010,7 @@ content.item.name = 자원
content.liquid.name = 액체 content.liquid.name = 액체
content.unit.name = 유닛 content.unit.name = 유닛
content.block.name = 블록 content.block.name = 블록
content.status.name = 상태 이상
content.sector.name = 지역 content.sector.name = 지역
item.copper.name = 구리 item.copper.name = 구리
@@ -1459,7 +1479,7 @@ block.ripple.description = 장거리에 걸쳐 지상 적에게 포탄 무리를
block.cyclone.description = 근처 적에게 폭발 파편 덩어리를 발사합니다. block.cyclone.description = 근처 적에게 폭발 파편 덩어리를 발사합니다.
block.spectre.description = 공중 및 지상 목표물에 큰 관통 철갑탄을 발사합니다. block.spectre.description = 공중 및 지상 목표물에 큰 관통 철갑탄을 발사합니다.
block.meltdown.description = 주변 적에게 지속적인 레이저 빔을 충전하여 발사합니다. 냉각 액체가 있어야 작동합니다. block.meltdown.description = 주변 적에게 지속적인 레이저 빔을 충전하여 발사합니다. 냉각 액체가 있어야 작동합니다.
block.foreshadow.description = 장거리에 걸친 거대한 단일 목표 저격탄을 발사합니다. block.foreshadow.description = 장거리에 걸친 거대한 단일 목표 저격탄을 발사합니다. 최대 체력이 높은 적을 먼저 조준합니다.
block.repair-point.description = 인근에 가장 가까운 유닛을 지속해서 치료합니다. block.repair-point.description = 인근에 가장 가까운 유닛을 지속해서 치료합니다.
block.segment.description = 날아오는 발사체를 요격합니다. 큰 발사체엔 조준하지 않습니다. block.segment.description = 날아오는 발사체를 요격합니다. 큰 발사체엔 조준하지 않습니다.
block.parallax.description = 공중 목표물을 끌어오는 견인 광선을 발사하며, 견인 과정에서 데미지를 줍니다. block.parallax.description = 공중 목표물을 끌어오는 견인 광선을 발사하며, 견인 과정에서 데미지를 줍니다.

View File

@@ -10,7 +10,7 @@ link.dev-builds.description = Niestabilne wersje gry
link.trello.description = Oficjalna tablica Trello z planowanym funkcjami link.trello.description = Oficjalna tablica Trello z planowanym funkcjami
link.itch.io.description = Strona itch.io z oficjanymi wersjami do pobrania link.itch.io.description = Strona itch.io z oficjanymi wersjami do pobrania
link.google-play.description = Strona w sklepie Google Play link.google-play.description = Strona w sklepie Google Play
link.f-droid.description = Wykaz Katalogu F-Droid link.f-droid.description = Pozycja w F-Droid
link.wiki.description = Oficjalna Wiki Mindustry link.wiki.description = Oficjalna Wiki Mindustry
link.suggestions.description = Zaproponuj nowe funkcje link.suggestions.description = Zaproponuj nowe funkcje
link.bug.description = Znalazłeś błąd? Zgłoś go tutaj link.bug.description = Znalazłeś błąd? Zgłoś go tutaj
@@ -20,11 +20,11 @@ screenshot.invalid = Zrzut ekranu jest zbyt duży. Najprawdopodobniej brakuje mi
gameover = Koniec Gry gameover = Koniec Gry
gameover.disconnect = Odłącz gameover.disconnect = Odłącz
gameover.pvp = Zwyciężyła drużyna [accent]{0}[]! gameover.pvp = Zwyciężyła drużyna [accent]{0}[]!
gameover.waiting =[accent]Czekanie na następną mapę... gameover.waiting = [accent]Oczekiwanie na następną mapę...
highscore = [accent]Nowy rekord! highscore = [accent]Nowy rekord!
copied = Skopiowano. copied = Skopiowano.
indev.notready = Ta część gry nie jest jeszcze ukończona indev.notready = Ta część gry nie jest jeszcze ukończona
indev.campaign = [accent]Udało ci się zakończyć kampanie![]\n\nZawartość kończy się na tym. Podróż międzyplanetarna zostanie dodana w przyszłych aktualizacjach. indev.campaign = [accent]Udało ci się zakończyć kampanię![]\n\nZawartość kończy się na tym. Podróż międzyplanetarna zostanie dodana w przyszłych aktualizacjach.
load.sound = Dźwięki load.sound = Dźwięki
load.map = Mapy load.map = Mapy
@@ -41,10 +41,13 @@ be.ignore = Zignoruj
be.noupdates = Nie znaleziono aktualizacji. be.noupdates = Nie znaleziono aktualizacji.
be.check = Sprawdź aktualizacje be.check = Sprawdź aktualizacje
mod.featured.dialog.title = Wyszukiwarka Modów mod.featured.dialog.title = Przeglądarka Modów
mods.browser.selected = Wybrany Mod mods.browser.selected = Wybrany Mod
mods.browser.add = Zainstaluj Moda mods.browser.add = Zainsta-\nluj Moda
mods.browser.reinstall = Przeins-\ntaluj
mods.github.open = Otwórz w GitHub'ie mods.github.open = Otwórz w GitHub'ie
mods.browser.sortdate = Sortuj wg ostatnich
mods.browser.sortstars = Sortuj wg gwiazdek
schematic = Schemat schematic = Schemat
schematic.add = Zapisz schemat... schematic.add = Zapisz schemat...
@@ -75,7 +78,7 @@ stat.delivered = Surowce wystrzelone:
stat.playtime = Czas Gry:[accent] {0} stat.playtime = Czas Gry:[accent] {0}
stat.rank = Ocena: [accent]{0} stat.rank = Ocena: [accent]{0}
globalitems = [accent]Global Items globalitems = [accent]Wszystkie przedmioty
map.delete = Jesteś pewny, że chcesz usunąć "[accent]{0}[]"? map.delete = Jesteś pewny, że chcesz usunąć "[accent]{0}[]"?
level.highscore = Rekord: [accent]{0} level.highscore = Rekord: [accent]{0}
level.select = Wybrany poziom level.select = Wybrany poziom
@@ -110,17 +113,20 @@ committingchanges = Zatwierdzanie Zmian
done = Gotowe done = Gotowe
feature.unsupported = Twoje urządzenie nie wspiera tej funkcji. feature.unsupported = Twoje urządzenie nie wspiera tej funkcji.
mods.alphainfo = Pamiętaj, że mody są wersji alpha, i[scarlet] mogą być pełne błędów[].\nZgłaszaj wszystkie znalezione problemy na Mindustry GitHub lub Discord. mods.initfailed = [red]⚠[] Inicjalizacja poprzedniej instancji Mindustry nie powiodła się. Najprawdopodobniej było to spowodowane niewłaściwym działaniem modów.\n\nAby zapobiec pętli awarii, [red]wszystkie mody zostały wyłączone.[]\n\nAby wyłączyć tę funkcję, należy wyłączyć ją w ustawieniach [accent]Ustawienia->Gra->Wyłącz mody w przypadku awarii podczas uruchamiania[].
mods = Mody mods = Mody
mods.none = [lightgray]Nie znaleziono modów! mods.none = [lightgray]Nie znaleziono modów!
mods.guide = Poradnik do modów mods.guide = Poradnik do modów
mods.report = Zgłoś Błąd mods.report = Zgłoś Błąd
mods.openfolder = Otwórz folder z modami mods.openfolder = Otwórz folder z modami
mods.viewcontent = View Content
mods.reload = Przeładuj mods.reload = Przeładuj
mods.reloadexit = Gra zostanie teraz zamknięta, aby ponownie załadować mody. mods.reloadexit = Gra zostanie teraz zamknięta, aby ponownie załadować mody.
mod.installed = [[Installed]
mod.display = [gray]Mod:[orange] {0} mod.display = [gray]Mod:[orange] {0}
mod.enabled = [lightgray]Włączony mod.enabled = [lightgray]Włączony
mod.disabled = [scarlet]Wyłączony mod.disabled = [scarlet]Wyłączony
mod.multiplayer.compatible = [gray]Kompatybilny z trybem wieloosobowym
mod.disable = Wyłącz mod.disable = Wyłącz
mod.content = Zawartość: mod.content = Zawartość:
mod.delete.error = Nie udało się usunąć moda. Plik może być w użyciu. mod.delete.error = Nie udało się usunąć moda. Plik może być w użyciu.
@@ -155,12 +161,12 @@ filename = Nazwa Pliku:
unlocked = Odblokowano nową zawartość! unlocked = Odblokowano nową zawartość!
available =Nowe Odkrycie dostępne available =Nowe Odkrycie dostępne
completed = [accent]Ukończony completed = [accent]Ukończony
techtree = Drzewo Technologiczne techtree = Drzewo Techno-\nlogiczne
research.legacy = Znaleziono badania z wersji [accent]5.0[].\nCzy chcesz [accent]załadować je[], albo [accent]usunąć[] dane z drzewa technologiczno (rekomendowane)? research.legacy = Znaleziono badania z wersji [accent]5.0[].\nChcesz [accent]załadować je[], czy [accent]usunąć[] dane z drzewa technologicznego w nowej kampanii (zalecane)?
research.load = Załaduj research.load = Załaduj
research.discard = Odrzuć research.discard = Odrzuć
research.list = [lightgray]Badania: research.list = [lightgray]Badania:
research = Badaj research = Badania
researched = [lightgray]{0} zbadane. researched = [lightgray]{0} zbadane.
research.progress = {0}% ukończone research.progress = {0}% ukończone
players = {0} graczy players = {0} graczy
@@ -169,7 +175,7 @@ players.search = wyszukaj
players.notfound = [gray]nie znaleziono graczy players.notfound = [gray]nie znaleziono graczy
server.closing = [accent]Zamykanie serwera... server.closing = [accent]Zamykanie serwera...
server.kicked.kick = Zostałeś wyrzucony z serwera! server.kicked.kick = Zostałeś wyrzucony z serwera!
server.kicked.whitelist = Nie ma cię tu na białej liście. server.kicked.whitelist = Nie jesteś na białej liście.
server.kicked.serverClose = Serwer został zamknięty. server.kicked.serverClose = Serwer został zamknięty.
server.kicked.vote = Zostałeś wyrzucony z gry. Żegnaj. server.kicked.vote = Zostałeś wyrzucony z gry. Żegnaj.
server.kicked.clientOutdated = Nieaktualna gra! Zaktualizują ją! server.kicked.clientOutdated = Nieaktualna gra! Zaktualizują ją!
@@ -214,7 +220,9 @@ trace.ip = IP: [accent]{0}
trace.id = Wyjątkowe ID: [accent]{0} trace.id = Wyjątkowe ID: [accent]{0}
trace.mobile = Klient Mobilny: [accent]{0} trace.mobile = Klient Mobilny: [accent]{0}
trace.modclient = Zmodowany klient: [accent]{0} trace.modclient = Zmodowany klient: [accent]{0}
invalidid = Złe ID klienta! Udostępnij raport błędu. trace.times.joined = Dołączył: [accent]{0}[] razy
trace.times.kicked = Wyrzucony: [accent]{0}[] razy
invalidid = Złe ID klienta! Wyślij raport błędu.
server.bans = Bany server.bans = Bany
server.bans.none = Nie znaleziono zbanowanych osób! server.bans.none = Nie znaleziono zbanowanych osób!
server.admins = Admini server.admins = Admini
@@ -230,8 +238,8 @@ confirmban = Jesteś pewny, że chcesz zbanować "{0}[white]"?
confirmkick = Jesteś pewny, że chcesz wyrzucić "{0}[white]"? confirmkick = Jesteś pewny, że chcesz wyrzucić "{0}[white]"?
confirmvotekick = Jesteś pewny, że chcesz głosować za wyrzuceniem "{0}[white]"? confirmvotekick = Jesteś pewny, że chcesz głosować za wyrzuceniem "{0}[white]"?
confirmunban = Jesteś pewny, że chcesz odbanować tego gracza? confirmunban = Jesteś pewny, że chcesz odbanować tego gracza?
confirmadmin = Jesteś pewny, że chcesz dać rangę admina "{0}[white]"? confirmadmin = Jesteś pewny, że chcesz dać rangę administratora "{0}[white]"?
confirmunadmin = Jesteś pewny, że chcesz zabrać rangę admina "{0}[white]"? confirmunadmin = Jesteś pewny, że chcesz zabrać rangę administratora "{0}[white]"?
joingame.title = Dołącz do gry joingame.title = Dołącz do gry
joingame.ip = IP: joingame.ip = IP:
disconnect = Rozłączono. disconnect = Rozłączono.
@@ -258,7 +266,7 @@ save.export = Eksportuj
save.import.invalid = [accent]Zapis gry jest niepoprawny! save.import.invalid = [accent]Zapis gry jest niepoprawny!
save.import.fail = [crimson]Nie udało się zaimportować zapisu: [accent]{0} save.import.fail = [crimson]Nie udało się zaimportować zapisu: [accent]{0}
save.export.fail = [crimson]Nie udało się wyeksportować zapisu: [accent]{0} save.export.fail = [crimson]Nie udało się wyeksportować zapisu: [accent]{0}
save.import = Importuj Zapis save.import = Importuj zapis
save.newslot = Zapisz nazwę: save.newslot = Zapisz nazwę:
save.rename = Zmień nazwę save.rename = Zmień nazwę
save.rename.text = Nowa nazwa: save.rename.text = Nowa nazwa:
@@ -272,8 +280,8 @@ off = Wyłączone
save.autosave = Autozapis: {0} save.autosave = Autozapis: {0}
save.map = Mapa: {0} save.map = Mapa: {0}
save.wave = Fala {0} save.wave = Fala {0}
save.mode = Tryb Gry: {0} save.mode = Tryb gry: {0}
save.date = Ostatnio Zapisane: {0} save.date = Ostatnio zapisane: {0}
save.playtime = Czas gry: {0} save.playtime = Czas gry: {0}
warning = Uwaga. warning = Uwaga.
confirm = Potwierdź confirm = Potwierdź
@@ -288,25 +296,26 @@ openlink = Otwórz Link
copylink = Kopiuj Link copylink = Kopiuj Link
back = Wróć back = Wróć
max = Max max = Max
crash.export = Eksportuj logi błędów. crash.export = Eksportuj Logi Błędów
crash.none = Nie znaleziono logów błędów. crash.none = Nie znaleziono logów błędów.
crash.exported = Logi zostały przeniesione. crash.exported = Logi zostały wyeksportowane.
data.export = Eksportuj Dane data.export = Eksportuj Dane
data.import = Importuj Dane data.import = Importuj Dane
data.openfolder = Otwórz folder danych data.openfolder = Otwórz Folder Danych
data.exported = Dane wyeksportowane. data.exported = Dane wyeksportowane.
data.invalid = Nieprawidłowe dane gry. data.invalid = Nieprawidłowe dane gry.
data.import.confirm = Zaimportowanie zewnętrznych danych nadpisze[scarlet] wszystkie[] obecne dane gry.\n[accent]Nie można tego cofnąć![]\n\nGdy dane zostaną zaimportowane, gra automatycznie się wyłączy. data.import.confirm = Zaimportowanie zewnętrznych danych nadpisze[scarlet] wszystkie[] obecne dane gry.\n[accent]Nie można tego cofnąć![]\n\nGdy dane zostaną zaimportowane, gra automatycznie się wyłączy.
quit.confirm = Czy na pewno chcesz wyjść? quit.confirm = Czy na pewno chcesz wyjść?
quit.confirm.tutorial = Jesteś pewien?\nSamouczek może zostać powtórzony w[accent] Ustawienia->Gra->Ponów samouczek.[] quit.confirm.tutorial = Jesteś pewien?\nSamouczek może zostać powtórzony w[accent] Ustawienia->Gra->Ponów samouczek.[]
loading = [accent]Ładowanie... loading = [accent]Ładowanie...
reloading = [accent]Przeładowywanie Modów... reloading = [accent]Przeładowywanie modów...
saving = [accent]Zapisywanie... saving = [accent]Zapisywanie...
respawn = [accent][[{0}][] by odrodzić się w rdzeniu respawn = [accent][[{0}][] by odrodzić się w rdzeniu
cancelbuilding = [accent][[{0}][] by wyczyścić plan cancelbuilding = [accent][[{0}][] by wyczyścić plan
selectschematic = [accent][[{0}][] by wybrać+skopiować selectschematic = [accent][[{0}][] by wybrać+skopiować
pausebuilding = [accent][[{0}][] by wstrzymać budowę pausebuilding = [accent][[{0}][] by wstrzymać budowę
resumebuilding = [scarlet][[{0}][] by kontynuować budowę resumebuilding = [scarlet][[{0}][] by kontynuować budowę
enablebuilding = [scarlet][[{0}][] wznów budowę
showui = Interfejs ukryty.\nNaciśnij [accent][[{0}][] by go pokazać. showui = Interfejs ukryty.\nNaciśnij [accent][[{0}][] by go pokazać.
wave = [accent]Fala {0} wave = [accent]Fala {0}
wave.cap = [accent]Fala {0}/{1} wave.cap = [accent]Fala {0}/{1}
@@ -358,7 +367,7 @@ editor.generation = Generacja:
editor.ingame = Edytuj w Grze editor.ingame = Edytuj w Grze
editor.publish.workshop = Opublikuj w Warsztacie editor.publish.workshop = Opublikuj w Warsztacie
editor.newmap = Nowa Mapa editor.newmap = Nowa Mapa
editor.center = Center editor.center = Wyśrodkuj
workshop = Warsztat workshop = Warsztat
waves.title = Fale waves.title = Fale
waves.remove = Usuń waves.remove = Usuń
@@ -472,7 +481,7 @@ filter.option.amount = Ilość
filter.option.block = Blok filter.option.block = Blok
filter.option.floor = Podłoga filter.option.floor = Podłoga
filter.option.flooronto = Podłoga Docelowa filter.option.flooronto = Podłoga Docelowa
filter.option.target = Target filter.option.target = Cel
filter.option.wall = Ściana filter.option.wall = Ściana
filter.option.ore = Ruda filter.option.ore = Ruda
filter.option.floor2 = Druga Podłoga filter.option.floor2 = Druga Podłoga
@@ -499,11 +508,11 @@ editor = Edytor
mapeditor = Edytor Map mapeditor = Edytor Map
abandon = Opuść abandon = Opuść
abandon.text = Ta strefa i wszystkie jej surowce będą przejęte przez przeciwników. abandon.text = Ta strefa i wszystkie jej surowce zostaną przejęte przez przeciwników.
locked = Zablokowane locked = Zablokowane
complete = [lightgray]Ukończone: complete = [lightgray]Ukończone:
requirement.wave = Osiągnij falę {0} w {1} requirement.wave = Osiągnij falę {0} w {1}
requirement.core = Zniszcz Rdzeń wroga w {0} requirement.core = Zniszcz rdzeń wroga w {0}
requirement.research = Zbadaj {0} requirement.research = Zbadaj {0}
requirement.produce = Produkcja {0} requirement.produce = Produkcja {0}
requirement.capture = Zdobądź {0} requirement.capture = Zdobądź {0}
@@ -513,18 +522,18 @@ map.multiplayer = Tylko host może widzieć sektory
uncover = Odkryj uncover = Odkryj
configure = Skonfiguruj Ładunek configure = Skonfiguruj Ładunek
loadout = Loadout loadout = Ładunek
resources = Zasoby resources = Zasoby
bannedblocks = Zabronione bloki bannedblocks = Zabronione bloki
addall = Dodaj wszystkie addall = Dodaj wszystkie
launch.from = Wstrzelony Z: [accent]{0} launch.from = Wystrzelony z: [accent]{0}
launch.destination = Cel: {0} launch.destination = Cel: {0}
configure.invalid = Ilość musi być liczbą pomiędzy 0 a {0}. configure.invalid = Ilość musi być liczbą pomiędzy 0 a {0}.
add = Dodaj... add = Dodaj...
boss.health = Zdrowie Strażnika boss.health = Zdrowie Strażnika
connectfail = [crimson]Nie można połączyć się z serwerem:\n\n[accent]{0} connectfail = [crimson]Nie można połączyć się z serwerem:\n\n[accent]{0}
error.unreachable = Serwer niedostępny.\nCzy adres jest wpisany poprawnie? error.unreachable = Serwer niedostępny.\nSprawdź, czy adres jest wpisany poprawnie.
error.invalidaddress = Niepoprawny adres. error.invalidaddress = Niepoprawny adres.
error.timedout = Przekroczono limit czasu!\nUpewnij się, że host ma ustawione przekierowanie portu oraz sprawdź poprawność wpisanego adresu! error.timedout = Przekroczono limit czasu!\nUpewnij się, że host ma ustawione przekierowanie portu oraz sprawdź poprawność wpisanego adresu!
error.mismatch = Błąd pakietu:\nprawdopodobne niedopasowanie klienta/serwera.\nUpewnij się, że ty i host macie najnowszą wersję Mindustry! error.mismatch = Błąd pakietu:\nprawdopodobne niedopasowanie klienta/serwera.\nUpewnij się, że ty i host macie najnowszą wersję Mindustry!
@@ -599,14 +608,14 @@ sector.frozenForest.description = Nawet tutaj, bliżej gór, zarodniki rozprzest
sector.saltFlats.description = Na obrzeżach pustyni spoczywają Solne Równiny. Można tu znaleźć niewiele surowców.\n\nWrogowie zbudowali tu bazę składującą surowce. Zniszcz ich rdzeń. Zniszcz wszystko co stanie ci na drodze. sector.saltFlats.description = Na obrzeżach pustyni spoczywają Solne Równiny. Można tu znaleźć niewiele surowców.\n\nWrogowie zbudowali tu bazę składującą surowce. Zniszcz ich rdzeń. Zniszcz wszystko co stanie ci na drodze.
sector.craters.description = W tym kraterze zebrała się woda. Pozostałość dawnych wojen. Odzyskaj ten teren. Wykop piasek. Wytop metaszkło. Pompuj wodę do działek obronnych i wierteł by je schłodzić sector.craters.description = W tym kraterze zebrała się woda. Pozostałość dawnych wojen. Odzyskaj ten teren. Wykop piasek. Wytop metaszkło. Pompuj wodę do działek obronnych i wierteł by je schłodzić
sector.ruinousShores.description = Za pustkowiami ciągnie się linia brzegowa. Kiedyś znajdowała się tu przybrzeżna linia obronna. Niewiele z niej zostało. Ostały się tylko podstawowe struktury obronne, z reszty został tylko złom.\nKontynuuj eksploracje. Odkryj pozostawioną tu technologię. sector.ruinousShores.description = Za pustkowiami ciągnie się linia brzegowa. Kiedyś znajdowała się tu przybrzeżna linia obronna. Niewiele z niej zostało. Ostały się tylko podstawowe struktury obronne, z reszty został tylko złom.\nKontynuuj eksploracje. Odkryj pozostawioną tu technologię.
sector.stainedMountains.description = W głębi lądu leżą góry, jeszcze nieskażone przez zarodniki.\nWydobądź obfity tytan w tym obszarze. Dowiedz się, jak z niego korzystać.\n\nObecność wroga jest tutaj większa. Nie daj im czasu na wysłanie swoich najsilniejszych jednostek. sector.stainedMountains.description = W głębi lądu leżą góry, jeszcze nieskażone przez zarodniki.\nWydobądź bogate złoża tytanu w tym obszarze. Dowiedz się, jak z niego korzystać.\n\nObecność wroga jest tutaj większa. Nie daj im czasu na wysłanie swoich najsilniejszych jednostek.
sector.overgrowth.description = Obszar ten jest zarośnięty, bliżej źródła zarodników.\nWróg założył tu placówkę. Zbuduj jednostki Nóż. Zniszcz to. Odzyskaj to, co nam odebrano. sector.overgrowth.description = Obszar ten jest zarośnięty, bliżej źródła zarodników.\nWróg założył tu placówkę. Zbuduj jednostki Nóż. Zniszcz to. Odzyskaj to, co nam odebrano.
sector.tarFields.description = Obrzeża strefy produkcji ropy, między górami a pustynią. Jeden z niewielu obszarów z rezerwami użytecznej smoły.\nMimo że ta strefa jest opuszczona, w pobliżu znajdują się niebezpieczne siły wroga. Nie lekceważ ich.\n\n[lightgray]Jeśli to możliwe, zbadaj technologię przetwarzania oleju. sector.tarFields.description = Obrzeża strefy produkcji ropy, między górami a pustynią. Jeden z niewielu obszarów z rezerwami użytecznej smoły.\nMimo że ta strefa jest opuszczona, w pobliżu znajdują się niebezpieczne siły wroga. Nie lekceważ ich.\n\n[lightgray]Jeśli to możliwe, zbadaj technologię przetwarzania oleju.
sector.desolateRift.description = Strefa wyjątkowo niebezpieczna. Obfita w zasoby ale mało miejsca. Wysokie ryzyko zniszczenia. Opuść tę strefe jak najszybciej. Nie daj się zwieść długiemu odstępowi między atakami wroga. sector.desolateRift.description = Strefa wyjątkowo niebezpieczna. Obfita w zasoby ale mało miejsca. Wysokie ryzyko zniszczenia. Opuść tę strefe jak najszybciej. Nie daj się zwieść długiemu odstępowi między atakami wroga.
sector.nuclearComplex.description = Dawny zakład produkcji i przetwarzania toru, zredukowny do ruin.\n[lightgray]Zbadaj tor i jego zastosowania.\n\nWróg jest tutaj obecny w dużej ilości, nieustannie poszukuje napastników. sector.nuclearComplex.description = Dawny zakład produkcji i przetwarzania toru, zredukowny do ruin.\n[lightgray]Zbadaj tor i jego zastosowania.\n\nWróg jest tutaj obecny w dużej ilości, nieustannie poszukuje napastników.
sector.fungalPass.description = Przejściowy obszar pomiędzy wysokimi górami a nisko znajdującymi się, ogarniętymi przez zarodniki równinami. Znajduje się tu mała postawiona przez wrogów baza zwiadowcza.\nZniszcz ją.\nUżyj jednostek Nóż i Pełzak. Zniszcz oba rdzenie. sector.fungalPass.description = Przejściowy obszar pomiędzy wysokimi górami a nisko znajdującymi się, ogarniętymi przez zarodniki, równinami. Znajduje się tu mała, postawiona przez wrogów, baza zwiadowcza.\nZniszcz ją.\nUżyj jednostek Nóż i Pełzak. Zniszcz oba rdzenie.
sector.biomassFacility.description = Miejsce powstania zarodników. Tutał były badane i początkowo produkowane.\nZbadaj zawartą w nim technologię. Hoduj zarodniki dla paliwa i tworzyw sztucznych.\n\n[lightgray]Po upadku tej placówki zarodniki zostały uwolnione. Nic w lokalnym ekosystemie nie mogło konkurować z tak inwazyjnym organizmem. sector.biomassFacility.description = Miejsce powstania zarodników. Tutał były badane i początkowo produkowane.\nZbadaj zawartą w nim technologię. Hoduj zarodniki dla paliwa i tworzyw sztucznych.\n\n[lightgray]Po upadku tej placówki zarodniki zostały uwolnione. Nic w lokalnym ekosystemie nie mogło konkurować z tak inwazyjnym organizmem.
sector.windsweptIslands.description = Dalej za linią brzegową znajduje się ten odległy łańcuch wysp. Zapisy wyakzują ze były tu struktury produkujące [accent]Plastan[].\n\nOdeprzyj morskie jednostki wroga. Załóż bazę na wyspach. Odkryj te fabryki. sector.windsweptIslands.description = Dalej za linią brzegową znajduje się ten odległy łańcuch wysp. Zapisy wykazują, że były tu struktury produkujące [accent]Plastan[].\n\nOdeprzyj morskie jednostki wroga. Załóż bazę na wyspach. Odkryj te fabryki.
sector.extractionOutpost.description = Odległa placówka zbudowana przez wroga w celu wystrzeliwania zasobów do innych sektorów.\n\nDo dalszych podbojów niezbędna jest międzysektorowa technologia transportu. Zniszcz bazę. Zbadaj ich Wyrzutnie. sector.extractionOutpost.description = Odległa placówka zbudowana przez wroga w celu wystrzeliwania zasobów do innych sektorów.\n\nDo dalszych podbojów niezbędna jest międzysektorowa technologia transportu. Zniszcz bazę. Zbadaj ich Wyrzutnie.
sector.impact0078.description = Tutaj leżą pozostałości międzygwiezdnego statku transportowego, który jako pierwszy wszedł do tego układu.\n\nWydobądź jak najwięcej z wraku. Zbadaj każdą nienaruszoną technologię. sector.impact0078.description = Tutaj leżą pozostałości międzygwiezdnego statku transportowego, który jako pierwszy wszedł do tego układu.\n\nWydobądź jak najwięcej z wraku. Zbadaj każdą nienaruszoną technologię.
sector.planetaryTerminal.description = Ostatni cel.\n\nTa baza przybrzeżna zawiera strukturę zdolną do wyrzucania rdzeni na lokalne planety. Jest wyjątkowo dobrze strzeżona.\n\nProdukuj jednostki morskie. Jak najszybciej wyeliminuj wroga. Zbadaj tą strukturę. sector.planetaryTerminal.description = Ostatni cel.\n\nTa baza przybrzeżna zawiera strukturę zdolną do wyrzucania rdzeni na lokalne planety. Jest wyjątkowo dobrze strzeżona.\n\nProdukuj jednostki morskie. Jak najszybciej wyeliminuj wroga. Zbadaj tą strukturę.
@@ -622,7 +631,7 @@ settings.sound = Dźwięk
settings.graphics = Grafika settings.graphics = Grafika
settings.cleardata = Wyczyść Dane Gry... settings.cleardata = Wyczyść Dane Gry...
settings.clear.confirm = Czy jesteś pewien że chcesz usunąć te dane?\nPo tym nie ma powrotu! settings.clear.confirm = Czy jesteś pewien że chcesz usunąć te dane?\nPo tym nie ma powrotu!
settings.clearall.confirm = [scarlet]UWAGA![]\nTo wykasuje wszystkie dane, włącznie z zapisanymi grami i mapami, ustawienami, i znanymi technologiami.\nKiedy naciśniesz 'ok', gra usunie wszystkie swoje dane i automatycznie wyłączy się. settings.clearall.confirm = [scarlet]UWAGA![]\nTo wykasuje wszystkie dane, włącznie z zapisami, drzewem technologicznym, mapami, ustawieniami i przypisanymi klawiszami.\nKiedy naciśniesz 'ok', gra usunie wszystkie swoje dane i automatycznie wyłączy się.
settings.clearsaves.confirm = Jesteś pewny że chcesz usunąć wszystkie zapisy? settings.clearsaves.confirm = Jesteś pewny że chcesz usunąć wszystkie zapisy?
settings.clearsaves = Usuń Zapisy settings.clearsaves = Usuń Zapisy
settings.clearresearch = Usuń Postęp Drzewa Tech. settings.clearresearch = Usuń Postęp Drzewa Tech.
@@ -638,7 +647,7 @@ info.title = Informacje
error.title = [crimson]Wystąpił błąd error.title = [crimson]Wystąpił błąd
error.crashtitle = Wystąpił błąd error.crashtitle = Wystąpił błąd
unit.nobuild = [scarlet]Jednostka nie może budować unit.nobuild = [scarlet]Jednostka nie może budować
lastaccessed = [lightgray]Osatino wpłynął: {0} lastaccessed = [lightgray]Ostatnia interakcja: {0}
block.unknown = [lightgray]??? block.unknown = [lightgray]???
stat.description = Opis stat.description = Opis
@@ -678,10 +687,11 @@ stat.drillspeed = Podstawowa szybkość kopania
stat.boosteffect = Efekt wzmocnienia stat.boosteffect = Efekt wzmocnienia
stat.maxunits = Maksymalna ilość jednostek stat.maxunits = Maksymalna ilość jednostek
stat.health = Zdrowie stat.health = Zdrowie
stat.armor = Pancerz
stat.buildtime = Czas budowy stat.buildtime = Czas budowy
stat.maxconsecutive = Maksymalnie Kolejny stat.maxconsecutive = Maksymalnie Kolejny
stat.buildcost = Koszt budowy stat.buildcost = Koszt budowy
stat.inaccuracy = Niecelność stat.inaccuracy = Niedokładność
stat.shots = Strzały stat.shots = Strzały
stat.reload = Strzałów/Sekundę stat.reload = Strzałów/Sekundę
stat.ammo = Amunicja stat.ammo = Amunicja
@@ -693,18 +703,19 @@ stat.lightningchance = Szansa Na Błyskawicę
stat.lightningdamage = Obrażenia Błyskawic stat.lightningdamage = Obrażenia Błyskawic
stat.flammability = Palność stat.flammability = Palność
stat.radioactivity = Radioaktywność stat.radioactivity = Radioaktywność
stat.charge = Charge
stat.heatcapacity = Pojemność Cieplna stat.heatcapacity = Pojemność Cieplna
stat.viscosity = Lepkość stat.viscosity = Lepkość
stat.temperature = Temperatura stat.temperature = Temperatura
stat.speed = Prędość stat.speed = Prędkość
stat.buildspeed = Prędkość Budowy stat.buildspeed = Prędkość Budowy
stat.minespeed = Prędkość Wydobycia stat.minespeed = Prędkość Wydobycia
stat.minetier = Stopień Wydobycia stat.minetier = Stopień Wydobycia
stat.payloadcapacity = Ładowność stat.payloadcapacity = Ładowność
stat.commandlimit = Limit Jednostek Zarządanych stat.commandlimit = Limit Zarządanych Jednostek
stat.abilities = Umiejętności stat.abilities = Umiejętności
stat.canboost = Może przyspieszyć stat.canboost = Może przyspieszyć
stat.flying = Latanie stat.flying = Może latać
stat.ammouse = Zużycie Amunicji stat.ammouse = Zużycie Amunicji
ability.forcefield = Pole Mocy ability.forcefield = Pole Mocy
@@ -736,7 +747,7 @@ bar.progress = Postęp Budowy
bar.input = Wejście bar.input = Wejście
bar.output = Wyjście bar.output = Wyjście
units.processorcontrol = [lightgray]Kontrolowany Procesorem units.processorcontrol = [lightgray]Kontrolowany przez procesor
bullet.damage = [stat]{0}[lightgray] Obrażenia bullet.damage = [stat]{0}[lightgray] Obrażenia
bullet.splashdamage = [stat]{0}[lightgray] Obrażenia obszarowe ~[stat] {1}[lightgray] kratki bullet.splashdamage = [stat]{0}[lightgray] Obrażenia obszarowe ~[stat] {1}[lightgray] kratki
@@ -773,8 +784,8 @@ unit.shieldhealth = życie tarczy
unit.items = przedmioty unit.items = przedmioty
unit.thousands = tys. unit.thousands = tys.
unit.millions = mln unit.millions = mln
unit.billions = b unit.billions = mld
unit.pershot = /szczał unit.pershot = /strzał
category.purpose = Opis category.purpose = Opis
category.general = Główne category.general = Główne
category.power = Prąd category.power = Prąd
@@ -786,23 +797,26 @@ category.optional = Dodatkowe ulepszenia
setting.landscape.name = Zablokuj tryb panoramiczny setting.landscape.name = Zablokuj tryb panoramiczny
setting.shadows.name = Cienie setting.shadows.name = Cienie
setting.blockreplace.name = Automatyczne sugestie bloków setting.blockreplace.name = Automatyczne sugestie bloków
setting.linear.name = Filtrowanie Liniowe setting.linear.name = Filtrowanie liniowe
setting.hints.name = Podpowiedzi setting.hints.name = Podpowiedzi
setting.flow.name = Wyświetl szybkość przepływu zasobów[scarlet] (eksperymentalne) setting.logichints.name = Wskazówki dot. logiki
setting.flow.name = Wyświetl szybkość przepływu zasobów
setting.backgroundpause.name = Wstrzymaj w tle setting.backgroundpause.name = Wstrzymaj w tle
setting.buildautopause.name = Automatycznie zatrzymaj budowanie setting.buildautopause.name = Automatycznie zatrzymaj budowanie
setting.doubletapmine.name = Kliknij podwójnie, aby wydobywać
setting.modcrashdisable.name = Wyłącz mody w przypadku awarii podczas uruchamiania
setting.animatedwater.name = Animowana woda setting.animatedwater.name = Animowana woda
setting.animatedshields.name = Animowana tarcza setting.animatedshields.name = Animowana tarcza
setting.antialias.name = Antyaliasing[lightgray] (wymaga restartu)[] setting.antialias.name = Antyaliasing[lightgray] (wymaga restartu)[]
setting.playerindicators.name = Znaczniki Graczy setting.playerindicators.name = Znaczniki graczy
setting.indicators.name = Znaczniki Przyjaciół setting.indicators.name = Znaczniki przyjaciół
setting.autotarget.name = Automatyczne Celowanie setting.autotarget.name = Automatyczne celowanie
setting.keyboard.name = Sterowanie - Myszka+Klawiatura setting.keyboard.name = Sterowanie - Myszka+Klawiatura
setting.touchscreen.name = Sterowanie - Ekran Dotykowy setting.touchscreen.name = Sterowanie - Ekran Dotykowy
setting.fpscap.name = Maksymalny FPS setting.fpscap.name = Maksymalny FPS
setting.fpscap.none = Nieograniczone setting.fpscap.none = Nieograniczone
setting.fpscap.text = {0} FPS setting.fpscap.text = {0} FPS
setting.uiscale.name = Skalowanie Interfejsu[lightgray] (wymaga restartu)[] setting.uiscale.name = Skalowanie interfejsu[lightgray] (wymaga restartu)[]
setting.swapdiagonal.name = Pozwala na ukośną budowę setting.swapdiagonal.name = Pozwala na ukośną budowę
setting.difficulty.training = Treningowy setting.difficulty.training = Treningowy
setting.difficulty.easy = Łatwy setting.difficulty.easy = Łatwy
@@ -822,11 +836,11 @@ setting.milliseconds = {0} milisekund
setting.fullscreen.name = Pełny ekran setting.fullscreen.name = Pełny ekran
setting.borderlesswindow.name = Bezramkowe okno[lightgray] (może wymagać restartu) setting.borderlesswindow.name = Bezramkowe okno[lightgray] (może wymagać restartu)
setting.fps.name = Pokazuj FPS oraz ping setting.fps.name = Pokazuj FPS oraz ping
setting.smoothcamera.name = Gładka Kamera setting.smoothcamera.name = Płynna kamera
setting.vsync.name = Synchronizacja pionowa setting.vsync.name = Synchronizacja pionowa
setting.pixelate.name = Pikselacja [lightgray](wyłącza animacje) setting.pixelate.name = Pikselacja [lightgray](wyłącza animacje)
setting.minimap.name = Pokaż Minimapę setting.minimap.name = Pokaż minimapę
setting.coreitems.name = Poazuj Przedmoty W Rdzeniu (WIP) setting.coreitems.name = Pokazuj przedmoty w rdzeniu
setting.position.name = Pokazuj położenie gracza setting.position.name = Pokazuj położenie gracza
setting.musicvol.name = Głośność muzyki setting.musicvol.name = Głośność muzyki
setting.atmosphere.name = Pokazuj atmosferę planety setting.atmosphere.name = Pokazuj atmosferę planety
@@ -835,19 +849,19 @@ setting.mutemusic.name = Wycisz muzykę
setting.sfxvol.name = Głośność dźwięków setting.sfxvol.name = Głośność dźwięków
setting.mutesound.name = Wycisz dźwięki setting.mutesound.name = Wycisz dźwięki
setting.crashreport.name = Wysyłaj anonimowo dane o crashu gry setting.crashreport.name = Wysyłaj anonimowo dane o crashu gry
setting.savecreate.name = Automatyczne tworzenie zapisu setting.savecreate.name = Automatyczne tworzenie zapisów
setting.publichost.name = Widoczność Gry Publicznej setting.publichost.name = Widoczność gry publicznej
setting.playerlimit.name = Limit Graczy setting.playerlimit.name = Limit graczy
setting.chatopacity.name = Przezroczystość czatu setting.chatopacity.name = Przezroczystość czatu
setting.lasersopacity.name = Przezroczystość laserów zasilających setting.lasersopacity.name = Przezroczystość laserów zasilających
setting.bridgeopacity.name = Przezroczystość mostów setting.bridgeopacity.name = Przezroczystość mostów
setting.playerchat.name = Wyświetlaj czat w grze setting.playerchat.name = Wyświetlaj dymek czatu w grze
setting.showweather.name = Pokaż pogodę setting.showweather.name = Pokaż pogodę
public.confirm = Czy chcesz ustawić swoją grę jako publiczną?\n[accent]Każdy będzie mógł dołączyć do Twojej gry.\n[lightgray]Można to później zmienić w Ustawienia->Gra->Widoczność Gry Publicznej. public.confirm = Czy chcesz ustawić swoją grę jako publiczną?\n[accent]Każdy będzie mógł dołączyć do Twojej gry.\n[lightgray]Można to później zmienić w Ustawienia->Gra->Widoczność Gry Publicznej.
public.confirm.really = Jeśli chcesz grać z przyjaciółmi, użyj [green]Zaproś Przyjaciela[] zamiast [scarlet]Punliczny serwer[]!\nJesteś pewny że chcesz rozpocząć grę [scarlet]publiczą[]? public.confirm.really = Jeśli chcesz zagrać ze znajomymi, użyj opcji [green]Zaproś Znajomych[] zamiast [scarlet]Publiczny serwer[]!\nJesteś pewny że chcesz rozpocząć grę [scarlet]publiczną[]?
public.beta = Wersje beta gry nie mogą tworzyć publicznych pokoi. public.beta = Wersje beta gry nie mogą tworzyć publicznych pokoi.
uiscale.reset = Skala interfejsu uległa zmianie.\nNaciśnij "OK" by potwierdzić zmiany.\n[scarlet]Cofanie zmian i wyjście z gry za[accent] {0}[] uiscale.reset = Skala interfejsu uległa zmianie.\nNaciśnij "OK" by potwierdzić zmiany.\n[scarlet]Cofanie zmian i wyjście z gry za[accent] {0}[]
uiscale.cancel = Anuluj i Wyjdź uiscale.cancel = Anuluj i wyjdź
setting.bloom.name = Efekt Bloom setting.bloom.name = Efekt Bloom
keybind.title = Zmień keybind.title = Zmień
keybinds.mobile = [scarlet]Większość skrótów klawiszowych nie funkcjonuje w wersji mobilnej. Tylko podstawowe poruszanie się jest wspierane. keybinds.mobile = [scarlet]Większość skrótów klawiszowych nie funkcjonuje w wersji mobilnej. Tylko podstawowe poruszanie się jest wspierane.
@@ -860,8 +874,8 @@ command.rally = Zbierz
command.retreat = Wycofaj command.retreat = Wycofaj
command.idle = Nieaktywny command.idle = Nieaktywny
placement.blockselectkeys = \n[lightgray]Klawisz: [{0}, placement.blockselectkeys = \n[lightgray]Klawisz: [{0},
keybind.respawn.name = Respawn keybind.respawn.name = Odrodzenie
keybind.control.name = Control Unit keybind.control.name = Kontroluj jednostkę
keybind.clear_building.name = Wyczyść budynek keybind.clear_building.name = Wyczyść budynek
keybind.press = Naciśnij wybrany klawisz... keybind.press = Naciśnij wybrany klawisz...
keybind.press.axis = Naciśnij oś lub klawisz... keybind.press.axis = Naciśnij oś lub klawisz...
@@ -901,7 +915,7 @@ keybind.break_block.name = Zniszcz Blok
keybind.deselect.name = Odznacz keybind.deselect.name = Odznacz
keybind.pickupCargo.name = Podnieś Ładunek keybind.pickupCargo.name = Podnieś Ładunek
keybind.dropCargo.name = Opuść Ładunek keybind.dropCargo.name = Opuść Ładunek
keybind.command.name = Command keybind.command.name = Rozkazuj
keybind.shoot.name = Strzelanie keybind.shoot.name = Strzelanie
keybind.zoom.name = Przybliżanie keybind.zoom.name = Przybliżanie
keybind.menu.name = Menu keybind.menu.name = Menu
@@ -914,7 +928,7 @@ keybind.chat.name = Czat
keybind.player_list.name = Lista graczy keybind.player_list.name = Lista graczy
keybind.console.name = Konsola keybind.console.name = Konsola
keybind.rotate.name = Obracanie keybind.rotate.name = Obracanie
keybind.rotateplaced.name = Rotate Existing (Hold) keybind.rotateplaced.name = Obracanie bloku pod kursorem (przytrzymaj)
keybind.toggle_menus.name = Zmiana widoczności menu keybind.toggle_menus.name = Zmiana widoczności menu
keybind.chat_history_prev.name = Przewiń wiadomości w górę keybind.chat_history_prev.name = Przewiń wiadomości w górę
keybind.chat_history_next.name = Przewiń wiadomości w dół keybind.chat_history_next.name = Przewiń wiadomości w dół
@@ -936,8 +950,8 @@ mode.custom = Własny Tryb
rules.infiniteresources = Nieskończone Zasoby rules.infiniteresources = Nieskończone Zasoby
rules.reactorexplosions = Eksplozje Reaktorów rules.reactorexplosions = Eksplozje Reaktorów
rules.coreincinerates = Rdzeń Spala Przepełnienie rules.coreincinerates = Rdzeń Spala Nadmarowe Przedmioty
rules.schematic = Schematy Są Dozwolone rules.schematic = Zezwalaj na schematy
rules.wavetimer = Zegar Fal rules.wavetimer = Zegar Fal
rules.waves = Fale rules.waves = Fale
rules.attack = Tryb Ataku rules.attack = Tryb Ataku
@@ -948,6 +962,8 @@ rules.blockdamagemultiplier = Mnożnik Uszkodzeń Bloków
rules.unitbuildspeedmultiplier = Mnożnik Prędkości Tworzenia Jednostek rules.unitbuildspeedmultiplier = Mnożnik Prędkości Tworzenia Jednostek
rules.unithealthmultiplier = Mnożnik Życia Jednostek rules.unithealthmultiplier = Mnożnik Życia Jednostek
rules.unitdamagemultiplier = Mnożnik Obrażeń jednostek rules.unitdamagemultiplier = Mnożnik Obrażeń jednostek
rules.unitcapvariable = Rdzenie mają wpływ na limit jednostek
rules.unitcap = Podstawowy limit jednostek
rules.enemycorebuildradius = Zasięg Blokady Budowy Przy Rdzeniu Wroga:[lightgray] (kratki) rules.enemycorebuildradius = Zasięg Blokady Budowy Przy Rdzeniu Wroga:[lightgray] (kratki)
rules.wavespacing = Odstępy Między Falami:[lightgray] (sek) rules.wavespacing = Odstępy Między Falami:[lightgray] (sek)
rules.buildcostmultiplier = Mnożnik Kosztów Budowania rules.buildcostmultiplier = Mnożnik Kosztów Budowania
@@ -961,12 +977,12 @@ rules.title.resourcesbuilding = Zasoby i Budowanie
rules.title.enemy = Przeciwnicy rules.title.enemy = Przeciwnicy
rules.title.unit = Jednostki rules.title.unit = Jednostki
rules.title.experimental = Eksperymentalne rules.title.experimental = Eksperymentalne
rules.title.environment = Environment rules.title.environment = Otoczenie
rules.lighting = Oświetlenie rules.lighting = Oświetlenie
rules.enemyLights = Wrogowie Emitują Światło rules.enemyLights = Wrogowie Emitują Światło
rules.fire = Ogień rules.fire = Ogień
rules.explosions = Uszkodzenia Wybuchu Klocka/Jednostki rules.explosions = Uszkodzenia Wybuchu Bloku/Jednostki
rules.ambientlight = Otaczające Światło rules.ambientlight = Otaczające\nŚwiatło
rules.weather = Pogoda rules.weather = Pogoda
rules.weather.frequency = Częstotliwość: rules.weather.frequency = Częstotliwość:
rules.weather.always = Zawsze rules.weather.always = Zawsze
@@ -999,22 +1015,22 @@ liquid.slag.name = Żużel
liquid.oil.name = Ropa liquid.oil.name = Ropa
liquid.cryofluid.name = Lodociecz liquid.cryofluid.name = Lodociecz
unit.dagger.name = Nóż unit.dagger.name = Dagger
unit.mace.name = Mace unit.mace.name = Mace
unit.fortress.name = Forteca unit.fortress.name = Fortress
unit.nova.name = Nova unit.nova.name = Nova
unit.pulsar.name = Pulsar unit.pulsar.name = Pulsar
unit.quasar.name = Quasar unit.quasar.name = Quasar
unit.crawler.name = Pełzak unit.crawler.name = Crawler
unit.atrax.name = Atrax unit.atrax.name = Atrax
unit.spiroct.name = Spiroct unit.spiroct.name = Spiroct
unit.arkyid.name = Arkyid unit.arkyid.name = Arkyid
unit.toxopid.name = Toxopid unit.toxopid.name = Toxopid
unit.flare.name = Błysk unit.flare.name = Flare
unit.horizon.name = Horyzont unit.horizon.name = Horizon
unit.zenith.name = Zenit unit.zenith.name = Zenith
unit.antumbra.name = Antumbra unit.antumbra.name = Antumbra
unit.eclipse.name = Zaćmienie unit.eclipse.name = Eclipse
unit.mono.name = Mono unit.mono.name = Mono
unit.poly.name = Poly unit.poly.name = Poly
unit.mega.name = Mega unit.mega.name = Mega
@@ -1040,11 +1056,11 @@ block.sand-boulder.name = Piaskowy Głaz
block.basalt-boulder.name = Bazaltowy Głaz block.basalt-boulder.name = Bazaltowy Głaz
block.grass.name = Trawa block.grass.name = Trawa
block.slag.name = Żużel block.slag.name = Żużel
block.space.name = Space block.space.name = Kosmos
block.salt.name = Sól block.salt.name = Sól
block.salt-wall.name = Solna Ściana block.salt-wall.name = Ściana Solna
block.pebbles.name = Kamyki block.pebbles.name = Kamyki
block.tendrils.name = Wić block.tendrils.name = Pnącza
block.sand-wall.name = Piaskowa Ściana block.sand-wall.name = Piaskowa Ściana
block.spore-pine.name = Sosna Zarodnikowa block.spore-pine.name = Sosna Zarodnikowa
block.spore-wall.name = Zarodinkowa Ściana block.spore-wall.name = Zarodinkowa Ściana
@@ -1056,7 +1072,7 @@ block.shale-boulder.name = Głaz Łupkowy
block.moss.name = Mech block.moss.name = Mech
block.shrubs.name = Krzewy block.shrubs.name = Krzewy
block.spore-moss.name = Mech Zarodnikowy block.spore-moss.name = Mech Zarodnikowy
block.shale-wall.name = Ściana Z Łupku block.shale-wall.name = Ściana z Łupku
block.scrap-wall.name = Ściana ze Złomu block.scrap-wall.name = Ściana ze Złomu
block.scrap-wall-large.name = Duża Ściana ze Złomu block.scrap-wall-large.name = Duża Ściana ze Złomu
block.scrap-wall-huge.name = Ogromna Ściana ze Złomu block.scrap-wall-huge.name = Ogromna Ściana ze Złomu
@@ -1102,7 +1118,7 @@ block.spore-cluster.name = Skupisko Zarodników
block.metal-floor.name = Metalowa Podłoga block.metal-floor.name = Metalowa Podłoga
block.metal-floor-2.name = Metalowa Podłoga 2 block.metal-floor-2.name = Metalowa Podłoga 2
block.metal-floor-3.name = Metalowa Podłoga 3 block.metal-floor-3.name = Metalowa Podłoga 3
block.metal-floor-5.name = Metalowa Podłoga 5 block.metal-floor-5.name = Metalowa Podłoga 4
block.metal-floor-damaged.name = Uszkodzona Metalowa Podłoga block.metal-floor-damaged.name = Uszkodzona Metalowa Podłoga
block.dark-panel-1.name = Ciemny Panel 1 block.dark-panel-1.name = Ciemny Panel 1
block.dark-panel-2.name = Ciemny Panel 2 block.dark-panel-2.name = Ciemny Panel 2
@@ -1113,7 +1129,7 @@ block.dark-panel-6.name = Ciemny Panel 6
block.dark-metal.name = Ciemny Metal block.dark-metal.name = Ciemny Metal
block.basalt.name = Bazalt block.basalt.name = Bazalt
block.hotrock.name = Gorący Kamień block.hotrock.name = Gorący Kamień
block.magmarock.name = Skała magmowa block.magmarock.name = Skała Magmowa
block.copper-wall.name = Miedziana Ściana block.copper-wall.name = Miedziana Ściana
block.copper-wall-large.name = Duża Miedziana Ściana block.copper-wall-large.name = Duża Miedziana Ściana
block.titanium-wall.name = Tytanowa Ściana block.titanium-wall.name = Tytanowa Ściana
@@ -1241,12 +1257,12 @@ block.overdrive-dome.name = Kopuła Pola Overdrive
block.block-forge.name = Piec Bloków block.block-forge.name = Piec Bloków
block.block-loader.name = Ładownik Bloków block.block-loader.name = Ładownik Bloków
block.block-unloader.name = Opróżniacz Bloków block.block-unloader.name = Opróżniacz Bloków
block.interplanetary-accelerator.name = Przspieszacz Międzyplanetarny block.interplanetary-accelerator.name = Przyspieszacz Międzyplanetarny
block.switch.name = Przełącznik block.switch.name = Przełącznik
block.micro-processor.name = Micro Procesor block.micro-processor.name = Mikroprocesor
block.logic-processor.name = Logiczny Procesor block.logic-processor.name = Procesor Logiczny
block.hyper-processor.name = Hyper Procesor block.hyper-processor.name = Hiperprocesor
block.logic-display.name = Wyświetlacz Logiczny block.logic-display.name = Wyświetlacz Logiczny
block.large-logic-display.name = Duży Wyświetlacz Logiczny block.large-logic-display.name = Duży Wyświetlacz Logiczny
block.memory-cell.name = Komórka Pamięci block.memory-cell.name = Komórka Pamięci
@@ -1262,12 +1278,12 @@ team.purple.name = fioletowy
hint.skip = Pomiń hint.skip = Pomiń
hint.desktopMove = Użyj [accent][[WASD][] by się poruszać. hint.desktopMove = Użyj [accent][[WASD][] by się poruszać.
hint.zoom = [accent]Przewiń[] by przybliżać lub oddlać obraz. hint.zoom = [accent]Użyj[] by przybliżać lub oddalać obraz.
hint.mine = Zbliż się do \uf8c4 rudy miedzi i [accent]kliknij[] by kopać manualnie. hint.mine = Zbliż się do \uf8c4 rudy miedzi i [accent]kliknij[] by kopać manualnie.
hint.desktopShoot = Kliknij [accent][[Lewy przycisk myszy][] by strzelać. hint.desktopShoot = Kliknij [accent][[Lewy przycisk myszy][] by strzelać.
hint.depositItems = By przenosić przedmoty, przeciągij je ze swojego statku do rdzenia. hint.depositItems = By przenosić przedmoty, przeciągij je ze swojego statku do rdzenia.
hint.respawn = By się odrodzić jako statek, kliknij [accent][[V][]. hint.respawn = By się odrodzić jako statek, kliknij [accent][[V][].
hint.respawn.mobile = Przełączyłeś się na inną jednoskę/strukturę. By odrodzić się jako statek, [accent]kliknij w awatar w górnym lewym rogu.[] hint.respawn.mobile = Przełączyłeś się na inną jednoskę/strukturę. By odrodzić się jako statek, [accent]kliknij w awatar w lewym górnym rogu.[]
hint.desktopPause = Naciśnij [accent][[Spację][] by zatrzymać lub wznowić grę. hint.desktopPause = Naciśnij [accent][[Spację][] by zatrzymać lub wznowić grę.
hint.placeDrill = Wybierz \ue85e [accent]Wiertło[] w menu w prawym dolnym rogu, i wybierz wtedy \uf870 [accent]Wiertło[] i kliknij na miedzi by je postawić. hint.placeDrill = Wybierz \ue85e [accent]Wiertło[] w menu w prawym dolnym rogu, i wybierz wtedy \uf870 [accent]Wiertło[] i kliknij na miedzi by je postawić.
hint.placeDrill.mobile = Wybierz zakładkę z \ue85e[accent]Wiertłem[] w menu w prawym dolnym rogu, i wtedy wybierz \uf870 [accent]Wietło[] i kliknij na miedzi by je postawić.\n\nNaciśnij \ue800 [accent]znak potwierdzenia[] w dolnym prawym rogu by potwierdzić. hint.placeDrill.mobile = Wybierz zakładkę z \ue85e[accent]Wiertłem[] w menu w prawym dolnym rogu, i wtedy wybierz \uf870 [accent]Wietło[] i kliknij na miedzi by je postawić.\n\nNaciśnij \ue800 [accent]znak potwierdzenia[] w dolnym prawym rogu by potwierdzić.
@@ -1278,7 +1294,7 @@ hint.breaking = Użyj [accent]Prawego przycisku myszy[] i przeciągnij by zniszc
hint.breaking.mobile = Aktywuj \ue817 [accent]ikonę młota[] w dolnym prawym rogu by zniszczyć bloki.\n\nPrzytrymaj swój palec i przeciągij by wybrać wiele bloków do zniszczenia. hint.breaking.mobile = Aktywuj \ue817 [accent]ikonę młota[] w dolnym prawym rogu by zniszczyć bloki.\n\nPrzytrymaj swój palec i przeciągij by wybrać wiele bloków do zniszczenia.
hint.research = Klikij przycisk \ue875 [accent]Badań[] by odkrwyać nowe technologie. hint.research = Klikij przycisk \ue875 [accent]Badań[] by odkrwyać nowe technologie.
hint.research.mobile = Użyj przycisku \ue875 [accent]Badań[] w \ue88c [accent]Menu[] by odkrywać nowe technologie. hint.research.mobile = Użyj przycisku \ue875 [accent]Badań[] w \ue88c [accent]Menu[] by odkrywać nowe technologie.
hint.unitControl = Przytrzymaj [accent][[Lewy CTRL][] i [accent]kliknij[] by kontrolować sojusznicze jednostki i działka. hint.unitControl = Przytrzymaj [accent][[Lewy CTRL][] i [accent]kliknij[], by kontrolować sojusznicze jednostki i działka.
hint.unitControl.mobile = [accent][Kliknij dwukrotnie[] by kontrolować sojusznicze jednostki i działka. hint.unitControl.mobile = [accent][Kliknij dwukrotnie[] by kontrolować sojusznicze jednostki i działka.
hint.launch = Gdy zebrałeś wystarczająco materiałów możesz [accent]Wystrzelić[] wybierając \ue827 [accent]Mapę[] w dolnym prawym rogu. hint.launch = Gdy zebrałeś wystarczająco materiałów możesz [accent]Wystrzelić[] wybierając \ue827 [accent]Mapę[] w dolnym prawym rogu.
hint.launch.mobile = Gdy zebrałeś wystarczająco materiałów możesz [accent]Wystrzelić[] do pobliskich sektorów klikając w \ue827 [accent]Mape[] w \ue88c [accent]Menu[]. hint.launch.mobile = Gdy zebrałeś wystarczająco materiałów możesz [accent]Wystrzelić[] do pobliskich sektorów klikając w \ue827 [accent]Mape[] w \ue88c [accent]Menu[].
@@ -1294,7 +1310,7 @@ hint.payloadDrop = Kliknij [accent]][] by opuścić podniesiony towar.
hint.payloadDrop.mobile = [accent]Kliknij i przytrzymaj[] w puste miejsce by opuścić podniesiony towar. hint.payloadDrop.mobile = [accent]Kliknij i przytrzymaj[] w puste miejsce by opuścić podniesiony towar.
hint.waveFire = [accent]Strumień[] wypełniony wodą będzie gasić pobiskie pożary. hint.waveFire = [accent]Strumień[] wypełniony wodą będzie gasić pobiskie pożary.
hint.generator = \uf879 [accent]Generatory Spalinowe[] spalają węgiel i przekazują moc do pobliskich bloków.\n\nMożesz powiększyć odległość transmitowanej mocy używająć \uf87f [accent]Węzły Prądu[]. hint.generator = \uf879 [accent]Generatory Spalinowe[] spalają węgiel i przekazują moc do pobliskich bloków.\n\nMożesz powiększyć odległość transmitowanej mocy używająć \uf87f [accent]Węzły Prądu[].
hint.guardian = Jednostki [accent]Strażnicze[] są uzbrojone. Słaba amunicja - taka jak [accent]Miedź[] oraz [accent]Ołów[] [scarlet]nie jest efektywna[].\n\nUżyj lepszych działek takich jak \uf835 [accent]Naładowane Grafitem[] \uf861Duo/\uf859Salwa by pozbyć się strażników. hint.guardian = Jednostki [accent]Strażnicze[] są uzbrojone. Słaba amunicja - taka jak [accent]Miedź[] czy [accent]Ołów[] [scarlet]nie jest efektywna[].\n\nUżyj lepszych działek takich jak \uf835 [accent]Naładowane Grafitem[] \uf861Duo/\uf859Salwa by pozbyć się strażników.
hint.coreUpgrade = Rdzenie mogą być ulepszone poprzez [accent]płożenie na nich rdzeń wyższego poziomu[].\n\nPołóż  rdzeń [accent]Fundacji[] na  rdzeń:[accent]Odłamek[] core. Żadna przeszkoda ani blok nie może stać na miejscu rdzenia. hint.coreUpgrade = Rdzenie mogą być ulepszone poprzez [accent]płożenie na nich rdzeń wyższego poziomu[].\n\nPołóż  rdzeń [accent]Fundacji[] na  rdzeń:[accent]Odłamek[] core. Żadna przeszkoda ani blok nie może stać na miejscu rdzenia.
hint.presetLaunch = Szare [accent]sektory[], takie jak [accent]Zamrożony Las[], to sektory do których możesz dotrzeć z każdego miejsca. Nie wymagają podbicia pobliskiego terenu.\n\n[accent]Ponumerowane sektory[], takie jak ten, [accent]są dodatkowe[]. hint.presetLaunch = Szare [accent]sektory[], takie jak [accent]Zamrożony Las[], to sektory do których możesz dotrzeć z każdego miejsca. Nie wymagają podbicia pobliskiego terenu.\n\n[accent]Ponumerowane sektory[], takie jak ten, [accent]są dodatkowe[].
hint.coreIncinerate = Jak rdzeń zostanie w pełni wypełniony danym przedmiotem, reszta przedmiotów tego typu zostanie [accent]spalona[]. hint.coreIncinerate = Jak rdzeń zostanie w pełni wypełniony danym przedmiotem, reszta przedmiotów tego typu zostanie [accent]spalona[].
@@ -1303,7 +1319,7 @@ hint.coopCampaign = Gdy grasz [accent]kooperacyjną kampanię[], przedmioty któ
item.copper.description = Przydatny materiał budowlany. Szeroko używany w prawie każdej konstrukcji. item.copper.description = Przydatny materiał budowlany. Szeroko używany w prawie każdej konstrukcji.
item.copper.details = Miedź. Nienormalnie obfity metal na Serpulo. Strukturalnie słaba, chyba że zostanie wzmocniona. item.copper.details = Miedź. Nienormalnie obfity metal na Serpulo. Strukturalnie słaba, chyba że zostanie wzmocniona.
item.lead.description = Podstawowy materiał. Używany w przesyle przemiotów i płynów. Nie jest on przypadkiem szkodliwy? item.lead.description = Podstawowy materiał. Używany w przesyle przemiotów i płynów. Nie jest on przypadkiem szkodliwy?
item.lead.details = Gęsty. Obojętny. Intensywnie używany w bateriach. \nUwaga: prawdopodobnie toksyczny dla biologicznych form życia. Nie żeby zostało tu wiele. item.lead.details = Gęsty. Obojętny. Intensywnie używany w bateriach. \nUwaga: prawdopodobnie toksyczny dla biologicznych form życia... nie żeby zostało ich tu wiele...
item.metaglass.description = Wyjątkowo wytrzymały stop szkła. Szeroko używany w transporcie i przechowywaniu płynów. item.metaglass.description = Wyjątkowo wytrzymały stop szkła. Szeroko używany w transporcie i przechowywaniu płynów.
item.graphite.description = Zmineralizowany węgiel, wykorzystywany do amunicji i izolacji elektrycznej. item.graphite.description = Zmineralizowany węgiel, wykorzystywany do amunicji i izolacji elektrycznej.
item.sand.description = Zwykły materiał używany pospolicie w przepalaniu, stopach i jako topnik. Dostanie piaskiem po oczach nie jest przyjemne. item.sand.description = Zwykły materiał używany pospolicie w przepalaniu, stopach i jako topnik. Dostanie piaskiem po oczach nie jest przyjemne.
@@ -1323,8 +1339,8 @@ item.blast-compound.description = Niestabilny związek używany w materiałach w
item.pyratite.description = Niesamowicie palny związek używany w zbrojeniu. Nielegalny w 9 państwach. item.pyratite.description = Niesamowicie palny związek używany w zbrojeniu. Nielegalny w 9 państwach.
liquid.water.description = Powszechnie używana do schładzania budowli i przetwarzania odpadów. liquid.water.description = Powszechnie używana do schładzania budowli i przetwarzania odpadów.
liquid.slag.description = Wiele różnych metali stopionych i zmieszanych razem. Może zostać rozdzielony na jego metale składowe, albo wystrzelony w wrogie jednostki i użyty jako broń. liquid.slag.description = Wiele różnych metali stopionych i zmieszanych razem. Może zostać rozdzielony na jego metale składowe, albo wystrzelony we wrogie jednostki i użyty jako broń.
liquid.oil.description = Używany w do produkcji złożonych materiałów. Może zostać przetworzony na węgiel, lub wystrzelony w wrogów przez wieżyczke. liquid.oil.description = Używany w do produkcji złożonych materiałów. Może zostać przetworzony na węgiel, lub wystrzelony we wrogów przez wieżyczke.
liquid.cryofluid.description = Obojętna, niekorozyjna ciecz utworzona z wody i tytanu. liquid.cryofluid.description = Obojętna, niekorozyjna ciecz utworzona z wody i tytanu.
block.resupply-point.description = Wypełnia pobliskie jednostki amunicją z miedzi. Nie jest kompatybilny z jednostkami, które wykorzystują energię z baterii. block.resupply-point.description = Wypełnia pobliskie jednostki amunicją z miedzi. Nie jest kompatybilny z jednostkami, które wykorzystują energię z baterii.
@@ -1334,7 +1350,7 @@ block.message.description = Przechowuje wiadomość. Wykorzystywane do komunikac
block.graphite-press.description = Kompresuje kawałki węgla w czyste blaszki grafitu. block.graphite-press.description = Kompresuje kawałki węgla w czyste blaszki grafitu.
block.multi-press.description = Ulepszona wersja prasy grafitowej. Używa wody i prądu do kompresowania węgla szybko i efektywnie. block.multi-press.description = Ulepszona wersja prasy grafitowej. Używa wody i prądu do kompresowania węgla szybko i efektywnie.
block.silicon-smelter.description = Redukuje piasek za pomocą wysoce czystego węgla w celu wytworzenia krzemu. block.silicon-smelter.description = Redukuje piasek za pomocą wysoce czystego węgla w celu wytworzenia krzemu.
block.kiln.description = Stapia ołów i piasek na metaszkło. Wymaga małej ilości energii. block.kiln.description = Stapia ołów i piasek na metaszkło.
block.plastanium-compressor.description = Wytwarza plastan z oleju i tytanu. block.plastanium-compressor.description = Wytwarza plastan z oleju i tytanu.
block.phase-weaver.description = Produkuje Włókna Fazowe z radioaktywnego toru i dużych ilości piasku. block.phase-weaver.description = Produkuje Włókna Fazowe z radioaktywnego toru i dużych ilości piasku.
block.alloy-smelter.description = Produkuje stop Elektrum z tytanu, ołowiu, krzemu i miedzi. block.alloy-smelter.description = Produkuje stop Elektrum z tytanu, ołowiu, krzemu i miedzi.
@@ -1350,7 +1366,7 @@ block.incinerator.description = Pozbywa się nadmiaru przedmiotów lub płynu
block.power-void.description = Niszczy całą energię wprowadzoną do tego bloku. Dostępny tylko w trybie sandbox. block.power-void.description = Niszczy całą energię wprowadzoną do tego bloku. Dostępny tylko w trybie sandbox.
block.power-source.description = Wydziela prąd w nieskończoność. Dostępny tylko w trybie sandbox. block.power-source.description = Wydziela prąd w nieskończoność. Dostępny tylko w trybie sandbox.
block.item-source.description = Wydziela przedmioty w nieskończoność. Dostępny tylko w trybie sandbox. block.item-source.description = Wydziela przedmioty w nieskończoność. Dostępny tylko w trybie sandbox.
block.item-void.description = Niszczy wszystkie przedmioty, które idą do tego bloku, który nie wymaga prądu. Dostępny tylko w trybie sandbox. block.item-void.description = Niszczy wszystkie przedmioty, które idą do tego bloku. Nie wymaga prądu. Dostępny tylko w trybie sandbox.
block.liquid-source.description = Wydziela ciecz w nieskończoność. Dostępny tylko w trybie sandbox. block.liquid-source.description = Wydziela ciecz w nieskończoność. Dostępny tylko w trybie sandbox.
block.liquid-void.description = Usuwa każdą ciecz. Dostępny tylko w trybie sandbox. block.liquid-void.description = Usuwa każdą ciecz. Dostępny tylko w trybie sandbox.
block.copper-wall.description = Tani blok obronny.\nPrzydatny do ochrony rdzenia i wieżyczek w pierwszych kilku falach. block.copper-wall.description = Tani blok obronny.\nPrzydatny do ochrony rdzenia i wieżyczek w pierwszych kilku falach.
@@ -1371,10 +1387,10 @@ block.mender.description = Co jakiś czas naprawia bloki w zasięgu. Utrzymuje s
block.mend-projector.description = Ulepszona wersja Naprawiacza. Naprawia bloki w jego otoczeniu.\nMoże wykorzystywać włókno fazowe, aby zwiększyć efektywność budowli. block.mend-projector.description = Ulepszona wersja Naprawiacza. Naprawia bloki w jego otoczeniu.\nMoże wykorzystywać włókno fazowe, aby zwiększyć efektywność budowli.
block.overdrive-projector.description = Zwiększa szybkość budynków w zasięgu takich jak wiertła czy przenośniki. Może wykorzystywać włókno fazowe, aby zwiększyć zasięg i efektywność budowli. block.overdrive-projector.description = Zwiększa szybkość budynków w zasięgu takich jak wiertła czy przenośniki. Może wykorzystywać włókno fazowe, aby zwiększyć zasięg i efektywność budowli.
block.force-projector.description = Wytwarza pole siłowe w kształcie sześciokąta wokół siebie, chroniąc budynki i jednostki wewnątrz od obrażeń zadanych przez pociski. block.force-projector.description = Wytwarza pole siłowe w kształcie sześciokąta wokół siebie, chroniąc budynki i jednostki wewnątrz od obrażeń zadanych przez pociski.
block.shock-mine.description = Zadaje obrażenia jednostkom wroga którzy na nią wejdą. Ledwo widoczne dla wrogów. block.shock-mine.description = Zadaje obrażenia jednostkom wroga, które wejdą na nią. Ledwo widoczne dla wrogów.
block.conveyor.description = Podstawowy blok transportowy dla przedmiotów. Automatycznie przesyła przedmioty naprzód do działek oraz maszyn. Można obrócić. block.conveyor.description = Podstawowy blok transportowy dla przedmiotów. Automatycznie przesyła przedmioty naprzód do działek oraz maszyn. Można obrócić.
block.titanium-conveyor.description = Zaawansowany blok transportowy dla przedmiotów. Przesyła przedmioty szybciej od zwykłego przenośnika. block.titanium-conveyor.description = Zaawansowany blok transportowy dla przedmiotów. Przesyła przedmioty szybciej od zwykłego przenośnika.
block.plastanium-conveyor.description = Przenosi przedmity partiami. Przyjmuje przedmioty z tyłu i rozładowuje je w trzech kierunkach z przodu. Wymaga wielu punktów ładujących i rozładowujących w celu osiągnięcia maksymalnej przepustowości. block.plastanium-conveyor.description = Przenosi przedmioty partiami. Przyjmuje przedmioty z tyłu i rozładowuje je w trzech kierunkach z przodu. Wymaga wielu punktów ładujących i rozładowujących w celu osiągnięcia maksymalnej przepustowości.
block.junction.description = Używany jako most dla dwóch krzyżujących się przenośników. Przydatne w sytuacjach kiedy dwa różne przenośniki transportują różne surowce do różnych miejsc. block.junction.description = Używany jako most dla dwóch krzyżujących się przenośników. Przydatne w sytuacjach kiedy dwa różne przenośniki transportują różne surowce do różnych miejsc.
block.bridge-conveyor.description = Zaawansowany blok transportujący. Pozwala na przenoszenie przedmiotów nawet do 3 bloków na każdym terenie, przez każdy budynek. block.bridge-conveyor.description = Zaawansowany blok transportujący. Pozwala na przenoszenie przedmiotów nawet do 3 bloków na każdym terenie, przez każdy budynek.
block.phase-conveyor.description = Zaawansowany blok transportowy dla przedmiotów. Używa energii do teleportacji przedmiotów do połączonego transportera fazowego na spore odległości. block.phase-conveyor.description = Zaawansowany blok transportowy dla przedmiotów. Używa energii do teleportacji przedmiotów do połączonego transportera fazowego na spore odległości.
@@ -1388,7 +1404,7 @@ block.underflow-gate.description = Odwrotność bramy przepełnieniowej, który
block.mass-driver.description = Najlepszy blok do transportu przedmiotów. Zbiera wiele przedmiotów naraz a potem wystrzeliwuje je do kolejnej katapulty masy na bardzo duże odległości. block.mass-driver.description = Najlepszy blok do transportu przedmiotów. Zbiera wiele przedmiotów naraz a potem wystrzeliwuje je do kolejnej katapulty masy na bardzo duże odległości.
block.mechanical-pump.description = Tania pompa o niskiej wydajności. Nie wymaga prądu. block.mechanical-pump.description = Tania pompa o niskiej wydajności. Nie wymaga prądu.
block.rotary-pump.description = Zaawansowana pompa. Pompuje więcej cieczy, ale wymaga zasilania. block.rotary-pump.description = Zaawansowana pompa. Pompuje więcej cieczy, ale wymaga zasilania.
block.thermal-pump.description = Najlepsza pompa. Pompuje ogromne ilości cieczy, ale wymaga zasilaina. block.thermal-pump.description = Najlepsza pompa. Pompuje ogromne ilości cieczy, ale wymaga zasilania.
block.conduit.description = Podstawowy blok do transportowania cieczy. Używany w połączeniu z pompami i innymi rurami. block.conduit.description = Podstawowy blok do transportowania cieczy. Używany w połączeniu z pompami i innymi rurami.
block.pulse-conduit.description = Zaawansowany blok do transportowania cieczy. Transportuje je szybciej i magazynuje więcej niż standardowe rury. block.pulse-conduit.description = Zaawansowany blok do transportowania cieczy. Transportuje je szybciej i magazynuje więcej niż standardowe rury.
block.plated-conduit.description = Przesyła ciecze z taką samą szybkością co rura tytanowa, ale jest bardziej odporna. Wejściami bocznymi mogą być tylko inne rury.\nWycieka z niej mniej cieczy. block.plated-conduit.description = Przesyła ciecze z taką samą szybkością co rura tytanowa, ale jest bardziej odporna. Wejściami bocznymi mogą być tylko inne rury.\nWycieka z niej mniej cieczy.
@@ -1410,7 +1426,7 @@ block.differential-generator.description = Generuje duże ilości prądu. Wykorz
block.rtg-generator.description = Prosty, niezawodny generator. Wykorzystuje ciepło powstałe z rozpadu izotopów promieniotwórczych. Nie wymaga chłodzenia, ale produkuje mniej energii od reaktora torowego. block.rtg-generator.description = Prosty, niezawodny generator. Wykorzystuje ciepło powstałe z rozpadu izotopów promieniotwórczych. Nie wymaga chłodzenia, ale produkuje mniej energii od reaktora torowego.
block.solar-panel.description = Wytwarza małe ilości prądu wykorzystując energię słoneczną. block.solar-panel.description = Wytwarza małe ilości prądu wykorzystując energię słoneczną.
block.solar-panel-large.description = Wytwarza o wiele więcej prądu niż zwykły panel słoneczny. block.solar-panel-large.description = Wytwarza o wiele więcej prądu niż zwykły panel słoneczny.
block.thorium-reactor.description = Produkuje bardzo duże ilości prądu z wysoce radioaktywnego toru. Wymaga ciągłego chłodzenia. Silnie eksploduje jeśli nie zostanie dostarczona wystarczająca ilość chłodziwa. Produkcja energii zależy od zapełnienia, produkując bazową ilość energii przy całkowitym zapełnieniu. block.thorium-reactor.description = Produkuje bardzo duże ilości prądu z wysoce radioaktywnego toru. Wymaga ciągłego chłodzenia. Silnie eksploduje, jeśli nie zostanie dostarczona wystarczająca ilość chłodziwa. Produkcja energii zależy od zapełnienia, produkując bazową ilość energii przy całkowitym zapełnieniu.
block.impact-reactor.description = Zaawansowany generator, zdolny do produkcji ogromnych ilości prądu u szczytu swoich możliwości. Wymaga znacznych ilości energii do rozpoczęcia procesu. block.impact-reactor.description = Zaawansowany generator, zdolny do produkcji ogromnych ilości prądu u szczytu swoich możliwości. Wymaga znacznych ilości energii do rozpoczęcia procesu.
block.mechanical-drill.description = Tanie wiertło. Kiedy zostanie zbudowane na odpowiednich polach, wydobywa surowce w wolnym tempie. Może wydobywać tylko podstawowe rudy. block.mechanical-drill.description = Tanie wiertło. Kiedy zostanie zbudowane na odpowiednich polach, wydobywa surowce w wolnym tempie. Może wydobywać tylko podstawowe rudy.
block.pneumatic-drill.description = Ulepszone wiertło, zdolne do wydobywania tytanu. Wydobywa w szybszym tempie niż wiertło mechaniczne. block.pneumatic-drill.description = Ulepszone wiertło, zdolne do wydobywania tytanu. Wydobywa w szybszym tempie niż wiertło mechaniczne.
@@ -1426,8 +1442,8 @@ block.core-foundation.description = Druga wersja rdzenia. Lepiej opancerzony. Pr
block.core-foundation.details = Druga generacja. block.core-foundation.details = Druga generacja.
block.core-nucleus.description = Trzecia i ostatnia wersja rdzenia. Bardzo dobrze opancerzony. Przechowuje ogromne ilości surowców. block.core-nucleus.description = Trzecia i ostatnia wersja rdzenia. Bardzo dobrze opancerzony. Przechowuje ogromne ilości surowców.
block.core-nucleus.details = Trzecia i ostatnia generacja. block.core-nucleus.details = Trzecia i ostatnia generacja.
block.vault.description = Przechowuje duże ilości przedmiotów każdego rodzaju. Użyj ekstraktora, aby rozładować magazyn. block.vault.description = Przechowuje duże ilości przedmiotów każdego rodzaju. Zawartość magazynu można wyciągnąć za pomocą ekstraktorów.
block.container.description = Przechowuje małe ilości przedmiotów każdego rodzaju. Użyj ekstraktora, aby rozładować kontener. block.container.description = Przechowuje małe ilości przedmiotów każdego rodzaju. Zawartość kontenera można wyciągnąć za pomocą ekstraktorów.
block.unloader.description = Wyciąga przedmioty z przyległych bloków. Typ przedmiotu jaki zostanie wyciągniety może zostać zmieniony poprzez kliknięcie. block.unloader.description = Wyciąga przedmioty z przyległych bloków. Typ przedmiotu jaki zostanie wyciągniety może zostać zmieniony poprzez kliknięcie.
block.launch-pad.description = Wysyła pakiety przedmiotów bez potrzeby wystrzeliwania rdżenia. block.launch-pad.description = Wysyła pakiety przedmiotów bez potrzeby wystrzeliwania rdżenia.
block.duo.description = Mała, tania wieża. Przydatna przeciwko jednostkom naziemnym. block.duo.description = Mała, tania wieża. Przydatna przeciwko jednostkom naziemnym.
@@ -1447,13 +1463,13 @@ block.meltdown.description = Duże działo laserowe, które strzela potężnymi
block.foreshadow.description = Strzela potężnym pociskiem z daleka we wrogów. block.foreshadow.description = Strzela potężnym pociskiem z daleka we wrogów.
block.repair-point.description = Bez przerw naprawia najbliższą uszkodzoną jednostkę w jego zasięgu. block.repair-point.description = Bez przerw naprawia najbliższą uszkodzoną jednostkę w jego zasięgu.
block.segment.description = Uszkadza i niszczy wrogie pociskiski poza laserami. block.segment.description = Uszkadza i niszczy wrogie pociskiski poza laserami.
block.parallax.description = Wykorzystuje laser, który przyciąga do siebie wrogów, zadając im obrażenia. block.parallax.description = Wykorzystuje laser przyciągający do siebie wrogów, zadając im obrażenia.
block.tsunami.description = Strzela wielkim strumieniem cieczy we wrogów. Automatycznie gasi ogień, gdy jest podłączony do wody. block.tsunami.description = Strzela wielkim strumieniem cieczy we wrogów. Automatycznie gasi ogień, gdy jest podłączony do wody.
block.silicon-crucible.description = Oczyszcza krzem z węgla i piasku wykorzystując piratian. Bardziej efektywny w gorących miejscach. block.silicon-crucible.description = Oczyszcza krzem z węgla i piasku wykorzystując piratian. Bardziej efektywny w gorących miejscach.
block.disassembler.description = Oddziela egzotyczne materiały z mieszaniny jaką jest żużel z małą efektywnością. Może wyprodukować tor. block.disassembler.description = Oddziela egzotyczne materiały z mieszaniny jaką jest żużel z małą efektywnością. Może wyprodukować tor.
block.overdrive-dome.description = Zwiększa szybkość budynków w zasięgu. Wymaga włókna fazowego oraz krzemu by działać. block.overdrive-dome.description = Zwiększa szybkość budynków w zasięgu. Wymaga włókna fazowego oraz krzemu by działać.
block.payload-conveyor.description = Przenosi duże ładunki, takie jak jednostki z fabryk. block.payload-conveyor.description = Przenosi duże ładunki, takie jak jednostki z fabryk.
block.payload-router.description = Dzieli wejście z przewoźnika masowego i dzieli je w 3 różne strony. block.payload-router.description = Dzieli wejście z przenośnika masowego w 3 różne strony.
block.command-center.description = Kontroluje zachowanie jednostek paroma różnymi komendami. block.command-center.description = Kontroluje zachowanie jednostek paroma różnymi komendami.
block.ground-factory.description = Produkuje jednostki naziemne. Jednostki mogą być do razu wykorzystane lub przeniesone do rekonstrukota by je ulepszyć. block.ground-factory.description = Produkuje jednostki naziemne. Jednostki mogą być do razu wykorzystane lub przeniesone do rekonstrukota by je ulepszyć.
block.air-factory.description = Produkuje jednostki powietrzne. Jednostki mogą być do razu wykorzystane lub przeniesone do rekonstrukota by je ulepszyć. block.air-factory.description = Produkuje jednostki powietrzne. Jednostki mogą być do razu wykorzystane lub przeniesone do rekonstrukota by je ulepszyć.
@@ -1461,11 +1477,11 @@ block.naval-factory.description = Produkuje jednostki morskie. Jednostki mogą b
block.additive-reconstructor.description = Ulepsza wsadzone jednostki do stopnia drugiego. block.additive-reconstructor.description = Ulepsza wsadzone jednostki do stopnia drugiego.
block.multiplicative-reconstructor.description = Ulepsza wsadzone jednostki do stopnia trzeciego. block.multiplicative-reconstructor.description = Ulepsza wsadzone jednostki do stopnia trzeciego.
block.exponential-reconstructor.description = Ulepsza wsadzone jednostki do stopnia czwartego. block.exponential-reconstructor.description = Ulepsza wsadzone jednostki do stopnia czwartego.
block.tetrative-reconstructor.description = Ulepsza wsadzone jednostki do stopnia piątego i ostatniego. block.tetrative-reconstructor.description = Ulepsza wsadzone jednostki do piątego, ostatniego stopnia.
block.switch.description = Jest Przełączalny. Stan jego może być odczytywany lub kontrolowany przez procesory. block.switch.description = Jest przełączalny. Stan jego może być odczytywany lub kontrolowany przez procesory.
block.micro-processor.description = Uruchamia sekwencję instrukcji logicznych w pętli. Może być wykorzystany do kontroli bloków lub jednostek. block.micro-processor.description = Uruchamia sekwencję instrukcji logicznych w pętli. Może być wykorzystany do kontroli bloków lub jednostek.
block.logic-processor.description = Uruchamia sekwencję instrukcji logicznych w pętli. Może być wykorzystany do kontroli bloków lub jednostek. Szybszy niż mikro procesor. block.logic-processor.description = Uruchamia sekwencję instrukcji logicznych w pętli. Może być wykorzystany do kontroli bloków lub jednostek. Szybszy niż mikroprocesor.
block.hyper-processor.description = Uruchamia sekwencję instrukcji logicznych w pętli. Może być wykorzystany do kontroli bloków lub jednostek. Szybszy niż logiczny procesor. block.hyper-processor.description = Uruchamia sekwencję instrukcji logicznych w pętli. Może być wykorzystany do kontroli bloków lub jednostek. Szybszy niż procesor logiczny.
block.memory-cell.description = Przechowuje informacje dla procesora. block.memory-cell.description = Przechowuje informacje dla procesora.
block.memory-bank.description = Przechowuje informacje dla procesora. Duża pojemność. block.memory-bank.description = Przechowuje informacje dla procesora. Duża pojemność.
block.logic-display.description = Wyświetla obraz z procesora. block.logic-display.description = Wyświetla obraz z procesora.
@@ -1479,23 +1495,23 @@ unit.scepter.description = Strzela salwą naładowanych pocisków we wszystkich
unit.reign.description = Strzela salwą masywnych przebijających pocisków we wszystkich przeciwników. unit.reign.description = Strzela salwą masywnych przebijających pocisków we wszystkich przeciwników.
unit.nova.description = Wystrzeliwuje pioruny, które uszkadzają przeciwników i leczą sojusznicze struktury. Może latać. unit.nova.description = Wystrzeliwuje pioruny, które uszkadzają przeciwników i leczą sojusznicze struktury. Może latać.
unit.pulsar.description = Wystrzeliwuje elektryczne pioruny, które uszkadzają przeciwników i leczą sojusznicze struktury. Może latać. unit.pulsar.description = Wystrzeliwuje elektryczne pioruny, które uszkadzają przeciwników i leczą sojusznicze struktury. Może latać.
unit.quasar.description = Wystrzeliwuje wiązki laserowe, które uszkadzają przeciwników i leczą sojusznicze struktury. Może latać. Posiada tarcze. unit.quasar.description = Wystrzeliwuje przeszywającą wiązkę laserową, uszkadzają przeciwników i leczą sojusznicze struktury. Może latać. Posiada tarcze.
unit.vela.description = Wystrzeliwuje masywny ciągły laser, który uszkadza przeciwników i leczy sojusznicze struktury. Może latać. unit.vela.description = Wystrzeliwuje masywny ciągły laser, który uszkadza przeciwników i leczy sojusznicze struktury. Może latać.
unit.corvus.description = Wystrzeliwuje masywny laserowy błysk, który uszkadza przeciwników i leczy sojusznicze struktury. Może przejść po większości terenu. unit.corvus.description = Wystrzeliwuje masywną ciągłą wiązkę laserową, która uszkadza przeciwników i leczy sojusznicze struktury. Może przejść po większości terenu.
unit.crawler.description = Wbiega w przeciwników i dokonuje samozniszczenia powodując dużą eksplozje. unit.crawler.description = Wbiega w przeciwników i dokonuje samozniszczenia powodując dużą eksplozje.
unit.atrax.description = Wystrzeliwuje wyniszczające kule żużlu w cele na ziemi. Może przejść po większości terenu. unit.atrax.description = Wystrzeliwuje wyniszczające kule żużlu w cele na ziemi. Może przejść po większości terenu.
unit.spiroct.description = Strzela wyczerpującymi życie laserami we wrogów, naprawiając siebie. Może przejść po większości terenu. unit.spiroct.description = Strzela wyczerpującymi życie laserami we wrogów, naprawiając siebie. Może przejść po większości terenu.
unit.arkyid.description = Strzela dużymi wyczerpującymi życie laserami we wrogów, naprawiając siebie. Może przejść po większości terenu. unit.arkyid.description = Strzela dużymi wyczerpującymi życie laserami we wrogów, naprawiając siebie. Może przejść po większości terenu.
unit.toxopid.description = Strzela wielkimi elektrycznymi skupionymi kulami i przebijającymi laserami we wrogów. Może przejść po większości terenu. unit.toxopid.description = Strzela wielkimi elektrycznymi skupionymi kulami i przebijającymi laserami we wrogów. Może przejść po większości terenu.
unit.flare.description = Strzela standardowymi pociskami we jednostki naziemne. unit.flare.description = Strzela standardowymi pociskami we jednostki naziemne.
unit.horizon.description = Upuszcza stos bomb na jednostki naziemne. unit.horizon.description = Upuszcza serię bomb na jednostki naziemne.
unit.zenith.description = Strzela salwą rakiet w każdego pobliskiego wroga. unit.zenith.description = Strzela salwą rakiet w każdego pobliskiego wroga.
unit.antumbra.description = Strzela zaporą rakiet w każdego pobliskiego wroga. unit.antumbra.description = Strzela zaporą rakiet w każdego pobliskiego wroga.
unit.eclipse.description = Strzela dwoma przebijającymi laserami i pociskami przeciwlotniczymi we wrogów. unit.eclipse.description = Strzela dwoma przebijającymi laserami i pociskami przeciwlotniczymi we wrogów.
unit.mono.description = Automatycznie wykopuje miedź i ołów i odkłada je do rdzenia. unit.mono.description = Automatycznie wykopuje miedź i ołów i odkłada je do rdzenia.
unit.poly.description = Automatycznie naprawia zniszczone struktury i asystuje w budowie. unit.poly.description = Automatycznie naprawia zniszczone struktury i asystuje w budowie.
unit.mega.description = Automatycznie naprawia zniszczone struktury. Może podnosić małe jednostki i bloki. unit.mega.description = Automatycznie naprawia zniszczone struktury. Może podnosić małe jednostki i bloki.
unit.quad.description = Upuszcza wielkie bomby na cele na ziemi, które uszkadzają przeciwników i leczą sojusznicze struktury. Może podnosić jednostki naziemne średniej wielkości. unit.quad.description = Upuszcza wielkie bomby na cele naziemne, uszkadzając przeciwników i lecząc sojusznicze struktury. Może podnosić jednostki naziemne średniej wielkości.
unit.oct.description = Broni wszystkie jednostki tarczą regeneracyjną. Może podnosić większość jednostek naziemnych. unit.oct.description = Broni wszystkie jednostki tarczą regeneracyjną. Może podnosić większość jednostek naziemnych.
unit.risso.description = Strzela sporą ilością pocisków i rakiet w najbliższych przeciwników. unit.risso.description = Strzela sporą ilością pocisków i rakiet w najbliższych przeciwników.
unit.minke.description = Strzela granatami i standardowymi pociskami w najbliższych przeciwników. unit.minke.description = Strzela granatami i standardowymi pociskami w najbliższych przeciwników.
@@ -1505,3 +1521,146 @@ unit.omura.description = Strzela przebijającym superszybkim pociskiem we wrogó
unit.alpha.description = Chroni Rdzeń: Odłamek przed wrogami. Buduje struktury. unit.alpha.description = Chroni Rdzeń: Odłamek przed wrogami. Buduje struktury.
unit.beta.description = Chroni Rdzeń: Podstawa przed wrogami. Buduje struktury. unit.beta.description = Chroni Rdzeń: Podstawa przed wrogami. Buduje struktury.
unit.gamma.description = Chroni Rdzeń: Jądro przed wrogami. Buduje struktury. unit.gamma.description = Chroni Rdzeń: Jądro przed wrogami. Buduje struktury.
lst.read = Read a number from a linked memory cell.
lst.write = Write a number to a linked memory cell.
lst.print = Add text to the print buffer.\nDoes not display anything until [accent]Print Flush[] is used.
lst.draw = Add an operation to the drawing buffer.\nDoes not display anything until [accent]Draw Flush[] is used.
lst.drawflush = Flush queued [accent]Draw[] operations to a display.
lst.printflush = Flush queued [accent]Print[] operations to a message block.
lst.getlink = Get a processor link by index. Starts at 0.
lst.control = Control a building.
lst.radar = Locate units around a building with range.
lst.sensor = Get data from a building or unit.
lst.set = Set a variable.
lst.operation = Perform an operation on 1-2 variables.
lst.end = Jump to the top of the instruction stack.
lst.jump = Conditionally jump to another statement.
lst.unitbind = Bind to the next unit of a type, and store it in [accent]@unit[].
lst.unitcontrol = Control the currently bound unit.
lst.unitradar = Locate units around the currently bound unit.
lst.unitlocate = Locate a specific type of position/building anywhere on the map.\nRequires a bound unit.
logic.nounitbuild = [red]Unit building logic is not allowed here.
lenum.type = Type of building/unit.\ne.g. for any router, this will return [accent]@router[].\nNot a string.
lenum.shoot = Shoot at a position.
lenum.shootp = Shoot at a unit/building with velocity prediction.
lenum.configure = Building configuration, e.g. sorter item.
lenum.enabled = Whether the block is enabled.
laccess.color = Illuminator color.
laccess.controller = Unit controller. If processor controlled, returns processor.\nIf in a formation, returns leader.\nOtherwise, returns the unit itself.
laccess.dead = Whether a unit/building is dead or no longer valid.
laccess.controlled = Returns:\n[accent]@ctrlProcessor[] if unit controller is processor\n[accent]@ctrlPlayer[] if unit/building controller is player\n[accent]@ctrlFormation[] if unit is in formation\nOtherwise, 0.
laccess.commanded = [red]Deprecated. Will be removed![]\nUse [accent]controlled[] instead.
graphicstype.clear = Fill the display with a color.
graphicstype.color = Set color for next drawing operations.
graphicstype.stroke = Set line width.
graphicstype.line = Draw line segment.
graphicstype.rect = Fill a rectangle.
graphicstype.linerect = Draw a rectangle outline.
graphicstype.poly = Fill a regular polygon.
graphicstype.linepoly = Draw a regular polygon outline.
graphicstype.triangle = Fill a triangle.
graphicstype.image = Draw an image of some content.\nex: [accent]@router[] or [accent]@dagger[].
lenum.always = Always true.
lenum.idiv = Integer division.
lenum.div = Division.\nReturns [accent]null[] on divide-by-zero.
lenum.mod = Modulo.
lenum.equal = Equal. Coerces types.\nNon-null objects compared with numbers become 1, otherwise 0.
lenum.notequal = Not equal. Coerces types.
lenum.strictequal = Strict equality. Does not coerce types.\nCan be used to check for [accent]null[].
lenum.shl = Bit-shift left.
lenum.shr = Bit-shift right.
lenum.or = Bitwise OR.
lenum.land = Logical AND.
lenum.and = Bitwise AND.
lenum.not = Bitwise flip.
lenum.xor = Bitwise XOR.
lenum.min = Minimum of two numbers.
lenum.max = Maximum of two numbers.
lenum.angle = Angle of vector in degrees.
lenum.len = Length of vector.
lenum.sin = Sine, in degrees.
lenum.cos = Cosine, in degrees.
lenum.tan = Tangent, in degrees.
#not a typo, look up 'range notation'
lenum.rand = Random decimal in range [0, value).
lenum.log = Natural logarithm (ln).
lenum.log10 = Base 10 logarithm.
lenum.noise = 2D simplex noise.
lenum.abs = Absolute value.
lenum.sqrt = Square root.
lenum.any = Any unit.
lenum.ally = Ally unit.
lenum.attacker = Unit with a weapon.
lenum.enemy = Enemy unit.
lenum.boss = Guardian unit.
lenum.flying = Flying unit.
lenum.ground = Ground unit.
lenum.player = Unit controlled by a player.
lenum.ore = Ore deposit.
lenum.damaged = Damaged ally building.
lenum.spawn = Enemy spawn point.\nMay be a core or a position.
lenum.building = Building in a specific group.
lenum.core = Any core.
lenum.storage = Storage building, e.g. Vault.
lenum.generator = Buildings that generate power.
lenum.factory = Buildings that transform resources.
lenum.repair = Repair points.
lenum.rally = Command center.
lenum.battery = Any battery.
lenum.resupply = Resupply points.\nOnly relevant when [accent]"Unit Ammo"[] is enabled.
lenum.reactor = Impact/Thorium reactor.
lenum.turret = Any turret.
sensor.in = The building/unit to sense.
radar.from = Building to sense from.\nSensor range is limited by building range.
radar.target = Filter for units to sense.
radar.and = Additional filters.
radar.order = Sorting order. 0 to reverse.
radar.sort = Metric to sort results by.
radar.output = Variable to write output unit to.
unitradar.target = Filter for units to sense.
unitradar.and = Additional filters.
unitradar.order = Sorting order. 0 to reverse.
unitradar.sort = Metric to sort results by.
unitradar.output = Variable to write output unit to.
control.of = Building to control.
control.unit = Unit/building to aim at.
control.shoot = Whether to shoot.
unitlocate.enemy = Whether to locate enemy buildings.
unitlocate.found = Whether the object was found.
unitlocate.building = Output variable for located building.
unitlocate.outx = Output X coordinate.
unitlocate.outy = Output Y coordinate.
unitlocate.group = Building group to look for.
lenum.idle = Don't move, but keep building/mining.\nThe default state.
lenum.stop = Stop moving/mining/building.
lenum.move = Move to exact position.
lenum.approach = Approach a position with a radius.
lenum.pathfind = Pathfind to the enemy spawn.
lenum.target = Shoot a position.
lenum.targetp = Shoot a target with velocity prediction.
lenum.itemdrop = Drop an item.
lenum.itemtake = Take an item from a building.
lenum.paydrop = Drop current payload.
lenum.paytake = Pick up payload at current location.
lenum.flag = Numeric unit flag.
lenum.mine = Mine at a position.
lenum.build = Build a structure.
lenum.getblock = Fetch a building and type at coordinates.\nUnit must be in range of position.\nSolid non-buildings will have the type [accent]@solid[].
lenum.within = Check if unit is near a position.
lenum.boost = Start/stop boosting.

View File

@@ -126,6 +126,7 @@ mod.installed = [[Instalat]
mod.display = [gray]Mod:[orange] {0} mod.display = [gray]Mod:[orange] {0}
mod.enabled = [lightgray]Activat mod.enabled = [lightgray]Activat
mod.disabled = [scarlet]Dezactivat mod.disabled = [scarlet]Dezactivat
mod.multiplayer.compatible = [gray]Compatibil cu Multiplayer
mod.disable = Dezactivează mod.disable = Dezactivează
mod.content = Conținut: mod.content = Conținut:
mod.delete.error = Nu s-a putut șterge modul. Fișierul ar putea fi în uz. mod.delete.error = Nu s-a putut șterge modul. Fișierul ar putea fi în uz.
@@ -439,7 +440,7 @@ editor.exists = Există deja o hartă cu același nume.
editor.selectmap = Selectează o hartă de încărcat: editor.selectmap = Selectează o hartă de încărcat:
toolmode.replace = Înlocuiește toolmode.replace = Înlocuiește
toolmode.replace.description = Desenează doar pe blocurile solide. toolmode.replace.description = Desenează doar peste blocurile solide.
toolmode.replaceall = Înlocuiește-le pe toate toolmode.replaceall = Înlocuiește-le pe toate
toolmode.replaceall.description = Înlocuiește toate blocurile solide de pe hartă. toolmode.replaceall.description = Înlocuiește toate blocurile solide de pe hartă.
toolmode.orthogonal = Ortogonal toolmode.orthogonal = Ortogonal
@@ -449,7 +450,7 @@ toolmode.square.description = Pensulă pătrată.
toolmode.eraseores = Șterge Minereurile toolmode.eraseores = Șterge Minereurile
toolmode.eraseores.description = Șterge doar minereurile. toolmode.eraseores.description = Șterge doar minereurile.
toolmode.fillteams = Umplere Echipe toolmode.fillteams = Umplere Echipe
toolmode.fillteams.description = Umple hartă cu echipe în loc de blocuri. toolmode.fillteams.description = Umple harta cu echipe în loc de blocuri.
toolmode.drawteams = Desenează Echipe toolmode.drawteams = Desenează Echipe
toolmode.drawteams.description = Desenează echipe în loc de blocuri. toolmode.drawteams.description = Desenează echipe în loc de blocuri.
@@ -619,6 +620,19 @@ sector.extractionOutpost.description = Un avanpost izolat, construit de inamic c
sector.impact0078.description = Aici se află rămășițele primei nave de transport interstelar care a intrat în acest sistem stelar.\n\nSalvează cât de mult posibil din epavă. Cercetează orice tehnologie intactă. sector.impact0078.description = Aici se află rămășițele primei nave de transport interstelar care a intrat în acest sistem stelar.\n\nSalvează cât de mult posibil din epavă. Cercetează orice tehnologie intactă.
sector.planetaryTerminal.description = Ținta finală.\n\nAceastă bază de coastă conține o structură capabilă să lanseze nuclee către alte planete locale. Este extrem de bine păzită.\n\nProdu unități navale. Elimină inamicul cât de rapid se poate. Cercetează structura de lansare. sector.planetaryTerminal.description = Ținta finală.\n\nAceastă bază de coastă conține o structură capabilă să lanseze nuclee către alte planete locale. Este extrem de bine păzită.\n\nProdu unități navale. Elimină inamicul cât de rapid se poate. Cercetează structura de lansare.
status.burning.name = Arde
status.freezing.name = Îngheață
status.wet.name = Umed
status.muddy.name = Noroios
status.melting.name = Topește
status.sapped.name = Slăbește
status.spore-slowed.name = Împiedicat de Spori
status.tarred.name = Păcurit
status.overclock.name = Suprasolicitat
status.shocked.name = Șoc
status.blasted.name = Explozie
status.unmoving.name = Nemișcat
settings.language = Limbă settings.language = Limbă
settings.data = Datele Jocului settings.data = Datele Jocului
settings.reset = Resetează settings.reset = Resetează
@@ -652,9 +666,10 @@ block.unknown = [lightgray]???
stat.description = Utilizare stat.description = Utilizare
stat.input = Necesită stat.input = Necesită
stat.output = Produce stat.output = Produce
stat.opposites = Opuși
stat.booster = Îmbunătățiri stat.booster = Îmbunătățiri
stat.tiles = Teren Necesar stat.tiles = Teren Necesar
stat.affinities = Efecte Teren stat.affinities = Afinități
stat.powercapacity = Capacitate electrică stat.powercapacity = Capacitate electrică
stat.powershot = Electricitate/Glonț stat.powershot = Electricitate/Glonț
stat.damage = Forță stat.damage = Forță
@@ -716,12 +731,18 @@ stat.abilities = Abilități
stat.canboost = Are Propulsor stat.canboost = Are Propulsor
stat.flying = Zboară stat.flying = Zboară
stat.ammouse = Consum muniție stat.ammouse = Consum muniție
stat.damagemultiplier = Multiplicator Forță
stat.healthmultiplier = Multiplicator Viață
stat.speedmultiplier = Multiplicator Viteză
stat.reloadmultiplier = Multiplicator Lovituri/sec
stat.buildspeedmultiplier = Multiplicator Viteză Construcție
stat.reactive = Reacționează la
ability.forcefield = Câmp de Forță ability.forcefield = Câmp de Forță
ability.repairfield = Câmp de Reparare ability.repairfield = Câmp de Reparare
ability.statusfield = Câmp Suprasolicitare Unități ability.statusfield = Câmp Suprasolicitare Unități
ability.unitspawn = Fabrică de {0} ability.unitspawn = Fabrică de {0}
ability.shieldregenfield = Scurt Regenerabil ability.shieldregenfield = Scut Regenerabil
ability.movelightning = Mișcare Fulger ability.movelightning = Mișcare Fulger
bar.drilltierreq = Burghiu Mai Bun Necesar bar.drilltierreq = Burghiu Mai Bun Necesar
@@ -749,19 +770,16 @@ bar.output = Produce
units.processorcontrol = [lightgray]Controlat de Procesor units.processorcontrol = [lightgray]Controlat de Procesor
bullet.damage = [stat]{0}[lightgray] forță bullet.damage = [stat]{0}[lightgray] forță
bullet.splashdamage = [stat]{0}[lightgray] forță explozivă ~[stat] {1}[lightgray] pătrate bullet.splashdamage = [stat]{0}[lightgray] forță pe raza ~[stat] {1}[lightgray] pătrate
bullet.incendiary = [stat]incendiar bullet.incendiary = [stat]incendiar
bullet.sapping = [stat]atragere inamici
bullet.homing = [stat]cu radar bullet.homing = [stat]cu radar
bullet.shock = [stat]șoc bullet.frag = [stat]se sparge
bullet.frag = [stat]fragil bullet.lightning = [stat]{0}[lightgray]x fulgere ~ [stat]{1}[lightgray] forță
bullet.buildingdamage = [stat]{0}%[lightgray] forță/clădire bullet.buildingdamage = [stat]{0}%[lightgray] forță/clădire
bullet.knockback = [stat]{0} [lightgray]împingere bullet.knockback = [stat]{0} [lightgray]împingere
bullet.pierce = [stat]{0}[lightgray]x penetrare bullet.pierce = [stat]{0}[lightgray]x penetrează
bullet.infinitepierce = [stat]penetrare bullet.infinitepierce = [stat]penetrează
bullet.healpercent = [stat]{0}[lightgray]% reparare bullet.healpercent = [stat]{0}[lightgray]% reparare
bullet.freezing = [stat]înghețat
bullet.tarred = [stat]lipicios
bullet.multiplier = [stat]{0}[lightgray]x multiplicator muniție bullet.multiplier = [stat]{0}[lightgray]x multiplicator muniție
bullet.reload = [stat]{0}[lightgray]x lovituri bullet.reload = [stat]{0}[lightgray]x lovituri
@@ -923,6 +941,7 @@ keybind.pause_building.name = Pauză/Reia Construit
keybind.minimap.name = Minihartă keybind.minimap.name = Minihartă
keybind.planet_map.name = Harta Planetei keybind.planet_map.name = Harta Planetei
keybind.research.name = Cercetare keybind.research.name = Cercetare
keybind.block_info.name = Informațiile Blocului
keybind.chat.name = Chat keybind.chat.name = Chat
keybind.player_list.name = Listă Jucători keybind.player_list.name = Listă Jucători
keybind.console.name = Consolă keybind.console.name = Consolă
@@ -991,6 +1010,7 @@ content.item.name = Materiale
content.liquid.name = Lichide content.liquid.name = Lichide
content.unit.name = Unități content.unit.name = Unități
content.block.name = Blocuri content.block.name = Blocuri
content.status.name = Efecte de Status
content.sector.name = Sectoare content.sector.name = Sectoare
item.copper.name = Cupru item.copper.name = Cupru
@@ -1339,7 +1359,7 @@ item.pyratite.description = Folosită în armele incendiare și generatoarele pe
liquid.water.description = Folosită pt răcirea mașinăriilor și procesarea deșeurilor. liquid.water.description = Folosită pt răcirea mașinăriilor și procesarea deșeurilor.
liquid.slag.description = Rafinată în separatoare înapoi în materialele constituente, sau pulverizată înspre unitățile inamice ca armă. liquid.slag.description = Rafinată în separatoare înapoi în materialele constituente, sau pulverizată înspre unitățile inamice ca armă.
liquid.oil.description = Folosit în producerea avansată de materialet și ca muniție incendiară. liquid.oil.description = Folosit în producerea avansată de materiale și ca muniție incendiară.
liquid.cryofluid.description = Folosit ca răcitor în reactoare, arme și fabrici. liquid.cryofluid.description = Folosit ca răcitor în reactoare, arme și fabrici.
block.resupply-point.description = Realimentează unitățile din apropiere cu muniție de cupru. Nu este compatibil cu unitățile care se încarcă din baterii. block.resupply-point.description = Realimentează unitățile din apropiere cu muniție de cupru. Nu este compatibil cu unitățile care se încarcă din baterii.
@@ -1459,7 +1479,7 @@ block.ripple.description = Lovește cu capsule către inamici pe distanțe mari.
block.cyclone.description = Trage cu grămezi explozive de material către unitățile inamice din apropiere. block.cyclone.description = Trage cu grămezi explozive de material către unitățile inamice din apropiere.
block.spectre.description = Trage cu gloanțe mari care penetrează scuturile inamicilor din apropiere. block.spectre.description = Trage cu gloanțe mari care penetrează scuturile inamicilor din apropiere.
block.meltdown.description = Se încarcă și trage cu un laser continuu la inamicii din apropiere. Necesită răcitor pt a opera. block.meltdown.description = Se încarcă și trage cu un laser continuu la inamicii din apropiere. Necesită răcitor pt a opera.
block.foreshadow.description = Trage către o țintă cu un glonț imens pe distanțe lungi. block.foreshadow.description = Trage către o țintă cu un glonț imens pe distanțe lungi. Inamicii cu mai multă viață au prioritate.
block.repair-point.description = Repară încontinuu cea mai deteriorată unitate din vecinătate. block.repair-point.description = Repară încontinuu cea mai deteriorată unitate din vecinătate.
block.segment.description = Deteriorează și distruge proiectilele din apropiere. Laserele nu sunt afectate. block.segment.description = Deteriorează și distruge proiectilele din apropiere. Laserele nu sunt afectate.
block.parallax.description = Trage cu o rază tractoare care atrage aeronavele inamice, deteriorându-le. block.parallax.description = Trage cu o rază tractoare care atrage aeronavele inamice, deteriorându-le.
@@ -1499,8 +1519,8 @@ unit.vela.description = Trage cu un laser masiv, continuu, inflamabil care deter
unit.corvus.description = Trage cu e explozie masivă de lasere care deteriorează inamicii și repară structurile aliate. Poate merge peste majoritatea terenurilor. unit.corvus.description = Trage cu e explozie masivă de lasere care deteriorează inamicii și repară structurile aliate. Poate merge peste majoritatea terenurilor.
unit.crawler.description = Aleargă către inamici și se autodistruge, cauzând o explozie. unit.crawler.description = Aleargă către inamici și se autodistruge, cauzând o explozie.
unit.atrax.description = Trage cu globuri de zgură care slăbesc artileria inamică. Poate merge peste majoritatea terenurilor. unit.atrax.description = Trage cu globuri de zgură care slăbesc artileria inamică. Poate merge peste majoritatea terenurilor.
unit.spiroct.description = Trage cu lasere care apropie inamicii, autoreparându-se în acest proces. Poate merge peste majoritatea terenurilor. unit.spiroct.description = Trage cu lasere care apropie și slăbesc inamicii, autoreparându-se în acest proces. Poate merge peste majoritatea terenurilor.
unit.arkyid.description = Trage cu lasere mari care apropie inamicii, autoreparându-se în acest proces. Poate merge peste majoritatea terenurilor. unit.arkyid.description = Trage cu lasere mari care apropie și slăbesc inamicii, autoreparându-se în acest proces. Poate merge peste majoritatea terenurilor.
unit.toxopid.description = Trage cu capsule electrice mari și lasere care penetrează scuturile inamice. Poate merge peste majoritatea terenurilor. unit.toxopid.description = Trage cu capsule electrice mari și lasere care penetrează scuturile inamice. Poate merge peste majoritatea terenurilor.
unit.flare.description = Trage cu gloanțe standard la artileria inamică din apropiere. unit.flare.description = Trage cu gloanțe standard la artileria inamică din apropiere.
unit.horizon.description = Aruncă grămezi de bombe peste artileria inamică. unit.horizon.description = Aruncă grămezi de bombe peste artileria inamică.

View File

@@ -388,7 +388,7 @@ waves.none = Враги не были определены.\nОбратите в
#these are intentionally in lower case #these are intentionally in lower case
wavemode.counts = количество единиц wavemode.counts = количество единиц
wavemode.totals = всего единиц wavemode.totals = всего единиц
wavemode.health = всего здоровья wavemode.health = всего прочности
editor.default = [lightgray]<По умолчанию> editor.default = [lightgray]<По умолчанию>
details = Подробности… details = Подробности…
@@ -530,7 +530,7 @@ launch.from = Запуск из: [accent]{0}
launch.destination = Место назначения: {0} launch.destination = Место назначения: {0}
configure.invalid = Количество должно быть числом между 0 и {0}. configure.invalid = Количество должно быть числом между 0 и {0}.
add = Добавить… add = Добавить…
boss.health = Здоровье стража boss.health = Прочность стража
connectfail = [scarlet]Ошибка подключения:\n\n[accent]{0} connectfail = [scarlet]Ошибка подключения:\n\n[accent]{0}
error.unreachable = Сервер недоступен.\nВы уверены, что адрес введён корректно? error.unreachable = Сервер недоступен.\nВы уверены, что адрес введён корректно?
@@ -620,6 +620,19 @@ sector.extractionOutpost.description = Отдаленный аванпост, п
sector.impact0078.description = Здесь лежат остатки межзвездного транспортного судна, первым вошедшего в эту систему.\n\nИзвлеките как можно больше из обломков. Изучите любую уцелевшую технологию. sector.impact0078.description = Здесь лежат остатки межзвездного транспортного судна, первым вошедшего в эту систему.\n\nИзвлеките как можно больше из обломков. Изучите любую уцелевшую технологию.
sector.planetaryTerminal.description = Конечная цель.\n\nЭта береговая база содержит сооружение, способное запускать ядра к окрестным планетам. Оно крайне хорошо охраняется.\n\nПроизведите морские единицы. Уничтожьте врага как можно скорее. Изучите пусковую конструкцию. sector.planetaryTerminal.description = Конечная цель.\n\nЭта береговая база содержит сооружение, способное запускать ядра к окрестным планетам. Оно крайне хорошо охраняется.\n\nПроизведите морские единицы. Уничтожьте врага как можно скорее. Изучите пусковую конструкцию.
status.burning.name = Горит
status.freezing.name = Замерзает
status.wet.name = Влажный
status.muddy.name = В грязи
status.melting.name = Плавится
status.sapped.name = Истощён
status.spore-slowed.name = Замедлен спорами
status.tarred.name = Покрыт нефтью
status.overclock.name = Ускорен
status.shocked.name = Шокирован
status.blasted.name = Подорван
status.unmoving.name = Неподвижен
settings.language = Язык settings.language = Язык
settings.data = Игровые данные settings.data = Игровые данные
settings.reset = Сбросить по умолчанию settings.reset = Сбросить по умолчанию
@@ -656,6 +669,7 @@ stat.output = Выход
stat.booster = Ускоритель stat.booster = Ускоритель
stat.tiles = Необходимые плитки stat.tiles = Необходимые плитки
stat.affinities = Увеличение эффективности stat.affinities = Увеличение эффективности
stat.opposites = Уменьшение эффективности
stat.powercapacity = Вместимость энергии stat.powercapacity = Вместимость энергии
stat.powershot = Энергия/выстрел stat.powershot = Энергия/выстрел
stat.damage = Урон stat.damage = Урон
@@ -717,6 +731,12 @@ stat.abilities = Способности
stat.canboost = Может взлететь stat.canboost = Может взлететь
stat.flying = Летающий stat.flying = Летающий
stat.ammouse = Использование боеприпасов stat.ammouse = Использование боеприпасов
stat.damagemultiplier = Множитель урона
stat.healthmultiplier = Множитель прочности
stat.speedmultiplier = Множитель скорости
stat.reloadmultiplier = Множитель перезарядки
stat.buildspeedmultiplier = Множитель скорости строительства
stat.reactive = Реактивен
ability.forcefield = Силовое поле ability.forcefield = Силовое поле
ability.repairfield = Ремонтирующее поле ability.repairfield = Ремонтирующее поле
@@ -752,17 +772,14 @@ units.processorcontrol = [lightgray]Управляется процессоро
bullet.damage = [stat]{0}[lightgray] урона bullet.damage = [stat]{0}[lightgray] урона
bullet.splashdamage = [stat]{0}[lightgray] урона в радиусе ~[stat] {1}[lightgray] блоков bullet.splashdamage = [stat]{0}[lightgray] урона в радиусе ~[stat] {1}[lightgray] блоков
bullet.incendiary = [stat]зажигательный bullet.incendiary = [stat]зажигательный
bullet.sapping = [stat]истощающий
bullet.homing = [stat]самонаводящийся bullet.homing = [stat]самонаводящийся
bullet.shock = [stat]шоковый
bullet.frag = [stat]осколочный bullet.frag = [stat]осколочный
bullet.lightning = [stat]{0}[lightgray]x молнии ~[stat]{1}[lightgray] урона
bullet.buildingdamage = [stat]{0}%[lightgray] урона по постройкам bullet.buildingdamage = [stat]{0}%[lightgray] урона по постройкам
bullet.knockback = [stat]{0}[lightgray] отбрасывания bullet.knockback = [stat]{0}[lightgray] отбрасывания
bullet.pierce = [stat]{0}[lightgray]x пробитие bullet.pierce = [stat]{0}[lightgray]x пробитие
bullet.infinitepierce = [stat]бесконечное пробитие bullet.infinitepierce = [stat]бесконечное пробитие
bullet.healpercent = [stat]{0}[lightgray]% лечения bullet.healpercent = [stat]{0}[lightgray]% лечения
bullet.freezing = [stat]замораживающий
bullet.tarred = [stat]замедляющий, горючий
bullet.multiplier = [stat]{0}[lightgray]x множитель боеприпасов bullet.multiplier = [stat]{0}[lightgray]x множитель боеприпасов
bullet.reload = [stat]{0}[lightgray]x скорость стрельбы bullet.reload = [stat]{0}[lightgray]x скорость стрельбы
@@ -924,6 +941,7 @@ keybind.pause_building.name = Приостановить/возобновить
keybind.minimap.name = Мини-карта keybind.minimap.name = Мини-карта
keybind.planet_map.name = Карта планеты keybind.planet_map.name = Карта планеты
keybind.research.name = Исследования keybind.research.name = Исследования
keybind.block_info.name = Информация о блоке
keybind.chat.name = Чат keybind.chat.name = Чат
keybind.player_list.name = Список игроков keybind.player_list.name = Список игроков
keybind.console.name = Консоль keybind.console.name = Консоль
@@ -957,10 +975,10 @@ rules.waves = Волны
rules.attack = Режим атаки rules.attack = Режим атаки
rules.buildai = Строительство ИИ rules.buildai = Строительство ИИ
rules.enemyCheat = Бесконечные ресурсы ИИ (красная команда) rules.enemyCheat = Бесконечные ресурсы ИИ (красная команда)
rules.blockhealthmultiplier = Множитель здоровья блоков rules.blockhealthmultiplier = Множитель прочности блоков
rules.blockdamagemultiplier = Множитель урона блоков rules.blockdamagemultiplier = Множитель урона блоков
rules.unitbuildspeedmultiplier = Множитель скорости производства боев. ед. rules.unitbuildspeedmultiplier = Множитель скорости производства боев. ед.
rules.unithealthmultiplier = Множитель здоровья боев. ед. rules.unithealthmultiplier = Множитель прочности боев. ед.
rules.unitdamagemultiplier = Множитель урона боев. ед. rules.unitdamagemultiplier = Множитель урона боев. ед.
rules.unitcapvariable = Ядра увеличивают лимит единиц rules.unitcapvariable = Ядра увеличивают лимит единиц
rules.unitcap = Начальный лимит единиц rules.unitcap = Начальный лимит единиц
@@ -992,6 +1010,7 @@ content.item.name = Предметы
content.liquid.name = Жидкости content.liquid.name = Жидкости
content.unit.name = Боевые единицы content.unit.name = Боевые единицы
content.block.name = Блоки content.block.name = Блоки
content.status.name = Эффекты статуса
content.sector.name = Секторы content.sector.name = Секторы
item.copper.name = Медь item.copper.name = Медь

View File

@@ -57,9 +57,10 @@ schematic.info = {0}x{1}, блоків: {2}
schematic.disabled = [scarlet]Схеми вимкнені[]\nВам не дозволяється використовувати схеми на цій [accent]мапі[] чи [accent]сервері. schematic.disabled = [scarlet]Схеми вимкнені[]\nВам не дозволяється використовувати схеми на цій [accent]мапі[] чи [accent]сервері.
mod.featured.title = Переглядач модифікацій mod.featured.title = Переглядач модифікацій
mod.featured.dialog.title = Переглядач модифікацій mods.browser = Переглядач модифікацій
mods.browser.selected = Обрана модифікація mods.browser.selected = Обрана модифікація
mods.browser.add = Установити mods.browser.add = Установити
mods.browser.reinstall = Перевстановити
mods.github.open = Відкрити mods.github.open = Відкрити
mods.browser.sortdate = Сортувати за давністю mods.browser.sortdate = Сортувати за давністю
mods.browser.sortstars = Сортувати за кількостю зірок mods.browser.sortstars = Сортувати за кількостю зірок
@@ -107,17 +108,20 @@ uploadingpreviewfile = Вивантаження файлу попередньо
committingchanges = Здійснення змін committingchanges = Здійснення змін
done = Зроблено done = Зроблено
feature.unsupported = Ваш пристрій не підтримує цю функцію feature.unsupported = Ваш пристрій не підтримує цю функцію
mods.alphainfo = Майте на увазі, що модифікації перебувають в альфі, і [scarlet]можуть бути дуже несправними[].\nПовідомте про будь-які проблеми, які ви знайдете до Mindustry Github або Discord. mods.initfailed = [red]⚠[] Попереднього разу не вдалося ініціалізувати Mindustry. Це, ймовірно, було спричинено неправильними поведінкою модифікацій.\n\nДля запобігання нескінченним аварійним циклам [red]треба вимкнути всі модифікації.[]\n\nДля вимкнення цієї функції перейдіть до [accent]Налаштування→Гра→Вимикати модифікації після аварійного запуску[].
mods = Модифікації mods = Модифікації
mods.none = [lightgray]Модифікацій не знайдено! mods.none = [lightgray]Модифікацій не знайдено!
mods.guide = Посібник із модифікацій mods.guide = Посібник із модифікацій
mods.report = Повідомити про ваду mods.report = Повідомити про ваду
mods.openfolder = Відкрити теку mods.openfolder = Відкрити теку
mods.viewcontent = Подивитися вміст
mods.reload = Перезавантажити mods.reload = Перезавантажити
mods.reloadexit = Гра зараз закриється, щоби перезавантажити модифікації mods.reloadexit = Гра зараз закриється, щоби перезавантажити модифікації
mod.installed = [[Установлено]
mod.display = [gray]Модифікація:[orange] {0} mod.display = [gray]Модифікація:[orange] {0}
mod.enabled = [lightgray]Увімкнено mod.enabled = [lightgray]Увімкнено
mod.disabled = [scarlet]Вимкнено mod.disabled = [scarlet]Вимкнено
mod.multiplayer.compatable = [gray]Доступна в мережевій грі
mod.disable = Вимкнути mod.disable = Вимкнути
mod.content = Зміст: mod.content = Зміст:
mod.delete.error = Неможливо видалити модифікацію. Файл, можливо, використовується. mod.delete.error = Неможливо видалити модифікацію. Файл, можливо, використовується.
@@ -205,9 +209,11 @@ server.hidden = Приховано
trace = Стежити за гравцем trace = Стежити за гравцем
trace.playername = Ім’я гравця: [accent]{0} trace.playername = Ім’я гравця: [accent]{0}
trace.ip = IP: [accent]{0} trace.ip = IP: [accent]{0}
trace.id = Унікальний ідентифікатор: [accent]{0} trace.id = Ідентифікатор: [accent]{0}
trace.mobile = Мобільний клієнт: [accent]{0} trace.mobile = Мобільний клієнт: [accent]{0}
trace.modclient = Користувацький клієнт: [accent]{0} trace.modclient = Користувацький клієнт: [accent]{0}
trace.times.joined = Кількість приєднань: [accent]{0}
trace.times.kicked = Кількість вигнань: [accent]{0}
invalidid = Невірний ідентифікатор клієнта! Надішліть звіт про помилку. invalidid = Невірний ідентифікатор клієнта! Надішліть звіт про помилку.
server.bans = Блокування server.bans = Блокування
server.bans.none = Заблокованих гравців немає! server.bans.none = Заблокованих гравців немає!
@@ -297,10 +303,11 @@ loading = [accent]Завантаження…
reloading = [accent]Перезавантаження модифікацій… reloading = [accent]Перезавантаження модифікацій…
saving = [accent]Збереження… saving = [accent]Збереження…
respawn = [accent][[{0}][], щоби відродитися в ядрі respawn = [accent][[{0}][], щоби відродитися в ядрі
cancelbuilding = [accent][[{0}][], щоб очистити план cancelbuilding = [accent][[{0}][] для очищення плану
selectschematic = [accent][[{0}][], щоби вибрати та скопіювати selectschematic = [accent][[{0}][], щоби вибрати та скопіювати
pausebuilding = [accent][[{0}][], щоби призупинити будування pausebuilding = [accent][[{0}][] для призупинення будування
resumebuilding = [scarlet][[{0}][], щоби продовжити будування resumebuilding = [scarlet][[{0}][] для продовження будування
enablebuilding = [scarlet][[{0}][] для увімкнення будування
showui = Користувацький інтерфейс приховано.\nНатисніть [accent][[{0}][], щоби показати його знову. showui = Користувацький інтерфейс приховано.\nНатисніть [accent][[{0}][], щоби показати його знову.
wave = [accent]Хвиля {0} wave = [accent]Хвиля {0}
wave.cap = [accent]Хвиля {0}/{1} wave.cap = [accent]Хвиля {0}/{1}
@@ -586,6 +593,20 @@ sector.windsweptIslands.description = Далі, за береговою ліні
sector.extractionOutpost.description = Віддалений форпост, побудований ворогом для запуску ресурсів в інші сектори. \n\nМіжсекторна транспортна технологія має важливе значення для подальшого завоювання. Знищте базу. Дослідіть їхні пускові майданчики. sector.extractionOutpost.description = Віддалений форпост, побудований ворогом для запуску ресурсів в інші сектори. \n\nМіжсекторна транспортна технологія має важливе значення для подальшого завоювання. Знищте базу. Дослідіть їхні пускові майданчики.
sector.impact0078.description = Тут лежать залишки міжзоряного транспортного судна, яке вперше потрапило в цю систему. \n\nВилучіть якомога більше корисного з уламків. Дослідіть будь-яку вцілілу технологію. sector.impact0078.description = Тут лежать залишки міжзоряного транспортного судна, яке вперше потрапило в цю систему. \n\nВилучіть якомога більше корисного з уламків. Дослідіть будь-яку вцілілу технологію.
sector.planetaryTerminal.description = Кінцева мета.\n\nЦя прибережна база містить структуру, здатну запускати ядра на навколишні планети. Надзвичайно добре охороняється.\n\nВиробляє військово-морські підрозділи. Усуньте ворога якомога швидше. Дослідіть структуру запуску. sector.planetaryTerminal.description = Кінцева мета.\n\nЦя прибережна база містить структуру, здатну запускати ядра на навколишні планети. Надзвичайно добре охороняється.\n\nВиробляє військово-морські підрозділи. Усуньте ворога якомога швидше. Дослідіть структуру запуску.
status.burning.name = Палає
status.freezing.name = Замерзає
status.wet.name = Вологий
status.muddy.name = Забризканий гряззю
status.melting.name = Плавиться
status.sapped.name = Виснажений
status.spore-slowed.name = Сповільнений спорами
status.tarred.name = Покритий нафтою
status.overclock.name = Прискорений
status.shocked.name = Шокований
status.blasted.name = Підірваний
status.unmoving.name = Незворушний
settings.language = Мова settings.language = Мова
settings.data = Ігрові дані settings.data = Ігрові дані
settings.reset = За замовчуванням settings.reset = За замовчуванням
@@ -621,6 +642,7 @@ stat.output = Вивід
stat.booster = Прискорювач stat.booster = Прискорювач
stat.tiles = Необхідні плитки stat.tiles = Необхідні плитки
stat.affinities = Збільшення ефективності stat.affinities = Збільшення ефективності
stat.opposites = Зменшення ефективності
stat.powercapacity = Місткість енергії stat.powercapacity = Місткість енергії
stat.powershot = Енергія за постріл stat.powershot = Енергія за постріл
stat.damage = Шкода stat.damage = Шкода
@@ -634,7 +656,7 @@ stat.displaysize = Розмір дисплею
stat.liquidcapacity = Рідинна місткість stat.liquidcapacity = Рідинна місткість
stat.powerrange = Радіус передачі енергії stat.powerrange = Радіус передачі енергії
stat.linkrange = Радіус з’єднання stat.linkrange = Радіус з’єднання
stat.instructions = Інструкції stat.instructions = Операції
stat.powerconnections = Максимальна кількість з’єднань stat.powerconnections = Максимальна кількість з’єднань
stat.poweruse = Енергії використовує stat.poweruse = Енергії використовує
stat.powerdamage = Енергії за од. шкоди stat.powerdamage = Енергії за од. шкоди
@@ -652,6 +674,7 @@ stat.drillspeed = Базова швидкість буріння
stat.boosteffect = Прискорювальний ефект stat.boosteffect = Прискорювальний ефект
stat.maxunits = Максимальна кількість активних одиниць stat.maxunits = Максимальна кількість активних одиниць
stat.health = Здоров’я stat.health = Здоров’я
stat.armor = Броня
stat.buildtime = Час будування stat.buildtime = Час будування
stat.maxconsecutive = Максимальна послідовність stat.maxconsecutive = Максимальна послідовність
stat.buildcost = Вартість будування stat.buildcost = Вартість будування
@@ -667,6 +690,7 @@ stat.lightningchance = Шанс удару блискавки
stat.lightningdamage = Шкода від удару блискавки stat.lightningdamage = Шкода від удару блискавки
stat.flammability = Займистість stat.flammability = Займистість
stat.radioactivity = Радіоактивність stat.radioactivity = Радіоактивність
stat.charge = Заряд
stat.heatcapacity = Тепломісткість stat.heatcapacity = Тепломісткість
stat.viscosity = В’язкість stat.viscosity = В’язкість
stat.temperature = Температура stat.temperature = Температура
@@ -680,6 +704,13 @@ stat.abilities = Здібності
stat.canboost = Можна прискорити stat.canboost = Можна прискорити
stat.flying = Літає stat.flying = Літає
stat.ammouse = Патронів використовує stat.ammouse = Патронів використовує
stat.damagemultiplier = Множник шкоди
stat.healthmultiplier = Множник здоров’я
stat.speedmultiplier = Множник швидкості
stat.reloadmultiplier = Множник перезарядки
stat.buildspeedmultiplier = Множник швидкості будування
stat.reactive = Реактивний
ability.forcefield = Щитове поле ability.forcefield = Щитове поле
ability.repairfield = Ремонтувальне поле ability.repairfield = Ремонтувальне поле
ability.statusfield = Поле підсилення ability.statusfield = Поле підсилення
@@ -711,17 +742,14 @@ units.processorcontrol = [lightgray]Керується процесором
bullet.damage = [stat]{0}[lightgray] шкода bullet.damage = [stat]{0}[lightgray] шкода
bullet.splashdamage = [stat]{0}[lightgray] шкода по ділянці ~[stat] {1}[lightgray] плиток bullet.splashdamage = [stat]{0}[lightgray] шкода по ділянці ~[stat] {1}[lightgray] плиток
bullet.incendiary = [stat]запальний bullet.incendiary = [stat]запальний
bullet.sapping = [stat]виснажує
bullet.homing = [stat]самонаведення bullet.homing = [stat]самонаведення
bullet.shock = [stat]шок
bullet.frag = [stat]шкода по ділянці bullet.frag = [stat]шкода по ділянці
bullet.lightning = [stat]{0}[lightgray]x блискавки ~[stat]{1}[lightgray] шкоди
bullet.buildingdamage = [stat]{0}%[lightgray] шкода по будівлям bullet.buildingdamage = [stat]{0}%[lightgray] шкода по будівлям
bullet.knockback = [stat]{0}[lightgray] відкидання bullet.knockback = [stat]{0}[lightgray] відкидання
bullet.pierce = [stat]{0}[lightgray]x пробиття bullet.pierce = [stat]{0}[lightgray]x пробиття
bullet.infinitepierce = [stat]пробиття bullet.infinitepierce = [stat]пробиття
bullet.healpercent = [stat]{0}[lightgray]% лікування bullet.healpercent = [stat]{0}[lightgray]% лікування
bullet.freezing = [stat]заморожування
bullet.tarred = [stat]дьогтьовий
bullet.multiplier = [stat]{0}[lightgray]x патронів bullet.multiplier = [stat]{0}[lightgray]x патронів
bullet.reload = [stat]{0}[lightgray]x швидкість перезаряджання bullet.reload = [stat]{0}[lightgray]x швидкість перезаряджання
unit.blocks = блоки unit.blocks = блоки
@@ -760,6 +788,8 @@ setting.hints.name = Підказки
setting.flow.name = Показувати темп швидкості ресурсів setting.flow.name = Показувати темп швидкості ресурсів
setting.backgroundpause.name = Пауза в разі згортанні setting.backgroundpause.name = Пауза в разі згортанні
setting.buildautopause.name = Автоматичне призупинення будування setting.buildautopause.name = Автоматичне призупинення будування
setting.doubletapmine.name = Подвійне торкання для початку видобування
setting.modcrashdisable.name = Вимикати модифікації після аварійного запуску
setting.animatedwater.name = Анімаційні рідини setting.animatedwater.name = Анімаційні рідини
setting.animatedshields.name = Анімаційні щити setting.animatedshields.name = Анімаційні щити
setting.antialias.name = Згладжування[lightgray] (потребує перезапуску)[] setting.antialias.name = Згладжування[lightgray] (потребує перезапуску)[]
@@ -915,6 +945,9 @@ rules.blockdamagemultiplier = Множник шкоди блоків
rules.unitbuildspeedmultiplier = Множник швидкості виробництва бойових одиниць rules.unitbuildspeedmultiplier = Множник швидкості виробництва бойових одиниць
rules.unithealthmultiplier = Множник здоров’я бойових одиниць rules.unithealthmultiplier = Множник здоров’я бойових одиниць
rules.unitdamagemultiplier = Множник шкоди бойових одиниць rules.unitdamagemultiplier = Множник шкоди бойових одиниць
rules.unitcapvariable = Ядра збільшують обмеження на кількість одиниць
rules.unitcap = Початкове обмеження одиниць
rules.enemycorebuildradius = Радіус оборони для ворожого ядра:[lightgray] (плитки) rules.enemycorebuildradius = Радіус оборони для ворожого ядра:[lightgray] (плитки)
rules.wavespacing = Інтервал хвиль:[lightgray] (секунди) rules.wavespacing = Інтервал хвиль:[lightgray] (секунди)
rules.buildcostmultiplier = Множник затрат на будування rules.buildcostmultiplier = Множник затрат на будування
@@ -941,6 +974,7 @@ content.item.name = Предмети
content.liquid.name = Рідини content.liquid.name = Рідини
content.unit.name = Бойові одиниці content.unit.name = Бойові одиниці
content.block.name = Блоки content.block.name = Блоки
content.status.name = Ефекти стану
content.sector.name = Cектори content.sector.name = Cектори
item.copper.name = Мідь item.copper.name = Мідь
item.lead.name = Свинець item.lead.name = Свинець
@@ -994,7 +1028,7 @@ unit.gamma.name = Гамма
unit.scepter.name = Верховна влада unit.scepter.name = Верховна влада
unit.reign.name = Верховний Порядок unit.reign.name = Верховний Порядок
unit.vela.name = Пульсар Вітрил unit.vela.name = Пульсар Вітрил
unit.corvus.name = Ворон unit.corvus.name = Ґава
block.resupply-point.name = Пункт постачання block.resupply-point.name = Пункт постачання
block.parallax.name = Паралакс block.parallax.name = Паралакс
block.cliff.name = Скеля block.cliff.name = Скеля
@@ -1128,7 +1162,7 @@ block.impact-reactor.name = Імпульсний реактор
block.mechanical-drill.name = Механічний бур block.mechanical-drill.name = Механічний бур
block.pneumatic-drill.name = Пневматичний бур block.pneumatic-drill.name = Пневматичний бур
block.laser-drill.name = Лазерний бур block.laser-drill.name = Лазерний бур
block.water-extractor.name = Конденсатор води block.water-extractor.name = Екстрактор води
block.cultivator.name = Культиватор block.cultivator.name = Культиватор
block.conduit.name = Трубопровід block.conduit.name = Трубопровід
block.mechanical-pump.name = Механічна помпа block.mechanical-pump.name = Механічна помпа
@@ -1359,7 +1393,7 @@ block.diode.description = Живлення акумулятора може пр
block.battery.description = Зберігає енергію як буфер у часи надлишкової енергії. Виводить енергію в періоди дефіциту. block.battery.description = Зберігає енергію як буфер у часи надлишкової енергії. Виводить енергію в періоди дефіциту.
block.battery-large.description = Зберігає енергію як буфер у часи надлишкової енергії. Виводить енергію в періоди дефіциту. Більша ємність ніж у звичайного акумулятора. block.battery-large.description = Зберігає енергію як буфер у часи надлишкової енергії. Виводить енергію в періоди дефіциту. Більша ємність ніж у звичайного акумулятора.
block.combustion-generator.description = Виробляє енергію, спалюючи легкозаймисті матеріали, як-от вугілля. block.combustion-generator.description = Виробляє енергію, спалюючи легкозаймисті матеріали, як-от вугілля.
block.thermal-generator.description = Виробляє енергію в разі розміщення в спекотних місцях. block.thermal-generator.description = Виробляє енергію в разі розміщення в гарячих місцях.
block.steam-generator.description = Виробляє енергію, спалюючи легкозаймисті матеріали й перетворює воду в пару. block.steam-generator.description = Виробляє енергію, спалюючи легкозаймисті матеріали й перетворює воду в пару.
block.differential-generator.description = Виробляє велику кількість енергії. Використовує різницю температур між кріогенною рідиною й пиротитом, що горить. block.differential-generator.description = Виробляє велику кількість енергії. Використовує різницю температур між кріогенною рідиною й пиротитом, що горить.
block.rtg-generator.description = Використовує тепло радіоактивних сполук, які розкладаються, для отримання енергії з повільною швидкістю. block.rtg-generator.description = Використовує тепло радіоактивних сполук, які розкладаються, для отримання енергії з повільною швидкістю.
@@ -1399,8 +1433,8 @@ block.ripple.description = Вистрілює скупченням снаряд
block.cyclone.description = Підпалює вибухові грудки скупчення противників. block.cyclone.description = Підпалює вибухові грудки скупчення противників.
block.spectre.description = Вистрілює великі бронебійні кулі в повітряні та наземні цілі. block.spectre.description = Вистрілює великі бронебійні кулі в повітряні та наземні цілі.
block.meltdown.description = Заряджає і вистрілює лазерним променем у найближчих противників. Для роботи потрібен теплоносій. block.meltdown.description = Заряджає і вистрілює лазерним променем у найближчих противників. Для роботи потрібен теплоносій.
block.foreshadow.description = Вистрілює великим болтом в одну ціль на велику дистанцію block.foreshadow.description = Вистрілює великим болтом в одну ціль на велику дистанцію.
block.repair-point.description = Безперервно ремонтує найближчу пошкоджену бойову одиницю у своєму радіусі дії. block.repair-point.description = Безперервно ремонтує найближчу пошкоджену бойову одиницю у своєму радіусі дії. Пріоритетні вороги з вищим максимальним здоров’ям.
block.segment.description = Пошкоджує та руйнує вхідні снаряди. Окрім лазерних. block.segment.description = Пошкоджує та руйнує вхідні снаряди. Окрім лазерних.
block.parallax.description = Притягає ворожі повітряні одиниці, пошкоджуючи їх у процесі. block.parallax.description = Притягає ворожі повітряні одиниці, пошкоджуючи їх у процесі.
block.tsunami.description = Вистрілює потужними потоками рідини у ворогів. Автоматично гасить пожежі в разі постачання води. block.tsunami.description = Вистрілює потужними потоками рідини у ворогів. Автоматично гасить пожежі в разі постачання води.
@@ -1418,9 +1452,9 @@ block.multiplicative-reconstructor.description = Поліпшує введени
block.exponential-reconstructor.description = Поліпшує введених одиниць до четвертого рівня. block.exponential-reconstructor.description = Поліпшує введених одиниць до четвертого рівня.
block.tetrative-reconstructor.description = Поліпшує введених одиниць до п’ятого і фінального рівня. block.tetrative-reconstructor.description = Поліпшує введених одиниць до п’ятого і фінального рівня.
block.switch.description = Перемикач. Стан можна читати й контролювати за допомогою логічних процесорів. block.switch.description = Перемикач. Стан можна читати й контролювати за допомогою логічних процесорів.
block.micro-processor.description = Запускає послідовність логічних вказівок (інструкцій) у нескінченному циклі. Може використовуватися для керування блоків та будівель. block.micro-processor.description = Запускає послідовність логічних вказівок (операцій) у нескінченному циклі. Може використовуватися для керування блоків та будівель.
block.logic-processor.description = Запускає послідовність логічних вказівок (інструкцій) у нескінченному циклі. Може використовуватися для керування блоків та будівель. Швидше ніж Мікропроцесор. block.logic-processor.description = Запускає послідовність логічних вказівок (операцій) у нескінченному циклі. Може використовуватися для керування блоків та будівель. Швидше ніж Мікропроцесор.
block.hyper-processor.description = Запускає послідовність логічних вказівок (інструкцій) у нескінченному циклі. Може використовуватися для керування блоків та будівель. Швидше ніж Логічний процесор block.hyper-processor.description = Запускає послідовність логічних вказівок (операцій) у нескінченному циклі. Може використовуватися для керування блоків та будівель. Швидше ніж Логічний процесор
block.memory-cell.description = Зберігає інформацію для логічного процесора. block.memory-cell.description = Зберігає інформацію для логічного процесора.
block.memory-bank.description = Зберігає інформацію для логічного процесора. Висока місткість. block.memory-bank.description = Зберігає інформацію для логічного процесора. Висока місткість.
block.logic-display.description = Показує довільну графіку з логічного процесора. block.logic-display.description = Показує довільну графіку з логічного процесора.
@@ -1459,3 +1493,146 @@ unit.omura.description = Вистрілює у ворогів далекобій
unit.alpha.description = Захищає ядро «Уламок» від противників. Будує споруди. unit.alpha.description = Захищає ядро «Уламок» від противників. Будує споруди.
unit.beta.description = Захищає ядро «Штаб» від противників. Будує споруди. unit.beta.description = Захищає ядро «Штаб» від противників. Будує споруди.
unit.gamma.description = Захищає ядро «Атом» від противників. Будує споруди. unit.gamma.description = Захищає ядро «Атом» від противників. Будує споруди.
lst.read = Зчитує число із з’єднаної комірки пам’яті.
lst.write = Записує числу у з’єднану комірки пам’яті.
lst.print = Додайте текст до буфера друку.\nНічого не відображає, поки [accent]Print Flush[] використовується.
lst.draw = Додає операцію до буфера рисунка.\nНічого не відображає, поки [accent]Draw Flush[] використовується.
lst.drawflush = Скидає буфер операцій [accent]Draw[] на дисплей.
lst.printflush = Скидає буфер операцій [accent]Print[] у блок «Повідомлення».
lst.getlink = Отримати посилання на процесор за допомогою індекса. Починається з 0.
lst.control = Контролює будівлю.
lst.radar = Знаходження одиниць навколо будівлі у радіусі дії.
lst.sensor = Отримати дані з певної будівлі чи одиниці.
lst.set = Установити значення змінної.
lst.operation = Виконує операцію над 1-2 змінними.
lst.end = Перейти до верхньої частини стеку операцій.
lst.jump = Умовне переходження до іншої операції.
lst.unitbind = Прив’язка до одиниці певного типу та його зберігання в [accent]@unit[].
lst.unitcontrol = Контролювати поточну прив’язану одиницю.
lst.unitradar = Знайти одиницю біля поточної прив’язаної одиниці.
lst.unitlocate = Виявляє позицію чи будівлю певного типу де завгодно на мапі.\nПотрібна прив’язана одиниця.
logic.nounitbuild = [red]Будування за допомогою процесорів заборено.
lenum.type = Тип будівлі чи одиниці.\nНаприклад, для будь-якого маршрутизатора (англ. router), функція вертатиме [accent]@router[].\nНе є рядком.
lenum.shoot = Стріляти в зазначену позицію.
lenum.shootp = Стріляти в одиницю чи будівлю із передбаченням швидкості.
lenum.configure = Конфігурація будівлі, як-от в сортувальника.
lenum.enabled = Чи блок увімкнено.
laccess.color = Колір освітлювача.
laccess.controller = Керувач одиницями. Якщо процесор керує одиницею, повертає процесор.\nЯкщо у формуванні, повертається лідер.\nІнакше повертає саму одиницю.
laccess.dead = Чи є одиниця або будівля мертвою або недійсною.
laccess.controlled = Повертає \n[accent]@ctrlProcessor[] якщо одиниця контролюється процесором;\n[accent]@ctrlPlayer[] якщо одиниця чи будівля контролюєть гравцем\n[accent]@ctrlFormation[] якщо одиниця у загоні (формуванні)\nІнакше — 0.
laccess.commanded = [red]Застаріле. Буде видалено![]\nВикористовуйте натомість [accent]controlled[].
graphicstype.clear = Залити дисплей вказаним кольором.
graphicstype.color = Установити колір для подальшої операції малювання.
graphicstype.stroke = Установити ширину ліній.
graphicstype.line = Накреслити відрізок лінії.
graphicstype.rect = Залити кольором прямокутник.
graphicstype.linerect = Намалювати контур прямокутника.
graphicstype.poly = Залити кольором правильний багатокутник.
graphicstype.linepoly = Намалювати контур правильного багатокутника.
graphicstype.triangle = Залити кольором трикутник.
graphicstype.image = Намалювати зображення із деяким вмістом.\nНаприклад: [accent]@router[] чи [accent]@dagger[].
lenum.always = Завжди істинне.
lenum.idiv = Ціле ділення.
lenum.div = Ділення.\nПовертає [accent]null[] при діленні на нуль.
lenum.mod = Залишок від ділення.
lenum.equal = Рівно. Примусове приведення типів.\nНе-null об’єкти порівняно з числами стають 1, інакше — 0.
lenum.notequal = Не рівно. Примусове приведення типів.
lenum.strictequal = Сувора рівність. Примусового приведення типів немає.\nМожна використати для перевірки на [accent]null[].
lenum.shl = Зсув бітів ліворуч.
lenum.shr = Зсув бітів праворуч.
lenum.or = Побітове АБО (OR).
lenum.land = Побітове логічне І.
lenum.and = Побітове І.
lenum.not = Побітове заперечення.
lenum.xor = Виключне АБО (XOR).
lenum.min = Мінімум з двух чисел.
lenum.max = Максимум з двух чисел.
lenum.angle = Кут вектора у градусах.
lenum.len = Довжина вектора.
lenum.sin = Синус, у градусах.
lenum.cos = Косинус, у градусах.
lenum.tan = Тангенс, у градусах.
#це не одруківка, пошукайте 'позначення діапазону'
lenum.rand = Випадкове десяткове число у діапазоні [0, значення).
lenum.log = Натуральний логарифм (ln).
lenum.log10 = Десятковий логарифм.
lenum.noise = Двовимірний симлекс-шум.
lenum.abs = Абсолютне значення.
lenum.sqrt = Квадратний корінь.
lenum.any = Будь-яка одиниця.
lenum.ally = Союзна одиниця.
lenum.attacker = Одиниця зі зброєю.
lenum.enemy = Ворожа одиниця.
lenum.boss = Одиниця «Вартовий».
lenum.flying = Одиниця, що літає.
lenum.ground = Наземна одиниця.
lenum.player = Одиниця, керована гравцем.
lenum.ore = Родовище руди.
lenum.damaged = Пошкоджені союзні будівлі.
lenum.spawn = Точка появи ворогів.\nМоже бути ядром чи позицією.
lenum.building = Будування певної групи.
lenum.core = Будь-яке ядро.
lenum.storage = Складське приміщення, як-от Сховище.
lenum.generator = Будівлі, що виробляють енергію.
lenum.factory = Будівлі, що видозмінюють ресурси.
lenum.repair = Ремонтні пункти.
lenum.rally = Командний центр.
lenum.battery = Будь-який акумулятор.
lenum.resupply = Пункти постачання.\nДоречні лише коли кор. правило [accent]«Бойові одиниці потребують боєприпасів»[] увімкнено.
lenum.reactor = Імпульсний чи Торієвий реактор.
lenum.turret = Будь-яка башта.
sensor.in = Будівля чи одиниця для розпізнавання.
radar.from = Від якої будівлі треба розпізнавати.\nРадіус розпізнавання обмежено радіусом будівництва.
radar.target = Фільтр для розпізнавання одиниць.
radar.and = Додаткові фільтри.
radar.order = Порядок сортування. 0 — сортування у зворотньому порядку.
radar.sort = Показник для сортування результатів.
radar.output = Змінна для записув вихідної одиниці.
unitradar.target = Фільтр для розпізнавання одиниць.
unitradar.and = Додаткові фільтри.
unitradar.order = Порядок сортування. 0 — сортування у зворотньому порядку.
unitradar.sort = Показник для сортування результатів.
unitradar.output = Змінна для записув вихідної одиниці.
control.of = Будівля для контролювання.
control.unit = Одиниця чи будівля для прицілювання.
control.shoot = Чи стріляє.
unitlocate.enemy = Чи знаходити ворожі будівлі.
unitlocate.found = Чи був об’єкт знайдений.
unitlocate.building = Змінна для запису знайденої будівлі
unitlocate.outx = Виводить координату X.
unitlocate.outy = Виводить координату Y.
unitlocate.group = Група будівль для пошуку.
lenum.idle = Зупиняти рух, проте продовжути будувати чи видобувати.\nСтан за замовчуванням.
lenum.stop = Зупинити або рух, або видобуток, або будівництво.
lenum.move = Перемістити в точне положення.
lenum.approach = Наближення до позиції із зазначеним радіусом.
lenum.pathfind = Знайдення шляху до точки появи ворогів.
lenum.target = Стрільба в задану позицію.
lenum.targetp = Стріляти в ціль із передбаченням швидкості.
lenum.itemdrop = Викинути предмет.
lenum.itemtake = Взяти предмет з будівлі.
lenum.paydrop = Скинути поточний вантаж.
lenum.paytake = Підібрати вантаж у поточному місцерозташуванні.
lenum.flag = Числовий флаг одиниці.
lenum.mine = Видобувати у заданій позиції.
lenum.build = Побудувати будівлю.
lenum.getblock = Розпізнавання блока та його типа за координатами.\nОдиниця повинна знаходитися в межах досяжності.\nСуцільні не-будівлі матимуть тип [accent]@solid[].
lenum.within = Чи знаходиться одиниця біля позиції.
lenum.boost = Почати чи зупинити політ.

View File

@@ -787,6 +787,7 @@ setting.shadows.name = 影子
setting.blockreplace.name = 自动推荐合适的建筑 setting.blockreplace.name = 自动推荐合适的建筑
setting.linear.name = 抗锯齿 setting.linear.name = 抗锯齿
setting.hints.name = 提示 setting.hints.name = 提示
setting.logichints.name = 逻辑代码提示
setting.flow.name = 显示资源传送速度[scarlet] setting.flow.name = 显示资源传送速度[scarlet]
setting.backgroundpause.name = 在背景中暂停 setting.backgroundpause.name = 在背景中暂停
setting.buildautopause.name = 自动暂停建造 setting.buildautopause.name = 自动暂停建造
@@ -1503,3 +1504,145 @@ unit.omura.description = 攻击附近所有敌人。发射远程穿透轨道炮
unit.alpha.description = 保护初代核心。可构建结构。 unit.alpha.description = 保护初代核心。可构建结构。
unit.beta.description = 保护次代核心。可构建结构。 unit.beta.description = 保护次代核心。可构建结构。
unit.gamma.description = 保护终代核心。可构建结构。 unit.gamma.description = 保护终代核心。可构建结构。
lst.read = 从连接的内存读取数字
lst.write = 写入数字到连接的内存
lst.print = 添加文字到打印缓存\n用了[accent]Print Flush[]才会显示
lst.draw = 添加操作到绘图队列\n用了[accent]Draw Flush[]才会显示
lst.drawflush = 刷新列队的[accent]Print[]操作到显示屏
lst.printflush = 刷新[accent]Draw[]缓存的文字到消息板
lst.getlink = 获取处理器连接\n索引从0开始
lst.control = 控制建筑
lst.radar = 定位建筑周边的单位\n有范围限制
lst.sensor = 从建筑或单位取得数据
lst.set = 设置变量
lst.operation = 操作一两个变量
lst.end = 跳至指令栈顶\n第一条语句
lst.jump = 有条件地跳到另一语句
lst.unitbind = 绑定下一个某型号单位\n并存到[accent]@unit[]
lst.unitcontrol = 控制绑定的单位
lst.unitradar = 定位绑定的单位周围的单位
lst.unitlocate = 定位指定类型的建筑或位置\n全图范围需要绑定单位
logic.nounitbuild = [red]这儿不允许处理器控制单位去建设
lenum.type = 建筑和单位的类型,不是字串\n比如路由器返回[accent]@router[]
lenum.shoot = 瞄准/射击某个位置
lenum.shootp = 按提前量瞄准/射击目标
lenum.configure = 建筑配置,比如分拣器分拣的物品
lenum.enabled = 建筑的启用状态
laccess.color = 照明器发光的颜色
laccess.controller = 单位控制者\n如果是处理器返回处理器\n如果在编队中返回领队\n其他的返回单位自己
laccess.dead = 单位或建筑是不是死了或无效了
laccess.controlled = 若单位控制者是处理器,返回[accent]@ctrlProcessor[]\n若单位/建筑由玩家控制,返回[accent]@ctrlPlayer[]\n若单位在编队中返回[accent]@ctrlFormation[]\n其他的返回0
laccess.commanded = [red]已弃用,将被移除![]\n应该使用[accent]controlled[]
graphicstype.clear = 用指定颜色填满显示屏
graphicstype.color = 设置后续画图操作的颜色
graphicstype.stroke = 设置线宽
graphicstype.line = 画线段
graphicstype.rect = 填充矩形
graphicstype.linerect = 画矩形框
graphicstype.poly = 填充正多边形
graphicstype.linepoly = 画正多边形框
graphicstype.triangle = 填充三角形
graphicstype.image = 画出游戏内容的图像\n比如[accent]@router[]和[accent]@dagger[]
lenum.always = 总是跳转
lenum.idiv = 整除
lenum.div = 除法除以0时返回[accent]null[]
lenum.mod = 取余数
lenum.equal = 相等。有转换\nnull比较数字时算作0非null对象算作1
lenum.notequal = 不相等。有转换
lenum.strictequal = 严格相等。不转换\n可用于检查[accent]null[]
lenum.shl = 左移位
lenum.shr = 右移位
lenum.or = 按位或
lenum.land = 逻辑与
lenum.and = 按位与
lenum.not = 按位非
lenum.xor = 按位异或
lenum.min = 取小的那个数
lenum.max = 取大的那个数
lenum.angle = 方位角°
lenum.len = 原点到该点距离
lenum.sin = 正弦°(对边:斜边)
lenum.cos = 余弦°(邻边:斜边)
lenum.tan = 正切°(对边:邻边)
lenum.rand = [0, 值) 范围内随机数
lenum.log = 自然对数(ln)
lenum.log10 = 10底对数
lenum.noise = 二维单形噪声
lenum.abs = 绝对值
lenum.sqrt = 二次方根
lenum.any = 任意单位
lenum.ally = 友方单位
lenum.attacker = 有武器的单位
lenum.enemy = 敌方单位
lenum.boss = Boss单位
lenum.flying = 飞行单位
lenum.ground = 地面单位
lenum.player = 玩家控制的单位
lenum.ore = 矿床
lenum.damaged = 受损的友方建筑
lenum.spawn = 敌人出生点\n可能是核心或地点
lenum.building = 分组内的建筑
lenum.core = 核心
lenum.storage = 容器/仓库
lenum.generator = 发电建筑
lenum.factory = 工厂
lenum.repair = 维修点
lenum.rally = 指挥中心
lenum.battery = 电池
lenum.resupply = 补给点\n仅当启用[accent]“单位弹药”[]时有用
lenum.reactor = 钍反应堆/冲击反应堆
lenum.turret = 炮塔
sensor.in = 要传感的建筑或单位
radar.from = 要实施探测的建筑\n探测距离受限于建筑范围
radar.target = 筛选要探测的单位
radar.and = 更多筛子
radar.order = 排序1(true)从小到大 0(false)反序
radar.sort = 排序的量度
radar.output = 输出单位的变量
unitradar.target = 筛选要探测的单位
unitradar.and = 更多筛子
unitradar.order = 排序1(true)从小到大 0(false)反序
unitradar.sort = 排序的量度
unitradar.output = 输出单位的变量
control.of = 要控制的建筑
control.unit = 要瞄准的单位或建筑
control.shoot = 是否射击
unitlocate.enemy = 定位敌方还是我方建筑
unitlocate.found = 有没有找到
unitlocate.building = 找到的建筑的输出变量
unitlocate.outx = 输出X坐标
unitlocate.outy = 输出Y坐标
unitlocate.group = 要找的建筑组
lenum.idle = 不移动,但进行采矿/修建\n默认状态
lenum.stop = 停止移动/采矿/修建
lenum.move = 移动到某个位置
lenum.approach = 接近到某个圆形区域
lenum.pathfind = 找路去敌人出生点
lenum.target = 瞄准/射击某个位置
lenum.targetp = 按提前量瞄准/射击目标
lenum.itemdrop = 放物品到建筑
lenum.itemtake = 从建筑拿物品
lenum.paydrop = 放下当前载荷
lenum.paytake = 从地上拿起载荷
lenum.flag = 数字值的单位旗标
lenum.mine = 采矿
lenum.build = 修建结构
lenum.getblock = 获取某坐标的建筑和类型\n坐标需在单位范围内\n或单位在建筑范围内\n地形物类型是[accent]@solid[]或[accent]@air[]
lenum.within = 检查单位在不在半径内
lenum.boost = 开始/停止助推

View File

@@ -113,7 +113,7 @@ committingchanges = 遞交變更
done = 完成 done = 完成
feature.unsupported = 您的裝置不支援此功能。 feature.unsupported = 您的裝置不支援此功能。
mods.alphainfo = 請記住模組仍處於Alpha狀態[scarlet]可能會有很多臭蟲[]。\n請到Mindustry GitHub或Discord報告發現的任何問題。 mods.initfailed = [red]⚠[] Mindustry 無法啟動。這可能是因模組造成。\n\n為了避免不斷閃退[red]所有的模組已被停用。[]\n\n若要取消此設定可在[accent]設定->遊戲->閃退後停用模組[]關閉設定.
mods = 模組 mods = 模組
mods.none = [lightgray]找不到模組! mods.none = [lightgray]找不到模組!
mods.guide = 模組指南 mods.guide = 模組指南
@@ -126,6 +126,7 @@ mod.display = [gray]模組:[orange]{0}
mod.installed = [[已安裝] mod.installed = [[已安裝]
mod.enabled = [lightgray]已啟用 mod.enabled = [lightgray]已啟用
mod.disabled = [scarlet]已禁用 mod.disabled = [scarlet]已禁用
mod.multiplayer.compatible = [gray]與多人模式相容
mod.disable = 禁用 mod.disable = 禁用
mod.content = 內容: mod.content = 內容:
mod.delete.error = 無法刪除模組,檔案可能在使用中。 mod.delete.error = 無法刪除模組,檔案可能在使用中。
@@ -219,6 +220,8 @@ trace.ip = IP[accent]{0}
trace.id = ID[accent]{0} trace.id = ID[accent]{0}
trace.mobile = 行動客戶端:[accent]{0} trace.mobile = 行動客戶端:[accent]{0}
trace.modclient = 自訂客戶端:[accent]{0} trace.modclient = 自訂客戶端:[accent]{0}
trace.times.joined = 加入次數:[accent]{0}
trace.times.kicked = 踢除次數:[accent]{0}
invalidid = 無效的客戶端 ID請遞交錯誤回報。 invalidid = 無效的客戶端 ID請遞交錯誤回報。
server.bans = 封鎖 server.bans = 封鎖
server.bans.none = 沒有玩家被封鎖! server.bans.none = 沒有玩家被封鎖!
@@ -617,6 +620,19 @@ sector.extractionOutpost.description = 由敵方建造的遠端哨站,用來
sector.impact0078.description = 沉睡在此的是第一個進入本星系的星際運輸船。\n\n回收任何能利用的東西。研究任何含有的科技。 sector.impact0078.description = 沉睡在此的是第一個進入本星系的星際運輸船。\n\n回收任何能利用的東西。研究任何含有的科技。
sector.planetaryTerminal.description = 最終目標。\n\n這麼濱海基地具有能夠發射核心到其他行星的建築。 其防禦非常嚴密。\n\n生產海上單位。盡速摧毀敵人。研究該發射建築。 sector.planetaryTerminal.description = 最終目標。\n\n這麼濱海基地具有能夠發射核心到其他行星的建築。 其防禦非常嚴密。\n\n生產海上單位。盡速摧毀敵人。研究該發射建築。
status.burning.name = 燃燒
status.freezing.name = 凍結
status.wet.name = 浸濕
status.muddy.name = 泥濘
status.melting.name = 融化
status.sapped.name = 被吸血
status.spore-slowed.name = 孢子緩速
status.tarred.name = 焦油
status.overclock.name = 快轉
status.shocked.name = 電擊
status.blasted.name = 爆炸
status.unmoving.name = 立定
settings.language = 語言 settings.language = 語言
settings.data = 遊戲資料 settings.data = 遊戲資料
settings.reset = 重設為預設設定 settings.reset = 重設為預設設定
@@ -653,6 +669,7 @@ stat.output = 輸出
stat.booster = 強化 stat.booster = 強化
stat.tiles = 需求方塊 stat.tiles = 需求方塊
stat.affinities = 親和方塊 stat.affinities = 親和方塊
stat.opposites = 相對方塊
stat.powercapacity = 蓄電量 stat.powercapacity = 蓄電量
stat.powershot = 能量/射擊 stat.powershot = 能量/射擊
stat.damage = 傷害 stat.damage = 傷害
@@ -714,6 +731,12 @@ stat.abilities = 能力
stat.canboost = 可加速 stat.canboost = 可加速
stat.flying = 飛行中 stat.flying = 飛行中
stat.ammouse = 彈藥使用 stat.ammouse = 彈藥使用
stat.damagemultiplier = 傷害加成
stat.healthmultiplier = 血量加成
stat.speedmultiplier = 速度加成
stat.reloadmultiplier = 射速加成
stat.buildspeedmultiplier = 建造速度加成
stat.reactive = 具反應性
ability.forcefield = 防護罩 ability.forcefield = 防護罩
ability.repairfield = 維修力場 ability.repairfield = 維修力場
@@ -749,17 +772,14 @@ units.processorcontrol = [lightgray]由微處理器控制
bullet.damage = [stat]{0}[lightgray]傷害 bullet.damage = [stat]{0}[lightgray]傷害
bullet.splashdamage = [stat]{0}[lightgray]範圍傷害 ~[stat] {1}[lightgray]格 bullet.splashdamage = [stat]{0}[lightgray]範圍傷害 ~[stat] {1}[lightgray]格
bullet.incendiary = [stat]燃燒 bullet.incendiary = [stat]燃燒
bullet.sapping = [stat]吸血
bullet.homing = [stat]追蹤 bullet.homing = [stat]追蹤
bullet.shock = [stat]電擊
bullet.frag = [stat]破片彈 bullet.frag = [stat]破片彈
bullet.lightning = [stat]{0}[lightgray]x 電弧 ~[stat]{1}[lightgray] 傷害
bullet.buildingdamage = [stat]{0}%[lightgray] 建築傷害 bullet.buildingdamage = [stat]{0}%[lightgray] 建築傷害
bullet.knockback = [stat]{0}[lightgray]擊退 bullet.knockback = [stat]{0}[lightgray]擊退
bullet.pierce = [stat]{0}[lightgray]×穿刺 bullet.pierce = [stat]{0}[lightgray]×穿刺
bullet.infinitepierce = [stat]穿刺 bullet.infinitepierce = [stat]穿刺
bullet.healpercent = [stat]{0}[lightgray]% 回復 bullet.healpercent = [stat]{0}[lightgray]% 回復
bullet.freezing = [stat]冷凍
bullet.tarred = [stat]焦油
bullet.multiplier = [stat]{0}[lightgray]×彈藥倍數 bullet.multiplier = [stat]{0}[lightgray]×彈藥倍數
bullet.reload = [stat]{0}[lightgray]×射擊速率 bullet.reload = [stat]{0}[lightgray]×射擊速率
@@ -800,6 +820,8 @@ setting.logichints.name = 邏輯提示
setting.flow.name = 顯示資源輸送速度 setting.flow.name = 顯示資源輸送速度
setting.backgroundpause.name = 背景執行時暫停 setting.backgroundpause.name = 背景執行時暫停
setting.buildautopause.name = 自動暫停建築 setting.buildautopause.name = 自動暫停建築
setting.doubletapmine.name = 連續點擊以挖礦
setting.modcrashdisable.name = 閃退後停用模組
setting.animatedwater.name = 液體動畫 setting.animatedwater.name = 液體動畫
setting.animatedshields.name = 護盾動畫 setting.animatedshields.name = 護盾動畫
setting.antialias.name = 消除鋸齒[lightgray](需要重新啟動遊戲)[] setting.antialias.name = 消除鋸齒[lightgray](需要重新啟動遊戲)[]
@@ -987,6 +1009,7 @@ content.item.name = 物品
content.liquid.name = 液體 content.liquid.name = 液體
content.unit.name = 單位 content.unit.name = 單位
content.block.name = 方塊 content.block.name = 方塊
content.status.name = 狀態效果
content.sector.name = 地區 content.sector.name = 地區
item.copper.name = item.copper.name =
@@ -1455,7 +1478,7 @@ block.ripple.description = 極為強大的迫擊炮塔。一次向敵人發射
block.cyclone.description = 一種對空和對地的大型砲塔。向附近單位發射爆裂性的碎塊。 block.cyclone.description = 一種對空和對地的大型砲塔。向附近單位發射爆裂性的碎塊。
block.spectre.description = 一種雙炮管的巨型砲塔。向空中及地面敵人發射大型的穿甲彈。 block.spectre.description = 一種雙炮管的巨型砲塔。向空中及地面敵人發射大型的穿甲彈。
block.meltdown.description = 一種巨型雷射砲塔。充電並發射持續性的雷射光束。需要冷卻液以運作。 block.meltdown.description = 一種巨型雷射砲塔。充電並發射持續性的雷射光束。需要冷卻液以運作。
block.foreshadow.description = 在遠方狙擊單一目標。 block.foreshadow.description = 在遠方狙擊單一目標。優先攻擊總血量較高的單位。
block.repair-point.description = 持續治療附近最近的受損單位。 block.repair-point.description = 持續治療附近最近的受損單位。
block.segment.description = 傷害並摧毀來襲的砲彈。無法將雷射武器的光束作為目標。 block.segment.description = 傷害並摧毀來襲的砲彈。無法將雷射武器的光束作為目標。
block.parallax.description = 發射牽引光束,牽引空中目標,並在此過程中損壞它們。 block.parallax.description = 發射牽引光束,牽引空中目標,並在此過程中損壞它們。
@@ -1536,6 +1559,8 @@ lst.unitcontrol = 控制現在綁定的單位
lst.unitradar = 偵測綁定單位附近的單位 lst.unitradar = 偵測綁定單位附近的單位
lst.unitlocate = 尋找整個地圖上特定的位置/建築\n需要綁定的單位 lst.unitlocate = 尋找整個地圖上特定的位置/建築\n需要綁定的單位
logic.nounitbuild = [red]單位建造邏輯已被禁止。
lenum.type = 建築/單位種類。\n例操控單位建造光矛砲應使用[accent]@lancer[],而非字串 lenum.type = 建築/單位種類。\n例操控單位建造光矛砲應使用[accent]@lancer[],而非字串
lenum.shoot = 對該位置開火 lenum.shoot = 對該位置開火
lenum.shootp = 對指定單位/建築開火,具自瞄功能 lenum.shootp = 對指定單位/建築開火,具自瞄功能
@@ -1543,10 +1568,14 @@ lenum.configure = 建築設定,如分類器、兵器工廠
lenum.enabled = 確認該建築是否啟用 lenum.enabled = 確認該建築是否啟用
laacess.color = 設定照明燈的顏色 laacess.color = 設定照明燈的顏色
laccess.controller = 單位的控制者。受處理器控制時回傳處理器。\n在隊形中回傳領導的單位。\n否則回傳單位自己。
laccess.dead = 單位或建築是否已死亡或不存在。
laccess.controlled = 將回傳:\n處理器控制[accent]@ctrlProcessor[]\n玩家控制[accent]@ctrlPlayer[]\n在隊形中[accent]@ctrlFormation[]\n其他[accent]0[]。
laccess.commanded = [red]Deprecated. Will be removed![]\nUse [accent]controlled[] instead.
graphicstype.clear = 重製版面為指定顏色 graphicstype.clear = 重製版面為指定顏色
graphicstype.color = 接下來的圖畫指令設定顏色 graphicstype.color = 後續所有圖畫指令設定顏色
graphicstype.stroke = 接下來的圖畫指令設定直線寬度 graphicstype.stroke = 後續所有圖畫指令設定直線寬度
graphicstype.line = 畫一直線 graphicstype.line = 畫一直線
graphicstype.rect = 畫實心長方形 graphicstype.rect = 畫實心長方形
graphicstype.linerect = 畫空心長方形 graphicstype.linerect = 畫空心長方形
@@ -1636,6 +1665,7 @@ unitlocate.outx = 回傳 X 座標
unitlocate.outy = 回傳 Y 座標 unitlocate.outy = 回傳 Y 座標
unitlocate.group = 搜索建築種類 unitlocate.group = 搜索建築種類
lenum.idle = 預設AI
lenum.stop = 停止移動/挖礦/建造 lenum.stop = 停止移動/挖礦/建造
lenum.move = 移動到指定位置 lenum.move = 移動到指定位置
lenum.approach = 移動到距離指定位置一段距離的地方 lenum.approach = 移動到距離指定位置一段距離的地方

View File

@@ -114,3 +114,8 @@ simba-fs
RedRadiation RedRadiation
Marko Zajc Marko Zajc
CPX MC CPX MC
Phinner
BTA_Susideur
nilq
AsgerHB
AzCraft

View File

@@ -315,3 +315,22 @@
63418=legacy-unit-factory-ground|block-legacy-unit-factory-ground-medium 63418=legacy-unit-factory-ground|block-legacy-unit-factory-ground-medium
63417=interplanetary-accelerator|block-interplanetary-accelerator-medium 63417=interplanetary-accelerator|block-interplanetary-accelerator-medium
63416=basalt-boulder|block-basalt-boulder-medium 63416=basalt-boulder|block-basalt-boulder-medium
63415=none|status-none-icon
63414=burning|status-burning-icon
63413=freezing|status-freezing-icon
63412=unmoving|status-unmoving-icon
63411=slow|status-slow-icon
63410=wet|status-wet-icon
63409=muddy|status-muddy-icon
63408=melting|status-melting-icon
63407=sapped|status-sapped-icon
63406=spore-slowed|status-spore-slowed-icon
63405=tarred|status-tarred-icon
63404=overdrive|status-overdrive-icon
63403=overclock|status-overclock-icon
63402=shielded|status-shielded-icon
63401=boss|status-boss-icon
63400=shocked|status-shocked-icon
63399=blasted|status-blasted-icon
63398=corroded|status-corroded-icon
63397=disarmed|status-disarmed-icon

View File

@@ -143,7 +143,7 @@ public abstract class ClientLauncher extends ApplicationCore implements Platform
if(assets.update(1000 / loadingFPS)){ if(assets.update(1000 / loadingFPS)){
loader.dispose(); loader.dispose();
loader = null; loader = null;
Log.info("Total time to load: @", Time.timeSinceMillis(beginTime)); Log.info("Total time to load: @ms", Time.timeSinceMillis(beginTime));
for(ApplicationListener listener : modules){ for(ApplicationListener listener : modules){
listener.init(); listener.init();
} }

View File

@@ -32,7 +32,6 @@ public class BaseAI{
private static final Seq<Tile> tmpTiles = new Seq<>(); private static final Seq<Tile> tmpTiles = new Seq<>();
private static int correct = 0, incorrect = 0; private static int correct = 0, incorrect = 0;
private static boolean anyDrills;
private int lastX, lastY, lastW, lastH; private int lastX, lastY, lastW, lastH;
private boolean triedWalls, foundPath; private boolean triedWalls, foundPath;
@@ -228,7 +227,7 @@ public class BaseAI{
//make sure at least X% of resource requirements are met //make sure at least X% of resource requirements are met
correct = incorrect = 0; correct = incorrect = 0;
anyDrills = false; boolean anyDrills = false;
if(part.required instanceof Item){ if(part.required instanceof Item){
for(Stile tile : result.tiles){ for(Stile tile : result.tiles){

View File

@@ -108,7 +108,7 @@ public class Pathfinder implements Runnable{
/** Packs a tile into its internal representation. */ /** Packs a tile into its internal representation. */
private int packTile(Tile tile){ private int packTile(Tile tile){
boolean nearLiquid = false, nearSolid = false, nearGround = false; boolean nearLiquid = false, nearSolid = false, nearGround = false, solid = tile.solid();
for(int i = 0; i < 4; i++){ for(int i = 0; i < 4; i++){
Tile other = tile.nearby(i); Tile other = tile.nearby(i);
@@ -120,9 +120,9 @@ public class Pathfinder implements Runnable{
} }
return PathTile.get( return PathTile.get(
tile.build == null || !tile.solid() || tile.block() instanceof CoreBlock ? 0 : Math.min((int)(tile.build.health / 40), 80), tile.build == null || !solid || tile.block() instanceof CoreBlock ? 0 : Math.min((int)(tile.build.health / 40), 80),
tile.getTeamID(), tile.getTeamID(),
tile.solid(), solid,
tile.floor().isLiquid, tile.floor().isLiquid,
tile.staticDarkness() >= 2 || (tile.floor().solid && tile.block() == Blocks.air), tile.staticDarkness() >= 2 || (tile.floor().solid && tile.block() == Blocks.air),
nearLiquid, nearLiquid,
@@ -149,7 +149,7 @@ public class Pathfinder implements Runnable{
} }
/** Update a tile in the internal pathfinding grid. /** Update a tile in the internal pathfinding grid.
* Causes a complete pathfinding reclaculation. Main thread only. */ * Causes a complete pathfinding recalculation. Main thread only. */
public void updateTile(Tile tile){ public void updateTile(Tile tile){
if(net.client()) return; if(net.client()) return;

View File

@@ -33,7 +33,7 @@ public class FormationAI extends AIController implements FormationMember{
} }
if(unit.type.canBoost){ if(unit.type.canBoost){
unit.elevation = Mathf.approachDelta(unit.elevation, unit.onSolid() ? 1f : leader.type.canBoost ? leader.elevation : 0f, 0.08f); unit.elevation = Mathf.approachDelta(unit.elevation, unit.onSolid() ? 1f : leader.type.canBoost ? leader.elevation : 0f, unit.type.riseSpeed);
} }
unit.controlWeapons(true, leader.isShooting); unit.controlWeapons(true, leader.isShooting);

View File

@@ -21,7 +21,11 @@ public class GroundAI extends AIController{
if(core != null && unit.within(core, unit.range() / 1.1f + core.block.size * tilesize / 2f)){ if(core != null && unit.within(core, unit.range() / 1.1f + core.block.size * tilesize / 2f)){
target = core; target = core;
Arrays.fill(targets, core); for(int i = 0; i < targets.length; i++){
if(unit.mounts[i].weapon.bullet.collidesGround){
targets[i] = core;
}
}
} }
if((core == null || !unit.within(core, unit.range() * 0.5f)) && command() == UnitCommand.attack){ if((core == null || !unit.within(core, unit.range() * 0.5f)) && command() == UnitCommand.attack){
@@ -44,7 +48,7 @@ public class GroundAI extends AIController{
} }
if(unit.type.canBoost && !unit.onSolid()){ if(unit.type.canBoost && !unit.onSolid()){
unit.elevation = Mathf.approachDelta(unit.elevation, 0f, 0.08f); unit.elevation = Mathf.approachDelta(unit.elevation, 0f, unit.type.riseSpeed);
} }
if(!Units.invalidateTarget(target, unit, unit.range()) && unit.type.rotateShooting){ if(!Units.invalidateTarget(target, unit, unit.range()) && unit.type.rotateShooting){

View File

@@ -20,14 +20,15 @@ public class StatusEffects implements ContentList{
none = new StatusEffect("none"); none = new StatusEffect("none");
burning = new StatusEffect("burning"){{ burning = new StatusEffect("burning"){{
color = Pal.lightFlame; color = Color.valueOf("ffc455");
damage = 0.12f; //over 8 seconds, this would be ~60 damage damage = 0.12f; //over 8 seconds, this would be ~60 damage
effect = Fx.burning; effect = Fx.burning;
transitionDamage = 8f;
init(() -> { init(() -> {
opposite(wet, freezing); opposite(wet, freezing);
trans(tarred, ((unit, time, newTime, result) -> { affinity(tarred, ((unit, time, newTime, result) -> {
unit.damagePierce(8f); unit.damagePierce(transitionDamage);
Fx.burning.at(unit.x + Mathf.range(unit.bounds() / 2f), unit.y + Mathf.range(unit.bounds() / 2f)); Fx.burning.at(unit.x + Mathf.range(unit.bounds() / 2f), unit.y + Mathf.range(unit.bounds() / 2f));
result.set(burning, Math.min(time + newTime, 300f)); result.set(burning, Math.min(time + newTime, 300f));
})); }));
@@ -39,12 +40,13 @@ public class StatusEffects implements ContentList{
speedMultiplier = 0.6f; speedMultiplier = 0.6f;
healthMultiplier = 0.8f; healthMultiplier = 0.8f;
effect = Fx.freezing; effect = Fx.freezing;
transitionDamage = 18f;
init(() -> { init(() -> {
opposite(melting, burning); opposite(melting, burning);
trans(blasted, ((unit, time, newTime, result) -> { affinity(blasted, ((unit, time, newTime, result) -> {
unit.damagePierce(18f); unit.damagePierce(transitionDamage);
result.set(freezing, time); result.set(freezing, time);
})); }));
}); });
@@ -65,10 +67,11 @@ public class StatusEffects implements ContentList{
speedMultiplier = 0.94f; speedMultiplier = 0.94f;
effect = Fx.wet; effect = Fx.wet;
effectChance = 0.09f; effectChance = 0.09f;
transitionDamage = 14;
init(() -> { init(() -> {
trans(shocked, ((unit, time, newTime, result) -> { affinity(shocked, ((unit, time, newTime, result) -> {
unit.damagePierce(14f); unit.damagePierce(transitionDamage);
if(unit.team == state.rules.waveTeam){ if(unit.team == state.rules.waveTeam){
Events.fire(Trigger.shock); Events.fire(Trigger.shock);
} }
@@ -94,7 +97,7 @@ public class StatusEffects implements ContentList{
init(() -> { init(() -> {
opposite(wet, freezing); opposite(wet, freezing);
trans(tarred, ((unit, time, newTime, result) -> { affinity(tarred, ((unit, time, newTime, result) -> {
unit.damagePierce(8f); unit.damagePierce(8f);
Fx.burning.at(unit.x + Mathf.range(unit.bounds() / 2f), unit.y + Mathf.range(unit.bounds() / 2f)); Fx.burning.at(unit.x + Mathf.range(unit.bounds() / 2f), unit.y + Mathf.range(unit.bounds() / 2f));
result.set(melting, Math.min(time + newTime, 200f)); result.set(melting, Math.min(time + newTime, 200f));
@@ -123,8 +126,8 @@ public class StatusEffects implements ContentList{
effect = Fx.oily; effect = Fx.oily;
init(() -> { init(() -> {
trans(melting, ((unit, time, newTime, result) -> result.set(melting, newTime + time))); affinity(melting, ((unit, time, newTime, result) -> result.set(melting, newTime + time)));
trans(burning, ((unit, time, newTime, result) -> result.set(burning, newTime + time))); affinity(burning, ((unit, time, newTime, result) -> result.set(burning, newTime + time)));
}); });
}}; }};

View File

@@ -292,7 +292,7 @@ public class UnitTypes implements ContentList{
shootSound = Sounds.lasershoot; shootSound = Sounds.lasershoot;
bullet = new LaserBoltBulletType(5.2f, 14){{ bullet = new LaserBoltBulletType(5.2f, 14){{
lifetime = 37f; lifetime = 32f;
healPercent = 5f; healPercent = 5f;
collidesTeam = true; collidesTeam = true;
backColor = Pal.heal; backColor = Pal.heal;
@@ -309,6 +309,7 @@ public class UnitTypes implements ContentList{
health = 320f; health = 320f;
buildSpeed = 0.9f; buildSpeed = 0.9f;
armor = 4f; armor = 4f;
riseSpeed = 0.07f;
mineTier = 2; mineTier = 2;
mineSpeed = 5f; mineSpeed = 5f;
@@ -364,6 +365,7 @@ public class UnitTypes implements ContentList{
canBoost = true; canBoost = true;
armor = 9f; armor = 9f;
landShake = 2f; landShake = 2f;
riseSpeed = 0.05f;
commandLimit = 10; commandLimit = 10;
mechFrontSway = 0.55f; mechFrontSway = 0.55f;
@@ -411,11 +413,12 @@ public class UnitTypes implements ContentList{
mechStepShake = 0.15f; mechStepShake = 0.15f;
ammoType = AmmoTypes.powerHigh; ammoType = AmmoTypes.powerHigh;
speed = 0.38f; speed = 0.39f;
boostMultiplier = 2.2f; boostMultiplier = 2.2f;
engineOffset = 12f; engineOffset = 12f;
engineSize = 6f; engineSize = 6f;
lowAltitude = true; lowAltitude = true;
riseSpeed = 0.02f;
health = 7500f; health = 7500f;
armor = 9f; armor = 9f;
@@ -442,7 +445,7 @@ public class UnitTypes implements ContentList{
cooldownTime = 200f; cooldownTime = 200f;
bullet = new ContinuousLaserBulletType(){{ bullet = new ContinuousLaserBulletType(){{
damage = 28f; damage = 30f;
length = 175f; length = 175f;
hitEffect = Fx.hitMeltHeal; hitEffect = Fx.hitMeltHeal;
drawSize = 420f; drawSize = 420f;
@@ -453,7 +456,7 @@ public class UnitTypes implements ContentList{
shootEffect = Fx.greenLaserChargeSmall; shootEffect = Fx.greenLaserChargeSmall;
incendChance = 0.09f; incendChance = 0.1f;
incendSpread = 5f; incendSpread = 5f;
incendAmount = 1; incendAmount = 1;

View File

@@ -278,6 +278,10 @@ public class ContentLoader{
return getByID(ContentType.bullet, id); return getByID(ContentType.bullet, id);
} }
public Seq<StatusEffect> statusEffects(){
return getBy(ContentType.status);
}
public Seq<SectorPreset> sectors(){ public Seq<SectorPreset> sectors(){
return getBy(ContentType.sector); return getBy(ContentType.sector);
} }

View File

@@ -139,7 +139,9 @@ public class Control implements ApplicationListener, Loadable{
})); }));
Events.on(UnlockEvent.class, e -> { Events.on(UnlockEvent.class, e -> {
if(e.content.showUnlock()){
ui.hudfrag.showUnlock(e.content); ui.hudfrag.showUnlock(e.content);
}
checkAutoUnlocks(); checkAutoUnlocks();
@@ -429,11 +431,7 @@ public class Control implements ApplicationListener, Loadable{
music.stop(); music.stop();
} }
content.dispose();
net.dispose(); net.dispose();
Musics.dispose();
Sounds.dispose();
if(ui != null && ui.editor != null) ui.editor.dispose();
} }
@Override @Override

View File

@@ -368,7 +368,7 @@ public class Logic implements ApplicationListener{
if(state.isGame()){ if(state.isGame()){
if(!net.client()){ if(!net.client()){
state.enemies = Groups.unit.count(u -> u.team() == state.rules.waveTeam && u.type.isCounted); state.enemies = Groups.unit.count(u -> u.team() == state.rules.waveTeam && u.isCounted());
} }
if(!state.isPaused()){ if(!state.isPaused()){

View File

@@ -190,7 +190,7 @@ public class NetClient implements ApplicationListener{
public static void sendChatMessage(Player player, String message){ public static void sendChatMessage(Player player, String message){
//do not receive chat messages from clients that are too young or not registered //do not receive chat messages from clients that are too young or not registered
if(Time.timeSinceMillis(player.con.connectTime) < 500 || !player.con.hasConnected || !player.isAdded()) return; if(net.server() && player != null && player.con != null && (Time.timeSinceMillis(player.con.connectTime) < 500 || !player.con.hasConnected || !player.isAdded())) return;
if(message.length() > maxTextLength){ if(message.length() > maxTextLength){
throw new ValidateException(player, "Player has sent a message above the text limit."); throw new ValidateException(player, "Player has sent a message above the text limit.");
@@ -198,6 +198,12 @@ public class NetClient implements ApplicationListener{
Events.fire(new PlayerChatEvent(player, message)); Events.fire(new PlayerChatEvent(player, message));
//log commands before they are handled
if(message.startsWith(netServer.clientCommands.getPrefix())){
//log with brackets
Log.info("<&fi@: @&fr>", "&lk" + player.name, "&lw" + message);
}
//check if it's a command //check if it's a command
CommandResponse response = netServer.clientCommands.handleMessage(message, player); CommandResponse response = netServer.clientCommands.handleMessage(message, player);
if(response.type == ResponseType.noCommand){ //no command to handle if(response.type == ResponseType.noCommand){ //no command to handle
@@ -209,7 +215,7 @@ public class NetClient implements ApplicationListener{
//special case; graphical server needs to see its message //special case; graphical server needs to see its message
if(!headless){ if(!headless){
sendMessage(message, colorizeName(player.id(), player.name), player); sendMessage(message, colorizeName(player.id, player.name), player);
} }
//server console logging //server console logging
@@ -219,8 +225,6 @@ public class NetClient implements ApplicationListener{
//this is required so other clients get the correct name even if they don't know who's sending it yet //this is required so other clients get the correct name even if they don't know who's sending it yet
Call.sendMessage(message, colorizeName(player.id(), player.name), player); Call.sendMessage(message, colorizeName(player.id(), player.name), player);
}else{ }else{
//log command to console but with brackets
Log.info("<&fi@: @&fr>", "&lk" + player.name, "&lw" + message);
//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){

View File

@@ -35,13 +35,13 @@ import static mindustry.Vars.*;
public class NetServer implements ApplicationListener{ public class NetServer implements ApplicationListener{
/** note that snapshots are compressed, so the max snapshot size here is above the typical UDP safe limit */ /** note that snapshots are compressed, so the max snapshot size here is above the typical UDP safe limit */
private static final int maxSnapshotSize = 800, timerBlockSync = 0; private static final int maxSnapshotSize = 800, timerBlockSync = 0, serverSyncTime = 200;
private static final float serverSyncTime = 12, blockSyncTime = 60 * 6; private static final float blockSyncTime = 60 * 6;
private static final FloatBuffer fbuffer = FloatBuffer.allocate(20); private static final FloatBuffer fbuffer = FloatBuffer.allocate(20);
private static final Vec2 vector = new Vec2(); private static final Vec2 vector = new Vec2();
private static final Rect viewport = new Rect(); private static final Rect viewport = new Rect();
/** If a player goes away of their server-side coordinates by this distance, they get teleported back. */ /** If a player goes away of their server-side coordinates by this distance, they get teleported back. */
private static final float correctDist = tilesize * 12f; private static final float correctDist = tilesize * 14f;
public final Administration admins = new Administration(); public final Administration admins = new Administration();
public final CommandHandler clientCommands = new CommandHandler("/"); public final CommandHandler clientCommands = new CommandHandler("/");
@@ -464,12 +464,17 @@ public class NetServer implements ApplicationListener{
return; return;
} }
if(!arg[0].equalsIgnoreCase("y") && !arg[0].equalsIgnoreCase("n")){ int sign = switch(arg[0].toLowerCase()){
case "y", "yes" -> 1;
case "n", "no" -> -1;
default -> 0;
};
if(sign == 0){
player.sendMessage("[scarlet]Vote either 'y' (yes) or 'n' (no)."); player.sendMessage("[scarlet]Vote either 'y' (yes) or 'n' (no).");
return; return;
} }
int sign = arg[0].equalsIgnoreCase("y") ? 1 : -1;
currentlyKicking[0].vote(player, sign); currentlyKicking[0].vote(player, sign);
} }
}); });
@@ -656,9 +661,6 @@ public class NetServer implements ApplicationListener{
long elapsed = Time.timeSinceMillis(con.lastReceivedClientTime); long elapsed = Time.timeSinceMillis(con.lastReceivedClientTime);
float maxSpeed = unit.realSpeed(); float maxSpeed = unit.realSpeed();
if(unit.isGrounded()){
maxSpeed *= unit.floorSpeedMultiplier();
}
float maxMove = elapsed / 1000f * 60f * maxSpeed * 1.2f; float maxMove = elapsed / 1000f * 60f * maxSpeed * 1.2f;
@@ -734,8 +736,8 @@ public class NetServer implements ApplicationListener{
logic.skipWave(); logic.skipWave();
info("&lc@ has skipped the wave.", player.name); info("&lc@ has skipped the wave.", player.name);
}else if(action == AdminAction.ban){ }else if(action == AdminAction.ban){
netServer.admins.banPlayerIP(other.con.address);
netServer.admins.banPlayerID(other.con.uuid); netServer.admins.banPlayerID(other.con.uuid);
netServer.admins.banPlayerIP(other.con.address);
other.kick(KickReason.banned); other.kick(KickReason.banned);
info("&lc@ has banned @.", player.name, other.name); info("&lc@ has banned @.", player.name, other.name);
}else if(action == AdminAction.kick){ }else if(action == AdminAction.kick){
@@ -967,9 +969,11 @@ public class NetServer implements ApplicationListener{
return; return;
} }
NetConnection connection = player.con; var connection = player.con;
if(!player.timer(0, serverSyncTime) || !connection.hasConnected) return; if(Time.timeSinceMillis(connection.syncTime) < serverSyncTime || !connection.hasConnected) return;
connection.syncTime = Time.millis();
try{ try{
writeEntitySnapshot(player); writeEntitySnapshot(player);

View File

@@ -115,17 +115,6 @@ public class Renderer implements ApplicationListener{
@Override @Override
public void dispose(){ public void dispose(){
minimap.dispose();
effectBuffer.dispose();
blocks.dispose();
if(planets != null){
planets.dispose();
planets = null;
}
if(bloom != null){
bloom.dispose();
bloom = null;
}
Events.fire(new DisposeEvent()); Events.fire(new DisposeEvent());
} }
@@ -325,7 +314,7 @@ public class Renderer implements ApplicationListener{
int w = world.width() * tilesize, h = world.height() * tilesize; int w = world.width() * tilesize, h = world.height() * tilesize;
int memory = w * h * 4 / 1024 / 1024; int memory = w * h * 4 / 1024 / 1024;
if(memory >= 65){ if(memory >= (mobile ? 65 : 120)){
ui.showInfo("@screenshot.invalid"); ui.showInfo("@screenshot.invalid");
return; return;
} }

View File

@@ -225,14 +225,6 @@ public class UI implements ApplicationListener, Loadable{
Events.fire(new ResizeEvent()); Events.fire(new ResizeEvent());
} }
@Override
public void dispose(){
if(packer != null){
packer.dispose();
packer = null;
}
}
public TextureRegionDrawable getIcon(String name){ public TextureRegionDrawable getIcon(String name){
if(Icon.icons.containsKey(name)) return Icon.icons.get(name); if(Icon.icons.containsKey(name)) return Icon.icons.get(name);
return Core.atlas.getDrawable("error"); return Core.atlas.getDrawable("error");

View File

@@ -95,6 +95,10 @@ public abstract class UnlockableContent extends MappableContent{
return cicons[icon.ordinal()]; return cicons[icon.ordinal()];
} }
public Cicon prefDatabaseIcon(){
return Cicon.xlarge;
}
/** Iterates through any implicit dependencies of this content. /** Iterates through any implicit dependencies of this content.
* For blocks, this would be the items required to build it. */ * For blocks, this would be the items required to build it. */
public void getDependencies(Cons<UnlockableContent> cons){ public void getDependencies(Cons<UnlockableContent> cons){
@@ -115,6 +119,11 @@ public abstract class UnlockableContent extends MappableContent{
return false; return false;
} }
/** @return whether to show a notification toast when this is unlocked */
public boolean showUnlock(){
return true;
}
/** Makes this piece of content unlocked; if it already unlocked, nothing happens. */ /** Makes this piece of content unlocked; if it already unlocked, nothing happens. */
public void unlock(){ public void unlock(){
if(!unlocked && !alwaysUnlocked){ if(!unlocked && !alwaysUnlocked){

View File

@@ -177,7 +177,7 @@ public class WaveGraph extends Table{
t.button(b -> { t.button(b -> {
Color tcolor = color(type).cpy(); Color tcolor = color(type).cpy();
b.image().size(32f).update(i -> i.setColor(b.isChecked() ? Tmp.c1.set(tcolor).mul(0.5f) : tcolor)).get().act(1); b.image().size(32f).update(i -> i.setColor(b.isChecked() ? Tmp.c1.set(tcolor).mul(0.5f) : tcolor)).get().act(1);
b.image(type.icon(Cicon.medium)).padRight(20).update(i -> i.setColor(b.isChecked() ? Color.gray : Color.white)).get().act(1); b.image(type.icon(Cicon.medium)).size(32f).padRight(20).update(i -> i.setColor(b.isChecked() ? Color.gray : Color.white)).get().act(1);
b.margin(0f); b.margin(0f);
}, Styles.fullTogglet, () -> { }, Styles.fullTogglet, () -> {
if(!hidden.add(type)){ if(!hidden.add(type)){

View File

@@ -248,7 +248,7 @@ public class Damage{
tmpUnit = null; tmpUnit = null;
Cons<Unit> cons = e -> { Units.nearbyEnemies(hitter.team, rect, e -> {
if((tmpUnit != null && e.dst2(x, y) > tmpUnit.dst2(x, y)) || !e.checkTarget(hitter.type.collidesAir, hitter.type.collidesGround)) return; if((tmpUnit != null && e.dst2(x, y) > tmpUnit.dst2(x, y)) || !e.checkTarget(hitter.type.collidesAir, hitter.type.collidesGround)) return;
e.hitbox(hitrect); e.hitbox(hitrect);
@@ -263,9 +263,7 @@ public class Damage{
if(vec != null){ if(vec != null){
tmpUnit = e; tmpUnit = e;
} }
}; });
Units.nearbyEnemies(hitter.team, rect, cons);
if(tmpBuilding != null && tmpUnit != null){ if(tmpBuilding != null && tmpUnit != null){
if(Mathf.dst2(x, y, tmpUnit.getX(), tmpUnit.getY()) <= Mathf.dst2(x, y, tmpBuilding.getX(), tmpBuilding.getY())){ if(Mathf.dst2(x, y, tmpUnit.getX(), tmpUnit.getY()) <= Mathf.dst2(x, y, tmpBuilding.getX(), tmpBuilding.getY())){

View File

@@ -55,7 +55,9 @@ public class EntityGroup<T extends Entityc> implements Iterable<T>{
} }
public void update(){ public void update(){
each(Entityc::update); for(index = 0; index < array.size; index++){
array.items[index].update();
}
} }
public Seq<T> copy(Seq<T> arr){ public Seq<T> copy(Seq<T> arr){

View File

@@ -128,7 +128,7 @@ public class Units{
nearby(x, y, width, height, unit -> { nearby(x, y, width, height, unit -> {
if(boolResult) return; if(boolResult) return;
if((unit.isGrounded() && !unit.type.hovering) == ground){ if((unit.isGrounded() && !unit.type.hovering) == ground){
unit.hitbox(hitrect); unit.hitboxTile(hitrect);
if(hitrect.overlaps(x, y, width, height)){ if(hitrect.overlaps(x, y, width, height)){
boolResult = true; boolResult = true;
@@ -218,7 +218,7 @@ public class Units{
cdist = 0f; cdist = 0f;
nearbyEnemies(team, x - range, y - range, range*2f, range*2f, e -> { nearbyEnemies(team, x - range, y - range, range*2f, range*2f, e -> {
if(e.dead() || !predicate.get(e) || !e.within(x, y, range + e.hitSize/2f)) return; if(e.dead() || !predicate.get(e) || e.team == Team.derelict || !e.within(x, y, range + e.hitSize/2f)) return;
float cost = sort.cost(e, x, y); float cost = sort.cost(e, x, y);
if(result == null || cost < cdist){ if(result == null || cost < cdist){

View File

@@ -161,6 +161,11 @@ public abstract class BulletType extends Content{
return Math.max(speed * lifetime * (1f - drag), maxRange); return Math.max(speed * lifetime * (1f - drag), maxRange);
} }
/** @return continuous damage in damage/sec, or -1 if not continuous. */
public float continuousDamage(){
return -1f;
}
public boolean testCollision(Bullet bullet, Building tile){ public boolean testCollision(Bullet bullet, Building tile){
return healPercent <= 0.001f || tile.team != bullet.team || tile.healthf() < 1f; return healPercent <= 0.001f || tile.team != bullet.team || tile.healthf() < 1f;
} }

View File

@@ -46,6 +46,11 @@ public class ContinuousLaserBulletType extends BulletType{
this(0); this(0);
} }
@Override
public float continuousDamage(){
return damage / 5f * 60f;
}
@Override @Override
public float estimateDPS(){ public float estimateDPS(){
//assume firing duration is about 100 by default, may not be accurate there's no way of knowing in this method //assume firing duration is about 100 by default, may not be accurate there's no way of knowing in this method
@@ -55,7 +60,7 @@ public class ContinuousLaserBulletType extends BulletType{
@Override @Override
public float range(){ public float range(){
return length; return Math.max(length, maxRange);
} }
@Override @Override

View File

@@ -56,7 +56,7 @@ public class LaserBulletType extends BulletType{
@Override @Override
public float range(){ public float range(){
return length; return Math.max(length, maxRange);
} }
@Override @Override

View File

@@ -19,6 +19,8 @@ public class LightningBulletType extends BulletType{
hitEffect = Fx.hitLancer; hitEffect = Fx.hitLancer;
keepVelocity = false; keepVelocity = false;
hittable = false; hittable = false;
//for stats
status = StatusEffects.shocked;
} }
@Override @Override

View File

@@ -50,7 +50,7 @@ public class SapBulletType extends BulletType{
@Override @Override
public float range(){ public float range(){
return length; return Math.max(length, maxRange);
} }
@Override @Override

View File

@@ -47,7 +47,7 @@ public class ShrapnelBulletType extends BulletType{
@Override @Override
public float range(){ public float range(){
return length; return Math.max(length, maxRange);
} }
@Override @Override

View File

@@ -33,6 +33,7 @@ import mindustry.world.*;
import mindustry.world.blocks.ConstructBlock.*; import mindustry.world.blocks.ConstructBlock.*;
import mindustry.world.blocks.*; import mindustry.world.blocks.*;
import mindustry.world.blocks.environment.*; import mindustry.world.blocks.environment.*;
import mindustry.world.blocks.logic.LogicBlock.*;
import mindustry.world.blocks.payloads.*; import mindustry.world.blocks.payloads.*;
import mindustry.world.blocks.power.*; import mindustry.world.blocks.power.*;
import mindustry.world.consumers.*; import mindustry.world.consumers.*;
@@ -940,7 +941,7 @@ abstract class BuildingComp implements Posc, Teamc, Healthc, Buildingc, Timerc,
/** Called when arbitrary configuration is applied to a tile. */ /** Called when arbitrary configuration is applied to a tile. */
public void configured(@Nullable Unit builder, @Nullable Object value){ public void configured(@Nullable Unit builder, @Nullable Object value){
//null is of type void.class; anonymous classes use their superclass. //null is of type void.class; anonymous classes use their superclass.
Class<?> type = value == null ? void.class : value.getClass().isAnonymousClass() || value.getClass().getSimpleName().startsWith("adapter") ? value.getClass().getSuperclass() : value.getClass(); Class<?> type = value == null ? void.class : value.getClass().isAnonymousClass() ? value.getClass().getSuperclass() : value.getClass();
if(value instanceof Item) type = Item.class; if(value instanceof Item) type = Item.class;
if(value instanceof Block) type = Block.class; if(value instanceof Block) type = Block.class;
@@ -1360,12 +1361,11 @@ abstract class BuildingComp implements Posc, Teamc, Healthc, Buildingc, Timerc,
@Override @Override
public void control(LAccess type, Object p1, double p2, double p3, double p4){ public void control(LAccess type, Object p1, double p2, double p3, double p4){
//don't execute configure instructions as the client //don't execute configure instructions that copy logic building configures; this can cause extreme lag
if(type == LAccess.configure && block.logicConfigurable && !net.client()){ if(type == LAccess.configure && block.logicConfigurable && !(p1 instanceof LogicBuild)){
//change config only if it's new //change config only if it's new
Object prev = senseObject(LAccess.config); if(senseObject(LAccess.config) != p1){
if(prev != p1){ configured(null, p1);
configureAny(p1);
} }
} }
} }

View File

@@ -4,6 +4,7 @@ import arc.func.*;
import arc.math.geom.*; import arc.math.geom.*;
import arc.struct.*; import arc.struct.*;
import arc.util.*; import arc.util.*;
import mindustry.*;
import mindustry.ai.formations.*; import mindustry.ai.formations.*;
import mindustry.ai.types.*; import mindustry.ai.types.*;
import mindustry.annotations.Annotations.*; import mindustry.annotations.Annotations.*;
@@ -29,7 +30,7 @@ abstract class CommanderComp implements Entityc, Posc{
transient float minFormationSpeed; transient float minFormationSpeed;
public void update(){ public void update(){
if(controlling.isEmpty()){ if(controlling.isEmpty() && !Vars.net.client()){
formation = null; formation = null;
} }

View File

@@ -110,8 +110,12 @@ abstract class PlayerComp implements UnitController, Entityc, Syncc, Timerc, Dra
unit.aim(mouseX, mouseY); unit.aim(mouseX, mouseY);
//this is only necessary when the thing being controlled isn't synced //this is only necessary when the thing being controlled isn't synced
unit.controlWeapons(shooting, shooting); unit.controlWeapons(shooting, shooting);
//save previous formation to prevent reset
var formation = unit.formation;
//extra precaution, necessary for non-synced things //extra precaution, necessary for non-synced things
unit.controller(this); unit.controller(this);
//keep previous formation
unit.formation = formation;
} }
@Override @Override
@@ -130,7 +134,7 @@ abstract class PlayerComp implements UnitController, Entityc, Syncc, Timerc, Dra
//update some basic state to sync things //update some basic state to sync things
if(unit.type.canBoost){ if(unit.type.canBoost){
Tile tile = unit.tileOn(); Tile tile = unit.tileOn();
unit.elevation = Mathf.approachDelta(unit.elevation, (tile != null && tile.solid()) || boosting ? 1f : 0f, 0.08f); unit.elevation = Mathf.approachDelta(unit.elevation, (tile != null && tile.solid()) || boosting ? 1f : 0f, unit.type.riseSpeed);
} }
}else if((core = bestCore()) != null){ }else if((core = bestCore()) != null){
//have a small delay before death to prevent the camera from jumping around too quickly //have a small delay before death to prevent the camera from jumping around too quickly
@@ -219,7 +223,7 @@ abstract class PlayerComp implements UnitController, Entityc, Syncc, Timerc, Dra
con.kick(reason); con.kick(reason);
} }
void kick(String reason, int duration){ void kick(String reason, long duration){
con.kick(reason, duration); con.kick(reason, duration);
} }

View File

@@ -19,7 +19,7 @@ abstract class StatusComp implements Posc, Flyingc{
private Seq<StatusEntry> statuses = new Seq<>(); private Seq<StatusEntry> statuses = new Seq<>();
private transient Bits applied = new Bits(content.getBy(ContentType.status).size); private transient Bits applied = new Bits(content.getBy(ContentType.status).size);
@ReadOnly transient float speedMultiplier = 1, damageMultiplier = 1, healthMultiplier = 1, reloadMultiplier = 1, buildSpeedMultiplier = 1; @ReadOnly transient float speedMultiplier = 1, damageMultiplier = 1, healthMultiplier = 1, reloadMultiplier = 1, buildSpeedMultiplier = 1, dragMultiplier = 1;
@ReadOnly transient boolean disarmed = false; @ReadOnly transient boolean disarmed = false;
@Import UnitType type; @Import UnitType type;
@@ -33,6 +33,11 @@ abstract class StatusComp implements Posc, Flyingc{
void apply(StatusEffect effect, float duration){ void apply(StatusEffect effect, float duration){
if(effect == StatusEffects.none || effect == null || isImmune(effect)) return; //don't apply empty or immune effects if(effect == StatusEffects.none || effect == null || isImmune(effect)) return; //don't apply empty or immune effects
//unlock status effects regardless of whether they were applied to friendly units
if(state.isCampaign()){
effect.unlock();
}
if(statuses.size > 0){ if(statuses.size > 0){
//check for opposite effects //check for opposite effects
for(int i = 0; i < statuses.size; i ++){ for(int i = 0; i < statuses.size; i ++){
@@ -111,7 +116,7 @@ abstract class StatusComp implements Posc, Flyingc{
} }
applied.clear(); applied.clear();
speedMultiplier = damageMultiplier = healthMultiplier = reloadMultiplier = buildSpeedMultiplier = 1f; speedMultiplier = damageMultiplier = healthMultiplier = reloadMultiplier = buildSpeedMultiplier = dragMultiplier = 1f;
disarmed = false; disarmed = false;
if(statuses.isEmpty()) return; if(statuses.isEmpty()) return;
@@ -135,6 +140,7 @@ abstract class StatusComp implements Posc, Flyingc{
damageMultiplier *= entry.effect.damageMultiplier; damageMultiplier *= entry.effect.damageMultiplier;
reloadMultiplier *= entry.effect.reloadMultiplier; reloadMultiplier *= entry.effect.reloadMultiplier;
buildSpeedMultiplier *= entry.effect.buildSpeedMultiplier; buildSpeedMultiplier *= entry.effect.buildSpeedMultiplier;
dragMultiplier *= entry.effect.dragMultiplier;
disarmed |= entry.effect.disarm; disarmed |= entry.effect.disarm;

View File

@@ -28,12 +28,13 @@ import mindustry.world.blocks.environment.*;
import mindustry.world.blocks.payloads.*; import mindustry.world.blocks.payloads.*;
import static mindustry.Vars.*; import static mindustry.Vars.*;
import static mindustry.logic.GlobalConstants.*;
@Component(base = true) @Component(base = true)
abstract class UnitComp implements Healthc, Physicsc, Hitboxc, Statusc, Teamc, Itemsc, Rotc, Unitc, Weaponsc, Drawc, Boundedc, Syncc, Shieldc, Commanderc, Displayable, Senseable, Ranged, Minerc, Builderc{ abstract class UnitComp implements Healthc, Physicsc, Hitboxc, Statusc, Teamc, Itemsc, Rotc, Unitc, Weaponsc, Drawc, Boundedc, Syncc, Shieldc, Commanderc, Displayable, Senseable, Ranged, Minerc, Builderc{
@Import boolean hovering, dead, disarmed; @Import boolean hovering, dead, disarmed;
@Import float x, y, rotation, elevation, maxHealth, drag, armor, hitSize, health, ammo, minFormationSpeed; @Import float x, y, rotation, elevation, maxHealth, drag, armor, hitSize, health, ammo, minFormationSpeed, dragMultiplier;
@Import Team team; @Import Team team;
@Import int id; @Import int id;
@Import @Nullable Tile mineTile; @Import @Nullable Tile mineTile;
@@ -140,9 +141,9 @@ abstract class UnitComp implements Healthc, Physicsc, Hitboxc, Statusc, Teamc, I
case mineY -> mining() ? mineTile.y : -1; case mineY -> mining() ? mineTile.y : -1;
case flag -> flag; case flag -> flag;
case controlled -> !isValid() ? 0 : case controlled -> !isValid() ? 0 :
controller instanceof LogicAI ? GlobalConstants.ctrlProcessor : controller instanceof LogicAI ? ctrlProcessor :
controller instanceof Player ? GlobalConstants.ctrlPlayer : controller instanceof Player ? ctrlPlayer :
controller instanceof FormationAI ? GlobalConstants.ctrlFormation : controller instanceof FormationAI ? ctrlFormation :
0; 0;
case commanded -> controller instanceof FormationAI && isValid() ? 1 : 0; case commanded -> controller instanceof FormationAI && isValid() ? 1 : 0;
case payloadCount -> self() instanceof Payloadc pay ? pay.payloads().size : 0; case payloadCount -> self() instanceof Payloadc pay ? pay.payloads().size : 0;
@@ -164,7 +165,6 @@ abstract class UnitComp implements Healthc, Physicsc, Hitboxc, Statusc, Teamc, I
pay.payloads().peek() instanceof BuildPayload p2 ? p2.block() : null) : null; pay.payloads().peek() instanceof BuildPayload p2 ? p2.block() : null) : null;
default -> noSensed; default -> noSensed;
}; };
} }
@Override @Override
@@ -186,6 +186,10 @@ abstract class UnitComp implements Healthc, Physicsc, Hitboxc, Statusc, Teamc, I
return !disarmed && !(type.canBoost && isFlying()); return !disarmed && !(type.canBoost && isFlying());
} }
public boolean isCounted(){
return type.isCounted;
}
@Override @Override
public int itemCapacity(){ public int itemCapacity(){
return type.itemCapacity; return type.itemCapacity;
@@ -325,7 +329,7 @@ abstract class UnitComp implements Healthc, Physicsc, Hitboxc, Statusc, Teamc, I
} }
} }
drag = type.drag * (isGrounded() ? (floorOn().dragMultiplier) : 1f); drag = type.drag * (isGrounded() ? (floorOn().dragMultiplier) : 1f) * dragMultiplier;
//apply knockback based on spawns //apply knockback based on spawns
if(team != state.rules.waveTeam && state.hasSpawns() && (!net.client() || isLocal())){ if(team != state.rules.waveTeam && state.hasSpawns() && (!net.client() || isLocal())){

View File

@@ -90,7 +90,7 @@ public class AIController implements UnitController{
if(tile == targetTile || (costType == Pathfinder.costNaval && !targetTile.floor().isLiquid)) return; if(tile == targetTile || (costType == Pathfinder.costNaval && !targetTile.floor().isLiquid)) return;
unit.moveAt(vec.trns(unit.angleTo(targetTile), unit.speed())); unit.moveAt(vec.trns(unit.angleTo(targetTile.worldx(), targetTile.worldy()), unit.speed()));
} }
protected void updateWeapons(){ protected void updateWeapons(){

View File

@@ -419,18 +419,24 @@ public class EventType{
} }
public static class PlayerBanEvent{ public static class PlayerBanEvent{
@Nullable
public final Player player; public final Player player;
public final String uuid;
public PlayerBanEvent(Player player){ public PlayerBanEvent(Player player, String uuid){
this.player = player; this.player = player;
this.uuid = uuid;
} }
} }
public static class PlayerUnbanEvent{ public static class PlayerUnbanEvent{
@Nullable
public final Player player; public final Player player;
public final String uuid;
public PlayerUnbanEvent(Player player){ public PlayerUnbanEvent(Player player, String uuid){
this.player = player; this.player = player;
this.uuid = uuid;
} }
} }

View File

@@ -63,15 +63,6 @@ public class Schematics implements Loadable{
private long lastClearTime; private long lastClearTime;
public Schematics(){ public Schematics(){
Events.on(DisposeEvent.class, e -> {
previews.each((schem, m) -> m.dispose());
previews.clear();
shadowBuffer.dispose();
if(errorTexture != null){
errorTexture.dispose();
errorTexture = null;
}
});
Events.on(ClientLoadEvent.class, event -> { Events.on(ClientLoadEvent.class, event -> {
errorTexture = new Texture("sprites/error.png"); errorTexture = new Texture("sprites/error.png");

View File

@@ -19,7 +19,7 @@ import mindustry.world.blocks.power.*;
import static arc.Core.*; import static arc.Core.*;
import static mindustry.Vars.*; import static mindustry.Vars.*;
public class BlockRenderer implements Disposable{ public class BlockRenderer{
public static final int crackRegions = 8, maxCrackSize = 9; public static final int crackRegions = 8, maxCrackSize = 9;
private static final int initialRequests = 32 * 32; private static final int initialRequests = 32 * 32;
@@ -300,11 +300,4 @@ public class BlockRenderer implements Disposable{
} }
@Override
public void dispose(){
shadows.dispose();
dark.dispose();
shadows = dark = null;
floor.dispose();
}
} }

View File

@@ -3,7 +3,6 @@ package mindustry.graphics;
import arc.*; import arc.*;
import arc.graphics.*; import arc.graphics.*;
import arc.graphics.Texture.*; import arc.graphics.Texture.*;
import arc.graphics.VertexAttributes.*;
import arc.graphics.gl.*; import arc.graphics.gl.*;
import arc.math.geom.*; import arc.math.geom.*;
import arc.util.*; import arc.util.*;
@@ -60,9 +59,7 @@ public class CubemapMesh implements Disposable{
public CubemapMesh(Cubemap map){ public CubemapMesh(Cubemap map){
this.map = map; this.map = map;
this.map.setFilter(TextureFilter.linear); this.map.setFilter(TextureFilter.linear);
this.mesh = new Mesh(true, vertices.length, 0, this.mesh = new Mesh(true, vertices.length, 0, VertexAttribute.position3);
new VertexAttribute(Usage.position, 3, "a_position")
);
mesh.getVerticesBuffer().limit(vertices.length); mesh.getVerticesBuffer().limit(vertices.length);
mesh.getVerticesBuffer().put(vertices, 0, vertices.length); mesh.getVerticesBuffer().put(vertices, 0, vertices.length);

View File

@@ -17,7 +17,8 @@ import java.util.*;
import static mindustry.Vars.*; import static mindustry.Vars.*;
public class FloorRenderer implements Disposable{ public class FloorRenderer implements Disposable{
private static final int chunksize = mobile ? 16 : 32; private static final int chunksize = mobile ? 16 : 32, chunkunits = chunksize * tilesize;
private static final float pad = tilesize/2f;
private int[][][] cache; private int[][][] cache;
private MultiCacheBatch cbatch; private MultiCacheBatch cbatch;
@@ -43,11 +44,11 @@ public class FloorRenderer implements Disposable{
Camera camera = Core.camera; Camera camera = Core.camera;
int crangex = (int)(camera.width / (chunksize * tilesize)) + 1; int
int crangey = (int)(camera.height / (chunksize * tilesize)) + 1; minx = (int)((camera.position.x - camera.width/2f - pad) / chunkunits),
miny = (int)((camera.position.y - camera.height/2f - pad) / chunkunits),
int camx = (int)(camera.position.x / (chunksize * tilesize)); maxx = Mathf.ceil((camera.position.x + camera.width/2f + pad) / chunkunits),
int camy = (int)(camera.position.y / (chunksize * tilesize)); maxy = Mathf.ceil((camera.position.y + camera.height/2f + pad) / chunkunits);
int layers = CacheLayer.all.length; int layers = CacheLayer.all.length;
@@ -55,15 +56,12 @@ public class FloorRenderer implements Disposable{
drawnLayerSet.clear(); drawnLayerSet.clear();
//preliminary layer check //preliminary layer check
for(int x = -crangex; x <= crangex; x++){ for(int x = minx; x <= maxx; x++){
for(int y = -crangey; y <= crangey; y++){ for(int y = miny; y <= maxy; y++){
int worldx = camx + x;
int worldy = camy + y;
if(!Structs.inBounds(worldx, worldy, cache)) if(!Structs.inBounds(x, y, cache)) continue;
continue;
int[] chunk = cache[worldx][worldy]; int[] chunk = cache[x][y];
//loop through all layers, and add layer index if it exists //loop through all layers, and add layer index if it exists
for(int i = 0; i < layers; i++){ for(int i = 0; i < layers; i++){
@@ -141,21 +139,22 @@ public class FloorRenderer implements Disposable{
Camera camera = Core.camera; Camera camera = Core.camera;
int crangex = (int)(camera.width / (chunksize * tilesize)) + 1; int
int crangey = (int)(camera.height / (chunksize * tilesize)) + 1; minx = (int)((camera.position.x - camera.width/2f - pad) / chunkunits),
miny = (int)((camera.position.y - camera.height/2f - pad) / chunkunits),
maxx = Mathf.ceil((camera.position.x + camera.width/2f + pad) / chunkunits),
maxy = Mathf.ceil((camera.position.y + camera.height/2f + pad) / chunkunits);
layer.begin(); layer.begin();
for(int x = -crangex; x <= crangex; x++){ for(int x = minx; x <= maxx; x++){
for(int y = -crangey; y <= crangey; y++){ for(int y = miny; y <= maxy; y++){
int worldx = (int)(camera.position.x / (chunksize * tilesize)) + x;
int worldy = (int)(camera.position.y / (chunksize * tilesize)) + y;
if(!Structs.inBounds(worldx, worldy, cache)){ if(!Structs.inBounds(x, y, cache)){
continue; continue;
} }
int[] chunk = cache[worldx][worldy]; int[] chunk = cache[x][y];
if(chunk[layer.ordinal()] == -1) continue; if(chunk[layer.ordinal()] == -1) continue;
cbatch.drawCache(chunk[layer.ordinal()]); cbatch.drawCache(chunk[layer.ordinal()]);
} }

View File

@@ -1,7 +1,6 @@
package mindustry.graphics; package mindustry.graphics;
import arc.graphics.*; import arc.graphics.*;
import arc.graphics.VertexAttributes.*;
import arc.graphics.g2d.*; import arc.graphics.g2d.*;
import arc.graphics.gl.*; import arc.graphics.gl.*;
import arc.math.*; import arc.math.*;
@@ -200,9 +199,9 @@ public class IndexedRenderer implements Disposable{
if(mesh != null) mesh.dispose(); if(mesh != null) mesh.dispose();
mesh = new Mesh(true, 6 * sprites, 0, mesh = new Mesh(true, 6 * sprites, 0,
new VertexAttribute(Usage.position, 2, "a_position"), VertexAttribute.position,
new VertexAttribute(Usage.colorPacked, 4, "a_color"), VertexAttribute.color,
new VertexAttribute(Usage.textureCoordinates, 2, "a_texCoord0")); VertexAttribute.texCoords);
vertices = new float[6 * sprites * vsize]; vertices = new float[6 * sprites * vsize];
mesh.setVertices(vertices); mesh.setVertices(vertices);
} }

View File

@@ -36,7 +36,7 @@ public class MenuRenderer implements Disposable{
Time.mark(); Time.mark();
generate(); generate();
cache(); cache();
Log.info("Time to generate menu: @", Time.elapsed()); Log.debug("Time to generate menu: @", Time.elapsed());
} }
private void generate(){ private void generate(){

View File

@@ -19,7 +19,7 @@ import mindustry.world.*;
import static mindustry.Vars.*; import static mindustry.Vars.*;
public class MinimapRenderer implements Disposable{ public class MinimapRenderer{
private static final float baseSize = 16f; private static final float baseSize = 16f;
private final Seq<Unit> units = new Seq<>(); private final Seq<Unit> units = new Seq<>();
private Pixmap pixmap; private Pixmap pixmap;
@@ -170,16 +170,6 @@ public class MinimapRenderer implements Disposable{
return color.rgba(); return color.rgba();
} }
@Override
public void dispose(){
if(pixmap != null && texture != null){
pixmap.dispose();
texture.dispose();
texture = null;
pixmap = null;
}
}
public void drawLabel(float x, float y, String text, Color color){ public void drawLabel(float x, float y, String text, Color color){
Font font = Fonts.outline; Font font = Fonts.outline;
GlyphLayout l = Pools.obtain(GlyphLayout.class, GlyphLayout::new); GlyphLayout l = Pools.obtain(GlyphLayout.class, GlyphLayout::new);

View File

@@ -1,8 +1,6 @@
package mindustry.graphics.g3d; package mindustry.graphics.g3d;
import arc.graphics.*; import arc.graphics.*;
import arc.graphics.VertexAttributes.*;
import arc.graphics.gl.*;
import arc.math.geom.*; import arc.math.geom.*;
import mindustry.graphics.g3d.PlanetGrid.*; import mindustry.graphics.g3d.PlanetGrid.*;
@@ -92,9 +90,9 @@ public class MeshBuilder{
private static void begin(int count){ private static void begin(int count){
mesh = new Mesh(true, count, 0, mesh = new Mesh(true, count, 0,
new VertexAttribute(Usage.position, 3, Shader.positionAttribute), VertexAttribute.position3,
new VertexAttribute(Usage.normal, 3, Shader.normalAttribute), VertexAttribute.normal,
new VertexAttribute(Usage.colorPacked, 4, Shader.colorAttribute) VertexAttribute.color
); );
mesh.getVerticesBuffer().limit(mesh.getMaxVertices()); mesh.getVerticesBuffer().limit(mesh.getMaxVertices());

View File

@@ -60,6 +60,7 @@ public enum Binding implements KeyBind{
minimap(KeyCode.m), minimap(KeyCode.m),
research(KeyCode.b), research(KeyCode.b),
planet_map(KeyCode.n), planet_map(KeyCode.n),
block_info(KeyCode.f1),
toggle_menus(KeyCode.c), toggle_menus(KeyCode.c),
screenshot(KeyCode.p), screenshot(KeyCode.p),
toggle_power_lines(KeyCode.f5), toggle_power_lines(KeyCode.f5),

View File

@@ -259,6 +259,13 @@ public class DesktopInput extends InputHandler{
renderer.scaleCamera(Core.input.axisTap(Binding.zoom)); renderer.scaleCamera(Core.input.axisTap(Binding.zoom));
} }
if(Core.input.keyTap(Binding.select) && !Core.scene.hasMouse()){
Tile selected = world.tileWorld(input.mouseWorldX(), input.mouseWorldY());
if(selected != null){
Call.tileTap(player, selected);
}
}
if(player.dead()){ if(player.dead()){
cursorType = SystemCursor.arrow; cursorType = SystemCursor.arrow;
return; return;
@@ -470,10 +477,6 @@ public class DesktopInput extends InputHandler{
} }
if(Core.input.keyTap(Binding.select) && !Core.scene.hasMouse()){ if(Core.input.keyTap(Binding.select) && !Core.scene.hasMouse()){
if(selected != null){
Call.tileTap(player, selected);
}
BuildPlan req = getRequest(cursorX, cursorY); BuildPlan req = getRequest(cursorX, cursorY);
if(Core.input.keyDown(Binding.break_block)){ if(Core.input.keyDown(Binding.break_block)){

View File

@@ -189,10 +189,9 @@ public abstract class InputHandler implements InputProcessor, GestureListener{
@Remote(targets = Loc.both, called = Loc.server) @Remote(targets = Loc.both, called = Loc.server)
public static void requestUnitPayload(Player player, Unit target){ public static void requestUnitPayload(Player player, Unit target){
if(player == null) return; if(player == null || !(player.unit() instanceof Payloadc pay)) return;
Unit unit = player.unit(); Unit unit = player.unit();
Payloadc pay = (Payloadc)unit;
if(target.isAI() && target.isGrounded() && pay.canPickup(target) if(target.isAI() && target.isGrounded() && pay.canPickup(target)
&& target.within(unit, unit.type.hitSize * 2f + target.type.hitSize * 2f)){ && target.within(unit, unit.type.hitSize * 2f + target.type.hitSize * 2f)){
@@ -202,10 +201,9 @@ public abstract class InputHandler implements InputProcessor, GestureListener{
@Remote(targets = Loc.both, called = Loc.server) @Remote(targets = Loc.both, called = Loc.server)
public static void requestBuildPayload(Player player, Building build){ public static void requestBuildPayload(Player player, Building build){
if(player == null) return; if(player == null || !(player.unit() instanceof Payloadc pay)) return;
Unit unit = player.unit(); Unit unit = player.unit();
Payloadc pay = (Payloadc)unit;
if(build != null && build.team == unit.team if(build != null && build.team == unit.team
&& unit.within(build, tilesize * build.block.size * 1.2f + tilesize * 5f)){ && unit.within(build, tilesize * build.block.size * 1.2f + tilesize * 5f)){

View File

@@ -110,7 +110,7 @@ public class Placement{
public static void calculateBridges(Seq<BuildPlan> plans, ItemBridge bridge){ public static void calculateBridges(Seq<BuildPlan> plans, ItemBridge bridge){
//check for orthogonal placement + unlocked state //check for orthogonal placement + unlocked state
if(!(plans.first().x == plans.peek().x || plans.first().y == plans.peek().y || !bridge.unlockedNow())){ if(!(plans.first().x == plans.peek().x || plans.first().y == plans.peek().y) || !bridge.unlockedNow()){
return; return;
} }

View File

@@ -208,9 +208,7 @@ public class JsonIO{
static class CustomJson extends Json{ static class CustomJson extends Json{
private Object baseObject; private Object baseObject;
{ { apply(this); }
apply(this);
}
@Override @Override
public <T> T fromJson(Class<T> type, String json){ public <T> T fromJson(Class<T> type, String json){

View File

@@ -92,6 +92,9 @@ public class TypeIO{
}else if(object instanceof UnitCommand c){ }else if(object instanceof UnitCommand c){
write.b((byte)15); write.b((byte)15);
write.b(c.ordinal()); write.b(c.ordinal());
}else if(object instanceof BuildingBox b){
write.b(12);
write.i(b.pos);
}else{ }else{
throw new IllegalArgumentException("Unknown object type: " + object.getClass()); throw new IllegalArgumentException("Unknown object type: " + object.getClass());
} }
@@ -99,6 +102,12 @@ public class TypeIO{
@Nullable @Nullable
public static Object readObject(Reads read){ public static Object readObject(Reads read){
return readObjectBoxed(read, false);
}
/** Reads an object, but boxes buildings. */
@Nullable
public static Object readObjectBoxed(Reads read, boolean box){
byte type = read.b(); byte type = read.b();
switch(type){ switch(type){
case 0: return null; case 0: return null;
@@ -113,7 +122,7 @@ public class TypeIO{
case 9: return TechTree.getNotNull(content.getByID(ContentType.all[read.b()], read.s())); case 9: return TechTree.getNotNull(content.getByID(ContentType.all[read.b()], read.s()));
case 10: return read.bool(); case 10: return read.bool();
case 11: return read.d(); case 11: return read.d();
case 12: return world.build(read.i()); case 12: return !box ? world.build(read.i()) : new BuildingBox(read.i());
case 13: return LAccess.all[read.s()]; case 13: return LAccess.all[read.s()];
case 14: int blen = read.i(); byte[] bytes = new byte[blen]; read.b(bytes); return bytes; case 14: int blen = read.i(); byte[] bytes = new byte[blen]; read.b(bytes); return bytes;
case 15: return UnitCommand.all[read.b()]; case 15: return UnitCommand.all[read.b()];
@@ -600,4 +609,13 @@ public class TypeIO{
return null; return null;
} }
} }
/** Representes a building that has not been resolved yet. */
public static class BuildingBox{
public int pos;
public BuildingBox(int pos){
this.pos = pos;
}
}
} }

View File

@@ -50,13 +50,11 @@ public enum LAccess{
enabled("to"), //"to" is standard for single parameter access enabled("to"), //"to" is standard for single parameter access
shoot("x", "y", "shoot"), shoot("x", "y", "shoot"),
shootp(true, "unit", "shoot"), shootp(true, "unit", "shoot"),
configure(true, 30, "to"), configure(true, "to"),
color("r", "g", "b"); color("r", "g", "b");
public final String[] params; public final String[] params;
public final boolean isObj; public final boolean isObj;
/** Tick cooldown between invocations. */
public float cooldown = -1;
public static final LAccess[] public static final LAccess[]
all = values(), all = values(),
@@ -73,9 +71,4 @@ public enum LAccess{
isObj = obj; isObj = obj;
} }
LAccess(boolean obj, float cooldown, String... params){
this.params = params;
this.cooldown = cooldown;
isObj = obj;
}
} }

View File

@@ -4,19 +4,14 @@ import arc.func.*;
import arc.struct.*; import arc.struct.*;
import arc.util.*; import arc.util.*;
import mindustry.*; import mindustry.*;
import mindustry.gen.*;
import mindustry.logic.LExecutor.*; import mindustry.logic.LExecutor.*;
import mindustry.logic.LStatements.*;
/** "Compiles" a sequence of statements into instructions. */ /** "Compiles" a sequence of statements into instructions. */
public class LAssembler{ public class LAssembler{
public static ObjectMap<String, Func<String[], LStatement>> customParsers = new ObjectMap<>(); public static ObjectMap<String, Func<String[], LStatement>> customParsers = new ObjectMap<>();
public static final int maxTokenLength = 36; public static final int maxTokenLength = 36;
private static final StringMap opNameChanges = StringMap.of( private static final int invalidNum = Integer.MIN_VALUE;
"atan2", "angle",
"dst", "len"
);
private int lastVar; private int lastVar;
/** Maps names to variable IDs. */ /** Maps names to variable IDs. */
@@ -37,10 +32,10 @@ public class LAssembler{
putConst("@tick", 0); putConst("@tick", 0);
} }
public static LAssembler assemble(String data, int maxInstructions){ public static LAssembler assemble(String data){
LAssembler asm = new LAssembler(); LAssembler asm = new LAssembler();
Seq<LStatement> st = read(data, maxInstructions); Seq<LStatement> st = read(data);
asm.instructions = st.map(l -> l.build(asm)).filter(l -> l != null).toArray(LInstruction.class); asm.instructions = st.map(l -> l.build(asm)).filter(l -> l != null).toArray(LInstruction.class);
return asm; return asm;
@@ -57,107 +52,7 @@ public class LAssembler{
} }
public static Seq<LStatement> read(String data){ public static Seq<LStatement> read(String data){
return read(data, LExecutor.maxInstructions); return LParser.parse(data);
}
public static Seq<LStatement> read(String data, int max){
//empty data check
if(data == null || data.isEmpty()) return new Seq<>();
Seq<LStatement> statements = new Seq<>();
String[] lines = data.split("\n");
int index = 0;
for(String line : lines){
if(line.isEmpty()) continue;
//remove trailing semicolons in case someone adds them in for no reason
if(line.endsWith(";")) line = line.substring(0, line.length() - 1);
if(index++ > max) break;
line = line.replace("\t", "").trim();
try{
String[] arr;
if(line.startsWith("#")) continue;
//yes, I am aware that this can be split with regex, but that's slow and even more incomprehensible
if(line.contains(" ")){
Seq<String> tokens = new Seq<>();
boolean inString = false;
int lastIdx = 0;
for(int i = 0; i < line.length() + 1; i++){
char c = i == line.length() ? ' ' : line.charAt(i);
if(c == '#' && !inString){
break;
}else if(c == '"'){
inString = !inString;
}else if(c == ' ' && !inString){
tokens.add(line.substring(lastIdx, Math.min(i, lastIdx + maxTokenLength)));
lastIdx = i + 1;
}
}
arr = tokens.toArray(String.class);
}else{
arr = new String[]{line};
}
//nothing found
if(arr.length == 0) continue;
String type = arr[0];
//legacy stuff
if(type.equals("bop")){
arr[0] = "op";
//field order for bop used to be op a, b, result, but now it's op result a b
String res = arr[4];
arr[4] = arr[3];
arr[3] = arr[2];
arr[2] = res;
}else if(type.equals("uop")){
arr[0] = "op";
if(arr[1].equals("negate")){
arr = new String[]{
"op", "mul", arr[3], arr[2], "-1"
};
}else{
//field order for uop used to be op a, result, but now it's op result a
String res = arr[3];
arr[3] = arr[2];
arr[2] = res;
}
}
//fix up changed operaiton names
if(type.equals("op")){
arr[1] = opNameChanges.get(arr[1], arr[1]);
}
LStatement st = LogicIO.read(arr);
if(st != null){
statements.add(st);
}else{
//attempt parsing using custom parser if a match is found - this is for mods
String first = arr[0];
if(customParsers.containsKey(first)){
statements.add(customParsers.get(first).get(arr));
}else{
//unparseable statement
statements.add(new InvalidStatement());
}
}
}catch(Exception parseFailed){
parseFailed.printStackTrace();
//when parsing fails, add a dummy invalid statement
statements.add(new InvalidStatement());
}
}
return statements;
} }
/** @return a variable ID by name. /** @return a variable ID by name.
@@ -172,30 +67,29 @@ public class LAssembler{
symbol = symbol.trim(); symbol = symbol.trim();
//string case //string case
if(symbol.startsWith("\"") && symbol.endsWith("\"")){ if(!symbol.isEmpty() && symbol.charAt(0) == '\"' && symbol.charAt(symbol.length() - 1) == '\"'){
return putConst("___" + symbol, symbol.substring(1, symbol.length() - 1).replace("\\n", "\n")).id; return putConst("___" + symbol, symbol.substring(1, symbol.length() - 1).replace("\\n", "\n")).id;
} }
//remove spaces for non-strings //remove spaces for non-strings
symbol = symbol.replace(' ', '_'); symbol = symbol.replace(' ', '_');
try{
double value = parseDouble(symbol); double value = parseDouble(symbol);
if(Double.isNaN(value) || Double.isInfinite(value)) value = 0;
if(value == invalidNum){
return putVar(symbol).id;
}else{
//this creates a hidden const variable with the specified value //this creates a hidden const variable with the specified value
return putConst("___" + value, value).id; return putConst("___" + value, value).id;
}catch(NumberFormatException e){
return putVar(symbol).id;
} }
} }
double parseDouble(String symbol) throws NumberFormatException{ double parseDouble(String symbol){
//parse hex/binary syntax //parse hex/binary syntax
if(symbol.startsWith("0b")) return Long.parseLong(symbol.substring(2), 2); if(symbol.startsWith("0b")) return Strings.parseLong(symbol, 2, 2, symbol.length(), invalidNum);
if(symbol.startsWith("0x")) return Long.parseLong(symbol.substring(2), 16); if(symbol.startsWith("0x")) return Strings.parseLong(symbol, 16, 2, symbol.length(), invalidNum);
return Double.parseDouble(symbol); return Strings.parseDouble(symbol, invalidNum);
} }
/** Adds a constant value by name. */ /** Adds a constant value by name. */

View File

@@ -74,8 +74,8 @@ public class LExecutor{
} }
} }
public void load(String data, int maxInstructions){ public void load(String data){
load(LAssembler.assemble(data, maxInstructions)); load(LAssembler.assemble(data));
} }
/** Loads with a specified assembler. Resets all variables. */ /** Loads with a specified assembler. Resets all variables. */
@@ -489,7 +489,7 @@ public class LExecutor{
Building build = exec.building(p1); Building build = exec.building(p1);
int dropped = Math.min(unit.stack.amount, exec.numi(p2)); int dropped = Math.min(unit.stack.amount, exec.numi(p2));
if(build != null && build.isValid() && dropped > 0 && unit.within(build, logicItemTransferRange + build.block.size * tilesize/2f)){ if(build != null && build.team == unit.team && build.isValid() && dropped > 0 && unit.within(build, logicItemTransferRange + build.block.size * tilesize/2f)){
int accepted = build.acceptStack(unit.item(), dropped, unit); int accepted = build.acceptStack(unit.item(), dropped, unit);
if(accepted > 0){ if(accepted > 0){
Call.transferItemTo(unit, unit.item(), accepted, unit.x, unit.y, build); Call.transferItemTo(unit, unit.item(), accepted, unit.x, unit.y, build);
@@ -503,7 +503,8 @@ public class LExecutor{
Building build = exec.building(p1); Building build = exec.building(p1);
int amount = exec.numi(p3); int amount = exec.numi(p3);
if(build != null && build.isValid() && build.items != null && exec.obj(p2) instanceof Item item && unit.within(build, logicItemTransferRange + build.block.size * tilesize/2f)){ if(build != null && build.team == unit.team && build.isValid() && build.items != null &&
exec.obj(p2) instanceof Item item && unit.within(build, logicItemTransferRange + build.block.size * tilesize/2f)){
int taken = Math.min(build.items.get(item), Math.min(amount, unit.maxAccepted(item))); int taken = Math.min(build.items.get(item), Math.min(amount, unit.maxAccepted(item)));
if(taken > 0){ if(taken > 0){
@@ -523,7 +524,6 @@ public class LExecutor{
public int target; public int target;
public LAccess type = LAccess.enabled; public LAccess type = LAccess.enabled;
public int p1, p2, p3, p4; public int p1, p2, p3, p4;
public Interval timer = new Interval(1);
public ControlI(LAccess type, int target, int p1, int p2, int p3, int p4){ public ControlI(LAccess type, int target, int p1, int p2, int p3, int p4){
this.type = type; this.type = type;
@@ -539,7 +539,7 @@ public class LExecutor{
@Override @Override
public void run(LExecutor exec){ public void run(LExecutor exec){
Object obj = exec.obj(target); Object obj = exec.obj(target);
if(obj instanceof Building b && b.team == exec.team && exec.linkIds.contains(b.id) && (type.cooldown <= 0 || timer.get(type.cooldown))){ if(obj instanceof Building b && b.team == exec.team && exec.linkIds.contains(b.id)){
if(type.isObj){ if(type.isObj){
b.control(type, exec.obj(p1), exec.num(p2), exec.num(p3), exec.num(p4)); b.control(type, exec.obj(p1), exec.num(p2), exec.num(p3), exec.num(p4));
}else{ }else{
@@ -636,6 +636,11 @@ public class LExecutor{
Object target = exec.obj(from); Object target = exec.obj(from);
Object sense = exec.obj(type); Object sense = exec.obj(type);
if(target == null && sense == LAccess.dead){
exec.setnum(to, 1);
return;
}
//note that remote units/buildings can be sensed as well //note that remote units/buildings can be sensed as well
if(target instanceof Senseable se){ if(target instanceof Senseable se){
if(sense instanceof Content co){ if(sense instanceof Content co){
@@ -856,9 +861,13 @@ public class LExecutor{
//add graphics calls, cap graphics buffer size //add graphics calls, cap graphics buffer size
if(exec.graphicsBuffer.size < maxGraphicsBuffer){ if(exec.graphicsBuffer.size < maxGraphicsBuffer){
exec.graphicsBuffer.add(DisplayCmd.get(type, exec.numi(x), exec.numi(y), num1, exec.numi(p2), exec.numi(p3), exec.numi(p4))); exec.graphicsBuffer.add(DisplayCmd.get(type, packSign(exec.numi(x)), packSign(exec.numi(y)), packSign(num1), packSign(exec.numi(p2)), packSign(exec.numi(p3)), packSign(exec.numi(p4))));
} }
} }
static int packSign(int value){
return (Math.abs(value) & 0b011111111) | (value < 0 ? 0b1000000000 : 0);
}
} }
public static class DrawFlushI implements LInstruction{ public static class DrawFlushI implements LInstruction{

View File

@@ -0,0 +1,195 @@
package mindustry.logic;
import arc.struct.*;
import arc.util.*;
import mindustry.gen.*;
import mindustry.logic.LStatements.*;
public class LParser{
private static final String[] tokens = new String[16];
private static final int maxJumps = 500;
private static final StringMap opNameChanges = StringMap.of(
"atan2", "angle",
"dst", "len"
);
private static final Seq<JumpIndex> jumps = new Seq<>();
private static final ObjectIntMap<String> jumpLocations = new ObjectIntMap<>();
Seq<LStatement> statements = new Seq<>();
char[] chars;
int pos, line, tok;
LParser(String text){
this.chars = text.toCharArray();
}
/** Parses a sequence of statements from a string. */
public static Seq<LStatement> parse(String text){
//don't waste time parsing null/empty text
if(text == null || text.isEmpty()) return new Seq<>();
return new LParser(text).parse();
}
void comment(){
//read until \n or eof
while(pos < chars.length && chars[pos++] != '\n');
}
void error(String message){
throw new RuntimeException("Invalid code. " + message);
}
String string(){
int from = pos;
while(pos++ < chars.length){
var c = chars[pos];
if(c == '\n'){
error("Missing closing quote \" before end of line.");
}else if(c == '"'){
break;
}
}
if(chars[pos] != '"') error("Missing closing quote \" before end of file.");
return new String(chars, from, ++pos - from);
}
String token(){
int from = pos;
while(pos < chars.length){
char c = chars[pos];
if(c == '\n' || c == ' ' || c == '#' || c == '\t' || c == ';') break;
pos ++;
}
return new String(chars, from, pos - from);
}
/** Apply changes after reading a list of tokens. */
void checkRead(){
if(tokens[0].equals("op")){
//legacy name change
tokens[1] = opNameChanges.get(tokens[1], tokens[1]);
}
}
/** Reads the next statement until EOL/EOF. */
void statement(){
boolean expectNext = false;
tok = 0;
while(pos < chars.length){
char c = chars[pos];
if(tok >= tokens.length) error("Line too long; may only contain " + tokens.length + " tokens");
//reached end of line, bail out.
if(c == '\n' || c == ';') break;
if(expectNext && c != ' ' && c != '#' && c != '\t'){
error("Expected space after string/token.");
}
expectNext = false;
if(c == '#'){
comment();
break;
}else if(c == '"'){
tokens[tok ++] = string();
expectNext = true;
}else if(c != ' ' && c != '\t'){
tokens[tok ++] = token();
expectNext = true;
}else{
pos ++;
}
}
//only process lines with at least 1 token
if(tok > 0){
checkRead();
//store jump location, always ends with colon
if(tok == 1 && tokens[0].charAt(tokens[0].length() - 1) == ':'){
if(jumpLocations.size >= maxJumps){
error("Too many jump locations. Max jumps: " + maxJumps);
}
jumpLocations.put(tokens[0].substring(0, tokens[0].length() - 1), line);
}else{
boolean wasJump;
String jumpLoc = null;
//clean up jump position before parsing
if(wasJump = (tokens[0].equals("jump") && tok > 1 && !Strings.canParseInt(tokens[1]))){
jumpLoc = tokens[1];
tokens[1] = "-1";
}
LStatement st;
try{
st = LogicIO.read(tokens, tok);
}catch(Exception e){
//log invalid statements
Log.err(e);
st = new InvalidStatement();
}
//store jumps that use labels
if(st instanceof JumpStatement jump && wasJump){
jumps.add(new JumpIndex(jump, jumpLoc));
}
if(st != null){
statements.add(st);
}else{
//attempt parsing using custom parser if a match is found; this is for mods
if(LAssembler.customParsers.containsKey(tokens[0])){
statements.add(LAssembler.customParsers.get(tokens[0]).get(tokens));
}else{
//unparseable statement
statements.add(new InvalidStatement());
}
}
line ++;
}
}
}
Seq<LStatement> parse(){
jumps.clear();
jumpLocations.clear();
while(pos < chars.length && line < LExecutor.maxInstructions){
switch(chars[pos]){
case '\n', ' ' -> pos ++; //skip newlines and spaces
case '\r' -> pos += 2; //skip the newline after the \r
default -> statement();
}
}
//load destination indices
for(var i : jumps){
if(!jumpLocations.containsKey(i.location)){
error("Undefined jump location: \"" + i.location + "\". Make sure the jump label exists and is typed correctly.");
}
i.jump.destIndex = jumpLocations.get(i.location, -1);
}
return statements;
}
static class JumpIndex{
JumpStatement jump;
String location;
public JumpIndex(JumpStatement jump, String location){
this.jump = jump;
this.location = location;
}
}
}

View File

@@ -51,7 +51,7 @@ public abstract class LStatement{
} }
protected Cell<TextField> fields(Table table, String desc, String value, Cons<String> setter){ protected Cell<TextField> fields(Table table, String desc, String value, Cons<String> setter){
table.add(desc).padLeft(10).left().self(this::param);; table.add(desc).padLeft(10).left().self(this::param);
return field(table, value, setter).width(85f).padRight(10).left(); return field(table, value, setter).width(85f).padRight(10).left();
} }

View File

@@ -905,7 +905,7 @@ public class LStatements{
void rebuild(Table table){ void rebuild(Table table){
table.clearChildren(); table.clearChildren();
table.add(" find ").left().self(this::param);; table.add(" find ").left().self(this::param);
table.button(b -> { table.button(b -> {
b.label(() -> locate.name()); b.label(() -> locate.name());
@@ -918,14 +918,14 @@ public class LStatements{
switch(locate){ switch(locate){
case building -> { case building -> {
row(table); row(table);
table.add(" group ").left().self(this::param);; table.add(" group ").left().self(this::param);
table.button(b -> { table.button(b -> {
b.label(() -> flag.name()); b.label(() -> flag.name());
b.clicked(() -> showSelect(b, BlockFlag.allLogic, flag, t -> flag = t, 2, cell -> cell.size(110, 50))); b.clicked(() -> showSelect(b, BlockFlag.allLogic, flag, t -> flag = t, 2, cell -> cell.size(110, 50)));
}, Styles.logict, () -> {}).size(110, 40).color(table.color).left().padLeft(2); }, Styles.logict, () -> {}).size(110, 40).color(table.color).left().padLeft(2);
row(table); row(table);
table.add(" enemy ").left().self(this::param);; table.add(" enemy ").left().self(this::param);
fields(table, enemy, str -> enemy = str); fields(table, enemy, str -> enemy = str);

View File

@@ -245,7 +245,7 @@ public class SectorDamage{
//first, calculate the total health of blocks in the path //first, calculate the total health of blocks in the path
//radius around the path that gets counted //radius around the path that gets counted
int radius = 7; int radius = 5;
IntSet counted = new IntSet(); IntSet counted = new IntSet();
for(Tile t : sparse2){ for(Tile t : sparse2){
@@ -273,7 +273,7 @@ public class SectorDamage{
for(Building build : Groups.build){ for(Building build : Groups.build){
float e = build.efficiency(); float e = build.efficiency();
if(e > 0.08f){ if(e > 0.08f){
if(build.team == state.rules.defaultTeam && build instanceof Ranged ranged && sparse.contains(t -> t.within(build, ranged.range() + radius*tilesize))){ if(build.team == state.rules.defaultTeam && build instanceof Ranged ranged && sparse.contains(t -> t.within(build, ranged.range() + 4*tilesize))){
if(build.block instanceof Turret t && build instanceof TurretBuild b && b.hasAmmo()){ if(build.block instanceof Turret t && build instanceof TurretBuild b && b.hasAmmo()){
sumDps += t.shots / t.reloadTime * 60f * b.peekAmmo().estimateDPS() * e; sumDps += t.shots / t.reloadTime * 60f * b.peekAmmo().estimateDPS() * e;
} }

View File

@@ -115,10 +115,6 @@ public class SerpuloPlanetGenerator extends PlanetGenerator{
tile.floor = getBlock(position); tile.floor = getBlock(position);
tile.block = tile.floor.asFloor().wall; tile.block = tile.floor.asFloor().wall;
//if(noise.octaveNoise3D(5, 0.6, 8.0, position.x, position.y, position.z) > 0.65){
//tile.block = Blocks.air;
//}
if(rid.getValue(position.x, position.y, position.z, 22) > 0.32){ if(rid.getValue(position.x, position.y, position.z, 22) > 0.32){
tile.block = Blocks.air; tile.block = Blocks.air;
} }

View File

@@ -317,7 +317,8 @@ public class ContentParser{
readBundle(ContentType.weather, name, value); readBundle(ContentType.weather, name, value);
}else{ }else{
readBundle(ContentType.weather, name, value); readBundle(ContentType.weather, name, value);
item = make(resolve(getType(value), ParticleWeather.class)); item = make(resolve(getType(value), ParticleWeather.class), mod + "-" + name);
value.remove("type");
} }
currentContent = item; currentContent = item;
read(() -> readFields(item, value)); read(() -> readFields(item, value));
@@ -435,6 +436,7 @@ public class ContentParser{
try{ try{
run.run(); run.run();
}catch(Throwable t){ }catch(Throwable t){
Log.err(t);
//don't overwrite double errors //don't overwrite double errors
markError(currentContent, t); markError(currentContent, t);
} }

View File

@@ -25,7 +25,8 @@ public class Scripts implements Disposable{
private static final Seq<String> blacklist = Seq.with(".net.", "java.net", "files", "reflect", "javax", "rhino", "file", "channels", "jdk", private static final Seq<String> blacklist = Seq.with(".net.", "java.net", "files", "reflect", "javax", "rhino", "file", "channels", "jdk",
"runtime", "util.os", "rmi", "security", "org.", "sun.", "beans", "sql", "http", "exec", "compiler", "process", "system", "runtime", "util.os", "rmi", "security", "org.", "sun.", "beans", "sql", "http", "exec", "compiler", "process", "system",
".awt", "socket", "classloader", "oracle", "invoke", "java.util.function", "java.util.stream", "org.", "mod.classmap"); ".awt", "socket", "classloader", "oracle", "invoke", "java.util.function", "java.util.stream", "org.", "mod.classmap");
private static final Seq<String> whitelist = Seq.with("mindustry.net", "netserver", "netclient", "com.sun.proxy.$proxy", "mindustry.gen.", "mindustry.logic.", "mindustry.async.", "saveio", "systemcursor", "filetreeinitevent"); private static final Seq<String> whitelist = Seq.with("mindustry.net", "netserver", "netclient", "com.sun.proxy.$proxy", "jdk.proxy1", "mindustry.gen.",
"mindustry.logic.", "mindustry.async.", "saveio", "systemcursor", "filetreeinitevent");
private final Context context; private final Context context;
private final Scriptable scope; private final Scriptable scope;

View File

@@ -220,7 +220,7 @@ public class Administration{
getCreateInfo(id).banned = true; getCreateInfo(id).banned = true;
save(); save();
Events.fire(new PlayerBanEvent(Groups.player.find(p -> id.equals(p.uuid())))); Events.fire(new PlayerBanEvent(Groups.player.find(p -> id.equals(p.uuid())), id));
return true; return true;
} }
@@ -259,7 +259,7 @@ public class Administration{
info.banned = false; info.banned = false;
bannedIPs.removeAll(info.ips, false); bannedIPs.removeAll(info.ips, false);
save(); save();
Events.fire(new PlayerUnbanEvent(Groups.player.find(p -> id.equals(p.uuid())))); Events.fire(new PlayerUnbanEvent(Groups.player.find(p -> id.equals(p.uuid())), id));
return true; return true;
} }

View File

@@ -22,6 +22,7 @@ import static mindustry.Vars.*;
public class ArcNetProvider implements NetProvider{ public class ArcNetProvider implements NetProvider{
final Client client; final Client client;
final Prov<DatagramPacket> packetSupplier = () -> new DatagramPacket(new byte[512], 512); final Prov<DatagramPacket> packetSupplier = () -> new DatagramPacket(new byte[512], 512);
final AsyncExecutor executor = new AsyncExecutor(Math.max(Runtime.getRuntime().availableProcessors(), 6));
final Server server; final Server server;
final CopyOnWriteArrayList<ArcConnection> connections = new CopyOnWriteArrayList<>(); final CopyOnWriteArrayList<ArcConnection> connections = new CopyOnWriteArrayList<>();
@@ -179,7 +180,7 @@ public class ArcNetProvider implements NetProvider{
@Override @Override
public void pingHost(String address, int port, Cons<Host> valid, Cons<Exception> invalid){ public void pingHost(String address, int port, Cons<Host> valid, Cons<Exception> invalid){
Threads.daemon(() -> { executor.submit(() -> {
try{ try{
DatagramSocket socket = new DatagramSocket(); DatagramSocket socket = new DatagramSocket();
long time = Time.millis(); long time = Time.millis();
@@ -255,7 +256,7 @@ public class ArcNetProvider implements NetProvider{
@Override @Override
public void closeServer(){ public void closeServer(){
connections.clear(); connections.clear();
Threads.daemon(server::stop); executor.submit(server::stop);
} }
ArcConnection getByArcID(int id){ ArcConnection getByArcID(int id){

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