Compare commits

...

152 Commits
v128 ... v129

Author SHA1 Message Date
Anuken
bdb4ae2f85 Typo fix 2021-07-28 17:28:01 -04:00
Anuken
850b0d0210 Merge remote-tracking branch 'origin/master' 2021-07-28 17:08:56 -04:00
Anuken
fa0f161106 Minor swarmer range buff 2021-07-28 17:08:48 -04:00
Prosta4okua
59aff44a55 Update bundle_uk_UA.properties (#5540) 2021-07-28 16:58:06 -04:00
YellOw139
aa74679998 [Bundle][RO] Update (#5573)
* [Bundle][RO] Update

Changelog:

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

* Update bundle_ro.properties

* Update bundle_ro.properties

* settings

* Update bundle_ro.properties

* new blocks

* new units I

* new units II

* Update bundle_ro.properties

* Update bundle_ro.properties
2021-07-28 16:57:54 -04:00
Anuken
61db253d4a Merge remote-tracking branch 'origin/master' 2021-07-28 11:51:25 -04:00
Anuken
fef8ee925b Potential fix for #5660 2021-07-28 11:51:20 -04:00
Ksawi
5cb5434ffe Update bundle_pl.properties (#5572)
* Update bundle_pl.properties

Added translation of statuses and processor functions. Changed few translations.

* content.status.name

* Update bundle_pl.properties

* Update bundle_pl.properties

* Flares in omura.description

* Update bundle_pl.properties

* Now better?

* Update bundle_pl.properties

* Better names

* Update bundle_pl.properties

* bullet.lightning

* mods.browser

* Badania -> Zbadaj

* Final statuses names (I think)

* Ready to merge

* Tutorial (as in #5206)

* Research

* Final changes
2021-07-28 10:45:49 -04:00
Catchears
2f71a4092f german v7 update (#5631) 2021-07-28 10:45:15 -04:00
VizardAlpha
a97573c5a9 Updates bundle_fr.properties (#5611)
* Updates bundle_fr.properties

Add and translate.
Commits on Jul 13, 2021
Commits on Jul 17, 2021 
Commits on Jul 18, 2021

* Minor. Correcting translation errors

* Add commit

* Add commit

* Add new commit

Translation not finish;
unit.oxynoe.description = Fires structure-repairing streams of flame at nearby enemies. Targets nearby enemy projectiles with a point defense turret.

* Translation finish

* Added hint & tooltip for derelict structures

* Correction of an error

hint.placeTurret = Placez des \fuf861 -> hint.placeTurret = Placez des \uf861

* Fixed #5645

servers.local.steam = Open Games & Serveurs Locaux 

Not finish

* Removed flow rate option
2021-07-28 10:45:02 -04:00
Sharlotte
108baa467d Update bundle_ko.properties (#5604)
* Update bundle_ko.properties

* Update bundle_ko.properties

* Update bundle_ko.properties

* halha

* Update bundle_ko.properties
2021-07-28 10:44:44 -04:00
JrTRinny
193015f1cd update bundle_th.properties (#5591)
* separated from `#5491`

* follow latest changes

like settings tooltips, large launch pad removal and clean up team PvP

* follow latest changes

* descriptions for new content

* line spacings and edit errors

* derelict tooltips

* open games

* remove resource flow rate
2021-07-28 10:44:35 -04:00
Anuken
b64432dafd Allow placing blocks with 0 requirements of an item 2021-07-28 08:38:45 -04:00
buthed010203
d66bb3a539 Better Plan Skipping 2: Electric Boogaloo (#5659)
Fixing a problem that I created. Just allows for plan switching when items are low when the player isnt in range of the building they were previously building.
Before: ![](https://aethex.is-a.fail/55tN9oFIC.png)
After: ![](https://extremely.questionable.link/55tNBlX8h.png)
2021-07-27 20:20:27 -04:00
Anuken
5ca5025fb1 Final core launch animation / Added option to skip core animations 2021-07-27 19:02:04 -04:00
Anuken
497a68e792 Merge remote-tracking branch 'origin/master' 2021-07-27 17:43:19 -04:00
Anuken
737fa4fa69 WIP launch animation progress 2021-07-27 17:43:12 -04:00
Volas171
3d3e33912e Mindustry Reborn CAMS (update servers_v7.json) (#5651)
* CAMS

* space
2021-07-27 17:09:50 -04:00
Sunny Kim
235fee091e keep v6 mod compatibility (#5655) 2021-07-27 17:08:29 -04:00
Anuken
00e3a59463 Land animation progress / IntelliJ android plugin hack 2021-07-27 16:26:13 -04:00
Anuken
269c48b65b AmmoType refactoring 2021-07-27 12:42:50 -04:00
Anuken
adbe55b0db Minor cloud bugfixes / Removed flow rate option 2021-07-27 09:08:09 -04:00
Anuken
f5222674ff Unused sprite cleanup 2021-07-26 19:54:22 -04:00
Anuken
c19a7e8452 New core landing animation 2021-07-26 19:29:14 -04:00
Anuken
aab79a90fb Fixed #5648 2021-07-25 20:55:59 -04:00
Anuken
f3b6f0a29b Fixed #5647 2021-07-25 20:17:18 -04:00
Anuken
d1fb436d6d Further bridge cleanup 2021-07-25 19:55:07 -04:00
Anuken
1734d02291 Bridge code cleanup 2021-07-25 19:21:13 -04:00
Anuken
f8c7739d5a Removed unitModifier flag 2021-07-25 17:17:07 -04:00
Anuken
7a1f332731 Ammo system redesign 2021-07-25 17:15:39 -04:00
Anuken
9cd19c0470 Fixed generator time not saving / 128 compat break 2021-07-25 14:35:56 -04:00
Anuken
c9ca08ff1c Merge remote-tracking branch 'origin/master' 2021-07-25 12:04:52 -04:00
Anuken
c14532ecae Fixed #5645 2021-07-25 12:04:17 -04:00
EnderquakeYT
b66cc8d8d7 Fixed stuff and added translation (#5440)
Fixed wave.enemy and added a translation for stat.charge
2021-07-25 09:08:16 -04:00
Anuken
b6ed5fbd6f Disable keyboard option on iOS 2021-07-25 08:41:06 -04:00
Anuken
2fec2156f6 Fixed #5642 2021-07-24 23:14:28 -04:00
Anuken
35b3231b84 Merge remote-tracking branch 'origin/master' 2021-07-24 21:10:46 -04:00
Anuken
f77c32cbb2 New flying unit targeting system 2021-07-24 21:10:39 -04:00
MEEP of Faith
7ec5aa28b3 Include time in status effect draw (#5640) 2021-07-24 20:10:41 -04:00
Anuken
373d004752 Merge remote-tracking branch 'origin/master' 2021-07-24 12:48:29 -04:00
Anuken
0ee137fe05 Added hint & tooltip for derelict structures 2021-07-24 12:48:25 -04:00
buthed010203
9c5d75c439 Typo Fix (#5639)
do
2021-07-24 10:41:01 -04:00
Anuken
adbfcdf16a Reverted vault/container health buff due to "damaged" appearance in saves 2021-07-24 09:14:38 -04:00
Anuken
0716ecad55 Merge remote-tracking branch 'origin/master' 2021-07-24 08:44:47 -04:00
Anuken
9160ee546c Allow derelict block pickup / Fixed derelict blocks being targeted 2021-07-24 08:44:43 -04:00
SoMall-dumpling
7897d2858c Update bundle_zh_CN.properties (#5530)
* Update bundle_zh_CN.properties

* Update bundle_zh_CN.properties

* Update bundle_zh_CN.properties

* Update bundle_zh_CN.properties

* Update bundle_zh_CN.properties

* Update bundle_zh_CN.properties

* Update bundle_zh_CN.properties

* Update bundle_zh_CN.properties

* Create bundle_zh_CN.properties

* Create bundle_zh_CN.properties

* Update bundle_zh_CN.properties

* Update bundle_zh_CN.properties

* Update bundle_zh_CN.properties

* Update bundle_zh_CN.properties

* Update bundle_zh_CN.properties

* Update bundle_zh_CN.properties

* Update bundle_zh_CN.properties

Updates the latest Navy Support Units description.

* Update bundle_zh_CN.properties

Perfectly matches.
2021-07-24 08:40:23 -04:00
Anuken
b88364ab48 Fixed #5638 2021-07-24 08:36:20 -04:00
Anuken
7727da40b4 Merge remote-tracking branch 'origin/master' 2021-07-23 19:40:08 -04:00
Anuken
17e68f7a93 Fixed additive reconstructor center sprite 2021-07-23 19:39:52 -04:00
Anuken
120aa7c12a Cleanup 2021-07-23 17:56:13 -04:00
buthed010203
53214f0ddc Enable mining of sand when double click to mine is enabled (#4788)
* Sand mineable with double click to mine enabled

Since the only reason sand is un-mineable in the first place is because accidentally mining it is annoying, it should be enabled for double click to mine.

* only show sand as mineable when double click mine is enabled

Co-authored-by: Anuken <arnukren@gmail.com>
2021-07-23 15:51:26 -04:00
Anuken
d89a1fac70 Update pull_request_template.md 2021-07-23 15:50:09 -04:00
Semetrix
0c00000910 Add a second Hungarian server (#5636) 2021-07-23 15:49:42 -04:00
buthed010203
f4f46eb924 Better plan skipping (#5634)
This prevents the plans being skipped when there is a large number of items entering the core yet the core is still starved of that item.
2021-07-23 13:45:48 -04:00
Anuken
b873adf5fc docs 2021-07-23 10:25:12 -04:00
Anuken
72fb66e5b2 Anuken/Mindustry-Suggestions/issues/2730 2021-07-22 11:21:23 -04:00
Anuken
af691c980d Merge remote-tracking branch 'origin/master' 2021-07-21 21:03:30 -04:00
Anuken
b3be906e28 Removed MendProjector phase coloration 2021-07-21 21:03:26 -04:00
buthed010203
1c22e2ed28 Update StatValues.java (#5629)
Why is this number 0? The default amount should be 1, the timeperiod is already set to 0 everywhere anyways.
2021-07-21 15:50:35 -04:00
Anuken
95fd073432 Merge remote-tracking branch 'origin/master' 2021-07-21 09:02:13 -04:00
Anuken
fcb9ebb8c3 Thermal generator effect tweaks 2021-07-21 09:02:08 -04:00
VizardAlpha
4ab063679b Update short_description.txt for android (#5401) 2021-07-21 08:37:14 -04:00
Anuken
db13bffad6 Descriptions for new content 2021-07-21 07:58:50 -04:00
Anuken
b719a0cd35 Merge remote-tracking branch 'origin/master' 2021-07-20 19:56:59 -04:00
Anuken
d506685bba Stacked map editor brush slider 2021-07-20 19:56:55 -04:00
Anuken
8cf2068a70 Create pull_request_template.md 2021-07-20 19:15:50 -04:00
Anuken
14e4203ee7 #4912 2021-07-20 17:59:47 -04:00
Anuken
447562b2f1 Turret accurateDelay parameter 2021-07-20 17:55:00 -04:00
Anuken
02c03e9c67 Cleanup & minor layout bugfixes 2021-07-20 17:38:09 -04:00
Anuken
f8ddf952ca Improved coal centrifuge update effect 2021-07-20 15:22:57 -04:00
Anuken
8436599c79 #5050 2021-07-20 14:12:48 -04:00
Anuken
4c51519b8a #4886 2021-07-20 13:59:19 -04:00
Anuken
0f199fa4b4 Partial impl of #2923 2021-07-20 13:17:18 -04:00
Anuken
b28aff4a7b Sector items display fixes 2021-07-20 12:05:10 -04:00
Anuken
ba227d64fb #5224 2021-07-20 11:42:11 -04:00
MEEP of Faith
7656aedb6b Drawf.Laser with different ends (#5301)
* Laser with different ends

* Allow usage of different ended TractorBeamTurret lasers

* oops

* aaaa

* too. many. commits.

* Remove rotation

* I shouldn't be allowed to edit from the browser.
2021-07-20 11:22:17 -04:00
Phinner
6e967dce70 Add xpdustry.fr to server_v6.json (#5625)
A server for my dear french Mindustry players, dedicated for plugin testing and survival maps.
2021-07-20 11:19:03 -04:00
Patrick 'Quezler' Mounier
232415f1d7 Move capping code from armored to normal conduits (#4979) 2021-07-20 11:05:35 -04:00
Anuken
b2ed0ee884 #4440 2021-07-20 10:56:58 -04:00
Anuken
6ffc8ba3c5 #4874 2021-07-20 10:45:15 -04:00
Anuken
82f0d6a542 Fixed core capture crash 2021-07-20 10:28:58 -04:00
Anuken
40e0303786 Merge remote-tracking branch 'origin/master' 2021-07-20 10:20:11 -04:00
Anuken
0e3bb40eb4 More mobile input targeting fixes 2021-07-20 10:20:06 -04:00
notrealn
730cb14f6a Fix turret shooting priority when there are multiple teams (#5299) 2021-07-20 09:00:19 -04:00
Anuken
c18ab184b7 Merge remote-tracking branch 'origin/master' 2021-07-20 08:49:10 -04:00
Anuken
b85cbe515e Fixed #5621 2021-07-20 08:49:02 -04:00
buthed010203
b58f202e9e Allow hiding of steam servers (#5618)
* Allow hiding of steam servers

Theres no way to hide them while keeping them public in the steam api so instead this jank is needed. This wont do anything on a vanilla install but will allow people hosting headless steam servers to hide them if they only use the server to verify if players are on steam or not.

* Hide only when hidden = true
2021-07-19 20:57:36 -04:00
Sunny Kim
fde23ceea0 SpinSprite DrawRotator for json mods (#5619) 2021-07-19 19:11:53 -04:00
buthed010203
aab2437c4c Dont disconnect when connecting to steam servers on non steam (#5617)
This will allow sending steam players to steam servers while completely ignoring non steam ones.
2021-07-19 18:42:03 -04:00
Ilya246
b7f7be839d Update .pl servers (#5599)
* Update .pl servers

* Update servers_v7.json
2021-07-19 18:34:14 -04:00
Anuken
6b7a63aba5 Cleanup 2021-07-19 15:20:53 -04:00
Anuken
0c46d5088c Better laser/blast drill rotators 2021-07-19 14:11:07 -04:00
Anuken
254425d9ad Merge branch 'sk7725-cool-drills' 2021-07-19 09:00:54 -04:00
Anuken
c7ff20d47d Fracker + SolidPump spinner lighting 2021-07-19 09:00:35 -04:00
Anuken
1db5a9f3c2 Merge branch 'cool-drills' of git://github.com/sk7725/Mindustry into sk7725-cool-drills 2021-07-19 08:55:10 -04:00
Anuken
34cf8466d6 Added default value for mass driver bullet 2021-07-19 08:44:19 -04:00
Sunny Kim
8c20203084 formatting 2021-07-19 17:09:17 +09:00
Sunny Kim
a7ed7a71d5 drawSpinSprite 2021-07-19 16:40:57 +09:00
Sunny Kim
2583541c0f spinSprite 2021-07-19 16:36:58 +09:00
Anuken
1674b2dfd6 Fixed #5609 2021-07-18 16:31:13 -04:00
Anuken
96de7c8321 Merge remote-tracking branch 'origin/master' 2021-07-18 14:41:05 -04:00
Anuken
7879648090 Suppress invalid save meta errors 2021-07-18 14:40:59 -04:00
Darkness6030
5772f5e7da So now Mindurka => Darkdustry (#5608)
I've changed the server name cuz mindurka sounds strange
Now we are DarkDustry
2021-07-18 14:39:12 -04:00
Anuken
54db6bda85 Merge remote-tracking branch 'origin/master' 2021-07-18 12:49:02 -04:00
Anuken
4ffcf252b7 Fixed bullet heal percent being displayed as 0 when <1 2021-07-18 12:48:57 -04:00
Anuken
b3b44214e0 No need to run own server with so many alternatives 2021-07-18 12:45:26 -04:00
Anuken
89942416ac Core containers/vaults no longer explode violently 2021-07-18 12:12:04 -04:00
Anuken
974d3498c1 Settings tooltips 2021-07-18 11:11:28 -04:00
Mina Her
1804111f88 Add spacing between name and value in slider (#5601) 2021-07-18 09:15:04 -04:00
Anuken
5b2dc021a6 Prevent concurrent modification in BlockIndexer#eachBlock 2021-07-18 08:56:48 -04:00
Anuken
37d7b3d7fb Fixed screen shake moving camera pan position 2021-07-17 20:45:53 -04:00
Anuken
33d4ab9edb Fixed block plans not being deleted locally 2021-07-17 19:17:47 -04:00
Anuken
f7f2b3438c Use short filter names in JSON 2021-07-17 16:46:35 -04:00
Anuken
0ed7934df0 arc 2021-07-17 15:33:19 -04:00
Anuken
55920e6242 Cleanup 2021-07-17 15:18:51 -04:00
Anuken
820920e5f9 Redundant cast cleanup 2021-07-17 09:30:31 -04:00
Anuken
8e21c627a7 Improved Serpulo sector path generation 2021-07-17 09:22:02 -04:00
Anuken
6973ed7d55 PvP defeated team cleanup 2021-07-17 08:52:24 -04:00
Anuken
0980495a28 (commented) support for Call server-to-client sounds 2021-07-16 15:39:03 -04:00
Anuken
5c6b659ce3 Possible rare crash fix 2021-07-16 12:59:50 -04:00
Anuken
35e263223d Merge remote-tracking branch 'origin/master' 2021-07-16 12:37:36 -04:00
Anuken
07ba378095 Hide construct/legacy blocks 2021-07-16 12:37:31 -04:00
buthed010203
6e10f86546 Display item rates on reconstructors (#5581)
Display the rates here because why not
![]https://mee6.is-terrible.com/54feDAY76.png
2021-07-16 12:21:58 -04:00
RebornTrack970
fc6ee11ffe Some more servers are back (#5594)
* Servers Back

* Update servers_v7.json
2021-07-16 12:19:56 -04:00
Anuken
84cd87370f Merge remote-tracking branch 'origin/master' 2021-07-16 10:06:07 -04:00
Anuken
822fe9ab7a Fixed inaccessible gaps in Serpulo generator 2021-07-16 10:05:59 -04:00
Sharlotte
57b22a9cab Update bundle_ko.properties (#5590) 2021-07-16 08:56:23 -04:00
Anuken
278c4f17e5 Why was this class even created 2021-07-15 20:19:51 -04:00
Anuken
b0d4607798 Fixed #5588 2021-07-15 20:08:05 -04:00
Anuken
3f7dc66ac0 Fixed #5587 2021-07-15 14:55:32 -04:00
Anuken
1c2b1fb757 System property cleanup 2021-07-15 11:27:21 -04:00
Anuken
eb31483a15 Fixed #5585 2021-07-15 10:18:08 -04:00
Anuken
8fb7cdaba6 Fixed #5584 2021-07-15 10:10:36 -04:00
Anuken
61d81046ae Fixed #5583 2021-07-15 08:46:56 -04:00
Anuken
0c3d7e09e0 Don't crash when font glyphs are missing 2021-07-14 21:40:47 -04:00
Anuken
a9f9ddcacf AnnotationProxyMaker workaround cleanup 2021-07-14 19:52:43 -04:00
Anuken
a559c3581e Fixed continuous weapon sounds / Improved naval support audio 2021-07-14 18:46:51 -04:00
Anuken
dd5389c738 New sound for rock/plant breaking 2021-07-14 17:22:21 -04:00
Anuken
ac25e17286 Unused property cleanup 2021-07-14 16:06:03 -04:00
Anuken
9de4c89e76 Fixed #5582 2021-07-14 15:55:40 -04:00
Anuken
2f6846d8c3 Conveyor tweaks 2021-07-14 15:12:00 -04:00
Anuken
c3e60531c4 Merge remote-tracking branch 'origin/master' 2021-07-14 09:28:05 -04:00
Anuken
44aff82a6c "Fixed" #5580 2021-07-14 09:27:59 -04:00
alex
7619e7643d Update v6 servers for alex servers (#5576) 2021-07-14 09:23:53 -04:00
RebornTrack970
353ef05b93 OmegaHub is back (kinda) (#5578) 2021-07-14 09:23:41 -04:00
Anuken
2801e4ed80 Fixed #5579 2021-07-14 09:14:19 -04:00
Anuken
173dd0a90e Fixed #5577 2021-07-14 09:07:17 -04:00
Anuken
e5412aeb1b Inventory constant cleanup 2021-07-13 17:38:42 -04:00
Anuken
0eec955a3d #5563 2021-07-13 10:42:00 -04:00
Anuken
47038ac06d Longer mod test timeout 2021-07-13 10:33:44 -04:00
Anuken
8041c305ad Misc bugfixes 2021-07-13 10:28:35 -04:00
Anuken
e0d249898e Fixed mod dialog width... again. 2021-07-12 16:18:29 -04:00
172 changed files with 2231 additions and 1571 deletions

5
.github/pull_request_template.md vendored Normal file
View File

@@ -0,0 +1,5 @@
If your pull request is **not** translation or serverlist-related, read the list of requirements below and check each box:
- [ ] I have read the [contribution guidelines](https://github.com/Anuken/Mindustry/blob/master/CONTRIBUTING.md).
- [ ] I have ensured that my code compiles, if applicable.
- [ ] I have ensured that any new features in this PR function correctly in-game, if applicable.

View File

@@ -7,6 +7,7 @@ buildscript{
} }
dependencies{ dependencies{
//note that later versions, like alpha05, fail to work correctly
classpath 'com.android.tools.build:gradle:7.1.0-alpha02' classpath 'com.android.tools.build:gradle:7.1.0-alpha02'
} }
} }
@@ -18,7 +19,6 @@ configurations{ natives }
repositories{ repositories{
mavenCentral() mavenCentral()
maven{ url "https://maven.google.com" } maven{ url "https://maven.google.com" }
jcenter() //remove later once google/JetBrains fixes the dependency
} }
task deploy(type: Copy){ task deploy(type: Copy){

View File

@@ -1,5 +1,7 @@
package mindustry.annotations.impl; package mindustry.annotations.impl;
import arc.*;
import arc.audio.*;
import arc.files.*; import arc.files.*;
import arc.scene.style.*; import arc.scene.style.*;
import arc.struct.*; import arc.struct.*;
@@ -118,9 +120,31 @@ 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 loadBegin = MethodSpec.methodBuilder("load").addModifiers(Modifier.PUBLIC, Modifier.STATIC); MethodSpec.Builder loadBegin = MethodSpec.methodBuilder("load").addModifiers(Modifier.PUBLIC, Modifier.STATIC);
CodeBlock.Builder staticb = CodeBlock.builder();
type.addField(FieldSpec.builder(IntMap.class, "idToSound", Modifier.STATIC, Modifier.PRIVATE).initializer("new IntMap()").build());
type.addField(FieldSpec.builder(ObjectIntMap.class, "soundToId", Modifier.STATIC, Modifier.PRIVATE).initializer("new ObjectIntMap()").build());
type.addMethod(MethodSpec.methodBuilder("getSoundId")
.addModifiers(Modifier.PUBLIC, Modifier.STATIC)
.addParameter(Sound.class, "sound")
.returns(int.class)
.addStatement("return soundToId.get(sound, -1)").build());
type.addMethod(MethodSpec.methodBuilder("getSound")
.addModifiers(Modifier.PUBLIC, Modifier.STATIC)
.addParameter(int.class, "id")
.returns(Sound.class)
.addStatement("return (Sound)idToSound.get(id, () -> Sounds.none)").build());
HashSet<String> names = new HashSet<>(); HashSet<String> names = new HashSet<>();
Fi.get(path).walk(p -> { Seq<Fi> files = new Seq<>();
Fi.get(path).walk(files::add);
files.sortComparing(Fi::name);
int id = 0;
for(Fi p : files){
String name = p.nameWithoutExtension(); String name = p.nameWithoutExtension();
if(names.contains(name)){ if(names.contains(name)){
@@ -133,14 +157,20 @@ public class AssetsProcess extends BaseProcessor{
String filepath = path.substring(path.lastIndexOf("/") + 1) + p.path().substring(p.path().lastIndexOf(path) + path.length()); String filepath = path.substring(path.lastIndexOf("/") + 1) + p.path().substring(p.path().lastIndexOf(path) + path.length());
String filename = "\"" + filepath + "\""; staticb.addStatement("soundToId.put($L, $L)", name, id);
loadBegin.addStatement("arc.Core.assets.load(" + filename + ", " + rtype + ".class).loaded = a -> " + name + " = (" + rtype + ")a", filepath, filepath.replace(".ogg", ".mp3"));
type.addField(FieldSpec.builder(ClassName.bestGuess(rtype), name, Modifier.STATIC, Modifier.PUBLIC).initializer("new arc.audio." + rtype.substring(rtype.lastIndexOf(".") + 1) + "()").build()); loadBegin.addStatement("$T.assets.load($S, $L.class).loaded = a -> { $L = ($L)a; soundToId.put(a, $L); idToSound.put($L, a); }",
}); Core.class, filepath, rtype, name, rtype, id, id);
type.addField(FieldSpec.builder(ClassName.bestGuess(rtype), name, Modifier.STATIC, Modifier.PUBLIC).initializer("new " + rtype + "()").build());
id ++;
}
type.addStaticBlock(staticb.build());
if(classname.equals("Sounds")){ if(classname.equals("Sounds")){
type.addField(FieldSpec.builder(ClassName.bestGuess(rtype), "none", Modifier.STATIC, Modifier.PUBLIC).initializer("new arc.audio." + rtype.substring(rtype.lastIndexOf(".") + 1) + "()").build()); type.addField(FieldSpec.builder(ClassName.bestGuess(rtype), "none", Modifier.STATIC, Modifier.PUBLIC).initializer("new " + rtype + "()").build());
} }
type.addMethod(loadBegin.build()); type.addMethod(loadBegin.build());

View File

@@ -7,6 +7,7 @@ import com.sun.tools.javac.code.Attribute.Enum;
import com.sun.tools.javac.code.Attribute.Error; import com.sun.tools.javac.code.Attribute.Error;
import com.sun.tools.javac.code.Attribute.Visitor; import com.sun.tools.javac.code.Attribute.Visitor;
import com.sun.tools.javac.code.Attribute.*; import com.sun.tools.javac.code.Attribute.*;
import com.sun.tools.javac.code.Scope.*;
import com.sun.tools.javac.code.Type; import com.sun.tools.javac.code.Type;
import com.sun.tools.javac.code.Symbol.*; import com.sun.tools.javac.code.Symbol.*;
import com.sun.tools.javac.code.Type.ArrayType; import com.sun.tools.javac.code.Type.ArrayType;
@@ -64,36 +65,13 @@ public class AnnotationProxyMaker{
LinkedHashMap map = new LinkedHashMap(); LinkedHashMap map = new LinkedHashMap();
ClassSymbol cl = (ClassSymbol)this.anno.type.tsym; ClassSymbol cl = (ClassSymbol)this.anno.type.tsym;
//try to use Java 8 API for this if possible for(Symbol s : cl.members().getSymbols(LookupKind.NON_RECURSIVE)){
try{ if(s.getKind() == ElementKind.METHOD){
Class entryClass = Class.forName("com.sun.tools.javac.code.Scope$Entry"); MethodSymbol var4 = (MethodSymbol)s;
Object members = cl.members(); Attribute var5 = var4.getDefaultValue();
Field field = members.getClass().getField("elems"); if(var5 != null){
Object elems = field.get(members); map.put(var4, var5);
Field siblingField = entryClass.getField("sibling");
Field symField = entryClass.getField("sym");
for(Object currEntry = elems; currEntry != null; currEntry = siblingField.get(currEntry)){
handleSymbol((Symbol)symField.get(currEntry), map);
} }
}catch(Throwable e){
//otherwise try other API
try{
Class lookupClass = Class.forName("com.sun.tools.javac.code.Scope$LookupKind");
Field nonRecField = lookupClass.getField("NON_RECURSIVE");
Object nonRec = nonRecField.get(null);
Scope scope = cl.members();
Method getSyms = scope.getClass().getMethod("getSymbols", lookupClass);
Iterable<Symbol> it = (Iterable<Symbol>)getSyms.invoke(scope, nonRec);
Iterator<Symbol> i = it.iterator();
while(i.hasNext()){
handleSymbol(i.next(), map);
}
}catch(Throwable death){
//I tried
throw new RuntimeException(death);
} }
} }
@@ -104,17 +82,6 @@ public class AnnotationProxyMaker{
return map; return map;
} }
private void handleSymbol(Symbol sym, LinkedHashMap map){
if(sym.getKind() == ElementKind.METHOD){
MethodSymbol var4 = (MethodSymbol)sym;
Attribute var5 = var4.getDefaultValue();
if(var5 != null){
map.put(var4, var5);
}
}
}
private Object generateValue(MethodSymbol var1, Attribute var2){ private Object generateValue(MethodSymbol var1, Attribute var2){
AnnotationProxyMaker.ValueVisitor var3 = new AnnotationProxyMaker.ValueVisitor(var1); AnnotationProxyMaker.ValueVisitor var3 = new AnnotationProxyMaker.ValueVisitor(var1);
return var3.getValue(var2); return var3.getValue(var2);

View File

@@ -12,6 +12,10 @@ import java.lang.Class;
import java.lang.annotation.*; import java.lang.annotation.*;
import java.lang.reflect.*; import java.lang.reflect.*;
/**
* Wrapper over Element with added utility functions.
* I would have preferred to use extension methods for this, but Java doesn't have any.
* */
public class Selement<T extends Element>{ public class Selement<T extends Element>{
public final T e; public final T e;

View File

@@ -57,7 +57,7 @@ allprojects{
if(!project.hasProperty("versionType")) versionType = 'official' if(!project.hasProperty("versionType")) versionType = 'official'
appName = 'Mindustry' appName = 'Mindustry'
steamworksVersion = '0b86023401880bb5e586bc404bedbaae9b1f1c94' steamworksVersion = '0b86023401880bb5e586bc404bedbaae9b1f1c94'
rhinoVersion = '55bf0dac1cfa7770672fd26112512c733ca9d5dc' rhinoVersion = '9f792d202471fb3789eab7bb261fec13d67287e2'
loadVersionProps = { loadVersionProps = {
return new Properties().with{p -> p.load(file('../core/assets/version.properties').newReader()); return p } return new Properties().with{p -> p.load(file('../core/assets/version.properties').newReader()); return p }

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.1 KiB

After

Width:  |  Height:  |  Size: 1012 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 558 B

After

Width:  |  Height:  |  Size: 685 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 874 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 871 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 528 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 512 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.3 KiB

After

Width:  |  Height:  |  Size: 1.3 KiB

View File

@@ -101,6 +101,7 @@ customgame = Custom Game
newgame = New Game newgame = New Game
none = <none> none = <none>
none.found = [lightgray]<none found> none.found = [lightgray]<none found>
none.inmap = [lightgray]<none in map>
minimap = Minimap minimap = Minimap
position = Position position = Position
close = Close close = Close
@@ -214,6 +215,7 @@ hosts.none = [lightgray]No local games found!
host.invalid = [scarlet]Can't connect to host. host.invalid = [scarlet]Can't connect to host.
servers.local = Local Servers servers.local = Local Servers
servers.local.steam = Open Games & Local Servers
servers.remote = Remote Servers servers.remote = Remote Servers
servers.global = Community Servers servers.global = Community Servers
@@ -565,6 +567,7 @@ sectors.unexplored = [lightgray]Unexplored
sectors.resources = Resources: sectors.resources = Resources:
sectors.production = Production: sectors.production = Production:
sectors.export = Export: sectors.export = Export:
sectors.import = Import:
sectors.time = Time: sectors.time = Time:
sectors.threat = Threat: sectors.threat = Threat:
sectors.wave = Wave: sectors.wave = Wave:
@@ -724,7 +727,7 @@ stat.maxconsecutive = Max Consecutive
stat.buildcost = Build Cost stat.buildcost = Build Cost
stat.inaccuracy = Inaccuracy stat.inaccuracy = Inaccuracy
stat.shots = Shots stat.shots = Shots
stat.reload = Shots/Second stat.reload = Firing Rate
stat.ammo = Ammo stat.ammo = Ammo
stat.shieldhealth = Shield Health stat.shieldhealth = Shield Health
stat.cooldowntime = Cooldown Time stat.cooldowntime = Cooldown Time
@@ -793,7 +796,7 @@ 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.homing = [stat]homing bullet.homing = [stat]homing
bullet.frag = [stat]frag bullet.frags = [stat]{0}[lightgray]x frag bullets:
bullet.lightning = [stat]{0}[lightgray]x lightning ~ [stat]{1}[lightgray] damage 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
@@ -832,20 +835,19 @@ category.items = Items
category.crafting = Input/Output category.crafting = Input/Output
category.function = Function category.function = Function
category.optional = Optional Enhancements category.optional = Optional Enhancements
setting.skipcoreanimation.name = Skip Core Launch/Land Animation
setting.landscape.name = Lock Landscape setting.landscape.name = Lock Landscape
setting.shadows.name = Shadows setting.shadows.name = Shadows
setting.blockreplace.name = Automatic Block Suggestions setting.blockreplace.name = Automatic Block Suggestions
setting.linear.name = Linear Filtering setting.linear.name = Linear Filtering
setting.hints.name = Hints setting.hints.name = Hints
setting.logichints.name = Logic Hints setting.logichints.name = Logic Hints
setting.flow.name = Display Resource Flow Rate
setting.backgroundpause.name = Pause In Background setting.backgroundpause.name = Pause In Background
setting.buildautopause.name = Auto-Pause Building setting.buildautopause.name = Auto-Pause Building
setting.doubletapmine.name = Double-Tap to Mine setting.doubletapmine.name = Double-Tap to Mine
setting.modcrashdisable.name = Disable Mods On Startup Crash setting.modcrashdisable.name = Disable Mods On Startup Crash
setting.animatedwater.name = Animated Surfaces setting.animatedwater.name = Animated Surfaces
setting.animatedshields.name = Animated Shields setting.animatedshields.name = Animated Shields
setting.antialias.name = Antialias[lightgray] (requires restart)[]
setting.playerindicators.name = Player Indicators setting.playerindicators.name = Player Indicators
setting.indicators.name = Enemy Indicators setting.indicators.name = Enemy Indicators
setting.autotarget.name = Auto-Target setting.autotarget.name = Auto-Target
@@ -854,7 +856,8 @@ setting.touchscreen.name = Touchscreen Controls
setting.fpscap.name = Max FPS setting.fpscap.name = Max FPS
setting.fpscap.none = None setting.fpscap.none = None
setting.fpscap.text = {0} FPS setting.fpscap.text = {0} FPS
setting.uiscale.name = UI Scaling[lightgray] (restart required)[] setting.uiscale.name = UI Scaling
setting.uiscale.description = Restart required to apply changes.
setting.swapdiagonal.name = Always Diagonal Placement setting.swapdiagonal.name = Always Diagonal Placement
setting.difficulty.training = Training setting.difficulty.training = Training
setting.difficulty.easy = Easy setting.difficulty.easy = Easy
@@ -872,7 +875,8 @@ setting.saveinterval.name = Save Interval
setting.seconds = {0} seconds setting.seconds = {0} seconds
setting.milliseconds = {0} milliseconds setting.milliseconds = {0} milliseconds
setting.fullscreen.name = Fullscreen setting.fullscreen.name = Fullscreen
setting.borderlesswindow.name = Borderless Window[lightgray] (restart may be required) setting.borderlesswindow.name = Borderless Window
setting.borderlesswindow.description = Restart may be required to apply changes.
setting.fps.name = Show FPS & Ping setting.fps.name = Show FPS & Ping
setting.smoothcamera.name = Smooth Camera setting.smoothcamera.name = Smooth Camera
setting.vsync.name = VSync setting.vsync.name = VSync
@@ -995,6 +999,7 @@ rules.wavetimer = Wave Timer
rules.waves = Waves rules.waves = Waves
rules.attack = Attack Mode rules.attack = Attack Mode
rules.buildai = AI Building rules.buildai = AI Building
rules.cleanupdeadteams = Clean Up Defeated Team Buildings (PvP)
rules.corecapture = Capture Core On Destruction rules.corecapture = Capture Core On Destruction
rules.polygoncoreprotection = Polygonal Core Protection rules.polygoncoreprotection = Polygonal Core Protection
rules.enemyCheat = Infinite AI (Red Team) Resources rules.enemyCheat = Infinite AI (Red Team) Resources
@@ -1289,7 +1294,6 @@ block.meltdown.name = Meltdown
block.foreshadow.name = Foreshadow block.foreshadow.name = Foreshadow
block.container.name = Container block.container.name = Container
block.launch-pad.name = Launch Pad block.launch-pad.name = Launch Pad
block.launch-pad-large.name = Large Launch Pad
block.segment.name = Segment block.segment.name = Segment
block.command-center.name = Command Center block.command-center.name = Command Center
block.ground-factory.name = Ground Factory block.ground-factory.name = Ground Factory
@@ -1310,11 +1314,11 @@ block.payload-source.name = Payload Source
block.disassembler.name = Disassembler block.disassembler.name = Disassembler
block.silicon-crucible.name = Silicon Crucible block.silicon-crucible.name = Silicon Crucible
block.overdrive-dome.name = Overdrive Dome block.overdrive-dome.name = Overdrive Dome
block.interplanetary-accelerator.name = Interplanetary Accelerator
#experimental, may be removed #experimental, may be removed
block.block-forge.name = Block Forge block.block-forge.name = Block Forge
block.block-loader.name = Block Loader block.block-loader.name = Block Loader
block.block-unloader.name = Block Unloader block.block-unloader.name = Block Unloader
block.interplanetary-accelerator.name = Interplanetary Accelerator
block.switch.name = Switch block.switch.name = Switch
block.micro-processor.name = Micro Processor block.micro-processor.name = Micro Processor
@@ -1349,6 +1353,7 @@ hint.placeTurret = Place \uf861 [accent]Turrets[] to defend your base from enemi
hint.breaking = [accent]Right-click[] and drag to break blocks. hint.breaking = [accent]Right-click[] and drag to break blocks.
hint.breaking.mobile = Activate the \ue817 [accent]hammer[] in the bottom right and tap to break blocks.\n\nHold down your finger for a second and drag to break in a selection. hint.breaking.mobile = Activate the \ue817 [accent]hammer[] in the bottom right and tap to break blocks.\n\nHold down your finger for a second and drag to break in a selection.
hint.blockInfo = View information of a block by selecting it in the [accent]build menu[], then selecting the [accent][[?][] button at the right. hint.blockInfo = View information of a block by selecting it in the [accent]build menu[], then selecting the [accent][[?][] button at the right.
hint.derelict = [accent]Derelict[] structures are broken remnants of old bases that no longer function.\n\nThese structures can be [accent]deconstructed[] for resources.
hint.research = Use the \ue875 [accent]Research[] button to research new technology. hint.research = Use the \ue875 [accent]Research[] button to research new technology.
hint.research.mobile = Use the \ue875 [accent]Research[] button in the \ue88c [accent]Menu[] to research new technology. hint.research.mobile = Use the \ue875 [accent]Research[] button in the \ue88c [accent]Menu[] to research new technology.
hint.unitControl = Hold [accent][[L-ctrl][] and [accent]click[] to control friendly units or turrets. hint.unitControl = Hold [accent][[L-ctrl][] and [accent]click[] to control friendly units or turrets.
@@ -1400,6 +1405,7 @@ liquid.slag.description = Refined in separators into constituent metals, or spra
liquid.oil.description = Used in advanced material production and as incendiary ammunition. liquid.oil.description = Used in advanced material production and as incendiary ammunition.
liquid.cryofluid.description = Used as coolant in reactors, turrets and factories. liquid.cryofluid.description = Used as coolant in reactors, turrets and factories.
block.derelict = [lightgray] Derelict
block.resupply-point.description = Resupplies nearby units with copper ammunition. Not compatible with units that require battery power. block.resupply-point.description = Resupplies nearby units with copper ammunition. Not compatible with units that require battery power.
block.armored-conveyor.description = Moves items forward. Does not accept inputs from the sides. block.armored-conveyor.description = Moves items forward. Does not accept inputs from the sides.
block.illuminator.description = Emits light. block.illuminator.description = Emits light.
@@ -1544,6 +1550,8 @@ block.memory-bank.description = Stores information for a logic processor. High c
block.logic-display.description = Displays arbitrary graphics from a logic processor. block.logic-display.description = Displays arbitrary graphics from a logic processor.
block.large-logic-display.description = Displays arbitrary graphics from a logic processor. block.large-logic-display.description = Displays arbitrary graphics from a logic processor.
block.interplanetary-accelerator.description = A massive electromagnetic railgun tower. Accelerates cores to escape velocity for interplanetary deployment. block.interplanetary-accelerator.description = A massive electromagnetic railgun tower. Accelerates cores to escape velocity for interplanetary deployment.
block.repair-turret.description = Continuously repairs the closest damaged unit in its vicinity. Optionally accepts coolant.
block.payload-propulsion-tower.description = Long-range payload transport structure. Shoots payloads to other linked payload propulsion towers.
unit.dagger.description = Fires standard bullets at all nearby enemies. unit.dagger.description = Fires standard bullets at all nearby enemies.
unit.mace.description = Fires streams of flame at all nearby enemies. unit.mace.description = Fires streams of flame at all nearby enemies.
@@ -1578,6 +1586,11 @@ unit.omura.description = Fires a long-range piercing railgun bolt at enemies. Co
unit.alpha.description = Defends the Shard core from enemies. Builds structures. unit.alpha.description = Defends the Shard core from enemies. Builds structures.
unit.beta.description = Defends the Foundation core from enemies. Builds structures. unit.beta.description = Defends the Foundation core from enemies. Builds structures.
unit.gamma.description = Defends the Nucleus core from enemies. Builds structures. unit.gamma.description = Defends the Nucleus core from enemies. Builds structures.
unit.retusa.description = Places proximity mines. Repairs allied units.
unit.oxynoe.description = Fires structure-repairing streams of flame at nearby enemies. Targets nearby enemy projectiles with a point defense turret.
unit.cyerce.description = Fires seeking cluster-missiles at enemies. Repairs allied units.
unit.aegires.description = Shocks all enemy units and structures that enter its energy field. Repairs all allies.
unit.navanax.description = Fires explosive EMP projectiles, dealing significant damage to enemy power networks and repairing allied structures. Melts nearby enemies with 4 autonomous laser turrets.
lst.read = Read a number from a linked memory cell. lst.read = Read a number from a linked memory cell.
lst.write = Write a number to a linked memory cell. lst.write = Write a number to a linked memory cell.

View File

@@ -307,7 +307,7 @@ waiting.players = Čekání na hráče...
wave.enemies = [lightgray]{0} zbývajících nepřátel wave.enemies = [lightgray]{0} zbývajících nepřátel
wave.enemycores = [accent]{0}[lightgray] nepřátelská jádra wave.enemycores = [accent]{0}[lightgray] nepřátelská jádra
wave.enemycore = [accent]{0}[lightgray] nepřátelské jádro wave.enemycore = [accent]{0}[lightgray] nepřátelské jádro
wave.enemy = [lightgray]{0} zbývající nepřátel wave.enemy = [lightgray]{0} zbývající nepřítel
wave.guardianwarn = Počet vln do příchodu strážce: [accent]{0}[]. wave.guardianwarn = Počet vln do příchodu strážce: [accent]{0}[].
wave.guardianwarn.one = [accent]Strážce přijde již příští vlnu![] wave.guardianwarn.one = [accent]Strážce přijde již příští vlnu![]
loadimage = Nahrát obrázek loadimage = Nahrát obrázek
@@ -323,16 +323,16 @@ map.nospawn.attack = Tato mapa nemá nepřátelská jádra, která by mohla být
map.invalid = Chyba v načítání mapy: poškozený nebo neplatný soubor mapy. map.invalid = Chyba v načítání mapy: poškozený nebo neplatný soubor mapy.
workshop.update = Aktualizovat položku workshop.update = Aktualizovat položku
workshop.error = Chyba při načítání podrobností z Workshopu na Steamu: {0} workshop.error = Chyba při načítání podrobností z Workshopu na Steamu: {0}
map.publish.confirm = Jsi si jistý, že chceš vystavit tuto mapu?\n\n[lightgray]Ujisti se nejprve, že souhlasíš se smluvními podmínkami Workshopu na Steamu (EULA), jinak se Tvoje mapa nezobrazí.[] map.publish.confirm = Jsi si jistý, že chceš publikovat tuto mapu?\n\n[lightgray]Ujisti se nejprve, že souhlasíš se smluvními podmínkami Workshopu na Steamu (EULA), jinak se Tvoje mapa nezobrazí.[]
workshop.menu = Vyber si, co bys chtěl dělat s touto položkou. workshop.menu = Vyber si, co bys chtěl dělat s touto položkou.
workshop.info = Informace o položce workshop.info = Informace o položce
changelog = Seznam změn (volitelně): changelog = Seznam změn (volitelně):
eula = Smluvní podmínky platformy Steam eula = Smluvní podmínky platformy Steam
missing = Tato položka byla smazána nebo přesunuta.\n[lightgray]Položka bude automaticky odebrána ze seznamu Workshopu na Steamu. missing = Tato položka byla smazána nebo přesunuta.\n[lightgray]Položka bude automaticky odebrána ze seznamu Workshopu na Steamu.
publishing = [accent]Publikuji... publishing = [accent]Publikuji...
publish.confirm = Opravdu chceš toto vystavit?\n\n[lightgray]Ujisti se nejprve, že souhlasíš se smluvními podmínkami Workshopu na Steamu (EULA), jinak se Tvoje položky nezobrazí.[] publish.confirm = Opravdu chceš toto publikovat?\n\n[lightgray]Ujisti se nejprve, že souhlasíš se smluvními podmínkami Workshopu na Steamu (EULA), jinak se Tvoje položky nezobrazí.[]
publish.error = Chyba při vystavování položky: {0} publish.error = Chyba při publikování položky: {0}
steam.error = Nepodařilo se inicializovat služby platformy Steam.Chyba: {0} steam.error = Nepodařilo se inicializovat služby platformy Steam. Chyba: {0}
editor.brush = Štětec editor.brush = Štětec
editor.openin = Otevřít v editoru editor.openin = Otevřít v editoru
@@ -341,12 +341,12 @@ editor.oregen.info = Generování rud:
editor.mapinfo = Informace o mapě editor.mapinfo = Informace o mapě
editor.author = Autor: editor.author = Autor:
editor.description = Popis: editor.description = Popis:
editor.nodescription = Než může být mapa publikována, musí mít popisek dlouhý nejméně 4 znaky. editor.nodescription = Než může být mapa publikována, musí mít popis dlouhý nejméně 4 znaky.
editor.waves = Vln: editor.waves = Vln:
editor.rules = Pravidla: editor.rules = Pravidla:
editor.generation = Generace: editor.generation = Generace:
editor.ingame = Upravit ve hře editor.ingame = Upravit ve hře
editor.publish.workshop = Vystavit ve Workshopu na Steamu editor.publish.workshop = Publikovat do Workshopu na Steamu
editor.newmap = Nová mapa editor.newmap = Nová mapa
editor.center = Vycentrovat editor.center = Vycentrovat
workshop = Workshop na Steamu workshop = Workshop na Steamu
@@ -684,6 +684,7 @@ stat.lightningchance = Pravděpodobnost blesku
stat.lightningdamage = Poškození bleskem stat.lightningdamage = Poškození bleskem
stat.flammability = Hořlavost stat.flammability = Hořlavost
stat.radioactivity = Radioaktivita stat.radioactivity = Radioaktivita
stat.charge = Nabití
stat.heatcapacity = Tepelná kapacita stat.heatcapacity = Tepelná kapacita
stat.viscosity = Vazkost stat.viscosity = Vazkost
stat.temperature = Teplota stat.temperature = Teplota

View File

@@ -101,6 +101,7 @@ customgame = Benutzerdefiniertes Spiel
newgame = Neues Spiel newgame = Neues Spiel
none = <nichts> none = <nichts>
none.found = [lightgray]<keine gefunden> none.found = [lightgray]<keine gefunden>
none.inmap = [lightgray]<keine auf der Karte>
minimap = Minimap minimap = Minimap
position = Position position = Position
close = Schließen close = Schließen
@@ -565,6 +566,7 @@ sectors.unexplored = [lightgray]Unentdeckt
sectors.resources = Ressourcen: sectors.resources = Ressourcen:
sectors.production = Produktion: sectors.production = Produktion:
sectors.export = Export: sectors.export = Export:
sectors.import = Import:
sectors.time = Zeit: sectors.time = Zeit:
sectors.threat = Gefahr: sectors.threat = Gefahr:
sectors.wave = Welle: sectors.wave = Welle:
@@ -724,7 +726,7 @@ stat.maxconsecutive = Max. Konsekutive
stat.buildcost = Baukosten stat.buildcost = Baukosten
stat.inaccuracy = Ungenauigkeit stat.inaccuracy = Ungenauigkeit
stat.shots = Schüsse stat.shots = Schüsse
stat.reload = Schüsse/Sekunde stat.reload = Schussrate
stat.ammo = Munition stat.ammo = Munition
stat.shieldhealth = Schildlebenspunkte stat.shieldhealth = Schildlebenspunkte
stat.cooldowntime = Cooldown-Zeit stat.cooldowntime = Cooldown-Zeit
@@ -793,7 +795,7 @@ 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.frag = [stat]explosiv bullet.frag = [stat]{0}[lightgray]x explosive Projektile:
bullet.lightning = [stat]{0}[lightgray]x Blitz ~ [stat]{1}[lightgray] Schaden 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
@@ -806,6 +808,7 @@ bullet.reload = [stat]{0}[lightgray]x Feuerrate
unit.blocks = Blöcke unit.blocks = Blöcke
unit.blockssquared = Blöcke² unit.blockssquared = Blöcke²
unit.powersecond = Stromeinheiten/Sekunde unit.powersecond = Stromeinheiten/Sekunde
unit.tilessecond = Blöcke/Sekunde
unit.liquidsecond = Flüssigkeitseinheiten/Sekunde unit.liquidsecond = Flüssigkeitseinheiten/Sekunde
unit.itemssecond = Materialeinheiten/Sekunde unit.itemssecond = Materialeinheiten/Sekunde
unit.liquidunits = Flüssigkeitseinheiten unit.liquidunits = Flüssigkeitseinheiten
@@ -844,7 +847,6 @@ setting.doubletapmine.name = Doppeltippen zum Abbauen
setting.modcrashdisable.name = Mods bei Absturz deaktivieren setting.modcrashdisable.name = Mods bei Absturz deaktivieren
setting.animatedwater.name = Animiertes Wasser setting.animatedwater.name = Animiertes Wasser
setting.animatedshields.name = Animierte Schilde setting.animatedshields.name = Animierte Schilde
setting.antialias.name = Antialias[lightgray] (Neustart erforderlich)[]
setting.playerindicators.name = Spieler-Indikatoren setting.playerindicators.name = Spieler-Indikatoren
setting.indicators.name = Verbündeten-Indikatoren setting.indicators.name = Verbündeten-Indikatoren
setting.autotarget.name = Auto-Zielauswahl setting.autotarget.name = Auto-Zielauswahl
@@ -853,7 +855,8 @@ setting.touchscreen.name = Touchscreen-Steuerung
setting.fpscap.name = Max. FPS setting.fpscap.name = Max. FPS
setting.fpscap.none = Kein(e) setting.fpscap.none = Kein(e)
setting.fpscap.text = {0} FPS setting.fpscap.text = {0} FPS
setting.uiscale.name = UI-Skalierung[lightgray] (Neustart erforderlich)[] setting.uiscale.name = UI-Skalierung
setting.uiscale.description = Neustart erforderlich.
setting.swapdiagonal.name = Immer diagonale Platzierung setting.swapdiagonal.name = Immer diagonale Platzierung
setting.difficulty.training = Training setting.difficulty.training = Training
setting.difficulty.easy = Leicht setting.difficulty.easy = Leicht
@@ -871,7 +874,8 @@ setting.saveinterval.name = Autosave-Häufigkeit
setting.seconds = {0} Sekunden setting.seconds = {0} Sekunden
setting.milliseconds = {0} Millisekunden setting.milliseconds = {0} Millisekunden
setting.fullscreen.name = Vollbild setting.fullscreen.name = Vollbild
setting.borderlesswindow.name = Randloses Fenster [lightgray](Neustart vielleicht erforderlich) setting.borderlesswindow.name = Randloses Fenster
setting.borderlesswindow.description = Neustart vielleicht erforderlich.
setting.fps.name = FPS anzeigen setting.fps.name = FPS anzeigen
setting.smoothcamera.name = Sanfte Kamerabewegungen setting.smoothcamera.name = Sanfte Kamerabewegungen
setting.vsync.name = VSync setting.vsync.name = VSync
@@ -994,6 +998,7 @@ rules.wavetimer = Wellen-Timer
rules.waves = Wellen rules.waves = Wellen
rules.attack = Angriff-Modus rules.attack = Angriff-Modus
rules.buildai = KI kann bauen rules.buildai = KI kann bauen
rules.cleanupdeadteams = Blöcke von erorberten Teams zerstören (PvP)
rules.corecapture = Kern nach Zerstörung einnehmen rules.corecapture = Kern nach Zerstörung einnehmen
rules.polygoncoreprotection = Polygonaler Kernschutz rules.polygoncoreprotection = Polygonaler Kernschutz
rules.enemyCheat = Unbegrenzte Ressourcen für die KI (Rotes Team) rules.enemyCheat = Unbegrenzte Ressourcen für die KI (Rotes Team)
@@ -1288,7 +1293,6 @@ block.meltdown.name = Meltdown
block.foreshadow.name = Foreshadow block.foreshadow.name = Foreshadow
block.container.name = Behälter block.container.name = Behälter
block.launch-pad.name = Launchpad block.launch-pad.name = Launchpad
block.launch-pad-large.name = Großes Launchpad
block.segment.name = Segment block.segment.name = Segment
block.command-center.name = Kommandozentrale block.command-center.name = Kommandozentrale
block.ground-factory.name = Bodenfabrik block.ground-factory.name = Bodenfabrik
@@ -1309,11 +1313,11 @@ block.payload-source.name = Frachtquelle
block.disassembler.name = Großer Trenner block.disassembler.name = Großer Trenner
block.silicon-crucible.name = Silizium Schmelztiegel block.silicon-crucible.name = Silizium Schmelztiegel
block.overdrive-dome.name = Beschleunigungs-Maschine block.overdrive-dome.name = Beschleunigungs-Maschine
block.interplanetary-accelerator.name = Interplanetarischer Beschleuniger
#experimental, may be removed #experimental, may be removed
block.block-forge.name = Block-Fabrik block.block-forge.name = Block-Fabrik
block.block-loader.name = Block-Lader block.block-loader.name = Block-Lader
block.block-unloader.name = Block-Entlader block.block-unloader.name = Block-Entlader
block.interplanetary-accelerator.name = Interplanetarischer Beschleuniger
block.switch.name = Schalter block.switch.name = Schalter
block.micro-processor.name = Mikroprozessor block.micro-processor.name = Mikroprozessor
@@ -1543,6 +1547,8 @@ block.memory-bank.description = Speichert Informationen für einen Prozessor. Ho
block.logic-display.description = Zeigt mithilfe eines Prozessors Beliebiges an. block.logic-display.description = Zeigt mithilfe eines Prozessors Beliebiges an.
block.large-logic-display.description = Zeigt mithilfe eines Prozessors Beliebiges an. block.large-logic-display.description = Zeigt mithilfe eines Prozessors Beliebiges an.
block.interplanetary-accelerator.description = Ein Riesen-Railgun-Turm, der mithilfe des Elektromagnetismus Kerne auf die nötige Geschwindigkeit bringt, um interplanetarisches Reisen zu ermöglichen. block.interplanetary-accelerator.description = Ein Riesen-Railgun-Turm, der mithilfe des Elektromagnetismus Kerne auf die nötige Geschwindigkeit bringt, um interplanetarisches Reisen zu ermöglichen.
block.repair-turret.description = Heilt durchgehend die nächste befreundete, beschädigte Einheit in der Umgebung. Verwendet optional Kühlung.
block.payload-propulsion-tower.description = Frachttransportationsturm mit hoher Reichweite. Schießt Fracht zu verbundenen Türmen.
unit.dagger.description = Schießt normale Kugeln auf alle Feinde in der Nähe. unit.dagger.description = Schießt normale Kugeln auf alle Feinde in der Nähe.
unit.mace.description = Schießt Feuer auf alle Gegner in der Nähe. unit.mace.description = Schießt Feuer auf alle Gegner in der Nähe.
@@ -1577,6 +1583,11 @@ unit.omura.description = Schießt eine Railgun mit hoher Reichweite, um Gegner z
unit.alpha.description = Beschützt den Scherbenkern vor Feinden. Baut Blöcke. unit.alpha.description = Beschützt den Scherbenkern vor Feinden. Baut Blöcke.
unit.beta.description = Beschützt den Fundamentkern vor Feinden. Baut Blöcke. unit.beta.description = Beschützt den Fundamentkern vor Feinden. Baut Blöcke.
unit.gamma.description = Beschützt den Nukleuskern vor Feinden. Baut Blöcke. unit.gamma.description = Beschützt den Nukleuskern vor Feinden. Baut Blöcke.
unit.retusa.description = Platziert Minen und heilt verbündete Einheiten.
unit.oxynoe.description = Schießt Block-heilendes Feuer auf Gegner und zerstört gegnerische Projektile.
unit.cyerce.description = Schießt zielsuchende Cluster-Raketen auf Gegner und heilt verbündete Einheiten.
unit.aegires.description = Schockt alle gegnerische Einheiten und Blöcke, die das Energiefeld betreten. Heilt alle verbündete.
unit.navanax.description = Schießt explosive EMP-Projektile, die gegnerische Stromnetze zerstören und eigene Blöcke heilen. Zerschmilzt Gegner mit 4 autonomen Laserstrahlen.
lst.read = Liest einen Wert aus einer verbundenen Spiecherzelle. lst.read = Liest einen Wert aus einer verbundenen Spiecherzelle.
lst.write = Schreibt eine Zahl in einer verbundene Speicherzelle. lst.write = Schreibt eine Zahl in einer verbundene Speicherzelle.

View File

@@ -101,6 +101,7 @@ customgame = Partie personnalisée
newgame = Nouvelle partie newgame = Nouvelle partie
none = <Vide> none = <Vide>
none.found = [lightgray]<Introuvable> none.found = [lightgray]<Introuvable>
none.inmap = [lightgray]<Introuvable dans la carte>
minimap = Mini-carte minimap = Mini-carte
position = Position position = Position
close = Fermer close = Fermer
@@ -214,6 +215,7 @@ hosts.none = [lightgray]Aucune partie en LAN trouvée !
host.invalid = [scarlet]Impossible de se connecter à l'hôte. host.invalid = [scarlet]Impossible de se connecter à l'hôte.
servers.local = Serveurs locaux servers.local = Serveurs locaux
servers.local.steam = Open Games & Serveurs Locaux
servers.remote = Serveurs distants servers.remote = Serveurs distants
servers.global = Serveurs communautaires servers.global = Serveurs communautaires
@@ -725,7 +727,7 @@ stat.maxconsecutive = Max Consécutif
stat.buildcost = Coût de construction stat.buildcost = Coût de construction
stat.inaccuracy = Précision stat.inaccuracy = Précision
stat.shots = Tirs stat.shots = Tirs
stat.reload = Tirs/Seconde stat.reload = Cadence de tir
stat.ammo = Munitions stat.ammo = Munitions
stat.shieldhealth = Santé du bouclier stat.shieldhealth = Santé du bouclier
stat.cooldowntime = Temps de refroidissement stat.cooldowntime = Temps de refroidissement
@@ -794,7 +796,8 @@ bullet.damage = [stat]{0}[lightgray] dégâts
bullet.splashdamage = [stat]{0}[lightgray] dégâts de zone ~[stat] {1}[lightgray] blocs bullet.splashdamage = [stat]{0}[lightgray] dégâts de zone ~[stat] {1}[lightgray] blocs
bullet.incendiary = [stat]incendiaire bullet.incendiary = [stat]incendiaire
bullet.homing = [stat]autoguidé bullet.homing = [stat]autoguidé
bullet.frag = [stat]fragmentation bullet.fragbullets = [stat]{0}[lightgray]x balles à fragmentation
bullet.frag.stats = [stat]Balle à fragmentation:
bullet.lightning = [stat]{0}[lightgray]x foudre ~ [stat]{1}[lightgray] dégâts bullet.lightning = [stat]{0}[lightgray]x foudre ~ [stat]{1}[lightgray] dégâts
bullet.buildingdamage = [stat]{0}%[lightgray] des dégâts aux bâtiments bullet.buildingdamage = [stat]{0}%[lightgray] des dégâts aux bâtiments
bullet.knockback = [stat]{0}[lightgray] recul bullet.knockback = [stat]{0}[lightgray] recul
@@ -841,14 +844,12 @@ setting.blockreplace.name = Suggestion automatique des Blocs
setting.linear.name = Filtrage linéaire setting.linear.name = Filtrage linéaire
setting.hints.name = Astuces setting.hints.name = Astuces
setting.logichints.name = Astuces pour les commandes des processeurs setting.logichints.name = Astuces pour les commandes des processeurs
setting.flow.name = Afficher le Débit des ressources
setting.backgroundpause.name = Pause en Arrière-plan setting.backgroundpause.name = Pause en Arrière-plan
setting.buildautopause.name = Confirmation avant construction setting.buildautopause.name = Confirmation avant construction
setting.doubletapmine.name = Double-clic pour Miner setting.doubletapmine.name = Double-clic pour Miner
setting.modcrashdisable.name = Désactiver les mods lors d'un crash au démarrage setting.modcrashdisable.name = Désactiver les mods lors d'un crash au démarrage
setting.animatedwater.name = Surfaces Animées setting.animatedwater.name = Surfaces Animées
setting.animatedshields.name = Boucliers Animés setting.animatedshields.name = Boucliers Animés
setting.antialias.name = Anticrénelage[lightgray] (redémarrage du jeu nécessaire)[]
setting.playerindicators.name = Indicateurs alliés setting.playerindicators.name = Indicateurs alliés
setting.indicators.name = Indicateurs ennemis setting.indicators.name = Indicateurs ennemis
setting.autotarget.name = Visée automatique setting.autotarget.name = Visée automatique
@@ -857,7 +858,8 @@ setting.touchscreen.name = Commandes d'écran tactile
setting.fpscap.name = Max FPS setting.fpscap.name = Max FPS
setting.fpscap.none = Illimité setting.fpscap.none = Illimité
setting.fpscap.text = {0} FPS setting.fpscap.text = {0} FPS
setting.uiscale.name = Échelle de l'interface[lightgray] (redémarrage du jeu nécessaire)[] setting.uiscale.name = Échelle de l'interface
setting.uiscale.description = Redémarrage du jeu nécessaire pour appliquer les changements.
setting.swapdiagonal.name = Autoriser le placement en diagonale setting.swapdiagonal.name = Autoriser le placement en diagonale
setting.difficulty.training = Entraînement setting.difficulty.training = Entraînement
setting.difficulty.easy = Facile setting.difficulty.easy = Facile
@@ -875,7 +877,8 @@ setting.saveinterval.name = Intervalle des Sauvegardes automatiques
setting.seconds = {0} secondes setting.seconds = {0} secondes
setting.milliseconds = {0} millisecondes setting.milliseconds = {0} millisecondes
setting.fullscreen.name = Plein Écran setting.fullscreen.name = Plein Écran
setting.borderlesswindow.name = Fenêtre sans bords[lightgray] (peut nécessiter le redémarrage du jeu) setting.borderlesswindow.name = Fenêtré sans bordures
setting.borderlesswindow.description = Un redémarrage peut être nécessaire pour appliquer les changements.
setting.fps.name = Afficher FPS et Ping setting.fps.name = Afficher FPS et Ping
setting.smoothcamera.name = Lissage de la Caméra setting.smoothcamera.name = Lissage de la Caméra
setting.vsync.name = Synchronisation Verticale setting.vsync.name = Synchronisation Verticale
@@ -1005,6 +1008,7 @@ rules.wavetimer = Compte à rebours des vagues
rules.waves = Vagues rules.waves = Vagues
rules.attack = Mode « Attaque » rules.attack = Mode « Attaque »
rules.buildai = Constructions de l'IA rules.buildai = Constructions de l'IA
rules.cleanupdeadteams = Détruire les structures des équipes vaincues (JcJ)
rules.corecapture = Capture du Noyau lors de sa Destruction rules.corecapture = Capture du Noyau lors de sa Destruction
rules.polygoncoreprotection = Protection du noyau polygonal rules.polygoncoreprotection = Protection du noyau polygonal
rules.enemyCheat = Ressources infinies pour l'IA (équipe rouge) rules.enemyCheat = Ressources infinies pour l'IA (équipe rouge)
@@ -1299,7 +1303,6 @@ block.meltdown.name = Fusion
block.foreshadow.name = Présage block.foreshadow.name = Présage
block.container.name = Conteneur block.container.name = Conteneur
block.launch-pad.name = Rampe de lancement block.launch-pad.name = Rampe de lancement
block.launch-pad-large.name = Grande rampe de lancement
block.segment.name = Diviseur block.segment.name = Diviseur
block.command-center.name = Centre de Commande block.command-center.name = Centre de Commande
block.ground-factory.name = Usine d'Unités Terrestres block.ground-factory.name = Usine d'Unités Terrestres
@@ -1320,11 +1323,11 @@ block.payload-source.name = Source de Charge utile
block.disassembler.name = Désassembleur block.disassembler.name = Désassembleur
block.silicon-crucible.name = Grande Fonderie de Silicium block.silicon-crucible.name = Grande Fonderie de Silicium
block.overdrive-dome.name = Dôme Accélérant block.overdrive-dome.name = Dôme Accélérant
block.interplanetary-accelerator.name = Accélérateur Interplanétaire
#experimental, may be removed #experimental, may be removed
block.block-forge.name = Forgeur de Blocs block.block-forge.name = Forgeur de Blocs
block.block-loader.name = Chargeur de Blocs block.block-loader.name = Chargeur de Blocs
block.block-unloader.name = Déchargeur de Blocs block.block-unloader.name = Déchargeur de Blocs
block.interplanetary-accelerator.name = Accélérateur Interplanétaire
block.switch.name = Interrupteur block.switch.name = Interrupteur
block.micro-processor.name = Micro Processeur block.micro-processor.name = Micro Processeur
@@ -1338,7 +1341,7 @@ block.memory-bank.name = Banque de mémoire
team.blue.name = bleu team.blue.name = bleu
team.crux.name = crux team.crux.name = crux
team.sharded.name = sharded team.sharded.name = sharded
team.derelict.name = derelict team.derelict.name = Vestige
team.green.name = vert team.green.name = vert
team.purple.name = mauve team.purple.name = mauve
@@ -1357,8 +1360,9 @@ hint.placeConveyor = Les Convoyeurs transportent les ressources des foreuses ver
hint.placeConveyor.mobile = Les Convoyeurs transportent les ressources des foreuses vers d'autres blocs. Sélectionnez un \uf896 [accent]Convoyeur[] dans l'onglet \ue814 [accent]Distribution[].\n\nMaintenez votre doigt et déplacez-le pour placer plusieurs convoyeurs. hint.placeConveyor.mobile = Les Convoyeurs transportent les ressources des foreuses vers d'autres blocs. Sélectionnez un \uf896 [accent]Convoyeur[] dans l'onglet \ue814 [accent]Distribution[].\n\nMaintenez votre doigt et déplacez-le pour placer plusieurs convoyeurs.
hint.placeTurret = Placez des \uf861 [accent]Tourelles[] pour défendre votre base contre les ennemis.\n\nLes Tourelles nécessitent des munitions (dans ce cas, du \uf838Cuivre).\nUtilisez les convoyeurs et les foreuses pour les ravitailler. hint.placeTurret = Placez des \uf861 [accent]Tourelles[] pour défendre votre base contre les ennemis.\n\nLes Tourelles nécessitent des munitions (dans ce cas, du \uf838Cuivre).\nUtilisez les convoyeurs et les foreuses pour les ravitailler.
hint.breaking = Maintenez [accent]Clic-droit[] pour détruire des blocs. hint.breaking = Maintenez [accent]Clic-droit[] pour détruire des blocs.
hint.breaking.mobile = Activez le \ue817 [accent]marteau[] en bas à droite Touchez pour détruire des blocs.\n\nRetenez votre doigt pendant une seconde et déplacez-le pour détruire les blocs dans la zone de sélection. hint.breaking.mobile = Activez le \ue817 [accent]marteau[] en bas à droite, Touchez pour détruire des blocs.\n\nRetenez votre doigt pendant une seconde et déplacez-le pour détruire les blocs dans la zone de sélection.
hint.blockInfo = Pour afficher les informations relatives à un bloc, il suffit de le sélectionner dans le [accent]menu de construction[], puis de cliquer sur le bouton [accent][[?][] à droite. hint.blockInfo = Pour afficher les informations relatives à un bloc, il suffit de le sélectionner dans le [accent]menu de construction[], puis de cliquer sur le bouton [accent][[?][] à droite.
hint.derelict = [accent]Les structures abandonnées[] sont des vestiges brisés d'anciennes bases qui ne fonctionnent plus. Ces structures peuvent être [accent]déconstruites pour obtenir des ressources.
hint.research = Utilisez le bouton \ue875 [accent]Recherche[] pour rechercher de nouvelles technologies. hint.research = Utilisez le bouton \ue875 [accent]Recherche[] pour rechercher de nouvelles technologies.
hint.research.mobile = Utilisez le bouton \ue875 [accent]Recherche[] dans le \ue88c [accent]Menu[] pour rechercher de nouvelles technologies. hint.research.mobile = Utilisez le bouton \ue875 [accent]Recherche[] dans le \ue88c [accent]Menu[] pour rechercher de nouvelles technologies.
hint.unitControl = Retenez [accent][[Ctrl-gauche][] et [accent]cliquez[] pour contrôler une tourelle ou une unité alliée. hint.unitControl = Retenez [accent][[Ctrl-gauche][] et [accent]cliquez[] pour contrôler une tourelle ou une unité alliée.
@@ -1410,6 +1414,7 @@ liquid.slag.description = Différents types de métaux en fusion mélangés. Peu
liquid.oil.description = Un liquide utilisé dans la production de matériaux avancés. Peut être transformé en charbon ou pulvérisé sur les ennemis, puis enflammé. liquid.oil.description = Un liquide utilisé dans la production de matériaux avancés. Peut être transformé en charbon ou pulvérisé sur les ennemis, puis enflammé.
liquid.cryofluid.description = Un liquide inerte, non corrosif, créé à partir deau et de titane. Possède une capacité d'absorption de chaleur extrêmement élevée. Largement utilisé comme liquide de refroidissement. liquid.cryofluid.description = Un liquide inerte, non corrosif, créé à partir deau et de titane. Possède une capacité d'absorption de chaleur extrêmement élevée. Largement utilisé comme liquide de refroidissement.
block.derelict = [lightgray] Vestiges
block.resupply-point.description = Approvisionne les unités proches en munitions. Pas compatible avec celles qui ont besoin d'énergie pour tirer. block.resupply-point.description = Approvisionne les unités proches en munitions. Pas compatible avec celles qui ont besoin d'énergie pour tirer.
block.illuminator.description = Une petite source lumineuse compacte et configurable. Nécessite de l'énergie pour fonctionner. block.illuminator.description = Une petite source lumineuse compacte et configurable. Nécessite de l'énergie pour fonctionner.
block.armored-conveyor.description = Déplace les objets à la même vitesse que les convoyeurs en titane, mais est plus résistant. Seulement d'autres convoyeurs peuvent faire entrer des ressources par ses côtés. block.armored-conveyor.description = Déplace les objets à la même vitesse que les convoyeurs en titane, mais est plus résistant. Seulement d'autres convoyeurs peuvent faire entrer des ressources par ses côtés.
@@ -1518,7 +1523,7 @@ block.scatter.description = Une tourelle anti-aérienne essentielle. Mitraille l
block.scorch.description = Brûle les ennemis terrestres près de lui. Très efficace à courte portée. block.scorch.description = Brûle les ennemis terrestres près de lui. Très efficace à courte portée.
block.hail.description = Une petite tourelle d'artillerie visant les ennemis terrestres. Efficace à longue portée. block.hail.description = Une petite tourelle d'artillerie visant les ennemis terrestres. Efficace à longue portée.
block.wave.description = Une tourelle de taille moyenne tirant un jet de liquide. Peut éteindre les incendies automatiquement si elle est alimentée en eau. block.wave.description = Une tourelle de taille moyenne tirant un jet de liquide. Peut éteindre les incendies automatiquement si elle est alimentée en eau.
block.lancer.description = Une tourelle de taille moyenne chargeant et tirant de puissants lasers aux ennemis terrestres. block.lancer.description = Une tourelle de taille moyenne chargeant et tirant de puissants lasers sur les ennemis terrestres.
block.arc.description = Une petite tourelle tirant des arcs électriques sur les ennemis. block.arc.description = Une petite tourelle tirant des arcs électriques sur les ennemis.
block.swarmer.description = Une tourelle de taille moyenne attaquant les ennemis terrestres et aériens à l'aide de missiles autoguidés. Consomme beaucoup de munitions. block.swarmer.description = Une tourelle de taille moyenne attaquant les ennemis terrestres et aériens à l'aide de missiles autoguidés. Consomme beaucoup de munitions.
block.salvo.description = Une version plus grande et améliorée de la tourelle Duo. Tire par salves. block.salvo.description = Une version plus grande et améliorée de la tourelle Duo. Tire par salves.
@@ -1531,7 +1536,7 @@ block.foreshadow.description = Une tourelle massive tirant une puissante balle s
block.repair-point.description = Soigne l'unité endommagée la plus proche. block.repair-point.description = Soigne l'unité endommagée la plus proche.
block.segment.description = Endommage et détruit les tirs ennemis. Les lasers ne peuvent pas être ciblés. block.segment.description = Endommage et détruit les tirs ennemis. Les lasers ne peuvent pas être ciblés.
block.parallax.description = Tire un rayon tracteur qui attire les ennemis volants, infligeant aussi des dégâts. block.parallax.description = Tire un rayon tracteur qui attire les ennemis volants, infligeant aussi des dégâts.
block.tsunami.description = Tire un puissant jet de liquide aux ennemis. Peut éteindre les incendies automatiquement si elle est alimentée en eau. block.tsunami.description = Tire un puissant jet de liquide sur les ennemis. Peut éteindre les incendies automatiquement si elle est alimentée en eau.
block.silicon-crucible.description = Raffine du silicium avec du sable et du charbon en utilisant de la pyratite comme source de chaleur additionnelle. Cette usine est plus efficace dans les endroits chauds. block.silicon-crucible.description = Raffine du silicium avec du sable et du charbon en utilisant de la pyratite comme source de chaleur additionnelle. Cette usine est plus efficace dans les endroits chauds.
block.disassembler.description = Cette version avancée du séparateur peut produire du thorium. block.disassembler.description = Cette version avancée du séparateur peut produire du thorium.
block.overdrive-dome.description = Accélère le fonctionnement des bâtiments autour de lui. Requiert du silicium et du tissu phasé pour fonctionner. block.overdrive-dome.description = Accélère le fonctionnement des bâtiments autour de lui. Requiert du silicium et du tissu phasé pour fonctionner.
@@ -1554,6 +1559,8 @@ block.memory-bank.description = Stocke des informations pour un processeur logiq
block.logic-display.description = Affiche des images à partir des instructions d'un processeur logique. block.logic-display.description = Affiche des images à partir des instructions d'un processeur logique.
block.large-logic-display.description = Affiche des images à partir des instructions d'un processeur logique. Possède une plus grande résolution qu'un écran. block.large-logic-display.description = Affiche des images à partir des instructions d'un processeur logique. Possède une plus grande résolution qu'un écran.
block.interplanetary-accelerator.description = Un énorme canon électromagnétique à rails. Accélère les Noyaux pour qu'ils échappent à la gravité de leur planète et leur permettent un déploiement interplanétaire. block.interplanetary-accelerator.description = Un énorme canon électromagnétique à rails. Accélère les Noyaux pour qu'ils échappent à la gravité de leur planète et leur permettent un déploiement interplanétaire.
block.repair-turret.description = Répare en continu l'unité endommagée la plus proche dans son périmètre. Accepte le liquide de refroidissement en option.
block.payload-propulsion-tower.description = Structure de transport de charges utiles à longue portée. Projette des charges utiles vers d'autres tours de propulsion de charges utiles reliées.
unit.dagger.description = Tire des balles normales aux ennemis proches. unit.dagger.description = Tire des balles normales aux ennemis proches.
unit.mace.description = Tire des jets de flammes aux ennemis proches. unit.mace.description = Tire des jets de flammes aux ennemis proches.
@@ -1588,6 +1595,11 @@ unit.omura.description = Tire avec un canon à rails à longue portée, une puis
unit.alpha.description = Défend le Noyau fragment contre les ennemis. Peut construire des structures. unit.alpha.description = Défend le Noyau fragment contre les ennemis. Peut construire des structures.
unit.beta.description = Défend le Noyau fondation contre les ennemis. Peut construire des structures. unit.beta.description = Défend le Noyau fondation contre les ennemis. Peut construire des structures.
unit.gamma.description = Défend le Noyau épicentre contre les ennemis. Peut construire des structures. unit.gamma.description = Défend le Noyau épicentre contre les ennemis. Peut construire des structures.
unit.retusa.description = Pose des mines de proximité. Répare les unités alliées.
unit.oxynoe.description = Tire des jets de flammes qui réparent les structures et endommage les ennemis proches. Cible les projectiles ennemis proches avec une tourelle de défense ponctuelle.
unit.cyerce.description = Tire des missiles à fragmentation sur les ennemis. Répare les unités alliées.
unit.aegires.description = Secoue toutes les unités et structures ennemies qui entrent dans son champ d'énergie. Répare tous les alliés.
unit.navanax.description = Tire des projectiles explosifs EMP, infligeant des dommages importants aux réseaux électriques ennemis et réparant les structures alliées. Fait fondre les ennemis proches avec 4 tourelles laser autonomes.
lst.read = Lit un nombre depuis un bloc de mémoire relié au processeur. lst.read = Lit un nombre depuis un bloc de mémoire relié au processeur.
lst.write = Écrit un nombre dans un bloc de mémoire relié au processeur. lst.write = Écrit un nombre dans un bloc de mémoire relié au processeur.

View File

@@ -100,7 +100,8 @@ joingame = 게임 참여
customgame = 사용자 지정 게임 customgame = 사용자 지정 게임
newgame = 새 게임 newgame = 새 게임
none = < 없음 > none = < 없음 >
none.found = [lightgray]< 없거나 찾을 수 없음 > none.found = [lightgray]< 찾을 수 없음 >
none.inmap = [lightgray]< 맵에 없음 >
minimap = 미니맵 minimap = 미니맵
position = 위치 position = 위치
close = 닫기 close = 닫기
@@ -121,7 +122,6 @@ committingchanges = 바뀐 점 적용
done = 완료 done = 완료
feature.unsupported = 기기가 이 기능을 지원하지 않습니다. feature.unsupported = 기기가 이 기능을 지원하지 않습니다.
mods.initfailed = [red]⚠[]이전 Mindustry 인스턴스를 초기화하지 못했습니다. 잘못된 모드로 인해 발생한 것일 수 있습니다.\n\n 게임 충돌 무한반복을 막기 위해, [red]모든 모드가 비활성화되었습니다.[]\n\n이 시스템을 비활성화할려면, [accent]설정->게임->로딩 중 충돌 시 모드 비활성화[]설정을 끄세요.
mods = 모드 mods = 모드
mods.none = [lightgray]모드를 찾을 수 없습니다! mods.none = [lightgray]모드를 찾을 수 없습니다!
mods.guide = 모드 제작 가이드 mods.guide = 모드 제작 가이드
@@ -565,6 +565,7 @@ sectors.unexplored = [lightgray]미개척지
sectors.resources = 자원: sectors.resources = 자원:
sectors.production = 생산량: sectors.production = 생산량:
sectors.export = 수출량: sectors.export = 수출량:
sectors.import = 수입량:
sectors.time = 진행 시간: sectors.time = 진행 시간:
sectors.threat = 위험도: sectors.threat = 위험도:
sectors.wave = 단계: sectors.wave = 단계:
@@ -724,7 +725,7 @@ stat.maxconsecutive = 최대 체인
stat.buildcost = 건설 비용 stat.buildcost = 건설 비용
stat.inaccuracy = 오차각 stat.inaccuracy = 오차각
stat.shots = 발사 수 stat.shots = 발사 수
stat.reload = 초당 발사 stat.reload = 발사 주기
stat.ammo = 탄약 stat.ammo = 탄약
stat.shieldhealth = 보호막 내구도 stat.shieldhealth = 보호막 내구도
stat.cooldowntime = 쿨타임 stat.cooldowntime = 쿨타임
@@ -793,7 +794,7 @@ 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.homing = [stat]유도 bullet.homing = [stat]유도
bullet.frag = [stat]파편 bullet.frags = [stat]{0}[lightgray]개 파편 탄환:
bullet.lightning = [stat]{0}[lightgray]x 전격 ~ [stat]{1}[lightgray] 피해량 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] 넉백
@@ -845,7 +846,6 @@ setting.doubletapmine.name = 연속 터치로 채광
setting.modcrashdisable.name = 로딩 중 충돌 시 모드 비활성화 setting.modcrashdisable.name = 로딩 중 충돌 시 모드 비활성화
setting.animatedwater.name = 액체 애니메이션 효과 setting.animatedwater.name = 액체 애니메이션 효과
setting.animatedshields.name = 보호막 애니메이션 효과 setting.animatedshields.name = 보호막 애니메이션 효과
setting.antialias.name = 위신호 제거 필터[lightgray] (재시작 필요)[]
setting.playerindicators.name = 플레이어 위치 표시기 setting.playerindicators.name = 플레이어 위치 표시기
setting.indicators.name = 적 위치 표시기 setting.indicators.name = 적 위치 표시기
setting.autotarget.name = 자동 조준 setting.autotarget.name = 자동 조준
@@ -854,7 +854,8 @@ setting.touchscreen.name = 터치스크린 조작
setting.fpscap.name = 최대 FPS setting.fpscap.name = 최대 FPS
setting.fpscap.none = 없음 setting.fpscap.none = 없음
setting.fpscap.text = {0} FPS setting.fpscap.text = {0} FPS
setting.uiscale.name = UI 스케일링[lightgray] (재시작 필요)[] setting.uiscale.name = UI 스케일링
setting.uiscale.description = 적용하려면 재시작이 필요합니다.
setting.swapdiagonal.name = 항상 대각선 배치 setting.swapdiagonal.name = 항상 대각선 배치
setting.difficulty.training = 훈련 setting.difficulty.training = 훈련
setting.difficulty.easy = 무난 setting.difficulty.easy = 무난
@@ -872,7 +873,8 @@ setting.saveinterval.name = 저장 간격
setting.seconds = {0} 초 setting.seconds = {0} 초
setting.milliseconds = {0} 밀리초 setting.milliseconds = {0} 밀리초
setting.fullscreen.name = 전체 화면 setting.fullscreen.name = 전체 화면
setting.borderlesswindow.name = 테두리 없는 창 모드[lightgray] (재시작이 필요할 수 있습니다) setting.borderlesswindow.name = 테두리 없는 창 모드
setting.borderlesswindow.description = 적용하려면 재시작이 필요할 수도 있습니다.
setting.fps.name = FPS와 핑 표시 setting.fps.name = FPS와 핑 표시
setting.smoothcamera.name = 부드러운 시점 setting.smoothcamera.name = 부드러운 시점
setting.vsync.name = 수직 동기화 setting.vsync.name = 수직 동기화
@@ -995,6 +997,7 @@ rules.wavetimer = 시간 제한이 있는 단계
rules.waves = 단계 rules.waves = 단계
rules.attack = 공격 모드 rules.attack = 공격 모드
rules.buildai = AI 건설 rules.buildai = AI 건설
rules.cleanupdeadteams = 패배한 팀 건물 정리하기 (PvP)
rules.corecapture = 코어 파괴 시 점령 rules.corecapture = 코어 파괴 시 점령
rules.polygoncoreprotection = 다각형 코어 건설 금지구역 rules.polygoncoreprotection = 다각형 코어 건설 금지구역
rules.enemyCheat = 적Ai 무한자원 rules.enemyCheat = 적Ai 무한자원
@@ -1046,7 +1049,7 @@ item.silicon.name = 실리콘
item.plastanium.name = 플라스터늄 item.plastanium.name = 플라스터늄
item.phase-fabric.name = 메타 item.phase-fabric.name = 메타
item.surge-alloy.name = 설금 item.surge-alloy.name = 설금
item.spore-pod.name = 포자 item.spore-pod.name = 포자 꼬투리
item.sand.name = 모래 item.sand.name = 모래
item.blast-compound.name = 폭발물 item.blast-compound.name = 폭발물
item.pyratite.name = 파이라타이트 item.pyratite.name = 파이라타이트
@@ -1289,7 +1292,6 @@ block.meltdown.name = 멜트다운
block.foreshadow.name = 포어쉐도우 block.foreshadow.name = 포어쉐도우
block.container.name = 컨테이너 block.container.name = 컨테이너
block.launch-pad.name = 지역 자원 수송기 block.launch-pad.name = 지역 자원 수송기
block.launch-pad-large.name = 대형 지역 자원 수송기
block.segment.name = 세그먼트 block.segment.name = 세그먼트
block.command-center.name = 유닛 지휘소 block.command-center.name = 유닛 지휘소
block.ground-factory.name = 지상 공장 block.ground-factory.name = 지상 공장
@@ -1310,11 +1312,11 @@ block.payload-source.name = 화물 공급기
block.disassembler.name = 광재 분해기 block.disassembler.name = 광재 분해기
block.silicon-crucible.name = 실리콘 도가니 block.silicon-crucible.name = 실리콘 도가니
block.overdrive-dome.name = 대형 과부하 프로젝터 block.overdrive-dome.name = 대형 과부하 프로젝터
block.interplanetary-accelerator.name = 성간 코어 가속기
#experimental, may be removed / 이 아래의 블록들은 테스트용 임시 블록들이였습니다. #experimental, may be removed / 이 아래의 블록들은 테스트용 임시 블록들이였습니다.
block.block-forge.name = 블록 제작대 block.block-forge.name = 블록 제작대
block.block-loader.name = 블록 로더 block.block-loader.name = 블록 로더
block.block-unloader.name = 블록 언로더 block.block-unloader.name = 블록 언로더
block.interplanetary-accelerator.name = 성간 코어 가속기
block.switch.name = 스위치 block.switch.name = 스위치
block.micro-processor.name = 마이크로 프로세서 block.micro-processor.name = 마이크로 프로세서
@@ -1349,6 +1351,7 @@ hint.placeTurret = 적에게서 기지를 막아내려면 \uf861 [accent]포탑[
hint.breaking = 블록을 부수려면 [accent]우클릭[]이나 드래그를 하십시오. hint.breaking = 블록을 부수려면 [accent]우클릭[]이나 드래그를 하십시오.
hint.breaking.mobile = 블록을 부수려면 오른쪽 아래의 \ue817 [accent]망치[]를 눌러 해체 모드를 활성화하십시오.\n\n손가락으로 누른 채로 끌어서 해체 범위를 지정하십시오. hint.breaking.mobile = 블록을 부수려면 오른쪽 아래의 \ue817 [accent]망치[]를 눌러 해체 모드를 활성화하십시오.\n\n손가락으로 누른 채로 끌어서 해체 범위를 지정하십시오.
hint.blockInfo = [accent]건설 메뉴[]에서 블록을 선택해서 정보를 보십시오, 그다음 오른쪽의 [accent][[?][] 버튼을 선택하십시오. hint.blockInfo = [accent]건설 메뉴[]에서 블록을 선택해서 정보를 보십시오, 그다음 오른쪽의 [accent][[?][] 버튼을 선택하십시오.
hint.derelict = [accent]버려진[] 구조물들은 더 이상 작동하지 않는 오래된 기지의 부서진 잔해입니다.\n\n이 구조물들은 자원으로 다시 [accent]철거[]될 수 있습니다.
hint.research = 새 기술을 연구하려면 \ue875 [accent]연구[]버튼을 누르십시오. hint.research = 새 기술을 연구하려면 \ue875 [accent]연구[]버튼을 누르십시오.
hint.research.mobile = 새 기술을 연구하려면 \ue88c [accent]메뉴[] 아래의 \ue875 [accent]연구[]버튼을 누르십시오. hint.research.mobile = 새 기술을 연구하려면 \ue88c [accent]메뉴[] 아래의 \ue875 [accent]연구[]버튼을 누르십시오.
hint.unitControl = 아군 유닛과 포탑을 조종하려면 [accent][[왼쪽 ctrl][]을 누른 채로 [accent]클릭[] 하십시오. hint.unitControl = 아군 유닛과 포탑을 조종하려면 [accent][[왼쪽 ctrl][]을 누른 채로 [accent]클릭[] 하십시오.
@@ -1400,6 +1403,7 @@ liquid.slag.description = 다양한 종류의 금속들이 함께 섞여 녹아
liquid.oil.description = 고급 재료 생산에 사용되는 액체. 석탄으로 전환하거나 무기로 뿌려서 불을 지를 수 있습니다. liquid.oil.description = 고급 재료 생산에 사용되는 액체. 석탄으로 전환하거나 무기로 뿌려서 불을 지를 수 있습니다.
liquid.cryofluid.description = 물과 티타늄으로 만든 비부식성 액체. 열용량이 매우 높으며 냉각수로 광범위하게 사용됩니다. liquid.cryofluid.description = 물과 티타늄으로 만든 비부식성 액체. 열용량이 매우 높으며 냉각수로 광범위하게 사용됩니다.
block.derelict = [lightgray] 버려짐[]
block.resupply-point.description = 주변 유닛들에 구리 탄약을 보급합니다. 배터리 전력이 필요한 유닛들은 호환되지 않습니다. block.resupply-point.description = 주변 유닛들에 구리 탄약을 보급합니다. 배터리 전력이 필요한 유닛들은 호환되지 않습니다.
block.armored-conveyor.description = 앞으로 자원들을 운반합니다. 측면에서 자원들을 받아들이지 않습니다. block.armored-conveyor.description = 앞으로 자원들을 운반합니다. 측면에서 자원들을 받아들이지 않습니다.
block.illuminator.description = 발광합니다. block.illuminator.description = 발광합니다.
@@ -1544,6 +1548,8 @@ block.memory-bank.description = 프로세서를 위한 데이터를 저장합니
block.logic-display.description = 프로세서를 이용해 그래픽을 출력할 수 있습니다. block.logic-display.description = 프로세서를 이용해 그래픽을 출력할 수 있습니다.
block.large-logic-display.description = 프로세서를 이용해 그래픽을 출력할 수 있습니다. block.large-logic-display.description = 프로세서를 이용해 그래픽을 출력할 수 있습니다.
block.interplanetary-accelerator.description = 거대한 전자기 레일건 타워. 코어를 행성 간 이동을 위한 탈출 속도까지 가속합니다. block.interplanetary-accelerator.description = 거대한 전자기 레일건 타워. 코어를 행성 간 이동을 위한 탈출 속도까지 가속합니다.
block.repair-turret.description = 가장 가까운 유닛을 지속적으로 수리합니다. 냉각수를 넣을 수 있습니다.
block.payload-propulsion-tower.description = 장거리 화물 운반 구조물. 화물을 연결된 다른 화물 추진탑으로 발사합니다.
unit.dagger.description = 주변 모든 적에게 일반적인 탄환을 발사합니다. unit.dagger.description = 주변 모든 적에게 일반적인 탄환을 발사합니다.
unit.mace.description = 주변 모든 적에게 화염 줄기를 발사합니다. unit.mace.description = 주변 모든 적에게 화염 줄기를 발사합니다.
@@ -1578,6 +1584,11 @@ unit.omura.description = 적에게 장거리 관통 레일건을 발사합니다
unit.alpha.description = 적으로부터 코어: 조각을 방어합니다. 구조물을 짓습니다. unit.alpha.description = 적으로부터 코어: 조각을 방어합니다. 구조물을 짓습니다.
unit.beta.description = 적으로부터 코어: 기반을 방어합니다. 구조물을 짓습니다. unit.beta.description = 적으로부터 코어: 기반을 방어합니다. 구조물을 짓습니다.
unit.gamma.description = 적으로부터 코어: 핵심을 방어합니다. 구조물을 짓습니다. unit.gamma.description = 적으로부터 코어: 핵심을 방어합니다. 구조물을 짓습니다.
unit.retusa.description = 근접 시한지뢰를 설치합니다. 아군 유닛을 수리할 수 있습니다.
unit.oxynoe.description = 주변 적에게 블록을 수리하는 화염을 발사합니다. 주변 적 탄환을 요격 포탑으로 요격할 수 있습니다.
unit.cyerce.description = 주변 적에게 유도 집속 미사일을 발사합니다. 아군 유닛을 수리할 수 있습니다.
unit.aegires.description = 애너지 필드 안의 모든 적 유닛과 블록을 감전시킵니다. 아군에겐 전격으로 수리합니다.
unit.navanax.description = 적 전력망에 상당한 피해를 주고 아군 블록을 수리하는 거대한 EMP 고폭탄을 발사합니다. 4개의 자율 레이저 포탑으로 주변 적을 녹입니다.
lst.read = 연결된 메모리 셀에서 숫자 읽기 lst.read = 연결된 메모리 셀에서 숫자 읽기
lst.write = 연결된 메모리 셀에 숫자 쓰기 lst.write = 연결된 메모리 셀에 숫자 쓰기
@@ -1630,7 +1641,7 @@ lenum.always = 항상 참
lenum.idiv = 정수 나누기 lenum.idiv = 정수 나누기
lenum.div = 나누기\n0으로 나누면 [accent]null[]을 반환합니다. lenum.div = 나누기\n0으로 나누면 [accent]null[]을 반환합니다.
lenum.mod = 나머지 lenum.mod = 나머지
lenum.equal = 동치 비교. 형변환 가능\nNull이 아닌 객체가 숫자와 비교려면 1이 되고, Null이면 0이 됩니다. lenum.equal = 동치 비교. 형변환 가능\nNull이 아닌 객체가 숫자와 비교려면 1이 되고, Null이면 0이 됩니다.
lenum.notequal = 동치 부정. 형변환 가능 lenum.notequal = 동치 부정. 형변환 가능
lenum.strictequal = 엄격한 동치 비교. 형변환 불가능\n[accent]null[]를 확인하는데 쓸 수 있습니다. lenum.strictequal = 엄격한 동치 비교. 형변환 불가능\n[accent]null[]를 확인하는데 쓸 수 있습니다.
lenum.shl = 왼쪽으로 비트 이동 lenum.shl = 왼쪽으로 비트 이동
@@ -1817,7 +1828,7 @@ block.inverted-sorter.details =
block.distributor.details = block.distributor.details =
block.overflow-gate.details = block.overflow-gate.details =
block.underflow-gate.details = block.underflow-gate.details =
block.mass-driver.details = [lightgray][비공식][]발사려면 최소 아이템 10개가 필요하다. block.mass-driver.details = [lightgray][비공식][]발사려면 최소 아이템 10개가 필요하다.
block.mechanical-pump.details = block.mechanical-pump.details =
block.rotary-pump.details = block.rotary-pump.details =
block.thermal-pump.details = block.thermal-pump.details =

View File

@@ -41,7 +41,7 @@ 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 = Przeglądarka Modów mods.browser = Przeglądarka Modów
mods.browser.selected = Wybrany Mod mods.browser.selected = Wybrany Mod
mods.browser.add = Zainsta-\nluj Moda mods.browser.add = Zainsta-\nluj Moda
mods.browser.reinstall = Przeins-\ntaluj mods.browser.reinstall = Przeins-\ntaluj
@@ -67,6 +67,14 @@ schematic.delete.confirm = Ten schemat zostanie usunięty.
schematic.rename = Zmień nazwę schematu schematic.rename = Zmień nazwę schematu
schematic.info = {0}x{1}, {2} bloków schematic.info = {0}x{1}, {2} bloków
schematic.disabled = [scarlet]Schematy są wyłączone[]\nNie możesz używać schematów na tej [accent]mapie[] lub [accent]serwerze. schematic.disabled = [scarlet]Schematy są wyłączone[]\nNie możesz używać schematów na tej [accent]mapie[] lub [accent]serwerze.
schematic.tags = Tagi:
schematic.edittags = Zmień Znacznik
schematic.addtag = Dodaj Znacznik
schematic.texttag = Tekst Znacznika
schematic.icontag = Ikona Znacznika
schematic.renametag = Zmień Nazwę Znacznika
schematic.tagdelconfirm = Czy kompletnie usunąć znacznik?
schematic.tagexists = Taki znacznik już istnieje.
stats = Statystyki stats = Statystyki
stat.wave = Fale powstrzymane:[accent] {0} stat.wave = Fale powstrzymane:[accent] {0}
@@ -159,7 +167,7 @@ planetmap = Mapa Planety
launchcore = Wystrzel Rdzeń launchcore = Wystrzel Rdzeń
filename = Nazwa Pliku: 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 Techno-\nlogiczne techtree = Drzewo Techno-\nlogiczne
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.legacy = Znaleziono badania z wersji [accent]5.0[].\nChcesz [accent]załadować je[], czy [accent]usunąć[] dane z drzewa technologicznego w nowej kampanii (zalecane)?
@@ -502,7 +510,7 @@ memory = Pam: {0}mb
memory2 = Pam:\n {0}mb +\n {1}mb memory2 = Pam:\n {0}mb +\n {1}mb
language.restart = Uruchom grę ponownie, aby nowo ustawiony język zaczął funkcjonować. language.restart = Uruchom grę ponownie, aby nowo ustawiony język zaczął funkcjonować.
settings = Ustawienia settings = Ustawienia
tutorial = Poradnik tutorial = Samouczek
tutorial.retake = Ponów Samouczek tutorial.retake = Ponów Samouczek
editor = Edytor editor = Edytor
mapeditor = Edytor Map mapeditor = Edytor Map
@@ -530,7 +538,7 @@ 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 guardian = 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.\nSprawdź, czy adres jest wpisany poprawnie. error.unreachable = Serwer niedostępny.\nSprawdź, czy adres jest wpisany poprawnie.
@@ -620,6 +628,20 @@ sector.extractionOutpost.description = Odległa placówka zbudowana przez wroga
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ę.
status.burning.name = Podpalenie
status.freezing.name = Zamrożenie
status.wet.name = Mokrość
status.muddy.name = Zabłocenie
status.melting.name = Topnienie
status.sapped.name = Osłabienie
status.electrified.name = Naelektryzowanie
status.spore-slowed.name = Zarodnikowe Spowolnienie
status.tarred.name = Osmołowanie
status.overclock.name = Przyspieszenie
status.shocked.name = Porażenie
status.blasted.name = Wysadzenie
status.unmoving.name = Unieruchomienie
settings.language = Język settings.language = Język
settings.data = Dane Gry settings.data = Dane Gry
settings.reset = Przywróć Domyślne settings.reset = Przywróć Domyślne
@@ -655,7 +677,8 @@ stat.input = Wejście
stat.output = Wyjście stat.output = Wyjście
stat.booster = Wzmacniacz stat.booster = Wzmacniacz
stat.tiles = Wymagane Pola stat.tiles = Wymagane Pola
stat.affinities = Uwydajnienie stat.affinities = Uwydajnienia
stat.opposites = Przeciwieństwa
stat.powercapacity = Pojemność mocy stat.powercapacity = Pojemność mocy
stat.powershot = moc/strzał stat.powershot = moc/strzał
stat.damage = Obrażenia stat.damage = Obrażenia
@@ -703,7 +726,7 @@ 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.charge = Naładowanie
stat.heatcapacity = Pojemność Cieplna stat.heatcapacity = Pojemność Cieplna
stat.viscosity = Lepkość stat.viscosity = Lepkość
stat.temperature = Temperatura stat.temperature = Temperatura
@@ -717,13 +740,21 @@ stat.abilities = Umiejętności
stat.canboost = Może przyspieszyć stat.canboost = Może przyspieszyć
stat.flying = Może latać stat.flying = Może latać
stat.ammouse = Zużycie Amunicji stat.ammouse = Zużycie Amunicji
stat.damagemultiplier = Mnożnik Obrażeń
stat.healthmultiplier = Mnożnik Zdrowia
stat.speedmultiplier = Mnożnik Prędkości
stat.reloadmultiplier = Mnożnik Prędkości Przeładowywania
stat.buildspeedmultiplier = Mnożnik Prędkości Budowania
stat.reactive = Reaguje
stat.healing = Leczy
ability.forcefield = Pole Mocy ability.forcefield = Pole Siłowe
ability.repairfield = Pole Naprawy ability.repairfield = Pole Naprawy
ability.statusfield = Pole Statusu ability.statusfield = Pole Statusu
ability.unitspawn = Fabryka Jednostek {0} ability.unitspawn = Fabryka Jednostek {0}
ability.shieldregenfield = Strefa Tarczy Regenerującej ability.shieldregenfield = Strefa Tarczy Regenerującej
ability.movelightning = Pioruny Poruszania ability.movelightning = Pioruny Poruszania
ability.energyfield = Pole Energii: [accent]{0}[] obrażenia ~ [accent]{1}[] bloki / [accent]{2}[] cele
bar.drilltierreq = Wymagane Lepsze Wiertło bar.drilltierreq = Wymagane Lepsze Wiertło
bar.noresources = Brak Zasobów bar.noresources = Brak Zasobów
@@ -746,6 +777,7 @@ bar.power = Prąd
bar.progress = Postęp Budowy bar.progress = Postęp Budowy
bar.input = Wejście bar.input = Wejście
bar.output = Wyjście bar.output = Wyjście
bar.strength = [stat]{0}[lightgray]x siły
units.processorcontrol = [lightgray]Kontrolowany przez procesor units.processorcontrol = [lightgray]Kontrolowany przez procesor
@@ -756,6 +788,7 @@ bullet.sapping = [stat]wyczerpujący
bullet.homing = [stat]naprowadzający bullet.homing = [stat]naprowadzający
bullet.shock = [stat]piorunowy bullet.shock = [stat]piorunowy
bullet.frag = [stat]fragmentacyjny bullet.frag = [stat]fragmentacyjny
bullet.lightning = [stat]{0}[lightgray]x błyskawice ~ [stat]{1}[lightgray] Obrażenia
bullet.buildingdamage = [stat]{0}%[lightgray] obrażeń budynkom bullet.buildingdamage = [stat]{0}%[lightgray] obrażeń budynkom
bullet.knockback = [stat]{0}[lightgray] odrzut bullet.knockback = [stat]{0}[lightgray] odrzut
bullet.pierce = [stat]{0}[lightgray]x przebicia bullet.pierce = [stat]{0}[lightgray]x przebicia
@@ -769,6 +802,7 @@ bullet.reload = [stat]{0}[lightgray]x szybkość ataku
unit.blocks = bloki unit.blocks = bloki
unit.blockssquared = bloki² unit.blockssquared = bloki²
unit.powersecond = jednostek prądu na sekundę unit.powersecond = jednostek prądu na sekundę
unit.tilessecond = bloków na sekundę
unit.liquidsecond = jednostek płynu na sekundę unit.liquidsecond = jednostek płynu na sekundę
unit.itemssecond = przedmiotów na sekundę unit.itemssecond = przedmiotów na sekundę
unit.liquidunits = jednostek płynu unit.liquidunits = jednostek płynu
@@ -991,7 +1025,8 @@ rules.weather.duration = Czas trwania:
content.item.name = Przedmioty content.item.name = Przedmioty
content.liquid.name = Płyny content.liquid.name = Płyny
content.unit.name = Jednostki content.unit.name = Jednostki
content.block.name = Klocki content.block.name = Bloki
content.status.name = Efekty Statusu
content.sector.name = Sektory content.sector.name = Sektory
item.copper.name = Miedź item.copper.name = Miedź
@@ -1157,7 +1192,7 @@ block.distributor.name = Dystrybutor
block.sorter.name = Sortownik block.sorter.name = Sortownik
block.inverted-sorter.name = Odwrotny Sortownik block.inverted-sorter.name = Odwrotny Sortownik
block.message.name = Wiadomość block.message.name = Wiadomość
block.illuminator.name = Illuminator block.illuminator.name = Iluminator
block.overflow-gate.name = Brama Przepełnieniowa block.overflow-gate.name = Brama Przepełnieniowa
block.underflow-gate.name = Brama Niedomiaru block.underflow-gate.name = Brama Niedomiaru
block.silicon-smelter.name = Huta Krzemu block.silicon-smelter.name = Huta Krzemu
@@ -1397,7 +1432,7 @@ block.phase-conveyor.description = Zaawansowany blok transportowy dla przedmiot
block.sorter.description = Sortuje przedmioty. Jeśli przedmiot pasuje to przechodzi dalej, jeśli nie - to przechodzi na boki. block.sorter.description = Sortuje przedmioty. Jeśli przedmiot pasuje to przechodzi dalej, jeśli nie - to przechodzi na boki.
block.inverted-sorter.description = Sortuje przedmioty jak zwykły sortownik, ale odpowiednie surowce wyciągane są na boki. block.inverted-sorter.description = Sortuje przedmioty jak zwykły sortownik, ale odpowiednie surowce wyciągane są na boki.
block.router.description = Akceptuje przedmioty z jednego miejsca i rozdziela je do trzech innych kierunków. Przydatne w rozdzielaniu materiałów z jednego źródła do wielu celów.\n\n[scarlet]Nigdy nie używaj przy punkcje wejścia materiałów produkcyjnych, ponieważ zostaną one zatkane przez materiały wyjściowe.[] block.router.description = Akceptuje przedmioty z jednego miejsca i rozdziela je do trzech innych kierunków. Przydatne w rozdzielaniu materiałów z jednego źródła do wielu celów.\n\n[scarlet]Nigdy nie używaj przy punkcje wejścia materiałów produkcyjnych, ponieważ zostaną one zatkane przez materiały wyjściowe.[]
block.router.details = Konieczne zło. Nie zaleca się stosowania obok nakładów produkcyjnych, ponieważ zostaną one zatkane. block.router.details = Nieuniknione zło. Nie zaleca się stosowania obok nakładów produkcyjnych, ponieważ zostaną one zatkane.
block.distributor.description = Zaawansowany rozdzielacz, rozdzielający przedmioty do 7 innych kierunków. block.distributor.description = Zaawansowany rozdzielacz, rozdzielający przedmioty do 7 innych kierunków.
block.overflow-gate.description = Rozdzielacz, który przerzuca przedmioty, kiedy główna droga jest przepełniona. block.overflow-gate.description = Rozdzielacz, który przerzuca przedmioty, kiedy główna droga jest przepełniona.
block.underflow-gate.description = Odwrotność bramy przepełnieniowej, który przepuszcza przedmioty główną drogą, gdy boczne drogi są przepełnione. block.underflow-gate.description = Odwrotność bramy przepełnieniowej, który przepuszcza przedmioty główną drogą, gdy boczne drogi są przepełnione.
@@ -1517,150 +1552,155 @@ unit.risso.description = Strzela sporą ilością pocisków i rakiet w najbliżs
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.
unit.bryde.description = Strzela granatami i rakietami na dużą odległość we wrogów. unit.bryde.description = Strzela granatami i rakietami na dużą odległość we wrogów.
unit.sei.description = Strzela dużą ilością rakiet oraz przebijających zbroje pocisków we wrogów. unit.sei.description = Strzela dużą ilością rakiet oraz przebijających zbroje pocisków we wrogów.
unit.omura.description = Strzela przebijającym superszybkim pociskiem we wrogów ze sporej odległości. Produkuje Błyski (jednostki). unit.omura.description = Strzela przebijającym superszybkim pociskiem we wrogów ze sporej odległości. Produkuje jednostki Flare.
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.read = Wczytuje liczbę z połączonej komórki pamięci.
lst.write = Write a number to a linked memory cell. lst.write = Zapisuje liczbę do połączonej komórki pamięci.
lst.print = Add text to the print buffer.\nDoes not display anything until [accent]Print Flush[] is used. lst.print = Dodaje tekst do buforu drukującego.\nNie wyświetla niczego dopóki [accent]Print Flush[] nie jest użyte.
lst.draw = Add an operation to the drawing buffer.\nDoes not display anything until [accent]Draw Flush[] is used. lst.draw = Dodaje operacje do buforu rysującego.\nNie wyświetla niczego dopóki [accent]Draw Flush[] nie jest użyte.
lst.drawflush = Flush queued [accent]Draw[] operations to a display. lst.drawflush = Wyświetla oczekujące operacje z funkcji [accent]Draw[] na wyświetlaczu.
lst.printflush = Flush queued [accent]Print[] operations to a message block. lst.printflush = Dodaje oczekujące operacje z funkcji [accent]Print[] do bloku wiadomości.
lst.getlink = Get a processor link by index. Starts at 0. lst.getlink = Zdobywa połączenie procesora przez indeks. Zaczyna się od 0.
lst.control = Control a building. lst.control = Kontroluje budynek.
lst.radar = Locate units around a building with range. lst.radar = Lokalizuje jednostki wokół budynku w jego zasięgu.
lst.sensor = Get data from a building or unit. lst.sensor = Zdobywa dane z budynku lub jednostki.
lst.set = Set a variable. lst.set = Ustawia zmienną.
lst.operation = Perform an operation on 1-2 variables. lst.operation = Wykonuje operację na 1-2 zmiennych.
lst.end = Jump to the top of the instruction stack. lst.end = Przeskakuje na początek stosu instrukcji.
lst.jump = Conditionally jump to another statement. lst.wait = Czeka określoną liczbę sekund.
lst.unitbind = Bind to the next unit of a type, and store it in [accent]@unit[]. lst.lookup = Znajduje typ przedmiotu/cieczy/jednostki/bloku poprzez ID.\nCałkowite zliczenia każdego typu można uzyskać za pomocą:\n[accent]@unitCount[] / [accent]@itemCount[] / [accent]@liquidCount[] / [accent]@blockCount[]
lst.unitcontrol = Control the currently bound unit. lst.jump = Warunkowo przeskakuje do innego stanu.
lst.unitradar = Locate units around the currently bound unit. lst.unitbind = Powiązuje z następną jednostką danego typu i przechowuje ją w [accent]@unit[].
lst.unitlocate = Locate a specific type of position/building anywhere on the map.\nRequires a bound unit. lst.unitcontrol = Kontroluje obecnie powiązaną jednostkę.
lst.unitradar = Lokalizuje jednostki wokół obecnie powiązanej jednostki.
lst.unitlocate = Lokalizuje specyficzny typ pozycji/budynku gdziekolwiek na mapie.\nWymaga powiązanej jednostki.
logic.nounitbuild = [red]Unit building logic is not allowed here. logic.nounitbuild = [red]Logika budowania jednostek nie jest tu dozwolona.
lenum.type = Type of building/unit.\ne.g. for any router, this will return [accent]@router[].\nNot a string. lenum.type = Typ budynku/jednostki.\nnp. dla każdego rozdzielacza, zwróci [accent]@router[].\nNie jest łańcuchem znaków (string).
lenum.shoot = Shoot at a position. lenum.shoot = Strzel w określoną pozycje.
lenum.shootp = Shoot at a unit/building with velocity prediction. lenum.shootp = Strzel w jednostkę/budynek z przewidywaną prędkością.
lenum.configure = Building configuration, e.g. sorter item. lenum.configure = Konfiguracja budowania, np. sortowany przedmiot w sortowniku.
lenum.enabled = Whether the block is enabled. lenum.enabled = Sprawdza czy blok jest włączony.
laccess.color = Illuminator color. laccess.color = Kolor iluminatora.
laccess.controller = Unit controller. If processor controlled, returns processor.\nIf in a formation, returns leader.\nOtherwise, returns the unit itself. laccess.controller = Kontroler jednostki. Jeśli jest kontrolowana przez procesor, zwraca procesor.\nJeśli we formacji, zwracja przywódcę.\nW innym wypadku zwraca samą jednostkę.
laccess.dead = Whether a unit/building is dead or no longer valid. laccess.dead = Sprawdza czy jednostka/budynek jest zniszczony lub już nie istnieje.
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.controlled = Zwraca:\n[accent]@ctrlProcessor[] jeśli kontrolerem jednostki jest procesor\n[accent]@ctrlPlayer[] jeśli kontrolerem jednostki/budynku jest gracz\n[accent]@ctrlFormation[] jeśli jednostka jest w formacji\nW innym wypadku 0.
laccess.commanded = [red]Deprecated. Will be removed![]\nUse [accent]controlled[] instead. laccess.commanded = [red]Przestarzałe. Zostanie usunięte![]\nZamiast tego użyj [accent]controlled[].
laccess.progress = Postęp akcji, od 0 do 1.\nZwraca produkcję, przeładowanie wieżyczki lub postęp konstrukcji.
graphicstype.clear = Fill the display with a color. graphicstype.clear = Wypełnia wyświetlacz kolorem.
graphicstype.color = Set color for next drawing operations. graphicstype.color = Ustawia kolor następnych operacji rysujących.
graphicstype.stroke = Set line width. graphicstype.stroke = Ustawia grubość linii.
graphicstype.line = Draw line segment. graphicstype.line = Rysuje segment linii.
graphicstype.rect = Fill a rectangle. graphicstype.rect = Wypełnia prostokąt.
graphicstype.linerect = Draw a rectangle outline. graphicstype.linerect = Rysuje obwód prostokąta.
graphicstype.poly = Fill a regular polygon. graphicstype.poly = Wypełnia regularny wielokąt.
graphicstype.linepoly = Draw a regular polygon outline. graphicstype.linepoly = Rysuje obwód regularnego wielokąta.
graphicstype.triangle = Fill a triangle. graphicstype.triangle = Wypełnia trójkąt.
graphicstype.image = Draw an image of some content.\nex: [accent]@router[] or [accent]@dagger[]. graphicstype.image = Rysuje ikonę jakiejś treści.\nnp. [accent]@router[] lub [accent]@dagger[].
lenum.always = Always true. lenum.always = Zawsze prawda.
lenum.idiv = Integer division. lenum.idiv = Dzielenie liczb całkowitych.
lenum.div = Division.\nReturns [accent]null[] on divide-by-zero. lenum.div = Dzielenie.\nZwraca [accent]null[] w trakcie dzielenia przez zero.
lenum.mod = Modulo. lenum.mod = Modulo.
lenum.equal = Equal. Coerces types.\nNon-null objects compared with numbers become 1, otherwise 0. lenum.equal = Równość. Wymusza typ.\nNiezerowe objekty połączone z liczbami stają się 1, w innym wypadku 0.
lenum.notequal = Not equal. Coerces types. lenum.notequal = Nierówność. Wymusza typ.
lenum.strictequal = Strict equality. Does not coerce types.\nCan be used to check for [accent]null[]. lenum.strictequal = Ścisła równość. Nie wymusza typów.\nMoże być użyte do wykrycia [accent]null[].
lenum.shl = Bit-shift left. lenum.shl = Przesunięcie bitowe w lewo.
lenum.shr = Bit-shift right. lenum.shr = Przesunięcie bitowe w prawo.
lenum.or = Bitwise OR. lenum.or = Bitowe OR (lub).
lenum.land = Logical AND. lenum.land = Logiczne AND (i).
lenum.and = Bitwise AND. lenum.and = Bitowe AND (i).
lenum.not = Bitwise flip. lenum.not = Bitowe NOT.
lenum.xor = Bitwise XOR. lenum.xor = Bitowe XOR.
lenum.min = Minimum dwóch liczb.
lenum.max = Maksimum dwóch liczb.
lenum.angle = Kąt wektoru w stopniach.
lenum.len = Długość wektoru.
lenum.sin = Sinus, w stopniach.
lenum.cos = Cosinus, w stopniach.
lenum.tan = Tangens, w stopniach.
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' #not a typo, look up 'range notation'
lenum.rand = Random decimal in range [0, value). lenum.rand = Losowa liczba w przedziale [0, wartość).
lenum.log = Natural logarithm (ln). lenum.log = Logarytm naturalny (ln).
lenum.log10 = Base 10 logarithm. lenum.log10 = Logarytm o podstawie 10.
lenum.noise = 2D simplex noise. lenum.noise = Szum simplex 2D.
lenum.abs = Absolute value. lenum.abs = Wartość bezwzględna.
lenum.sqrt = Square root. lenum.sqrt = Pierwiastek kwadratowy.
lenum.any = Any unit. lenum.any = Dowolna jednostka.
lenum.ally = Ally unit. lenum.ally = Sojusznicza jednostka.
lenum.attacker = Unit with a weapon. lenum.attacker = Jednostka z bronią.
lenum.enemy = Enemy unit. lenum.enemy = Przeciwnik.
lenum.boss = Guardian unit. lenum.boss = Strażnik.
lenum.flying = Flying unit. lenum.flying = Latająca jednostka.
lenum.ground = Ground unit. lenum.ground = Jednostka lądowa.
lenum.player = Unit controlled by a player. lenum.player = Jednostka kontrolowana przez gracza.
lenum.ore = Ore deposit. lenum.ore = Depozyt rudy.
lenum.damaged = Damaged ally building. lenum.damaged = Uszkodzony sojuszniczy budynek.
lenum.spawn = Enemy spawn point.\nMay be a core or a position. lenum.spawn = Punkt zrzutu przeciwnika.\nMoże być rdzeniem lub pozycją.
lenum.building = Building in a specific group. lenum.building = Budynek ze specyficznej grupy.
lenum.core = Any core. lenum.core = Dowolny rdzeń.
lenum.storage = Storage building, e.g. Vault. lenum.storage = Budynek przechowujący, np. Magazyn.
lenum.generator = Buildings that generate power. lenum.generator = Budynki generujące prąd.
lenum.factory = Buildings that transform resources. lenum.factory = Budynki przetwarzające surowce.
lenum.repair = Repair points. lenum.repair = Punkty naprawy.
lenum.rally = Command center. lenum.rally = Centrum dowodzenia.
lenum.battery = Any battery. lenum.battery = Dowolna bateria.
lenum.resupply = Resupply points.\nOnly relevant when [accent]"Unit Ammo"[] is enabled. lenum.resupply = Punkty uzupełniające.\nMa znaczenie tylko gdy [accent]"Unit Ammo"[] jest załączone.
lenum.reactor = Impact/Thorium reactor. lenum.reactor = Reaktor uderzeniowy/torowy.
lenum.turret = Any turret. lenum.turret = Dowolna wieżyczka.
sensor.in = The building/unit to sense. sensor.in = Wykrywany budynek/jednostka.
radar.from = Building to sense from.\nSensor range is limited by building range. radar.from = Budynek wykrywający.\nZasięg czujnika jest limitowany przez zasięg budynku.
radar.target = Filter for units to sense. radar.target = Filtr wykrywanych jednostek.
radar.and = Additional filters. radar.and = Dodatkowe filtry.
radar.order = Sorting order. 0 to reverse. radar.order = Kolejność sortowania. 0 aby odwrócić.
radar.sort = Metric to sort results by. radar.sort = Wartość, według której będą sortowane wyniki.
radar.output = Variable to write output unit to. radar.output = Zmienna, do której zostanie przypisana jednostka wyjściowa.
unitradar.target = Filter for units to sense. unitradar.target = Filtr wykrywanych jednostek.
unitradar.and = Additional filters. unitradar.and = Dodatkowe filtry.
unitradar.order = Sorting order. 0 to reverse. unitradar.order = Kolejność sortowania. 0 aby odwrócić.
unitradar.sort = Metric to sort results by. unitradar.sort = Wartość, według której będą sortowane wyniki.
unitradar.output = Variable to write output unit to. unitradar.output = Zmienna, do której zostanie przypisana jednostka wyjściowa.
control.of = Building to control. control.of = Kontrolowany budynek.
control.unit = Unit/building to aim at. control.unit = Jednostka/budynek, w którą ma celować.
control.shoot = Whether to shoot. control.shoot = Strzelanie.
unitlocate.enemy = Whether to locate enemy buildings. unitlocate.enemy = Lokalizowanie budynków przeciwnika.
unitlocate.found = Whether the object was found. unitlocate.found = Znalezienie obiektu.
unitlocate.building = Output variable for located building. unitlocate.building = Zmienna wyjściowa dla zlokalizowanego budynku.
unitlocate.outx = Output X coordinate. unitlocate.outx = Wyjściowy koordynat X.
unitlocate.outy = Output Y coordinate. unitlocate.outy = Wyjściowy koordynat Y.
unitlocate.group = Building group to look for. unitlocate.group = Grupa szukanych budynków.
lenum.idle = Don't move, but keep building/mining.\nThe default state. lenum.idle = Przestań się poruszać, jednak nadal buduj/wydobywaj.\nDomyślny stan.
lenum.stop = Stop moving/mining/building. lenum.stop = Przestań poruszać się/kopać/budować.
lenum.move = Move to exact position. lenum.move = Przemieść się do określonej pozycji.
lenum.approach = Approach a position with a radius. lenum.approach = Podejdź do pozycji w promieniu.
lenum.pathfind = Pathfind to the enemy spawn. lenum.pathfind = Odnajdź ścieżkę do punktu zrzutu przeciwników.
lenum.target = Shoot a position. lenum.target = Strzel w określoną pozycje.
lenum.targetp = Shoot a target with velocity prediction. lenum.targetp = Strzel w jednostkę/budynek z przewidywaną prędkością.
lenum.itemdrop = Drop an item. lenum.itemdrop = Upuść przedmiot.
lenum.itemtake = Take an item from a building. lenum.itemtake = Zabierz przedmiot z budynku.
lenum.paydrop = Drop current payload. lenum.paydrop = Upuść obecny ładunek.
lenum.paytake = Pick up payload at current location. lenum.paytake = Podnieś ładunek z obecnego miejsca.
lenum.flag = Numeric unit flag. lenum.flag = Numeryczny znacznik jednostki.
lenum.mine = Mine at a position. lenum.mine = Kop na danej pozycji.
lenum.build = Build a structure. lenum.build = Buduj strukturę.
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.getblock = Pobierz budynek i typ z koordynatów.\nJednostka musi być w zasięgu pozycji.\nSolidne niebudynki będą miały typ [accent]@solid[].
lenum.within = Check if unit is near a position. lenum.within = Sprawdź czy jednostka jest w pobliżu pozycji.
lenum.boost = Start/stop boosting. lenum.boost = Zacznij/zakończ boostować.

View File

@@ -100,6 +100,7 @@ joingame = Intră în Joc
customgame = Personalizat customgame = Personalizat
newgame = Joc Nou newgame = Joc Nou
none.found = [lightgray]<nu s-a găsit nimic> none.found = [lightgray]<nu s-a găsit nimic>
none.inmap = [lightgray]<niciunul pe hartă>
none = <nimic> none = <nimic>
minimap = Minihartă minimap = Minihartă
position = Poziție position = Poziție
@@ -564,7 +565,8 @@ weather.fog.name = Ceață
sectors.unexplored = [lightgray]Neexplorat sectors.unexplored = [lightgray]Neexplorat
sectors.resources = Resurse: sectors.resources = Resurse:
sectors.production = Producție: sectors.production = Producție:
sectors.export = Export: sectors.export = Exportă:
sectors.import = Importă:
sectors.time = Timp: sectors.time = Timp:
sectors.threat = Amenințare: sectors.threat = Amenințare:
sectors.wave = Valul: sectors.wave = Valul:
@@ -643,7 +645,7 @@ status.electrified.name = Electrificat
status.spore-slowed.name = Încetinit de Spori status.spore-slowed.name = Încetinit de Spori
status.tarred.name = Păcurit status.tarred.name = Păcurit
status.overclock.name = Suprasolicitat status.overclock.name = Suprasolicitat
status.shocked.name = Șoc status.shocked.name = Electrocutat
status.blasted.name = Explozie status.blasted.name = Explozie
status.unmoving.name = Nemișcat status.unmoving.name = Nemișcat
@@ -724,7 +726,7 @@ stat.maxconsecutive = Maxim Consecutive
stat.buildcost = Cost Construcție stat.buildcost = Cost Construcție
stat.inaccuracy = Inacuratețe stat.inaccuracy = Inacuratețe
stat.shots = Lovituri stat.shots = Lovituri
stat.reload = Lovituri/Secundă stat.reload = Rata de Tragere
stat.ammo = Muniție stat.ammo = Muniție
stat.shieldhealth = Viață Scut stat.shieldhealth = Viață Scut
stat.cooldowntime = Timp de Reîncărcare stat.cooldowntime = Timp de Reîncărcare
@@ -793,10 +795,10 @@ bullet.damage = [stat]{0}[lightgray] forță
bullet.splashdamage = [stat]{0}[lightgray] forță pe raza ~[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.homing = [stat]cu radar bullet.homing = [stat]cu radar
bullet.frag = [stat]se sparge bullet.frags = [stat]{0}[lightgray]x fragmente:
bullet.lightning = [stat]{0}[lightgray]x fulgere ~ [stat]{1}[lightgray] forță 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 penetrează bullet.pierce = [stat]{0}[lightgray]x penetrează
bullet.infinitepierce = [stat]penetrează bullet.infinitepierce = [stat]penetrează
bullet.healpercent = [stat]{0}[lightgray]% reparare bullet.healpercent = [stat]{0}[lightgray]% reparare
@@ -806,6 +808,7 @@ bullet.reload = [stat]{0}[lightgray]x lovituri
unit.blocks = blocuri unit.blocks = blocuri
unit.blockssquared = blocuri² unit.blockssquared = blocuri²
unit.powersecond = electricitate/secundă unit.powersecond = electricitate/secundă
unit.tilessecond = pătrate/secundă
unit.liquidsecond = unități lichid/secundă unit.liquidsecond = unități lichid/secundă
unit.itemssecond = materiale/secundă unit.itemssecond = materiale/secundă
unit.liquidunits = unități lichid unit.liquidunits = unități lichid
@@ -821,7 +824,7 @@ unit.shieldhealth = viață scut
unit.items = materiale unit.items = materiale
unit.thousands = mii unit.thousands = mii
unit.millions = mil unit.millions = mil
unit.billions = b unit.billions = mld
unit.pershot = /lovitură unit.pershot = /lovitură
category.purpose = Utilizare category.purpose = Utilizare
category.general = General category.general = General
@@ -844,7 +847,6 @@ setting.doubletapmine.name = Dublu-Click pt a Mina
setting.modcrashdisable.name = Dezactivează Modurile în Cazul unui Crash la Pornire setting.modcrashdisable.name = Dezactivează Modurile în Cazul unui Crash la Pornire
setting.animatedwater.name = Suprafețe Animate setting.animatedwater.name = Suprafețe Animate
setting.animatedshields.name = Scuturi Animate setting.animatedshields.name = Scuturi Animate
setting.antialias.name = Antialiasing[lightgray] (necesită repornire)[]
setting.playerindicators.name = Indicatori Jucător setting.playerindicators.name = Indicatori Jucător
setting.indicators.name = Indicatori Inamic setting.indicators.name = Indicatori Inamic
setting.autotarget.name = Auto-Țintire setting.autotarget.name = Auto-Țintire
@@ -853,7 +855,8 @@ setting.touchscreen.name = Controale Touchscreen
setting.fpscap.name = FPS Maxim setting.fpscap.name = FPS Maxim
setting.fpscap.none = Niciuna setting.fpscap.none = Niciuna
setting.fpscap.text = FPS (0) setting.fpscap.text = FPS (0)
setting.uiscale.name = Scară Interfață [lightgray] (repornirea necesară)[] setting.uiscale.name = Scară Interfață
setting.uiscale.description = Repornire necesară pt a aplica schimbările.
setting.swapdiagonal.name = Plasează Mereu Diagonal setting.swapdiagonal.name = Plasează Mereu Diagonal
setting.difficulty.training = Antrenament setting.difficulty.training = Antrenament
setting.difficulty.easy = Ușor setting.difficulty.easy = Ușor
@@ -871,7 +874,8 @@ setting.saveinterval.name = Interval de Salvare
setting.seconds = {0} secunde setting.seconds = {0} secunde
setting.milliseconds = {0} millisecunde setting.milliseconds = {0} millisecunde
setting.fullscreen.name = Ecran Complet setting.fullscreen.name = Ecran Complet
setting.borderlesswindow.name = Fereastră Fără Margine[lightgray] (repornirea poate fi necesară) setting.borderlesswindow.name = Fereastră Fără Margine
setting.borderlesswindow.description = Repornirea poate fi necesară pt a aplica schimbările.
setting.fps.name = Vezi FPS & Ping setting.fps.name = Vezi FPS & Ping
setting.smoothcamera.name = Cameră Graduală setting.smoothcamera.name = Cameră Graduală
setting.vsync.name = VSync setting.vsync.name = VSync
@@ -994,6 +998,7 @@ rules.wavetimer = Valuri pe Timp
rules.waves = Valuri rules.waves = Valuri
rules.attack = Modul Atac rules.attack = Modul Atac
rules.buildai = AI-ul Construiește rules.buildai = AI-ul Construiește
rules.cleanupdeadteams = Îndepărtează Clădirile Echipelor Învinse (PvP)
rules.corecapture = Capturează Nucleele Distruse rules.corecapture = Capturează Nucleele Distruse
rules.enemyCheat = Resurse infinite pt AI (echipa roșie) rules.enemyCheat = Resurse infinite pt AI (echipa roșie)
rules.blockhealthmultiplier = Multiplicatorul Vieții Blocurilor rules.blockhealthmultiplier = Multiplicatorul Vieții Blocurilor
@@ -1278,7 +1283,7 @@ block.surge-wall.name = Perete de Aliaj
block.surge-wall-large.name = Perete Mare de Aliaj block.surge-wall-large.name = Perete Mare de Aliaj
block.cyclone.name = Ciclon block.cyclone.name = Ciclon
block.fuse.name = Fuse block.fuse.name = Fuse
block.shock-mine.name = Mină cu Șocuri block.shock-mine.name = Mină cu Electroșocuri
block.overdrive-projector.name = Proiector de Suprasolicitare block.overdrive-projector.name = Proiector de Suprasolicitare
block.force-projector.name = Proiector de Forță block.force-projector.name = Proiector de Forță
block.arc.name = Arc block.arc.name = Arc
@@ -1288,7 +1293,6 @@ block.meltdown.name = Meltdown
block.foreshadow.name = Foreshadow block.foreshadow.name = Foreshadow
block.container.name = Container block.container.name = Container
block.launch-pad.name = Platformă de Lansare block.launch-pad.name = Platformă de Lansare
block.launch-pad-large.name = Platformă de Lansare Mare
block.segment.name = Segment block.segment.name = Segment
block.command-center.name = Centru de Comandă block.command-center.name = Centru de Comandă
block.ground-factory.name = Fabrică Unități Artilerie block.ground-factory.name = Fabrică Unități Artilerie
@@ -1348,6 +1352,7 @@ hint.placeTurret = Construiește \uf861 [accent]Arme[] pt a-ți apăra baza de i
hint.breaking = Ține apăsat [accent]click-dreapta[] și trage pe ecran pt a distruge blocuri. hint.breaking = Ține apăsat [accent]click-dreapta[] și trage pe ecran pt a distruge blocuri.
hint.breaking.mobile = Activează \ue817 [accent]ciocanul[] din dreapta-jos și dă click pt a distruge blocuri.\n\nȚine apăsat cu degetul pt o secundă și trage pt a distruge mai multe blocuri deodată. hint.breaking.mobile = Activează \ue817 [accent]ciocanul[] din dreapta-jos și dă click pt a distruge blocuri.\n\nȚine apăsat cu degetul pt o secundă și trage pt a distruge mai multe blocuri deodată.
hint.blockInfo = Poți vedea informații despre un bloc selectându-l în [accent]meniul de construcție[] și dând click pe butonul [accent][[?][] din dreapta. hint.blockInfo = Poți vedea informații despre un bloc selectându-l în [accent]meniul de construcție[] și dând click pe butonul [accent][[?][] din dreapta.
hint.derelict = [accent]Structurile abandonate[] sunt rămășițe stricate ale bazelor vechi care nu mai funcționează.\n\nAceste structuri pot fi [accent]deconstruite[] pt resurse.
hint.research = Folosește butonul \ue875 [accent]Cercetează[] pt a cerceta noi tehnologii. hint.research = Folosește butonul \ue875 [accent]Cercetează[] pt a cerceta noi tehnologii.
hint.research.mobile = Folosește butonul \ue875 [accent]Cercetează[] din \ue88c [accent]Meniu[] pt a cerceta noi tehnologii. hint.research.mobile = Folosește butonul \ue875 [accent]Cercetează[] din \ue88c [accent]Meniu[] pt a cerceta noi tehnologii.
hint.unitControl = Ține apăsat [accent][[Ctrl][] și [accent]dă click[] pt a controla unități aliate sau arme. hint.unitControl = Ține apăsat [accent][[Ctrl][] și [accent]dă click[] pt a controla unități aliate sau arme.
@@ -1399,6 +1404,7 @@ liquid.slag.description = Rafinată în separatoare înapoi în materialele cons
liquid.oil.description = Folosit în producerea avansată de materiale ș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.derelict = [lightgray] Structuri Abandonate
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.
block.armored-conveyor.description = Transportă materialele înainte. Nu acceptă materiale de pe lateral decât de la alte benzi. block.armored-conveyor.description = Transportă materialele înainte. Nu acceptă materiale de pe lateral decât de la alte benzi.
block.illuminator.description = Emite lumină. block.illuminator.description = Emite lumină.
@@ -1457,7 +1463,7 @@ block.router.details = Un rău necesar. Nu folosi niciodată pt a introduce mate
block.distributor.description = Distribuie materialele primite în alte 7 direcții în mod egal. block.distributor.description = Distribuie materialele primite în alte 7 direcții în mod egal.
block.overflow-gate.description = Transportă materialele doar la stânga și dreapta dacă drumul din față este blocat. block.overflow-gate.description = Transportă materialele doar la stânga și dreapta dacă drumul din față este blocat.
block.underflow-gate.description = Opusul porții de revărsare. Transportă materialele în față dacă benzile din stânga și dreapta sunt blocate. block.underflow-gate.description = Opusul porții de revărsare. Transportă materialele în față dacă benzile din stânga și dreapta sunt blocate.
block.mass-driver.description = Dispozitiv folosit pt transportul materialelor pe distanțe mari. Adună mai multe materiale și apoi le lansează până la un alt distributor în masă pe o rază mare. block.mass-driver.description = Structură de transport al materialelor pe distanțe mari. Adună mai multe materiale și apoi le lansează către un alt distributor în masă.
block.mechanical-pump.description = Pompează lichide din mediul înconjurător. Nu necesită electricitate. block.mechanical-pump.description = Pompează lichide din mediul înconjurător. Nu necesită electricitate.
block.rotary-pump.description = Pompează lichide din mediul înconjurător. Necesită electricitate. block.rotary-pump.description = Pompează lichide din mediul înconjurător. Necesită electricitate.
block.thermal-pump.description = Pompează lichide din mediul înconjurător. block.thermal-pump.description = Pompează lichide din mediul înconjurător.
@@ -1543,6 +1549,8 @@ block.memory-bank.description = Stochează informație pt un procesor. Capacitat
block.logic-display.description = Afișează grafica transmisă de un procesor logic. block.logic-display.description = Afișează grafica transmisă de un procesor logic.
block.large-logic-display.description = Afișează grafica transmisă de un procesor logic. block.large-logic-display.description = Afișează grafica transmisă de un procesor logic.
block.interplanetary-accelerator.description = Un turn masiv cu o armă railgun electromagnetică. Accelerează nucleele la viteză cosmică pt lansare interplanetară. block.interplanetary-accelerator.description = Un turn masiv cu o armă railgun electromagnetică. Accelerează nucleele la viteză cosmică pt lansare interplanetară.
block.repair-turret.description = Repară încontinuu cea mai deteriorată unitate din vecinătate. Poate accepta răcitor.
block.payload-propulsion-tower.description = Structură de transport al încărcăturii pe distanțe mari. Lansează încărcătura către un alt turn propulsor conectat.
unit.dagger.description = Trage cu gloanțe standard către toți inamicii din apropiere. unit.dagger.description = Trage cu gloanțe standard către toți inamicii din apropiere.
unit.mace.description = Trage cu jeturi de flacără aprinsă către toți inamicii din apropiere. unit.mace.description = Trage cu jeturi de flacără aprinsă către toți inamicii din apropiere.
@@ -1577,6 +1585,11 @@ unit.omura.description = Trage cu un railgun cu gloanțe care penetrează scutur
unit.alpha.description = Apără nucleul Shard de inamici. Construiește structuri. unit.alpha.description = Apără nucleul Shard de inamici. Construiește structuri.
unit.beta.description = Apără nucleul Foundation de inamici. Construiește structuri. unit.beta.description = Apără nucleul Foundation de inamici. Construiește structuri.
unit.gamma.description = Apără nucleul Core de inamici. Construiește structuri. unit.gamma.description = Apără nucleul Core de inamici. Construiește structuri.
unit.retusa.description = Plasează mine de proximitate. Repară unitățile aliate.
unit.oxynoe.description = Trage cu jeturi de flacără către inamicii din apropiere, reparând structurile aliate. Țintește proiectilele inamice din apropiere cu o armă care le deteriorează și distruge.
unit.cyerce.description = Trage cu bombe cu dispersie echipate cu radar către inamici. Repară unitățile aliate.
unit.aegires.description = Electrocutează toate unitățile și structurile inamice care intră în câmpul său de energie. Repară toți aliații.
unit.navanax.description = Trage cu proiectile EMP explozive, lovind rețelele electrice inamice cu o forță semnificativă și reparând structurile aliate. Topește inamicii din apropiere cu cele 4 arme autonome cu laser.
lst.read = Citește un număr dintr-o celulă de memorie conectată. lst.read = Citește un număr dintr-o celulă de memorie conectată.
lst.write = Scrie un număr într-o celulă de memorie conectată. lst.write = Scrie un număr într-o celulă de memorie conectată.
@@ -1591,6 +1604,8 @@ lst.sensor = Obține date de la o clădire sau unitate.
lst.set = Setează o variabilă. lst.set = Setează o variabilă.
lst.operation = Efectuează o operație pe 1-2 variabile. lst.operation = Efectuează o operație pe 1-2 variabile.
lst.end = Sari la începutul listei de instrucțiuni. lst.end = Sari la începutul listei de instrucțiuni.
lst.wait = Așteaptă un anumit număr de secunde.
lst.lookup = Caută un tip de material/lichid/unitate/bloc după ID.\nNumărul total din fiecare tip poate fi accesat cu:\n[accent]@unitCount[] / [accent]@itemCount[] / [accent]@liquidCount[] / [accent]@blockCount[]
lst.jump = Dacă condiția este adevărată, mergi la o altă instrucțiune. lst.jump = Dacă condiția este adevărată, mergi la o altă instrucțiune.
lst.unitbind = Controlează următoarea unitate de tipul selectat și reține-o în [accent]@unit[]. lst.unitbind = Controlează următoarea unitate de tipul selectat și reține-o în [accent]@unit[].
lst.unitcontrol = Controlează unitatea controlată de procesor. lst.unitcontrol = Controlează unitatea controlată de procesor.

View File

@@ -845,7 +845,6 @@ setting.doubletapmine.name = Добыча руды двойным нажатие
setting.modcrashdisable.name = Отключение модификаций после вылета при запуске setting.modcrashdisable.name = Отключение модификаций после вылета при запуске
setting.animatedwater.name = Анимированные поверхности setting.animatedwater.name = Анимированные поверхности
setting.animatedshields.name = Анимированные щиты setting.animatedshields.name = Анимированные щиты
setting.antialias.name = Сглаживание[lightgray] (требует перезапуска)[]
setting.playerindicators.name = Индикаторы направления игроков setting.playerindicators.name = Индикаторы направления игроков
setting.indicators.name = Индикаторы направления врагов setting.indicators.name = Индикаторы направления врагов
setting.autotarget.name = Автозахват цели setting.autotarget.name = Автозахват цели
@@ -854,7 +853,7 @@ setting.touchscreen.name = Сенсорное управление
setting.fpscap.name = Максимальный FPS setting.fpscap.name = Максимальный FPS
setting.fpscap.none = Неограниченный setting.fpscap.none = Неограниченный
setting.fpscap.text = {0} FPS setting.fpscap.text = {0} FPS
setting.uiscale.name = Масштаб пользовательского интерфейса[lightgray] (необходим перезапуск)[] setting.uiscale.name = Масштаб пользовательского интерфейса
setting.swapdiagonal.name = Всегда диагональное размещение setting.swapdiagonal.name = Всегда диагональное размещение
setting.difficulty.training = Обучение setting.difficulty.training = Обучение
setting.difficulty.easy = Лёгкая setting.difficulty.easy = Лёгкая
@@ -872,7 +871,7 @@ setting.saveinterval.name = Интервал сохранения
setting.seconds = {0} секунд setting.seconds = {0} секунд
setting.milliseconds = {0} миллисекунд setting.milliseconds = {0} миллисекунд
setting.fullscreen.name = Полноэкранный режим setting.fullscreen.name = Полноэкранный режим
setting.borderlesswindow.name = Безрамочное окно[lightgray] (может потребоваться перезапуск) setting.borderlesswindow.name = Безрамочное окно
setting.fps.name = Показывать FPS и пинг setting.fps.name = Показывать FPS и пинг
setting.smoothcamera.name = Плавная камера setting.smoothcamera.name = Плавная камера
setting.vsync.name = Вертикальная синхронизация setting.vsync.name = Вертикальная синхронизация

View File

@@ -5,7 +5,7 @@ discord = เข้าร่วมเซิร์ฟเวอร์ Discord ข
link.discord.description = พื้นที่พูดคุยอย่างเป็นทางการของ Mindustry link.discord.description = พื้นที่พูดคุยอย่างเป็นทางการของ Mindustry
link.reddit.description = Subreddit ของ Mindustry link.reddit.description = Subreddit ของ Mindustry
link.github.description = แหล่งโค้ดของเกม link.github.description = แหล่งโค้ดของเกม
link.changelog.description = รายการอัเดต link.changelog.description = รายการอัเดต
link.dev-builds.description = เวอร์ชั่นระหว่างพัฒนา (ไม่เสถียร) link.dev-builds.description = เวอร์ชั่นระหว่างพัฒนา (ไม่เสถียร)
link.trello.description = บอร์ด Trello อย่างเป็นทางการสำหรับฟีเจอร์ต่างๆ ที่วางแผนไว้ link.trello.description = บอร์ด Trello อย่างเป็นทางการสำหรับฟีเจอร์ต่างๆ ที่วางแผนไว้
link.itch.io.description = หน้าเว็บ itch.io สำหรับดาวน์โหลดบน PC link.itch.io.description = หน้าเว็บ itch.io สำหรับดาวน์โหลดบน PC
@@ -36,10 +36,10 @@ load.scripts = สคริปต์
be.update = เวอร์ชั่นรุ่นพัฒนาล่าสุดออกแล้ว: be.update = เวอร์ชั่นรุ่นพัฒนาล่าสุดออกแล้ว:
be.update.confirm = ดาวน์โหลดเวอร์ชั่นใหม่แล้วรีสตาร์ทเลยไหม? be.update.confirm = ดาวน์โหลดเวอร์ชั่นใหม่แล้วรีสตาร์ทเลยไหม?
be.updating = กำลังอัเดต... be.updating = กำลังอัเดต...
be.ignore = ยกเลิก be.ignore = ยกเลิก
be.noupdates = ไม่พบอัเดตใหม่ be.noupdates = ไม่พบอัเดตใหม่
be.check = ตรวจหาอัเดตใหม่ be.check = ตรวจหาอัเดตใหม่
mods.browser = ค้นหาม็อด mods.browser = ค้นหาม็อด
mods.browser.selected = เลือกแล้ว mods.browser.selected = เลือกแล้ว
@@ -93,7 +93,7 @@ level.highscore = คะแนนสูงสุด: [accent]{0}
level.mode = เกมโหมด: level.mode = เกมโหมด:
coreattack = < แกนกลางถูกโจมตี! > coreattack = < แกนกลางถูกโจมตี! >
nearpoint = [[ [scarlet]ออกจากจุดเกิดด่วน![] ]\nการทำลายล้างกำลังใกล้เข้ามา nearpoint = [[ [scarlet]ออกจากจุดเกิดด่วน![] ]\nการทำลายล้างกำลังใกล้เข้ามา
database = ฐานข้อมูลหลัก database = ฐานข้อมูลแกนกลาง
savegame = เซฟเกม savegame = เซฟเกม
loadgame = โหลดเกม loadgame = โหลดเกม
joingame = เข้าร่วมเกม joingame = เข้าร่วมเกม
@@ -101,6 +101,7 @@ customgame = เกมที่กำหนดเอง
newgame = เริ่มเกมใหม่ newgame = เริ่มเกมใหม่
none = <ไม่มี> none = <ไม่มี>
none.found = [lightgray]<ไม่เจออะไรเลย> none.found = [lightgray]<ไม่เจออะไรเลย>
none.inmap = [lightgray]<ไม่มีในแมพ>
minimap = มินิแมพ minimap = มินิแมพ
position = ตำแหน่ง position = ตำแหน่ง
close = ปิด close = ปิด
@@ -155,7 +156,7 @@ mod.jarwarn = [scarlet]ม็อดไฟล์ JAR นั้นค่อนข
mod.item.remove = ไอเท็มนี้เป็นส่วนหนึ่งของม็อด [accent]'{0}'[] หากต้องการนำออก กรุณาถอนการติดตั้งม็อดนั้น mod.item.remove = ไอเท็มนี้เป็นส่วนหนึ่งของม็อด [accent]'{0}'[] หากต้องการนำออก กรุณาถอนการติดตั้งม็อดนั้น
mod.remove.confirm = ม็อดนี้จะถูกลบ mod.remove.confirm = ม็อดนี้จะถูกลบ
mod.author = [lightgray]ผู้สร้าง:[] {0} mod.author = [lightgray]ผู้สร้าง:[] {0}
mod.missing = เซฟนี้มีม็อดที่คุณพึ่งอัเดตหรือไม่ได้ติดตั้งแล้ว อาจทำให้เซฟเสีย คุณแน่จะหรือว่าจะโหลดเซฟนี้?\n[lightgray]ม็อดที่ใช้:\n{0} mod.missing = เซฟนี้มีม็อดที่คุณพึ่งอัเดตหรือไม่ได้ติดตั้งแล้ว อาจทำให้เซฟเสีย คุณแน่จะหรือว่าจะโหลดเซฟนี้?\n[lightgray]ม็อดที่ใช้:\n{0}
mod.preview.missing = ก่อนที่จะนำม็อดไปลงในเวิร์กช็อป คุณต้องใส่รูปพรีวิวก่อน\nใส่รูปชื่อ[accent] preview.png[] ลงในโฟลเดอร์ของม็อดแล้วลองอีกครั้ง mod.preview.missing = ก่อนที่จะนำม็อดไปลงในเวิร์กช็อป คุณต้องใส่รูปพรีวิวก่อน\nใส่รูปชื่อ[accent] preview.png[] ลงในโฟลเดอร์ของม็อดแล้วลองอีกครั้ง
mod.folder.missing = ม็อดที่อยู่ในรูปแบบโฟลเดอร์เท่านั้นที่สามารถลงในเวิร์กช็อปได้\nunzip ไฟล์แล้วลบไฟล์ zip เก่า แล้วรีสตาร์ทเกมหรือรีโหลดม็อด mod.folder.missing = ม็อดที่อยู่ในรูปแบบโฟลเดอร์เท่านั้นที่สามารถลงในเวิร์กช็อปได้\nunzip ไฟล์แล้วลบไฟล์ zip เก่า แล้วรีสตาร์ทเกมหรือรีโหลดม็อด
mod.scripts.disable = เครื่องของคุณไม่รองรับม็อดที่มีสคริปต์ คุณจำเป็นต้องปิดม็อดเหล่านี้ก่อนจึงจะสามารถเล่นได้ mod.scripts.disable = เครื่องของคุณไม่รองรับม็อดที่มีสคริปต์ คุณจำเป็นต้องปิดม็อดเหล่านี้ก่อนจึงจะสามารถเล่นได้
@@ -166,10 +167,10 @@ noname = ใส่ชื่อ[accent]ผู้เล่น[]ก่อน
planetmap = แผนที่ดาวเคราะห์ planetmap = แผนที่ดาวเคราะห์
launchcore = ส่งแกนกลาง launchcore = ส่งแกนกลาง
filename = ชื่อไฟล์: filename = ชื่อไฟล์:
unlocked = เนื้อหาใหม่ปลดล็อ! unlocked = เนื้อหาใหม่ปลดล็อ!
available = มีการวิจัยใหม่พร้อมปลดล็อก! available = มีการวิจัยใหม่พร้อมปลดล็อก!
completed = [accent]วิจัยแล้ว completed = [accent]วิจัยแล้ว
techtree = การวิจัย techtree = ต้นไม้แห่งเทคโนโลยี
research.legacy = พบข้อมูลการวิจัยของเวอร์ชั่น [accent]5.0[]\nคุณต้องการ[accent]โหลดข้อมูล[]หรือ[accent]ทิ้งข้อมูลไป[]และเริ่มต้นวิจัยในแคมเปญใหม่ (แนะนำ) research.legacy = พบข้อมูลการวิจัยของเวอร์ชั่น [accent]5.0[]\nคุณต้องการ[accent]โหลดข้อมูล[]หรือ[accent]ทิ้งข้อมูลไป[]และเริ่มต้นวิจัยในแคมเปญใหม่ (แนะนำ)
research.load = โหลด research.load = โหลด
research.discard = ทอดทิ้ง research.discard = ทอดทิ้ง
@@ -186,19 +187,19 @@ server.kicked.kick = คุณถูกเตะออกจากเซิร
server.kicked.whitelist = คุณไม่ได้ถูกรับเชิญ\nคนที่ถูกรับเชิญเท่านั้นที่จะเข้าได้ server.kicked.whitelist = คุณไม่ได้ถูกรับเชิญ\nคนที่ถูกรับเชิญเท่านั้นที่จะเข้าได้
server.kicked.serverClose = เซิร์ฟเวอร์ถูกปิด server.kicked.serverClose = เซิร์ฟเวอร์ถูกปิด
server.kicked.vote = คุณถูกโหวตเตะออก บัยบาย server.kicked.vote = คุณถูกโหวตเตะออก บัยบาย
server.kicked.clientOutdated = ไคลเอนต์เก่า! กรุณาอัเดตเกมของคุณ! server.kicked.clientOutdated = ไคลเอนต์เก่า! กรุณาอัเดตเกมของคุณ!
server.kicked.serverOutdated = เซิร์ฟเวอร์เก่า! โปรดถามเจ้าของเซิร์ฟเวอร์เพื่ออัเดต! server.kicked.serverOutdated = เซิร์ฟเวอร์เก่า! โปรดถามเจ้าของเซิร์ฟเวอร์เพื่ออัเดต!
server.kicked.banned = คุณถูกแบนในเซิร์ฟเวอร์นี้ server.kicked.banned = คุณถูกแบนในเซิร์ฟเวอร์นี้
server.kicked.typeMismatch = เซิร์ฟเวอร์นี้ไม่เข้ากับประเภทบิลด์ของคุณ server.kicked.typeMismatch = เซิร์ฟเวอร์นี้ไม่เข้ากับประเภทบิลด์ของคุณ
server.kicked.playerLimit = เซิร์ฟเวอร์เต็ม กรุณารอให้เซิร์ฟเวอร์ว่างก่อน server.kicked.playerLimit = เซิร์ฟเวอร์เต็ม กรุณารอให้เซิร์ฟเวอร์ว่างก่อน
server.kicked.recentKick = คุณเพิ่งถูกเตะออกจากเซิร์ฟเวอร์นี้\nกรุณารอสักครู่เพื่อเข้าร่วมอีกครั้ง server.kicked.recentKick = คุณเพิ่งถูกเตะออกจากเซิร์ฟเวอร์นี้\nกรุณารอสักครู่เพื่อเข้าร่วมอีกครั้ง
server.kicked.nameInUse = มีคนที่ใช้ชืชื่อนี้\nอยู่ในเซิฟเวอร์แล้ว server.kicked.nameInUse = มีคนที่ใช้ชื่อนี้\nอยู่ในเซิร์ฟเวอร์แล้ว
server.kicked.nameEmpty = ชื่อของคุณไม่สามารถใช้ได้ server.kicked.nameEmpty = ชื่อของคุณไม่สามารถใช้ได้
server.kicked.idInUse = คุณเชื่อมต่อกับเซิร์ฟเวอร์นี้อยู่แล้ว เราไม่อนุญาตให้เชื่อมต่อสองบัญชีในเซิร์ฟเวอร์เดียวกัน server.kicked.idInUse = คุณเชื่อมต่อกับเซิร์ฟเวอร์นี้อยู่แล้ว เราไม่อนุญาตให้เชื่อมต่อสองบัญชีในเซิร์ฟเวอร์เดียวกัน
server.kicked.customClient = เซิร์ฟเวอร์นี้ไม่รองรับเวอร์ชั่นที่ถูกปรับแต่ง กรุณาโหลดเวอร์ชั่นอย่างเป็นทางการของ Mindustry server.kicked.customClient = เซิร์ฟเวอร์นี้ไม่รองรับเวอร์ชั่นที่ถูกปรับแต่ง กรุณาโหลดเวอร์ชั่นอย่างเป็นทางการของ Mindustry
server.kicked.gameover = จบเกม! server.kicked.gameover = จบเกม!
server.kicked.serverRestarting = เซิร์ฟเวอร์กำลังเริ่มใหม่ server.kicked.serverRestarting = เซิร์ฟเวอร์กำลังเริ่มใหม่
server.versions = เวอร์ชั่นของคุณ:[accent] {0}[]\nเวอร์ชั่นของเซิฟเวอร์:[accent] {1}[] server.versions = เวอร์ชั่นของคุณ:[accent] {0}[]\nเวอร์ชั่นของเซิร์ฟเวอร์:[accent] {1}[]
host.info = ปุ่ม[accent]โฮสต์[]นั้นโฮสต์เซิร์ฟเวอร์ที่พอร์ต [scarlet]6567[] \nทุกคนที่อยู่ใน [lightgray]Wi-Fi หรือเครือข่ายท้องถิ่น[]เดียวกันจะสามารถเห็นเซิร์ฟเวอร์ของคุณในรายชื่อของ\nเซิร์ฟเวอร์ได้\n\nถ้าคุณต้องการให้ผู้เล่นอื่นๆ สามารถเชื่อมต่อได้จากทุกที่โดยใช้ IP คุณจำเป็นจะต้องใช้การ[accent]การส่งต่อพอร์ต (Port Forwarding)[] \n\n[lightgray]โน๊ต: ถ้าผู้เล่นคนใดมีปัญหาในการเชื่อมต่อ LAN ของคุณ เช็คให้แน่ใจว่าคุณได้อนุญาตให้ Mindustry เข้าถึงเครือข่ายท้องถิ่นของคุณในการตั้งค่า Firewall จำไว้ว่าเครือข่ายสาธารณะบางครั้งอาจไม่อนุญาตการ\nค้นหาเซิร์ฟเวอร์ host.info = ปุ่ม[accent]โฮสต์[]นั้นโฮสต์เซิร์ฟเวอร์ที่พอร์ต [scarlet]6567[] \nทุกคนที่อยู่ใน [lightgray]Wi-Fi หรือเครือข่ายท้องถิ่น[]เดียวกันจะสามารถเห็นเซิร์ฟเวอร์ของคุณในรายชื่อของ\nเซิร์ฟเวอร์ได้\n\nถ้าคุณต้องการให้ผู้เล่นอื่นๆ สามารถเชื่อมต่อได้จากทุกที่โดยใช้ IP คุณจำเป็นจะต้องใช้การ[accent]การส่งต่อพอร์ต (Port Forwarding)[] \n\n[lightgray]โน๊ต: ถ้าผู้เล่นคนใดมีปัญหาในการเชื่อมต่อ LAN ของคุณ เช็คให้แน่ใจว่าคุณได้อนุญาตให้ Mindustry เข้าถึงเครือข่ายท้องถิ่นของคุณในการตั้งค่า Firewall จำไว้ว่าเครือข่ายสาธารณะบางครั้งอาจไม่อนุญาตการ\nค้นหาเซิร์ฟเวอร์
join.info = คุณสามารถใส่ [accent]IP ของเซิร์ฟเวอร์[]เพื่อที่จะเชื่อมต่อหรือค้นหาเซิร์ฟเวอร์ เซิร์ฟเวอร์ที่ใช้[accent]เครือข่ายท้องถิ่น[]จะสามารถเชื่อมโดยใช้\n LAN หรือ WAN ก็ได้\n\n[lightgray]ถ้าคุณอยากเชื่อมต่อกับใครบางคนโดยใช้ IP คุณต้องไปถามโฮสต์เอาว่า IP ของโฮสต์คืออะไร ซึ่งสามารถหาได้โดยการค้นหาในกูเกิ้ลว่า "ip ของฉัน" จากเครื่องของโฮสต์ join.info = คุณสามารถใส่ [accent]IP ของเซิร์ฟเวอร์[]เพื่อที่จะเชื่อมต่อหรือค้นหาเซิร์ฟเวอร์ เซิร์ฟเวอร์ที่ใช้[accent]เครือข่ายท้องถิ่น[]จะสามารถเชื่อมโดยใช้\n LAN หรือ WAN ก็ได้\n\n[lightgray]ถ้าคุณอยากเชื่อมต่อกับใครบางคนโดยใช้ IP คุณต้องไปถามโฮสต์เอาว่า IP ของโฮสต์คืออะไร ซึ่งสามารถหาได้โดยการค้นหาในกูเกิ้ลว่า "ip ของฉัน" จากเครื่องของโฮสต์
hostserver = โฮสต์เกมผู้เล่นหลายคน hostserver = โฮสต์เกมผู้เล่นหลายคน
@@ -214,6 +215,7 @@ hosts.none = [lightgray]ไม่พบเซิร์ฟเวอร์ท้
host.invalid = [scarlet]ไม่สามารถเชื่อมต่อกับโฮสต์ได้ host.invalid = [scarlet]ไม่สามารถเชื่อมต่อกับโฮสต์ได้
servers.local = เซิร์ฟเวอร์ท้องถิ่น servers.local = เซิร์ฟเวอร์ท้องถิ่น
servers.local.steam = เกมสาธารณะ & เซิร์ฟเวอร์ท้องถิ่น
servers.remote = เซิร์ฟเวอร์ทางไกล servers.remote = เซิร์ฟเวอร์ทางไกล
servers.global = เซิร์ฟเวอร์ของชุมชน servers.global = เซิร์ฟเวอร์ของชุมชน
@@ -255,14 +257,14 @@ disconnect.error = การเชื่อมต่อมีปัญหา
disconnect.closed = การเชื่อมต่อถูกปิดแล้ว disconnect.closed = การเชื่อมต่อถูกปิดแล้ว
disconnect.timeout = หมดเวลา disconnect.timeout = หมดเวลา
disconnect.data = การโหลดข้อมูลของโลกผิดพลาด! disconnect.data = การโหลดข้อมูลของโลกผิดพลาด!
cantconnect = ไม่สามารถเข้าร่วมเซิฟเวอร์ ([accent]{0}[]) cantconnect = ไม่สามารถเข้าร่วมเซิร์ฟเวอร์ ([accent]{0}[])
connecting = [accent]กำลังเชื่อมต่อ... connecting = [accent]กำลังเชื่อมต่อ...
reconnecting = [accent]กำลังเชื่อมต่อใหม่... reconnecting = [accent]กำลังเชื่อมต่อใหม่...
connecting.data = [accent]กำลังโหลดข้อมูลของโลก ... connecting.data = [accent]กำลังโหลดข้อมูลของโลก ...
server.port = พอร์ต: server.port = พอร์ต:
server.addressinuse = มีคนใช้ที่อยู่นี้แล้ว! server.addressinuse = มีคนใช้ที่อยู่นี้แล้ว!
server.invalidport = เลขพอร์ตไม่ถูกต้อง! server.invalidport = เลขพอร์ตไม่ถูกต้อง!
server.error = [crimson]การโฮสต์เซิฟเวอร์ผิดพลาด server.error = [crimson]การโฮสต์เซิร์ฟเวอร์ผิดพลาด
save.new = เซฟใหม่ save.new = เซฟใหม่
save.overwrite = คุณแน่ใจหรือว่าจะเซฟทับ\nเซฟนี้? save.overwrite = คุณแน่ใจหรือว่าจะเซฟทับ\nเซฟนี้?
overwrite = เขียนทับ overwrite = เขียนทับ
@@ -340,14 +342,14 @@ loadimage = โหลดรูป
saveimage = เซฟรูป saveimage = เซฟรูป
unknown = ไม่ทราบ unknown = ไม่ทราบ
custom = กำหนดเอง custom = กำหนดเอง
builtin = Built-In builtin = ติดตัว
map.delete.confirm = คุณแน่ใจหรือว่าจะลบแมพนี้? การกระทำครั้งนี้ไม่สามารถย้อนกลับได้! map.delete.confirm = คุณแน่ใจหรือว่าจะลบแมพนี้? การกระทำครั้งนี้ไม่สามารถย้อนกลับได้!
map.random = [accent]สุ่มแมพ map.random = [accent]สุ่มแมพ
map.nospawn = แมพนี้ไม่มีแกนกลางให้ผู้เล่นเกิด! กรุณาใส่แกนกลาง[accent]สีเหลือง[] ในตัวแก้ไข map.nospawn = แมพนี้ไม่มีแกนกลางให้ผู้เล่นเกิด! กรุณาใส่แกนกลาง[accent]สีเหลือง[] ในตัวแก้ไข
map.nospawn.pvp = แมพนี้ไม่มีแกนกลางของศัตรูสำหรับให้ผู้เล่นเกิด! กรุณาใส่แกนกลาง[scarlet]ที่ไม่ใช่สีส้ม[] ในตัวแก้ไข map.nospawn.pvp = แมพนี้ไม่มีแกนกลางของศัตรูสำหรับให้ผู้เล่นเกิด! กรุณาใส่แกนกลาง[scarlet]ที่ไม่ใช่สีส้ม[] ในตัวแก้ไข
map.nospawn.attack = แมพนี้ไม่มีแกนกลางของศัตรูสำหรับให้ผู้เล่นโจมตี! กรุณาใส่แกนกลาง[scarlet]สีแดง[] ในตัวแก้ไข map.nospawn.attack = แมพนี้ไม่มีแกนกลางของศัตรูสำหรับให้ผู้เล่นโจมตี! กรุณาใส่แกนกลาง[scarlet]สีแดง[] ในตัวแก้ไข
map.invalid = โหลดแมพผิดพลาด: ไฟล์แมพเสียหายหรือไม่ถูกต้อง map.invalid = โหลดแมพผิดพลาด: ไฟล์แมพเสียหายหรือไม่ถูกต้อง
workshop.update = อัเดตไอเท็ม workshop.update = อัเดตไอเท็ม
workshop.error = ผิดพลาดในการนำเวิร์กช็อปมา รายละเอียดดังนี้: {0} workshop.error = ผิดพลาดในการนำเวิร์กช็อปมา รายละเอียดดังนี้: {0}
map.publish.confirm = คุณแน่ใจหรือว่าจะเผยแพร่แมพนี้?\n\n[lightgray]คุณต้องแน่ใจก่อนว่าคุณเห็นด้วยกับ Workshop EULA, มิฉนั้นแมพจะไม่ปรากฏ! map.publish.confirm = คุณแน่ใจหรือว่าจะเผยแพร่แมพนี้?\n\n[lightgray]คุณต้องแน่ใจก่อนว่าคุณเห็นด้วยกับ Workshop EULA, มิฉนั้นแมพจะไม่ปรากฏ!
workshop.menu = เลือกว่าจะทำอะไรกับไอเท็มนี้ workshop.menu = เลือกว่าจะทำอะไรกับไอเท็มนี้
@@ -357,7 +359,7 @@ eula = Steam EULA
missing = ไอเท็มนี้ถูกลบหรือย้าย\n[lightgray]ยกเลิกการเชื่อมต่อของหน้ารายการเวิร์กช็อปแล้ว missing = ไอเท็มนี้ถูกลบหรือย้าย\n[lightgray]ยกเลิกการเชื่อมต่อของหน้ารายการเวิร์กช็อปแล้ว
publishing = [accent]กำลังเผยแพร่... publishing = [accent]กำลังเผยแพร่...
publish.confirm = คุณแน่ใจหรือว่าจะเผยแพร่สิ่งนี้?\n\n[lightgray]คุณต้องแน่ใจก่อนว่าคุณเห็นด้วยกับ Workshop EULA มิฉนั้นไอเท็มของคุณจะไม่ปรากฏ! publish.confirm = คุณแน่ใจหรือว่าจะเผยแพร่สิ่งนี้?\n\n[lightgray]คุณต้องแน่ใจก่อนว่าคุณเห็นด้วยกับ Workshop EULA มิฉนั้นไอเท็มของคุณจะไม่ปรากฏ!
publish.error = การเผยแพร่ไอเท็มดังต่อไปนี้ผิดพลาด: {0} publish.error = เกิดข้อผิดพลาดการเผยแพร่ไอเท็มดังต่อไปนี้: {0}
steam.error = ไม่สามารถเริ่ม Steam service ได้\nError: {0} steam.error = ไม่สามารถเริ่ม Steam service ได้\nError: {0}
editor.brush = แปรง editor.brush = แปรง
@@ -401,7 +403,7 @@ editor.default = [lightgray]<ค่าเริ่มต้น>
details = รายละเอียด... details = รายละเอียด...
edit = แก้ไข... edit = แก้ไข...
editor.name = ชื่อ: editor.name = ชื่อ:
editor.spawn = ปาวน์ยูนิต editor.spawn = ร้างยูนิต
editor.removeunit = ลบยูนิต editor.removeunit = ลบยูนิต
editor.teams = ทีม editor.teams = ทีม
editor.errorload = โหลดไฟล์ผิดพลาด editor.errorload = โหลดไฟล์ผิดพลาด
@@ -411,7 +413,7 @@ editor.errorlegacy = แมพนี้เก่าเกินไปและ
editor.errornot = นี่ไม่ใช้ไฟล์แมพ editor.errornot = นี่ไม่ใช้ไฟล์แมพ
editor.errorheader = ไฟล์แมพนี้เสียหรือไม่ถูกต้อง editor.errorheader = ไฟล์แมพนี้เสียหรือไม่ถูกต้อง
editor.errorname = แมพไม่มีการกำหนดชื่อ คุณกำลังโหลดไฟล์เซฟอยู่หรือป่าว? editor.errorname = แมพไม่มีการกำหนดชื่อ คุณกำลังโหลดไฟล์เซฟอยู่หรือป่าว?
editor.update = อัเดต editor.update = อัเดต
editor.randomize = สุ่ม editor.randomize = สุ่ม
editor.apply = ใช้ editor.apply = ใช้
editor.generate = การกำเนิด editor.generate = การกำเนิด
@@ -420,8 +422,8 @@ editor.loadmap = โหลดแมพ
editor.savemap = เซฟแมพ editor.savemap = เซฟแมพ
editor.saved = เซฟเรียบร้อย! editor.saved = เซฟเรียบร้อย!
editor.save.noname = แมพของคุณไม่มีชื่อ! สามารถตั้งชื่อได้ในเมนู 'ข้อมูลแมพ' editor.save.noname = แมพของคุณไม่มีชื่อ! สามารถตั้งชื่อได้ในเมนู 'ข้อมูลแมพ'
editor.save.overwrite = แมพของคุณไปทับกับแมพ built-in! เปลี่ยนชื่อได้ในเมนู 'ข้อมูลแมพ' editor.save.overwrite = แมพของคุณไปทับกับแมพติดตัว! เปลี่ยนชื่อได้ในเมนู 'ข้อมูลแมพ'
editor.import.exists = [scarlet]ไม่สามารถนำเข้าได้:[] มีแมพ built-in ที่ชื่อ '{0}' อยู่แล้ว! editor.import.exists = [scarlet]ไม่สามารถนำเข้าได้:[] มีแมพติดตัวที่ชื่อ '{0}' อยู่แล้ว!
editor.import = นำเข้า... editor.import = นำเข้า...
editor.importmap = นำเข้าแมพ editor.importmap = นำเข้าแมพ
editor.importmap.description = นำเข้าแมพที่มีอยู่แล้ว editor.importmap.description = นำเข้าแมพที่มีอยู่แล้ว
@@ -521,7 +523,7 @@ mapeditor = แก้ไขแมพ
abandon = ละทิ้ง abandon = ละทิ้ง
abandon.text = โซนนี้และทรัพยากรทั้งหมดจะถูกยืดไปเป็นของศัตรู abandon.text = โซนนี้และทรัพยากรทั้งหมดจะถูกยืดไปเป็นของศัตรู
locked = ล็อ locked = ล็อ
complete = [lightgray]ต้องมี: complete = [lightgray]ต้องมี:
requirement.wave = ถึงคลื่นที่ {0} ใน {1} requirement.wave = ถึงคลื่นที่ {0} ใน {1}
requirement.core = ทำลายแกนกลางของศัตรูใน {0} requirement.core = ทำลายแกนกลางของศัตรูใน {0}
@@ -545,15 +547,15 @@ add = เพิ่ม...
guardian = การ์เดียน guardian = การ์เดียน
connectfail = [crimson]การเชื่อมต่อผิดพลาด:\n\n[accent]{0} connectfail = [crimson]การเชื่อมต่อผิดพลาด:\n\n[accent]{0}
error.unreachable = เซิฟเวอร์ไม่สามารถเข้าถึงได้\nแน่ใจหรือว่าที่อยู่เขียนถูกต้อง? error.unreachable = เซิร์ฟเวอร์ไม่สามารถเข้าถึงได้\nแน่ใจหรือว่าที่อยู่เขียนถูกต้อง?
error.invalidaddress = ที่อยู่ไม่ถูกต้อง error.invalidaddress = ที่อยู่ไม่ถูกต้อง
error.timedout = Timed out!\nเช็คให้แน่ใจว่า port forwarding ของโฮสต์เปิดอยู่และที่อยู่นั้นถูกต้อง! error.timedout = Timed out!\nเช็คให้แน่ใจว่า port forwarding ของโฮสต์เปิดอยู่และที่อยู่นั้นถูกต้อง!
error.mismatch = Packet error:\nอาจเกิดจากเวอร์ชั่นของ ไคลเอนต์/เซิร์ฟเวอร์ ไม่ตรงกัน\nเช็คให้แน่ใจว่าเซิฟเวอร์ใช้ Mindustry เวอร์ชั่นล่าสุด! error.mismatch = Packet error:\nอาจเกิดจากเวอร์ชั่นของ ไคลเอนต์/เซิร์ฟเวอร์ ไม่ตรงกัน\nเช็คให้แน่ใจว่าเซิร์ฟเวอร์ใช้ Mindustry เวอร์ชั่นล่าสุด!
error.alreadyconnected = เชื่อมต่ออยู่แล้ว error.alreadyconnected = เชื่อมต่ออยู่แล้ว
error.mapnotfound = ไม่พบไฟล์แมพ error.mapnotfound = ไม่พบไฟล์แมพ
error.io = Network I/O error error.io = Network I/O error
error.any = Error: เครือข่ายที่ไม่รู้จัก error.any = Error: เครือข่ายที่ไม่รู้จัก
error.bloom = ไม่สามารถเริ่มต้น bloom ได้\nอุปกรณ์ของคุณอาจไม่รองรับ error.bloom = ไม่สามารถเริ่มต้นบลูมได้\nอุปกรณ์ของคุณอาจไม่รองรับ
weather.rain.name = ฝน weather.rain.name = ฝน
weather.snow.name = หิมะ weather.snow.name = หิมะ
@@ -565,6 +567,7 @@ sectors.unexplored = [lightgray]ยังไม่ได้สำรวจ
sectors.resources = ทรัพยากร: sectors.resources = ทรัพยากร:
sectors.production = การผลิต: sectors.production = การผลิต:
sectors.export = การส่งออก: sectors.export = การส่งออก:
sectors.import = การนำเข้า:
sectors.time = เวลา: sectors.time = เวลา:
sectors.threat = ภัยคุกคาม: sectors.threat = ภัยคุกคาม:
sectors.wave = คลื่น: sectors.wave = คลื่น:
@@ -577,7 +580,7 @@ sectors.rename = เปลี่ยนชื่อเซ็กเตอร์
sectors.enemybase = [scarlet]ฐานทัพศัตรู sectors.enemybase = [scarlet]ฐานทัพศัตรู
sectors.vulnerable = [scarlet]เสี่ยงภัย sectors.vulnerable = [scarlet]เสี่ยงภัย
sectors.underattack = [scarlet]เซ็กเตอร์ถูกโจมตี! เสียหาย [accent]{0}% sectors.underattack = [scarlet]เซ็กเตอร์ถูกโจมตี! เสียหาย [accent]{0}%
sectors.survives = [accent]จะอยู่รอดอีก {0} คลื่น sectors.survives = [accent]จะอยู่รอดได้ {0} คลื่น
sectors.go = ไป sectors.go = ไป
sector.curcapture = ยึดครองแล้ว sector.curcapture = ยึดครองแล้ว
sector.curlost = เราเสียเซ็กเตอร์! sector.curlost = เราเสียเซ็กเตอร์!
@@ -655,10 +658,10 @@ settings.resetKey = รีเซ็ต
settings.controls = การควบคุม settings.controls = การควบคุม
settings.game = เกม settings.game = เกม
settings.sound = เสียง settings.sound = เสียง
settings.graphics = กราฟฟิค settings.graphics = กราฟิก
settings.cleardata = เคลียร์ข้อมูลเกม... settings.cleardata = เคลียร์ข้อมูลเกม...
settings.clear.confirm = คุณแน่ใจหรือว่าจะเคลียร์ข้อมูลเกม?\nสิ่งที่ทำไปแล้วจะไม่สามารถย้อนกลับได้! settings.clear.confirm = คุณแน่ใจหรือว่าจะเคลียร์ข้อมูลเกม?\nสิ่งที่ทำไปแล้วจะไม่สามารถย้อนกลับได้!
settings.clearall.confirm = [scarlet]คำเตือน![]\nการกระทำนี้จะลบข้อมูลทั้งหมด นั้นรวมไปถึงเซฟ แมพ การวิจัยแล้วและก็ปุ่มควบุม\nเมื่อคุณกด 'โอเค' เกมจะลบข้อมูลทุกอย่างและออกโดยอัตโนมัติ settings.clearall.confirm = [scarlet]คำเตือน![]\nการกระทำนี้จะลบข้อมูลทั้งหมด นั้นรวมไปถึงเซฟ แมพ การวิจัยแล้วและก็ปุ่มควบุม\nเมื่อคุณกด 'โอเค' เกมจะลบข้อมูลทุกอย่างและออกโดยอัตโนมัติ
settings.clearsaves.confirm = คุณแน่ใจหรือว่าคุณต้องการเคลียร์เซฟทั้งหมด? settings.clearsaves.confirm = คุณแน่ใจหรือว่าคุณต้องการเคลียร์เซฟทั้งหมด?
settings.clearsaves = เคลียร์เซฟ settings.clearsaves = เคลียร์เซฟ
settings.clearresearch = เคลียร์การวิจัย settings.clearresearch = เคลียร์การวิจัย
@@ -715,7 +718,7 @@ stat.speedincrease = เพิ่มความเร็ว
stat.range = ระยะ stat.range = ระยะ
stat.drilltier = แร่ที่ขุดได้ stat.drilltier = แร่ที่ขุดได้
stat.drillspeed = ความเร็วการขุดเฉลี่ย stat.drillspeed = ความเร็วการขุดเฉลี่ย
stat.boosteffect = อฟเฟ็คของบูสต์ stat.boosteffect = อฟเฟกต์ของบูสต์
stat.maxunits = จำนวนยูนิตสูงสุด stat.maxunits = จำนวนยูนิตสูงสุด
stat.armor = เกราะ stat.armor = เกราะ
stat.health = พลังชีวิต stat.health = พลังชีวิต
@@ -724,7 +727,7 @@ stat.maxconsecutive = ติดต่อกันสูงสุด
stat.buildcost = ใช้ stat.buildcost = ใช้
stat.inaccuracy = ความคลาดเคลื่อน stat.inaccuracy = ความคลาดเคลื่อน
stat.shots = นัด stat.shots = นัด
stat.reload = นัด/วินาที stat.reload = อัตราการยิง
stat.ammo = กระสุน stat.ammo = กระสุน
stat.shieldhealth = พลังชีวิตโล่ stat.shieldhealth = พลังชีวิตโล่
stat.cooldowntime = เวลาคูลดาวน์ stat.cooldowntime = เวลาคูลดาวน์
@@ -747,7 +750,7 @@ stat.commandlimit = จำนวนยูนิตที่สั่งการ
stat.abilities = ทักษะ stat.abilities = ทักษะ
stat.canboost = สามารถบูสต์ stat.canboost = สามารถบูสต์
stat.flying = บินได้ stat.flying = บินได้
stat.ammouse = ใช้กระสุน stat.ammouse = การใช้กระสุน
stat.damagemultiplier = พหุคูณดาเมจ stat.damagemultiplier = พหุคูณดาเมจ
stat.healthmultiplier = พหุคูณพลังชีวิต stat.healthmultiplier = พหุคูณพลังชีวิต
stat.speedmultiplier = พหุคูณความเร็ว stat.speedmultiplier = พหุคูณความเร็ว
@@ -758,7 +761,7 @@ stat.healing = การรักษา
ability.forcefield = โล่พลังงาน ability.forcefield = โล่พลังงาน
ability.repairfield = สนามซ่อมแซม ability.repairfield = สนามซ่อมแซม
ability.statusfield = สนามเอฟเฟกต์ {0} ability.statusfield = {0} สนามเอฟเฟกต์
ability.unitspawn = โรงงาน{0} ability.unitspawn = โรงงาน{0}
ability.shieldregenfield = สนามรักษาโล่ ability.shieldregenfield = สนามรักษาโล่
ability.movelightning = ปล่อยสายฟ้าเมื่อเคลื่อนที่ ability.movelightning = ปล่อยสายฟ้าเมื่อเคลื่อนที่
@@ -793,7 +796,7 @@ 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.homing = [stat]ติดตามตัว bullet.homing = [stat]ติดตามตัว
bullet.frag = [stat]กระจาย bullet.frags = [stat]{0}[lightgray]x กระจาย กระสุน:
bullet.lightning = [stat]{0}[lightgray]x สายฟ้า ~ [stat]{1}[lightgray] ดาเมจ bullet.lightning = [stat]{0}[lightgray]x สายฟ้า ~ [stat]{1}[lightgray] ดาเมจ
bullet.buildingdamage = [lightgray]ดาเมจต่อสิ่งก่อสร้าง [stat]{0}%[lightgray] bullet.buildingdamage = [lightgray]ดาเมจต่อสิ่งก่อสร้าง [stat]{0}%[lightgray]
bullet.knockback = [stat]{0}[lightgray] ดันกลับ bullet.knockback = [stat]{0}[lightgray] ดันกลับ
@@ -806,6 +809,7 @@ bullet.reload = [lightgray]ความเร็วการยิง: [stat]{0}
unit.blocks = บล็อก unit.blocks = บล็อก
unit.blockssquared = บล็อก² unit.blockssquared = บล็อก²
unit.powersecond = หน่วย/วินาที unit.powersecond = หน่วย/วินาที
unit.tilessecond = ช่อง/วินาที
unit.liquidsecond = หน่วย/วินาที unit.liquidsecond = หน่วย/วินาที
unit.itemssecond = ไอเท็ม/วินาที unit.itemssecond = ไอเท็ม/วินาที
unit.liquidunits = หน่วยของเหลว unit.liquidunits = หน่วยของเหลว
@@ -822,7 +826,7 @@ unit.items = ไอเท็ม
unit.thousands = k unit.thousands = k
unit.millions = [] []ล้าน unit.millions = [] []ล้าน
unit.billions = [] []พันล้าน unit.billions = [] []พันล้าน
unit.pershot = [] []กระสุน/การยิง unit.pershot = [] []ไอเท็ม/การยิง
category.purpose = วัตถุประสงค์ category.purpose = วัตถุประสงค์
category.general = ทั่วไป category.general = ทั่วไป
category.power = พลังงาน category.power = พลังงาน
@@ -831,20 +835,18 @@ category.items = ไอเท็ม
category.crafting = การผลิต category.crafting = การผลิต
category.function = ฟังค์ชั่น category.function = ฟังค์ชั่น
category.optional = ทางเลือกการเพิ่มประสิทธิภาพ category.optional = ทางเลือกการเพิ่มประสิทธิภาพ
setting.landscape.name = ล็อภูมิทัศน์แนวนอน setting.landscape.name = ล็อภูมิทัศน์แนวนอน
setting.shadows.name = เงา 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.logichints.name = คำแนะนำลอจิก
setting.flow.name = แสดงอัตราการไหลของทรัพยากร
setting.backgroundpause.name = หยุดในพื้นหลัง setting.backgroundpause.name = หยุดในพื้นหลัง
setting.buildautopause.name = หยุดสร้างชั่วคราวแบบอัตโนมัติ setting.buildautopause.name = หยุดสร้างชั่วคราวแบบอัตโนมัติ
setting.doubletapmine.name = แตะสองครั้งเพื่อขุด setting.doubletapmine.name = แตะสองครั้งเพื่อขุด
setting.modcrashdisable.name = ปิดม็อดเมื่อเกมขัดข้อง setting.modcrashdisable.name = ปิดม็อดเมื่อเกมขัดข้อง
setting.animatedwater.name = แอนิเมชั่นพื้นและน้ำ setting.animatedwater.name = แอนิเมชั่นพื้นและน้ำ
setting.animatedshields.name = แอนิเมชั่นเกราะ setting.animatedshields.name = แอนิเมชั่นเกราะ
setting.antialias.name = Antialias[lightgray] (จำเป็นต้องรีสตาร์ท)[]
setting.playerindicators.name = ตัวบอกผู้เล่น setting.playerindicators.name = ตัวบอกผู้เล่น
setting.indicators.name = ตัวบอกศัตรู/พักพวก setting.indicators.name = ตัวบอกศัตรู/พักพวก
setting.autotarget.name = เล็งเป้าอัตโนมัติ setting.autotarget.name = เล็งเป้าอัตโนมัติ
@@ -853,7 +855,8 @@ setting.touchscreen.name = การควบคุมแบบหน้าจ
setting.fpscap.name = FPS สูงสุด setting.fpscap.name = FPS สูงสุด
setting.fpscap.none = setting.fpscap.none =
setting.fpscap.text = {0} FPS setting.fpscap.text = {0} FPS
setting.uiscale.name = ขนาด UI[lightgray] (จำเป็นต้องรีสตาร์ท)[] setting.uiscale.name = อัตราขนาด UI
setting.uiscale.description = จำเป็นต้องรีสตาร์ทเพื่อใส่การเปลี่ยนแปลง
setting.swapdiagonal.name = การวางเป็นเส้นทแยงเสมอ setting.swapdiagonal.name = การวางเป็นเส้นทแยงเสมอ
setting.difficulty.training = ฝึกซ้อม setting.difficulty.training = ฝึกซ้อม
setting.difficulty.easy = ง่าย setting.difficulty.easy = ง่าย
@@ -862,16 +865,17 @@ setting.difficulty.hard = ยาก
setting.difficulty.insane = ยากมาก setting.difficulty.insane = ยากมาก
setting.difficulty.name = ระดับความยาก: setting.difficulty.name = ระดับความยาก:
setting.screenshake.name = การสั่นของจอ setting.screenshake.name = การสั่นของจอ
setting.effects.name = แสดงเอฟเฟ็ setting.effects.name = แสดงเอฟเฟ็กต์
setting.destroyedblocks.name = แสดงบล็อกที่ถูกทำลาย setting.destroyedblocks.name = แสดงบล็อกที่ถูกทำลาย
setting.blockstatus.name = แสดงสเตตัสของบล็อก setting.blockstatus.name = แสดงสถานะของบล็อก
setting.conveyorpathfinding.name = ตรวจสอบเส้นทางการวางอัจฉริยะ setting.conveyorpathfinding.name = ตรวจสอบเส้นทางการวางอัจฉริยะ
setting.sensitivity.name = ความเร็วของตัวควบคุม setting.sensitivity.name = ความเร็วของตัวควบคุม
setting.saveinterval.name = ระยะห่างระหว่างการเซฟ setting.saveinterval.name = ระยะห่างระหว่างการเซฟ
setting.seconds = {0} วินาที setting.seconds = {0} วินาที
setting.milliseconds = {0} มิลลิวินาที setting.milliseconds = {0} มิลลิวินาที
setting.fullscreen.name = เต็มจอ setting.fullscreen.name = เต็มจอ
setting.borderlesswindow.name = วินโดว์แบบไร้ขอบ[lightgray] (อาจจะต้องรีตาร์ท) setting.borderlesswindow.name = หน้าต่างแบบไร้ขอบ
setting.borderlesswindow.description = อาจจะต้องรีสตาร์ทเพื่อใส่การเปลี่ยนแปลง
setting.fps.name = แสดง FPS และ Ping setting.fps.name = แสดง FPS และ Ping
setting.smoothcamera.name = กล้องแบบลื่นไหล setting.smoothcamera.name = กล้องแบบลื่นไหล
setting.vsync.name = VSync setting.vsync.name = VSync
@@ -887,19 +891,19 @@ setting.sfxvol.name = ระดับเสียง SFX
setting.mutesound.name = ปิดเสียง setting.mutesound.name = ปิดเสียง
setting.crashreport.name = ส่งรายงานการแครชแบบไม่ระบุตัวตน setting.crashreport.name = ส่งรายงานการแครชแบบไม่ระบุตัวตน
setting.savecreate.name = สร้างเซฟโดยอัตโนมัติ setting.savecreate.name = สร้างเซฟโดยอัตโนมัติ
setting.publichost.name = การมองเห็นเซิฟเวอร์สาธารณะ setting.publichost.name = การมองเห็นเซิร์ฟเวอร์สาธารณะ
setting.playerlimit.name = จำกัดผู้เล่น setting.playerlimit.name = จำกัดผู้เล่น
setting.chatopacity.name = ความโปร่งแสงของแชท setting.chatopacity.name = ความโปร่งแสงของแชท
setting.lasersopacity.name = ความโปร่งแสงของเลเซอร์พลังงาน setting.lasersopacity.name = ความโปร่งแสงของเลเซอร์พลังงาน
setting.bridgeopacity.name = ความโปร่งแสงของสะพาน setting.bridgeopacity.name = ความโปร่งแสงของสะพาน
setting.playerchat.name = แสดงบับเบิ้ลแชทของผู้เล่น setting.playerchat.name = แสดงบับเบิ้ลแชทของผู้เล่น
setting.showweather.name = แสดงแกรฟฟิกสภาพอากาศ setting.showweather.name = แสดงแกรฟฟิกสภาพอากาศ
public.confirm = คุณต้องการให้เกมของคุณเปิดเป็นสาธารณะหรือไม่?\n[accent]ทุกคนจะสามารถเข้าร่วมเกมของคุณได้\n[lightgray]คุณสามารถเปลี่ยนการตั้งค่านี้ได้ที่ ตั้งค่า->เกม->การมองเห็นเซิฟเวอร์สาธารณะ public.confirm = คุณต้องการให้เกมของคุณเปิดเป็นสาธารณะหรือไม่?\n[accent]ทุกคนจะสามารถเข้าร่วมเกมของคุณได้\n[lightgray]คุณสามารถเปลี่ยนการตั้งค่านี้ได้ที่ ตั้งค่า->เกม->การมองเห็นเซิร์ฟเวอร์สาธารณะ
public.confirm.really = หากคุณอยากเล่นกับเล่นกับเพื่อน ใช้ [green]Invite Friend[] ดีกว่า แทนที่จะใช้ [scarlet]Public server[]!\nคุณแน่ใจนะว่าจะเปลี่ยนเกมคุณเป็น[scarlet]สาธารณะ[]? public.confirm.really = หากคุณอยากเล่นกับเล่นกับเพื่อน ใช้[green]ชวนเพื่อน[]ดีกว่า แทนที่จะใช้[scarlet]เซิร์ฟเวอร์สาธารณะ[]!\nคุณแน่ใจนะว่าจะเปลี่ยนเกมคุณเป็น[scarlet]สาธารณะ[]?
public.beta = เกมเวอร์ชั่นเบต้าไม่สามารถเปิดเซิฟเวอร์สาธารณะได้ public.beta = เกมเวอร์ชั่นเบต้าไม่สามารถเปิดเซิร์ฟเวอร์สาธารณะได้
uiscale.reset = ขนาดของ UI มีการเปลี่ยนแปลง\nกด "โอเค" เพื่อยืนยันขนาด UI นี้\n[scarlet]เปลี่ยนกลับไปเป็นแบบเดิมและออกในอีก[accent] {0}[] วินาที... uiscale.reset = อัตราขนาดของ UI ได้มีการเปลี่ยนแปลง\nกด "โอเค" เพื่อยืนยันขนาด UI นี้\n[scarlet]จะเปลี่ยนกลับไปเป็นแบบเดิมและออกในอีก[accent] {0}[] วินาที...
uiscale.cancel = ยกเลิกและออก uiscale.cancel = ยกเลิกและออก
setting.bloom.name = Bloom setting.bloom.name = บลูม
keybind.title = ตั้งค่าปุ่ม keybind.title = ตั้งค่าปุ่ม
keybinds.mobile = [scarlet]การตั้งค่าปุ่มส่วนใหญ่ไม่สามารถใช้ในมือถือได้ เฉพาะการเคลื่อนไหวพื้นฐานเท่านั้นที่ใช้ได้ keybinds.mobile = [scarlet]การตั้งค่าปุ่มส่วนใหญ่ไม่สามารถใช้ในมือถือได้ เฉพาะการเคลื่อนไหวพื้นฐานเท่านั้นที่ใช้ได้
category.general.name = ทั่วไป category.general.name = ทั่วไป
@@ -972,7 +976,7 @@ keybind.chat_history_prev.name = ประวัติแชทก่อนห
keybind.chat_history_next.name = ประวัติแชทถัดไป keybind.chat_history_next.name = ประวัติแชทถัดไป
keybind.chat_scroll.name = เลื่อนแชท keybind.chat_scroll.name = เลื่อนแชท
keybind.chat_mode.name = เปลี่ยนโหมดแชท keybind.chat_mode.name = เปลี่ยนโหมดแชท
keybind.drop_unit.name = ดรอปยูนิต keybind.drop_unit.name = วางยูนิต
keybind.zoom_minimap.name = ซูมมินิแมพ keybind.zoom_minimap.name = ซูมมินิแมพ
mode.help.title = คำอธิบายโหมด mode.help.title = คำอธิบายโหมด
mode.survival.name = เอาชีวิตรอด mode.survival.name = เอาชีวิตรอด
@@ -994,6 +998,7 @@ rules.wavetimer = นับถอยหลังการปล่อยคล
rules.waves = คลื่น rules.waves = คลื่น
rules.attack = โหมดการโจมตี rules.attack = โหมดการโจมตี
rules.buildai = AI ก่อสร้าง rules.buildai = AI ก่อสร้าง
rules.cleanupdeadteams = ลบล้างสิ่งก่อสร้างศัตรูที่พ่ายแพ้ (PvP)
rules.corecapture = ยืดแกนกลางเมื่อทำลาย rules.corecapture = ยืดแกนกลางเมื่อทำลาย
rules.polygoncoreprotection = รัศมีปกป้องแกนกลางแบบหลายเหลี่ยม rules.polygoncoreprotection = รัศมีปกป้องแกนกลางแบบหลายเหลี่ยม
rules.enemyCheat = AI (ทีมสีแดง) มีทรัพยากรไม่จำกัด rules.enemyCheat = AI (ทีมสีแดง) มีทรัพยากรไม่จำกัด
@@ -1085,7 +1090,7 @@ unit.sei.name = เซย์
unit.omura.name = โอมูร่า unit.omura.name = โอมูร่า
unit.retusa.name = เรธูซ่า unit.retusa.name = เรธูซ่า
unit.oxynoe.name = อ๊อกซิโนอ์ unit.oxynoe.name = อ๊อกซิโนอ์
unit.cyerce.name = ไซเยิส unit.cyerce.name = เซียรส์
unit.aegires.name = เอเกียเรส unit.aegires.name = เอเกียเรส
unit.navanax.name = นาวาแน็คซ์ unit.navanax.name = นาวาแน็คซ์
unit.alpha.name = อัลฟ่า unit.alpha.name = อัลฟ่า
@@ -1247,7 +1252,7 @@ block.wave.name = คลื่นน้ำ
block.tsunami.name = สึนามิ block.tsunami.name = สึนามิ
block.swarmer.name = สวอร์มเมอร์ block.swarmer.name = สวอร์มเมอร์
block.salvo.name = ซัลโว block.salvo.name = ซัลโว
block.ripple.name = ริปเปิล block.ripple.name = ริปเปิ
block.phase-conveyor.name = สายพานเฟส block.phase-conveyor.name = สายพานเฟส
block.bridge-conveyor.name = สะพานไอเท็ม block.bridge-conveyor.name = สะพานไอเท็ม
block.plastanium-compressor.name = เครื่องอัดพลาสตาเนี่ยม block.plastanium-compressor.name = เครื่องอัดพลาสตาเนี่ยม
@@ -1268,7 +1273,7 @@ block.bridge-conduit.name = สะพานของเหลว
block.rotary-pump.name = ปั๊มโรตารี่ block.rotary-pump.name = ปั๊มโรตารี่
block.thorium-reactor.name = เตาปฏิกรณ์ทอเรี่ยม block.thorium-reactor.name = เตาปฏิกรณ์ทอเรี่ยม
block.mass-driver.name = เครื่องโอนถ่ายมวล block.mass-driver.name = เครื่องโอนถ่ายมวล
block.blast-drill.name = เครื่องขุดระเบิดอากาศ block.blast-drill.name = เครื่องขุดแอร์บลาสต์
block.thermal-pump.name = ปั๊มความร้อน block.thermal-pump.name = ปั๊มความร้อน
block.thermal-generator.name = เครื่องกำเนิดไฟฟ้าจากความร้อน block.thermal-generator.name = เครื่องกำเนิดไฟฟ้าจากความร้อน
block.alloy-smelter.name = เครื่องหลอมอัลลอย block.alloy-smelter.name = เครื่องหลอมอัลลอย
@@ -1288,7 +1293,6 @@ block.meltdown.name = เมลท์ดาวน์
block.foreshadow.name = ฟอร์ชาโดว์ block.foreshadow.name = ฟอร์ชาโดว์
block.container.name = ตู้เก็บของ block.container.name = ตู้เก็บของ
block.launch-pad.name = ฐานส่งของ block.launch-pad.name = ฐานส่งของ
block.launch-pad-large.name = ฐานส่งของขนาดใหญ่
block.segment.name = เซ็กเมนต์ block.segment.name = เซ็กเมนต์
block.command-center.name = ศูนย์ควบคุม block.command-center.name = ศูนย์ควบคุม
block.ground-factory.name = โรงงานยูนิตพื้นดิน block.ground-factory.name = โรงงานยูนิตพื้นดิน
@@ -1309,11 +1313,11 @@ block.payload-source.name = จุดกำเนิดสิ่งบรรท
block.disassembler.name = เครื่องถอดแยกส่วนประกอบ block.disassembler.name = เครื่องถอดแยกส่วนประกอบ
block.silicon-crucible.name = เบ้าหลอมซิลิคอน block.silicon-crucible.name = เบ้าหลอมซิลิคอน
block.overdrive-dome.name = โดมเร่งประสิทธิภาพ block.overdrive-dome.name = โดมเร่งประสิทธิภาพ
block.interplanetary-accelerator.name = ฐานเร่งความเร็วระหว่างดาวเคราะห์
#experimental, may be removed #experimental, may be removed
block.block-forge.name = เครื่องสร้างบล็อก block.block-forge.name = เครื่องสร้างบล็อก
block.block-loader.name = เครื่องโหลดบล็อก block.block-loader.name = เครื่องโหลดบล็อก
block.block-unloader.name = เครื่องถ่ายบล็อก block.block-unloader.name = เครื่องถ่ายบล็อก
block.interplanetary-accelerator.name = เครื่องส่งจรวดระหว่างดาวเคราะห์
block.switch.name = สวิตช์ block.switch.name = สวิตช์
block.micro-processor.name = ตัวประมวลผลขนาดเล็ก block.micro-processor.name = ตัวประมวลผลขนาดเล็ก
@@ -1343,11 +1347,12 @@ hint.desktopPause = กด [accent][[Space][] เพื่อหยุดชั
hint.placeDrill = เลือกเมนู \ue85e [accent]เครื่องขุด[] ในแท็บเมนูขวาล่าง แล้วเลือก \uf870 [accent]เครื่องขุด[] แล้วกดที่แร่ทองแดงเพื่อวาง hint.placeDrill = เลือกเมนู \ue85e [accent]เครื่องขุด[] ในแท็บเมนูขวาล่าง แล้วเลือก \uf870 [accent]เครื่องขุด[] แล้วกดที่แร่ทองแดงเพื่อวาง
hint.placeDrill.mobile = เลือกเมนู \ue85e [accent]เครื่องขุด[] ในแท็บเมนูขวาล่าง แล้วเลือก \uf870 [accent]เครื่องขุด[] แล้วกดที่แร่ทองแดงเพื่อวาง\n\nกด \ue800 [accent]ติ้กถูก[] ที่ขวาล่างเพื่อยืนยัน hint.placeDrill.mobile = เลือกเมนู \ue85e [accent]เครื่องขุด[] ในแท็บเมนูขวาล่าง แล้วเลือก \uf870 [accent]เครื่องขุด[] แล้วกดที่แร่ทองแดงเพื่อวาง\n\nกด \ue800 [accent]ติ้กถูก[] ที่ขวาล่างเพื่อยืนยัน
hint.placeConveyor = สายพานจะย้ายไอเท็มจากเครื่องขุดไปยังบล็อกอื่นๆ เลือก \uf896 [accent]สายพาน[] จากแท็บ \ue814 [accent]การเคลื่อนย้าย[]\n\nคลิ๊กแล้วลากเพื่อวางหลายๆ สายพาน\n[accent]เลื่อน[]เพื่อหมุน hint.placeConveyor = สายพานจะย้ายไอเท็มจากเครื่องขุดไปยังบล็อกอื่นๆ เลือก \uf896 [accent]สายพาน[] จากแท็บ \ue814 [accent]การเคลื่อนย้าย[]\n\nคลิ๊กแล้วลากเพื่อวางหลายๆ สายพาน\n[accent]เลื่อน[]เพื่อหมุน
hint.placeConveyor.mobile = สายพานจะเคลื่อนย้ายไอเท็มจากที่ขุดไปยังบล็อกอื่นๆ เลือก \uf896 [accent]สายพาน[] จากแท็บ \ue814 [accent]การเคลื่อนย้าย[]\n\nเอานิ้วจิ้มลงไปสักแปบนึงแล้วลากเพื่อวางหลายๆ อัน hint.placeConveyor.mobile = สายพานจะเคลื่อนย้ายไอเท็มจากที่ขุดไปยังบล็อกอื่นๆ เลือก \uf896 [accent]สายพาน[] จากแท็บ \ue814 [accent]การเคลื่อนย้าย[]\n\nเอานิ้วจิ้มลงไปสักแปบนึงแล้วลากเพื่อวางหลายๆ อัน
hint.placeTurret = วาง \uf861 [accent]ป้อมปืน[] เพื่อป้องกันฐานทัพจากศัตรู\n\nป้อมปืนต้องมีกระสุน ในกรณีนี้ \uf838 ทองแดง\nใช้สายพานลากจากเครื่องขุดไปที่ป้อมปืนเพื่อเติมกระสุน hint.placeTurret = วาง \uf861 [accent]ป้อมปืน[] เพื่อป้องกันฐานทัพจากศัตรู\n\nป้อมปืนต้องมีกระสุน ในกรณีนี้ \uf838 ทองแดง\nใช้สายพานลากจากเครื่องขุดไปที่ป้อมปืนเพื่อเติมกระสุน
hint.breaking = [accent]คลิ๊กขวา[] แล้วลากเพื่อทำลายบล็อก hint.breaking = [accent]คลิ๊กขวา[] แล้วลากเพื่อทำลายบล็อก
hint.breaking.mobile = เปิดใช้ \ue817 [accent]ค้อน[] ตรงล่างขวาแล้วเลือกเพื่อทำลายบล็อก\n\nเอานิ้วจิ้มลงไปสักแปบนึงแล้วลากเพื่อเลือกหลายๆ อัน hint.breaking.mobile = เปิดใช้ \ue817 [accent]ค้อน[] ตรงล่างขวาแล้วเลือกเพื่อทำลายบล็อก\n\nเอานิ้วจิ้มลงไปสักแปบนึงแล้วลากเพื่อเลือกหลายๆ อัน
hint.blockInfo = ดูข้อมูลของบล็อกโดยการเลือกจาก[accent]เมนูการสร้าง[] แล้วกดที่รูป [accent][[?][] ตรงด้านขวา hint.blockInfo = ดูข้อมูลของบล็อกโดยการเลือกจาก[accent]เมนูการสร้าง[] แล้วกดที่รูป [accent][[?][] ตรงด้านขวา
hint.derelict = สิ่งก่อสร้างที่ถูก[accent]ทิ้งร้าง[]คือเศษซากพังทลายของฐานเก่าแก่ที่ไม่สามารถใช้งานได้แล้ว\n\nสิ่งก่อสร้างพวกนี้สามารถ[accent]ทุบทิ้ง[]เพื่อเก็บเกี่ยวทรัพยากรที่อยู่ในนั้นได้
hint.research = ใช้ปุ่ม \ue875 [accent]วิจัย[] เพื่อวิจัยเทคโนโลยีใหม่ๆ hint.research = ใช้ปุ่ม \ue875 [accent]วิจัย[] เพื่อวิจัยเทคโนโลยีใหม่ๆ
hint.research.mobile = ใช้ปุ่ม \ue875 [accent]วิจัย[] ใน \ue88c [accent]เมนู[] เพื่อวิจัยเทคโนโลยีใหม่ๆ hint.research.mobile = ใช้ปุ่ม \ue875 [accent]วิจัย[] ใน \ue88c [accent]เมนู[] เพื่อวิจัยเทคโนโลยีใหม่ๆ
hint.unitControl = กด [accent][[L-Ctrl][] ค้างไว้แล้วกด[accent]คลิ๊ก[]เพื่อควบคุมยานพวกพ้องหรือป้อมปืน hint.unitControl = กด [accent][[L-Ctrl][] ค้างไว้แล้วกด[accent]คลิ๊ก[]เพื่อควบคุมยานพวกพ้องหรือป้อมปืน
@@ -1361,12 +1366,12 @@ hint.boost = กด [accent][[L-Shift][] เพื่อบูสต์ข้า
hint.command = กด [accent][[G][] เพื่อสั่งการยูนิตข้างๆ ของตัว[accent]ชนิดคล้ายกัน[]จัดเป็นรูปแบบล้อมรอบคุณ\n\nถ้าจะสั่งการยูนิตพื้นดิน คุณต้องควบคุมยูนิตประเภทเดียวกันอยู่ก่อน hint.command = กด [accent][[G][] เพื่อสั่งการยูนิตข้างๆ ของตัว[accent]ชนิดคล้ายกัน[]จัดเป็นรูปแบบล้อมรอบคุณ\n\nถ้าจะสั่งการยูนิตพื้นดิน คุณต้องควบคุมยูนิตประเภทเดียวกันอยู่ก่อน
hint.command.mobile = [accent][[กดสองครั้ง][] ที่ตัวยูนิตของคุณเพื่อสั่งการยูนิตรอบข้างให้มารวมตัวกันเป็นวงล้อมรอบคุณ hint.command.mobile = [accent][[กดสองครั้ง][] ที่ตัวยูนิตของคุณเพื่อสั่งการยูนิตรอบข้างให้มารวมตัวกันเป็นวงล้อมรอบคุณ
hint.payloadPickup = กด [accent][[[] เพื่อหยิบบล็อกเล็กๆ หรือยูนิต hint.payloadPickup = กด [accent][[[] เพื่อหยิบบล็อกเล็กๆ หรือยูนิต
hint.payloadPickup.mobile = [accent]กดค้างไว้[] ที่บล็อกเล็กๆ หรือตัวยูนิตเพื่อหยิบขึ้นมา hint.payloadPickup.mobile = [accent]กดค้างไว้[]ที่บล็อกเล็กๆ หรือตัวยูนิตเพื่อหยิบขึ้นมา
hint.payloadDrop = กด [accent]][] เพื่อปล่อยสิ่งที่บรรทุกอยู่ hint.payloadDrop = กด [accent]][] เพื่อปล่อยสิ่งที่บรรทุกอยู่
hint.payloadDrop.mobile = [accent]กดค้างไว้[]ที่พื้นที่โล่งๆ เพื่อปล่อยสิ่งที่บรรทุกอยู่ hint.payloadDrop.mobile = [accent]กดค้างไว้[]ที่พื้นที่โล่งๆ เพื่อปล่อยสิ่งที่บรรทุกอยู่
hint.waveFire = ป้อมปืน[accent]คลื่นน้ำ[]หากมีน้ำเป็นกระสุนจะช่วยดับไฟรอบข้างให้อัตโนมัติ hint.waveFire = ป้อมปืน[accent]คลื่นน้ำ[]หากเติมน้ำเข้าไปจะช่วยดับไฟรอบข้างให้อัตโนมัติ
hint.generator = \uf879 [accent]เครื่องกำเนิดไฟฟ้าเผาไหม้[]จะเผาถ่านและส่งพลังงานไปยังบล็อกที่อยู่ใกล้ๆ\n\nระยะของพลังงานสามารถขยายได้ด้วย \uf87f [accent]ตัวจ่ายพลังงาน[] hint.generator = \uf879 [accent]เครื่องกำเนิดไฟฟ้าเผาไหม้[]จะเผาถ่านและส่งพลังงานไปยังบล็อกที่อยู่ใกล้ๆ\n\nระยะของพลังงานสามารถขยายได้ด้วย \uf87f [accent]ตัวจ่ายพลังงาน[]
hint.guardian = หน่วย[accent]การ์เดียน[]มีเกราะป้องกันหนาแน่น กระสุนเปราะบางอย่าง[accent]ทองแดง[]และ[accent]ตะกั่ว[][scarlet]ไม่มีประสิทธิภาพ[]\n\nควรใช้ป้อมปืนที่ดีกว่านี้หรือใช้ \uf835 [accent]กราไฟท์[]ใน \uf861ดูโอ/\uf859ซัลโวเป็นกระสุนเพื่อทำลายการ์เดียน hint.guardian = หน่วย[accent]การ์เดียน[]มีเกราะป้องกันหนาแน่น กระสุนเปราะบางอย่าง[accent]ทองแดง[]และ[accent]ตะกั่ว[][scarlet]ไม่มีประสิทธิภาพ[]\n\nควรใช้ป้อมปืนที่ดีกว่านี้หรือใช้ \uf835 [accent]กราไฟท์[]ใส่ใน \uf861 ดูโอ/ \uf859 ซัลโวเป็นกระสุนเพื่อทำลายการ์เดียน
hint.coreUpgrade = สามารถอัพเกรดแกนกลางได้โดย[accent]วางแกนกลางที่ใหญ่กว่าทับมัน[]\n\nวาง  [accent]แกนกลาง: ฟาวน์เดชั่น[]ทับ  [accent]แกนกลาง: ชาร์ด[] ต้องแน่ใจว่ารอบข้างมีที่ว่างก่อนจะวาง hint.coreUpgrade = สามารถอัพเกรดแกนกลางได้โดย[accent]วางแกนกลางที่ใหญ่กว่าทับมัน[]\n\nวาง  [accent]แกนกลาง: ฟาวน์เดชั่น[]ทับ  [accent]แกนกลาง: ชาร์ด[] ต้องแน่ใจว่ารอบข้างมีที่ว่างก่อนจะวาง
hint.presetLaunch = [accent]เซ็กเตอร์ลงจอด[]สีเทา อย่างเช่น[accent]ป่าหนาวแหน็บ[] สามารถลงจอดจากที่ไหนที่ได้ในแผนที่ พวกนั้นไม่จำเป็นต้องยืดครองเซ็กเตอร์รอบข้างเพื่อส่งแกนกลางไป\n\n[accent]เซ็กเตอร์ที่มีเลข[] อย่างเช่นอันนี้[accent]ไม่จำเป็น[]ต้องยืดครอง hint.presetLaunch = [accent]เซ็กเตอร์ลงจอด[]สีเทา อย่างเช่น[accent]ป่าหนาวแหน็บ[] สามารถลงจอดจากที่ไหนที่ได้ในแผนที่ พวกนั้นไม่จำเป็นต้องยืดครองเซ็กเตอร์รอบข้างเพื่อส่งแกนกลางไป\n\n[accent]เซ็กเตอร์ที่มีเลข[] อย่างเช่นอันนี้[accent]ไม่จำเป็น[]ต้องยืดครอง
hint.coreIncinerate = เมื่อแกนกลางมีจำนวนไอเท็มชนิดหนึ่งที่เต็ม ไอเท็มชนิดนั้นที่เข้ามาเพิ่มจะ[accent]ถูกเผา[] hint.coreIncinerate = เมื่อแกนกลางมีจำนวนไอเท็มชนิดหนึ่งที่เต็ม ไอเท็มชนิดนั้นที่เข้ามาเพิ่มจะ[accent]ถูกเผา[]
@@ -1386,9 +1391,9 @@ item.titanium.description = ใช้อย่างแพร่หลายใ
item.titanium.details = โลหะเบาซึ่งหายากตามธรรมชาติ เป็นโลหะที่แข็งแรงใช้ได้ จึงใช้กันอย่างแพร่หลายในการแปรรูปหรือสิ่งก่อสร้าง item.titanium.details = โลหะเบาซึ่งหายากตามธรรมชาติ เป็นโลหะที่แข็งแรงใช้ได้ จึงใช้กันอย่างแพร่หลายในการแปรรูปหรือสิ่งก่อสร้าง
item.thorium.description = ใช้ในการเสริมเกราะของสิ่งก่อสร้างต่างๆ หรือนำไปเป็นเป็นเชื้อเพลิงนิวเคลียร์ item.thorium.description = ใช้ในการเสริมเกราะของสิ่งก่อสร้างต่างๆ หรือนำไปเป็นเป็นเชื้อเพลิงนิวเคลียร์
item.thorium.details = แร่ธาตุที่หาได้ยากมากในธรรมชาติ เป็นแร่ธาตุที่ทั้งแข็งแกร่งและหนาแน่น จึงใช้กันอย่างแพร่หลายในสิ่งก่อสร้างคงทน มีคุณสมบัติพิเศษคือกัมมันตภาพรังสี ทำให้แร่ธาตุนี้อาจเป็นภัยหากใช้ในทางที่ผิด item.thorium.details = แร่ธาตุที่หาได้ยากมากในธรรมชาติ เป็นแร่ธาตุที่ทั้งแข็งแกร่งและหนาแน่น จึงใช้กันอย่างแพร่หลายในสิ่งก่อสร้างคงทน มีคุณสมบัติพิเศษคือกัมมันตภาพรังสี ทำให้แร่ธาตุนี้อาจเป็นภัยหากใช้ในทางที่ผิด
item.scrap.description = ใช้ในเตาหลอมแร่และเครื่องบดเพื่อเปลี่ยนเป็นวัสดุอื่นๆ item.scrap.description = ใช้ในเตาหลอมแร่และเครื่องบดอัดเพื่อเปลี่ยนเป็นวัสดุอื่นๆ
item.scrap.details = เศษที่เหลือจากสิ่งก่อสร้างและยูนิตเก่า มีร่องรอยของโลหะหลายชนิดอยู่ เกิดจากฐานทัพโบราณในสมัยสงครามเก่าแก่ถูกทำลาย ทำให้วัสดุต่างๆ พังลงมารวมกับ item.scrap.details = เศษที่เหลือจากสิ่งก่อสร้างและยูนิตเก่า มีร่องรอยของโลหะหลายชนิดอยู่ เกิดจากฐานทัพโบราณในสมัยสงครามเก่าแก่ถูกทำลาย ทำให้วัสดุต่างๆ พังลงมารวมกับ
item.silicon.description = ใช้ในแผงโซล่าเซลล์ อุปกรณ์อิเล็กทรอนิกที่ซับซ้อนหรือนำไปเป็นกระสุนติดตามตัวสำหรับป้อมปืน item.silicon.description = ใช้ในแผงโซล่าเซลล์ อุปกรณ์อิเล็กทรอนิกที่ซับซ้อน\nหรือนำไปเป็นกระสุนติดตามตัวสำหรับป้อมปืน
item.silicon.details = วัสดุกึ่งตัวนำที่มีประโยชน์มาก ผลิตจากการเผาทรายและถ่านหินเข้าด้วยกัน ใช้ในสิ่งก่อสร้างแทบทุกชนิดตั้งแต่ต้นเกมยันปลายเกม จึงควรผลิตวัสดุนี้ให้เยอะที่สุด item.silicon.details = วัสดุกึ่งตัวนำที่มีประโยชน์มาก ผลิตจากการเผาทรายและถ่านหินเข้าด้วยกัน ใช้ในสิ่งก่อสร้างแทบทุกชนิดตั้งแต่ต้นเกมยันปลายเกม จึงควรผลิตวัสดุนี้ให้เยอะที่สุด
item.plastanium.description = ใช้ในอากาศยานขั้นสูง เป็นฉนวนกันความร้อนหรือนำไปเป็นกระสุนกระจาย item.plastanium.description = ใช้ในอากาศยานขั้นสูง เป็นฉนวนกันความร้อนหรือนำไปเป็นกระสุนกระจาย
item.plastanium.details = วัสดุที่เบาและดัดได้ ผลิตจากการอัดไทเทเนี่ยมและน้ำมันเข้าด้วยกัน item.plastanium.details = วัสดุที่เบาและดัดได้ ผลิตจากการอัดไทเทเนี่ยมและน้ำมันเข้าด้วยกัน
@@ -1410,13 +1415,14 @@ liquid.oil.details = ของเหลวเฉื่อยพบได้ไ
liquid.cryofluid.description = ใช้ในการหล่อเย็นเตาปฏิกร สิ่งก่อสร้างหรือโรงงานต่างๆ liquid.cryofluid.description = ใช้ในการหล่อเย็นเตาปฏิกร สิ่งก่อสร้างหรือโรงงานต่างๆ
liquid.cryofluid.details = ของเหลวเฉื่อยและไม่กัดกร่อน ผลิตจากน้ำและไทเทเนี่ยม มีคุณสมบัติการถ่ายเทความร้อนสูง liquid.cryofluid.details = ของเหลวเฉื่อยและไม่กัดกร่อน ผลิตจากน้ำและไทเทเนี่ยม มีคุณสมบัติการถ่ายเทความร้อนสูง
block.resupply-point.description = เติมกระสุนยูนิตรอบข้างด้วยกระสุนทองแดง ใช้ไม่ได้กับยูนิตที่ใช้พลังงานเป็นกระสุน block.derelict = [lightgray] ถูกทิ้งร้าง
block.resupply-point.description = เติมกระสุนยูนิตรอบข้างด้วยกระสุนทองแดง ใช้กับยูนิตที่ใช้พลังงานเป็นกระสุนไม่ได้
block.armored-conveyor.description = เลื่อนไอเท็มไปข้างหน้า เร็วเท่าสายพานไทเทเนี่ยม แต่มีเกราะที่แข็งแรงกว่า ไม่รับไอเท็มจากด้านข้างยกเว้นเป็นสายพานชนิดเดียวกัน block.armored-conveyor.description = เลื่อนไอเท็มไปข้างหน้า เร็วเท่าสายพานไทเทเนี่ยม แต่มีเกราะที่แข็งแรงกว่า ไม่รับไอเท็มจากด้านข้างยกเว้นเป็นสายพานชนิดเดียวกัน
block.illuminator.description = ตัวเปล่งแสงขนาดกะทัดรัด ส่องสว่างในที่มืดได้ดี\nแถมยังกำหนดสีของแสงได้ด้วย... เจ๋งใช่มั้ยล่ะ block.illuminator.description = ตัวเปล่งแสงขนาดกะทัดรัด ส่องสว่างในที่มืดได้ดี\nแถมยังกำหนดสีของแสงได้ด้วย... เจ๋งใช่มั้ยล่ะ
block.message.description = เก็บข้อความ ใช้สื่อสารกับพันธมิตร block.message.description = เก็บข้อความ ใช้สื่อสารกับพันธมิตร
block.graphite-press.description = อัดก้อนถ่านหินให้เป็นแผ่นกราไฟต์บริสุทธิ์ block.graphite-press.description = อัดก้อนถ่านหินให้เป็นแผ่นกราไฟต์บริสุทธิ์
block.multi-press.description = อัดก้อนถ่านหินให้เป็นแผ่นกราไฟต์บริสุทธิ์ ใช้น้ำและพลังงานในการแปรรูปถ่านหินให้เร็วและมีประสิทธิภาพมากขึ้น block.multi-press.description = อัดก้อนถ่านหินให้เป็นแผ่นกราไฟต์บริสุทธิ์ ใช้น้ำและพลังงานในการแปรรูปถ่านหินให้เร็วและมีประสิทธิภาพมากขึ้น
block.silicon-smelter.description = ผลิตซิลิกอนจากทรายและถ่านหินบริสุทธิ์ block.silicon-smelter.description = ผลิตซิลิกอนจากการหลอมทรายและถ่านหินเข้าด้วยกัน
block.kiln.description = เผาทรายและตะกั่วเป็นกระจกเมต้า block.kiln.description = เผาทรายและตะกั่วเป็นกระจกเมต้า
block.plastanium-compressor.description = บีบอัดน้ำมันและไทเทเนี่ยมเข้าด้วยกันเพื่อผลิตพลาสตาเนี่ยม block.plastanium-compressor.description = บีบอัดน้ำมันและไทเทเนี่ยมเข้าด้วยกันเพื่อผลิตพลาสตาเนี่ยม
block.phase-weaver.description = สังเคราะห์ใยเฟสจากทรายและทอเรี่ยม ใช้พลังงานจำนวนมากในการทำงาน block.phase-weaver.description = สังเคราะห์ใยเฟสจากทรายและทอเรี่ยม ใช้พลังงานจำนวนมากในการทำงาน
@@ -1524,22 +1530,22 @@ block.duo.description = ป้อมปืนขนาดเล็ก ยิง
block.scatter.description = ยิงก้อนตะกั่ว เศษเหล็กหรือกระจกเมต้าใส่ยานบินศัตรูที่อยู่ใกล้เคียง block.scatter.description = ยิงก้อนตะกั่ว เศษเหล็กหรือกระจกเมต้าใส่ยานบินศัตรูที่อยู่ใกล้เคียง
block.scorch.description = เผาศัตรูพื้นดินที่อยู่ใกล้ๆ มีประสิทธิภาพสูงสุดเมื่อใช้ในระยะใกล้ block.scorch.description = เผาศัตรูพื้นดินที่อยู่ใกล้ๆ มีประสิทธิภาพสูงสุดเมื่อใช้ในระยะใกล้
block.hail.description = ป้อมปืนใหญ่ขนาดย่อม ยิงลูกระเบิดใส่ศัตรูพื้นดินจากระยะไกล block.hail.description = ป้อมปืนใหญ่ขนาดย่อม ยิงลูกระเบิดใส่ศัตรูพื้นดินจากระยะไกล
block.wave.description = ป้อมปืนขนาดกลาง พ่นของเหลวสาดใส่ศัตรู จะดับไฟให้อัตโนมัติเมื่อใส่น้ำเข้าไป block.wave.description = พ่นของเหลวสาดใส่ศัตรู จะดับไฟให้อัตโนมัติเมื่อใส่น้ำเข้าไป
block.lancer.description = ป้อมปืนเลเซอร์ต่อต้านพื้นดินขนาดกลาง ชาร์จแลยิงลำแสงพลังงานอันทรงพลังใส่ศัตรู block.lancer.description = ชาร์จแล้วยิงลำแสงพลังงานอันทรงพลังใส่ศัตรูพื้นดิน
block.arc.description = ป้อมปืนไฟฟ้าระยะใกล้ ยิงสายฟ้าใส่ศัตรูพื้นดิน จะทำดาเมจมหาศาลเมื่อศัตรูเปียกน้ำ block.arc.description = ยิงสายฟ้าใส่ศัตรูพื้นดิน จะทำดาเมจมหาศาลเมื่อศัตรูเปียกน้ำ
block.swarmer.description = ป้อมยิงขีปนาวุธขนาดกลาง ยิงขีปนาวุธติดตามตัวใส่ศัตรูทั้งอากาศและพื้นดิน block.swarmer.description = ยิงขีปนาวุธติดตามตัวใส่ศัตรูทั้งอากาศและพื้นดิน
block.salvo.description = ป้อมปืนขนาดกลาง ระดมยิงกระสุนหนักใส่ศัตรูอย่างรวดเร็ว block.salvo.description = ป้อมปืนขนาดกลาง ระดมยิงกระสุนหนักใส่ศัตรูอย่างรวดเร็ว
block.fuse.description = ป้อมปืนระยะใกล้ขนาดใหญ่ ยิงลำแสงเจาะทะลุสามเส้นใส่ศัตรูที่อยู่ใกล้เคียง block.fuse.description = ป้อมปืนระยะใกล้ขนาดใหญ่ ยิงลำแสงเจาะทะลุสามแฉกใส่ศัตรูที่อยู่ใกล้เคียง
block.ripple.description = ป้อมปืนใหญ่พลังงานสูง ยิงกระจุกของลูกระเบิดใส่ศัตรูพื้นดินจากระยะไกล block.ripple.description = ป้อมปืนใหญ่ทรงพลัง ยิงลูกระเบิดเป็นกระจุกใส่ศัตรูพื้นดินจากระยะไกล
block.cyclone.description = ป้อมปืนต่อต้านทั้งอากาศยานและพื้นดิน ยิงกระสุนเป็นกระจุกระเบิดใส่ยูนิตศัตรูอย่างรวดเร็ว block.cyclone.description = ป้อมปืนรวดเร็วดั่งพายุ ยิงก้อนสะเก็ดระเบิดใส่ยูนิตศัตรูอย่างรวดเร็ว
block.spectre.description = ปืนใหญ่คู่ขนาดยักษ์ ยิงกระสุนเจาะเกราะใส่ศัตรูทั้งบนอากาศและพื้นดิน block.spectre.description = ปืนใหญ่คู่ขนาดยักษ์ ยิงกระสุนเจาะเกราะใส่ศัตรูทั้งบนอากาศและพื้นดิน
block.meltdown.description = ชาร์จแล้วยิงลำแสงเลเซอร์ใส่ศัตรูที่อยู่ใกล้เคียงอย่างต่อเนื่อง ต้องมีของเหลวมาหล่อเย็นป้อมปืนเพื่อทำงาน block.meltdown.description = ชาร์จแล้วยิงลำแสงเลเซอร์ใส่ศัตรูที่อยู่ใกล้เคียงอย่างต่อเนื่อง ต้องมีของเหลวมาหล่อเย็นป้อมปืนเพื่อทำงาน
block.foreshadow.description = ป้อมปืนเรลกันขนาดมหึมา ยิงลำแสงพลังงานใส่เป้าหมายเดี่ยวขนาดใหญ่\nมีระยะการยิงไกลมาก จะเลือกยิงยูนิตที่มีพลังชีวิตมากที่สุดก่อน block.foreshadow.description = ป้อมปืนเรลกันขนาดมหึมา ยิงลำแสงพลังงานใส่เป้าหมายเดี่ยวขนาดใหญ่\nมีระยะการยิงไกลมาก จะเลือกยิงยูนิตที่มีพลังชีวิตมากที่สุดก่อน
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 = ยิงกระแสของเหลวอันทรงพลังใส่ศัตรู จะดับไฟให้อัตโนมัติเมื่อใส่น้ำเข้าไป
block.silicon-crucible.description = หลอมซิลิกอนจากทรายและถ่าน ใช้ไพราไทต์เป็นแหล่งความร้อนเพิ่มเติม ทำงานเร็วกว่าถ้าตั้งอยู่ในพื้นที่ร้อน block.silicon-crucible.description = หลอมซิลิกอนจากทรายและถ่านหิน ใช้ไพราไทต์เป็นแหล่งความร้อนเพิ่มเติม จะทำงานเร็วกว่าถ้าตั้งอยู่ในพื้นที่ร้อน
block.disassembler.description = แยกแร่หลอมออกเป็นแร่ธาตุปริมาณเล็กน้อยโดยมีประสิทธิภาพต่ำ สามารถผลิตทอเรี่ยมได้ block.disassembler.description = แยกแร่หลอมออกเป็นแร่ธาตุปริมาณเล็กน้อยโดยมีประสิทธิภาพต่ำ สามารถผลิตทอเรี่ยมได้
block.overdrive-dome.description = เร่งประสิทธิภาพสิ่งก่อสร้างรอบข้างอย่างมหาศาล ต้องมีใยเฟสกับซิลิกอนเพื่อทำงาน block.overdrive-dome.description = เร่งประสิทธิภาพสิ่งก่อสร้างรอบข้างอย่างมหาศาล ต้องมีใยเฟสกับซิลิกอนเพื่อทำงาน
block.payload-conveyor.description = เคลื่อนย้ายสิ่งของบรรทุกหนัก อย่างเช่นยูนิต block.payload-conveyor.description = เคลื่อนย้ายสิ่งของบรรทุกหนัก อย่างเช่นยูนิต
@@ -1561,6 +1567,8 @@ block.memory-bank.description = เก็บข้อมูลเป็นตั
block.logic-display.description = แสดงกราฟิกโดยควบคุมจากตัวประมวลผลลอจิก block.logic-display.description = แสดงกราฟิกโดยควบคุมจากตัวประมวลผลลอจิก
block.large-logic-display.description = แสดงกราฟิกโดยควบคุมจากตัวประมวลผลลอจิก มีขนาดใหญ่กว่า block.large-logic-display.description = แสดงกราฟิกโดยควบคุมจากตัวประมวลผลลอจิก มีขนาดใหญ่กว่า
block.interplanetary-accelerator.description = หอคอยเรลกันแม่เหล็กไฟฟ้าขนาดมหึมา เร่งความเร็วแกนกลางเพื่อบินสู่อวกาศไปยังดาวเคราะห์อื่นๆ block.interplanetary-accelerator.description = หอคอยเรลกันแม่เหล็กไฟฟ้าขนาดมหึมา เร่งความเร็วแกนกลางเพื่อบินสู่อวกาศไปยังดาวเคราะห์อื่นๆ
block.repair-turret.description = ซ่อมแซมยูนิตที่อยู่ในรัศมีของมันอย่างต่อเนื่อง สามารถใช้ของเหลวมาหล่อเย็นเพื่อเพิ่มประสิทธิภาพได้
block.payload-propulsion-tower.description = บล็อกขนส่งสิ่งบรรทุกทางไกล\nยิงสิ่งบรรทุกไปยังหอเคลื่อนย้ายสิ่งบรรทุกอีกเครื่องที่เชื่อมต่อไว้
unit.dagger.description = ยิงกระสุนธรรมดาใส่ศัตรูที่อยู่ใกล้เคียง unit.dagger.description = ยิงกระสุนธรรมดาใส่ศัตรูที่อยู่ใกล้เคียง
unit.mace.description = ยิงเปลวไฟใส่ศัตรูที่อยู่ใกล้เคียง ทำให้ศัตรูถูกเผาไหม้ unit.mace.description = ยิงเปลวไฟใส่ศัตรูที่อยู่ใกล้เคียง ทำให้ศัตรูถูกเผาไหม้
@@ -1595,6 +1603,11 @@ unit.omura.description = ยิงลำแสงปืนเรลกันเ
unit.alpha.description = ปกป้องแกนกลางชาร์ดจากศัตรู สร้างสิ่งต่างๆ unit.alpha.description = ปกป้องแกนกลางชาร์ดจากศัตรู สร้างสิ่งต่างๆ
unit.beta.description = ปกป้องแกนกลางฟาวน์เดชั่นจากศัตรู สร้างสิ่งต่างๆ unit.beta.description = ปกป้องแกนกลางฟาวน์เดชั่นจากศัตรู สร้างสิ่งต่างๆ
unit.gamma.description = ปกป้องแกนกลางนิวเคลียสจากศัตรู สร้างสิ่งต่างๆ unit.gamma.description = ปกป้องแกนกลางนิวเคลียสจากศัตรู สร้างสิ่งต่างๆ
unit.retusa.description = วางทุ่นระเบิดระยะใกล้ ซ่อมแซมยูนิตพวกพ้องที่อยู่ใกล้เคียง
unit.oxynoe.description = ยิงเปลวไฟเผาไหม้ใส่ศัตรูที่อยู่ใกล้เคียงและซ่อมแซมสิ่งก่อสร้างของพวกพ้อง\nทำลายกระสุนที่กำลังเข้ามาด้วยปืนป้องกันจุด
unit.cyerce.description = ยิงขีปนาวุธพลาสม่าติดตามตัวเป็นกระจุกระเบิดใส่ศัตรู\nซ่อมแซมยูนิตพวกพ้องที่อยู่ใกล้เคียง
unit.aegires.description = ช็อตทุกสิ่งก่อสร้างและยูนิตศัตรูที่เข้ามาในสนามพลังงานของมัน\nซ่อมแซมสิ่งก่อสร้างและยูนิตพวกพ้อง
unit.navanax.description = ยิงลูกระเบิดคลื่นชีพจรแม่เหล็กขนาดใหญ่ สร้างความเสียหายอย่างหนักให้กับเครือข่ายพลังงานศัตรู\nและซ่อมแซมสิ่งก่อสร้างของพวกพ้อง\nหลอมละลายศัตรูที่อยู่ใกล้เคียงด้วยป้อมปืนเลเซอร์อัตโนมัติสี่ป้อม
lst.read = อ่านเลขจากเซลล์ความจำที่เชื่อมต่อไว้ lst.read = อ่านเลขจากเซลล์ความจำที่เชื่อมต่อไว้
lst.write = เขียนเลขไปยังเซลล์ความจำที่เชื่อมต่อไว้ lst.write = เขียนเลขไปยังเซลล์ความจำที่เชื่อมต่อไว้

View File

@@ -55,15 +55,24 @@ schematic.delete.confirm = Ви справді хочете видалити ц
schematic.rename = Перейменувати схему schematic.rename = Перейменувати схему
schematic.info = {0}x{1}, блоків: {2} schematic.info = {0}x{1}, блоків: {2}
schematic.disabled = [scarlet]Схеми вимкнені[]\nВам не дозволяється використовувати схеми на цій [accent]мапі[] чи [accent]сервері. schematic.disabled = [scarlet]Схеми вимкнені[]\nВам не дозволяється використовувати схеми на цій [accent]мапі[] чи [accent]сервері.
schematic.tags = Мітки:
schematic.edittags = Редагувати мітки
schematic.addtag = Додати мітку
schematic.texttag = Текстова мітка
schematic.icontag = Мітка із значком
schematic.renametag = Перейменувати мітку
schematic.tagdelconfirm = Видалити цю мітку повністю?
schematic.tagexists = Схожа мітка вже існує.
mod.featured.title = Переглядач модифікацій mod.featured.title = Переглядач модифікацій
mods.browser = Переглядач модифікацій mods.browser = Переглядач модифікацій
mods.browser.selected = Обрана модифікація mods.browser.selected = Вибрана модифікація
mods.browser.add = Установити mods.browser.add = Установити
mods.browser.reinstall = Перевстановити mods.browser.reinstall = Перевстановити
mods.github.open = Відкрити mods.github.open = Відкрити
mods.browser.sortdate = Сортувати за давністю mods.browser.sortdate = Сортувати за давністю
mods.browser.sortstars = Сортувати за кількостю зірок mods.browser.sortstars = Сортувати за популярністю
stats = Статистика stats = Статистика
stat.wave = Хвиль відбито:[accent] {0} stat.wave = Хвиль відбито:[accent] {0}
@@ -298,7 +307,6 @@ data.exported = Дані вивантажено.
data.invalid = Це не дійсні ігрові дані. data.invalid = Це не дійсні ігрові дані.
data.import.confirm = Вивантаження зовнішніх даних перезапише[scarlet] ВСІ[] ваші поточні ігрові дані.\n[accent]Це неможливо скасувати![]\n\nЯк тільки дані імпортуються, гра негайно закриється. data.import.confirm = Вивантаження зовнішніх даних перезапише[scarlet] ВСІ[] ваші поточні ігрові дані.\n[accent]Це неможливо скасувати![]\n\nЯк тільки дані імпортуються, гра негайно закриється.
quit.confirm = Ви дійсно хочете вийти? quit.confirm = Ви дійсно хочете вийти?
quit.confirm.tutorial = Ви впевнені, що знаєте, що робите?\nНавчання можна пройти наново[accent] Налаштування->Гра->Пройти навчання ще раз.[]
loading = [accent]Завантаження… loading = [accent]Завантаження…
reloading = [accent]Перезавантаження модифікацій… reloading = [accent]Перезавантаження модифікацій…
saving = [accent]Збереження… saving = [accent]Збереження…
@@ -463,11 +471,13 @@ filter.option.circle-scale = Масштаб круга
filter.option.octaves = Циклічність застосування filter.option.octaves = Циклічність застосування
filter.option.falloff = Спад циклічності filter.option.falloff = Спад циклічності
filter.option.angle = Кут filter.option.angle = Кут
filter.option.rotate = Повернути
filter.option.amount = Кількість filter.option.amount = Кількість
filter.option.block = Блок filter.option.block = Блок
filter.option.floor = Поверхня filter.option.floor = Поверхня
filter.option.flooronto = Цільова поверхня filter.option.flooronto = Цільова поверхня
filter.option.target = Ціль filter.option.target = Ціль
filter.option.replacement = Заміщення
filter.option.wall = Стіна filter.option.wall = Стіна
filter.option.ore = Руда filter.option.ore = Руда
filter.option.floor2 = Друга поверхня filter.option.floor2 = Друга поверхня
@@ -483,7 +493,8 @@ load = Завантажити
save = Зберегти save = Зберегти
fps = FPS: {0} fps = FPS: {0}
ping = Затримка: {0} мс ping = Затримка: {0} мс
memory = Mem: {0}мб tps = TPS: {0}
memory = Mem: {0} мб
memory2 = Mem:\n {0}мб +\n {1}мб memory2 = Mem:\n {0}мб +\n {1}мб
language.restart = Перезапустіть свою гру, щоби налаштування мови набули чинності. language.restart = Перезапустіть свою гру, щоби налаштування мови набули чинності.
settings = Налаштування settings = Налаштування
@@ -513,7 +524,7 @@ launch.from = Запуск з [accent]{0}
launch.destination = Пункт призначення: {0} launch.destination = Пункт призначення: {0}
configure.invalid = Кількість має бути числом між 0 та {0}. configure.invalid = Кількість має бути числом між 0 та {0}.
add = Додати… add = Додати…
boss.health = Здоров’я Вартового guardian = Вартовий
connectfail = [crimson]Помилка з’єднання:\n\n[accent]{0} connectfail = [crimson]Помилка з’єднання:\n\n[accent]{0}
error.unreachable = Сервер не є доступним.\nЧи правильно написана адреса? error.unreachable = Сервер не є доступним.\nЧи правильно написана адреса?
error.invalidaddress = Некоректна адреса. error.invalidaddress = Некоректна адреса.
@@ -553,6 +564,7 @@ sector.missingresources = [scarlet]Недостатньо ресурсів у я
sector.attacked = Сектор [accent]{0}[white] під атакою! sector.attacked = Сектор [accent]{0}[white] під атакою!
sector.lost = Сектор [accent]{0}[white] втрачено! sector.lost = Сектор [accent]{0}[white] втрачено!
sector.captured = Сектор [accent]{0}[white]захоплено! sector.captured = Сектор [accent]{0}[white]захоплено!
sector.changeicon = Змінити значок
threat.low = низька threat.low = низька
threat.medium = середня threat.medium = середня
threat.high = висока threat.high = висока
@@ -600,6 +612,7 @@ status.wet.name = Вологий
status.muddy.name = Забризканий гряззю status.muddy.name = Забризканий гряззю
status.melting.name = Плавиться status.melting.name = Плавиться
status.sapped.name = Виснажений status.sapped.name = Виснажений
status.electrified.name = Наелектризований
status.spore-slowed.name = Сповільнений спорами status.spore-slowed.name = Сповільнений спорами
status.tarred.name = Покритий нафтою status.tarred.name = Покритий нафтою
status.overclock.name = Прискорений status.overclock.name = Прискорений
@@ -628,6 +641,7 @@ settings.clearcampaignsaves.confirm = Ви справді хочете очис
paused = [accent]< Пауза > paused = [accent]< Пауза >
clear = Очистити clear = Очистити
banned = [scarlet]Заблоковано banned = [scarlet]Заблоковано
unsupported.environment = [scarlet]Непідтримуване середовище
yes = Так yes = Так
no = Ні no = Ні
info.title = Інформація info.title = Інформація
@@ -636,6 +650,7 @@ error.crashtitle = Виникла помилка
unit.nobuild = [scarlet]Ця одиниця не може будувати unit.nobuild = [scarlet]Ця одиниця не може будувати
lastaccessed = [lightgray]Остання зміна від {0} lastaccessed = [lightgray]Остання зміна від {0}
block.unknown = [lightgray]??? block.unknown = [lightgray]???
stat.showinmap = <завантажте мапу для показу>
stat.description = Призначення stat.description = Призначення
stat.input = Ввід stat.input = Ввід
stat.output = Вивід stat.output = Вивід
@@ -665,6 +680,7 @@ stat.memorycapacity = Ємність пам’яті
stat.basepowergeneration = Базова генерація енергії stat.basepowergeneration = Базова генерація енергії
stat.productiontime = Час виробництва stat.productiontime = Час виробництва
stat.repairtime = Час повного відновлення блоку stat.repairtime = Час повного відновлення блоку
stat.repairspeed = Швидкість відновлення
stat.weapons = Зброя stat.weapons = Зброя
stat.bullet = Кулі stat.bullet = Кулі
stat.speedincrease = Збільшення швидкості stat.speedincrease = Збільшення швидкості
@@ -713,11 +729,12 @@ stat.reactive = Реактивний
ability.forcefield = Щитове поле ability.forcefield = Щитове поле
ability.repairfield = Ремонтувальне поле ability.repairfield = Ремонтувальне поле
ability.statusfield = Поле підсилення ability.statusfield = {0} Поле підсилення
ability.unitspawn = Завод одиниць «{0}» ability.unitspawn = Завод одиниць «{0}»
ability.shieldregenfield = Поле, що відновлює щити ability.shieldregenfield = Поле, що відновлює щити
ability.movelightning = Блискавки під час руху ability.movelightning = Блискавки під час руху
bar.drilltierreq = Потребується кращий бур ability.energyfield = Енергетичне поле: [accent]{0}[] шкоди ~ [accent]{1}[] блоків / [accent]{2}[] цілей
bar.drilltierreq = Потрібен ліпший бур
bar.noresources = Бракує ресурсів bar.noresources = Бракує ресурсів
bar.corereq = Необхідне основне ядро bar.corereq = Необхідне основне ядро
bar.drillspeed = Швидкість буріння: {0} за с. bar.drillspeed = Швидкість буріння: {0} за с.
@@ -738,6 +755,7 @@ bar.power = Енергія
bar.progress = Хід будування bar.progress = Хід будування
bar.input = Ввід bar.input = Ввід
bar.output = Вивід bar.output = Вивід
bar.strength = x[stat]{0}[lightgray] сила
units.processorcontrol = [lightgray]Керується процесором 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] плиток
@@ -755,6 +773,7 @@ bullet.reload = [stat]{0}[lightgray]x швидкість перезаряджа
unit.blocks = блоки unit.blocks = блоки
unit.blockssquared = блоків² unit.blockssquared = блоків²
unit.powersecond = одиниць енергії за секунду unit.powersecond = одиниць енергії за секунду
unit.tilessecond = плиток за секунду
unit.liquidsecond = одиниць рідини за секунду unit.liquidsecond = одиниць рідини за секунду
unit.itemssecond = предметів за секунду unit.itemssecond = предметів за секунду
unit.liquidunits = одиниць рідини unit.liquidunits = одиниць рідини
@@ -939,6 +958,8 @@ rules.wavetimer = Таймер для хвиль
rules.waves = Хвилі rules.waves = Хвилі
rules.attack = Режим атаки rules.attack = Режим атаки
rules.buildai = Будування ШІ rules.buildai = Будування ШІ
rules.corecapture = Захоплення ядра після знищення
rules.polygoncoreprotection = Полігональний захист ядер
rules.enemyCheat = Нескінченні ресурси для червоної команди ШІ rules.enemyCheat = Нескінченні ресурси для червоної команди ШІ
rules.blockhealthmultiplier = Множник здоров’я блоків rules.blockhealthmultiplier = Множник здоров’я блоків
rules.blockdamagemultiplier = Множник шкоди блоків rules.blockdamagemultiplier = Множник шкоди блоків
@@ -1022,6 +1043,11 @@ unit.minke.name = Смугач
unit.bryde.name = Брайд unit.bryde.name = Брайд
unit.sei.name = Сейвал unit.sei.name = Сейвал
unit.omura.name = Омура unit.omura.name = Омура
unit.retusa.name = Ретуза
unit.oxynoe.name = Оксино
unit.cyerce.name = Саєс
unit.aegires.name = Еґірес
unit.navanax.name = Наванакс
unit.alpha.name = Альфа unit.alpha.name = Альфа
unit.beta.name = Бета unit.beta.name = Бета
unit.gamma.name = Гамма unit.gamma.name = Гамма
@@ -1081,6 +1107,7 @@ block.sand-water.name = Пісок із водою
block.darksand-water.name = Темний пісок із водою block.darksand-water.name = Темний пісок із водою
block.char.name = Випалена земля block.char.name = Випалена земля
block.dacite.name = Дацит block.dacite.name = Дацит
block.rhyolite.name = Риоліт
block.dacite-wall.name = Дацитова стіна block.dacite-wall.name = Дацитова стіна
block.dacite-boulder.name = Дацитовий валун block.dacite-boulder.name = Дацитовий валун
block.ice-snow.name = Крижаний сніг block.ice-snow.name = Крижаний сніг
@@ -1098,7 +1125,8 @@ block.spore-cluster.name = Скупчення спор
block.metal-floor.name = Металева підлога 1 block.metal-floor.name = Металева підлога 1
block.metal-floor-2.name = Металева підлога 2 block.metal-floor-2.name = Металева підлога 2
block.metal-floor-3.name = Металева підлога 3 block.metal-floor-3.name = Металева підлога 3
block.metal-floor-5.name = Металева підлога 4 block.metal-floor-4.name = Металева підлога 4
block.metal-floor-5.name = Металева підлога 5
block.metal-floor-damaged.name = Пошкоджена металева підлога block.metal-floor-damaged.name = Пошкоджена металева підлога
block.dark-panel-1.name = Темна панель 1 block.dark-panel-1.name = Темна панель 1
block.dark-panel-2.name = Темна панель 2 block.dark-panel-2.name = Темна панель 2
@@ -1188,6 +1216,7 @@ block.solar-panel.name = Сонячна панель
block.solar-panel-large.name = Велика сонячна панель block.solar-panel-large.name = Велика сонячна панель
block.oil-extractor.name = Екстрактор нафти block.oil-extractor.name = Екстрактор нафти
block.repair-point.name = Ремонтний пункт block.repair-point.name = Ремонтний пункт
block.repair-point.name = Ремонтна башта
block.pulse-conduit.name = Імпульсний трубопровід block.pulse-conduit.name = Імпульсний трубопровід
block.plated-conduit.name = Зміцнений трубопровід block.plated-conduit.name = Зміцнений трубопровід
block.phase-conduit.name = Фазовий трубопровід block.phase-conduit.name = Фазовий трубопровід
@@ -1230,6 +1259,12 @@ block.exponential-reconstructor.name = Експоненційний реконс
block.tetrative-reconstructor.name = Тетративний реконструктор block.tetrative-reconstructor.name = Тетративний реконструктор
block.payload-conveyor.name = Вантажний конвеєр block.payload-conveyor.name = Вантажний конвеєр
block.payload-router.name = Розвантажувальний маршрутизатор block.payload-router.name = Розвантажувальний маршрутизатор
block.duct.name = Duct
block.duct-router.name = Канальний маршрутизатор
block.duct-bridge.name = Канальний міст
block.payload-propulsion-tower.name = Вантажна катапульта
block.payload-void.name = Вантажний вакуум
block.payload-source.name = Вантажне джерело
block.disassembler.name = Розбирач block.disassembler.name = Розбирач
block.silicon-crucible.name = Кремнієвий тигель block.silicon-crucible.name = Кремнієвий тигель
block.overdrive-dome.name = Великий прискорювач block.overdrive-dome.name = Великий прискорювач
@@ -1246,8 +1281,8 @@ block.large-logic-display.name = Великий логічний дисплей
block.memory-cell.name = Комірка пам’яті block.memory-cell.name = Комірка пам’яті
block.memory-bank.name = Блок пам’яті block.memory-bank.name = Блок пам’яті
team.blue.name = Синя team.blue.name = Синя
team.crux.name = Червона team.crux.name = Загарбники
team.sharded.name = Помаранчева team.sharded.name = Розколоті
team.orange.name = Помаранчева team.orange.name = Помаранчева
team.derelict.name = Знедолена team.derelict.name = Знедолена
team.green.name = Зелена team.green.name = Зелена
@@ -1268,6 +1303,7 @@ hint.placeConveyor.mobile = Конвеєри переміщують предме
hint.placeTurret = Розмістіть  [accent]башти[], щоби захистити базу від ворогів.\n\nБашти потребують боєприпасів. У цьому випадку \uf838мідь.\nДля її подачі використовуйте конвеєри та бури. hint.placeTurret = Розмістіть  [accent]башти[], щоби захистити базу від ворогів.\n\nБашти потребують боєприпасів. У цьому випадку \uf838мідь.\nДля її подачі використовуйте конвеєри та бури.
hhint.breaking = Натисніть [accent]ПКМ[] і тягніть, щоби зруйнувати блоки. hhint.breaking = Натисніть [accent]ПКМ[] і тягніть, щоби зруйнувати блоки.
hint.breaking.mobile = Активуйте  [accent]молот[] внизу праворуч і торкніться блоків, щоби їх розібрати.\n\nУтримуйте палець протягом секунди і протягніть, щоби розібрати виділене. hint.breaking.mobile = Активуйте  [accent]молот[] внизу праворуч і торкніться блоків, щоби їх розібрати.\n\nУтримуйте палець протягом секунди і протягніть, щоби розібрати виділене.
hint.blockInfo = Подивіться інформацію про блок. Перейдіть до [accent]меню будівництва[] і натисніть на кнопку [accent][[?][] правпоруч
hint.research = Використовуйте кнопку  [accent]Дослідження[] для дослідження нової технології. hint.research = Використовуйте кнопку  [accent]Дослідження[] для дослідження нової технології.
hint.research.mobile = Використовуйте  [accent]Дослідження[] в  [accent]меню[] для дослідження нової технології. hint.research.mobile = Використовуйте  [accent]Дослідження[] в  [accent]меню[] для дослідження нової технології.
hint.unitControl = Утримуйте [accent][[лівий Ctrl][] і [accent]натисніть[] на одиницю чи башту, щоби контролювати її. hint.unitControl = Утримуйте [accent][[лівий Ctrl][] і [accent]натисніть[] на одиницю чи башту, щоби контролювати її.
@@ -1300,7 +1336,7 @@ item.graphite.description = Використовується для боєпри
item.sand.description = Використовується для виробництва інших удосконалених матеріалів. item.sand.description = Використовується для виробництва інших удосконалених матеріалів.
item.coal.description = Використовується для виробництва палива і вдосконалених матеріалів. item.coal.description = Використовується для виробництва палива і вдосконалених матеріалів.
item.coal.details = Виглядає скам’янілою рослинною речовиною, утвореною задовго до Сівби. item.coal.details = Виглядає скам’янілою рослинною речовиною, утвореною задовго до Сівби.
item.titanium.description = Використовується в транспортуванні рідин, бурів та авіації. item.titanium.description = Використовується в транспортуванні будівль, бурів та в заводах.
item.thorium.description = Використовується в міцних конструкціях і як ядерне паливо. item.thorium.description = Використовується в міцних конструкціях і як ядерне паливо.
item.scrap.description = Використовується в Плавильнях і Подрібнювачах для перероблення в інші матеріали в інші матеріали. item.scrap.description = Використовується в Плавильнях і Подрібнювачах для перероблення в інші матеріали в інші матеріали.
item.scrap.details = Залишки старих споруд та підрозділів. item.scrap.details = Залишки старих споруд та підрозділів.
@@ -1507,6 +1543,8 @@ lst.sensor = Отримати дані з певної будівлі чи од
lst.set = Установити значення змінної. lst.set = Установити значення змінної.
lst.operation = Виконує операцію над 1-2 змінними. lst.operation = Виконує операцію над 1-2 змінними.
lst.end = Перейти до верхньої частини стеку операцій. lst.end = Перейти до верхньої частини стеку операцій.
lst.wait = Зачекати певну кількість секунд.
lst.lookup = Знайдіть тип елемента, рідини, одиниці чи блоку за ідентифікатором.\nМожна отримати доступ до загальної кількості кожного типу через \n[accent]@unitCount[] / [accent]@itemCount[] / [accent]@liquidCount[] / [accent]@blockCount[]
lst.jump = Умовне переходження до іншої операції. lst.jump = Умовне переходження до іншої операції.
lst.unitbind = Прив’язка до одиниці певного типу та його зберігання в [accent]@unit[]. lst.unitbind = Прив’язка до одиниці певного типу та його зберігання в [accent]@unit[].
lst.unitcontrol = Контролювати поточну прив’язану одиницю. lst.unitcontrol = Контролювати поточну прив’язану одиницю.
@@ -1518,7 +1556,7 @@ logic.nounitbuild = [red]Будування за допомогою процес
lenum.type = Тип будівлі чи одиниці.\nНаприклад, для будь-якого маршрутизатора (англ. router), функція вертатиме [accent]@router[].\nНе є рядком. lenum.type = Тип будівлі чи одиниці.\nНаприклад, для будь-якого маршрутизатора (англ. router), функція вертатиме [accent]@router[].\nНе є рядком.
lenum.shoot = Стріляти в зазначену позицію. lenum.shoot = Стріляти в зазначену позицію.
lenum.shootp = Стріляти в одиницю чи будівлю із передбаченням швидкості. lenum.shootp = Стріляти в одиницю чи будівлю із передбаченням швидкості.
lenum.configure = Конфігурація будівлі, як-от в сортувальника. lenum.config = Конфігурація будівлі, як-от в сортувальника.
lenum.enabled = Чи блок увімкнено. lenum.enabled = Чи блок увімкнено.
laccess.color = Колір освітлювача. laccess.color = Колір освітлювача.
@@ -1526,6 +1564,7 @@ laccess.controller = Керувач одиницями. Якщо процесо
laccess.dead = Чи є одиниця або будівля мертвою або недійсною. laccess.dead = Чи є одиниця або будівля мертвою або недійсною.
laccess.controlled = Повертає \n[accent]@ctrlProcessor[] якщо одиниця контролюється процесором;\n[accent]@ctrlPlayer[] якщо одиниця чи будівля контролюєть гравцем\n[accent]@ctrlFormation[] якщо одиниця у загоні (формуванні)\nІнакше — 0. laccess.controlled = Повертає \n[accent]@ctrlProcessor[] якщо одиниця контролюється процесором;\n[accent]@ctrlPlayer[] якщо одиниця чи будівля контролюєть гравцем\n[accent]@ctrlFormation[] якщо одиниця у загоні (формуванні)\nІнакше — 0.
laccess.commanded = [red]Застаріле. Буде видалено![]\nВикористовуйте натомість [accent]controlled[]. laccess.commanded = [red]Застаріле. Буде видалено![]\nВикористовуйте натомість [accent]controlled[].
laccess.progress = Прогрес дії, від 0 до 1.\nПовертає виробництво, перезавантаження башти або хід будівництва.
graphicstype.clear = Залити дисплей вказаним кольором. graphicstype.clear = Залити дисплей вказаним кольором.
graphicstype.color = Установити колір для подальшої операції малювання. graphicstype.color = Установити колір для подальшої операції малювання.
@@ -1560,6 +1599,9 @@ lenum.len = Довжина вектора.
lenum.sin = Синус, у градусах. lenum.sin = Синус, у градусах.
lenum.cos = Косинус, у градусах. lenum.cos = Косинус, у градусах.
lenum.tan = Тангенс, у градусах. lenum.tan = Тангенс, у градусах.
lenum.asin = Арксинус, у градусах.
lenum.acos = Арккосинус, у градусах.
lenum.atan = Арктангенс, у градусах.
#це не одруківка, пошукайте 'позначення діапазону' #це не одруківка, пошукайте 'позначення діапазону'
lenum.rand = Випадкове десяткове число у діапазоні [0, значення). lenum.rand = Випадкове десяткове число у діапазоні [0, значення).
lenum.log = Натуральний логарифм (ln). lenum.log = Натуральний логарифм (ln).

View File

@@ -41,10 +41,13 @@ be.ignore = 忽略
be.noupdates = 未发现更新。 be.noupdates = 未发现更新。
be.check = 检测更新 be.check = 检测更新
mod.featured.dialog.title = 模组浏览器 (尚未完成) mods.browser = 模组浏览器
mods.browser.selected = 已选模组 mods.browser.selected = 已选模组
mods.browser.add=安装 mods.browser.add = 安装
mods.github.open=查看 mods.browser.reinstall = 重装
mods.github.open = 查看
mods.browser.sortdate = 按时间排序
mods.browser.sortstars = 按星标排序
schematic = 蓝图 schematic = 蓝图
schematic.add = 保存蓝图… schematic.add = 保存蓝图…
@@ -64,6 +67,14 @@ schematic.delete.confirm = 确认删除蓝图?
schematic.rename = 重命名蓝图 schematic.rename = 重命名蓝图
schematic.info = {0}x{1}{2} 个方块 schematic.info = {0}x{1}{2} 个方块
schematic.disabled = [scarlet]蓝图已禁用![]\n您不能在此[accent]地图[]或[accent]服务器[]上使用蓝图. schematic.disabled = [scarlet]蓝图已禁用![]\n您不能在此[accent]地图[]或[accent]服务器[]上使用蓝图.
schematic.tags = 标签:
schematic.edittags = 编辑标签
schematic.addtag = 增加新标签
schematic.texttag = 文字标签
schematic.icontag = 图标标签
schematic.renametag = 重命名标签
schematic.tagdelconfirm = 确定要完全删除这个标签吗?
schematic.tagexists = 这个标签已经存在了。
stats = 统计资料 stats = 统计资料
stat.wave = 防守波数:[accent]{0} stat.wave = 防守波数:[accent]{0}
@@ -90,6 +101,7 @@ customgame = 自定义游戏
newgame = 新游戏 newgame = 新游戏
none = <无> none = <无>
none.found = [lightgray]<未找到> none.found = [lightgray]<未找到>
none.inmap = [lightgray]<无法在地图中找到>
minimap = 小地图 minimap = 小地图
position = 位置 position = 位置
close = 关闭 close = 关闭
@@ -110,26 +122,29 @@ 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 = 报告 Bug mods.report = 报告 Bug
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.compatible = [gray]多人游戏兼容性
mod.disable = 禁用 mod.disable = 禁用
mod.content = 内容: mod.content = 内容:
mod.delete.error = 无法删除模组。可能文件被占用 mod.delete.error = 无法删除模组。文件可能正在使用中
mod.requiresversion = [scarlet]所需的游戏版本:[accent]{0} mod.requiresversion = [scarlet]所需的最低游戏版本:[accent]{0}
mod.outdated = [scarlet]该模组可能不能在6.0上正确地运行(缺失 minGameVersion: 105) mod.outdated = [scarlet]该模组可能不能在6.0上正确地运行(缺失 minGameVersion: 105)
mod.missingdependencies = [scarlet]缺少前置模组:{0} mod.missingdependencies = [scarlet]缺少前置模组:{0}
mod.erroredcontent = [scarlet]内容错误 mod.erroredcontent = [scarlet]内容错误
mod.errors = 读取内容时发生错误. mod.errors = 读取内容时发生错误.
mod.noerrorplay = [scarlet]的模组发生了错误.[] 禁用相关模组或修复错误后才能进入游戏. mod.noerrorplay = [scarlet]的模组发生了错误.[] 禁用相关模组或修复错误后才能进入游戏.
mod.nowdisabled = [scarlet]“{0}”模组缺少依赖条件:[accent] {1}\n[lightgray]需要先下载上述模组。\n此模组现在将自动禁用。 mod.nowdisabled = [scarlet]“{0}”模组缺少依赖条件:[accent] {1}\n[lightgray]需要先下载上述模组。\n此模组现在将自动禁用。
mod.enable = 启用 mod.enable = 启用
mod.requiresrestart = 需要重启使模组生效。 mod.requiresrestart = 需要重启使模组生效。
@@ -165,19 +180,19 @@ researched = [lightgray]{0}己研究。
research.progress = {0}% 完成度 research.progress = {0}% 完成度
players = {0} 位玩家在线 players = {0} 位玩家在线
players.single = {0} 位玩家在线 players.single = {0} 位玩家在线
players.search = 研究 players.search = 搜索
players.notfound = [gray]没有找到玩家。 players.notfound = [gray]没有找到玩家。
server.closing = [accent]服务器关闭… server.closing = [accent]服务器关闭…
server.kicked.kick = 被踢出了服务器。 server.kicked.kick = 被踢出了服务器。
server.kicked.whitelist = 不在服务器白名单中。 server.kicked.whitelist = 不在服务器白名单中。
server.kicked.serverClose = 服务器已关闭。 server.kicked.serverClose = 服务器已关闭。
server.kicked.vote = 您被投票踢出了服务器。 server.kicked.vote = 您被投票踢出了服务器。
server.kicked.clientOutdated = 客户端过旧,请更新的游戏。 server.kicked.clientOutdated = 客户端过旧,请更新的游戏。
server.kicked.serverOutdated = 服务器过旧,请联系服务器管理员升级服务器。 server.kicked.serverOutdated = 服务器过旧,请联系服务器管理员升级服务器。
server.kicked.banned = 您在这个服务器上被封禁了。 server.kicked.banned = 您在这个服务器上被封禁了。
server.kicked.typeMismatch = 此服务器与的不稳定测试版不兼容。 server.kicked.typeMismatch = 此服务器与的不稳定测试版不兼容。
server.kicked.playerLimit = 服务器已满,请等待一个空位。 server.kicked.playerLimit = 服务器已满,请等待一个空位。
server.kicked.recentKick = 刚刚被踢出服务器。\n请稍后重新连接 server.kicked.recentKick = 刚刚被踢出服务器。\n请稍后重新连接
server.kicked.nameInUse = 您的名字与服务器中的一个人重复了。 server.kicked.nameInUse = 您的名字与服务器中的一个人重复了。
server.kicked.nameEmpty = 无效的名字! server.kicked.nameEmpty = 无效的名字!
server.kicked.idInUse = 您已经连接了这个服务器!不允许在一台设备上用两个客户端连接。 server.kicked.idInUse = 您已经连接了这个服务器!不允许在一台设备上用两个客户端连接。
@@ -214,6 +229,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 = 没有被封禁的玩家!
@@ -287,6 +304,7 @@ cancel = 取消
openlink = 打开链接 openlink = 打开链接
copylink = 复制链接 copylink = 复制链接
back = 返回 back = 返回
max = 最大值
crash.export = 导出崩溃日志 crash.export = 导出崩溃日志
crash.none = 找不到崩溃日志。 crash.none = 找不到崩溃日志。
crash.exported = 崩溃日志已导出。 crash.exported = 崩溃日志已导出。
@@ -297,7 +315,6 @@ data.exported = 数据已导出。
data.invalid = 非有效游戏数据。 data.invalid = 非有效游戏数据。
data.import.confirm = 导入外部游戏数据将覆盖本地[scarlet]全部[]的游戏数据。\n[accent]此操作无法撤销![]\n\n数据导入后将自动退出游戏。 data.import.confirm = 导入外部游戏数据将覆盖本地[scarlet]全部[]的游戏数据。\n[accent]此操作无法撤销![]\n\n数据导入后将自动退出游戏。
quit.confirm = 确定退出? quit.confirm = 确定退出?
quit.confirm.tutorial = 确定要跳过教程?\n您可以通过[accent]设置->游戏->重玩教程[]来重玩教程。
loading = [accent]加载中… loading = [accent]加载中…
reloading = [accent]重载模组中… reloading = [accent]重载模组中…
saving = [accent]保存中… saving = [accent]保存中…
@@ -306,6 +323,7 @@ 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 = UI已隐藏\n按[accent][[{0}][]显示UI showui = UI已隐藏\n按[accent][[{0}][]显示UI
wave = [accent]第{0}波 wave = [accent]第{0}波
wave.cap = [accent]波次 {0}/{1} wave.cap = [accent]波次 {0}/{1}
@@ -324,7 +342,7 @@ saveimage = 保存图片
unknown = 未知 unknown = 未知
custom = 自定义 custom = 自定义
builtin = 内置的 builtin = 内置的
map.delete.confirm = 您确定想要删除这张地图吗?这个操作无法撤销! map.delete.confirm = 您确定想要删除这张地图吗?这个操作无法撤销!
map.random = [accent]随机地图 map.random = [accent]随机地图
map.nospawn = 这个地图没有核心!请在编辑器中添加一个[royal]己方[]的核心。 map.nospawn = 这个地图没有核心!请在编辑器中添加一个[royal]己方[]的核心。
map.nospawn.pvp = 这个地图没有敌人的核心!请在编辑器中添加一个[royal]敌人[]的核心。 map.nospawn.pvp = 这个地图没有敌人的核心!请在编辑器中添加一个[royal]敌人[]的核心。
@@ -332,7 +350,7 @@ map.nospawn.attack = 这个地图没有敌人的核心!请在编辑中向地
map.invalid = 地图载入错误:地图文件可能已经损坏。 map.invalid = 地图载入错误:地图文件可能已经损坏。
workshop.update = 更新地图 workshop.update = 更新地图
workshop.error = 获取创意工坊详细信息时出错:{0} workshop.error = 获取创意工坊详细信息时出错:{0}
map.publish.confirm = 确定上传此地图?\n\n[lightgray]确定同意 Steam 创意工坊的最终用户许可协议,否则的地图将不会被展示! map.publish.confirm = 确定上传此地图?\n\n[lightgray]确定同意 Steam 创意工坊的最终用户许可协议,否则的地图将不会被展示!
workshop.menu = 选择此项目的目的。 workshop.menu = 选择此项目的目的。
workshop.info = 项目信息 workshop.info = 项目信息
changelog = 更新日志(可选): changelog = 更新日志(可选):
@@ -345,8 +363,8 @@ steam.error = 初始化 Steam 服务失败。\n错误{0}
editor.brush = 笔刷 editor.brush = 笔刷
editor.openin = 在编辑器中打开 editor.openin = 在编辑器中打开
editor.oregen = 的生成 editor.oregen = 的生成
editor.oregen.info = 的生成: editor.oregen.info = 的生成:
editor.mapinfo = 地图信息 editor.mapinfo = 地图信息
editor.author = 作者: editor.author = 作者:
editor.description = 描述: editor.description = 描述:
@@ -361,7 +379,6 @@ editor.center = 居中
workshop = 创意工坊 workshop = 创意工坊
waves.title = 波数 waves.title = 波数
waves.remove = 移除 waves.remove = 移除
waves.never = < 无限 >
waves.every = waves.every =
waves.waves = waves.waves =
waves.perspawn = 每次生成 waves.perspawn = 每次生成
@@ -436,30 +453,32 @@ toolmode.orthogonal = 正交线
toolmode.orthogonal.description = 只绘制正交线。 toolmode.orthogonal.description = 只绘制正交线。
toolmode.square = 方形 toolmode.square = 方形
toolmode.square.description = 方形刷子 toolmode.square.description = 方形刷子
toolmode.eraseores = 清除矿 toolmode.eraseores = 清除矿
toolmode.eraseores.description = 只清除矿 toolmode.eraseores.description = 只清除矿
toolmode.fillteams = 填充 toolmode.fillteams = 填充队
toolmode.fillteams.description = 填充队而不是方块。 toolmode.fillteams.description = 填充队而不是方块。
toolmode.drawteams = 绘制 toolmode.drawteams = 绘制队
toolmode.drawteams.description = 绘制队而不是方块。 toolmode.drawteams.description = 绘制队而不是方块。
filters.empty = [lightgray]没有过滤条件!用下方的按钮添加。 filters.empty = [lightgray]没有过滤条件!用下方的按钮添加。
filter.distort = 扭曲程度 filter.distort = 扭曲程度
filter.noise = 波动程度 filter.noise = 波动程度
filter.enemyspawn = 敌人生成点选择 filter.enemyspawn = 敌人生成点选择
filter.spawnpath = 敌人生成途径 filter.spawnpath = 敌人生成途径
filter.corespawn = 核心降落点选择 filter.corespawn = 核心降落点选择
filter.median = 平均数 filter.median = 平均数
filter.oremedian = 平均数 filter.oremedian = 平均数
filter.blend = 混合程度 filter.blend = 混合程度
filter.defaultores = 默认矿 filter.defaultores = 默认矿
filter.ore = filter.ore =
filter.rivernoise = 河流波动程度 filter.rivernoise = 河流波动程度
filter.mirror = 镜像 filter.mirror = 镜像
filter.clear = 清理 filter.clear = 清理
filter.option.ignore = 忽略 filter.option.ignore = 忽略
filter.scatter = 分散程度 filter.scatter = 分散程度
filter.terrain = 地形 filter.terrain = 地形
filter.option.scale = 规模大小 filter.option.scale = 规模大小
filter.option.chance = 几率大小 filter.option.chance = 几率大小
filter.option.mag = 巨大程度 filter.option.mag = 巨大程度
@@ -468,13 +487,15 @@ filter.option.circle-scale = 圆规模
filter.option.octaves = 递增 filter.option.octaves = 递增
filter.option.falloff = 递减 filter.option.falloff = 递减
filter.option.angle = 角度大小 filter.option.angle = 角度大小
filter.option.rotate = 旋转
filter.option.amount = 数量 filter.option.amount = 数量
filter.option.block = 方块 filter.option.block = 方块
filter.option.floor = 地面 filter.option.floor = 地面
filter.option.flooronto = 地面目标 filter.option.flooronto = 地面目标
filter.option.target = 目标 filter.option.target = 目标
filter.option.replacement = 替换
filter.option.wall = filter.option.wall =
filter.option.ore = filter.option.ore =
filter.option.floor2 = 二重地面 filter.option.floor2 = 二重地面
filter.option.threshold2 = 二重阈值 filter.option.threshold2 = 二重阈值
filter.option.radius = 半径大小 filter.option.radius = 半径大小
@@ -487,8 +508,9 @@ play = 开始游戏
campaign = 战役模式 campaign = 战役模式
load = 载入游戏 load = 载入游戏
save = 保存 save = 保存
fps = 帧数{0} fps = FPS{0}
ping = 延迟:{0}毫秒 ping = 延迟:{0}毫秒
tps = TPS: {0}
memory = 内存: {0}mb memory = 内存: {0}mb
memory2 = 内存:\n {0}mb +\n {1}mb memory2 = 内存:\n {0}mb +\n {1}mb
language.restart = 为了使语言设置生效请重启游戏。 language.restart = 为了使语言设置生效请重启游戏。
@@ -521,7 +543,7 @@ launch.from = 发射地: [accent]{0}
launch.destination = 目的地: {0} launch.destination = 目的地: {0}
configure.invalid = 数量必须是0到{0}之间的数字。 configure.invalid = 数量必须是0到{0}之间的数字。
add = 添加… add = 添加…
boss.health = Boss 生命值 guardian = 守卫者
connectfail = [crimson]服务器连接失败:[accent]{0} connectfail = [crimson]服务器连接失败:[accent]{0}
error.unreachable = 无法访问服务器。\n确定输对地址了吗 error.unreachable = 无法访问服务器。\n确定输对地址了吗
@@ -537,15 +559,16 @@ error.bloom = 未能初始化特效。\n您的设备可能不支持。
weather.rain.name = 降雨 weather.rain.name = 降雨
weather.snow.name = 降雪 weather.snow.name = 降雪
weather.sandstorm.name = 沙尘暴 weather.sandstorm.name = 沙尘暴
weather.sporestorm.name = 孢子 weather.sporestorm.name = 孢子风暴
weather.fog.name = weather.fog.name =
sectors.unexplored = [lightgray]未探索 sectors.unexplored = [lightgray]未探索
sectors.resources = 资源: sectors.resources = 资源:
sectors.production = 产出: sectors.production = 产出:
sectors.export = 输出: sectors.export = 输出:
sectors.import = 输入:
sectors.time = 时间: sectors.time = 时间:
sectors.threat = 威胁 sectors.threat = 威胁:
sectors.wave = 进攻波: sectors.wave = 进攻波:
sectors.stored = 贮存: sectors.stored = 贮存:
sectors.resume = 继续 sectors.resume = 继续
@@ -554,7 +577,7 @@ sectors.select = 选择
sectors.nonelaunch = [lightgray]无 (太阳) sectors.nonelaunch = [lightgray]无 (太阳)
sectors.rename = 重命名区块 sectors.rename = 重命名区块
sectors.enemybase = [scarlet]敌人基地 sectors.enemybase = [scarlet]敌人基地
sectors.vulnerable = [scarlet]脆弱的 sectors.vulnerable = [scarlet]易受攻击
sectors.underattack = [scarlet]遭到攻击![accent]{0}% 损毁度 sectors.underattack = [scarlet]遭到攻击![accent]{0}% 损毁度
sectors.survives = [accent]存活{0}波 sectors.survives = [accent]存活{0}波
sectors.go = 进入 sectors.go = 进入
@@ -565,12 +588,13 @@ sector.attacked = 区块[accent]{0}[white]受到攻击!
sector.lost = 区块[accent]{0}[white]已丢失! sector.lost = 区块[accent]{0}[white]已丢失!
#note: the missing space in the line below is intentional #note: the missing space in the line below is intentional
sector.captured = 区块[accent]{0}[white]已占领! sector.captured = 区块[accent]{0}[white]已占领!
sector.changeicon = 更改图标
threat.low = 低度 threat.low = 低度
threat.medium = 中度 threat.medium = 中度
threat.high = 高度 threat.high = 高度
threat.extreme = 极高 threat.extreme = 极高
threat.eradication = 扫荡 threat.eradication = 毁灭
planets = 行星 planets = 行星
@@ -605,12 +629,26 @@ sector.tarFields.description = 产油区边缘,位于山脉和沙漠之间。
sector.desolateRift.description = 非常危险的区域。这儿的资源丰富但空间很小。敌人十分危险。尽快离开,不要被敌人的攻击间隔太长所愚弄。 sector.desolateRift.description = 非常危险的区域。这儿的资源丰富但空间很小。敌人十分危险。尽快离开,不要被敌人的攻击间隔太长所愚弄。
sector.nuclearComplex.description = 以前生产和加工钍的设施已变成废墟。\n[lightgray]研究钍及其多种用途。\n\n敌人在这里大量存在不断消灭入侵者。 sector.nuclearComplex.description = 以前生产和加工钍的设施已变成废墟。\n[lightgray]研究钍及其多种用途。\n\n敌人在这里大量存在不断消灭入侵者。
sector.fungalPass.description = 介于高山和低矮孢子丛生的土地之间的过渡地带。这里有一个小型的敌方侦察基地。\n侦察它。\n使用尖刀和爬行者单位来摧毁两个核心。 sector.fungalPass.description = 介于高山和低矮孢子丛生的土地之间的过渡地带。这里有一个小型的敌方侦察基地。\n侦察它。\n使用尖刀和爬行者单位来摧毁两个核心。
sector.biomassFacility.description = 孢子的发源地。这里有最初研究和生产孢子的设施。\n研究这里的科技培养孢子来制造燃料和合物。\n\n[lightgray]设施损毁后,孢子散播了出去,原生生态系统无法抵挡这种外来物种。 sector.biomassFacility.description = 孢子的发源地。这里有最初研究和生产孢子的设施。\n研究这里的科技培养孢子来制造燃料和合物。\n\n[lightgray]设施损毁后,孢子散播了出去,原生生态系统无法抵挡这种外来物种。
sector.windsweptIslands.description = 海岸线之外坐落着这一串群岛。据记载这里曾有生产[accent]塑钢[]的建筑。\n\n抵御敌人的海军在岛上建立基地研究这些工厂。 sector.windsweptIslands.description = 海岸线之外坐落着这一串群岛。据记载这里曾有生产[accent]塑钢[]的建筑。\n\n抵御敌人的海军在岛上建立基地研究这些工厂。
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.electrified.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 = 恢复默认设置
@@ -632,6 +670,7 @@ settings.clearcampaignsaves.confirm = 您确定要清除战役进度?
paused = [accent]< 暂停 > paused = [accent]< 暂停 >
clear = 清除 clear = 清除
banned = [scarlet]已禁止 banned = [scarlet]已禁止
unsupported.environment = [scarlet]不支持的环境
yes = yes =
no = no =
info.title = [accent]详情 info.title = [accent]详情
@@ -641,12 +680,14 @@ unit.nobuild = [scarlet]单位未能建造
lastaccessed = [lightgray]上次操作: {0} lastaccessed = [lightgray]上次操作: {0}
block.unknown = [lightgray]??? block.unknown = [lightgray]???
stat.showinmap = <加载地图以展示>
stat.description = 介绍 stat.description = 介绍
stat.input = 输入 stat.input = 输入
stat.output = 输出 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 = 伤害
@@ -669,6 +710,7 @@ stat.memorycapacity = 内存容量
stat.basepowergeneration = 基础能源输出 stat.basepowergeneration = 基础能源输出
stat.productiontime = 生产时间 stat.productiontime = 生产时间
stat.repairtime = 建筑完全修复时间 stat.repairtime = 建筑完全修复时间
stat.repairspeed = 修复速度
stat.weapons = 武器 stat.weapons = 武器
stat.bullet = 子弹 stat.bullet = 子弹
stat.speedincrease = 提速 stat.speedincrease = 提速
@@ -678,6 +720,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 = 建造花费
@@ -693,6 +736,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 = 温度
@@ -703,9 +747,16 @@ stat.minetier = 采矿等级
stat.payloadcapacity = 载货容量 stat.payloadcapacity = 载货容量
stat.commandlimit = 指挥上限 stat.commandlimit = 指挥上限
stat.abilities = 能力 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 = 反应性
stat.healing = 治疗
ability.forcefield = 力墙场 ability.forcefield = 力墙场
ability.repairfield = 修复场 ability.repairfield = 修复场
@@ -713,6 +764,7 @@ ability.statusfield = 状态场
ability.unitspawn = {0} 单位工厂 ability.unitspawn = {0} 单位工厂
ability.shieldregenfield = 护盾再生场 ability.shieldregenfield = 护盾再生场
ability.movelightning = 闪电助推器 ability.movelightning = 闪电助推器
ability.energyfield = 能量场: [accent]{0}[] 伤害 ~ [accent]{1}[] 格 / [accent]{2}[] 目标数
bar.drilltierreq = 需要更高级的钻头 bar.drilltierreq = 需要更高级的钻头
bar.noresources = 缺失资源 bar.noresources = 缺失资源
@@ -720,11 +772,12 @@ bar.corereq = 缺失核心基座
bar.drillspeed = 挖掘速度:{0}/秒 bar.drillspeed = 挖掘速度:{0}/秒
bar.pumpspeed = 泵压速度:{0}/秒 bar.pumpspeed = 泵压速度:{0}/秒
bar.efficiency = 效率:{0}% bar.efficiency = 效率:{0}%
bar.boost = 超速:{0}%
bar.powerbalance = 能量:{0}/秒 bar.powerbalance = 能量:{0}/秒
bar.powerstored = 储能:{0}/{1} bar.powerstored = 储能:{0}/{1}
bar.poweramount = 能量:{0} bar.poweramount = 能量:{0}
bar.poweroutput = 能量输出:{0} bar.poweroutput = 能量输出:{0}
bar.powerlines = 链接: {0}/{1} bar.powerlines = 链接{0}/{1}
bar.items = 物品:{0} bar.items = 物品:{0}
bar.capacity = 容量:{0} bar.capacity = 容量:{0}
bar.unitcap = {0} {1}/{2} bar.unitcap = {0} {1}/{2}
@@ -734,29 +787,28 @@ bar.power = 电力
bar.progress = 制造进度 bar.progress = 制造进度
bar.input = 输入 bar.input = 输入
bar.output = 输出 bar.output = 输出
bar.strength = [stat]{0}[lightgray]x 效率
units.processorcontrol = [lightgray]由处理器控制 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 = 方块
unit.blockssquared = 方块² unit.blockssquared = 方块²
unit.powersecond = 能量/秒 unit.powersecond = 能量/秒
unit.tilessecond = 格/秒
unit.liquidsecond = 液体/秒 unit.liquidsecond = 液体/秒
unit.itemssecond = 物品/秒 unit.itemssecond = 物品/秒
unit.liquidunits = 液体 unit.liquidunits = 液体
@@ -791,18 +843,20 @@ setting.logichints.name = 逻辑代码提示
setting.flow.name = 显示资源传送速度[scarlet] setting.flow.name = 显示资源传送速度[scarlet]
setting.backgroundpause.name = 在背景中暂停 setting.backgroundpause.name = 在背景中暂停
setting.buildautopause.name = 自动暂停建造 setting.buildautopause.name = 自动暂停建造
setting.animatedwater.name = 流动的水 setting.doubletapmine.name = 双击以采矿
setting.animatedshields.name = 动态画面 setting.modcrashdisable.name = 游戏启动崩溃时不禁用模组
setting.antialias.name = 抗锯齿 setting.animatedwater.name = 动态液体
setting.playerindicators.name = 玩家指示灯 setting.animatedshields.name = 动态力场
setting.indicators.name = 队友指示器 setting.playerindicators.name = 玩家指示器
setting.indicators.name = 敌军指示器
setting.autotarget.name = 自动射击 setting.autotarget.name = 自动射击
setting.keyboard.name = 鼠标+键盘操控 setting.keyboard.name = 鼠标+键盘操控
setting.touchscreen.name = 触屏操控 setting.touchscreen.name = 触屏操控
setting.fpscap.name = 最大FPS setting.fpscap.name = 最大FPS
setting.fpscap.none = setting.fpscap.none =
setting.fpscap.text = {0} FPS setting.fpscap.text = {0} FPS
setting.uiscale.name = UI缩放比例[lightgray](需要重新启动)[] setting.uiscale.name = UI缩放比例
setting.uiscale.description = 需要重新启动以应用更改。
setting.swapdiagonal.name = 总是斜线建造 setting.swapdiagonal.name = 总是斜线建造
setting.difficulty.training = 训练 setting.difficulty.training = 训练
setting.difficulty.easy = 简单 setting.difficulty.easy = 简单
@@ -820,7 +874,8 @@ setting.saveinterval.name = 自动保存间隔
setting.seconds = {0} 秒 setting.seconds = {0} 秒
setting.milliseconds = {0} 毫秒 setting.milliseconds = {0} 毫秒
setting.fullscreen.name = 全屏 setting.fullscreen.name = 全屏
setting.borderlesswindow.name = 无边界窗口[lightgray](可能需要重启) setting.borderlesswindow.name = 无边界窗口
setting.borderlesswindow.description = 可能需要重新启动以应用更改。
setting.fps.name = 显示 FPS 和网络延迟 setting.fps.name = 显示 FPS 和网络延迟
setting.smoothcamera.name = 镜头平滑 setting.smoothcamera.name = 镜头平滑
setting.vsync.name = 垂直同步 setting.vsync.name = 垂直同步
@@ -910,6 +965,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 = 控制台
@@ -936,21 +992,27 @@ mode.custom = 自定义模式
rules.infiniteresources = 无限资源 rules.infiniteresources = 无限资源
rules.reactorexplosions = 反应堆爆炸 rules.reactorexplosions = 反应堆爆炸
rules.schematic = 启用蓝图 rules.coreincinerates = 核心自动焚烧溢出物资
rules.schematic = 允许使用蓝图
rules.wavetimer = 波次计时器 rules.wavetimer = 波次计时器
rules.waves = 波次 rules.waves = 波次
rules.attack = 攻击模式 rules.attack = 攻击模式
rules.buildai = AI建造 rules.buildai = AI建造
rules.cleanupdeadteams = 清理被打败的队伍的建筑PvP模式
rules.corecapture = 摧毁核心时占领该核心
rules.polygoncoreprotection = 多边形核心保护区域
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.enemycorebuildradius = 敌对核心非建设区半径:[lightgray](格) rules.unitcapvariable = 每个核心提供的单位上限
rules.unitcap = 基础单位上限
rules.enemycorebuildradius = 敌方核心禁造区半径:[lightgray](格)
rules.wavespacing = 波次间隔时间:[lightgray](秒) rules.wavespacing = 波次间隔时间:[lightgray](秒)
rules.buildcostmultiplier = 设花费倍数 rules.buildcostmultiplier = 材倍率
rules.buildspeedmultiplier = 设时间倍数 rules.buildspeedmultiplier = 造速率
rules.deconstructrefundmultiplier = 拆除返还倍数 rules.deconstructrefundmultiplier = 拆除返还倍数
rules.waitForWaveToEnd = 等待敌人时间 rules.waitForWaveToEnd = 等待敌人时间
rules.dropzoneradius = 敌人出生点禁区大小:[lightgray](格) rules.dropzoneradius = 敌人出生点禁区大小:[lightgray](格)
@@ -962,7 +1024,7 @@ rules.title.unit = 单位
rules.title.experimental = 实验性 rules.title.experimental = 实验性
rules.title.environment = 环境性 rules.title.environment = 环境性
rules.lighting = 光照 rules.lighting = 光照
rules.enemyLights = 单位光照 rules.enemyLights = 敌方光照
rules.fire = 火焰 rules.fire = 火焰
rules.explosions = 建筑/单位爆炸伤害 rules.explosions = 建筑/单位爆炸伤害
rules.ambientlight = 环境光 rules.ambientlight = 环境光
@@ -973,8 +1035,9 @@ rules.weather.duration = 时长:
content.item.name = 物品 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 =
@@ -985,14 +1048,15 @@ item.titanium.name = 钛
item.thorium.name = item.thorium.name =
item.silicon.name = item.silicon.name =
item.plastanium.name = 塑钢 item.plastanium.name = 塑钢
item.phase-fabric.name = item.phase-fabric.name =
item.surge-alloy.name = 巨浪合金 item.surge-alloy.name = 巨浪合金
item.spore-pod.name = 孢子荚 item.spore-pod.name = 孢子荚
item.sand.name = item.sand.name =
item.blast-compound.name = 爆炸混合物 item.blast-compound.name = 爆炸混合物
item.pyratite.name = item.pyratite.name = 火石
item.metaglass.name = 钢化玻璃 item.metaglass.name = 钢化玻璃
item.scrap.name = 废料 item.scrap.name = 废料
liquid.water.name = liquid.water.name =
liquid.slag.name = 矿渣 liquid.slag.name = 矿渣
liquid.oil.name = 石油 liquid.oil.name = 石油
@@ -1024,6 +1088,11 @@ unit.minke.name = 飞鲨
unit.bryde.name = 戟鲸 unit.bryde.name = 戟鲸
unit.sei.name = 蛟龙 unit.sei.name = 蛟龙
unit.omura.name = 海神 unit.omura.name = 海神
unit.retusa.name = 潜螺
unit.oxynoe.name = 电鳗
unit.cyerce.name = 江豚
unit.aegires.name = 神盾
unit.navanax.name = 龙王
unit.alpha.name = 阿尔法 unit.alpha.name = 阿尔法
unit.beta.name = 贝塔 unit.beta.name = 贝塔
unit.gamma.name = 伽马 unit.gamma.name = 伽马
@@ -1072,7 +1141,7 @@ block.core-nucleus.name = 终代核心
block.deepwater.name = 深水 block.deepwater.name = 深水
block.water.name = block.water.name =
block.tainted-water.name = 污水 block.tainted-water.name = 污水
block.darksand-tainted-water.name = 沙 污水 block.darksand-tainted-water.name = 沙 污水
block.tar.name = 石油 block.tar.name = 石油
block.stone.name = 石头 block.stone.name = 石头
block.sand.name = 沙子 block.sand.name = 沙子
@@ -1081,11 +1150,12 @@ block.ice.name = 冰
block.snow.name = block.snow.name =
block.craters.name = 陨石坑 block.craters.name = 陨石坑
block.sand-water.name = 沙 水 block.sand-water.name = 沙 水
block.darksand-water.name = 沙 水 block.darksand-water.name = 沙 水
block.char.name = 焦土 block.char.name = 焦土
block.dacite.name = 安岩 block.dacite.name =
block.dacite-wall.name = 英安岩墙 block.rhyolite.name = 流纹岩
block.dacite-boulder.name = 英安巨岩 block.dacite-wall.name = 安山岩墙
block.dacite-boulder.name = 安山巨岩
block.ice-snow.name = 冰雪地 block.ice-snow.name = 冰雪地
block.stone-wall.name = 石墙 block.stone-wall.name = 石墙
block.ice-wall.name = 冰墙 block.ice-wall.name = 冰墙
@@ -1101,7 +1171,8 @@ block.spore-cluster.name = 孢子簇
block.metal-floor.name = 金属地板1 block.metal-floor.name = 金属地板1
block.metal-floor-2.name = 金属地板2 block.metal-floor-2.name = 金属地板2
block.metal-floor-3.name = 金属地板3 block.metal-floor-3.name = 金属地板3
block.metal-floor-5.name = 金属地板4 block.metal-floor-4.name = 金属地板4
block.metal-floor-5.name = 金属地板5
block.metal-floor-damaged.name = 损坏的金属地板 block.metal-floor-damaged.name = 损坏的金属地板
block.dark-panel-1.name = 暗面板1 block.dark-panel-1.name = 暗面板1
block.dark-panel-2.name = 暗面板2 block.dark-panel-2.name = 暗面板2
@@ -1111,16 +1182,16 @@ block.dark-panel-5.name = 暗面板5
block.dark-panel-6.name = 暗面板6 block.dark-panel-6.name = 暗面板6
block.dark-metal.name = 暗金属 block.dark-metal.name = 暗金属
block.basalt.name = 玄武岩 block.basalt.name = 玄武岩
block.hotrock.name = 热石头 block.hotrock.name = 灼热岩石
block.magmarock.name = 岩浆石头 block.magmarock.name = 熔融岩石
block.copper-wall.name = 铜墙 block.copper-wall.name = 铜墙
block.copper-wall-large.name = 大型铜墙 block.copper-wall-large.name = 大型铜墙
block.titanium-wall.name = 钛墙 block.titanium-wall.name = 钛墙
block.titanium-wall-large.name = 大型钛墙 block.titanium-wall-large.name = 大型钛墙
block.plastanium-wall.name = 塑钢墙 block.plastanium-wall.name = 塑钢墙
block.plastanium-wall-large.name = 大型塑钢墙 block.plastanium-wall-large.name = 大型塑钢墙
block.phase-wall.name = 物墙 block.phase-wall.name = 物墙
block.phase-wall-large.name = 大型相物墙 block.phase-wall-large.name = 大型相物墙
block.thorium-wall.name = 钍墙 block.thorium-wall.name = 钍墙
block.thorium-wall-large.name = 大型钍墙 block.thorium-wall-large.name = 大型钍墙
block.door.name = block.door.name =
@@ -1144,7 +1215,7 @@ block.illuminator.name = 照明器
block.overflow-gate.name = 溢流门 block.overflow-gate.name = 溢流门
block.underflow-gate.name = 反向溢流门 block.underflow-gate.name = 反向溢流门
block.silicon-smelter.name = 硅冶炼厂 block.silicon-smelter.name = 硅冶炼厂
block.phase-weaver.name = 物编织器 block.phase-weaver.name = 物编织器
block.pulverizer.name = 粉碎机 block.pulverizer.name = 粉碎机
block.cryofluid-mixer.name = 冷冻液混合器 block.cryofluid-mixer.name = 冷冻液混合器
block.melter.name = 熔炉 block.melter.name = 熔炉
@@ -1182,10 +1253,10 @@ block.tsunami.name = 海啸
block.swarmer.name = 蜂群 block.swarmer.name = 蜂群
block.salvo.name = 齐射炮 block.salvo.name = 齐射炮
block.ripple.name = 浪涌 block.ripple.name = 浪涌
block.phase-conveyor.name = 物传送带桥 block.phase-conveyor.name = 物传送带桥
block.bridge-conveyor.name = 传送带桥 block.bridge-conveyor.name = 传送带桥
block.plastanium-compressor.name = 塑钢压缩机 block.plastanium-compressor.name = 塑钢压缩机
block.pyratite-mixer.name = 硫化物混合器 block.pyratite-mixer.name = 火石混合器
block.blast-mixer.name = 爆炸物混合器 block.blast-mixer.name = 爆炸物混合器
block.solar-panel.name = 太阳能板 block.solar-panel.name = 太阳能板
block.solar-panel-large.name = 大型太阳能板 block.solar-panel-large.name = 大型太阳能板
@@ -1193,7 +1264,7 @@ block.oil-extractor.name = 石油钻井
block.repair-point.name = 维修点 block.repair-point.name = 维修点
block.pulse-conduit.name = 脉冲导管 block.pulse-conduit.name = 脉冲导管
block.plated-conduit.name = 电镀导管 block.plated-conduit.name = 电镀导管
block.phase-conduit.name = 物导管桥 block.phase-conduit.name = 物导管桥
block.liquid-router.name = 液体路由器 block.liquid-router.name = 液体路由器
block.liquid-tank.name = 储液罐 block.liquid-tank.name = 储液罐
block.liquid-junction.name = 液体交叉器 block.liquid-junction.name = 液体交叉器
@@ -1233,14 +1304,20 @@ block.exponential-reconstructor.name = 多幂级单位重构工厂
block.tetrative-reconstructor.name = 无量级单位重构工厂 block.tetrative-reconstructor.name = 无量级单位重构工厂
block.payload-conveyor.name = 载荷传送带 block.payload-conveyor.name = 载荷传送带
block.payload-router.name = 载荷路由器 block.payload-router.name = 载荷路由器
block.duct.name = 物品导管
block.duct-router.name = 物品导管路由器
block.duct-bridge.name = 物品导管桥
block.payload-propulsion-tower.name = 载荷驱动台
block.payload-void.name = 载荷黑洞
block.payload-source.name =载荷源
block.disassembler.name = 解离机 block.disassembler.name = 解离机
block.silicon-crucible.name = 热能坩埚 block.silicon-crucible.name = 热能坩埚
block.overdrive-dome.name = 超速穹顶投射器 block.overdrive-dome.name = 超速穹顶投射器
block.interplanetary-accelerator.name = 行星际加速器
#experimental, may be removed #experimental, may be removed
block.block-forge.name = 方块熔炉 block.block-forge.name = 方块熔炉
block.block-loader.name = 方块装载机 block.block-loader.name = 方块装载机
block.block-unloader.name = 方块卸载机 block.block-unloader.name = 方块卸载机
block.interplanetary-accelerator.name = 行星际加速器
block.switch.name = 开关 block.switch.name = 开关
block.micro-processor.name = 微型处理器 block.micro-processor.name = 微型处理器
@@ -1254,50 +1331,50 @@ block.memory-bank.name = 内存库
team.blue.name = team.blue.name =
team.crux.name = team.crux.name =
team.sharded.name = team.sharded.name =
team.orange.name =
team.derelict.name = team.derelict.name =
team.green.name = 绿 team.green.name = 绿
team.purple.name = team.purple.name =
hint.skip = 跳过 hint.skip = 跳过
hint.desktopMove = 使用[accent][[WASD][]来移动. hint.desktopMove = 使用[accent][[WASD][]来移动
hint.zoom = 滚动[accent]鼠标滚轮[]放大或缩小. hint.zoom = 滚动[accent]鼠标滚轮[]放大或缩小
hint.mine = 移动到\uf8c4 铜矿附近并[accent]点按[]进行手动开采. hint.mine = 移动到\uf8c4 铜矿附近并[accent]点按[]进行手动开采
hint.desktopShoot = [accent][[鼠标左键][]射击. hint.desktopShoot = [accent][[鼠标左键][]射击
hint.depositItems = 要转移物品,请将其从飞船上拖到核心。 hint.depositItems = 要转移物品,请将其从飞船上拖到核心。
hint.respawn = 要于核心中重生,请按[accent][[V][]. hint.respawn = 要于核心中重生,请按[accent][[V][]
hint.respawn.mobile = 您已切换控制单元/结构. 如果要重生飞船,请[accent]点击左上方的图标(您的单元/结构图标).[] hint.respawn.mobile = 您已切换控制单元/建筑。如果要重生飞船,请[accent]点击左上方的图标(您的单元/结构图标)[]
hint.desktopPause = 按[accent][[Space][]暂停和取消暂停游戏. hint.desktopPause = 按[accent][[Space][]暂停和取消暂停游戏
hint.placeDrill = 选择右下角菜单中的\ue85e [accent]钻头[]分类,然后选择一个\uf870 [accent]钻头[]然后单击铜矿将其放置. hint.placeDrill = 选择右下角菜单中的\ue85e [accent]钻头[]分类,然后选择一个\uf870 [accent]钻头[]然后单击铜矿将其放置
hint.placeDrill.mobile = 选择右下角菜单中的\ue85e [accent]钻头[]分类,然后选择一个\uf870 [accent]钻头[],然后点击铜矿将其放置.\n\n点击右下角\ue800 [accent]复选标记[]以确认. hint.placeDrill.mobile = 选择右下角菜单中的\ue85e [accent]钻头[]分类,然后选择一个\uf870 [accent]钻头[],然后点击铜矿将其放置\n\n点击右下角\ue800 [accent]复选标记[]以确认
hint.placeConveyor = 传送带将物品从钻头移到其他方块中。从\ue814 [accent]布局[]分类选择\uf896 [accent]传送带[].\n\n单击并拖动以放置多个传送带.\n[accent]滚动[]以旋转. hint.placeConveyor = 传送带将物品从钻头移到其他方块中。从\ue814 [accent]布局[]分类选择\uf896 [accent]传送带[]\n\n单击并拖动以放置多个传送带\n[accent]滚动[]以旋转
hint.placeConveyor.mobile = 传送带将物品从钻头移到其他块中。从\ue814 [accent]布局[]分类选择\uf896 [accent]传送带[].\n\n长按一秒钟然后拖动以放置多个传送带. hint.placeConveyor.mobile = 传送带将物品从钻头移到其他块中。从\ue814 [accent]布局[]分类选择\uf896 [accent]传送带[]\n\n长按一秒钟然后拖动以放置多个传送带
hint.placeTurret = 放置\uf861 [accent]炮塔[]以抵御敌人,保卫你的核心.\n\n炮塔需要弹药-\uf838 铜.\n使用传送带和钻头为它们供弹。 hint.placeTurret = 放置\uf861 [accent]炮塔[]以抵御敌人,保卫你的核心\n\n炮塔需要弹药-\uf838 铜\n使用传送带和钻头为它们供弹。
hint.breaking = [accent]右击[]并拖动以拆除方块. hint.breaking = [accent]右击[]并拖动以拆除方块
hint.breaking.mobile = 点击在右下角的\ue817 [accent]锤子[]点击以拆除方块.\n\n按住手指一秒钟然后拖动并选择. hint.breaking.mobile = 点击在右下角的\ue817 [accent]锤子[]点击以拆除方块\n\n按住手指一秒钟然后拖动并选择
hint.research = 点击\ue875 [accent]科技树[]按钮研究新技术. hint.blockInfo = 在 [accent]建造菜单[]中选择一个建筑,然后点击右边的 [accent][[?][]按钮以查看这个方块的信息。
hint.research.mobile = 点击在\ue88c [accent]菜单[]中的\ue875 [accent]科技树[]按钮研究新技术. hint.research = 点击\ue875 [accent]科技树[]按钮研究新技术
hint.research.mobile = 点击在\ue88c [accent]菜单[]中的\ue875 [accent]科技树[]按钮以研究新技术。
hint.unitControl = 按住[accent][[L-ctrl][]并[accent]点击[]友军单位或炮塔来进行控制。 hint.unitControl = 按住[accent][[L-ctrl][]并[accent]点击[]友军单位或炮塔来进行控制。
hint.unitControl.mobile = [accent][双击][]友军单位或炮塔来进行控制。 hint.unitControl.mobile = [accent][双击][]友军单位或炮塔来进行控制。
hint.launch = 一旦收集到足够的资源,您就可以通过从右下角的\ue827 [accent]地图[]选择附近的区域[accent]发射[]核心. hint.launch = 一旦收集到足够的资源,您就可以通过从右下角的\ue827 [accent]地图[]选择附近的区域[accent]发射[]核心
hint.launch.mobile = 一旦收集到足够的资源,您就可以通过在\ue88c [accent]菜单[]的\ue827 [accent]地图[]选择附近的区域[accent]发射[]核心. hint.launch.mobile = 一旦收集到足够的资源,您就可以通过在\ue88c [accent]菜单[]的\ue827 [accent]地图[]选择附近的区域[accent]发射[]核心
hint.schematicSelect = 按住[accent][[F][]并拖动以选择要复制和粘贴的块.\n\n[accent][鼠标中键][]复制单个块类型. hint.schematicSelect = 按住[accent][[F][]并拖动以选择要复制和粘贴的块\n\n[accent][鼠标中键][]复制单个块类型
hint.conveyorPathfind = 按住[accent][[L-Ctrl][]拖动传送带并使其自动寻路. hint.conveyorPathfind = 按住[accent][[L-Ctrl][]拖动传送带并使其自动寻路
hint.conveyorPathfind.mobile = 启用\ue844 [accent]传送带自动寻路[]并拖动,传送带会自动生成路径. hint.conveyorPathfind.mobile = 启用\ue844 [accent]传送带自动寻路[]并拖动,传送带会自动生成路径
hint.boost = 按住[accent][[L-Shift][]用当前单位飞越障碍物.\n\n但只有少数地面单位有助推器. hint.boost = 按住[accent][[L-Shift][]用当前单位飞越障碍物\n\n但只有少数地面单位有助推器
hint.command = 按住[accent][[G][]指挥附近的单位编队. hint.command = 按住[accent][[G][]指挥附近的单位编队
hint.command.mobile = [accent][[双击][]您的部队指挥附近的部队编队. hint.command.mobile = [accent][[双击][]您的部队指挥附近的部队编队
hint.payloadPickup = 按[accent][[[]捡起方块或单位. hint.payloadPickup = 按[accent][[[]捡起方块或单位
hint.payloadPickup.mobile = [accent]长按一个方块或一个单位来捡起来. hint.payloadPickup.mobile = [accent]长按一个方块或一个单位来捡起来
hint.payloadDrop = 按[accent]][]放下有效载荷. hint.payloadDrop = 按[accent]][]放下捡起的方块或单位。
hint.payloadDrop.mobile = [accent]点住[]一个空的位置将有效载荷丢到那里. hint.payloadDrop.mobile = [accent]点住[]一个空的位置将捡起的方块或单位丢到那里
hint.waveFire = [accent]波浪[]炮塔加水弹药会自动扑灭附近的火. hint.waveFire = [accent]波浪[]炮塔加水弹药会自动扑灭附近的火
hint.generator = \uf879 [accent]燃烧发电机[]燃烧煤炭并将电力传输到相邻方块.\n\n用\uf87f [accent]能量节点[]可以扩展电力传输范围. hint.generator = \uf879 [accent]燃烧发电机[]燃烧煤炭并将电力传输到相邻方块\n\n用\uf87f [accent]能量节点[]可以扩展电力传输范围
hint.guardian = [accent]Boss[]单位装甲厚重.[accent]铜[]和[accent]铅[]这类较弱的子弹对其[scarlet]作用不佳[].\n\n使用高级别炮塔或使用\uf835 [accent]石墨[]作为\uf861 双管炮及\uf859 齐射炮的弹药来消灭Boss. hint.guardian = [accent]Boss[]单位装甲厚重[accent]铜[]和[accent]铅[]这类较弱的子弹对其[scarlet]作用不佳[]\n\n使用高级别炮塔或使用\uf835 [accent]石墨[]作为\uf861 双管炮及\uf859 齐射炮的弹药来消灭Boss
hint.coreUpgrade = 核心可以通过[accent]在上面覆盖高等级核心[]进行升级。\n\n在[accent]初代核心[]上放置一个[accent]次代核心[]。确保周围没有障碍物。 hint.coreUpgrade = 核心可以通过[accent]在上面覆盖高等级核心[]进行升级。\n\n在[accent]初代核心[]上放置一个[accent]次代核心[]。确保周围没有障碍物。
hint.presetLaunch = 灰色的[accent]降落地区[],如[accent]冰冻森林[],可以从任何区域发射,不需要占领附近的区块。\n\n[accent]数字编号的区域[],如这个,是[accent]可选的[]。 hint.presetLaunch = 灰色的[accent]降落地区[],如[accent]冰冻森林[],可以从任何区域发射,不需要占领附近的区块。\n\n[accent]数字编号的区域[],如这个,是[accent]可选的[]。
hint.coreIncinerate = 核心存满一种物品后,再进入的同种物品会被[accent]摧毁[]。 hint.coreIncinerate = 核心存满一种物品后,再进入的同种物品会被[accent]摧毁[]。
hint.coopCampaign = 游玩[accent]合作战役[]时,当前地图生产的资源也会被送入[accent]本地的区域[]。\n\n新科技也会同步解锁。 hint.coopCampaign = 游玩[accent]合作战役[]时,当前地图生产的资源也会被送入[accent]本地的区域[]。\n\n新科技也会同步解锁。
item.copper.description = 用于所有类型的建筑和弹药。 item.copper.description = 用于所有类型的建筑和弹药。
item.copper.details = 铜。在塞普罗上的异常丰富的金属。不经加固,结构会较脆弱。 item.copper.details = 铜。在塞普罗上的异常丰富的金属。不经加固,结构会较脆弱。
@@ -1327,7 +1404,7 @@ liquid.oil.description = 用于先进材料生产和燃烧弹药。
liquid.cryofluid.description = 用作反应堆、炮塔和工厂的冷却剂。 liquid.cryofluid.description = 用作反应堆、炮塔和工厂的冷却剂。
block.resupply-point.description = 为附近的部队提供铜弹药。与需要电池供电的设备不兼容。 block.resupply-point.description = 为附近的部队提供铜弹药。与需要电池供电的设备不兼容。
block.armored-conveyor.description = 向前方移动物品。不接受边上的输入。 block.armored-conveyor.description = 将物品向前输送。不接受两侧的非传送带输入。
block.illuminator.description = 释放光源。 block.illuminator.description = 释放光源。
block.message.description = 保存一条文字信息。用于队友之间进行交流。 block.message.description = 保存一条文字信息。用于队友之间进行交流。
block.graphite-press.description = 将煤炭压缩为石墨。 block.graphite-press.description = 将煤炭压缩为石墨。
@@ -1335,11 +1412,11 @@ block.multi-press.description = 将煤炭压缩为石墨。需要水进行冷却
block.silicon-smelter.description = 将沙和煤炭精炼为硅。 block.silicon-smelter.description = 将沙和煤炭精炼为硅。
block.kiln.description = 将沙和铅熔炼为钢化玻璃。 block.kiln.description = 将沙和铅熔炼为钢化玻璃。
block.plastanium-compressor.description = 用石油和钛生产塑钢。 block.plastanium-compressor.description = 用石油和钛生产塑钢。
block.phase-weaver.description = 钍和沙合成相物。 block.phase-weaver.description = 钍和沙合成相物。
block.alloy-smelter.description = 将钛、铅、硅和铜熔合成巨浪合金。 block.alloy-smelter.description = 将钛、铅、硅和铜熔合成巨浪合金。
block.cryofluid-mixer.description = 将水和细钛粉混合制成冷冻液。 block.cryofluid-mixer.description = 将水和细钛粉混合制成冷冻液。
block.blast-mixer.description = 从硫化物和孢子荚中产生爆炸合物。 block.blast-mixer.description = 把火石和孢子荚混合为爆炸合物。
block.pyratite-mixer.description = 把煤、铅和沙子混和为硫化物 block.pyratite-mixer.description = 把煤、铅和沙子混合为火石
block.melter.description = 将废料熔化成矿渣。 block.melter.description = 将废料熔化成矿渣。
block.separator.description = 将矿渣分离成矿物成分。 block.separator.description = 将矿渣分离成矿物成分。
block.spore-press.description = 将孢子荚压缩成石油。 block.spore-press.description = 将孢子荚压缩成石油。
@@ -1362,18 +1439,18 @@ block.thorium-wall.description = 保护己方结构,挡下敌方炮弹。
block.thorium-wall-large.description = 保护己方结构,挡下敌方炮弹。 block.thorium-wall-large.description = 保护己方结构,挡下敌方炮弹。
block.phase-wall.description = 保护己方结构,挡下敌方炮弹。在受攻击时反射大多数子弹。 block.phase-wall.description = 保护己方结构,挡下敌方炮弹。在受攻击时反射大多数子弹。
block.phase-wall-large.description = 保护己方结构,挡下敌方炮弹。在受攻击时反射大多数子弹。 block.phase-wall-large.description = 保护己方结构,挡下敌方炮弹。在受攻击时反射大多数子弹。
block.surge-wall.description = 保护己方结构,挡下敌方炮弹。受攻击时定期释放电弧。 block.surge-wall.description = 保护己方结构,挡下敌方炮弹。受攻击时有几率释放电弧。
block.surge-wall-large.description = 保护己方结构,挡下敌方炮弹。受攻击时定期释放电弧。 block.surge-wall-large.description = 保护己方结构,挡下敌方炮弹。受攻击时有几率释放电弧。
block.door.description = 可以开关的墙。 block.door.description = 可以开关的墙。
block.door-large.description = 可以开关的墙。 block.door-large.description = 可以开关的墙。
block.mender.description = 定期修复附近的区块。\n可使用硅来提高范围和效率。 block.mender.description = 定期修复附近的区块。\n可使用硅来提高范围和效率。
block.mend-projector.description = 修复其附近的区块。\n可使用相物来提高射程和效率。 block.mend-projector.description = 修复其附近的区块。\n可使用相物来提高范围和效率。
block.overdrive-projector.description = 提高附近建筑物的速度。\n可使用相物来提高射程和效率。 block.overdrive-projector.description = 提高附近建筑物的速度。\n可使用相物来提高范围和效率。
block.force-projector.description = 在自身周围创建一个六角形力场,使里面的建筑物和单位免受伤害。\n持续承受高伤害会导致过热可以使用冷却液降温。相物可用于增加护盾大小。 block.force-projector.description = 在自身周围创建一个六角形力场,使里面的建筑物和单位免受伤害。\n持续承受高伤害会导致过热可以使用冷却液降温。相物可用于增加护盾大小和盾容
block.shock-mine.description = 对踩到它的敌人释放电弧进行攻击。 block.shock-mine.description = 对踩到它的敌人释放电弧进行攻击。
block.conveyor.description = 将物品向前输送。 block.conveyor.description = 将物品向前输送。
block.titanium-conveyor.description = 将物品向前输送。快于初级传送带。 block.titanium-conveyor.description = 将物品向前输送。快于初级传送带。
block.plastanium-conveyor.description = 打包物品进行运输。\n在后方输入物品在前方三个方向输出物品。需要多个装载和卸载点才能达到峰值载量。 block.plastanium-conveyor.description = 打包物品进行运输。\n在后方输入物品在前方三个方向输出物品。需要多个装载和卸载点才能达到最大运载量。
block.junction.description = 两条交叉传送带的桥梁。 block.junction.description = 两条交叉传送带的桥梁。
block.bridge-conveyor.description = 跨越任意地形或建筑物运输物品。 block.bridge-conveyor.description = 跨越任意地形或建筑物运输物品。
block.phase-conveyor.description = 跨越任意地形或建筑物即时运输物品。比传送带桥范围更大,但需要电力。 block.phase-conveyor.description = 跨越任意地形或建筑物即时运输物品。比传送带桥范围更大,但需要电力。
@@ -1384,7 +1461,7 @@ block.router.details = 这是个好东西,也可以带来麻烦。不建议在
block.distributor.description = 将物品平均分配到其他7个方向。 block.distributor.description = 将物品平均分配到其他7个方向。
block.overflow-gate.description = 当前方被阻塞时才会向左和右输出,用于处理多余的物品。 block.overflow-gate.description = 当前方被阻塞时才会向左和右输出,用于处理多余的物品。
block.underflow-gate.description = 与溢流门相反。 当左右均堵塞时才向前方运输。 block.underflow-gate.description = 与溢流门相反。 当左右均堵塞时才向前方运输。
block.mass-driver.description = 长距离物品传输结构,收集若干物品后将其射到远处的另一个质量驱动器。 block.mass-driver.description = 长距离物品传输建筑,收集若干物品后将其射到远处的另一个质量驱动器。
block.mechanical-pump.description = 泵送液体,不需要能量。 block.mechanical-pump.description = 泵送液体,不需要能量。
block.rotary-pump.description = 泵送液体,需要能量。 block.rotary-pump.description = 泵送液体,需要能量。
block.thermal-pump.description = 泵送液体。 block.thermal-pump.description = 泵送液体。
@@ -1405,7 +1482,7 @@ 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 = 利用放射物的衰变产生的热量以缓慢的速度产生能量。
block.solar-panel.description = 提供少量太阳能。 block.solar-panel.description = 提供少量太阳能。
block.solar-panel-large.description = 提供少量太阳能。比标准太阳能电池板更高效。 block.solar-panel-large.description = 提供少量太阳能。比标准太阳能电池板更高效。
@@ -1431,7 +1508,7 @@ block.unloader.description = 从周围方块卸载指定物品。
block.launch-pad.description = 将货物发射至指定区块。 block.launch-pad.description = 将货物发射至指定区块。
block.duo.description = 交替向敌人发射子弹。 block.duo.description = 交替向敌人发射子弹。
block.scatter.description = 向敌机发射铅、废料或钢化玻璃高射炮弹。 block.scatter.description = 向敌机发射铅、废料或钢化玻璃高射炮弹。
block.scorch.description = 焚烧任何靠近它的地面敌人。近距离高效 block.scorch.description = 焚烧任何靠近它的地面敌人。近距离高效
block.hail.description = 向远距离地面敌人发射小型炮弹。 block.hail.description = 向远距离地面敌人发射小型炮弹。
block.wave.description = 向敌人射出液体流。使用水作弹药时能够自动灭火。 block.wave.description = 向敌人射出液体流。使用水作弹药时能够自动灭火。
block.lancer.description = 充能并向地面单位发射强力的的波束。 block.lancer.description = 充能并向地面单位发射强力的的波束。
@@ -1448,11 +1525,11 @@ block.repair-point.description = 持续修复其附近受损最严重的单位
block.segment.description = 摧毁袭来的除激光以外的子弹或导弹。 block.segment.description = 摧毁袭来的除激光以外的子弹或导弹。
block.parallax.description = 通过牵引光束牵引空中目标,并在这个过程中对其造成伤害。 block.parallax.description = 通过牵引光束牵引空中目标,并在这个过程中对其造成伤害。
block.tsunami.description = 向敌人射出强力的液体流。使用水作弹药时能够自动灭火。 block.tsunami.description = 向敌人射出强力的液体流。使用水作弹药时能够自动灭火。
block.silicon-crucible.description = 从沙子和煤中提炼硅,用硫化物作为附加热源。在炙热地型上更高效。 block.silicon-crucible.description = 从沙子和煤中提炼硅,用火石作为附加热源。在炙热地型上更高效。
block.disassembler.description = 以低效率将矿渣分离成微量的外来矿物成分。能产生钍。 block.disassembler.description = 以低效率将矿渣分离成微量的外来矿物成分。能产生钍。
block.overdrive-dome.description = 提高附近建筑物的速度。需要相物和硅来工作。 block.overdrive-dome.description = 提高附近建筑物的速度。需要相物和硅来工作。
block.payload-conveyor.description = 移动大型有效载荷,例如从工厂生产的单位。 block.payload-conveyor.description = 移动大型载荷,例如从工厂生产的单位。
block.payload-router.description = 将输入的有效载荷向3个方向输出。 block.payload-router.description = 将输入的载荷向3个方向输出。
block.command-center.description = 使用多个不同的命令控制单位。 block.command-center.description = 使用多个不同的命令控制单位。
block.ground-factory.description = 产生陆军单位。输出的单位可以直接使用,也可以移入重构厂进行升级。 block.ground-factory.description = 产生陆军单位。输出的单位可以直接使用,也可以移入重构厂进行升级。
block.air-factory.description = 产生空军单位。输出的单位可以直接使用,也可以移入重构厂进行升级。 block.air-factory.description = 产生空军单位。输出的单位可以直接使用,也可以移入重构厂进行升级。
@@ -1469,41 +1546,48 @@ block.memory-cell.description = 存储处理器的信息。
block.memory-bank.description = 存储处理器的信息。内存量更大。 block.memory-bank.description = 存储处理器的信息。内存量更大。
block.logic-display.description = 显示处理器中的任意图形。 block.logic-display.description = 显示处理器中的任意图形。
block.large-logic-display.description = 显示处理器中的任意图形。 block.large-logic-display.description = 显示处理器中的任意图形。
block.interplanetary-accelerator.description = 一个巨大的电磁轨道加速器。加速核心逃逸速度以进行星际部署。 block.interplanetary-accelerator.description = 一个巨大的电磁轨道加速器。加速核心逃逸速度以进行星际部署。
block.repair-turret.description = 持续修复其范围内最近的受损单位。可使用液体冷却以提高修复效率。
block.payload-propulsion-tower.description = 长距离载荷运输建筑。向与其相链接的其它载荷驱动台发射载荷。
unit.dagger.description = 攻击附近所有敌人发射标准子弹。 unit.dagger.description = 附近所有敌人发射标准子弹。
unit.mace.description = 攻击附近所有敌人。发射火焰。 unit.mace.description = 附近所有敌人射火焰。
unit.fortress.description = 攻击地面敌人发射远程火炮。 unit.fortress.description = 向附近所有地面敌人发射远程火炮。
unit.scepter.description = 攻击附近所有敌人发射充能弹。 unit.scepter.description = 附近所有敌人发射一串电荷弹。
unit.reign.description = 攻击附近所有敌人发射穿透性子弹。 unit.reign.description = 附近所有敌人发射巨型穿甲弹。
unit.nova.description = 发射激光弹攻击敌人并修复盟军建筑。能够飞行。 unit.nova.description = 发射激光弹攻击敌人并修复友方建筑。能够飞行。
unit.pulsar.description = 发射电弧攻击敌人并修复盟军建筑。能够飞行。 unit.pulsar.description = 发射数条电弧攻击敌人并修复友方建筑。能够飞行。
unit.quasar.description = 发射穿透性激光束攻击敌人并修复盟军建筑。能够飞行。拥有护盾。 unit.quasar.description = 发射穿透性激光束攻击敌人并修复友方建筑。能够飞行。拥有护盾。
unit.vela.description = 发射巨大的持续激光束攻击敌人,引起火灾并修复盟军建筑。能够飞行。 unit.vela.description = 发射巨持续激光束攻击敌人,点燃敌人并修复友方建筑。能够飞行。
unit.corvus.description = 发射巨大的激光爆破束,摧毁敌人并修复盟军建筑。可以跨越大多数地形。 unit.corvus.description = 发射巨型爆破激光束攻击敌人并修复友方建筑。可以跨越大多数地形。
unit.crawler.description = 冲向敌人并自毁,造成大爆炸。 unit.crawler.description = 冲向敌人并自毁,造成大爆炸。
unit.atrax.description = 向地面目标发射削弱性矿渣球。可以跨越大多数地形。 unit.atrax.description = 向地面敌人发射削弱性矿渣球。可以跨越大多数地形。
unit.spiroct.description = 向敌人发射激光束,并在此过程中自我修复。可以跨越大多数地形。 unit.spiroct.description = 向敌人发射激光束,并在此过程中自我修复。可以跨越大多数地形。
unit.arkyid.description = 向敌人发射大激光束,并在此过程中自我修复。可以跨越大多数地形。 unit.arkyid.description = 向敌人发射大激光束,并在此过程中自我修复。可以跨越大多数地形。
unit.toxopid.description = 向敌人发射大型电能集束炮弹和穿透激光。可以跨越大多数地形。 unit.toxopid.description = 向敌人发射大型电能集束炮弹和穿透激光。可以跨越大多数地形。
unit.flare.description = 攻击地面敌人发射标准子弹。 unit.flare.description = 向附近所有地面敌人发射标准子弹。
unit.horizon.description = 攻击地面敌人投下炸弹。 unit.horizon.description = 地面敌人投下炸弹
unit.zenith.description = 攻击附近所有敌人发射导弹群。 unit.zenith.description = 附近所有敌人发射导弹群。
unit.antumbra.description = 攻击附近所有敌人发射密集的子弹。 unit.antumbra.description = 附近所有敌人发射弹
unit.eclipse.description = 攻击附近所有敌人发射穿透性激光和分裂弹。 unit.eclipse.description = 附近所有敌人发射两道穿透性激光和一连串子弹。
unit.mono.description = 自动开采铜和铅,并将其放入核心中。 unit.mono.description = 自动开采铜和铅,并将其放入核心中。
unit.poly.description = 自动重建受损结构,协助其他单位建造。 unit.poly.description = 自动重建被摧毁的建筑并协助其他单位建造。
unit.mega.description = 自动修复受损结构。能够携带方块和小型地面部队。 unit.mega.description = 自动修复受损结构。能够携带方块和小型地面部队。
unit.quad.description = 向地面目标投掷大型炸弹,修复盟军建筑并摧毁敌人。能够携带中型地面部队。 unit.quad.description = 向地面敌人投掷大型炸弹,修复友方建筑并攻击敌人。能够携带中型地面部队。
unit.oct.description = 用它的再生护盾保护附近的友。能够携带大多数地面部队。 unit.oct.description = 用它的再生护盾保护附近的友方单位。能够携带大多数地面部队。
unit.risso.description = 攻击附近所有敌人发射一连串的导弹和子弹。 unit.risso.description = 附近所有敌人发射一连串的导弹和子弹。
unit.minke.description = 攻击附近所有敌人发射炮弹和标准子弹。 unit.minke.description = 附近所有敌人发射炮弹和标准子弹。
unit.bryde.description = 攻击附近所有敌人。发射发射远程炮弹和导弹。 unit.bryde.description = 附近所有敌人发射远程炮弹和导弹。
unit.sei.description = 攻击附近所有敌人发射一连串的导弹和穿甲弹。 unit.sei.description = 附近所有敌人发射一连串的导弹和穿甲弹。
unit.omura.description = 攻击附近所有敌人发射远程穿透轨道炮。构造星耀单元 unit.omura.description = 附近所有敌人发射远程穿透轨道炮。构造星辉单位
unit.alpha.description = 保护初代核心。可构建结构 unit.alpha.description = 保护初代核心。可建造建筑
unit.beta.description = 保护次代核心。可构建结构 unit.beta.description = 保护次代核心。可建造建筑
unit.gamma.description = 保护终代核心。可构建结构 unit.gamma.description = 保护终代核心。可建造建筑
unit.retusa.description = 在附近放置水雷并修复友方建筑。
unit.oxynoe.description = 向附近所有敌人喷射火焰并修复友方建筑。使用点防御摧毁附近的敌方射弹。
unit.cyerce.description = 向附近所有敌人发射跟踪集束导弹并修复友方建筑。
unit.aegires.description = 电击一切在它能量场范围内的敌方单位和建筑并修复所有友方单位和建筑。
unit.navanax.description = 发射电磁脉冲爆弹,破坏敌方电网并修复友方建筑。使用四门自动激光炮塔融化附近所有敌人。
lst.read = 从连接的内存读取数字 lst.read = 从连接的内存读取数字
lst.write = 写入数字到连接的内存 lst.write = 写入数字到连接的内存
@@ -1518,6 +1602,8 @@ lst.sensor = 从建筑或单位取得数据
lst.set = 设置变量 lst.set = 设置变量
lst.operation = 操作一两个变量 lst.operation = 操作一两个变量
lst.end = 跳至指令栈顶\n第一条语句 lst.end = 跳至指令栈顶\n第一条语句
lst.wait = 等待指定的秒数。
lst.lookup = 通过ID寻找特定的物品/液体/单位/块的类型。\n查找每个类型的总数量可以使用\n[accent]@unitCount[] / [accent]@itemCount[] / [accent]@liquidCount[] / [accent]@blockCount[]
lst.jump = 有条件地跳到另一语句 lst.jump = 有条件地跳到另一语句
lst.unitbind = 绑定下一个某型号单位\n并存到[accent]@unit[] lst.unitbind = 绑定下一个某型号单位\n并存到[accent]@unit[]
lst.unitcontrol = 控制绑定的单位 lst.unitcontrol = 控制绑定的单位
@@ -1537,6 +1623,7 @@ laccess.controller = 单位控制者\n如果是处理器返回处理器\n如
laccess.dead = 单位或建筑是不是死了或无效了 laccess.dead = 单位或建筑是不是死了或无效了
laccess.controlled = 若单位控制者是处理器,返回[accent]@ctrlProcessor[]\n若单位/建筑由玩家控制,返回[accent]@ctrlPlayer[]\n若单位在编队中返回[accent]@ctrlFormation[]\n其他的返回0 laccess.controlled = 若单位控制者是处理器,返回[accent]@ctrlProcessor[]\n若单位/建筑由玩家控制,返回[accent]@ctrlPlayer[]\n若单位在编队中返回[accent]@ctrlFormation[]\n其他的返回0
laccess.commanded = [red]已弃用,将被移除![]\n应该使用[accent]controlled[] laccess.commanded = [red]已弃用,将被移除![]\n应该使用[accent]controlled[]
laccess.progress = 动作进度, 范围0~1。\n返回方块生产、炮塔装填或建造的进度。
graphicstype.clear = 用指定颜色填满显示屏 graphicstype.clear = 用指定颜色填满显示屏
graphicstype.color = 设置后续画图操作的颜色 graphicstype.color = 设置后续画图操作的颜色
@@ -1568,9 +1655,16 @@ lenum.min = 取小的那个数
lenum.max = 取大的那个数 lenum.max = 取大的那个数
lenum.angle = 方位角° lenum.angle = 方位角°
lenum.len = 原点到该点距离 lenum.len = 原点到该点距离
lenum.sin = 正弦°(对边:斜边) lenum.sin = 正弦°(对边:斜边)
lenum.cos = 余弦°(邻边:斜边) lenum.cos = 余弦°(邻边:斜边)
lenum.tan = 正切°(对边:邻边) lenum.tan = 正切°(对边:邻边)
lenum.asin = 反正弦
lenum.acos = 反余弦
lenum.atan = 反正切
#not a typo, look up 'range notation'
lenum.rand = [0, 值) 范围内随机数 lenum.rand = [0, 值) 范围内随机数
lenum.log = 自然对数(ln) lenum.log = 自然对数(ln)
lenum.log10 = 10底对数 lenum.log10 = 10底对数

View File

@@ -352,3 +352,4 @@
63354=payload-launch-pad|block-payload-launch-pad-ui 63354=payload-launch-pad|block-payload-launch-pad-ui
63353=silicon-arc-furnace|block-silicon-arc-furnace-ui 63353=silicon-arc-furnace|block-silicon-arc-furnace-ui
63352=metal-floor-4|block-metal-floor-4-ui 63352=metal-floor-4|block-metal-floor-4-ui
63351=invincible|status-invincible-ui

Binary file not shown.

View File

@@ -107,6 +107,7 @@ importPackage(Packages.mindustry.maps.planet)
importPackage(Packages.mindustry.net) importPackage(Packages.mindustry.net)
importPackage(Packages.mindustry.service) importPackage(Packages.mindustry.service)
importPackage(Packages.mindustry.type) importPackage(Packages.mindustry.type)
importPackage(Packages.mindustry.type.ammo)
importPackage(Packages.mindustry.type.weapons) importPackage(Packages.mindustry.type.weapons)
importPackage(Packages.mindustry.type.weather) importPackage(Packages.mindustry.type.weather)
importPackage(Packages.mindustry.ui) importPackage(Packages.mindustry.ui)

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Before

Width:  |  Height:  |  Size: 9.4 KiB

After

Width:  |  Height:  |  Size: 114 KiB

View File

@@ -55,7 +55,7 @@ public abstract class ClientLauncher extends ApplicationCore implements Platform
Log.info("[GL] Max texture size: @", maxTextureSize); Log.info("[GL] Max texture size: @", maxTextureSize);
Log.info("[GL] Using @ context.", gl30 != null ? "OpenGL 3" : "OpenGL 2"); Log.info("[GL] Using @ context.", gl30 != null ? "OpenGL 3" : "OpenGL 2");
if(maxTextureSize < 4096) Log.warn("[GL] Your maximum texture size is below the recommended minimum of 4096. This will cause severe performance issues."); if(maxTextureSize < 4096) Log.warn("[GL] Your maximum texture size is below the recommended minimum of 4096. This will cause severe performance issues.");
Log.info("[JAVA] Version: @", System.getProperty("java.version")); Log.info("[JAVA] Version: @", OS.javaVersion);
Time.setDeltaProvider(() -> { Time.setDeltaProvider(() -> {
float result = Core.graphics.getDeltaTime() * 60f; float result = Core.graphics.getDeltaTime() * 60f;

View File

@@ -24,10 +24,8 @@ import mindustry.logic.*;
import mindustry.maps.Map; import mindustry.maps.Map;
import mindustry.maps.*; import mindustry.maps.*;
import mindustry.mod.*; import mindustry.mod.*;
import mindustry.net.Net;
import mindustry.net.*; import mindustry.net.*;
import mindustry.service.*; import mindustry.service.*;
import mindustry.world.*;
import java.io.*; import java.io.*;
import java.nio.charset.*; import java.nio.charset.*;
@@ -105,16 +103,14 @@ public class Vars implements Loadable{
public static final float invasionGracePeriod = 20; public static final float invasionGracePeriod = 20;
/** min armor fraction damage; e.g. 0.05 = at least 5% damage */ /** min armor fraction damage; e.g. 0.05 = at least 5% damage */
public static final float minArmorDamage = 0.1f; public static final float minArmorDamage = 0.1f;
/** launch animation duration */ /** land/launch animation duration */
public static final float launchDuration = 140f; public static final float coreLandDuration = 160f;
/** size of tiles in units */ /** size of tiles in units */
public static final int tilesize = 8; public static final int tilesize = 8;
/** size of one tile payload (^2) */ /** size of one tile payload (^2) */
public static final float tilePayload = tilesize * tilesize; public static final float tilePayload = tilesize * tilesize;
/** icon sizes for UI */ /** icon sizes for UI */
public static final float iconXLarge = 8*6f, iconLarge = 8*5f, iconMed = 8*4f, iconSmall = 8*3f; public static final float iconXLarge = 8*6f, iconLarge = 8*5f, iconMed = 8*4f, iconSmall = 8*3f;
/** tile used in certain situations, instead of null */
public static Tile emptyTile;
/** for map generator dialog */ /** for map generator dialog */
public static boolean updateEditorOnChange = false; public static boolean updateEditorOnChange = false;
/** all choosable player colors in join/host dialog */ /** all choosable player colors in join/host dialog */
@@ -146,8 +142,8 @@ public class Vars implements Loadable{
public static boolean clientLoaded = false; public static boolean clientLoaded = false;
/** max GL texture size */ /** max GL texture size */
public static int maxTextureSize = 2048; public static int maxTextureSize = 2048;
/** Whether to show the core landing animation. */ /** Whether to show sector info upon landing. */
public static boolean showLandAnimation = true; public static boolean showSectorLandInfo = true;
/** Whether to check for memory use before taking screenshots. */ /** Whether to check for memory use before taking screenshots. */
public static boolean checkScreenshotMemory = true; public static boolean checkScreenshotMemory = true;
/** Whether to prompt the user to confirm exiting. */ /** Whether to prompt the user to confirm exiting. */
@@ -278,7 +274,6 @@ public class Vars implements Loadable{
schematicDirectory = dataDirectory.child("schematics/"); schematicDirectory = dataDirectory.child("schematics/");
bebuildDirectory = dataDirectory.child("be_builds/"); bebuildDirectory = dataDirectory.child("be_builds/");
emptyMap = new Map(new StringMap()); emptyMap = new Map(new StringMap());
emptyTile = null;
if(tree == null) tree = new FileTree(); if(tree == null) tree = new FileTree();
if(mods == null) mods = new Mods(); if(mods == null) mods = new Mods();

View File

@@ -48,6 +48,7 @@ public class BlockIndexer{
private Seq<Building> breturnArray = new Seq<>(Building.class); private Seq<Building> breturnArray = new Seq<>(Building.class);
public BlockIndexer(){ public BlockIndexer(){
clearFlags();
Events.on(TilePreChangeEvent.class, event -> { Events.on(TilePreChangeEvent.class, event -> {
removeIndex(event.tile); removeIndex(event.tile);
@@ -62,11 +63,7 @@ public class BlockIndexer{
flagMap = new TileArray[Team.all.length][BlockFlag.all.length]; flagMap = new TileArray[Team.all.length][BlockFlag.all.length];
activeTeams = new Seq<>(Team.class); activeTeams = new Seq<>(Team.class);
for(int i = 0; i < flagMap.length; i++){ clearFlags();
for(int j = 0; j < BlockFlag.all.length; j++){
flagMap[i][j] = new TileArray();
}
}
allOres.clear(); allOres.clear();
ores = new IntSeq[content.items().size][][]; ores = new IntSeq[content.items().size][][];
@@ -106,7 +103,7 @@ public class BlockIndexer{
public void removeIndex(Tile tile){ public void removeIndex(Tile tile){
var team = tile.team(); var team = tile.team();
if(team != Team.derelict && tile.isCenter()){ if(tile.build != null && tile.isCenter()){
var flags = tile.block().flags; var flags = tile.block().flags;
var data = team.data(); var data = team.data();
@@ -160,6 +157,14 @@ public class BlockIndexer{
return blocksPresent != null && blocksPresent[block.id]; return blocksPresent != null && blocksPresent[block.id];
} }
private void clearFlags(){
for(int i = 0; i < flagMap.length; i++){
for(int j = 0; j < BlockFlag.all.length; j++){
flagMap[i][j] = new TileArray();
}
}
}
private TileArray[] getFlagged(Team team){ private TileArray[] getFlagged(Team team){
return flagMap[team.id]; return flagMap[team.id];
} }
@@ -206,13 +211,12 @@ public class BlockIndexer{
} }
public boolean eachBlock(@Nullable Team team, float wx, float wy, float range, Boolf<Building> pred, Cons<Building> cons){ public boolean eachBlock(@Nullable Team team, float wx, float wy, float range, Boolf<Building> pred, Cons<Building> cons){
returnBool = false; breturnArray.clear();
if(team == null){ if(team == null){
allBuildings(wx, wy, range, b -> { allBuildings(wx, wy, range, b -> {
if(pred.get(b)){ if(pred.get(b)){
returnBool = true; breturnArray.add(b);
cons.get(b);
} }
}); });
}else{ }else{
@@ -220,13 +224,20 @@ public class BlockIndexer{
if(buildings == null) return false; if(buildings == null) return false;
buildings.intersect(wx - range, wy - range, range*2f, range*2f, b -> { buildings.intersect(wx - range, wy - range, range*2f, range*2f, b -> {
if(b.within(wx, wy, range + b.hitSize() / 2f) && pred.get(b)){ if(b.within(wx, wy, range + b.hitSize() / 2f) && pred.get(b)){
returnBool = true; breturnArray.add(b);
cons.get(b);
} }
}); });
} }
return returnBool; int size = breturnArray.size;
var items = breturnArray.items;
for(int i = 0; i < size; i++){
cons.get(items[i]);
items[i] = null;
}
breturnArray.size = 0;
return size > 0;
} }
/** Get all enemy blocks with a flag. */ /** Get all enemy blocks with a flag. */
@@ -269,31 +280,50 @@ public class BlockIndexer{
} }
public void allBuildings(float x, float y, float range, Cons<Building> cons){ public void allBuildings(float x, float y, float range, Cons<Building> cons){
breturnArray.clear();
for(int i = 0; i < activeTeams.size; i++){ for(int i = 0; i < activeTeams.size; i++){
Team team = activeTeams.items[i]; Team team = activeTeams.items[i];
var buildings = team.data().buildings; var buildings = team.data().buildings;
if(buildings == null) continue; if(buildings == null) continue;
buildings.intersect(x - range, y - range, range*2f, range*2f, b -> { buildings.intersect(x - range, y - range, range*2f, range*2f, breturnArray);
}
var items = breturnArray.items;
int size = breturnArray.size;
for(int i = 0; i < size; i++){
var b = items[i];
if(b.within(x, y, range + b.hitSize()/2f)){ if(b.within(x, y, range + b.hitSize()/2f)){
cons.get(b); cons.get(b);
} }
}); items[i] = null;
} }
breturnArray.size = 0;
} }
public Building findEnemyTile(@Nullable Team team, float x, float y, float range, Boolf<Building> pred){ public Building findEnemyTile(Team team, float x, float y, float range, Boolf<Building> pred){
Building target = null;
float targetDist = 0;
for(int i = 0; i < activeTeams.size; i++){ for(int i = 0; i < activeTeams.size; i++){
Team enemy = activeTeams.items[i]; Team enemy = activeTeams.items[i];
if(enemy == team || (enemy == Team.derelict && !state.rules.coreCapture)) continue;
if(enemy == team || (team == Team.derelict && !state.rules.coreCapture)) continue; Building candidate = indexer.findTile(enemy, x, y, range, pred, true);
if(candidate == null) continue;
Building entity = indexer.findTile(enemy, x, y, range, pred, true); //if a block has the same priority, the closer one should be targeted
if(entity != null){ float dist = candidate.dst(x, y) - candidate.hitSize() / 2f;
return entity; if(target == null ||
//if its closer and is at least equal priority
(dist < targetDist && candidate.block.priority.ordinal() >= target.block.priority.ordinal()) ||
// block has higher priority (so range doesnt matter)
(candidate.block.priority.ordinal() > target.block.priority.ordinal())){
target = candidate;
targetDist = dist;
} }
} }
return null; return target;
} }
public Building findTile(Team team, float x, float y, float range, Boolf<Building> pred){ public Building findTile(Team team, float x, float y, float range, Boolf<Building> pred){

View File

@@ -180,6 +180,7 @@ public class WaveSpawner{
private void spawnEffect(Unit unit){ private void spawnEffect(Unit unit){
unit.rotation = unit.angleTo(world.width()/2f * tilesize, world.height()/2f * tilesize); unit.rotation = unit.angleTo(world.width()/2f * tilesize, world.height()/2f * tilesize);
unit.apply(StatusEffects.unmoving, 30f); unit.apply(StatusEffects.unmoving, 30f);
unit.apply(StatusEffects.invincible, 60f);
unit.add(); unit.add();
Call.spawnEffect(unit.x, unit.y, unit.rotation, unit.type); Call.spawnEffect(unit.x, unit.y, unit.rotation, unit.type);

View File

@@ -19,6 +19,7 @@ public class BuilderAI extends AIController{
@Nullable Unit following; @Nullable Unit following;
@Nullable Teamc enemy; @Nullable Teamc enemy;
float retreatTimer; float retreatTimer;
@Nullable BlockPlan lastPlan;
@Override @Override
public void updateMovement(){ public void updateMovement(){
@@ -43,6 +44,7 @@ public class BuilderAI extends AIController{
//set to follower's first build plan, whatever that is //set to follower's first build plan, whatever that is
unit.plans.clear(); unit.plans.clear();
unit.plans.addFirst(following.buildPlan()); unit.plans.addFirst(following.buildPlan());
lastPlan = null;
}else if(unit.buildPlan() == null){ }else if(unit.buildPlan() == null){
//not following anyone or building //not following anyone or building
if(timer.get(timerTarget4, 40)){ if(timer.get(timerTarget4, 40)){
@@ -78,10 +80,11 @@ public class BuilderAI extends AIController{
} }
boolean valid = boolean valid =
(req.tile() != null && req.tile().build instanceof ConstructBuild cons && cons.current == req.block) || !(lastPlan != null && lastPlan.removed) &&
((req.tile() != null && req.tile().build instanceof ConstructBuild cons && cons.current == req.block) ||
(req.breaking ? (req.breaking ?
Build.validBreak(unit.team(), req.x, req.y) : Build.validBreak(unit.team(), req.x, req.y) :
Build.validPlace(req.block, unit.team(), req.x, req.y, req.rotation)); Build.validPlace(req.block, unit.team(), req.x, req.y, req.rotation)));
if(valid){ if(valid){
//move toward the request //move toward the request
@@ -89,6 +92,7 @@ public class BuilderAI extends AIController{
}else{ }else{
//discard invalid request //discard invalid request
unit.plans.removeFirst(); unit.plans.removeFirst();
lastPlan = null;
} }
}else{ }else{
@@ -127,6 +131,7 @@ public class BuilderAI extends AIController{
if(world.tile(block.x, block.y) != null && world.tile(block.x, block.y).block().id == block.block){ if(world.tile(block.x, block.y) != null && world.tile(block.x, block.y).block().id == block.block){
blocks.removeFirst(); blocks.removeFirst();
}else if(Build.validPlace(content.block(block.block), unit.team(), block.x, block.y, block.rotation)){ //it's valid. }else if(Build.validPlace(content.block(block.block), unit.team(), block.x, block.y, block.rotation)){ //it's valid.
lastPlan = block;
//add build request. //add build request.
unit.addBuild(new BuildPlan(block.x, block.y, block.rotation, content.block(block.block), block.config)); unit.addBuild(new BuildPlan(block.x, block.y, block.rotation, content.block(block.block), block.config));
//shift build plan to tail so next unit builds something else. //shift build plan to tail so next unit builds something else.

View File

@@ -6,10 +6,14 @@ import mindustry.entities.units.*;
import mindustry.gen.*; import mindustry.gen.*;
import mindustry.world.meta.*; import mindustry.world.meta.*;
import static mindustry.Vars.*;
public class DefenderAI extends AIController{ public class DefenderAI extends AIController{
@Override @Override
public void updateMovement(){ public void updateMovement(){
unloadPayloads();
if(target != null){ if(target != null){
moveTo(target, (target instanceof Sized s ? s.hitSize()/2f * 1.1f : 0f) + unit.hitSize/2f + 15f, 50f); moveTo(target, (target instanceof Sized s ? s.hitSize()/2f * 1.1f : 0f) + unit.hitSize/2f + 15f, 50f);
unit.lookAt(target); unit.lookAt(target);
@@ -23,6 +27,7 @@ public class DefenderAI extends AIController{
@Override @Override
protected Teamc findTarget(float x, float y, float range, boolean air, boolean ground){ protected Teamc findTarget(float x, float y, float range, boolean air, boolean ground){
//find unit to follow if not in rally mode //find unit to follow if not in rally mode
if(command() != UnitCommand.rally){ if(command() != UnitCommand.rally){
//Sort by max health and closer target. //Sort by max health and closer target.
@@ -34,6 +39,14 @@ public class DefenderAI extends AIController{
var block = targetFlag(unit.x, unit.y, BlockFlag.rally, false); var block = targetFlag(unit.x, unit.y, BlockFlag.rally, false);
if(block != null) return block; if(block != null) return block;
//return core if found //return core if found
return unit.closestCore(); var core = unit.closestCore();
if(core != null) return core;
//for enemies, target the enemy core.
if(state.rules.waves && unit.team == state.rules.waveTeam){
return unit.closestEnemyCore();
}
return null;
} }
} }

View File

@@ -11,6 +11,8 @@ public class FlyingAI extends AIController{
@Override @Override
public void updateMovement(){ public void updateMovement(){
unloadPayloads();
if(target != null && unit.hasWeapons() && command() == UnitCommand.attack){ if(target != null && unit.hasWeapons() && command() == UnitCommand.attack){
if(!unit.type.circleTarget){ if(!unit.type.circleTarget){
moveTo(target, unit.type.range * 0.8f); moveTo(target, unit.type.range * 0.8f);
@@ -31,16 +33,24 @@ public class FlyingAI extends AIController{
@Override @Override
protected Teamc findTarget(float x, float y, float range, boolean air, boolean ground){ protected Teamc findTarget(float x, float y, float range, boolean air, boolean ground){
var result = findMainTarget(x, y, range, air, ground);
//if the main target is in range, use it, otherwise target whatever is closest
return checkTarget(result, x, y, range) ? target(x, y, range, air, ground) : result;
}
@Override
protected Teamc findMainTarget(float x, float y, float range, boolean air, boolean ground){
for(var flag : unit.team.isAI() ? unit.type.targetFlags : unit.type.playerTargetFlags){
if(flag == null){
Teamc result = target(x, y, range, air, ground); Teamc result = target(x, y, range, air, ground);
if(result != null) return result; if(result != null) return result;
}else if(ground){
if(ground) result = targetFlag(x, y, BlockFlag.generator, true); Teamc result = targetFlag(x, y, flag, true);
if(result != null) return result; if(result != null) return result;
}
if(ground) result = targetFlag(x, y, BlockFlag.core, true); }
if(result != null) return result; return targetFlag(x, y, BlockFlag.core, true);
return null;
} }
protected void attack(float circleLength){ protected void attack(float circleLength){

View File

@@ -17,7 +17,7 @@ public class LogicAI extends AIController{
/** Minimum delay between item transfers. */ /** Minimum delay between item transfers. */
public static final float transferDelay = 60f * 1.5f; public static final float transferDelay = 60f * 1.5f;
/** Time after which the unit resets its controlled and reverts to a normal unit. */ /** Time after which the unit resets its controlled and reverts to a normal unit. */
public static final float logicControlTimeout = 10f * 60f; public static final float logicControlTimeout = 60f * 10f;
public LUnitControl control = LUnitControl.idle; public LUnitControl control = LUnitControl.idle;
public float moveX, moveY, moveRad; public float moveX, moveY, moveRad;

View File

@@ -17,7 +17,7 @@ import static mindustry.Vars.*;
/** Controls playback of multiple audio tracks.*/ /** Controls playback of multiple audio tracks.*/
public class SoundControl{ public class SoundControl{
protected static final float finTime = 120f, foutTime = 120f, musicInterval = 60 * 60 * 3f, musicChance = 0.6f, musicWaveChance = 0.46f; protected static final float finTime = 120f, foutTime = 120f, musicInterval = 3f * Time.toMinutes, musicChance = 0.6f, musicWaveChance = 0.46f;
/** normal, ambient music, plays at any time */ /** normal, ambient music, plays at any time */
public Seq<Music> ambientMusic = Seq.with(); public Seq<Music> ambientMusic = Seq.with();

View File

@@ -235,7 +235,6 @@ public class Blocks implements ContentList{
magmarock = new Floor("magmarock"){{ magmarock = new Floor("magmarock"){{
attributes.set(Attribute.heat, 0.75f); attributes.set(Attribute.heat, 0.75f);
attributes.set(Attribute.water, -0.75f); attributes.set(Attribute.water, -0.75f);
updateEffect = Fx.magmasmoke;
blendGroup = basalt; blendGroup = basalt;
emitLight = true; emitLight = true;
@@ -305,7 +304,7 @@ public class Blocks implements ContentList{
shale = new Floor("shale"){{ shale = new Floor("shale"){{
variants = 3; variants = 3;
attributes.set(Attribute.oil, 1f); attributes.set(Attribute.oil, 1.6f);
}}; }};
stoneWall = new StaticWall("stone-wall"){{ stoneWall = new StaticWall("stone-wall"){{
@@ -369,6 +368,7 @@ public class Blocks implements ContentList{
sporeCluster = new Prop("spore-cluster"){{ sporeCluster = new Prop("spore-cluster"){{
variants = 3; variants = 3;
breakSound = Sounds.plantBreak;
}}; }};
boulder = new Prop("boulder"){{ boulder = new Prop("boulder"){{
@@ -426,6 +426,9 @@ public class Blocks implements ContentList{
darkMetal = new StaticWall("dark-metal"); darkMetal = new StaticWall("dark-metal");
Seq.with(metalFloor, metalFloorDamaged, metalFloor2, metalFloor3, metalFloor4, metalFloor5, darkPanel1, darkPanel2, darkPanel3, darkPanel4, darkPanel5, darkPanel6)
.each(b -> b.asFloor().wall = darkMetal);
pebbles = new DoubleOverlayFloor("pebbles"); pebbles = new DoubleOverlayFloor("pebbles");
tendrils = new OverlayFloor("tendrils"); tendrils = new OverlayFloor("tendrils");
@@ -654,8 +657,8 @@ public class Blocks implements ContentList{
craftTime = 35f; craftTime = 35f;
size = 2; size = 2;
consumes.power(1f); consumes.power(1.1f);
consumes.liquid(Liquids.slag, 0.07f); consumes.liquid(Liquids.slag, 4f / 60f);
}}; }};
disassembler = new Separator("disassembler"){{ disassembler = new Separator("disassembler"){{
@@ -709,7 +712,7 @@ public class Blocks implements ContentList{
coalCentrifuge = new GenericCrafter("coal-centrifuge"){{ coalCentrifuge = new GenericCrafter("coal-centrifuge"){{
requirements(Category.crafting, with(Items.titanium, 20, Items.graphite, 40, Items.lead, 30)); requirements(Category.crafting, with(Items.titanium, 20, Items.graphite, 40, Items.lead, 30));
craftEffect = Fx.smeltsmoke; craftEffect = Fx.coalSmeltsmoke;
outputItem = new ItemStack(Items.coal, 1); outputItem = new ItemStack(Items.coal, 1);
craftTime = 30f; craftTime = 30f;
size = 2; size = 2;
@@ -961,15 +964,20 @@ public class Blocks implements ContentList{
itemBridge = new BufferedItemBridge("bridge-conveyor"){{ itemBridge = new BufferedItemBridge("bridge-conveyor"){{
requirements(Category.distribution, with(Items.lead, 6, Items.copper, 6)); requirements(Category.distribution, with(Items.lead, 6, Items.copper, 6));
fadeIn = moveArrows = false;
range = 4; range = 4;
speed = 74f; speed = 74f;
arrowSpacing = 6f;
bufferCapacity = 14; bufferCapacity = 14;
}}; }};
phaseConveyor = new ItemBridge("phase-conveyor"){{ phaseConveyor = new ItemBridge("phase-conveyor"){{
requirements(Category.distribution, with(Items.phaseFabric, 5, Items.silicon, 7, Items.lead, 10, Items.graphite, 10)); requirements(Category.distribution, with(Items.phaseFabric, 5, Items.silicon, 7, Items.lead, 10, Items.graphite, 10));
range = 12; range = 12;
arrowPeriod = 0.9f;
arrowTimeScl = 2.75f;
hasPower = true; hasPower = true;
pulse = true;
consumes.power(0.30f); consumes.power(0.30f);
}}; }};
@@ -1012,7 +1020,6 @@ public class Blocks implements ContentList{
reloadTime = 200f; reloadTime = 200f;
range = 440f; range = 440f;
consumes.power(1.75f); consumes.power(1.75f);
bullet = new MassDriverBolt();
}}; }};
//special transport blocks //special transport blocks
@@ -1093,8 +1100,10 @@ public class Blocks implements ContentList{
requirements(Category.liquid, with(Items.graphite, 2, Items.metaglass, 2)); requirements(Category.liquid, with(Items.graphite, 2, Items.metaglass, 2));
}}; }};
bridgeConduit = new LiquidExtendingBridge("bridge-conduit"){{ bridgeConduit = new LiquidBridge("bridge-conduit"){{
requirements(Category.liquid, with(Items.graphite, 4, Items.metaglass, 8)); requirements(Category.liquid, with(Items.graphite, 4, Items.metaglass, 8));
fadeIn = moveArrows = false;
arrowSpacing = 6f;
range = 4; range = 4;
hasPower = false; hasPower = false;
}}; }};
@@ -1102,8 +1111,11 @@ public class Blocks implements ContentList{
phaseConduit = new LiquidBridge("phase-conduit"){{ phaseConduit = new LiquidBridge("phase-conduit"){{
requirements(Category.liquid, with(Items.phaseFabric, 5, Items.silicon, 7, Items.metaglass, 20, Items.titanium, 10)); requirements(Category.liquid, with(Items.phaseFabric, 5, Items.silicon, 7, Items.metaglass, 20, Items.titanium, 10));
range = 12; range = 12;
arrowPeriod = 0.9f;
arrowTimeScl = 2.75f;
hasPower = true; hasPower = true;
canOverdrive = false; canOverdrive = false;
pulse = true;
consumes.power(0.30f); consumes.power(0.30f);
}}; }};
@@ -1159,6 +1171,7 @@ public class Blocks implements ContentList{
requirements(Category.power, with(Items.copper, 40, Items.graphite, 35, Items.lead, 50, Items.silicon, 35, Items.metaglass, 40)); requirements(Category.power, with(Items.copper, 40, Items.graphite, 35, Items.lead, 50, Items.silicon, 35, Items.metaglass, 40));
powerProduction = 1.8f; powerProduction = 1.8f;
generateEffect = Fx.redgeneratespark; generateEffect = Fx.redgeneratespark;
effectChance = 0.011f;
size = 2; size = 2;
floating = true; floating = true;
ambientSound = Sounds.hum; ambientSound = Sounds.hum;
@@ -1364,6 +1377,7 @@ public class Blocks implements ContentList{
health = 3500; health = 3500;
itemCapacity = 9000; itemCapacity = 9000;
size = 4; size = 4;
thrusterLength = 34/4f;
unitCapModifier = 16; unitCapModifier = 16;
researchCostMultiplier = 0.07f; researchCostMultiplier = 0.07f;
@@ -1376,6 +1390,7 @@ public class Blocks implements ContentList{
health = 6000; health = 6000;
itemCapacity = 13000; itemCapacity = 13000;
size = 5; size = 5;
thrusterLength = 40/4f;
unitCapModifier = 24; unitCapModifier = 24;
researchCostMultiplier = 0.11f; researchCostMultiplier = 0.11f;
@@ -1589,7 +1604,7 @@ public class Blocks implements ContentList{
shots = 4; shots = 4;
burstSpacing = 5; burstSpacing = 5;
inaccuracy = 10f; inaccuracy = 10f;
range = 215f; range = 235f;
xRand = 6f; xRand = 6f;
size = 2; size = 2;
health = 300 * size * size; health = 300 * size * size;
@@ -2000,17 +2015,6 @@ public class Blocks implements ContentList{
acceptCoolant = true; acceptCoolant = true;
}}; }};
resupplyPoint = new ResupplyPoint("resupply-point"){{
requirements(Category.units, BuildVisibility.ammoOnly, with(Items.lead, 20, Items.copper, 15, Items.silicon, 15));
size = 2;
range = 80f;
itemCapacity = 20;
ammoAmount = 5;
consumes.item(Items.copper, 1);
}};
//endregion //endregion
//region payloads //region payloads
@@ -2029,7 +2033,7 @@ public class Blocks implements ContentList{
size = 5; size = 5;
reloadTime = 140f; reloadTime = 140f;
chargeTime = 100f; chargeTime = 100f;
range = 500f; range = 600f;
maxPayloadSize = 3.5f; maxPayloadSize = 3.5f;
consumes.power(6f); consumes.power(6f);
}}; }};

View File

@@ -184,6 +184,16 @@ public class Fx{
Lines.square(e.x, e.y, tilesize / 2f * e.rotation + e.fin() * 3f); Lines.square(e.x, e.y, tilesize / 2f * e.rotation + e.fin() * 3f);
}), }),
coreLaunchConstruct = new Effect(35, e -> {
color(Pal.accent);
stroke(4f - e.fin() * 3f);
Lines.square(e.x, e.y, tilesize / 2f * e.rotation * 1.2f + e.fin() * 5f);
randLenVectors(e.id, 5 + (int)(e.rotation * 5), e.rotation * 3f + (tilesize * e.rotation) * e.finpow() * 1.5f, (x, y) -> {
Lines.lineAngle(e.x + x, e.y + y, Mathf.angle(x, y), 1f + e.fout() * (4f + e.rotation));
});
}),
tapBlock = new Effect(12, e -> { tapBlock = new Effect(12, e -> {
color(Pal.accent); color(Pal.accent);
stroke(3f - e.fin() * 2f); stroke(3f - e.fin() * 2f);
@@ -1526,13 +1536,16 @@ public class Fx{
}); });
}), }),
redgeneratespark = new Effect(18, e -> { redgeneratespark = new Effect(90, e -> {
randLenVectors(e.id, 5, e.fin() * 8f, (x, y) -> { color(Pal.redSpark);
float len = e.fout() * 4f; alpha(e.fslope());
color(Pal.redSpark, Color.gray, e.fin());
Fill.circle(e.x + x, e.y + y, len/2f); rand.setSeed(e.id);
}); for(int i = 0; i < 2; i++){
}), v.trns(rand.random(360f), rand.random(e.finpow() * 9f)).add(e.x, e.y);
Fill.circle(v.x, v.y, rand.random(1.4f, 2.4f));
}
}).layer(Layer.bullet - 1f),
generatespark = new Effect(18, e -> { generatespark = new Effect(18, e -> {
randLenVectors(e.id, 5, e.fin() * 8f, (x, y) -> { randLenVectors(e.id, 5, e.fin() * 8f, (x, y) -> {
@@ -1622,6 +1635,13 @@ public class Fx{
}); });
}), }),
coalSmeltsmoke = new Effect(40f, e -> {
randLenVectors(e.id, 0.2f + e.fin(), 4, 6.3f, (x, y, fin, out) -> {
color(Color.darkGray, Pal.coalBlack, e.finpowdown());
Fill.circle(e.x + x, e.y + y, out * 2f + 0.35f);
});
}),
formsmoke = new Effect(40, e -> { formsmoke = new Effect(40, e -> {
randLenVectors(e.id, 6, 5f + e.fin() * 8f, (x, y) -> { randLenVectors(e.id, 6, 5f + e.fin() * 8f, (x, y) -> {
color(Pal.plasticSmoke, Color.lightGray, e.fin()); color(Pal.plasticSmoke, Color.lightGray, e.fin());
@@ -1852,6 +1872,13 @@ public class Fx{
Lines.poly(e.x, e.y, 6, e.rotation + e.fin()); Lines.poly(e.x, e.y, 6, e.rotation + e.fin());
}), }),
coreLandDust = new Effect(100f, e -> {
color(e.color, e.fout(0.1f));
rand.setSeed(e.id);
Tmp.v1.trns(e.rotation, e.finpow() * 90f * rand.random(0.2f, 1f));
Fill.circle(e.x + Tmp.v1.x, e.y + Tmp.v1.y, 8f * rand.random(0.6f, 1f) * e.fout(0.2f));
}).layer(Layer.block + 1f),
unitShieldBreak = new Effect(35, e -> { unitShieldBreak = new Effect(35, e -> {
if(!(e.data instanceof Unitc)) return; if(!(e.data instanceof Unitc)) return;
@@ -1945,8 +1972,5 @@ public class Fx{
} }
Lines.endLine(); Lines.endLine();
}).followParent(false), }).followParent(false);
coreLand = new Effect(120f, e -> {
});
} }

View File

@@ -2,6 +2,7 @@ package mindustry.content;
import arc.graphics.*; import arc.graphics.*;
import mindustry.ctype.*; import mindustry.ctype.*;
import mindustry.graphics.*;
import mindustry.graphics.g3d.*; import mindustry.graphics.g3d.*;
import mindustry.maps.planet.*; import mindustry.maps.planet.*;
import mindustry.type.*; import mindustry.type.*;
@@ -38,6 +39,7 @@ public class Planets implements ContentList{
atmosphereRadOut = 0.3f; atmosphereRadOut = 0.3f;
startSector = 15; startSector = 15;
alwaysUnlocked = true; alwaysUnlocked = true;
landCloudColor = Pal.spore.cpy().a(0.5f);
}}; }};
} }
} }

View File

@@ -12,7 +12,7 @@ import mindustry.graphics.*;
import static mindustry.Vars.*; import static mindustry.Vars.*;
public class StatusEffects implements ContentList{ public class StatusEffects implements ContentList{
public static StatusEffect none, burning, freezing, unmoving, slow, wet, muddy, melting, sapped, tarred, overdrive, overclock, shielded, shocked, blasted, corroded, boss, sporeSlowed, disarmed, electrified; public static StatusEffect none, burning, freezing, unmoving, slow, wet, muddy, melting, sapped, tarred, overdrive, overclock, shielded, shocked, blasted, corroded, boss, sporeSlowed, disarmed, electrified, invincible;
@Override @Override
public void load(){ public void load(){
@@ -47,7 +47,6 @@ public class StatusEffects implements ContentList{
affinity(blasted, ((unit, result, time) -> { affinity(blasted, ((unit, result, time) -> {
unit.damagePierce(transitionDamage); unit.damagePierce(transitionDamage);
result.set(freezing, time);
})); }));
}); });
}}; }};
@@ -70,13 +69,12 @@ public class StatusEffects implements ContentList{
transitionDamage = 14; transitionDamage = 14;
init(() -> { init(() -> {
affinity(shocked, ((unit, result, time) -> { affinity(shocked, (unit, result, time) -> {
unit.damagePierce(transitionDamage); unit.damagePierce(transitionDamage);
if(unit.team == state.rules.waveTeam){ if(unit.team == state.rules.waveTeam){
Events.fire(Trigger.shock); Events.fire(Trigger.shock);
} }
result.set(wet, time); });
}));
opposite(burning, melting); opposite(burning, melting);
}); });
}}; }};
@@ -98,11 +96,11 @@ public class StatusEffects implements ContentList{
init(() -> { init(() -> {
opposite(wet, freezing); opposite(wet, freezing);
affinity(tarred, ((unit, result, time) -> { affinity(tarred, (unit, result, time) -> {
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 + result.time, 200f)); result.set(melting, Math.min(time + result.time, 200f));
})); });
}); });
}}; }};
@@ -135,8 +133,8 @@ public class StatusEffects implements ContentList{
effect = Fx.oily; effect = Fx.oily;
init(() -> { init(() -> {
affinity(melting, ((unit, result, time) -> result.set(melting, result.time + time))); affinity(melting, (unit, result, time) -> result.set(melting, result.time + time));
affinity(burning, ((unit, result, time) -> result.set(burning, result.time + time))); affinity(burning, (unit, result, time) -> result.set(burning, result.time + time));
}); });
}}; }};
@@ -190,5 +188,9 @@ public class StatusEffects implements ContentList{
color = Color.valueOf("e9ead3"); color = Color.valueOf("e9ead3");
disarm = true; disarm = true;
}}; }};
invincible = new StatusEffect("invincible"){{
healthMultiplier = Float.POSITIVE_INFINITY;
}};
} }
} }

View File

@@ -14,6 +14,7 @@ import mindustry.entities.effect.*;
import mindustry.gen.*; import mindustry.gen.*;
import mindustry.graphics.*; import mindustry.graphics.*;
import mindustry.type.*; import mindustry.type.*;
import mindustry.type.ammo.*;
import mindustry.type.weapons.*; import mindustry.type.weapons.*;
import mindustry.world.meta.*; import mindustry.world.meta.*;
@@ -52,8 +53,8 @@ public class UnitTypes implements ContentList{
//air + payload, legacy //air + payload, legacy
public static @EntityDef(value = {Unitc.class, Payloadc.class}, legacy = true) UnitType quad; public static @EntityDef(value = {Unitc.class, Payloadc.class}, legacy = true) UnitType quad;
//air + payload + ammo distribution //air + payload + legacy (different branch)
public static @EntityDef({Unitc.class, Payloadc.class, AmmoDistributec.class}) UnitType oct; public static @EntityDef(value = {Unitc.class, Payloadc.class}, legacy = true) UnitType oct;
//air, legacy //air, legacy
public static @EntityDef(value = {Unitc.class}, legacy = true) UnitType alpha, beta, gamma; public static @EntityDef(value = {Unitc.class}, legacy = true) UnitType alpha, beta, gamma;
@@ -89,6 +90,7 @@ public class UnitTypes implements ContentList{
hitSize = 10f; hitSize = 10f;
health = 540; health = 540;
armor = 4f; armor = 4f;
ammoType = new ItemAmmoType(Items.coal);
immunities.add(StatusEffects.burning); immunities.add(StatusEffects.burning);
@@ -123,6 +125,7 @@ public class UnitTypes implements ContentList{
health = 900; health = 900;
armor = 9f; armor = 9f;
mechFrontSway = 0.55f; mechFrontSway = 0.55f;
ammoType = new ItemAmmoType(Items.graphite);
weapons.add(new Weapon("artillery"){{ weapons.add(new Weapon("artillery"){{
top = false; top = false;
@@ -156,6 +159,7 @@ public class UnitTypes implements ContentList{
armor = 10f; armor = 10f;
canDrown = false; canDrown = false;
mechFrontSway = 1f; mechFrontSway = 1f;
ammoType = new ItemAmmoType(Items.thorium);
mechStepParticles = true; mechStepParticles = true;
mechStepShake = 0.15f; mechStepShake = 0.15f;
@@ -220,6 +224,7 @@ public class UnitTypes implements ContentList{
canDrown = false; canDrown = false;
mechFrontSway = 1.9f; mechFrontSway = 1.9f;
mechSideSway = 0.6f; mechSideSway = 0.6f;
ammoType = new ItemAmmoType(Items.thorium);
weapons.add( weapons.add(
new Weapon("reign-weapon"){{ new Weapon("reign-weapon"){{
@@ -282,7 +287,7 @@ public class UnitTypes implements ContentList{
commandLimit = 8; commandLimit = 8;
abilities.add(new RepairFieldAbility(10f, 60f * 4, 60f)); abilities.add(new RepairFieldAbility(10f, 60f * 4, 60f));
ammoType = AmmoTypes.power; ammoType = new PowerAmmoType(1000);
weapons.add(new Weapon("heal-weapon"){{ weapons.add(new Weapon("heal-weapon"){{
top = false; top = false;
@@ -319,7 +324,7 @@ public class UnitTypes implements ContentList{
commandLimit = 9; commandLimit = 9;
abilities.add(new ShieldRegenFieldAbility(20f, 40f, 60f * 5, 60f)); abilities.add(new ShieldRegenFieldAbility(20f, 40f, 60f * 5, 60f));
ammoType = AmmoTypes.power; ammoType = new PowerAmmoType(1300);
weapons.add(new Weapon("heal-shotgun-weapon"){{ weapons.add(new Weapon("heal-shotgun-weapon"){{
top = false; top = false;
@@ -372,7 +377,7 @@ public class UnitTypes implements ContentList{
commandLimit = 10; commandLimit = 10;
mechFrontSway = 0.55f; mechFrontSway = 0.55f;
ammoType = AmmoTypes.power; ammoType = new PowerAmmoType(1500);
speed = 0.4f; speed = 0.4f;
hitSize = 13f; hitSize = 13f;
@@ -415,16 +420,16 @@ public class UnitTypes implements ContentList{
mechStepParticles = true; mechStepParticles = true;
mechStepShake = 0.15f; mechStepShake = 0.15f;
ammoType = AmmoTypes.powerHigh; ammoType = new PowerAmmoType(2500);
speed = 0.39f; speed = 0.4f;
boostMultiplier = 2.2f; boostMultiplier = 2.2f;
engineOffset = 12f; engineOffset = 12f;
engineSize = 6f; engineSize = 6f;
lowAltitude = true; lowAltitude = true;
riseSpeed = 0.02f; riseSpeed = 0.02f;
health = 7500f; health = 8000f;
armor = 9f; armor = 9f;
canBoost = true; canBoost = true;
landShake = 4f; landShake = 4f;
@@ -449,8 +454,8 @@ public class UnitTypes implements ContentList{
cooldownTime = 200f; cooldownTime = 200f;
bullet = new ContinuousLaserBulletType(){{ bullet = new ContinuousLaserBulletType(){{
damage = 30f; damage = 32f;
length = 175f; length = 180f;
hitEffect = Fx.hitMeltHeal; hitEffect = Fx.hitMeltHeal;
drawSize = 420f; drawSize = 420f;
lifetime = 160f; lifetime = 160f;
@@ -493,7 +498,7 @@ public class UnitTypes implements ContentList{
hovering = true; hovering = true;
visualElevation = 0.2f; visualElevation = 0.2f;
allowLegStep = true; allowLegStep = true;
ammoType = AmmoTypes.powerHigh; ammoType = new PowerAmmoType(4000);
groundLayer = Layer.legUnit; groundLayer = Layer.legUnit;
speed = 0.3f; speed = 0.3f;
@@ -558,6 +563,7 @@ public class UnitTypes implements ContentList{
health = 200; health = 200;
mechSideSway = 0.25f; mechSideSway = 0.25f;
range = 40f; range = 40f;
ammoType = new ItemAmmoType(Items.coal);
weapons.add(new Weapon(){{ weapons.add(new Weapon(){{
reload = 24f; reload = 24f;
@@ -595,6 +601,7 @@ public class UnitTypes implements ContentList{
legMoveSpace = 1.4f; legMoveSpace = 1.4f;
hovering = true; hovering = true;
armor = 3f; armor = 3f;
ammoType = new ItemAmmoType(Items.coal);
allowLegStep = true; allowLegStep = true;
visualElevation = 0.2f; visualElevation = 0.2f;
@@ -634,7 +641,7 @@ public class UnitTypes implements ContentList{
legBaseOffset = 2f; legBaseOffset = 2f;
hovering = true; hovering = true;
armor = 5f; armor = 5f;
ammoType = AmmoTypes.power; ammoType = new PowerAmmoType(1000);
buildSpeed = 0.75f; buildSpeed = 0.75f;
@@ -706,7 +713,7 @@ public class UnitTypes implements ContentList{
legLengthScl = 0.96f; legLengthScl = 0.96f;
rippleScale = 2f; rippleScale = 2f;
legSpeed = 0.2f; legSpeed = 0.2f;
ammoType = AmmoTypes.power; ammoType = new PowerAmmoType(2000);
buildSpeed = 1f; buildSpeed = 1f;
legSplashDamage = 32; legSplashDamage = 32;
@@ -810,7 +817,7 @@ public class UnitTypes implements ContentList{
legLengthScl = 0.93f; legLengthScl = 0.93f;
rippleScale = 3f; rippleScale = 3f;
legSpeed = 0.19f; legSpeed = 0.19f;
ammoType = AmmoTypes.powerHigh; ammoType = new ItemAmmoType(Items.graphite, 8);
buildSpeed = 1f; buildSpeed = 1f;
legSplashDamage = 80; legSplashDamage = 80;
@@ -928,6 +935,7 @@ public class UnitTypes implements ContentList{
engineOffset = 5.5f; engineOffset = 5.5f;
range = 140f; range = 140f;
targetAir = false; targetAir = false;
targetFlags = new BlockFlag[]{BlockFlag.generator, null};
commandLimit = 4; commandLimit = 4;
circleTarget = true; circleTarget = true;
hitSize = 7; hitSize = 7;
@@ -961,9 +969,10 @@ public class UnitTypes implements ContentList{
range = 140f; range = 140f;
faceTarget = false; faceTarget = false;
armor = 3f; armor = 3f;
targetFlag = BlockFlag.factory; targetFlags = new BlockFlag[]{BlockFlag.factory, null};
commandLimit = 5; commandLimit = 5;
circleTarget = true; circleTarget = true;
ammoType = new ItemAmmoType(Items.graphite);
weapons.add(new Weapon(){{ weapons.add(new Weapon(){{
minShootVelocity = 0.75f; minShootVelocity = 0.75f;
@@ -999,8 +1008,10 @@ public class UnitTypes implements ContentList{
lowAltitude = true; lowAltitude = true;
armor = 5f; armor = 5f;
targetFlags = new BlockFlag[]{BlockFlag.launchPad, BlockFlag.storage, BlockFlag.battery, null};
engineOffset = 12f; engineOffset = 12f;
engineSize = 3f; engineSize = 3f;
ammoType = new ItemAmmoType(Items.graphite);
weapons.add(new Weapon("zenith-missiles"){{ weapons.add(new Weapon("zenith-missiles"){{
reload = 40f; reload = 40f;
@@ -1045,7 +1056,8 @@ public class UnitTypes implements ContentList{
engineOffset = 21; engineOffset = 21;
engineSize = 5.3f; engineSize = 5.3f;
hitSize = 46f; hitSize = 46f;
targetFlag = BlockFlag.battery; targetFlags = new BlockFlag[]{BlockFlag.generator, BlockFlag.core, null};
ammoType = new ItemAmmoType(Items.thorium);
BulletType missiles = new MissileBulletType(2.7f, 14){{ BulletType missiles = new MissileBulletType(2.7f, 14){{
width = 8f; width = 8f;
@@ -1120,7 +1132,8 @@ public class UnitTypes implements ContentList{
hitSize = 58f; hitSize = 58f;
destructibleWreck = false; destructibleWreck = false;
armor = 13f; armor = 13f;
targetFlag = BlockFlag.reactor; targetFlags = new BlockFlag[]{BlockFlag.reactor, BlockFlag.core, null};
ammoType = new ItemAmmoType(Items.thorium);
BulletType fragBullet = new FlakBulletType(4f, 5){{ BulletType fragBullet = new FlakBulletType(4f, 5){{
shootEffect = Fx.shootBig; shootEffect = Fx.shootBig;
@@ -1200,7 +1213,7 @@ public class UnitTypes implements ContentList{
range = 50f; range = 50f;
isCounted = false; isCounted = false;
ammoType = AmmoTypes.powerLow; ammoType = new PowerAmmoType(500);
mineTier = 1; mineTier = 1;
mineSpeed = 2.5f; mineSpeed = 2.5f;
@@ -1221,7 +1234,7 @@ public class UnitTypes implements ContentList{
hitSize = 9f; hitSize = 9f;
lowAltitude = true; lowAltitude = true;
ammoType = AmmoTypes.power; ammoType = new PowerAmmoType(900);
mineTier = 2; mineTier = 2;
mineSpeed = 3.5f; mineSpeed = 3.5f;
@@ -1281,7 +1294,7 @@ public class UnitTypes implements ContentList{
buildSpeed = 2.6f; buildSpeed = 2.6f;
isCounted = false; isCounted = false;
ammoType = AmmoTypes.power; ammoType = new PowerAmmoType(1100);
weapons.add( weapons.add(
new Weapon("heal-weapon-mount"){{ new Weapon("heal-weapon-mount"){{
@@ -1333,9 +1346,9 @@ public class UnitTypes implements ContentList{
buildBeamOffset = 23; buildBeamOffset = 23;
range = 140f; range = 140f;
targetAir = false; targetAir = false;
targetFlag = BlockFlag.battery; targetFlags = new BlockFlag[]{BlockFlag.battery, BlockFlag.factory, null};
ammoType = AmmoTypes.powerHigh; ammoType = new PowerAmmoType(3000);
weapons.add( weapons.add(
new Weapon(){{ new Weapon(){{
@@ -1405,9 +1418,7 @@ public class UnitTypes implements ContentList{
commandLimit = 6; commandLimit = 6;
lowAltitude = true; lowAltitude = true;
buildBeamOffset = 43; buildBeamOffset = 43;
ammoCapacity = 1;
ammoCapacity = 1300;
ammoResupplyAmount = 20;
abilities.add(new ForceFieldAbility(140f, 4f, 7000f, 60f * 8), new RepairFieldAbility(130f, 60f * 2, 140f)); abilities.add(new ForceFieldAbility(140f, 4f, 7000f, 60f * 8), new RepairFieldAbility(130f, 60f * 2, 140f));
}}; }};
@@ -1475,6 +1486,7 @@ public class UnitTypes implements ContentList{
accel = 0.3f; accel = 0.3f;
rotateSpeed = 2.6f; rotateSpeed = 2.6f;
rotateShooting = false; rotateShooting = false;
ammoType = new ItemAmmoType(Items.graphite);
trailLength = 20; trailLength = 20;
trailX = 5.5f; trailX = 5.5f;
@@ -1518,6 +1530,7 @@ public class UnitTypes implements ContentList{
hitSize = 20f; hitSize = 20f;
armor = 7f; armor = 7f;
rotateShooting = false; rotateShooting = false;
ammoType = new ItemAmmoType(Items.graphite);
trailLength = 22; trailLength = 22;
trailX = 7f; trailX = 7f;
@@ -1581,6 +1594,7 @@ public class UnitTypes implements ContentList{
inaccuracy = 5f; inaccuracy = 5f;
velocityRnd = 0.1f; velocityRnd = 0.1f;
shootSound = Sounds.missile; shootSound = Sounds.missile;
ammoType = new ItemAmmoType(Items.thorium);
ejectEffect = Fx.none; ejectEffect = Fx.none;
bullet = new MissileBulletType(2.7f, 12){{ bullet = new MissileBulletType(2.7f, 12){{
@@ -1614,6 +1628,7 @@ public class UnitTypes implements ContentList{
accel = 0.2f; accel = 0.2f;
rotateSpeed = 1.3f; rotateSpeed = 1.3f;
rotateShooting = false; rotateShooting = false;
ammoType = new ItemAmmoType(Items.thorium);
trailLength = 50; trailLength = 50;
trailX = 18f; trailX = 18f;
@@ -1699,6 +1714,7 @@ public class UnitTypes implements ContentList{
accel = 0.19f; accel = 0.19f;
rotateSpeed = 0.9f; rotateSpeed = 0.9f;
rotateShooting = false; rotateShooting = false;
ammoType = new PowerAmmoType(4000);
float spawnTime = 60f * 15f; float spawnTime = 60f * 15f;
@@ -1756,6 +1772,7 @@ public class UnitTypes implements ContentList{
trailScl = 1.3f; trailScl = 1.3f;
rotateShooting = false; rotateShooting = false;
range = 100f; range = 100f;
ammoType = new PowerAmmoType(900);
armor = 3f; armor = 3f;
@@ -1780,6 +1797,7 @@ public class UnitTypes implements ContentList{
shots = 3; shots = 3;
shotDelay = 7f; shotDelay = 7f;
x = y = shootX = shootY = 0f; x = y = shootX = shootY = 0f;
shootSound = Sounds.mineDeploy;
bullet = new BasicBulletType(){{ bullet = new BasicBulletType(){{
sprite = "mine-bullet"; sprite = "mine-bullet";
@@ -1832,6 +1850,7 @@ public class UnitTypes implements ContentList{
trailX = 5.5f; trailX = 5.5f;
trailY = -4f; trailY = -4f;
trailScl = 1.9f; trailScl = 1.9f;
ammoType = new ItemAmmoType(Items.coal);
buildSpeed = 2f; buildSpeed = 2f;
@@ -1900,6 +1919,7 @@ public class UnitTypes implements ContentList{
hitSize = 20f; hitSize = 20f;
armor = 6f; armor = 6f;
rotateShooting = false; rotateShooting = false;
ammoType = new ItemAmmoType(Items.graphite);
trailLength = 23; trailLength = 23;
trailX = 9f; trailX = 9f;
@@ -2035,6 +2055,8 @@ public class UnitTypes implements ContentList{
accel = 0.2f; accel = 0.2f;
rotateSpeed = 1.4f; rotateSpeed = 1.4f;
rotateShooting = false; rotateShooting = false;
ammoType = new PowerAmmoType(3500);
ammoCapacity = 40;
//clip size is massive due to energy field //clip size is massive due to energy field
clipSize = 250f; clipSize = 250f;
@@ -2078,6 +2100,7 @@ public class UnitTypes implements ContentList{
accel = 0.2f; accel = 0.2f;
rotateSpeed = 1.1f; rotateSpeed = 1.1f;
rotateShooting = false; rotateShooting = false;
ammoType = new PowerAmmoType(4500);
trailLength = 70; trailLength = 70;
trailX = 23f; trailX = 23f;
@@ -2150,6 +2173,8 @@ public class UnitTypes implements ContentList{
shootY = 7f; shootY = 7f;
recoil = 4f; recoil = 4f;
cooldownTime = reload - 10f; cooldownTime = reload - 10f;
//TODO better sound
shootSound = Sounds.laser;
bullet = new EmpBulletType(){{ bullet = new EmpBulletType(){{
float rad = 100f; float rad = 100f;
@@ -2182,6 +2207,7 @@ public class UnitTypes implements ContentList{
hitShake = 4f; hitShake = 4f;
trailRotation = true; trailRotation = true;
status = StatusEffects.electrified; status = StatusEffects.electrified;
hitSound = Sounds.plasmaboom;
trailEffect = new Effect(16f, e -> { trailEffect = new Effect(16f, e -> {
color(Pal.heal); color(Pal.heal);

View File

@@ -34,7 +34,6 @@ public class ContentLoader{
new StatusEffects(), new StatusEffects(),
new Liquids(), new Liquids(),
new Bullets(), new Bullets(),
new AmmoTypes(),
new UnitTypes(), new UnitTypes(),
new Blocks(), new Blocks(),
new Loadouts(), new Loadouts(),

View File

@@ -36,7 +36,6 @@ import java.text.*;
import java.util.*; import java.util.*;
import static arc.Core.*; import static arc.Core.*;
import static mindustry.Vars.net;
import static mindustry.Vars.*; import static mindustry.Vars.*;
/** /**
@@ -195,14 +194,16 @@ public class Control implements ApplicationListener, Loadable{
}); });
Events.run(Trigger.newGame, () -> { Events.run(Trigger.newGame, () -> {
Building core = player.bestCore(); var core = player.bestCore();
if(core == null) return; if(core == null) return;
camera.position.set(core); camera.position.set(core);
player.set(core); player.set(core);
if(showLandAnimation){ if(!settings.getBool("skipcoreanimation")){
//delay player respawn so animation can play.
player.deathTimer = -80f;
//TODO this sounds pretty bad due to conflict //TODO this sounds pretty bad due to conflict
if(settings.getInt("musicvol") > 0){ if(settings.getInt("musicvol") > 0){
Musics.land.stop(); Musics.land.stop();
@@ -211,14 +212,14 @@ public class Control implements ApplicationListener, Loadable{
} }
app.post(() -> ui.hudfrag.showLand()); app.post(() -> ui.hudfrag.showLand());
renderer.zoomIn(Fx.coreLand.lifetime); renderer.showLanding();
app.post(() -> Fx.coreLand.at(core.getX(), core.getY(), 0, core.block));
Time.run(Fx.coreLand.lifetime, () -> { Time.run(coreLandDuration, () -> {
Fx.launch.at(core); Fx.launch.at(core);
Effect.shake(5f, 5f, core); Effect.shake(5f, 5f, core);
core.thrusterTime = 1f;
if(state.isCampaign()){ if(state.isCampaign() && Vars.showSectorLandInfo){
ui.announce("[accent]" + state.rules.sector.name() + "\n" + ui.announce("[accent]" + state.rules.sector.name() + "\n" +
(state.rules.sector.info.resources.any() ? "[lightgray]" + bundle.get("sectors.resources") + "[white] " + (state.rules.sector.info.resources.any() ? "[lightgray]" + bundle.get("sectors.resources") + "[white] " +
state.rules.sector.info.resources.toString(" ", u -> u.emoji()) : ""), 5); state.rules.sector.info.resources.toString(" ", u -> u.emoji()) : ""), 5);
@@ -328,6 +329,7 @@ public class Control implements ApplicationListener, Loadable{
slot.load(); slot.load();
slot.setAutosave(true); slot.setAutosave(true);
state.rules.sector = sector; state.rules.sector = sector;
state.rules.cloudColor = sector.planet.landCloudColor;
//if there is no base, simulate a new game and place the right loadout at the spawn position //if there is no base, simulate a new game and place the right loadout at the spawn position
if(state.rules.defaultTeam.cores().isEmpty() || hadNoCore){ if(state.rules.defaultTeam.cores().isEmpty() || hadNoCore){
@@ -542,7 +544,12 @@ public class Control implements ApplicationListener, Loadable{
core.items.each((i, a) -> i.unlock()); core.items.each((i, a) -> i.unlock());
} }
if(Core.input.keyTap(Binding.pause) && !scene.hasDialog() && !scene.hasKeyboard() && !ui.restart.isShown() && (state.is(State.paused) || state.is(State.playing))){ //cannot launch while paused
if(state.is(State.paused) && renderer.isCutscene()){
state.set(State.playing);
}
if(Core.input.keyTap(Binding.pause) && !renderer.isCutscene() && !scene.hasDialog() && !scene.hasKeyboard() && !ui.restart.isShown() && (state.is(State.paused) || state.is(State.playing))){
state.set(state.is(State.playing) ? State.paused : State.playing); state.set(state.is(State.playing) ? State.paused : State.playing);
} }

View File

@@ -49,6 +49,7 @@ public class Logic implements ApplicationListener{
BlockPlan b = it.next(); BlockPlan b = it.next();
Block block = content.block(b.block); Block block = content.block(b.block);
if(event.tile.block().bounds(event.tile.x, event.tile.y, Tmp.r1).overlaps(block.bounds(b.x, b.y, Tmp.r2))){ if(event.tile.block().bounds(event.tile.x, event.tile.y, Tmp.r1).overlaps(block.bounds(b.x, b.y, Tmp.r2))){
b.removed = true;
it.remove(); it.remove();
} }
} }
@@ -128,25 +129,7 @@ public class Logic implements ApplicationListener{
Events.on(SectorCaptureEvent.class, e -> { Events.on(SectorCaptureEvent.class, e -> {
if(!net.client() && e.sector == state.getSector() && e.sector.isBeingPlayed()){ if(!net.client() && e.sector == state.getSector() && e.sector.isBeingPlayed()){
for(Tile tile : world.tiles){ state.rules.waveTeam.data().destroyToDerelict();
//convert all blocks to neutral, randomly killing them
if(tile.isCenter() && tile.build != null && tile.build.team == state.rules.waveTeam){
Building b = tile.build;
Call.setTeam(b, Team.derelict);
Time.run(Mathf.random(0f, 60f * 6f), () -> {
if(Mathf.chance(0.25)){
b.kill();
}
});
}
}
//kill all units
Groups.unit.each(u -> {
if(u.team == state.rules.waveTeam){
Time.run(Mathf.random(0f, 60f * 5f), u::kill);
}
});
} }
}); });
@@ -162,6 +145,12 @@ public class Logic implements ApplicationListener{
} }
}); });
//listen to core changes; if all cores have been destroyed, set to derelict.
Events.on(CoreChangeEvent.class, e -> Core.app.post(() -> {
if(state.rules.cleanupDeadTeams && state.rules.pvp && !e.core.isAdded() && e.core.team != Team.derelict && e.core.team.cores().isEmpty()){
e.core.team.data().destroyToDerelict();
}
}));
} }
/** Adds starting items, resets wave time, and sets state to playing. */ /** Adds starting items, resets wave time, and sets state to playing. */

View File

@@ -1,6 +1,7 @@
package mindustry.core; package mindustry.core;
import arc.*; import arc.*;
import arc.audio.*;
import arc.func.*; import arc.func.*;
import arc.graphics.*; import arc.graphics.*;
import arc.math.*; import arc.math.*;
@@ -159,6 +160,20 @@ public class NetClient implements ApplicationListener{
clientPacketReliable(type, contents); clientPacketReliable(type, contents);
} }
@Remote(variants = Variant.both, unreliable = true)
public static void sound(Sound sound, float volume, float pitch, float pan){
if(sound == null) return;
sound.play(volume * Core.settings.getInt("sfxvol") / 100f, pitch, pan);
}
@Remote(variants = Variant.both, unreliable = true)
public static void soundAt(Sound sound, float x, float y, float volume, float pitch){
if(sound == null) return;
sound.at(x, y, pitch, volume);
}
@Remote(variants = Variant.both, unreliable = true) @Remote(variants = Variant.both, unreliable = true)
public static void effect(Effect effect, float x, float y, float rotation, Color color){ public static void effect(Effect effect, float x, float y, float rotation, Color color){
if(effect == null) return; if(effect == null) return;
@@ -274,6 +289,7 @@ public class NetClient implements ApplicationListener{
@Remote(called = Loc.client, variants = Variant.one) @Remote(called = Loc.client, variants = Variant.one)
public static void connect(String ip, int port){ public static void connect(String ip, int port){
if(!steam && ip.startsWith("steam:")) return;
netClient.disconnectQuietly(); netClient.disconnectQuietly();
logic.reset(); logic.reset();

View File

@@ -7,6 +7,7 @@ import arc.graphics.Texture.*;
import arc.graphics.g2d.*; import arc.graphics.g2d.*;
import arc.graphics.gl.*; import arc.graphics.gl.*;
import arc.math.*; import arc.math.*;
import arc.math.geom.*;
import arc.scene.ui.layout.*; import arc.scene.ui.layout.*;
import arc.struct.*; import arc.struct.*;
import arc.util.*; import arc.util.*;
@@ -17,6 +18,7 @@ import mindustry.game.EventType.*;
import mindustry.gen.*; import mindustry.gen.*;
import mindustry.graphics.*; import mindustry.graphics.*;
import mindustry.graphics.g3d.*; import mindustry.graphics.g3d.*;
import mindustry.world.blocks.storage.*;
import mindustry.world.blocks.storage.CoreBlock.*; import mindustry.world.blocks.storage.CoreBlock.*;
import static arc.Core.*; import static arc.Core.*;
@@ -26,6 +28,12 @@ public class Renderer implements ApplicationListener{
/** These are global variables, for headless access. Cached. */ /** These are global variables, for headless access. Cached. */
public static float laserOpacity = 0.5f, bridgeOpacity = 0.75f; public static float laserOpacity = 0.5f, bridgeOpacity = 0.75f;
private static final float cloudScaling = 1700f, cfinScl = -2f, cfinOffset = 0.3f, calphaFinOffset = 0.25f;
private static final float[] cloudAlphas = {0, 0.5f, 1f, 0.1f, 0, 0f};
private static final float cloudAlpha = 0.81f;
private static final float[] thrusterSizes = {0f, 0f, 0f, 0f, 0.3f, 1f, 1f, 1f, 1f, 1f, 1f, 1f, 1f, 0f};
private static final Interp landInterp = Interp.pow3;
public final BlockRenderer blocks = new BlockRenderer(); public final BlockRenderer blocks = new BlockRenderer();
public final MinimapRenderer minimap = new MinimapRenderer(); public final MinimapRenderer minimap = new MinimapRenderer();
public final OverlayRenderer overlays = new OverlayRenderer(); public final OverlayRenderer overlays = new OverlayRenderer();
@@ -36,15 +44,35 @@ public class Renderer implements ApplicationListener{
public @Nullable Bloom bloom; public @Nullable Bloom bloom;
public FrameBuffer effectBuffer = new FrameBuffer(); public FrameBuffer effectBuffer = new FrameBuffer();
public boolean animateShields, drawWeather = true, drawStatus; public boolean animateShields, drawWeather = true, drawStatus;
public float weatherAlpha;
/** minZoom = zooming out, maxZoom = zooming in */ /** minZoom = zooming out, maxZoom = zooming in */
public float minZoom = 1.5f, maxZoom = 6f; public float minZoom = 1.5f, maxZoom = 6f;
public Seq<EnvRenderer> envRenderers = new Seq<>(); public Seq<EnvRenderer> envRenderers = new Seq<>();
public TextureRegion[] bubbles = new TextureRegion[16], splashes = new TextureRegion[12]; public TextureRegion[] bubbles = new TextureRegion[16], splashes = new TextureRegion[12];
private @Nullable CoreBuild landCore; private @Nullable CoreBuild landCore;
private @Nullable CoreBlock launchCoreType;
private Color clearColor = new Color(0f, 0f, 0f, 1f); private Color clearColor = new Color(0f, 0f, 0f, 1f);
private float targetscale = Scl.scl(4), camerascale = targetscale, landscale, landTime, weatherAlpha, minZoomScl = Scl.scl(0.01f); private float
private float shakeIntensity, shaketime; //seed for cloud visuals, 0-1
cloudSeed = 0f,
//target camera scale that is lerp-ed to
targetscale = Scl.scl(4),
//current actual camera scale
camerascale = targetscale,
//minimum camera zoom value for landing/launching; constant TODO make larger?
minZoomScl = Scl.scl(0.02f),
//starts at coreLandDuration, ends at 0. if positive, core is landing.
landTime,
//timer for core landing particles
landPTimer,
//intensity for screen shake
shakeIntensity,
//current duration of screen shake
shakeTime;
//for landTime > 0: if true, core is currently *launching*, otherwise landing.
private boolean launching;
private Vec2 camShakeOffset = new Vec2();
public Renderer(){ public Renderer(){
camera = new Camera(); camera = new Camera();
@@ -53,7 +81,7 @@ public class Renderer implements ApplicationListener{
public void shake(float intensity, float duration){ public void shake(float intensity, float duration){
shakeIntensity = Math.max(shakeIntensity, intensity); shakeIntensity = Math.max(shakeIntensity, intensity);
shaketime = Math.max(shaketime, duration); shakeTime = Math.max(shakeTime, duration);
} }
public void addEnvRenderer(int mask, Runnable render){ public void addEnvRenderer(int mask, Runnable render){
@@ -95,12 +123,22 @@ public class Renderer implements ApplicationListener{
drawStatus = Core.settings.getBool("blockstatus"); drawStatus = Core.settings.getBool("blockstatus");
if(landTime > 0){ if(landTime > 0){
if(!state.isPaused()){
updateLandParticles();
}
if(!state.isPaused()){ if(!state.isPaused()){
landTime -= Time.delta; landTime -= Time.delta;
} }
landscale = Interp.pow5In.apply(minZoomScl, Scl.scl(4f), 1f - landTime / Fx.coreLand.lifetime); float fin = landTime / coreLandDuration;
camerascale = landscale; if(!launching) fin = 1f - fin;
camerascale = landInterp.apply(minZoomScl, Scl.scl(4f), fin);
weatherAlpha = 0f; weatherAlpha = 0f;
//snap camera to cutscene core regardless of player input
if(landCore != null){
camera.position.set(landCore);
}
}else{ }else{
weatherAlpha = Mathf.lerpDelta(weatherAlpha, 1f, 0.08f); weatherAlpha = Mathf.lerpDelta(weatherAlpha, 1f, 0.08f);
} }
@@ -112,25 +150,35 @@ public class Renderer implements ApplicationListener{
landTime = 0f; landTime = 0f;
graphics.clear(Color.black); graphics.clear(Color.black);
}else{ }else{
updateShake(0.75f); if(shakeTime > 0){
float intensity = shakeIntensity * (settings.getInt("screenshake", 4) / 4f) * 0.75f;
camShakeOffset.setToRandomDirection().scl(Mathf.random(intensity));
camera.position.add(camShakeOffset);
shakeIntensity -= 0.25f * Time.delta;
shakeTime -= Time.delta;
shakeIntensity = Mathf.clamp(shakeIntensity, 0f, 100f);
}else{
camShakeOffset.setZero();
shakeIntensity = 0f;
}
if(pixelator.enabled()){ if(pixelator.enabled()){
pixelator.drawPixelate(); pixelator.drawPixelate();
}else{ }else{
draw(); draw();
} }
camera.position.sub(camShakeOffset);
} }
} }
public boolean isLanding(){ /** @return whether a launch/land cutscene is playing. */
public boolean isCutscene(){
return landTime > 0; return landTime > 0;
} }
public float weatherAlpha(){
return weatherAlpha;
}
public float landScale(){ public float landScale(){
return landTime > 0 ? landscale : 1f; return landTime > 0 ? camerascale : 1f;
} }
@Override @Override
@@ -172,18 +220,6 @@ public class Renderer implements ApplicationListener{
} }
} }
void updateShake(float scale){
if(shaketime > 0){
float intensity = shakeIntensity * (settings.getInt("screenshake", 4) / 4f) * scale;
camera.position.add(Mathf.range(intensity), Mathf.range(intensity));
shakeIntensity -= 0.25f * Time.delta;
shaketime -= Time.delta;
shakeIntensity = Mathf.clamp(shakeIntensity, 0f, 100f);
}else{
shakeIntensity = 0f;
}
}
public void draw(){ public void draw(){
Events.fire(Trigger.preDraw); Events.fire(Trigger.preDraw);
@@ -275,47 +311,159 @@ public class Renderer implements ApplicationListener{
} }
private void drawBackground(){ private void drawBackground(){
//nothing to draw currently
} }
private void drawLanding(){ void updateLandParticles(){
CoreBuild entity = landCore == null ? player.bestCore() : landCore; float time = launching ? coreLandDuration - landTime : landTime;
//var clouds = assets.get("sprites/clouds.png", Texture.class); float tsize = Mathf.sample(thrusterSizes, (time + 35f) / coreLandDuration);
if(landTime > 0 && entity != null){
float fout = landTime / Fx.coreLand.lifetime;
//TODO clouds landPTimer += tsize * Time.delta;
/* if(landCore != null && landPTimer >= 1f){
float scaling = 10000f; landCore.tile.getLinkedTiles(t -> {
float sscl = 1f + fout*1.5f; if(Mathf.chance(0.4f)){
float offset = -0.38f; Fx.coreLandDust.at(t.worldx(), t.worldy(), landCore.angleTo(t) + Mathf.range(30f), Tmp.c1.set(t.floor().mapColor).mul(1.5f + Mathf.range(0.15f)));
}
});
Tmp.tr1.set(clouds); landPTimer = 0f;
Tmp.tr1.set((camera.position.x - camera.width/2f * sscl) / scaling, (camera.position.y - camera.height/2f * sscl) / scaling, (camera.position.x + camera.width/2f * sscl) / scaling, (camera.position.y + camera.height/2f * sscl) / scaling); }
Draw.alpha(Mathf.slope(Mathf.clamp(((1f - fout) + offset)/(1f + offset)))); }
Draw.mixcol(Pal.spore, 0.5f);
Draw.rect(Tmp.tr1, camera.position.x, camera.position.y, camera.width, camera.height);
Draw.reset();*/
TextureRegion reg = entity.block.fullIcon; void drawLanding(){
CoreBuild build = landCore == null ? player.bestCore() : landCore;
var clouds = assets.get("sprites/clouds.png", Texture.class);
if(landTime > 0 && build != null){
float fout = landTime / coreLandDuration;
if(launching) fout = 1f - fout;
float fin = 1f - fout;
//draw core
var block = launching && launchCoreType != null ? launchCoreType : (CoreBlock)build.block;
TextureRegion reg = block.fullIcon;
float scl = Scl.scl(4f) / camerascale; float scl = Scl.scl(4f) / camerascale;
float s = reg.width * Draw.scl * scl * 4f * fout; float shake = 0f;
float s = reg.width * Draw.scl * scl * 3.6f * Interp.pow2Out.apply(fout);
float rotation = Interp.pow2In.apply(fout) * 135f, x = build.x + Mathf.range(shake), y = build.y + Mathf.range(shake);
float thrustOpen = 0.25f;
float thrusterFrame = fin >= thrustOpen ? 1f : fin / thrustOpen;
float thrusterSize = Mathf.sample(thrusterSizes, fin);
//when launching, thrusters stay out the entire time.
if(launching){
Interp i = Interp.pow2Out;
thrusterFrame = i.apply(Mathf.clamp(fout*13f));
thrusterSize = i.apply(Mathf.clamp(fout*9f));
}
Draw.color(Pal.lightTrail); Draw.color(Pal.lightTrail);
Draw.rect("circle-shadow", entity.x, entity.y, s, s); //TODO spikier heat
Draw.rect("circle-shadow", x, y, s, s);
Angles.randLenVectors(1, (1f- fout), 100, 1000f * scl * (1f-fout), (x, y, ffin, ffout) -> { Draw.color(Pal.lightTrail);
Lines.stroke(scl * ffin);
Lines.lineAngle(entity.x + x, entity.y + y, Mathf.angle(x, y), (ffin * 20 + 1f) * scl); float pfin = Interp.pow3Out.apply(fin), pf = Interp.pow2In.apply(fout);
//draw particles
Angles.randLenVectors(1, pfin, 100, 800f * scl * pfin, (ax, ay, ffin, ffout) -> {
Lines.stroke(scl * ffin * pf * 3f);
Lines.lineAngle(build.x + ax, build.y + ay, Mathf.angle(ax, ay), (ffin * 20 + 1f) * scl);
}); });
Draw.color(); Draw.color();
Draw.mixcol(Color.white, fout); Draw.mixcol(Color.white, Interp.pow5In.apply(fout));
Draw.rect(reg, entity.x, entity.y, reg.width * Draw.scl * scl, reg.height * Draw.scl * scl, fout * 135f);
//accent tint indicating that the core was just constructed
if(launching){
float f = Mathf.clamp(1f - fout * 12f);
if(f > 0.001f){
Draw.mixcol(Pal.accent, f);
}
}
Draw.scl(scl);
Draw.alpha(1f);
//draw thruster flame
float strength = (1f + (block.size - 3)/2.5f) * scl * thrusterSize * (0.95f + Mathf.absin(2f, 0.1f));
float offset = (block.size - 3) * 3f * scl;
for(int i = 0; i < 4; i++){
Tmp.v1.trns(i * 90 + rotation, 1f);
Tmp.v1.setLength((block.size * tilesize/2f + 1f)*scl + strength*2f + offset);
Draw.color(build.team.color);
Fill.circle(Tmp.v1.x + x, Tmp.v1.y + y, 6f * strength);
Tmp.v1.setLength((block.size * tilesize/2f + 1f)*scl + strength*0.5f + offset);
Draw.color(Color.white);
Fill.circle(Tmp.v1.x + x, Tmp.v1.y + y, 3.5f * strength);
}
drawThrusters(block, x, y, rotation, thrusterFrame);
Drawf.spinSprite(block.region, x, y, rotation);
Draw.alpha(Interp.pow4In.apply(thrusterFrame));
drawThrusters(block, x, y, rotation, thrusterFrame);
Draw.alpha(1f);
Drawf.spinSprite(block.teamRegions[build.team.id], x, y, rotation);
Draw.scl();
Draw.reset(); Draw.reset();
//draw clouds
if(state.rules.cloudColor.a > 0.0001f){
float scaling = cloudScaling;
float sscl = Math.max(1f + Mathf.clamp(fin + cfinOffset)* cfinScl, 0f) * camerascale;
Tmp.tr1.set(clouds);
Tmp.tr1.set(
(camera.position.x - camera.width/2f * sscl) / scaling,
(camera.position.y - camera.height/2f * sscl) / scaling,
(camera.position.x + camera.width/2f * sscl) / scaling,
(camera.position.y + camera.height/2f * sscl) / scaling);
Tmp.tr1.scroll(10f * cloudSeed, 10f * cloudSeed);
Draw.alpha(Mathf.sample(cloudAlphas, fin + calphaFinOffset) * cloudAlpha);
Draw.mixcol(state.rules.cloudColor, state.rules.cloudColor.a);
Draw.rect(Tmp.tr1, camera.position.x, camera.position.y, camera.width, camera.height);
Draw.reset();
} }
} }
}
void drawThrusters(CoreBlock block, float x, float y, float rotation, float frame){
float length = block.thrusterLength * (frame - 1f) - 1f/4f;
float alpha = Draw.getColor().a;
//two passes for consistent lighting
for(int j = 0; j < 2; j++){
for(int i = 0; i < 4; i++){
var reg = i >= 2 ? block.thruster2 : block.thruster1;
float rot = (i * 90) + rotation % 90f;
Tmp.v1.trns(rot, length * Draw.xscl);
//second pass applies extra layer of shading
if(j == 1){
Tmp.v1.rotate(-90f);
Draw.alpha((rotation % 90f) / 90f * alpha);
rot -= 90f;
Draw.rect(reg, x + Tmp.v1.x, y + Tmp.v1.y, rot);
}else{
Draw.alpha(alpha);
Draw.rect(reg, x + Tmp.v1.x, y + Tmp.v1.y, rot);
}
}
}
Draw.alpha(1f);
}
public void scaleCamera(float amount){ public void scaleCamera(float amount){
targetscale *= (amount / 4) + 1; targetscale *= (amount / 4) + 1;
@@ -347,9 +495,23 @@ public class Renderer implements ApplicationListener{
clampScale(); clampScale();
} }
public void zoomIn(float duration){ public void showLanding(){
landscale = minZoomScl; launching = false;
landTime = duration; camerascale = minZoomScl;
landTime = coreLandDuration;
cloudSeed = Mathf.random(1f);
}
public void showLaunch(CoreBlock coreType){
Vars.ui.hudfrag.showLaunch();
launchCoreType = coreType;
launching = true;
landCore = player.team().core();
cloudSeed = Mathf.random(1f);
landTime = coreLandDuration;
if(landCore != null){
Fx.coreLaunchConstruct.at(landCore.x, landCore.y, coreType.size);
}
} }
public void takeMapScreenshot(){ public void takeMapScreenshot(){

View File

@@ -33,7 +33,7 @@ import static arc.scene.actions.Actions.*;
import static mindustry.Vars.*; import static mindustry.Vars.*;
public class UI implements ApplicationListener, Loadable{ public class UI implements ApplicationListener, Loadable{
private static String billions, millions, thousands; public static String billions, millions, thousands;
public static PixmapPacker packer; public static PixmapPacker packer;

View File

@@ -287,6 +287,7 @@ public class World{
if(liquid != null) content.add(liquid); if(liquid != null) content.add(liquid);
} }
state.rules.cloudColor = sector.planet.landCloudColor;
sector.info.resources = content.asArray(); sector.info.resources = content.asArray();
sector.info.resources.sort(Structs.comps(Structs.comparing(Content::getContentType), Structs.comparingInt(c -> c.id))); sector.info.resources.sort(Structs.comps(Structs.comparing(Content::getContentType), Structs.comparingInt(c -> c.id)));
sector.saveInfo(); sector.saveInfo();
@@ -525,8 +526,7 @@ public class World{
private class Context implements WorldContext{ private class Context implements WorldContext{
Context(){ Context(){}
}
@Override @Override
public Tile tile(int index){ public Tile tile(int index){
@@ -579,7 +579,7 @@ public class World{
for(GenerateFilter filter : filters){ for(GenerateFilter filter : filters){
filter.randomize(); filter.randomize();
input.begin(filter, width(), height(), (x, y) -> tiles.getn(x, y)); input.begin(width(), height(), (x, y) -> tiles.getn(x, y));
filter.apply(tiles, input); filter.apply(tiles, input);
} }
} }

View File

@@ -16,7 +16,7 @@ public enum ContentType{
typeid_UNUSED, typeid_UNUSED,
error, error,
planet, planet,
ammo; ammo_UNUSED;
public static final ContentType[] all = values(); public static final ContentType[] all = values();
} }

View File

@@ -560,10 +560,12 @@ public class MapEditorDialog extends Dialog implements Disposable{
} }
} }
t.top(); var label = new Label("@editor.brush");
t.add("@editor.brush"); label.setAlignment(Align.center);
label.touchable = Touchable.disabled;
t.top().stack(slider, label).width(size * 3f - 20).padTop(4f);
t.row(); t.row();
t.add(slider).width(size * 3f - 20).padTop(4f);
}).padTop(5).growX().top(); }).padTop(5).growX().top();
mid.row(); mid.row();

View File

@@ -15,6 +15,7 @@ import mindustry.game.*;
import mindustry.gen.*; import mindustry.gen.*;
import mindustry.graphics.*; import mindustry.graphics.*;
import mindustry.io.*; import mindustry.io.*;
import mindustry.maps.*;
import mindustry.maps.filters.*; import mindustry.maps.filters.*;
import mindustry.maps.filters.GenerateFilter.*; import mindustry.maps.filters.GenerateFilter.*;
import mindustry.ui.*; import mindustry.ui.*;
@@ -26,12 +27,6 @@ import static mindustry.Vars.*;
@SuppressWarnings("unchecked") @SuppressWarnings("unchecked")
public class MapGenerateDialog extends BaseDialog{ public class MapGenerateDialog extends BaseDialog{
final Prov<GenerateFilter>[] filterTypes = new Prov[]{
NoiseFilter::new, ScatterFilter::new, TerrainFilter::new, DistortFilter::new,
RiverNoiseFilter::new, OreFilter::new, OreMedianFilter::new, MedianFilter::new,
BlendFilter::new, MirrorFilter::new, ClearFilter::new, CoreSpawnFilter::new,
EnemySpawnFilter::new, SpawnPathFilter::new
};
final boolean applied; final boolean applied;
Pixmap pixmap; Pixmap pixmap;
@@ -158,7 +153,7 @@ public class MapGenerateDialog extends BaseDialog{
long[] writeTiles = new long[editor.width() * editor.height()]; long[] writeTiles = new long[editor.width() * editor.height()];
for(GenerateFilter filter : filters){ for(GenerateFilter filter : filters){
input.begin(filter, editor.width(), editor.height(), editor::tile); input.begin(editor.width(), editor.height(), editor::tile);
//write to buffer //write to buffer
for(int x = 0; x < editor.width(); x++){ for(int x = 0; x < editor.width(); x++){
@@ -333,7 +328,7 @@ public class MapGenerateDialog extends BaseDialog{
p.marginRight(14); p.marginRight(14);
p.defaults().size(195f, 56f); p.defaults().size(195f, 56f);
int i = 0; int i = 0;
for(var gen : filterTypes){ for(var gen : Maps.allFilterTypes){
var filter = gen.get(); var filter = gen.get();
var icon = filter.icon(); var icon = filter.icon();
@@ -414,7 +409,7 @@ public class MapGenerateDialog extends BaseDialog{
} }
for(var filter : copy){ for(var filter : copy){
input.begin(filter, editor.width(), editor.height(), (x, y) -> unpack(buffer1[Mathf.clamp(x / scaling, 0, pixmap.width -1) + w* Mathf.clamp(y / scaling, 0, pixmap.height -1)])); input.begin(editor.width(), editor.height(), (x, y) -> unpack(buffer1[Mathf.clamp(x / scaling, 0, pixmap.width -1) + w* Mathf.clamp(y / scaling, 0, pixmap.height -1)]));
//read from buffer1 and write to buffer2 //read from buffer1 and write to buffer2
pixmap.each((px, py) -> { pixmap.each((px, py) -> {

View File

@@ -141,12 +141,9 @@ public class Effect{
} }
public static void create(Effect effect, float x, float y, float rotation, Color color, Object data){ public static void create(Effect effect, float x, float y, float rotation, Color color, Object data){
if(headless || effect == Fx.none) return; if(headless || effect == Fx.none || !Core.settings.getBool("effects")) return;
if(Core.settings.getBool("effects")){
Rect view = Core.camera.bounds(Tmp.r1);
Rect pos = Tmp.r2.setSize(effect.clip).setCenter(x, y);
if(view.overlaps(pos)){ if(Core.camera.bounds(Tmp.r1).overlaps(Tmp.r2.setCentered(x, y, effect.clip))){
if(!effect.initialized){ if(!effect.initialized){
effect.initialized = true; effect.initialized = true;
effect.init(); effect.init();
@@ -159,11 +156,10 @@ public class Effect{
entity.lifetime = effect.lifetime; entity.lifetime = effect.lifetime;
entity.set(x, y); entity.set(x, y);
entity.color.set(color); entity.color.set(color);
if(effect.followParent && data instanceof Posc) entity.parent = ((Posc)data); if(effect.followParent && data instanceof Posc p) entity.parent = p;
entity.add(); entity.add();
} }
} }
}
public static void decal(TextureRegion region, float x, float y, float rotation){ public static void decal(TextureRegion region, float x, float y, float rotation){
decal(region, x, y, rotation, 3600f, Pal.rubble); decal(region, x, y, rotation, 3600f, Pal.rubble);

View File

@@ -9,8 +9,8 @@ import mindustry.gen.*;
* Class for predicting shoot angles based on velocities of targets. * Class for predicting shoot angles based on velocities of targets.
*/ */
public class Predict{ public class Predict{
private static Vec2 vec = new Vec2(); private static final Vec2 vec = new Vec2();
private static Vec2 vresult = new Vec2(); private static final Vec2 vresult = new Vec2();
/** /**
* Calculates of intercept of a stationary and moving target. Do not call from multiple threads! * Calculates of intercept of a stationary and moving target. Do not call from multiple threads!
@@ -52,6 +52,10 @@ public class Predict{
} }
public static Vec2 intercept(Position src, Position dst, float v){ public static Vec2 intercept(Position src, Position dst, float v){
return intercept(src, dst, 0, 0, v);
}
public static Vec2 intercept(Position src, Position dst, float offsetx, float offsety, float v){
float ddx = 0, ddy = 0; float ddx = 0, ddy = 0;
if(dst instanceof Hitboxc h){ if(dst instanceof Hitboxc h){
ddx += h.deltaX(); ddx += h.deltaX();
@@ -61,7 +65,7 @@ public class Predict{
ddx -= h.deltaX(); ddx -= h.deltaX();
ddy -= h.deltaY(); ddy -= h.deltaY();
} }
return intercept(src.getX(), src.getY(), dst.getX(), dst.getY(), ddx, ddy, v); return intercept(src.getX(), src.getY(), dst.getX() + offsetx, dst.getY() + offsety, ddx, ddy, v);
} }
/** /**

View File

@@ -22,6 +22,7 @@ public class Units{
private static float cdist; private static float cdist;
private static boolean boolResult; private static boolean boolResult;
private static int intResult; private static int intResult;
private static Building buildResult;
@Remote(called = Loc.server) @Remote(called = Loc.server)
public static void unitCapDeath(Unit unit){ public static void unitCapDeath(Unit unit){
@@ -157,6 +158,26 @@ public class Units{
return indexer.findEnemyTile(team, x, y, range, pred); return indexer.findEnemyTile(team, x, y, range, pred);
} }
/** @return the closest building of the provided team that matches the predicate. */
public static @Nullable Building closestBuilding(Team team, float wx, float wy, float range, Boolf<Building> pred){
buildResult = null;
cdist = 0f;
var buildings = team.data().buildings;
if(buildings == null) return null;
buildings.intersect(wx - range, wy - range, range*2f, range*2f, b -> {
if(pred.get(b)){
float dst = b.dst(wx, wy) - b.hitSize()/2f;
if(dst <= range && (buildResult == null || dst <= cdist)){
cdist = dst;
buildResult = b;
}
}
});
return buildResult;
}
/** Iterates through all buildings in a range. */ /** Iterates through all buildings in a range. */
public static void nearbyBuildings(float x, float y, float range, Cons<Building> cons){ public static void nearbyBuildings(float x, float y, float range, Cons<Building> cons){
indexer.allBuildings(x, y, range, cons); indexer.allBuildings(x, y, range, cons);
@@ -184,7 +205,7 @@ public class Units{
} }
} }
/** Returns the closest target enemy. First, units are checked, then tile entities. */ /** Returns the closest target enemy. First, units are checked, then buildings. */
public static Teamc bestTarget(Team team, float x, float y, float range, Boolf<Unit> unitPred, Boolf<Building> tilePred, Sortf sort){ public static Teamc bestTarget(Team team, float x, float y, float range, Boolf<Unit> unitPred, Boolf<Building> tilePred, Sortf sort){
if(team == Team.derelict) return null; if(team == Team.derelict) return null;

View File

@@ -1,6 +1,7 @@
package mindustry.entities.abilities; package mindustry.entities.abilities;
import arc.*; import arc.*;
import arc.audio.*;
import arc.graphics.*; import arc.graphics.*;
import arc.graphics.g2d.*; import arc.graphics.g2d.*;
import arc.math.*; import arc.math.*;
@@ -13,12 +14,15 @@ import mindustry.gen.*;
import mindustry.graphics.*; import mindustry.graphics.*;
import mindustry.type.*; import mindustry.type.*;
import static mindustry.Vars.*;
public class EnergyFieldAbility extends Ability{ public class EnergyFieldAbility extends Ability{
private static final Seq<Healthc> all = new Seq<>(); private static final Seq<Healthc> all = new Seq<>();
public float damage = 1, reload = 100, range = 60; public float damage = 1, reload = 100, range = 60;
public Effect healEffect = Fx.heal, hitEffect = Fx.hitLaserBlast, damageEffect = Fx.chainLightning; public Effect healEffect = Fx.heal, hitEffect = Fx.hitLaserBlast, damageEffect = Fx.chainLightning;
public StatusEffect status = StatusEffects.electrified; public StatusEffect status = StatusEffects.electrified;
public Sound shootSound = Sounds.spark;
public float statusDuration = 60f * 6f; public float statusDuration = 60f * 6f;
public float x, y; public float x, y;
public boolean hitBuildings = true; public boolean hitBuildings = true;
@@ -29,6 +33,7 @@ public class EnergyFieldAbility extends Ability{
public float effectRadius = 5f, sectorRad = 0.14f, rotateSpeed = 0.5f; public float effectRadius = 5f, sectorRad = 0.14f, rotateSpeed = 0.5f;
public int sectors = 5; public int sectors = 5;
public Color color = Pal.heal; public Color color = Pal.heal;
public boolean useAmmo = true;
protected float timer, curStroke; protected float timer, curStroke;
protected boolean anyNearby = false; protected boolean anyNearby = false;
@@ -86,8 +91,7 @@ public class EnergyFieldAbility extends Ability{
curStroke = Mathf.lerpDelta(curStroke, anyNearby ? 1 : 0, 0.09f); curStroke = Mathf.lerpDelta(curStroke, anyNearby ? 1 : 0, 0.09f);
if((timer += Time.delta) >= reload){ if((timer += Time.delta) >= reload && (!useAmmo || unit.ammo > 0 || !state.rules.unitAmmo)){
Tmp.v1.trns(unit.rotation - 90, x, y).add(unit.x, unit.y); Tmp.v1.trns(unit.rotation - 90, x, y).add(unit.x, unit.y);
float rx = Tmp.v1.x, ry = Tmp.v1.y; float rx = Tmp.v1.x, ry = Tmp.v1.y;
anyNearby = false; anyNearby = false;
@@ -139,6 +143,14 @@ public class EnergyFieldAbility extends Ability{
} }
} }
if(anyNearby){
shootSound.at(unit);
if(useAmmo && state.rules.unitAmmo){
unit.ammo --;
}
}
timer = 0f; timer = 0f;
} }
} }

View File

@@ -232,8 +232,8 @@ public class BulletType extends Content implements Cloneable{
} }
if(entity instanceof Unit unit){ if(entity instanceof Unit unit){
Tmp.v3.set(unit).sub(b.x, b.y).nor().scl(knockback * 80f); Tmp.v3.set(unit).sub(b).nor().scl(knockback * 80f);
if(impact) Tmp.v3.setAngle(b.rotation()); if(impact) Tmp.v3.setAngle(b.rotation() + (knockback < 0 ? 180f : 0f));
unit.impulse(Tmp.v3); unit.impulse(Tmp.v3);
unit.apply(status, statusDuration); unit.apply(status, statusDuration);
} }
@@ -371,7 +371,7 @@ public class BulletType extends Content implements Cloneable{
e -> e.checkTarget(collidesAir, collidesGround) && e.team != b.team, e -> e.checkTarget(collidesAir, collidesGround) && e.team != b.team,
t -> collidesGround && (t.team != b.team || t.damaged())); t -> collidesGround && (t.team != b.team || t.damaged()));
}else{ }else{
target = Units.closestTarget(b.team, b.x, b.y, homingRange, e -> e.checkTarget(collidesAir, collidesGround), t -> collidesGround); target = Units.closestTarget(b.team, b.x, b.y, homingRange, e -> e.checkTarget(collidesAir, collidesGround) && !b.hasCollided(e.id), t -> collidesGround && !b.hasCollided(t.id));
} }
if(target != null){ if(target != null){

View File

@@ -1,28 +0,0 @@
package mindustry.entities.comp;
import arc.util.*;
import mindustry.annotations.Annotations.*;
import mindustry.game.*;
import mindustry.gen.*;
import mindustry.type.*;
import mindustry.world.blocks.units.*;
@Component
abstract class AmmoDistributeComp implements Unitc{
@Import float x, y;
@Import UnitType type;
@Import Team team;
@Import float ammo;
private transient float ammoCooldown;
@Override
public void update(){
if(ammoCooldown > 0f) ammoCooldown -= Time.delta;
if(ammo > 0 && ammoCooldown <= 0f && ResupplyPoint.resupply(team, x, y, type.ammoResupplyRange, Math.min(type.ammoResupplyAmount, ammo), type.ammoType.color, u -> u != self())){
ammo -= Math.min(type.ammoResupplyAmount, ammo);
ammoCooldown = 5f;
}
}
}

View File

@@ -9,7 +9,7 @@ import static mindustry.Vars.*;
@Component @Component
abstract class BoundedComp implements Velc, Posc, Healthc, Flyingc{ abstract class BoundedComp implements Velc, Posc, Healthc, Flyingc{
static final float warpDst = 40f; static final float warpDst = 30f;
@Import float x, y; @Import float x, y;

View File

@@ -20,7 +20,6 @@ import mindustry.type.*;
import mindustry.world.*; import mindustry.world.*;
import mindustry.world.blocks.*; import mindustry.world.blocks.*;
import mindustry.world.blocks.ConstructBlock.*; import mindustry.world.blocks.ConstructBlock.*;
import mindustry.world.blocks.storage.CoreBlock.*;
import java.util.*; import java.util.*;
@@ -97,7 +96,7 @@ abstract class BuilderComp implements Posc, Statusc, Teamc, Rotc{
if(!(tile.build instanceof ConstructBuild cb)){ if(!(tile.build instanceof ConstructBuild cb)){
if(!current.initialized && !current.breaking && Build.validPlace(current.block, team, current.x, current.y, current.rotation)){ if(!current.initialized && !current.breaking && Build.validPlace(current.block, team, current.x, current.y, current.rotation)){
boolean hasAll = infinite || current.isRotation(team) || !Structs.contains(current.block.requirements, i -> core != null && !core.items.has(i.item)); boolean hasAll = infinite || current.isRotation(team) || !Structs.contains(current.block.requirements, i -> core != null && !core.items.has(i.item, Mathf.round(i.amount * state.rules.buildCostMultiplier)));
if(hasAll){ if(hasAll){
Call.beginPlace(self(), current.block, team, current.x, current.y, current.rotation); Call.beginPlace(self(), current.block, team, current.x, current.y, current.rotation);
@@ -177,9 +176,9 @@ abstract class BuilderComp implements Posc, Statusc, Teamc, Rotc{
/** @return whether this request should be skipped, in favor of the next one. */ /** @return whether this request should be skipped, in favor of the next one. */
boolean shouldSkip(BuildPlan request, @Nullable Building core){ boolean shouldSkip(BuildPlan request, @Nullable Building core){
//requests that you have at least *started* are considered //requests that you have at least *started* are considered
if(state.rules.infiniteResources || team.rules().infiniteResources || request.breaking || core == null || request.isRotation(team)) return false; if(state.rules.infiniteResources || team.rules().infiniteResources || request.breaking || core == null || request.isRotation(team) || (isBuilding() && !within(plans.last(), buildingRange))) return false;
return (request.stuck && !core.items.has(request.block.requirements)) || (Structs.contains(request.block.requirements, i -> !core.items.has(i.item) && Mathf.round(i.amount * state.rules.buildCostMultiplier) > 0) && !request.initialized); return (request.stuck && !core.items.has(request.block.requirements)) || (Structs.contains(request.block.requirements, i -> !core.items.has(i.item, Math.min(i.amount, 15)) && Mathf.round(i.amount * state.rules.buildCostMultiplier) > 0) && !request.initialized);
} }
void removeBuild(int x, int y, boolean breaking){ void removeBuild(int x, int y, boolean breaking){

View File

@@ -106,7 +106,6 @@ abstract class BuildingComp implements Posc, Teamc, Healthc, Buildingc, Timerc,
/** Sets up all the necessary variables, but does not add this entity anywhere. */ /** Sets up all the necessary variables, but does not add this entity anywhere. */
public Building create(Block block, Team team){ public Building create(Block block, Team team){
this.tile = emptyTile;
this.block = block; this.block = block;
this.team = team; this.team = team;
@@ -1019,6 +1018,11 @@ abstract class BuildingComp implements Posc, Teamc, Healthc, Buildingc, Timerc,
} }
/** @return the cap for item amount calculations, used when this block explodes. */
public int explosionItemCap(){
return block.itemCapacity;
}
/** Called when the block is destroyed. The tile is still intact at this stage. */ /** Called when the block is destroyed. The tile is still intact at this stage. */
public void onDestroyed(){ public void onDestroyed(){
float explosiveness = block.baseExplosiveness; float explosiveness = block.baseExplosiveness;
@@ -1027,7 +1031,7 @@ abstract class BuildingComp implements Posc, Teamc, Healthc, Buildingc, Timerc,
if(block.hasItems){ if(block.hasItems){
for(Item item : content.items()){ for(Item item : content.items()){
int amount = items.get(item); int amount = Math.min(items.get(item), explosionItemCap());
explosiveness += item.explosiveness * amount; explosiveness += item.explosiveness * amount;
flammability += item.flammability * amount; flammability += item.flammability * amount;
power += item.charge * amount * 100f; power += item.charge * amount * 100f;
@@ -1067,7 +1071,9 @@ abstract class BuildingComp implements Posc, Teamc, Healthc, Buildingc, Timerc,
} }
public String getDisplayName(){ public String getDisplayName(){
return block.localizedName; return team == Team.derelict ?
block.localizedName + "\n" + Core.bundle.get("block.derelict"):
block.localizedName;
} }
public TextureRegion getDisplayIcon(){ public TextureRegion getDisplayIcon(){
@@ -1096,7 +1102,7 @@ abstract class BuildingComp implements Posc, Teamc, Healthc, Buildingc, Timerc,
table.row(); table.row();
table.table(this::displayConsumption).growX(); table.table(this::displayConsumption).growX();
boolean displayFlow = (block.category == Category.distribution || block.category == Category.liquid) && Core.settings.getBool("flow") && block.displayFlow; boolean displayFlow = (block.category == Category.distribution || block.category == Category.liquid) && block.displayFlow;
if(displayFlow){ if(displayFlow){
String ps = " " + StatUnit.perSecond.localized(); String ps = " " + StatUnit.perSecond.localized();
@@ -1443,7 +1449,7 @@ abstract class BuildingComp implements Posc, Teamc, Healthc, Buildingc, Timerc,
@Override @Override
public void killed(){ public void killed(){
Events.fire(new BlockDestroyEvent(tile)); Events.fire(new BlockDestroyEvent(tile));
block.breakSound.at(tile); block.destroySound.at(tile);
onDestroyed(); onDestroyed();
tile.remove(); tile.remove();
remove(); remove();

View File

@@ -80,6 +80,10 @@ abstract class BulletComp implements Timedc, Damagec, Hitboxc, Teamc, Posc, Draw
remove(); remove();
} }
public boolean hasCollided(int id){
return collided.size != 0 && !collided.contains(id);
}
@Replace @Replace
public float clipSize(){ public float clipSize(){
return type.drawSize; return type.drawSize;
@@ -90,7 +94,7 @@ abstract class BulletComp implements Timedc, Damagec, Hitboxc, Teamc, Posc, Draw
public boolean collides(Hitboxc other){ public boolean collides(Hitboxc other){
return type.collides && (other instanceof Teamc t && t.team() != team) return type.collides && (other instanceof Teamc t && t.team() != team)
&& !(other instanceof Flyingc f && !f.checkTarget(type.collidesAir, type.collidesGround)) && !(other instanceof Flyingc f && !f.checkTarget(type.collidesAir, type.collidesGround))
&& !(type.pierce && collided.contains(other.id())); //prevent multiple collisions && !(type.pierce && hasCollided(other.id())); //prevent multiple collisions
} }
@MethodPriority(100) @MethodPriority(100)
@@ -116,16 +120,16 @@ abstract class BulletComp implements Timedc, Damagec, Hitboxc, Teamc, Posc, Draw
if(type.collidesTiles && type.collides && type.collidesGround){ if(type.collidesTiles && type.collides && type.collidesGround){
world.raycastEach(World.toTile(lastX()), World.toTile(lastY()), tileX(), tileY(), (x, y) -> { world.raycastEach(World.toTile(lastX()), World.toTile(lastY()), tileX(), tileY(), (x, y) -> {
Building tile = world.build(x, y); Building build = world.build(x, y);
if(tile == null || !isAdded()) return false; if(build == null || !isAdded()) return false;
if(tile.collide(self()) && type.testCollision(self(), tile) && !tile.dead() && (type.collidesTeam || tile.team != team) && !(type.pierceBuilding && collided.contains(tile.id))){ if(build.collide(self()) && type.testCollision(self(), build) && !build.dead() && (type.collidesTeam || build.team != team) && !(type.pierceBuilding && hasCollided(build.id))){
boolean remove = false; boolean remove = false;
float health = tile.health; float health = build.health;
if(tile.team != team){ if(build.team != team){
remove = tile.collision(self()); remove = build.collision(self());
} }
if(remove || type.collidesTeam){ if(remove || type.collidesTeam){
@@ -133,11 +137,11 @@ abstract class BulletComp implements Timedc, Damagec, Hitboxc, Teamc, Posc, Draw
hit = true; hit = true;
remove(); remove();
}else{ }else{
collided.add(tile.id); collided.add(build.id);
} }
} }
type.hitTile(self(), tile, health, true); type.hitTile(self(), build, health, true);
return !type.pierceBuilding; return !type.pierceBuilding;
} }

View File

@@ -2,6 +2,7 @@ package mindustry.entities.comp;
import arc.math.*; import arc.math.*;
import arc.math.geom.*; import arc.math.geom.*;
import arc.util.*;
import mindustry.annotations.Annotations.*; import mindustry.annotations.Annotations.*;
import mindustry.async.PhysicsProcess.*; import mindustry.async.PhysicsProcess.*;
import mindustry.gen.*; import mindustry.gen.*;

View File

@@ -154,7 +154,7 @@ abstract class StatusComp implements Posc, Flyingc{
public void draw(){ public void draw(){
for(StatusEntry e : statuses){ for(StatusEntry e : statuses){
e.effect.draw(self()); e.effect.draw(self(), e.time);
} }
} }

View File

@@ -6,9 +6,11 @@ import arc.util.*;
import mindustry.*; import mindustry.*;
import mindustry.ai.*; import mindustry.ai.*;
import mindustry.entities.*; import mindustry.entities.*;
import mindustry.game.*;
import mindustry.gen.*; import mindustry.gen.*;
import mindustry.type.*; import mindustry.type.*;
import mindustry.world.*; import mindustry.world.*;
import mindustry.world.blocks.payloads.*;
import mindustry.world.meta.*; import mindustry.world.meta.*;
import static mindustry.Vars.*; import static mindustry.Vars.*;
@@ -78,7 +80,6 @@ public class AIController implements UnitController{
return Units.invalidateTarget(target, unit.team, unit.x, unit.y); return Units.invalidateTarget(target, unit.team, unit.x, unit.y);
} }
protected void pathfind(int pathTarget){ protected void pathfind(int pathTarget){
int costType = unit.pathType(); int costType = unit.pathType();
@@ -96,7 +97,7 @@ public class AIController implements UnitController{
boolean ret = retarget(); boolean ret = retarget();
if(ret){ if(ret){
target = findTarget(unit.x, unit.y, unit.range(), unit.type.targetAir, unit.type.targetGround); target = findMainTarget(unit.x, unit.y, unit.range(), unit.type.targetAir, unit.type.targetGround);
} }
if(invalid(target)){ if(invalid(target)){
@@ -154,6 +155,7 @@ public class AIController implements UnitController{
} }
protected Teamc targetFlag(float x, float y, BlockFlag flag, boolean enemy){ protected Teamc targetFlag(float x, float y, BlockFlag flag, boolean enemy){
if(unit.team == Team.derelict) return null;
Tile target = Geometry.findClosest(x, y, enemy ? indexer.getEnemy(unit.team, flag) : indexer.getAllied(unit.team, flag)); Tile target = Geometry.findClosest(x, y, enemy ? indexer.getEnemy(unit.team, flag) : indexer.getAllied(unit.team, flag));
return target == null ? null : target.build; return target == null ? null : target.build;
} }
@@ -166,6 +168,10 @@ public class AIController implements UnitController{
return timer.get(timerTarget, target == null ? 40 : 90); return timer.get(timerTarget, target == null ? 40 : 90);
} }
protected Teamc findMainTarget(float x, float y, float range, boolean air, boolean ground){
return findTarget(x, y, range, air, ground);
}
protected Teamc findTarget(float x, float y, float range, boolean air, boolean ground){ protected Teamc findTarget(float x, float y, float range, boolean air, boolean ground){
return target(x, y, range, air, ground); return target(x, y, range, air, ground);
} }
@@ -178,6 +184,14 @@ public class AIController implements UnitController{
return Geometry.findClosest(unit.x, unit.y, Vars.spawner.getSpawns()); return Geometry.findClosest(unit.x, unit.y, Vars.spawner.getSpawns());
} }
protected void unloadPayloads(){
if(unit instanceof Payloadc pay && pay.hasPayload() && target instanceof Building && pay.payloads().peek() instanceof UnitPayload){
if(target.within(unit, Math.max(unit.type().range + 1f, 75f))){
pay.dropLastPayload();
}
}
}
protected void circle(Position target, float circleLength){ protected void circle(Position target, float circleLength){
circle(target, circleLength, unit.speed()); circle(target, circleLength, unit.speed());
} }

View File

@@ -23,7 +23,7 @@ public enum Gamemode{
rules.waves = true; rules.waves = true;
rules.waveTimer = true; rules.waveTimer = true;
rules.waveSpacing = 60f * Time.toMinutes; rules.waveSpacing = 2f * Time.toMinutes;
rules.teams.get(rules.waveTeam).infiniteResources = true; rules.teams.get(rules.waveTeam).infiniteResources = true;
}, map -> map.teams.contains(state.rules.waveTeam.id)), }, map -> map.teams.contains(state.rules.waveTeam.id)),
pvp(rules -> { pvp(rules -> {

View File

@@ -70,6 +70,8 @@ public class Rules{
public float enemyCoreBuildRadius = 400f; public float enemyCoreBuildRadius = 400f;
/** If true, no-build zones are calculated based on the closest core. */ /** If true, no-build zones are calculated based on the closest core. */
public boolean polygonCoreProtection = false; public boolean polygonCoreProtection = false;
/** If true, dead teams in PvP automatically have their blocks & units converted to derelict upon death. */
public boolean cleanupDeadTeams = true;
/** Radius around enemy wave drop zones.*/ /** Radius around enemy wave drop zones.*/
public float dropZoneRadius = 300f; public float dropZoneRadius = 300f;
/** Time between waves in ticks. */ /** Time between waves in ticks. */
@@ -107,6 +109,8 @@ public class Rules{
public Team defaultTeam = Team.sharded; public Team defaultTeam = Team.sharded;
/** team of the enemy in waves/sectors. */ /** team of the enemy in waves/sectors. */
public Team waveTeam = Team.crux; public Team waveTeam = Team.crux;
/** color of clouds that is displayed when the player is landing */
public Color cloudColor = new Color(0f, 0f, 0f, 0f);
/** name of the custom mode that this ruleset describes, or null. */ /** name of the custom mode that this ruleset describes, or null. */
public @Nullable String modeName; public @Nullable String modeName;
/** Whether cores incinerate items when full, just like in the campaign. */ /** Whether cores incinerate items when full, just like in the campaign. */

View File

@@ -432,6 +432,11 @@ public class Schematics implements Loadable{
if(seq.contains(t -> !t.block().alwaysReplace && !t.synthetic())){ if(seq.contains(t -> !t.block().alwaysReplace && !t.synthetic())){
return; return;
} }
for(var t : seq){
if(t.block() != Blocks.air){
t.remove();
}
}
} }
tile.setBlock(st.block, team, st.rotation); tile.setBlock(st.block, team, st.rotation);

View File

@@ -55,7 +55,7 @@ public class SectorInfo{
/** Waves this sector can survive if under attack. Based on wave in info. <0 means uncalculated. */ /** Waves this sector can survive if under attack. Based on wave in info. <0 means uncalculated. */
public int wavesSurvived = -1; public int wavesSurvived = -1;
/** Time between waves. */ /** Time between waves. */
public float waveSpacing = 60 * 60 * 2; public float waveSpacing = 2 * Time.toMinutes;
/** Damage dealt to sector. */ /** Damage dealt to sector. */
public float damage; public float damage;
/** How many waves have passed while the player was away. */ /** How many waves have passed while the player was away. */
@@ -117,11 +117,6 @@ public class SectorInfo{
export.get(item, ExportStat::new).counter += amount; export.get(item, ExportStat::new).counter += amount;
} }
/** Subtracts from export statistics. */
public void handleItemImport(Item item, int amount){
export.get(item, ExportStat::new).counter -= amount;
}
public float getExport(Item item){ public float getExport(Item item){
return export.get(item, ExportStat::new).mean; return export.get(item, ExportStat::new).mean;
} }
@@ -270,6 +265,25 @@ public class SectorInfo{
return map; return map;
} }
/** @return a newly allocated map with import statistics. Use sparingly. */
//TODO this can be a float map
public ObjectMap<Item, ExportStat> importStats(){
ObjectMap<Item, ExportStat> imports = new ObjectMap<>();
//for all sectors on all planets that have bases and export to this sector
for(Planet planet : content.planets()){
for(Sector sector : planet.sectors){
Sector dest = sector.info.getRealDestination();
if(sector.hasBase() && sector.info != this && dest != null && dest.info == this){
//add their exports to our imports
sector.info.export.each((item, stat) -> {
imports.get(item, ExportStat::new).mean += stat.mean;
});
}
}
}
return imports;
}
public static class ExportStat{ public static class ExportStat{
public transient float counter; public transient float counter;
public transient WindowedMean means = new WindowedMean(valueWindow); public transient WindowedMean means = new WindowedMean(valueWindow);

View File

@@ -1,5 +1,6 @@
package mindustry.game; package mindustry.game;
import arc.struct.*;
import arc.util.*; import arc.util.*;
import arc.util.serialization.*; import arc.util.serialization.*;
import arc.util.serialization.Json.*; import arc.util.serialization.Json.*;
@@ -39,12 +40,12 @@ public class SpawnGroup implements JsonSerializable{
public float shieldScaling = 0f; public float shieldScaling = 0f;
/** Amount of enemies spawned initially, with no scaling */ /** Amount of enemies spawned initially, with no scaling */
public int unitAmount = 1; public int unitAmount = 1;
/** Seq of payloads that this unit will spawn with. */
public @Nullable Seq<UnitType> payloads;
/** Status effect applied to the spawned unit. Null to disable. */ /** Status effect applied to the spawned unit. Null to disable. */
@Nullable public @Nullable StatusEffect effect;
public StatusEffect effect;
/** Items this unit spawns with. Null to disable. */ /** Items this unit spawns with. Null to disable. */
@Nullable public @Nullable ItemStack items;
public ItemStack items;
public SpawnGroup(UnitType type){ public SpawnGroup(UnitType type){
this.type = type; this.type = type;
@@ -85,6 +86,15 @@ public class SpawnGroup implements JsonSerializable{
unit.shield = getShield(wave); unit.shield = getShield(wave);
//load up spawn payloads
if(payloads != null && unit instanceof Payloadc pay){
for(var type : payloads){
if(type == null) continue;
Unit payload = type.create(unit.team);
pay.pickup(payload);
}
}
return unit; return unit;
} }
@@ -101,6 +111,9 @@ public class SpawnGroup implements JsonSerializable{
if(shieldScaling != 0) json.writeValue("shieldScaling", shieldScaling); if(shieldScaling != 0) json.writeValue("shieldScaling", shieldScaling);
if(unitAmount != 1) json.writeValue("amount", unitAmount); if(unitAmount != 1) json.writeValue("amount", unitAmount);
if(effect != null) json.writeValue("effect", effect.name); if(effect != null) json.writeValue("effect", effect.name);
if(payloads != null && payloads.size > 0){
json.writeValue("payloads", payloads.map(u -> u.name).toArray(String.class));
}
} }
@Override @Override
@@ -117,6 +130,9 @@ public class SpawnGroup implements JsonSerializable{
shields = data.getFloat("shields", 0); shields = data.getFloat("shields", 0);
shieldScaling = data.getFloat("shieldScaling", 0); shieldScaling = data.getFloat("shieldScaling", 0);
unitAmount = data.getInt("amount", 1); unitAmount = data.getInt("amount", 1);
if(data.has("payloads")){
payloads = Seq.with(json.readValue(String[].class, data.get("payloads"))).map(s -> content.getByName(ContentType.unit, s));
}
//old boss effect ID //old boss effect ID
if(data.has("effect") && data.get("effect").isNumber() && data.getInt("effect", -1) == 8){ if(data.has("effect") && data.get("effect").isNumber() && data.getInt("effect", -1) == 8){

View File

@@ -96,6 +96,11 @@ public class Team implements Comparable<Team>{
return state.teams.isActive(this); return state.teams.isActive(this);
} }
/** @return whether this team is solely comprised of AI, with no players. */
public boolean isAI(){
return state.rules.waves && this == state.rules.waveTeam;
}
public boolean isEnemy(Team other){ public boolean isEnemy(Team other){
return this != other; return this != other;
} }

View File

@@ -1,6 +1,7 @@
package mindustry.game; package mindustry.game;
import arc.func.*; import arc.func.*;
import arc.math.*;
import arc.math.geom.*; import arc.math.geom.*;
import arc.struct.Queue; import arc.struct.Queue;
import arc.struct.*; import arc.struct.*;
@@ -260,6 +261,34 @@ public class Teams{
this.ai = new BaseAI(this); this.ai = new BaseAI(this);
} }
/** Destroys this team's presence on the map, killing part of its buildings and converting everything to 'derelict'. */
public void destroyToDerelict(){
//grab all buildings from quadtree.
var builds = new Seq<Building>();
if(buildings != null){
buildings.getObjects(builds);
}
//convert all team tiles to neutral, randomly killing them
for(var b : builds){
//TODO this may cause a lot of packet spam, optimize?
Call.setTeam(b, Team.derelict);
if(Mathf.chance(0.25)){
Time.run(Mathf.random(0f, 60f * 6f), b::kill);
}
}
//kill all units randomly
units.each(u -> Time.run(Mathf.random(0f, 60f * 5f), () -> {
//ensure unit hasn't switched teams for whatever reason
if(u.team == team){
u.kill();
}
}));
}
@Nullable @Nullable
public Seq<Unit> unitCache(UnitType type){ public Seq<Unit> unitCache(UnitType type){
if(unitsByType == null || unitsByType.length <= type.id || unitsByType[type.id] == null) return null; if(unitsByType == null || unitsByType.length <= type.id || unitsByType[type.id] == null) return null;
@@ -320,6 +349,7 @@ public class Teams{
public static class BlockPlan{ public static class BlockPlan{
public final short x, y, rotation, block; public final short x, y, rotation, block;
public final Object config; public final Object config;
public boolean removed;
public BlockPlan(int x, int y, short rotation, short block, Object config){ public BlockPlan(int x, int y, short rotation, short block, Object config){
this.x = (short)x; this.x = (short)x;

View File

@@ -41,6 +41,7 @@ public class Drawf{
Draw.reset(); Draw.reset();
} }
/** Sets Draw.z to the text layer, and returns the previous layer. */
public static float text(){ public static float text(){
float z = Draw.z(); float z = Draw.z();
if(renderer.pixelator.enabled()){ if(renderer.pixelator.enabled()){
@@ -203,20 +204,24 @@ public class Drawf{
Draw.color(); Draw.color();
} }
public static void laser(Team team, TextureRegion line, TextureRegion edge, float x, float y, float x2, float y2, float scale){
laser(team, line, edge, x, y, x2, y2, Mathf.angle(x2 - x, y2 - y), scale);
}
public static void laser(Team team, TextureRegion line, TextureRegion edge, float x, float y, float x2, float y2){ public static void laser(Team team, TextureRegion line, TextureRegion edge, float x, float y, float x2, float y2){
laser(team, line, edge, x, y, x2, y2, Mathf.angle(x2 - x, y2 - y), 1f); laser(team, line, edge, edge, x, y, x2, y2, 1f);
} }
public static void laser(Team team, TextureRegion line, TextureRegion edge, float x, float y, float x2, float y2, float rotation, float scale){ public static void laser(Team team, TextureRegion line, TextureRegion start, TextureRegion end, float x, float y, float x2, float y2){
float scl = 8f * scale * Draw.scl; laser(team, line, start, end, x, y, x2, y2, 1f);
float vx = Mathf.cosDeg(rotation) * scl, vy = Mathf.sinDeg(rotation) * scl; }
Draw.rect(edge, x, y, edge.width * scale * Draw.scl, edge.height * scale * Draw.scl, rotation + 180); public static void laser(Team team, TextureRegion line, TextureRegion edge, float x, float y, float x2, float y2, float scale){
Draw.rect(edge, x2, y2, edge.width * scale * Draw.scl, edge.height * scale * Draw.scl, rotation); laser(team, line, edge, edge, x, y, x2, y2, scale);
}
public static void laser(Team team, TextureRegion line, TextureRegion start, TextureRegion end, float x, float y, float x2, float y2, float scale){
float scl = 8f * scale * Draw.scl, rot = Mathf.angle(x2 - x, y2 - y);
float vx = Mathf.cosDeg(rot) * scl, vy = Mathf.sinDeg(rot) * scl;
Draw.rect(start, x, y, start.width * scale * Draw.scl, start.height * scale * Draw.scl, rot + 180);
Draw.rect(end, x2, y2, end.width * scale * Draw.scl, end.height * scale * Draw.scl, rot);
Lines.stroke(12f * scale); Lines.stroke(12f * scale);
Lines.line(line, x + vx, y + vy, x2 - vx, y2 - vy, false); Lines.line(line, x + vx, y + vy, x2 - vx, y2 - vy, false);
@@ -274,4 +279,13 @@ public class Drawf{
Draw.reset(); Draw.reset();
} }
/** Draws a sprite that should be light-wise correct, when rotated. Provided sprite must be symmetrical in shape. */
public static void spinSprite(TextureRegion region, float x, float y, float r){
r = Mathf.mod(r, 90f);
Draw.rect(region, x, y, r);
Draw.alpha(r / 90f);
Draw.rect(region, x, y, r - 90f);
Draw.alpha(1f);
}
} }

View File

@@ -281,10 +281,13 @@ public class FloorRenderer{
for(int tilex = cx * chunksize; tilex < (cx + 1) * chunksize && tilex < world.width(); tilex++){ for(int tilex = cx * chunksize; tilex < (cx + 1) * chunksize && tilex < world.width(); tilex++){
for(int tiley = cy * chunksize; tiley < (cy + 1) * chunksize && tiley < world.height(); tiley++){ for(int tiley = cy * chunksize; tiley < (cy + 1) * chunksize && tiley < world.height(); tiley++){
Tile tile = world.rawTile(tilex, tiley); Tile tile = world.rawTile(tilex, tiley);
boolean wall = tile.block().cacheLayer != CacheLayer.normal;
if(tile.block().cacheLayer != CacheLayer.normal){ if(wall){
used.add(tile.block().cacheLayer); used.add(tile.block().cacheLayer);
}else{ }
if(!wall || world.isAccessible(tilex, tiley)){
used.add(tile.floor().cacheLayer); used.add(tile.floor().cacheLayer);
} }
} }

View File

@@ -6,6 +6,7 @@ public class Pal{
public static Color public static Color
thoriumPink = Color.valueOf("f9a3c7"), thoriumPink = Color.valueOf("f9a3c7"),
coalBlack = Color.valueOf("272727"),
items = Color.valueOf("2ea756"), items = Color.valueOf("2ea756"),
command = Color.valueOf("eab678"), command = Color.valueOf("eab678"),

View File

@@ -204,7 +204,6 @@ public class DesktopInput extends InputHandler{
panning = false; panning = false;
} }
//TODO awful UI state checking code
if(((player.dead() || state.isPaused()) && !ui.chatfrag.shown()) && !scene.hasField() && !scene.hasDialog()){ if(((player.dead() || state.isPaused()) && !ui.chatfrag.shown()) && !scene.hasField() && !scene.hasDialog()){
if(input.keyDown(Binding.mouse_move)){ if(input.keyDown(Binding.mouse_move)){
panCam = true; panCam = true;
@@ -237,7 +236,7 @@ public class DesktopInput extends InputHandler{
} }
} }
if(!player.dead() && !state.isPaused() && !scene.hasField()){ if(!player.dead() && !state.isPaused() && !scene.hasField() && !renderer.isCutscene()){
updateMovement(player.unit()); updateMovement(player.unit());
if(Core.input.keyTap(Binding.respawn)){ if(Core.input.keyTap(Binding.respawn)){

View File

@@ -145,6 +145,7 @@ public abstract class InputHandler implements InputProcessor, GestureListener{
for(int pos : positions){ for(int pos : positions){
if(req.x == Point2.x(pos) && req.y == Point2.y(pos)){ if(req.x == Point2.x(pos) && req.y == Point2.y(pos)){
req.removed = true;
it.remove(); it.remove();
continue outer; continue outer;
} }
@@ -229,7 +230,7 @@ public abstract class InputHandler implements InputProcessor, GestureListener{
Unit unit = player.unit(); Unit unit = player.unit();
if(build != null && build.team == unit.team if(build != null && state.teams.canInteract(unit.team, build.team)
&& unit.within(build, tilesize * build.block.size * 1.2f + tilesize * 5f)){ && unit.within(build, tilesize * build.block.size * 1.2f + tilesize * 5f)){
//pick up block's payload //pick up block's payload
@@ -355,7 +356,7 @@ public abstract class InputHandler implements InputProcessor, GestureListener{
Events.fire(new TapEvent(player, tile)); Events.fire(new TapEvent(player, tile));
} }
@Remote(targets = Loc.both, called = Loc.both, forward = true) @Remote(targets = Loc.both, called = Loc.server, forward = true)
public static void buildingControlSelect(Player player, Building build){ public static void buildingControlSelect(Player player, Building build){
if(player == null || build == null || player.dead()) return; if(player == null || build == null || player.dead()) return;
@@ -509,7 +510,7 @@ public abstract class InputHandler implements InputProcessor, GestureListener{
}else{ }else{
Building build = world.buildWorld(pay.x(), pay.y()); Building build = world.buildWorld(pay.x(), pay.y());
if(build != null && build.team == unit.team){ if(build != null && state.teams.canInteract(unit.team, build.team)){
Call.requestBuildPayload(player, build); Call.requestBuildPayload(player, build);
} }
} }
@@ -893,6 +894,7 @@ public abstract class InputHandler implements InputProcessor, GestureListener{
Block block = content.block(req.block); Block block = content.block(req.block);
if(block.bounds(req.x, req.y, Tmp.r2).overlaps(Tmp.r1)){ if(block.bounds(req.x, req.y, Tmp.r2).overlaps(Tmp.r1)){
removed.add(Point2.pack(req.x, req.y)); removed.add(Point2.pack(req.x, req.y));
req.removed = true;
broken.remove(); broken.remove();
} }
} }
@@ -1025,7 +1027,7 @@ public abstract class InputHandler implements InputProcessor, GestureListener{
return !Core.scene.hasMouse() return !Core.scene.hasMouse()
&& tile.drop() != null && tile.drop() != null
&& player.unit().validMine(tile) && player.unit().validMine(tile)
&& !(tile.floor().playerUnmineable && tile.overlay().itemDrop == null) && !((!Core.settings.getBool("doubletapmine") && tile.floor().playerUnmineable) && tile.overlay().itemDrop == null)
&& player.unit().acceptsItem(tile.drop()) && player.unit().acceptsItem(tile.drop())
&& tile.block() == Blocks.air; && tile.block() == Blocks.air;
} }

View File

@@ -88,7 +88,7 @@ public class MobileInput extends InputHandler implements GestureListener{
}else{ }else{
Building tile = world.buildWorld(x, y); Building tile = world.buildWorld(x, y);
if((tile != null && player.team().isEnemy(tile.team) && tile.team != Team.derelict) || (tile != null && player.unit().type.canHeal && tile.team == player.team() && tile.damaged())){ if((tile != null && player.team().isEnemy(tile.team) && (tile.team != Team.derelict || state.rules.coreCapture)) || (tile != null && player.unit().type.canHeal && tile.team == player.team() && tile.damaged())){
player.unit().mineTile = null; player.unit().mineTile = null;
target = tile; target = tile;
} }
@@ -681,7 +681,7 @@ public class MobileInput extends InputHandler implements GestureListener{
} }
} }
if(!player.dead() && !state.isPaused()){ if(!player.dead() && !state.isPaused() && !renderer.isCutscene()){
updateMovement(player.unit()); updateMovement(player.unit());
} }
@@ -822,7 +822,7 @@ public class MobileInput extends InputHandler implements GestureListener{
shiftDeltaX %= tilesize; shiftDeltaX %= tilesize;
shiftDeltaY %= tilesize; shiftDeltaY %= tilesize;
} }
}else if(!renderer.isLanding()){ }else{
//pan player //pan player
Core.camera.position.x -= deltaX; Core.camera.position.x -= deltaX;
Core.camera.position.y -= deltaY; Core.camera.position.y -= deltaY;
@@ -938,7 +938,7 @@ public class MobileInput extends InputHandler implements GestureListener{
}else if(target == null){ }else if(target == null){
player.shooting = false; player.shooting = false;
if(Core.settings.getBool("autotarget") && !(player.unit() instanceof BlockUnitUnit u && u.tile() instanceof ControlBlock c && !c.shouldAutoTarget())){ if(Core.settings.getBool("autotarget") && !(player.unit() instanceof BlockUnitUnit u && u.tile() instanceof ControlBlock c && !c.shouldAutoTarget())){
target = Units.closestTarget(unit.team, unit.x, unit.y, range, u -> u.team != Team.derelict, u -> u.team != Team.derelict); target = Units.closestTarget(unit.team, unit.x, unit.y, range, u -> u.checkTarget(type.targetAir, type.targetGround), u -> type.targetGround);
if(allowHealing && target == null){ if(allowHealing && target == null){
target = Geometry.findClosest(unit.x, unit.y, indexer.getDamaged(Team.sharded)); target = Geometry.findClosest(unit.x, unit.y, indexer.getDamaged(Team.sharded));

View File

@@ -1,11 +1,13 @@
package mindustry.io; package mindustry.io;
import arc.util.*;
import arc.util.serialization.*; import arc.util.serialization.*;
import arc.util.serialization.Json.*; import arc.util.serialization.Json.*;
import mindustry.*; import mindustry.*;
import mindustry.content.*; import mindustry.content.*;
import mindustry.ctype.*; import mindustry.ctype.*;
import mindustry.game.*; import mindustry.game.*;
import mindustry.maps.*;
import mindustry.type.*; import mindustry.type.*;
import mindustry.world.*; import mindustry.world.*;
import mindustry.world.meta.*; import mindustry.world.meta.*;
@@ -215,6 +217,12 @@ public class JsonIO{
return item != null ? item : liquid; return item != null ? item : liquid;
} }
}); });
//use short names for all filter types
for(var filter : Maps.allFilterTypes){
var i = filter.get();
json.addClassTag(Strings.camelize(i.getClass().getSimpleName().replace("Filter", "")), i.getClass());
}
} }
static class CustomJson extends Json{ static class CustomJson extends Json{

View File

@@ -69,7 +69,6 @@ public class SaveIO{
getMeta(stream); getMeta(stream);
return true; return true;
}catch(Throwable e){ }catch(Throwable e){
Log.err(e);
return false; return false;
} }
} }

View File

@@ -363,7 +363,7 @@ public abstract class SaveVersion extends SaveFileReader{
int amount = stream.readInt(); int amount = stream.readInt();
for(int j = 0; j < amount; j++){ for(int j = 0; j < amount; j++){
readChunk(stream, true, in -> { readChunk(stream, true, in -> {
byte typeid = in.readByte(); int typeid = in.readUnsignedByte();
if(mapping[typeid] == null){ if(mapping[typeid] == null){
in.skipBytes(lastRegionLength - 1); in.skipBytes(lastRegionLength - 1);
return; return;

View File

@@ -1,5 +1,6 @@
package mindustry.io; package mindustry.io;
import arc.audio.*;
import arc.graphics.*; import arc.graphics.*;
import arc.math.geom.*; import arc.math.geom.*;
import arc.struct.*; import arc.struct.*;
@@ -501,6 +502,15 @@ public class TypeIO{
return id == -1 ? null : content.item(id); return id == -1 ? null : content.item(id);
} }
//note that only the standard sound constants in Sounds are supported; modded sounds are not.
public static void writeSound(Writes write, Sound sound){
write.s(Sounds.getSoundId(sound));
}
public static Sound readSound(Reads read){
return Sounds.getSound(read.s());
}
public static void writeWeather(Writes write, Weather item){ public static void writeWeather(Writes write, Weather item){
write.s(item == null ? -1 : item.id); write.s(item == null ? -1 : item.id);
} }
@@ -633,7 +643,7 @@ public class TypeIO{
} }
} }
/** Representes a building that has not been resolved yet. */ /** Represents a building that has not been resolved yet. */
public static class BuildingBox{ public static class BuildingBox{
public int pos; public int pos;

View File

@@ -16,6 +16,7 @@ import arc.util.*;
import mindustry.*; import mindustry.*;
import mindustry.gen.*; import mindustry.gen.*;
import mindustry.graphics.*; import mindustry.graphics.*;
import mindustry.logic.LStatements.*;
import mindustry.ui.*; import mindustry.ui.*;
public class LCanvas extends Table{ public class LCanvas extends Table{
@@ -395,11 +396,20 @@ public class LCanvas extends Table{
} }
public void copy(){ public void copy(){
st.saveUI();
LStatement copy = st.copy(); LStatement copy = st.copy();
if(copy instanceof JumpStatement st && st.destIndex != -1){
int index = statements.getChildren().indexOf(this);
if(index != -1 && index < st.destIndex){
st.destIndex ++;
}
}
if(copy != null){ if(copy != null){
StatementElem s = new StatementElem(copy); StatementElem s = new StatementElem(copy);
statements.addChildAfter(StatementElem.this,s); statements.addChildAfter(StatementElem.this, s);
statements.layout(); statements.layout();
copy.elem = s; copy.elem = s;
copy.setupUI(); copy.setupUI();

View File

@@ -363,6 +363,9 @@ public class LExecutor{
float x1 = World.unconv(exec.numf(p1)), y1 = World.unconv(exec.numf(p2)), d1 = World.unconv(exec.numf(p3)); float x1 = World.unconv(exec.numf(p1)), y1 = World.unconv(exec.numf(p2)), d1 = World.unconv(exec.numf(p3));
switch(type){ switch(type){
case idle -> {
ai.control = type;
}
case move, stop, approach -> { case move, stop, approach -> {
ai.control = type; ai.control = type;
ai.moveX = x1; ai.moveX = x1;

View File

@@ -24,23 +24,30 @@ import mindustry.world.*;
import mindustry.world.blocks.storage.*; import mindustry.world.blocks.storage.*;
import java.io.*; import java.io.*;
import java.util.concurrent.*;
import static mindustry.Vars.*; import static mindustry.Vars.*;
public class Maps{ public class Maps{
/** All generation filter types. */
public static Prov<GenerateFilter>[] allFilterTypes = new Prov[]{
NoiseFilter::new, ScatterFilter::new, TerrainFilter::new, DistortFilter::new,
RiverNoiseFilter::new, OreFilter::new, OreMedianFilter::new, MedianFilter::new,
BlendFilter::new, MirrorFilter::new, ClearFilter::new, CoreSpawnFilter::new,
EnemySpawnFilter::new, SpawnPathFilter::new
};
/** List of all built-in maps. Filenames only. */ /** List of all built-in maps. Filenames only. */
private static String[] defaultMapNames = {"maze", "fortress", "labyrinth", "islands", "tendrils", "caldera", "wasteland", "shattered", "fork", "triad", "mudFlats", "moltenLake", "archipelago", "debrisField", "veins", "glacier", "passage"}; private static String[] defaultMapNames = {"maze", "fortress", "labyrinth", "islands", "tendrils", "caldera", "wasteland", "shattered", "fork", "triad", "mudFlats", "moltenLake", "archipelago", "debrisField", "veins", "glacier", "passage"};
/** Maps tagged as PvP */ /** Maps tagged as PvP */
static final String[] pvpMaps = {"veins", "glacier", "passage"}; private static String[] pvpMaps = {"veins", "glacier", "passage"};
/** All maps stored in an ordered array. */ /** All maps stored in an ordered array. */
private Seq<Map> maps = new Seq<>(); private Seq<Map> maps = new Seq<>();
/** Serializer for meta. */
private Json json = new Json();
private ShuffleMode shuffleMode = ShuffleMode.all; private ShuffleMode shuffleMode = ShuffleMode.all;
private @Nullable MapProvider shuffler; private @Nullable MapProvider shuffler;
private AsyncExecutor executor = new AsyncExecutor(2); private ExecutorService executor = Threads.executor(3);
private ObjectSet<Map> previewList = new ObjectSet<>(); private ObjectSet<Map> previewList = new ObjectSet<>();
public ShuffleMode getShuffleMode(){ public ShuffleMode getShuffleMode(){
@@ -352,20 +359,20 @@ public class Maps{
if(groups == null) return "[]"; if(groups == null) return "[]";
StringWriter buffer = new StringWriter(); StringWriter buffer = new StringWriter();
json.setWriter(new JsonWriter(buffer)); JsonIO.json.setWriter(new JsonWriter(buffer));
json.writeArrayStart(); JsonIO.json.writeArrayStart();
for(int i = 0; i < groups.size; i++){ for(int i = 0; i < groups.size; i++){
json.writeObjectStart(SpawnGroup.class, SpawnGroup.class); JsonIO.json.writeObjectStart(SpawnGroup.class, SpawnGroup.class);
groups.get(i).write(json); groups.get(i).write(JsonIO.json);
json.writeObjectEnd(); JsonIO.json.writeObjectEnd();
} }
json.writeArrayEnd(); JsonIO.json.writeArrayEnd();
return buffer.toString(); return buffer.toString();
} }
public Seq<SpawnGroup> readWaves(String str){ public Seq<SpawnGroup> readWaves(String str){
return str == null ? null : str.equals("[]") ? new Seq<>() : Seq.with(json.fromJson(SpawnGroup[].class, str)); return str == null ? null : str.equals("[]") ? new Seq<>() : Seq.with(JsonIO.json.fromJson(SpawnGroup[].class, str));
} }
public void loadPreviews(){ public void loadPreviews(){

View File

@@ -3,6 +3,7 @@ package mindustry.maps.filters;
import arc.*; import arc.*;
import arc.func.*; import arc.func.*;
import arc.scene.*;
import arc.scene.event.*; import arc.scene.event.*;
import arc.scene.style.*; import arc.scene.style.*;
import arc.scene.ui.*; import arc.scene.ui.*;
@@ -60,16 +61,19 @@ public abstract class FilterOption{
@Override @Override
public void build(Table table){ public void build(Table table){
Label label; Element base;
if(!display){ if(!display){
label = new Label("@filter.option." + name); Label l = new Label("@filter.option." + name);
l.setWrap(true);
l.setStyle(Styles.outlineLabel);
base = l;
}else{ }else{
label = new Label(() -> Core.bundle.get("filter.option." + name) + ": " + Strings.autoFixed(getter.get(), 2)); Table t = new Table().marginLeft(11f).marginRight(11f);
base = t;
t.add("@filter.option." + name).growX().wrap().style(Styles.outlineLabel);
t.label(() -> Strings.autoFixed(getter.get(), 2)).style(Styles.outlineLabel).right().labelAlign(Align.right).padLeft(6);
} }
label.setWrap(true); base.touchable = Touchable.disabled;
label.setAlignment(Align.center);
label.touchable = Touchable.disabled;
label.setStyle(Styles.outlineLabel);
Slider slider = new Slider(min, max, step, false); Slider slider = new Slider(min, max, step, false);
slider.moved(setter); slider.moved(setter);
@@ -80,7 +84,7 @@ public abstract class FilterOption{
slider.released(changed); slider.released(changed);
} }
table.stack(slider, label).colspan(2).pad(3).growX().row(); table.stack(slider, base).colspan(2).pad(3).growX().row();
} }
} }

View File

@@ -75,8 +75,7 @@ public abstract class GenerateFilter{
/** localized display name */ /** localized display name */
public String name(){ public String name(){
var s = simpleName(); return Core.bundle.get("filter." + simpleName());
return Core.bundle.get("filter." + s);
} }
public char icon(){ public char icon(){
@@ -100,14 +99,12 @@ public abstract class GenerateFilter{
//utility generation functions //utility generation functions
//TODO would be nice if these functions used the seed and ditched "in" completely; simplex should be stateless
protected float noise(GenerateInput in, float scl, float mag){ protected float noise(GenerateInput in, float scl, float mag){
return (float)Simplex.noise2d(seed, 1f, 0f, 1f / scl, in.x, in.y) * mag; return Simplex.noise2d(seed, 1f, 0f, 1f / scl, in.x, in.y) * mag;
} }
protected float noise(GenerateInput in, float scl, float mag, float octaves, float persistence){ protected float noise(GenerateInput in, float scl, float mag, float octaves, float persistence){
return (float)Simplex.noise2d(seed, octaves, persistence, 1f / scl, in.x, in.y) * mag; return Simplex.noise2d(seed, octaves, persistence, 1f / scl, in.x, in.y) * mag;
} }
protected float rnoise(float x, float y, float scl, float mag){ protected float rnoise(float x, float y, float scl, float mag){
@@ -141,7 +138,7 @@ public abstract class GenerateFilter{
this.y = y; this.y = y;
} }
public void begin(GenerateFilter filter, int width, int height, TileProvider buffer){ public void begin(int width, int height, TileProvider buffer){
this.buffer = buffer; this.buffer = buffer;
this.width = width; this.width = width;
this.height = height; this.height = height;

View File

@@ -115,7 +115,7 @@ public abstract class PlanetGenerator extends BasicGenerator implements HexMeshe
@Override @Override
protected float noise(float x, float y, double octaves, double falloff, double scl, double mag){ protected float noise(float x, float y, double octaves, double falloff, double scl, double mag){
Vec3 v = sector.rect.project(x, y); Vec3 v = sector.rect.project(x, y);
return (float)Simplex.noise3d(0, octaves, falloff, 1f / scl, v.x, v.y, v.z) * (float)mag; return Simplex.noise3d(0, octaves, falloff, 1f / scl, v.x, v.y, v.z) * (float)mag;
} }
/** @return the scaling factor for sector rects. */ /** @return the scaling factor for sector rects. */

View File

@@ -57,7 +57,7 @@ public class SerpuloPlanetGenerator extends PlanetGenerator{
float rawHeight(Vec3 position){ float rawHeight(Vec3 position){
position = Tmp.v33.set(position).scl(scl); position = Tmp.v33.set(position).scl(scl);
return (Mathf.pow((float)Simplex.noise3d(seed, 7, 0.5f, 1f/3f, position.x, position.y, position.z), 2.3f) + waterOffset) / (1f + waterOffset); return (Mathf.pow(Simplex.noise3d(seed, 7, 0.5f, 1f/3f, position.x, position.y, position.z), 2.3f) + waterOffset) / (1f + waterOffset);
} }
@Override @Override
@@ -127,12 +127,12 @@ public class SerpuloPlanetGenerator extends PlanetGenerator{
position = Tmp.v33.set(position).scl(scl); position = Tmp.v33.set(position).scl(scl);
float rad = scl; float rad = scl;
float temp = Mathf.clamp(Math.abs(position.y * 2f) / (rad)); float temp = Mathf.clamp(Math.abs(position.y * 2f) / (rad));
float tnoise = (float)Simplex.noise3d(seed, 7, 0.56, 1f/3f, position.x, position.y + 999f, position.z); float tnoise = Simplex.noise3d(seed, 7, 0.56, 1f/3f, position.x, position.y + 999f, position.z);
temp = Mathf.lerp(temp, tnoise, 0.5f); temp = Mathf.lerp(temp, tnoise, 0.5f);
height *= 1.2f; height *= 1.2f;
height = Mathf.clamp(height); height = Mathf.clamp(height);
float tar = (float)Simplex.noise3d(seed, 4, 0.55f, 1f/2f, position.x, position.y + 999f, position.z) * 0.3f + Tmp.v31.dst(0, 0, 1f) * 0.2f; float tar = Simplex.noise3d(seed, 4, 0.55f, 1f/2f, position.x, position.y + 999f, position.z) * 0.3f + Tmp.v31.dst(0, 0, 1f) * 0.2f;
Block res = arr[Mathf.clamp((int)(temp * arr.length), 0, arr[0].length - 1)][Mathf.clamp((int)(height * arr[0].length), 0, arr[0].length - 1)]; Block res = arr[Mathf.clamp((int)(temp * arr.length), 0, arr[0].length - 1)][Mathf.clamp((int)(height * arr[0].length), 0, arr[0].length - 1)];
if(tar > 0.5f){ if(tar > 0.5f){
@@ -145,7 +145,7 @@ public class SerpuloPlanetGenerator extends PlanetGenerator{
@Override @Override
protected float noise(float x, float y, double octaves, double falloff, double scl, double mag){ protected float noise(float x, float y, double octaves, double falloff, double scl, double mag){
Vec3 v = sector.rect.project(x, y).scl(5f); Vec3 v = sector.rect.project(x, y).scl(5f);
return (float)Simplex.noise3d(seed, octaves, falloff, 1f / scl, v.x, v.y, v.z) * (float)mag; return Simplex.noise3d(seed, octaves, falloff, 1f / scl, v.x, v.y, v.z) * (float)mag;
} }
@Override @Override
@@ -162,12 +162,27 @@ public class SerpuloPlanetGenerator extends PlanetGenerator{
connected.add(this); connected.add(this);
} }
void con(int x1, int y1, int x2, int y2){
float nscl = rand.random(100f, 140f) * 6f;
int stroke = rand.random(3, 9);
brush(pathfind(x1, y1, x2, y2, tile -> (tile.solid() ? 50f : 0f) + noise(tile.x, tile.y, 2, 0.4f, 1f / nscl) * 500, Astar.manhattan), stroke);
}
void connect(Room to){ void connect(Room to){
if(!connected.add(to)) return; if(!connected.add(to)) return;
float nscl = rand.random(100f, 140f); Vec2 midpoint = Tmp.v1.set(to.x, to.y).add(x, y).scl(0.5f);
int stroke = rand.random(3, 9); rand.nextFloat();
brush(pathfind(x, y, to.x, to.y, tile -> (tile.solid() ? 5f : 0f) + noise(tile.x, tile.y, 2, 0.4, 1f / nscl) * 500, Astar.manhattan), stroke);
//add randomized offset to avoid straight lines
midpoint.add(Tmp.v2.setToRandomDirection(rand).scl(Tmp.v1.dst(x, y)));
midpoint.sub(width/2f, height/2f).limit(width / 2f / Mathf.sqrt3).add(width/2f, height/2f);
int mx = (int)midpoint.x, my = (int)midpoint.y;
con(x, y, mx, my);
con(mx, my, to.x, to.y);
} }
} }
@@ -244,8 +259,6 @@ public class SerpuloPlanetGenerator extends PlanetGenerator{
cells(1); cells(1);
distort(10f, 6f); distort(10f, 6f);
inverseFloodFill(tiles.getn(spawn.x, spawn.y));
Seq<Block> ores = Seq.with(Blocks.oreCopper, Blocks.oreLead); Seq<Block> ores = Seq.with(Blocks.oreCopper, Blocks.oreLead);
float poles = Math.abs(sector.tile.v.y); float poles = Math.abs(sector.tile.v.y);
float nmag = 0.5f; float nmag = 0.5f;
@@ -296,6 +309,8 @@ public class SerpuloPlanetGenerator extends PlanetGenerator{
median(2); median(2);
inverseFloodFill(tiles.getn(spawn.x, spawn.y));
tech(); tech();
pass((x, y) -> { pass((x, y) -> {

View File

@@ -52,9 +52,6 @@ public class ClassMap{
classes.put("Research", mindustry.game.Objectives.Research.class); classes.put("Research", mindustry.game.Objectives.Research.class);
classes.put("SectorComplete", mindustry.game.Objectives.SectorComplete.class); classes.put("SectorComplete", mindustry.game.Objectives.SectorComplete.class);
classes.put("AmmoType", mindustry.type.AmmoType.class); classes.put("AmmoType", mindustry.type.AmmoType.class);
classes.put("AmmoTypes", mindustry.type.AmmoTypes.class);
classes.put("ItemAmmoType", mindustry.type.AmmoTypes.ItemAmmoType.class);
classes.put("PowerAmmoType", mindustry.type.AmmoTypes.PowerAmmoType.class);
classes.put("Category", mindustry.type.Category.class); classes.put("Category", mindustry.type.Category.class);
classes.put("ErrorContent", mindustry.type.ErrorContent.class); classes.put("ErrorContent", mindustry.type.ErrorContent.class);
classes.put("Item", mindustry.type.Item.class); classes.put("Item", mindustry.type.Item.class);
@@ -74,6 +71,8 @@ public class ClassMap{
classes.put("Weapon", mindustry.type.Weapon.class); classes.put("Weapon", mindustry.type.Weapon.class);
classes.put("Weather", mindustry.type.Weather.class); classes.put("Weather", mindustry.type.Weather.class);
classes.put("WeatherEntry", mindustry.type.Weather.WeatherEntry.class); classes.put("WeatherEntry", mindustry.type.Weather.WeatherEntry.class);
classes.put("ItemAmmoType", mindustry.type.ammo.ItemAmmoType.class);
classes.put("PowerAmmoType", mindustry.type.ammo.PowerAmmoType.class);
classes.put("PointDefenseWeapon", mindustry.type.weapons.PointDefenseWeapon.class); classes.put("PointDefenseWeapon", mindustry.type.weapons.PointDefenseWeapon.class);
classes.put("RepairBeamWeapon", mindustry.type.weapons.RepairBeamWeapon.class); classes.put("RepairBeamWeapon", mindustry.type.weapons.RepairBeamWeapon.class);
classes.put("HealBeamMount", mindustry.type.weapons.RepairBeamWeapon.HealBeamMount.class); classes.put("HealBeamMount", mindustry.type.weapons.RepairBeamWeapon.HealBeamMount.class);
@@ -325,8 +324,6 @@ public class ClassMap{
classes.put("ReconstructorBuild", mindustry.world.blocks.units.Reconstructor.ReconstructorBuild.class); classes.put("ReconstructorBuild", mindustry.world.blocks.units.Reconstructor.ReconstructorBuild.class);
classes.put("RepairPoint", mindustry.world.blocks.units.RepairPoint.class); classes.put("RepairPoint", mindustry.world.blocks.units.RepairPoint.class);
classes.put("RepairPointBuild", mindustry.world.blocks.units.RepairPoint.RepairPointBuild.class); classes.put("RepairPointBuild", mindustry.world.blocks.units.RepairPoint.RepairPointBuild.class);
classes.put("ResupplyPoint", mindustry.world.blocks.units.ResupplyPoint.class);
classes.put("ResupplyPointBuild", mindustry.world.blocks.units.ResupplyPoint.ResupplyPointBuild.class);
classes.put("UnitBlock", mindustry.world.blocks.units.UnitBlock.class); classes.put("UnitBlock", mindustry.world.blocks.units.UnitBlock.class);
classes.put("UnitBuild", mindustry.world.blocks.units.UnitBlock.UnitBuild.class); classes.put("UnitBuild", mindustry.world.blocks.units.UnitBlock.UnitBuild.class);
classes.put("UnitFactory", mindustry.world.blocks.units.UnitFactory.class); classes.put("UnitFactory", mindustry.world.blocks.units.UnitFactory.class);

View File

@@ -29,6 +29,7 @@ import mindustry.gen.*;
import mindustry.graphics.*; import mindustry.graphics.*;
import mindustry.mod.Mods.*; import mindustry.mod.Mods.*;
import mindustry.type.*; import mindustry.type.*;
import mindustry.type.ammo.*;
import mindustry.type.weather.*; import mindustry.type.weather.*;
import mindustry.world.*; import mindustry.world.*;
import mindustry.world.blocks.units.*; import mindustry.world.blocks.units.*;
@@ -95,6 +96,19 @@ public class ContentParser{
readFields(result, data); readFields(result, data);
return result; return result;
}); });
put(AmmoType.class, (type, data) -> {
//string -> item
//if liquid ammo support is added, this should scan for liquids as well
if(data.isString()) return find(ContentType.item, data.asString());
//number -> power
if(data.isNumber()) return new PowerAmmoType(data.asFloat());
var bc = resolve(data.getString("type", ""), ItemAmmoType.class);
data.remove("type");
AmmoType result = make(bc);
readFields(result, data);
return result;
});
put(DrawBlock.class, (type, data) -> { put(DrawBlock.class, (type, data) -> {
if(data.isString()){ if(data.isString()){
//try to instantiate //try to instantiate
@@ -746,7 +760,7 @@ public class ContentParser{
/** Tries to resolve a class from the class type map. */ /** Tries to resolve a class from the class type map. */
<T> Class<T> resolve(String base, Class<T> def){ <T> Class<T> resolve(String base, Class<T> def){
//no base class specified //no base class specified
if(base.isEmpty() && def != null) return def; if((base == null || base.isEmpty()) && def != null) return def;
//return mapped class if found in the global map //return mapped class if found in the global map
var out = ClassMap.classes.get(!base.isEmpty() && Character.isLowerCase(base.charAt(0)) ? Strings.capitalize(base) : base); var out = ClassMap.classes.get(!base.isEmpty() && Character.isLowerCase(base.charAt(0)) ? Strings.capitalize(base) : base);

View File

@@ -626,7 +626,7 @@ public class Mods implements Loadable{
try{ try{
//this binds the content but does not load it entirely //this binds the content but does not load it entirely
Content loaded = parser.parse(l.mod, l.file.nameWithoutExtension(), l.file.readString("UTF-8"), l.file, l.type); Content loaded = parser.parse(l.mod, l.file.nameWithoutExtension(), l.file.readString("UTF-8"), l.file, l.type);
Log.debug("[@] Loaded '@'.", l.mod.meta.name, (loaded instanceof UnlockableContent ? ((UnlockableContent)loaded).localizedName : loaded)); Log.debug("[@] Loaded '@'.", l.mod.meta.name, (loaded instanceof UnlockableContent u ? u.localizedName : loaded));
}catch(Throwable e){ }catch(Throwable e){
if(current != content.getLastAdded() && content.getLastAdded() != null){ if(current != content.getLastAdded() && content.getLastAdded() != null){
parser.markError(content.getLastAdded(), l.mod, l.file, e); parser.markError(content.getLastAdded(), l.mod, l.file, e);

View File

@@ -30,9 +30,8 @@ public class CrashSender{
} }
return report return report
+ "Version: " + Version.combined() + (Vars.headless ? " (Server)" : "") + "\n" + "Version: " + Version.combined() + (Vars.headless ? " (Server)" : "") + "\n"
+ "OS: " + System.getProperty("os.name") + " x" + (OS.is64Bit ? "64" : "32") + "\n" + "OS: " + OS.osName + " x" + (OS.osArchBits) + " (" + OS.osArch + ")\n"
+ "Java Version: " + System.getProperty("java.version") + "\n" + "Java Version: " + OS.javaVersion + "\n"
+ "Java Architecture: " + System.getProperty("sun.arch.data.model") + "\n"
+ (mods == null ? "<no mod init>" : mods.list().size + " Mods" + (mods.list().isEmpty() ? "" : ": " + mods.list().toString(", ", mod -> mod.name + ":" + mod.meta.version))) + (mods == null ? "<no mod init>" : mods.list().size + " Mods" + (mods.list().isEmpty() ? "" : ": " + mods.list().toString(", ", mod -> mod.name + ":" + mod.meta.version)))
+ "\n\n" + error; + "\n\n" + error;
} }
@@ -60,7 +59,7 @@ public class CrashSender{
}catch(Throwable ignored){} }catch(Throwable ignored){}
//don't create crash logs for custom builds, as it's expected //don't create crash logs for custom builds, as it's expected
if(Version.build == -1 || (System.getProperty("user.name").equals("anuke") && "release".equals(Version.modifier))){ if(Version.build == -1 || (OS.username.equals("anuke") && !"steam".equals(Version.modifier))){
ret(); ret();
} }
@@ -141,10 +140,10 @@ public class CrashSender{
ex(() -> value.addChild("server", new JsonValue(fs))); ex(() -> value.addChild("server", new JsonValue(fs)));
ex(() -> value.addChild("players", new JsonValue(Groups.player.size()))); ex(() -> value.addChild("players", new JsonValue(Groups.player.size())));
ex(() -> value.addChild("state", new JsonValue(Vars.state.getState().name()))); ex(() -> value.addChild("state", new JsonValue(Vars.state.getState().name())));
ex(() -> value.addChild("os", new JsonValue(System.getProperty("os.name") + "x" + (OS.is64Bit ? "64" : "32")))); ex(() -> value.addChild("os", new JsonValue(OS.osName + " x" + OS.osArchBits + " " + OS.osVersion)));
ex(() -> value.addChild("trace", new JsonValue(parseException(exception)))); ex(() -> value.addChild("trace", new JsonValue(parseException(exception))));
ex(() -> value.addChild("javaVersion", new JsonValue(System.getProperty("java.version")))); ex(() -> value.addChild("javaVersion", new JsonValue(OS.javaVersion)));
ex(() -> value.addChild("javaArch", new JsonValue(System.getProperty("sun.arch.data.model")))); ex(() -> value.addChild("javaArch", new JsonValue(OS.osArchBits)));
Log.info("Sending crash report."); Log.info("Sending crash report.");

View File

@@ -96,7 +96,7 @@ public class Net{
String type = t.getClass().toString().toLowerCase(); String type = t.getClass().toString().toLowerCase();
boolean isError = false; boolean isError = false;
if(e instanceof BufferUnderflowException || e instanceof BufferOverflowException){ if(e instanceof BufferUnderflowException || e instanceof BufferOverflowException || e.getCause() instanceof EOFException){
error = Core.bundle.get("error.io"); error = Core.bundle.get("error.io");
}else if(error.equals("mismatch") || e instanceof LZ4Exception || (e instanceof IndexOutOfBoundsException && e.getStackTrace()[0].getClassName().contains("java.nio"))){ }else if(error.equals("mismatch") || e instanceof LZ4Exception || (e instanceof IndexOutOfBoundsException && e.getStackTrace()[0].getClassName().contains("java.nio"))){
error = Core.bundle.get("error.mismatch"); error = Core.bundle.get("error.mismatch");

View File

@@ -1,28 +1,12 @@
package mindustry.type; package mindustry.type;
import arc.graphics.*; import arc.graphics.*;
import mindustry.ctype.*;
import mindustry.gen.*; import mindustry.gen.*;
import mindustry.graphics.*;
/** Type of ammo that a unit uses. */ /** Type of ammo that a unit uses. */
public class AmmoType extends Content{ public interface AmmoType{
public String icon = Iconc.itemCopper + ""; String icon();
public Color color = Pal.ammo; Color color();
public Color barColor = Pal.ammo; Color barColor();
void resupply(Unit unit);
public AmmoType(char icon, Color color){
this.icon = icon + "";
this.color = color;
}
public AmmoType(){
}
public void resupply(Unit unit){}
@Override
public ContentType getContentType(){
return ContentType.ammo;
}
} }

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