Compare commits

...

128 Commits
v124 ... v125.1

Author SHA1 Message Date
Antsiferov Andrew
e6513702d6 [Bundle][RU] actual L10n (#4726)
* 3 new, 1 deleted

New:
rules.unitcapvariable
rules.unitcap
laccess.color

Deleted:
lenum.color

* 1 line changed

rules.unitcap

Co-authored-by: Vanguard <55051135+XEN0PHIL@users.noreply.github.com>
2021-02-19 18:33:43 -05:00
Arnyyx
aeddf7014c Update bundle_vi.properties (#4724) 2021-02-19 18:32:52 -05:00
Catchears
1613f49c16 german translation for build 125, full android translation (#4703)
* update german translation to 631e4d9eef

* update android translation to e816f6110d

with regard to 5ec5f1aa93

* improve translation with ideas from others

* update german steam discription to e86a3e9d09

* update german translation to 1ef7ae7079 (diff-5e346bcec4e8e1d545e035b1e438472bc51937398ac3e8e81308605ec82aea2c)

* changes from stuffyAI

* cross-platform as suggested by stuffyAI

* stuffyAI

genau, hast recht

Co-authored-by: stuffyAI <59014072+stuffyAI@users.noreply.github.com>

Co-authored-by: stuffyAI <59014072+stuffyAI@users.noreply.github.com>
2021-02-19 18:32:44 -05:00
彭瑞暄
57a833c2fb Update Logic Draw Hints (#4734)
Wrapped up some previous logic hints, too.
2021-02-19 18:32:32 -05:00
BlueThecno
6de53343a4 Fixing typos and descriptions [bundle_es.properties] (#4727)
* Fixing and descriptions [bundle_es.properties]

* Forgot something
2021-02-19 18:32:17 -05:00
YellOw139
7bb4b09308 [Bundle][RO] Update (#4725)
* [Bundle][RO] Update

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

Changelog:

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

* Reducing confusion

* Update bundle_ro.properties
2021-02-19 18:32:07 -05:00
Anuken
68020fa7d4 Fixed "fix" in #4397 2021-02-19 18:31:34 -05:00
Phinner
b94aba0301 Fixing remaining typos\errors in bundle_fr (#4397)
* Fixing remaining typos errors in bundle_fr

There are some errors that had managed to get through the verification. Imma chase them down!

* added logic hints and some typo fixes

* Fixing 2 typos in bundle.properties

L1548: Color statement affects every following draw operations.

* smolfixes
2021-02-19 18:30:49 -05:00
Anuken
0316009a9c Balance tweaks 2021-02-19 18:28:51 -05:00
Anuken
820f7f0ef2 arc 2021-02-19 17:25:37 -05:00
Anuken
6d105ad3e7 Merge remote-tracking branch 'origin/master' 2021-02-19 17:18:23 -05:00
Anuken
f043a5f340 Logic tooltips on mobile devices w/ long-press 2021-02-19 17:18:17 -05:00
CxZxRainzz
73d6f95d2e Update servers_v6.json (#4735)
add 1 more server for CxZx
2021-02-19 17:11:51 -05:00
Fatonndev
fb48070388 Add Survival and PvP servers (#4736) 2021-02-19 17:04:48 -05:00
Anuken
fa7697fc40 Better JSON null validation / Disable mods on startup crash 2021-02-19 13:28:31 -05:00
Anuken
b46a5c0bda Allow JSON mod content types from other class loaders 2021-02-19 09:45:51 -05:00
Anuken
1072c310ad Fixed #4732 2021-02-19 09:04:13 -05:00
Anuken
d5448b59a2 Fixed UnitReq parsing 2021-02-18 21:07:48 -05:00
Anuken
78317e6126 Uncap content names in resolution 2021-02-18 20:15:46 -05:00
Anuken
5a58f9c71a Fixed #4729 2021-02-18 17:00:23 -05:00
Anuken
06b8dd61c7 Better splash damage handling for small radii 2021-02-18 15:02:09 -05:00
Anuken
a81b5778a0 Merge remote-tracking branch 'origin/master' 2021-02-18 13:11:37 -05:00
Anuken
a7188c4884 Content parser class discovery improvements 2021-02-18 13:11:20 -05:00
buthed010203
0bf0d48a02 Make status colors the same (#4719)
It bothers me ok
2021-02-18 10:24:52 -05:00
buthed010203
dc5cd196ed Use github build status (#4718)
Why does this still use travis? It was ditched months ago
2021-02-17 19:44:04 -05:00
Anuken
f8f9bf228b Merge remote-tracking branch 'origin/master' 2021-02-17 17:12:36 -05:00
Anuken
d0dc1ea132 Fixed #4715 2021-02-17 17:12:32 -05:00
RebornTrack970
ff9fad6a2c One last server for the Omega (#4714)
* One last server for the Omega

Added the Annexation server from the OmegaHub to the list as it is the final server people actualy play on.

* Update servers_v6.json

Co-authored-by: Patrick 'Quezler' Mounier <Quezler@me.com>

Co-authored-by: Anuken <arnukren@gmail.com>
Co-authored-by: Patrick 'Quezler' Mounier <Quezler@me.com>
2021-02-17 11:05:16 -05:00
Anuken
76dbdb59ce Draw cells for unit payloads 2021-02-17 11:02:49 -05:00
Anuken
0013402962 Merge remote-tracking branch 'origin/master' 2021-02-17 09:49:08 -05:00
Anuken
1ef7ae7079 Logic hints for draw operations 2021-02-17 09:49:01 -05:00
buthed010203
07a39d0da8 V6 servers arent BE last i checked (#4713)
This has been bothering me the last few days and i assumed someone else would fix it and i wouldnt have to make a pr for something so tiny but here i am
2021-02-17 09:36:31 -05:00
Anuken
b8bfb30c56 Merge remote-tracking branch 'origin/master' 2021-02-17 09:15:21 -05:00
Anuken
00342ddaae Misc cleanup 2021-02-17 09:15:17 -05:00
Sharlotte
fb40c0b9de cursed typo (#4705)
cursed typocursed typocursed typocursed typocursed typocursed typocursed typocursed typo
2021-02-17 09:12:49 -05:00
Patrick 'Quezler' Mounier
5d9506eb12 Reshuffle nydus servers (#4708) 2021-02-17 09:12:20 -05:00
Anuken
080fe8c3c4 Decreased impact reactor explosion radius 2021-02-16 15:54:20 -05:00
Anuken
48745d7380 Steam crash fix 2021-02-16 13:40:34 -05:00
YellOw139
41b50d67af [Bundle][RO] Update (#4696)
This PR was tested in-game and is ready to merge at any time.

Changelog:

- New strings/changes up to commit 631e4d9eef
- Typo fixes & various other improvements
2021-02-16 13:12:29 -05:00
Vanguard
b65dffca9d 4 new, 1 changed (#4688)
New:
enablebuilding
stat.armor
setting.logichints.name
(newline between radar.output and unitradar.target)

Changed:
lenum.turret
2021-02-16 13:12:17 -05:00
Sharlotte
66bdfcf877 [KO] Update bundles again (#4695)
*translated updated new logic hint
*translated new rule
*typo
2021-02-16 13:12:06 -05:00
Anuken
b0082c92c5 Fixed green line bug - Removed stencil+depth buffers 2021-02-16 13:02:15 -05:00
Anuken
fdd1c01ac3 Merge remote-tracking branch 'origin/master' 2021-02-16 12:20:37 -05:00
Anuken
1ffdd9fd99 Fixed #4701 2021-02-16 12:20:30 -05:00
Patrick 'Quezler' Mounier
f64ad2db9f Remove another dead server (#4699) 2021-02-16 11:46:51 -05:00
Anuken
7bfe9bf914 Merge remote-tracking branch 'origin/master' 2021-02-16 10:57:32 -05:00
Anuken
214f3bb9b5 Improved data file zipping 2021-02-16 10:57:20 -05:00
키에르
3f51149883 Remove dead server (#4669) 2021-02-16 09:50:52 -05:00
Anuken
2c368953f9 Merge remote-tracking branch 'origin/master' 2021-02-16 09:13:49 -05:00
Anuken
9d5454e5ce Fixed #4694 2021-02-16 09:13:44 -05:00
TranquillyUnpleasant
631e4d9eef Unit cap (#4689)
* Add unit caps as a map setting.

* Use int and add maximum and minimum handling.

* Put a lower limit of 0 for unit cap
2021-02-15 20:15:56 -05:00
Anuken
957583071d Splash damage tweaks 2021-02-15 18:42:24 -05:00
Anuken
c942331117 New splash damage algorithm 2021-02-15 18:00:47 -05:00
Anuken
710a55dc2d Reverted pixmap blending rename 2021-02-15 11:08:56 -05:00
Anuken
4bbb4b9a19 Reorder NaN check 2021-02-15 11:00:49 -05:00
彭瑞暄
a2e5dae27f Updated zh-TW translations of Logic Hints (#4666)
* Logic Hint pt.1

Some Logic Hints and minor tweaks in previous translations

* Logic Hints pt.2

* Logic Hints pt. 3/3
2021-02-15 10:46:19 -05:00
YellOw139
d5645b8a7b [Bundle][RO] Update (#4631)
* [Bundle][RO][124.1] Update

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

Changelog:
- New strings/changes up to commit 64acd6c1e4
- Fixed ancient mod-related bundles not fitting the new install button
- Typo fixes & various other improvements

* Logic tooltips - initial English commit

* Block flags

* Romanian logic hints

* polishing

* Since when is this missing

* Polishing
2021-02-15 10:43:34 -05:00
Sharlotte
a9f9946a39 [KO] TYPO (#4665)
* [KO] i got typo!

* typo
2021-02-15 10:42:28 -05:00
Antsiferov Andrew
561deacce4 [Bundle][RU] Logic Popups L10n (#4677)
* Logic popups

* Block flag documentation

* Распознование -> Распознавание (@Prosta4okua)

* Сбрсывание -> Сбрасывание (@XEN0PHIL)

* нахдиться -> находиться (@XEN0PHIL)

* распознования -> распознавания (@XEN0PHIL)

* распознования -> распознавания (@XEN0PHIL)

* распозновать -> распознавать (@XEN0PHIL)

* распознования -> распознавания (@XEN0PHIL)

* Включен -> Включён (@XEN0PHIL)

* - -> - (@XEN0PHIL)

* lst.unitradar (@XEN0PHIL)

* единиц -> единицы (@XEN0PHIL)
2021-02-15 10:42:01 -05:00
Joshua Fan
e528e35e06 Add sector icon picker back button (#4682) 2021-02-15 10:41:56 -05:00
Anuken
af39d6a6ee Fixed #4685 2021-02-15 10:37:24 -05:00
Patrick 'Quezler' Mounier
7a21c02476 Makes the top sprite visible on liquid turret icons (#4683)
* Add top region to liquid turret icons

* Attempt to change outline icon generation

* Draw regions above the outlined icon over it

* Draw regions **above** the outlined icon over it

* Add clarrifying comment

* Implement backwards compatibility for mods

* an -> any
2021-02-15 09:32:46 -05:00
Patrick 'Quezler' Mounier
557e5710cd Fixes BuilderAI & RepairAI retreat nullpointers (#4681)
* Update BuilderAI.java

* Update RepairAI.java
2021-02-15 09:31:27 -05:00
Anuken
fa52255d04 Fixed #4680 2021-02-15 09:30:57 -05:00
Anuken
e16622afcc Automatic retreat AI for builders/repair units 2021-02-14 20:44:40 -05:00
Anuken
f2468f0b3d Cleanup of #4678 2021-02-14 19:14:02 -05:00
Anuken
30c9231df6 Merge branch 'master' of https://github.com/Anuken/Mindustry 2021-02-14 19:02:55 -05:00
Joshua Fan
7532aadaf8 Add enable building hint, combine building and respawn hints (#4678) 2021-02-14 19:02:28 -05:00
Anuken
3d226246b9 Labyrinth core fix 2021-02-14 09:15:12 -05:00
Skin
d6c852a082 remove-pandorum (#4676)
Good luck!
2021-02-14 08:54:25 -05:00
Anuken
07a27e913c Added UnitBuild transition class 2021-02-14 08:47:53 -05:00
Anuken
092d152bdc Force-link effect classes on iOS 2021-02-13 18:24:22 -05:00
Anuken
8b756d221b Un-broke scripts 2021-02-13 16:28:49 -05:00
Anuken
f33d684dce Merge remote-tracking branch 'origin/master' 2021-02-13 11:56:44 -05:00
Anuken
56e41309b1 Updated global script 2021-02-13 11:56:40 -05:00
RebornTrack970
91b24433b9 Added the 2R2T and Rush server to Omega. (#4667) 2021-02-13 10:37:44 -05:00
Anuken
9050937900 Name cleanup 2021-02-12 19:40:29 -05:00
Anuken
2e6b90d4d5 Serializable -> JsonSerializable 2021-02-12 15:41:28 -05:00
Anuken
146b2589e2 Fixed rare network error 2021-02-12 14:54:10 -05:00
Anuken
abd07e1525 Fixed chat not working while paused 2021-02-12 12:55:31 -05:00
Anuken
541da5c0c9 Block flag documentation & cleanup 2021-02-12 09:09:10 -05:00
Anuken
21f642ad0c Merge remote-tracking branch 'origin/master' 2021-02-12 08:56:44 -05:00
Anuken
0d084d380d Fixed map resize not preserving links 2021-02-12 08:56:40 -05:00
Sharlotte
0fe158d080 [KO] i got typo! (#4662)
* [KO] i got typo!

* typo
2021-02-12 08:42:35 -05:00
Anuken
0cc64c6a8d Fixed #4658 2021-02-12 08:41:36 -05:00
Anuken
cd684996e1 Cleanup & Steam crash fix 2021-02-11 16:31:44 -05:00
Anuken
0350e6bbf4 Validate teams with power links 2021-02-11 12:03:11 -05:00
Anuken
4fe5972d89 Merge remote-tracking branch 'origin/master' 2021-02-11 10:12:17 -05:00
Anuken
27c8efc672 Better targeting range calculation 2021-02-11 10:12:07 -05:00
Catchears
aef0faf79c update german translation to include logic hints (#4654)
* update german bundle to "force projector heat issues"

ea2b57ec4b
ea2b57ec4b

* Gebäude -> Block to prevent confusion
2021-02-11 10:01:03 -05:00
Sharlotte
ea7d1dd91e [KO] UPDATED KO Translation (#4656)
* translated all without logic hint

* typo typo typo typo everywhere typo oh hi typo

* Update logic hint

* typo

* translated changed android description

* android changelog
2021-02-11 09:55:02 -05:00
Anuken
ea2b57ec4b Force projector heat sense 2021-02-10 14:42:30 -05:00
Anuken
949f5eccd7 Damage distance check fix 2021-02-10 09:46:30 -05:00
키에르
e525d89e43 Add missing properties (#4649)
* Add missing properties

* oh no formatting
2021-02-10 09:37:47 -05:00
Patrick 'Quezler' Mounier
6498ce3c4f Remove double indentation of the io server group (#4650) 2021-02-10 09:21:21 -05:00
MEEP of Faith
cbf30c599b If a building and unit are found within the line, target the closer one. (#4646) 2021-02-10 09:16:49 -05:00
Anuken
54c406f83d Cleanup 2021-02-09 18:28:11 -05:00
Anuken
7b2957ab41 More logic tooltips 2021-02-09 15:04:50 -05:00
Anuken
e22fccf5b1 Logic hint tooltips 2021-02-09 14:52:23 -05:00
Anuken
ce8b32f022 Merge remote-tracking branch 'origin/master' 2021-02-09 12:10:22 -05:00
Anuken
0d0aef3dea Logic layout bugfixes 2021-02-09 12:10:15 -05:00
MEEP of Faith
386da22f6e remove space in perShot (#4640) 2021-02-09 09:52:00 -05:00
SachaTending
f76b514892 Update servers_v6.json (#4615)
Add RCR
2021-02-09 09:44:01 -05:00
Anuken
77dc959e4a Merge remote-tracking branch 'origin/master' 2021-02-09 09:35:03 -05:00
Anuken
a99151441c Fixed #4642 / Logic op reorganization 2021-02-09 09:34:58 -05:00
buthed010203
852b0a97fe 60 * 60 > Time.toMinutes (#4634)
It already exists in other places in the code, doesn't make sense to not use it.
2021-02-08 16:49:14 -05:00
Anuken
38843c25fb Merge remote-tracking branch 'origin/master' 2021-02-08 16:44:22 -05:00
Anuken
ce2750ba60 Rail bullet fix 2021-02-08 16:29:41 -05:00
Fatonndev
1d3dbddaef add player.locale (#4633) 2021-02-08 15:26:48 -05:00
Anuken
d8177daada Merge remote-tracking branch 'origin/master' 2021-02-08 14:55:18 -05:00
Anuken
3cbcd779eb Better strict equality implementation 2021-02-08 14:55:14 -05:00
Nexort23
33fc36a2d4 hub minplay.ru (#4600)
* hub minplay.ru
2021-02-08 14:52:11 -05:00
Anuken
c06146110d Better bullet homing (#4630) 2021-02-08 13:03:08 -05:00
Anuken
1802aab683 isNull op / Return null for null block sense/NaNs 2021-02-08 12:48:39 -05:00
Anuken
49fe47f1f8 Comment fix 2021-02-08 12:23:56 -05:00
Anuken
a13c9d0761 Fixed F-Droid build string not updating on deploy 2021-02-08 10:58:05 -05:00
Anuken
3d8479355c Fixed random key 2021-02-08 10:45:08 -05:00
MEEP of Faith
86c702861e Remove NullPointerExeption error (#4624) 2021-02-08 10:44:08 -05:00
CxZxRainzz
47ec13eef4 Update servers_v6.json (#4628)
Add CxZx
2021-02-08 10:39:41 -05:00
Anuken
d8cd0d867c Merge remote-tracking branch 'origin/master' 2021-02-08 10:37:09 -05:00
Anuken
d5ede6b1bb Un-blacklisted arc.net 2021-02-08 10:37:06 -05:00
키에르
fd931564aa Add sources jar (#4612)
* Add sources jar

* Update build.gradle

* Fix classes not found

* :core

* formatting

Co-authored-by: Anuken <arnukren@gmail.com>
2021-02-08 09:59:11 -05:00
Anuken
6b19178a13 Fixed #4620 2021-02-08 09:52:41 -05:00
Anuken
64acd6c1e4 Merge remote-tracking branch 'origin/master' 2021-02-08 09:42:57 -05:00
Anuken
560914bebe Added more unit stats to database 2021-02-08 09:42:49 -05:00
Anuken
2edec90dfb Cleanup 2021-02-08 09:25:46 -05:00
Catchears
10c1305eae update german translation for build 124 (#4618)
* update german translation for build 124

* shorten text to fit on the button without newline
2021-02-07 17:16:56 -05:00
Joshua Fan
852c98f004 "[E] to enable building" hint while building is paused (#3857)
* Show building hints while building is paused

* Add hint: [E] to enable building

* Remove .left()

* Fix build enable hint display inconsistencies when changing build auto-pause setting

* Combine building hint tables

* Fix indentation
2021-02-07 16:58:42 -05:00
135 changed files with 3106 additions and 910 deletions

View File

@@ -50,6 +50,7 @@ jobs:
echo versionName=6-fdroid-${RELEASE_VERSION:1}$'\n'versionCode=${RELEASE_VERSION:1} > version_fdroid.txt echo versionName=6-fdroid-${RELEASE_VERSION:1}$'\n'versionCode=${RELEASE_VERSION:1} > version_fdroid.txt
git add . git add .
git commit -m "Updating to build ${RELEASE_VERSION:1}" git commit -m "Updating to build ${RELEASE_VERSION:1}"
git push https://Anuken:${{ secrets.API_TOKEN_GITHUB }}@github.com/Anuken/MindustryBuilds
cd ../Mindustry cd ../Mindustry
- name: Upload client artifacts - name: Upload client artifacts
uses: svenstaro/upload-release-action@v2 uses: svenstaro/upload-release-action@v2

View File

@@ -1,7 +1,7 @@
![Logo](core/assets-raw/sprites/ui/logo.png) ![Logo](core/assets-raw/sprites/ui/logo.png)
[![Build Status](https://travis-ci.org/Anuken/Mindustry.svg?branch=master)](https://travis-ci.org/Anuken/Mindustry) [![Build Status](https://github.com/Anuken/Mindustry/workflows/Tests/badge.svg?event=push)](https://github.com/Anuken/Mindustry/actions)
[![Discord](https://img.shields.io/discord/391020510269669376.svg?logo=discord&logoColor=white&logoWidth=20&labelColor=7289DA&label=Discord)](https://discord.gg/mindustry) [![Discord](https://img.shields.io/discord/391020510269669376.svg?logo=discord&logoColor=white&logoWidth=20&labelColor=7289DA&label=Discord&color=17cf48)](https://discord.gg/mindustry)
A sandbox tower defense game written in Java. A sandbox tower defense game written in Java.

View File

@@ -72,9 +72,8 @@ public class AndroidLauncher extends AndroidApplication{
} }
@Override @Override
public Class<?> loadJar(Fi jar, String mainClass) throws Exception{ public ClassLoader loadJar(Fi jar, String mainClass) throws Exception{
DexClassLoader loader = new DexClassLoader(jar.file().getPath(), getFilesDir().getPath(), null, getClassLoader()); return new DexClassLoader(jar.file().getPath(), getFilesDir().getPath(), null, getClassLoader());
return Class.forName(mainClass, true, loader);
} }
@Override @Override
@@ -162,7 +161,6 @@ public class AndroidLauncher extends AndroidApplication{
}, new AndroidApplicationConfiguration(){{ }, new AndroidApplicationConfiguration(){{
useImmersiveMode = true; useImmersiveMode = true;
hideStatusBar = true; hideStatusBar = true;
stencil = 8;
}}); }});
checkFiles(getIntent()); checkFiles(getIntent());

View File

@@ -35,7 +35,7 @@ allprojects{
if(!project.hasProperty("versionType")) versionType = 'official' if(!project.hasProperty("versionType")) versionType = 'official'
appName = 'Mindustry' appName = 'Mindustry'
steamworksVersion = '891ed912791e01fe9ee6237a6497e5212b85c256' steamworksVersion = '891ed912791e01fe9ee6237a6497e5212b85c256'
rhinoVersion = '2617981f706e50b8753155d8e15e326308be3b22' rhinoVersion = '378626d8abc552bba57864358358045d2f2dbe9b'
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 }
@@ -318,6 +318,15 @@ project(":core"){
} }
} }
task sourcesJar(type: Jar, dependsOn: classes){
classifier = 'sources'
from sourceSets.main.allSource
}
artifacts{
archives sourcesJar
}
dependencies{ dependencies{
compileJava.dependsOn(preGen) compileJava.dependsOn(preGen)

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.4 KiB

View File

@@ -113,7 +113,7 @@ committingchanges = Committing Changes
done = Done done = Done
feature.unsupported = Your device does not support this feature. feature.unsupported = Your device does not support this feature.
mods.alphainfo = Keep in mind that mods are in alpha, and[scarlet] may be very buggy[].\nReport any issues you find to the Mindustry GitHub. mods.initfailed = [red]⚠[] The previous Mindustry instance failed to initialize. This was likely caused by misbehaving mods.\n\nTo prevent a crash loop, [red]all mods have been disabled.[]\n\nTo disable this feature, turn it off in [accent]Settings->Game->Disable Mods On Startup Crash[].
mods = Mods mods = Mods
mods.none = [lightgray]No mods found! mods.none = [lightgray]No mods found!
mods.guide = Modding Guide mods.guide = Modding Guide
@@ -312,6 +312,7 @@ cancelbuilding = [accent][[{0}][] to clear plan
selectschematic = [accent][[{0}][] to select+copy selectschematic = [accent][[{0}][] to select+copy
pausebuilding = [accent][[{0}][] to pause building pausebuilding = [accent][[{0}][] to pause building
resumebuilding = [scarlet][[{0}][] to resume building resumebuilding = [scarlet][[{0}][] to resume building
enablebuilding = [scarlet][[{0}][] to enable building
showui = UI hidden.\nPress [accent][[{0}][] to show UI. showui = UI hidden.\nPress [accent][[{0}][] to show UI.
wave = [accent]Wave {0} wave = [accent]Wave {0}
wave.cap = [accent]Wave {0}/{1} wave.cap = [accent]Wave {0}/{1}
@@ -683,6 +684,7 @@ stat.drillspeed = Base Drill Speed
stat.boosteffect = Boost Effect stat.boosteffect = Boost Effect
stat.maxunits = Max Active Units stat.maxunits = Max Active Units
stat.health = Health stat.health = Health
stat.armor = Armor
stat.buildtime = Build Time stat.buildtime = Build Time
stat.maxconsecutive = Max Consecutive stat.maxconsecutive = Max Consecutive
stat.buildcost = Build Cost stat.buildcost = Build Cost
@@ -794,9 +796,11 @@ 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.flow.name = Display Resource Flow Rate 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.modcrashdisable = 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.antialias.name = Antialias[lightgray] (requires restart)[]
@@ -954,6 +958,8 @@ rules.blockdamagemultiplier = Block Damage Multiplier
rules.unitbuildspeedmultiplier = Unit Production Speed Multiplier rules.unitbuildspeedmultiplier = Unit Production Speed Multiplier
rules.unithealthmultiplier = Unit Health Multiplier rules.unithealthmultiplier = Unit Health Multiplier
rules.unitdamagemultiplier = Unit Damage Multiplier rules.unitdamagemultiplier = Unit Damage Multiplier
rules.unitcapvariable = Cores Contribute To Unit Cap
rules.unitcap = Base Unit Cap
rules.enemycorebuildradius = Enemy Core No-Build Radius:[lightgray] (tiles) rules.enemycorebuildradius = Enemy Core No-Build Radius:[lightgray] (tiles)
rules.wavespacing = Wave Spacing:[lightgray] (sec) rules.wavespacing = Wave Spacing:[lightgray] (sec)
rules.buildcostmultiplier = Build Cost Multiplier rules.buildcostmultiplier = Build Cost Multiplier
@@ -1511,3 +1517,139 @@ 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.
lst.read = Read a number from a linked memory cell.
lst.write = Write a number to a linked memory cell.
lst.print = Add text to the print buffer.\nDoes not display anything until [accent]Print Flush[] is used.
lst.draw = Add an operation to the drawing buffer.\nDoes not display anything until [accent]Draw Flush[] is used.
lst.drawflush = Flush queued [accent]Draw[] operations to a display.
lst.printflush = Flush queued [accent]Print[] operations to a message block.
lst.getlink = Get a processor link by index. Starts at 0.
lst.control = Control a building.
lst.radar = Locate units around a building with range.
lst.sensor = Get data from a building or unit.
lst.set = Set a variable.
lst.operation = Perform an operation on 1-2 variables.
lst.end = Jump to the top of the instruction stack.
lst.jump = Conditionally jump to another statement.
lst.unitbind = Bind to the next unit of a type, and store it in [accent]@unit[].
lst.unitcontrol = Control the currently bound unit.
lst.unitradar = Locate units around the currently bound unit.
lst.unitlocate = Locate a specific type of position/building anywhere on the map.\nRequires a bound unit.
lenum.type = Type of building/unit.\ne.g. for any router, this will return [accent]@router[].\nNot a string.
lenum.shoot = Shoot at a position.
lenum.shootp = Shoot at a unit/building with velocity prediction.
lenum.configure = Building configuration, e.g. sorter item.
lenum.enabled = Whether the block is enabled.
laccess.color = Illuminator color.
graphicstype.clear = Fill the display with a color.
graphicstype.color = Set color for next drawing operations.
graphicstype.stroke = Set line width.
graphicstype.line = Draw line segment.
graphicstype.rect = Fill a rectangle.
graphicstype.linerect = Draw a rectangle outline.
graphicstype.poly = Fill a regular polygon.
graphicstype.linepoly = Draw a regular polygon outline.
graphicstype.triangle = Fill a triangle.
graphicstype.image = Draw an image of some content.\nex: [accent]@router[] or [accent]@dagger[].
lenum.always = Always true.
lenum.idiv = Integer division.
lenum.div = Division.\nReturns [accent]null[] on divide-by-zero.
lenum.mod = Modulo.
lenum.equal = Equal. Coerces types.\nNon-null objects compared with numbers become 1, otherwise 0.
lenum.notequal = Not equal. Coerces types.
lenum.strictequal = Strict equality. Does not coerce types.\nCan be used to check for [accent]null[].
lenum.shl = Bit-shift left.
lenum.shr = Bit-shift right.
lenum.or = Bitwise OR.
lenum.land = Logical AND.
lenum.and = Bitwise AND.
lenum.not = Bitwise flip.
lenum.xor = Bitwise XOR.
lenum.min = Minimum of two numbers.
lenum.max = Maximum of two numbers.
lenum.angle = Angle of vector in degrees.
lenum.len = Length of vector.
lenum.sin = Sine, in degrees.
lenum.cos = Cosine, in degrees.
lenum.tan = Tangent, in degrees.
#not a typo, look up 'range notation'
lenum.rand = Random number in range [0, value).
lenum.log = Natural logarithm (ln).
lenum.log10 = Base 10 logarithm.
lenum.noise = 2D simplex noise.
lenum.abs = Absolute value.
lenum.sqrt = Square root.
lenum.any = Any unit.
lenum.ally = Ally unit.
lenum.attacker = Unit with a weapon.
lenum.enemy = Enemy unit.
lenum.boss = Guardian unit.
lenum.flying = Flying unit.
lenum.ground = Ground unit.
lenum.player = Unit controlled by a player.
lenum.ore = Ore deposit.
lenum.damaged = Damaged ally building.
lenum.spawn = Enemy spawn point.\nMay be a core or a position.
lenum.building = Building in a specific group.
lenum.core = Any core.
lenum.storage = Storage building, e.g. Vault.
lenum.generator = Buildings that generate power.
lenum.factory = Buildings that transform resources.
lenum.repair = Repair points.
lenum.rally = Command center.
lenum.battery = Any battery.
lenum.resupply = Resupply points.\nOnly relevant when [accent]"Unit Ammo"[] is enabled.
lenum.reactor = Impact/Thorium reactor.
lenum.turret = Any turret.
sensor.in = The building/unit to sense.
radar.from = Building to sense from.\nSensor range is limited by building range.
radar.target = Filter for units to sense.
radar.and = Additional filters.
radar.order = Sorting order. 0 to reverse.
radar.sort = Metric to sort results by.
radar.output = Variable to write output unit to.
unitradar.target = Filter for units to sense.
unitradar.and = Additional filters.
unitradar.order = Sorting order. 0 to reverse.
unitradar.sort = Metric to sort results by.
unitradar.output = Variable to write output unit to.
control.of = Building to control.
control.unit = Unit/building to aim at.
control.shoot = Whether to shoot.
unitlocate.enemy = Whether to locate enemy buildings.
unitlocate.found = Whether the object was found.
unitlocate.building = Output variable for located building.
unitlocate.outx = Output X coordinate.
unitlocate.outy = Output Y coordinate.
unitlocate.group = Building group to look for.
lenum.stop = Stop moving/mining/building.
lenum.move = Move to exact position.
lenum.approach = Approach a position with a radius.
lenum.pathfind = Pathfind to the enemy spawn.
lenum.target = Shoot a position.
lenum.targetp = Shoot a target with velocity prediction.
lenum.itemdrop = Drop an item.
lenum.itemtake = Take an item from a building.
lenum.paydrop = Drop current payload.
lenum.paytake = Pick up payload at current location.
lenum.flag = Numeric unit flag.
lenum.mine = Mine at a position.
lenum.build = Build a structure.
lenum.getblock = Fetch a building and type at coordinates.\nUnit must be in range of position.\nSolid non-buildings will have the type [accent]@solid[].
lenum.within = Check if unit is near a position.
lenum.boost = Start/stop boosting.

View File

@@ -41,10 +41,13 @@ be.ignore = Ignorieren
be.noupdates = Keine Aktualisierungen gefunden. be.noupdates = Keine Aktualisierungen gefunden.
be.check = Auf Aktualisierungen prüfen be.check = Auf Aktualisierungen prüfen
mod.featured.dialog.title = Mod Browser (unfertig) mod.featured.dialog.title = Mod Browser
mods.browser.selected = Ausgewählter Mod mods.browser.selected = Ausgewählter Mod
mods.browser.add = Installieren mods.browser.add = Installieren
mods.github.open = Ansehen mods.browser.reinstall = Neu Installieren
mods.github.open = Github
mods.browser.sortdate = Nach neusten sortieren
mods.browser.sortstars = Nach Sternen sortieren
schematic = Entwurf schematic = Entwurf
schematic.add = Entwurf speichern... schematic.add = Entwurf speichern...
@@ -68,9 +71,9 @@ schematic.disabled = [scarlet]Entwürfe deaktiviert[]\nAuf dieser [accent]Karte[
stats = Statistiken stats = Statistiken
stat.wave = Wellen besiegt:[accent] {0} stat.wave = Wellen besiegt:[accent] {0}
stat.enemiesDestroyed = Gegner zerstört:[accent] {0} stat.enemiesDestroyed = Gegner zerstört:[accent] {0}
stat.built = Gebäude gebaut:[accent] {0} stat.built = Blöcke gebaut:[accent] {0}
stat.destroyed = Gebäude zerstört:[accent] {0} stat.destroyed = Blöcke zerstört:[accent] {0}
stat.deconstructed = Gebäude abgebaut:[accent] {0} stat.deconstructed = Blöcke abgebaut:[accent] {0}
stat.delivered = Übertragene Ressourcen: stat.delivered = Übertragene Ressourcen:
stat.playtime = Spielzeit:[accent] {0} stat.playtime = Spielzeit:[accent] {0}
stat.rank = Finaler Rang:[accent] {0} stat.rank = Finaler Rang:[accent] {0}
@@ -116,8 +119,10 @@ mods.none = [lightgray]Keine Mods gefunden!
mods.guide = Modding-Anleitung mods.guide = Modding-Anleitung
mods.report = Problem melden mods.report = Problem melden
mods.openfolder = Mod-Verzeichnis öffnen mods.openfolder = Mod-Verzeichnis öffnen
mods.viewcontent = Inhalt ansehen
mods.reload = Neu laden mods.reload = Neu laden
mods.reloadexit = Das Spiel wird jetzt beendet, um die Mod-Änderungen anzuwenden. mods.reloadexit = Das Spiel wird jetzt beendet, um die Mod-Änderungen anzuwenden.
mod.installed = [[Installiert]
mod.display = [gray]Mod:[orange] {0} mod.display = [gray]Mod:[orange] {0}
mod.enabled = [lightgray]Aktiviert mod.enabled = [lightgray]Aktiviert
mod.disabled = [scarlet]Deaktiviert mod.disabled = [scarlet]Deaktiviert
@@ -287,6 +292,7 @@ cancel = Abbruch
openlink = Link öffnen openlink = Link öffnen
copylink = Link kopieren copylink = Link kopieren
back = Zurück back = Zurück
max = Max
crash.export = Crash-Logs exportieren crash.export = Crash-Logs exportieren
crash.none = Keine Crash-Logs gefunden. crash.none = Keine Crash-Logs gefunden.
crash.exported = Crash-Logs wurden erfolgreich exportiert. crash.exported = Crash-Logs wurden erfolgreich exportiert.
@@ -306,6 +312,7 @@ cancelbuilding = [accent][[{0}][] um den Plan zu leeren
selectschematic = [accent][[{0}][] zum Auswählen+Kopieren selectschematic = [accent][[{0}][] zum Auswählen+Kopieren
pausebuilding = [accent][[{0}][] um das Bauen zu pausieren pausebuilding = [accent][[{0}][] um das Bauen zu pausieren
resumebuilding = [scarlet][[{0}][] um das Bauen fortzusetzen resumebuilding = [scarlet][[{0}][] um das Bauen fortzusetzen
enablebuilding = [scarlet][[{0}][] um zu bauen
showui = Bedienflächen versteckt.\nDrücke [accent][[{0}][], um sie wieder anzuzeigen. showui = Bedienflächen versteckt.\nDrücke [accent][[{0}][], um sie wieder anzuzeigen.
wave = [accent]Welle {0} wave = [accent]Welle {0}
wave.cap = [accent]Welle {0}/{1} wave.cap = [accent]Welle {0}/{1}
@@ -361,7 +368,6 @@ editor.center = Zur Mitte
workshop = Workshop workshop = Workshop
waves.title = Wellen waves.title = Wellen
waves.remove = Entfernen waves.remove = Entfernen
waves.never = <nie>
waves.every = alle waves.every = alle
waves.waves = Welle(n) waves.waves = Welle(n)
waves.perspawn = pro Spawn waves.perspawn = pro Spawn
@@ -390,7 +396,7 @@ editor.removeunit = Bereich entfernen
editor.teams = Teams editor.teams = Teams
editor.errorload = Fehler beim Laden der Datei:\n[accent]{0} editor.errorload = Fehler beim Laden der Datei:\n[accent]{0}
editor.errorsave = Fehler beim Speichern der Datei:\n[accent]{0} editor.errorsave = Fehler beim Speichern der Datei:\n[accent]{0}
editor.errorimage = Das ist ein Bild, keine Karte. Wechsle nicht den Dateityp und erwarte, dass es funktioniert.\n\nWenn du eine 'v3.5/build 40'-Karte importieren möchtest, benutze den 'Importiere Terrainbild'-Knopf im Editor. editor.errorimage = Das ist ein Bild, keine Karte.
editor.errorlegacy = Diese Karte ist zu alt und benutzt ein veraltetes Kartenformat, das nicht mehr unterstützt wird. editor.errorlegacy = Diese Karte ist zu alt und benutzt ein veraltetes Kartenformat, das nicht mehr unterstützt wird.
editor.errornot = Dies ist keine Kartendatei. editor.errornot = Dies ist keine Kartendatei.
editor.errorheader = Diese Karte ist entweder nicht gültig oder beschädigt. editor.errorheader = Diese Karte ist entweder nicht gültig oder beschädigt.
@@ -678,6 +684,7 @@ stat.drillspeed = Bohrgeschwindigkeit
stat.boosteffect = Verstärkungseffekt stat.boosteffect = Verstärkungseffekt
stat.maxunits = Max. aktive Einheiten stat.maxunits = Max. aktive Einheiten
stat.health = Lebenspunkte stat.health = Lebenspunkte
stat.armour = Panzer
stat.buildtime = Baudauer stat.buildtime = Baudauer
stat.maxconsecutive = Max. Konsekutive stat.maxconsecutive = Max. Konsekutive
stat.buildcost = Baukosten stat.buildcost = Baukosten
@@ -693,6 +700,7 @@ stat.lightningchance = Blitzwahr­schein­lich­keit
stat.lightningdamage = Blitzschaden stat.lightningdamage = Blitzschaden
stat.flammability = Brennbarkeit stat.flammability = Brennbarkeit
stat.radioactivity = Radioaktivität stat.radioactivity = Radioaktivität
stat.charge = Ladung
stat.heatcapacity = Hitzekapazität stat.heatcapacity = Hitzekapazität
stat.viscosity = Viskosität stat.viscosity = Viskosität
stat.temperature = Temperatur stat.temperature = Temperatur
@@ -720,6 +728,7 @@ bar.corereq = Kern-Basis erforderlich
bar.drillspeed = Bohrgeschwindigkeit: {0}/s bar.drillspeed = Bohrgeschwindigkeit: {0}/s
bar.pumpspeed = Pumpengeschwindigkeit: {0}/s bar.pumpspeed = Pumpengeschwindigkeit: {0}/s
bar.efficiency = Effizienz: {0}% bar.efficiency = Effizienz: {0}%
bar.boost = Beschleunigung: {0}%
bar.powerbalance = Strom: {0}/s bar.powerbalance = Strom: {0}/s
bar.powerstored = Gespeichert: {0}/{1} bar.powerstored = Gespeichert: {0}/{1}
bar.poweramount = Strom: {0} bar.poweramount = Strom: {0}
@@ -787,6 +796,7 @@ setting.shadows.name = Schatten
setting.blockreplace.name = Automatische Blockvorschläge setting.blockreplace.name = Automatische Blockvorschläge
setting.linear.name = Lineare Filterung setting.linear.name = Lineare Filterung
setting.hints.name = Tipps setting.hints.name = Tipps
setting.logichints.name = Logiktipps
setting.flow.name = Ressourcen-Fluss anzeigen setting.flow.name = Ressourcen-Fluss anzeigen
setting.backgroundpause.name = Im Hintergrund pausieren setting.backgroundpause.name = Im Hintergrund pausieren
setting.buildautopause.name = Bauen automatisch pausieren setting.buildautopause.name = Bauen automatisch pausieren
@@ -935,6 +945,7 @@ mode.custom = Angepasste Regeln
rules.infiniteresources = Unbegrenzte Ressourcen rules.infiniteresources = Unbegrenzte Ressourcen
rules.reactorexplosions = Reaktor-Explosionen rules.reactorexplosions = Reaktor-Explosionen
rules.coreincinerates = Kern verbrennt überflüssige Materialien
rules.schematic = Entwürfe erlaubt rules.schematic = Entwürfe erlaubt
rules.wavetimer = Wellen-Timer rules.wavetimer = Wellen-Timer
rules.waves = Wellen rules.waves = Wellen
@@ -946,6 +957,8 @@ rules.blockdamagemultiplier = Block-Schaden-Multiplikator
rules.unitbuildspeedmultiplier = Baugeschwindigkeit-Einheit Multiplikator rules.unitbuildspeedmultiplier = Baugeschwindigkeit-Einheit Multiplikator
rules.unithealthmultiplier = Lebenspunkte-Einheit Multiplikator rules.unithealthmultiplier = Lebenspunkte-Einheit Multiplikator
rules.unitdamagemultiplier = Schaden-Einheit Multiplikator rules.unitdamagemultiplier = Schaden-Einheit Multiplikator
rules.unitcapvariable = Kerne zählen zum Einheiten-Limit dazu
rules.unitcap = Einheiten-Limit
rules.enemycorebuildradius = Bauverbot-Radius durch feindlichen Kern:[lightgray] (Kacheln) rules.enemycorebuildradius = Bauverbot-Radius durch feindlichen Kern:[lightgray] (Kacheln)
rules.wavespacing = Wellen-Abstand:[lightgray] (Sek) rules.wavespacing = Wellen-Abstand:[lightgray] (Sek)
rules.buildcostmultiplier = Bau-Kosten Multiplikator rules.buildcostmultiplier = Bau-Kosten Multiplikator
@@ -955,7 +968,7 @@ rules.waitForWaveToEnd = Warten bis Welle endet
rules.dropzoneradius = Drop-Zonen-Radius:[lightgray] (Kacheln) rules.dropzoneradius = Drop-Zonen-Radius:[lightgray] (Kacheln)
rules.unitammo = Einheiten benötigen Munition rules.unitammo = Einheiten benötigen Munition
rules.title.waves = Wellen rules.title.waves = Wellen
rules.title.resourcesbuilding = Ressourcen & Gebäude rules.title.resourcesbuilding = Ressourcen & Blöcke
rules.title.enemy = Gegner rules.title.enemy = Gegner
rules.title.unit = Einheiten rules.title.unit = Einheiten
rules.title.experimental = Experimentell rules.title.experimental = Experimentell
@@ -1031,7 +1044,7 @@ unit.reign.name = Reign
unit.vela.name = Vela unit.vela.name = Vela
unit.corvus.name = Korvus unit.corvus.name = Korvus
block.resupply-point.name = Nachlade-Punkt block.resupply-point.name = Munitionsvorrat
block.parallax.name = Parallax block.parallax.name = Parallax
block.cliff.name = Klippe block.cliff.name = Klippe
block.sand-boulder.name = Sandbrocken block.sand-boulder.name = Sandbrocken
@@ -1310,7 +1323,7 @@ item.coal.details = Scheint versteinerte Pflanzenmasse zu sein, die sich schon l
item.titanium.description = Wird im Flüssigkeitsbereich, im Bohrerbereich und für Flugzeuge vielfältig eingesetzt. item.titanium.description = Wird im Flüssigkeitsbereich, im Bohrerbereich und für Flugzeuge vielfältig eingesetzt.
item.thorium.description = Wird als festes Baumaterial oder radioaktiver Kraftstoff verwendet. item.thorium.description = Wird als festes Baumaterial oder radioaktiver Kraftstoff verwendet.
item.scrap.description = Wird in Pulverisierer und Schmelzer zu anderen Materialien bearbeitet. item.scrap.description = Wird in Pulverisierer und Schmelzer zu anderen Materialien bearbeitet.
item.scrap.details = Übriggebliebene Reste alter Gebäude oder Einheiten. item.scrap.details = Übriggebliebene Reste alter Blöcke oder Einheiten.
item.silicon.description = Wird in Solarzellen, komplizierter Elektronik und als zielsuchende Munition verwendet. item.silicon.description = Wird in Solarzellen, komplizierter Elektronik und als zielsuchende Munition verwendet.
item.plastanium.description = Wird für fortgeschrittene Einheiten, Isolation und Munition eingesetzt. item.plastanium.description = Wird für fortgeschrittene Einheiten, Isolation und Munition eingesetzt.
item.phase-fabric.description = Kann in Elektronik und selbstreparierende Blöcke verwendet werden. item.phase-fabric.description = Kann in Elektronik und selbstreparierende Blöcke verwendet werden.
@@ -1381,8 +1394,8 @@ block.inverted-sorter.description = Wie ein normaler Sortierer, aber gibt das au
block.router.description = Verteilt Materialien auf bis zu drei Richtungen. block.router.description = Verteilt Materialien auf bis zu drei Richtungen.
block.router.details = Ein nötiges Übel. Es ist nicht empfehlenswert, ihn neben Fabriken zu setzen, da er sich dort verstopfen kann. block.router.details = Ein nötiges Übel. Es ist nicht empfehlenswert, ihn neben Fabriken zu setzen, da er sich dort verstopfen kann.
block.distributor.description = Verteilt Materialien auf bis zu sieben Richtungen. block.distributor.description = Verteilt Materialien auf bis zu sieben Richtungen.
block.overflow-gate.description = Gibt Materialien nur zu den Seiten heraus, wenn der fordere Ausgang blockiert ist. Kann nicht neben anderen Überlauf- oder Unterlauftoren verwendet werden. block.overflow-gate.description = Gibt Materialien nur zu den Seiten heraus, wenn der fordere Ausgang blockiert ist.
block.underflow-gate.description = Das Gegenteil eines Überlauftors. Gibt Materialien nur nach vorne heraus, wenn die Seiten blockiert sind. Kann nicht neben anderen Überlauf- oder Unterlauftoren verwendet werden. block.underflow-gate.description = Das Gegenteil eines Überlauftors. Gibt Materialien nur nach vorne heraus, wenn die Seiten blockiert sind.
block.mass-driver.description = Ein Transportblock mit sehr hoher Reichweite. Sammelt mehrere Materialien und schießt sie zu einem verbundenen Massenbeschleuniger. block.mass-driver.description = Ein Transportblock mit sehr hoher Reichweite. Sammelt mehrere Materialien und schießt sie zu einem verbundenen Massenbeschleuniger.
block.mechanical-pump.description = Eine Pumpe, die keinen Strom benötigt. block.mechanical-pump.description = Eine Pumpe, die keinen Strom benötigt.
block.rotary-pump.description = Eine Pumpe, die Strom verbraucht. block.rotary-pump.description = Eine Pumpe, die Strom verbraucht.
@@ -1503,3 +1516,138 @@ 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.
lst.read = Liest einen Wert aus einer verbundenen Spiecherzelle.
lst.write = Schreibt eine Zahl in einer verbundene Speicherzelle.
lst.print = Fügt Text zum Textspeicher hinzu.\nZeigt nichts an, bis [accent]Print Flush[] verwendet wird.
lst.draw = Fügt eine [accent]Draw[]-Aufgabe zum Bildspeicher hinzu.\nZeigt nichts an, bis [accent]Draw Flush[] verwendet wird.
lst.drawflush = Druckt [accent]Draw[]-Aufgaben aus dem Bildspeicher auf einen Bildschirm.
lst.printflush = Druckt [accent]Print[]-Aufgaben aus dem Textspeicher auf einen Nachrichtenblock.
lst.getlink = Gibt ein verbundenen Block wieder. Fängt bei 0 an.
lst.control = Steuert einen Block.
lst.radar = Findet Einheiten.
lst.sensor = Gibt Daten über einen Block oder eine Einheit wieder.
lst.set = Setzt eine Variable fest.
lst.operation = Verändert eine Variable.
lst.end = Springt wieder nach oben.
lst.jump = Falls die Bedingung erfüllt ist, wird woanders weitergemacht.
lst.unitbind = Speichert eine Einheit einer Sorte als [accent]@unit[].
lst.unitcontrol = Steuert [accent]@unit[].
lst.unitradar = Findet Einheiten in der Nähe von [accent]@unit[].
lst.unitlocate = Findet mit [accent]@unit[] bestimmte Positionen / Blöcke auf der ganzen Karte.
lenum.type = Englischer Name eines Blocks / einer Einheit. Ein Verteiler gibt [accent]@router[] wieder.\nKein string.
lenum.shoot = Schießt auf eine Position.
lenum.shootp = Schießt auf eine Einheit / einen Block und sagt deren Position voraus.
lenum.configure = Blockkonfiguration, z.B. das ausgewählte Item in einem Sortierer.
lenum.enabled = Ob der Block an oder aus ist.
laccess.color = Illuminiererfarbe.
graphicstype.stroke = Setzt die Linienbreite fest.
graphicstype.line = Zeichnet eine Linie.
graphicstype.clear = Füllt den Bildschirm mit einer Farbe.
graphicstype.color = Wählt eine Farbe aus.
graphicstype.rect = Zeichnet ein Rechteck.
graphicstype.linerect = Zeichnet den Umriss eines Rechtecks.
graphicstype.poly = Füllt ein gleichmäßiges Polygon.
graphicstype.linepoly = Zeichnet den Umriss eines gleichmäßigen Polygons.
graphicstype.triangle = Zeichnet ein Dreieck.
graphicstype.image = Zeichnet ein Bild von einem englischen Namen.\nz.B. [accent]@router[] oder [accent]@dagger[].
lenum.always = Immer.
lenum.idiv = Division mit ganzen Zahlen.
lenum.div = Division.\nGibt bei Teilung durch null [accent]null[] zurück.
lenum.mod = Modulo.
lenum.equal = Prüft Gleichheit.\nNicht-"null" Objekte, die mit Zahlen verglichen werden, werden 1.
lenum.notequal = Prüft Ungleichheit.
lenum.strictequal = Prüft strenge Gleichheit.\nKann verwendet werden, um "null" zu finden.
lenum.shl = Bit-shift nacht links.
lenum.shr = Bit-shift nach rechts.
lenum.or = Bitwise ODER.
lenum.land = Logisches AND.
lenum.and = Bitwise UND.
lenum.not = Bitwise NOT.
lenum.xor = Bitwise XOR.
lenum.min = Die Größte von zwei Zahlen.
lenum.max = Die Kleinste von zwei Zahlen.
lenum.angle = Angle of vector in degrees.
lenum.len = Length of vector.
lenum.sin = Sinus in Grad.
lenum.cos = Cosinus in Grad.
lenum.tan = Tangens in Grad.
#not a typo, look up 'range notation'
lenum.rand = Zufällige Zahl zwischen [0, <wert>).
lenum.log = Logarithmus (ln).
lenum.log10 = Logarithmus zur Basis 10.
lenum.noise = 2D rauschen.
lenum.abs = Betrag.
lenum.sqrt = Quadratwurzel.
lenum.any = Irgendeine Einheit.
lenum.ally = Freundliche Einheit.
lenum.attacker = Einheit mit Waffe.
lenum.enemy = Gegnerische Einheit.
lenum.boss = Bosseinheit.
lenum.flying = Lufteinheit.
lenum.ground = Bodeneinheit.
lenum.player = Spielergesteuerte Einheit.
lenum.ore = Erz.
lenum.damaged = Beschädigter, alliierter Block.
lenum.spawn = Gegnerischer Spawnpunkt.\nKann ein Kern oder eine Position sein.
lenum.building = Ein Block einer bestimmten Sorte.
lenum.core = Irgendein Kern.
lenum.storage = Speicherblock, z.B. ein Tresor.
lenum.generator = Blöcke, die Strom generieren.
lenum.factory = Blöcke, die Ressourcen verarbeiten.
lenum.repair = Reperaturpunkt.
lenum.rally = Kommandozentrale
lenum.battery = Irgendeine Batterie.
lenum.resupply = Munitionsvorrat.\nNur wichtig, wenn [accent]"Einheiten benötigen Munition"[] an ist.
lenum.reactor = Schlag- / Thoriumreaktor.
lenum.turret = Irgendein Geschütz.
sensor.in = Der Block / die Einheit.
radar.from = Block zu benutzen. [accent]Sensor[]-Reichweite hängt von der Blockreichweite ab.
radar.target = Einheitenfilter.
radar.and = Weitere Filter.
radar.order = Sortierreihenfolge der Ergebnisse. 0 bedeutet rückwärts.
radar.sort = Sortiermethode der Ergebnisse.
radar.output = Variable für das Ergebnis.
unitradar.target = Einheitenfilter.
unitradar.and = Weitere Filter.
unitradar.order = Sortierreihenfolge der Ergebnisse. 0 bedeutet rückwärts.
unitradar.sort = Sortiermethode der Ergebnisse.
unitradar.output = Variable für das Ergebnis.
control.of = Block, der gesteuert werden soll.
control.unit = Zieleinheit / Zielblock.
control.shoot = Ob geschossen werden soll.
unitlocate.enemy = Ob gegnerische Blöcke gesucht werden sollen.
unitlocate.found = Ob der Block gefunden wurde.
unitlocate.building = Variable für das Ergebnis.
unitlocate.outx = Variable für die X-Koordinate.
unitlocate.outy = Variable für die Y-Koordinate.
unitlocate.group = Gesuchter Blocktyp.
lenum.stop = Bewegung / Abbau / Bau abbrechen.
lenum.move = Geht zu diese Position.
lenum.approach = Geht auf einen Punkt mit einem bestimmten Radius zu.
lenum.pathfind = Geht zum gegnerischen Spawnpunkt.
lenum.target = Schießt auf eine Position.
lenum.targetp = Schießt auf eine Einheit und sagt deren Position voraus.
lenum.itemdrop = Items abwerfen.
lenum.itemtake = Items aus einem Block nehmen.
lenum.paydrop = Lässt einen Block / eine Einheit wieder fallen.
lenum.paytake = Hebt einen Block / eine kleine Einheit auf.
lenum.flag = Zahl, mit der eine Einheit identifiziert werden kann.
lenum.mine = Erz von einer Position abbauen.
lenum.build = Einen Block bauen.
lenum.getblock = Gibt den Blocktyp an den Koordinaten zurück.\nEinheiten müssen nah genug dran sein.\nFeste nicht-Blöcke sind [accent]@solid[].
lenum.within = Prüft, ob eine Einheit in einem Radius um einen Punkt ist.
lenum.boost = Aktiviert / deaktiviert den Boost.

View File

@@ -693,7 +693,8 @@ stat.lightningchance = Probabilidad de descarga
stat.lightningdamage = Daño por rayo stat.lightningdamage = Daño por rayo
stat.flammability = Inflamabilidad stat.flammability = Inflamabilidad
stat.radioactivity = Radioactividad stat.radioactivity = Radioactividad
stat.heatcapacity = Resistencia temperatura stat.charge = Carga eléctrica
stat.heatcapacity = Resistencia a la temperatura
stat.viscosity = Viscosidad stat.viscosity = Viscosidad
stat.temperature = Temperatura stat.temperature = Temperatura
stat.speed = Velocidad stat.speed = Velocidad
@@ -1116,7 +1117,7 @@ block.plastanium-wall.name = Muro de Plastanio
block.plastanium-wall-large.name = Muro de Plastanio grande block.plastanium-wall-large.name = Muro de Plastanio grande
block.phase-wall.name = Muro de Fase grande block.phase-wall.name = Muro de Fase grande
block.phase-wall-large.name = Muro de Fase grande block.phase-wall-large.name = Muro de Fase grande
block.thorium-wall.name = Pared de Torio block.thorium-wall.name = Muro de Torio
block.thorium-wall-large.name = Muro de Torio grande block.thorium-wall-large.name = Muro de Torio grande
block.door.name = Puerta block.door.name = Puerta
block.door-large.name = Puerta Grande block.door-large.name = Puerta Grande
@@ -1329,16 +1330,16 @@ block.graphite-press.description = Comprime carbón en piezas de grafito puro.
block.multi-press.description = Una versión mejorada de la prensa de grafito. Utiliza agua y energía para procesar carbón rápida y eficientemente. block.multi-press.description = Una versión mejorada de la prensa de grafito. Utiliza agua y energía para procesar carbón rápida y eficientemente.
block.silicon-smelter.description = Reduce la arena con carbón puro. Produce silicio. block.silicon-smelter.description = Reduce la arena con carbón puro. Produce silicio.
block.kiln.description = Funde arena y plomo en metacristal. Requiere cantidades pequeñas de energía para funcionar. block.kiln.description = Funde arena y plomo en metacristal. Requiere cantidades pequeñas de energía para funcionar.
block.plastanium-compressor.description = Produce plastanio con aceite y titanio. block.plastanium-compressor.description = Produce plastanio con petróleo y titanio.
block.phase-weaver.description = Produce tejido de fase del torio radioactivo y altas cantidades de arena. block.phase-weaver.description = Produce tejido de fase del torio radioactivo y altas cantidades de arena.
block.alloy-smelter.description = Produce aleación eléctrica con titanio, plomo, silicio y cobre. block.alloy-smelter.description = Produce aleación eléctrica con titanio, plomo, silicio y cobre.
block.cryofluid-mixer.description = Combina agua y titanio en líquido criogénico, que es mucho más eficiente para enfriar. block.cryofluid-mixer.description = Combina agua y titanio en líquido criogénico, que es mucho más eficiente para enfriar.
block.blast-mixer.description = Usa aceite para transformar pirotita en un objeto menos inflamable pero más explosivo: el compuesto explosivo. block.blast-mixer.description = Usa esporas para transformar pirotita en un objeto menos inflamable pero más explosivo: el compuesto explosivo.
block.pyratite-mixer.description = Mezcla carbón, plomo y arena en pirotita altamente inflamable. block.pyratite-mixer.description = Mezcla carbón, plomo y arena en pirotita altamente inflamable.
block.melter.description = Calienta piedra a temperaturas muy altas para obtener lava. block.melter.description = Calienta chatarra a temperaturas muy altas para obtener magma.
block.separator.description = Expone piedra a la presión del agua para obtener diversos minerales contenidos en la piedra. block.separator.description = Expone piedra a la presión del agua para obtener diversos minerales contenidos en la piedra.
block.spore-press.description = Comprime esporas en petróleo. block.spore-press.description = Comprime esporas en petróleo.
block.pulverizer.description = Despedaza la piedra en arena. Útil cuando no hay arena natural. block.pulverizer.description = Despedaza la chatarra en arena. Útil cuando no hay arena natural.
block.coal-centrifuge.description = Solidifica petróleo en piezas de carbón. block.coal-centrifuge.description = Solidifica petróleo en piezas de carbón.
block.incinerator.description = Se deshace de cualquier líquido o material producido en exceso. block.incinerator.description = Se deshace de cualquier líquido o material producido en exceso.
block.power-void.description = Elimina toda la energía que se le da. Solo en disponible en el modo Libre. block.power-void.description = Elimina toda la energía que se le da. Solo en disponible en el modo Libre.
@@ -1351,7 +1352,7 @@ block.copper-wall.description = Un bloque defensivo barato.\nÚtil para defender
block.copper-wall-large.description = Un bloque defensivo barato.\nÚtil para defender el núcleo y las torres en las primeras oleadas.\nOcupa múltiples casillas. block.copper-wall-large.description = Un bloque defensivo barato.\nÚtil para defender el núcleo y las torres en las primeras oleadas.\nOcupa múltiples casillas.
block.titanium-wall.description = Un bloque defensivo moderadamente fuerte.\nProporciona protección moderada contra los enemigos. block.titanium-wall.description = Un bloque defensivo moderadamente fuerte.\nProporciona protección moderada contra los enemigos.
block.titanium-wall-large.description = Un bloque defensivo moderadamente fuerte.\nProporciona protección moderada contra los enemigos.\nOcupa múltiples casillas. block.titanium-wall-large.description = Un bloque defensivo moderadamente fuerte.\nProporciona protección moderada contra los enemigos.\nOcupa múltiples casillas.
block.plastanium-wall.description = Un tipo especial de pared que absorbe los arcos eléctricos y bloquea las conexiones automáticas de los nodos de potencia.. block.plastanium-wall.description = Un tipo especial de pared que absorbe los arcos eléctricos y bloquea las conexiones automáticas de los nodos de potencia.
block.plastanium-wall-large.description = Un tipo especial de pared que absorbe los arcos eléctricos y bloquea las conexiones automáticas de los nodos de potencia.\nOcupa múltiples casillas. block.plastanium-wall-large.description = Un tipo especial de pared que absorbe los arcos eléctricos y bloquea las conexiones automáticas de los nodos de potencia.\nOcupa múltiples casillas.
block.thorium-wall.description = Un bloque defensivo fuerte.\nBuena protección contra enemigos. block.thorium-wall.description = Un bloque defensivo fuerte.\nBuena protección contra enemigos.
block.thorium-wall-large.description = Un bloque defensivo fuerte.\nBuena protección contra enemigos.\nOcupa múltiples casillas. block.thorium-wall-large.description = Un bloque defensivo fuerte.\nBuena protección contra enemigos.\nOcupa múltiples casillas.
@@ -1359,8 +1360,8 @@ block.phase-wall.description = No es tan fuerte como un muro de torio pero hace
block.phase-wall-large.description = No es tan fuerte como un muro de torio pero rebota balas al enemigo si no son demasiado fuertes.\nOcupa múltiples casillas. block.phase-wall-large.description = No es tan fuerte como un muro de torio pero rebota balas al enemigo si no son demasiado fuertes.\nOcupa múltiples casillas.
block.surge-wall.description = El bloque defensivo más fuerte.\nTiene una pequeña probabilidad de disparar rayos al atacante. block.surge-wall.description = El bloque defensivo más fuerte.\nTiene una pequeña probabilidad de disparar rayos al atacante.
block.surge-wall-large.description = El bloque defensivo más fuerte.\nTiene una pequeña probabilidad de disparar rayos al atacante.\nOcupa múltiplies casillas. block.surge-wall-large.description = El bloque defensivo más fuerte.\nTiene una pequeña probabilidad de disparar rayos al atacante.\nOcupa múltiplies casillas.
block.door.description = Una puerta pequeña que puede ser abierta y cerrada tocándola.\nSi está abirta, los enemigos pueden moverse y disparar a través de ella. block.door.description = Una puerta pequeña que puede ser abierta y cerrada tocándola.\nSi está abierta, los enemigos pueden moverse y disparar a través de ella.
block.door-large.description = Una puerta grande que puede ser abierta y cerrada tocándola.\nSi está abirta, los enemigos pueden moverse y disparar a través de ella.\nOcupa múltiples casillas. block.door-large.description = Una puerta grande que puede ser abierta y cerrada tocándola.\nSi está abierta, los enemigos pueden moverse y disparar a través de ella.\nOcupa múltiples casillas.
block.mender.description = Repara bloques cercanos de forma constante. Mantiene a las defensas reparadas entre oleadas. Puede usar silicio opcionalmente para mejorar el alcance y la eficiencia. block.mender.description = Repara bloques cercanos de forma constante. Mantiene a las defensas reparadas entre oleadas. Puede usar silicio opcionalmente para mejorar el alcance y la eficiencia.
block.mend-projector.description = Regenera edificios cercanos de forma constante. Ocupa multiples casillas. block.mend-projector.description = Regenera edificios cercanos de forma constante. Ocupa multiples casillas.
block.overdrive-projector.description = Aumenta la velocidad de edificios cercanos como taladros y transportadores. block.overdrive-projector.description = Aumenta la velocidad de edificios cercanos como taladros y transportadores.
@@ -1388,7 +1389,7 @@ block.pulse-conduit.description = Bloque de transporte de líquidos avanzado. Tr
block.plated-conduit.description = Mueve líquidos a la misma velocidad que los conductos de pulso, pero posee más armadura. No acepta líquidos de los lados por otra cosa que no sean conductos.\nGotea menos. block.plated-conduit.description = Mueve líquidos a la misma velocidad que los conductos de pulso, pero posee más armadura. No acepta líquidos de los lados por otra cosa que no sean conductos.\nGotea menos.
block.liquid-router.description = Acepta líquidos de una dirección y los deja en hasta 3 direcciones equitativamente. También puede almacenar cierta capacidad de líquido. Útil para dividir los líquidos de una fuente a varios objetivos. block.liquid-router.description = Acepta líquidos de una dirección y los deja en hasta 3 direcciones equitativamente. También puede almacenar cierta capacidad de líquido. Útil para dividir los líquidos de una fuente a varios objetivos.
block.liquid-tank.description = Almacena una gran cantidad de líquidos. Úsalo para crear almacenes cuando no hay una demanda constante de materiales o para asegurarse de enfriar bloques vitales. block.liquid-tank.description = Almacena una gran cantidad de líquidos. Úsalo para crear almacenes cuando no hay una demanda constante de materiales o para asegurarse de enfriar bloques vitales.
block.liquid-junction.description = Actúa como un puente para dos condusctos que se cruzan. Útil en situaciones en las que hay dos conductos con líquidos diferentes a diferentes lugares. block.liquid-junction.description = Actúa como un puente para dos conductos que se cruzan. Útil en situaciones en las que hay dos conductos con líquidos diferentes a diferentes lugares.
block.bridge-conduit.description = Bloque avanzado de transporte de líquidos. Permite transportar líquidos por encima de hasta 3 casillas de cualquier terreno o construcción. block.bridge-conduit.description = Bloque avanzado de transporte de líquidos. Permite transportar líquidos por encima de hasta 3 casillas de cualquier terreno o construcción.
block.phase-conduit.description = Bloque de transporte de líquidos avanzado. Usa energía para transportar líquidos a otro conducto de fase conectado a través de varias casillas. block.phase-conduit.description = Bloque de transporte de líquidos avanzado. Usa energía para transportar líquidos a otro conducto de fase conectado a través de varias casillas.
block.power-node.description = Transmite energía a nodos conectados, conecta hasta diez fuentes de energía, edificios que usan energía o nodos. El nodo obtendrá o transmitirá energía de cualquier bloque adyacente. block.power-node.description = Transmite energía a nodos conectados, conecta hasta diez fuentes de energía, edificios que usan energía o nodos. El nodo obtendrá o transmitirá energía de cualquier bloque adyacente.
@@ -1398,7 +1399,7 @@ block.diode.description = La energía de la batería puede fluir a través de es
block.battery.description = Guarda energía cuando hay abundancia y proporciona energía cuando hay escasez de energía mientras la batería tenga energía. block.battery.description = Guarda energía cuando hay abundancia y proporciona energía cuando hay escasez de energía mientras la batería tenga energía.
block.battery-large.description = Almacena mucha más energía que una batería normal. block.battery-large.description = Almacena mucha más energía que una batería normal.
block.combustion-generator.description = Genera energía quemando materiales inflamables o petróleo. block.combustion-generator.description = Genera energía quemando materiales inflamables o petróleo.
block.thermal-generator.description = Genera una gran cantidad de energía con la lava. block.thermal-generator.description = Genera una gran cantidad de energía con el magma.
block.steam-generator.description = Más eficiente que un generador de combustión, pero requiere agua adicional. block.steam-generator.description = Más eficiente que un generador de combustión, pero requiere agua adicional.
block.differential-generator.description = Genera grandes cantidades de energía. Utiliza la diferencia de temperatura entre el fluído criogenico y la quema de pirotita. block.differential-generator.description = Genera grandes cantidades de energía. Utiliza la diferencia de temperatura entre el fluído criogenico y la quema de pirotita.
block.rtg-generator.description = Un generador radioisótropo termoeléctrico que no necesita enfriamiento, pero proporciona menos energía que un reactor de torio. block.rtg-generator.description = Un generador radioisótropo termoeléctrico que no necesita enfriamiento, pero proporciona menos energía que un reactor de torio.
@@ -1444,7 +1445,7 @@ block.segment.description = Daña y destruye proyectiles que se acerquen. No afe
block.parallax.description = Dispara un rayo tractor que atrae enemigos aéreos, dañándolos en el proceso. block.parallax.description = Dispara un rayo tractor que atrae enemigos aéreos, dañándolos en el proceso.
block.tsunami.description = Dispara poderosos torrentes de líquido a los enemigos. También apaga fuegos automáticamente si se lo abastece con agua. block.tsunami.description = Dispara poderosos torrentes de líquido a los enemigos. También apaga fuegos automáticamente si se lo abastece con agua.
block.silicon-crucible.description = Refina silicio a partir de arena y carbón, usando pirotita como una fuente de calor adicional. Es más eficiente en lugares cálidos. block.silicon-crucible.description = Refina silicio a partir de arena y carbón, usando pirotita como una fuente de calor adicional. Es más eficiente en lugares cálidos.
block.disassembler.description = Separa magma cantidades moderadas de componentes minerales exóticos con baja eficiencia. Puede producir Torio. block.disassembler.description = Separa magma en cantidades moderadas de componentes minerales exóticos con baja eficiencia. Puede producir Torio.
block.overdrive-dome.description = Incrementa la velocidad de estructuras cercanas. Requiere Tejido de Fase y Silicio para operar. block.overdrive-dome.description = Incrementa la velocidad de estructuras cercanas. Requiere Tejido de Fase y Silicio para operar.
block.payload-conveyor.description = Mueve tanto grandes cargas, como unidades recién ensambladas de sus fábricas. block.payload-conveyor.description = Mueve tanto grandes cargas, como unidades recién ensambladas de sus fábricas.
block.payload-router.description = Divide las cargas entrantes en 3 direcciones de salida. block.payload-router.description = Divide las cargas entrantes en 3 direcciones de salida.
@@ -1487,7 +1488,7 @@ unit.zenith.description = Dispara ráfagas de misiles a enemigos cercanos.
unit.antumbra.description = Dispara un enjambre de balas a cualquer enemigo cercano. unit.antumbra.description = Dispara un enjambre de balas a cualquer enemigo cercano.
unit.eclipse.description = Dispara dos láseres perforantes y un enjambre de balas de fragmentación. unit.eclipse.description = Dispara dos láseres perforantes y un enjambre de balas de fragmentación.
unit.mono.description = Extrae cobre y plomo, y los deposita en el núcleo. unit.mono.description = Extrae cobre y plomo, y los deposita en el núcleo.
unit.poly.description = Recosntruye automáticamente estructuras dañadas y asiste a otras unidades en la construcción. unit.poly.description = Reconstruye automáticamente estructuras dañadas y asiste a otras unidades en la construcción.
unit.mega.description = Repara automáticamente estructuras dañadas. Puede llevar estructuras y unidades terrestres pequeñas. unit.mega.description = Repara automáticamente estructuras dañadas. Puede llevar estructuras y unidades terrestres pequeñas.
unit.quad.description = Suelta grandes bombas sobre objetivos terrestres, repara estructuras aliadas y daña enemigos. Puede cargar con unidades terrestres de tamaño medio. unit.quad.description = Suelta grandes bombas sobre objetivos terrestres, repara estructuras aliadas y daña enemigos. Puede cargar con unidades terrestres de tamaño medio.
unit.oct.description = Protege aliados con su escudo. Puede cargar con la mayoría de unidades terrestres. unit.oct.description = Protege aliados con su escudo. Puede cargar con la mayoría de unidades terrestres.

View File

@@ -6,7 +6,7 @@ link.discord.description = Discord officiel de Mindustry
link.reddit.description = Subreddit de Mindustry link.reddit.description = Subreddit de Mindustry
link.github.description = Code source du jeu link.github.description = Code source du jeu
link.changelog.description = Liste des mises à jour link.changelog.description = Liste des mises à jour
link.dev-builds.description = Versions expérimentale du jeu link.dev-builds.description = Versions expérimentales du jeu
link.trello.description = Trello officiel pour les nouvelles fonctionalités planifiées link.trello.description = Trello officiel pour les nouvelles fonctionalités planifiées
link.itch.io.description = Page itch.io avec les différentes versions du jeu. link.itch.io.description = Page itch.io avec les différentes versions du jeu.
link.google-play.description = Page Google Play du jeu link.google-play.description = Page Google Play du jeu
@@ -41,17 +41,20 @@ be.ignore = Ignorer
be.noupdates = Aucune mise à jour trouvée. be.noupdates = Aucune mise à jour trouvée.
be.check = Chercher des mises à jour be.check = Chercher des mises à jour
mod.featured.dialog.title = Navigateur de Mods (WIP) mods.browser = Navigateur de Mods
mods.browser.selected = Mod sélectionné mods.browser.selected = Mod sélectionné
mods.browser.add = Installer mods.browser.add = Installer
mods.github.open = Voir mods.browser.reinstall = Reinstaller
mods.github.open = Voir sur Github
mods.browser.sortdate = Classer par date
mods.browser.sortstars = Classer par étoiles
schematic = Schéma schematic = Schéma
schematic.add = Enregistrer le Schéma... schematic.add = Enregistrer le Schéma
schematics = Schémas schematics = Schémas
schematic.replace = Un schéma avec ce nom existe déjà. Voulez-vous le remplacer? schematic.replace = Un schéma avec ce nom existe déjà. Voulez-vous le remplacer?
schematic.exists = Un schéma avec ce nom existe déjà. schematic.exists = Un schéma avec ce nom existe déjà.
schematic.import = Importer un schéma... schematic.import = Importer un schéma
schematic.exportfile = Exporter le fichier schematic.exportfile = Exporter le fichier
schematic.importfile = Importer un fichier schematic.importfile = Importer un fichier
schematic.browseworkshop = Consulter le Steam Workshop schematic.browseworkshop = Consulter le Steam Workshop
@@ -63,7 +66,7 @@ schematic.saved = Schéma enregistré.
schematic.delete.confirm = Ce schéma sera supprimé définitivement. schematic.delete.confirm = Ce schéma sera supprimé définitivement.
schematic.rename = Renommer le Schéma schematic.rename = Renommer le Schéma
schematic.info = {0}x{1}, {2} blocs schematic.info = {0}x{1}, {2} blocs
schematic.disabled = [scarlet] Schémas désactivés![]\nVous n'êtes pas autorisés à utiliser des schémas sur cette [accent]cartemap[] ou ce [accent]serveur. schematic.disabled = [scarlet]Schémas désactivés![]\nVous n'êtes pas autorisés à utiliser des schémas sur cette [accent]carte[] ou dans ce [accent]serveur.
stats = Stats stats = Stats
stat.wave = Vagues vaincues:[accent] {0} stat.wave = Vagues vaincues:[accent] {0}
@@ -84,8 +87,8 @@ coreattack = [scarlet]< Le Noyau est attaqué! >
nearpoint = [[ [scarlet]QUITTEZ LE POINT D'APPARITION ENNEMI IMMÉDIATEMENT[] ]\nannihilation imminente nearpoint = [[ [scarlet]QUITTEZ LE POINT D'APPARITION ENNEMI IMMÉDIATEMENT[] ]\nannihilation imminente
database = Base de données database = Base de données
savegame = Sauvegarder la partie savegame = Sauvegarder la partie
loadgame = Charger la partie loadgame = Charger une partie
joingame = Rejoindre la partie joingame = Rejoindre une partie
customgame = Partie personnalisée customgame = Partie personnalisée
newgame = Nouvelle partie newgame = Nouvelle partie
none = <Vide> none = <Vide>
@@ -116,8 +119,10 @@ mods.none = [lightgray]Aucun Mod trouvé!
mods.guide = Guide de Modding mods.guide = Guide de Modding
mods.report = Signaler un Bug mods.report = Signaler un Bug
mods.openfolder = Ouvrir le Dossier mods.openfolder = Ouvrir le Dossier
mods.viewcontent = Voir le Contenu
mods.reload = Relancer mods.reload = Relancer
mods.reloadexit = Le jeu va se fermer pour relancer les mods. mods.reloadexit = Le jeu va se fermer pour relancer les mods.
mod.installed = [[Installé]
mod.display = [gray]Mod:[orange] {0} mod.display = [gray]Mod:[orange] {0}
mod.enabled = [lightgray]Activé mod.enabled = [lightgray]Activé
mod.disabled = [scarlet]Désactivé mod.disabled = [scarlet]Désactivé
@@ -125,7 +130,7 @@ mod.disable = Désactiver
mod.content = Contenu: mod.content = Contenu:
mod.delete.error = Impossible de supprimer le mod. Le fichier est probablement en cours d'utilisation. mod.delete.error = Impossible de supprimer le mod. Le fichier est probablement en cours d'utilisation.
mod.requiresversion = [scarlet]Version minimale du jeu requise : [accent]{0} mod.requiresversion = [scarlet]Version minimale du jeu requise : [accent]{0}
mod.outdated = [scarlet]non compatible avec la V6 (no minGameVersion: 105) mod.outdated = [scarlet]Non compatible avec la V6 (no minGameVersion: 105)
mod.missingdependencies = [scarlet]Dépendances manquantes: {0} mod.missingdependencies = [scarlet]Dépendances manquantes: {0}
mod.erroredcontent = [scarlet]Erreurs de contenu mod.erroredcontent = [scarlet]Erreurs de contenu
mod.errors = Des erreurs se sont produites lors du chargement du contenu. mod.errors = Des erreurs se sont produites lors du chargement du contenu.
@@ -137,7 +142,7 @@ mod.reloadrequired = [scarlet]Redémarrage requis
mod.import = Importer un mod mod.import = Importer un mod
mod.import.file = Importer un fichier mod.import.file = Importer un fichier
mod.import.github = Importer un mod depuis GitHub mod.import.github = Importer un mod depuis GitHub
mod.jarwarn = [scarlet]Les mods JAR sont par nature peu sûrs.[]\nFaites en sorte d'Importer ce mod depuis une source digne de confiance. mod.jarwarn = [scarlet]Les mods JAR sont par nature peu sûrs.[]\nFaites en sorte d'importer ce mod depuis une source digne de confiance.
mod.item.remove = Cet objet fait partie du mod[accent] '{0}'[]. Pour le supprimer, désinstallez le mod en question. mod.item.remove = Cet objet fait partie du mod[accent] '{0}'[]. Pour le supprimer, désinstallez le mod en question.
mod.remove.confirm = Ce mod sera supprimé. mod.remove.confirm = Ce mod sera supprimé.
mod.author = [lightgray]Auteur:[] {0} mod.author = [lightgray]Auteur:[] {0}
@@ -148,7 +153,7 @@ mod.scripts.disable = Votre appareil ne prend pas an charge les mods avec des sc
about.button = À propos about.button = À propos
name = Nom: name = Nom:
noname = Commencez par choisir un[accent] pseudo[]. noname = Commencez par choisir un[accent] nom[].
planetmap = Carte de la planète planetmap = Carte de la planète
launchcore = Lancer le Noyau launchcore = Lancer le Noyau
filename = Nom du fichier: filename = Nom du fichier:
@@ -156,8 +161,8 @@ unlocked = Nouveau contenu débloqué!
available = Nouvelle recherche disponible! available = Nouvelle recherche disponible!
completed = [accent]Complété completed = [accent]Complété
techtree = Arbre technologique techtree = Arbre technologique
research.legacy = Données de recherche de la [accent]5.0[] trouvées.\nVoulez-vous [accent]charger les données[] ou [accent]les ignorer[] et recommencer la recherche dans la nouvelle campagne? (recommandé) research.legacy = Des données de recherche de la [accent]5.0[] ont été trouvées.\nVoulez-vous [accent]charger ces données[] ou [accent]les ignorer[] et recommencer la recherche dans la nouvelle campagne? (recommandé)
research.load = Chargement research.load = Charger
research.discard = Ignorer research.discard = Ignorer
research.list = [lightgray]Recherche: research.list = [lightgray]Recherche:
research = Rechercher research = Rechercher
@@ -176,7 +181,7 @@ server.kicked.clientOutdated = Client obsolète! Mettez votre jeu à jour!
server.kicked.serverOutdated = Serveur obsolète! Demandez à l'hôte de le mettre à jour! server.kicked.serverOutdated = Serveur obsolète! Demandez à l'hôte de le mettre à jour!
server.kicked.banned = Vous avez été banni de ce serveur. server.kicked.banned = Vous avez été banni de ce serveur.
server.kicked.typeMismatch = Ce serveur n'est pas compatible avec votre version du jeu. server.kicked.typeMismatch = Ce serveur n'est pas compatible avec votre version du jeu.
server.kicked.playerLimit = Ce serveur est complet. Attendez qu'une place se libére. server.kicked.playerLimit = Ce serveur est complet. Attendez qu'une place se libère.
server.kicked.recentKick = Vous avez été expulsé récemment.\nAttendez avant de vous reconnecter. server.kicked.recentKick = Vous avez été expulsé récemment.\nAttendez avant de vous reconnecter.
server.kicked.nameInUse = Il y a déjà quelqu'un avec\nce nom sur ce serveur. server.kicked.nameInUse = Il y a déjà quelqu'un avec\nce nom sur ce serveur.
server.kicked.nameEmpty = Votre nom est invalide. server.kicked.nameEmpty = Votre nom est invalide.
@@ -203,9 +208,9 @@ servers.local = Serveurs locaux
servers.remote = Serveurs distants servers.remote = Serveurs distants
servers.global = Serveurs communautaires servers.global = Serveurs communautaires
servers.disclaimer = Les serveurs communautaires ne sont [accent]pas[] gérés ou controllés par le développeur.\n\nCes serveurs peuvent contenir du contenu qui ne convient pas à tout les âges. servers.disclaimer = Les serveurs communautaires ne sont [accent]pas[] gérés, ni controllés par le développeur.\n\nCes serveurs peuvent contenir du contenu qui ne convient pas à tout les âges.
servers.showhidden = Montrer les serveurs cachés servers.showhidden = Montrer les serveurs cachés
server.shown = Montré server.shown = Visible
server.hidden = Caché server.hidden = Caché
trace = Suivre le joueur trace = Suivre le joueur
@@ -307,6 +312,7 @@ cancelbuilding = [accent][[{0}][] pour effacer le plan
selectschematic = [accent][[{0}][] pour sélectionner+copier selectschematic = [accent][[{0}][] pour sélectionner+copier
pausebuilding = [accent][[{0}][] pour mettre la construction en pause pausebuilding = [accent][[{0}][] pour mettre la construction en pause
resumebuilding = [scarlet][[{0}][] pour reprendre la construction resumebuilding = [scarlet][[{0}][] pour reprendre la construction
enablebuilding = [scarlet][[{0}][] pour activer la construction
showui = Interface cachée.\nPressez [accent][[{0}][] pour montrer l'interface. showui = Interface cachée.\nPressez [accent][[{0}][] pour montrer l'interface.
wave = [accent]Vague {0} wave = [accent]Vague {0}
wave.cap = [accent]Vague {0}/{1} wave.cap = [accent]Vague {0}/{1}
@@ -327,9 +333,9 @@ custom = Personnalisé
builtin = Pré-fait builtin = Pré-fait
map.delete.confirm = Voulez-vous vraiment supprimer cette carte? Il n'y aura pas de retour en arrière! map.delete.confirm = Voulez-vous vraiment supprimer cette carte? Il n'y aura pas de retour en arrière!
map.random = [accent]Carte aléatoire map.random = [accent]Carte aléatoire
map.nospawn = Cette carte ne possède pas de base pour que le joueur puisse apparaître! Ajouter un [royalNoyau orange[] sur cette carte dans l'éditeur. map.nospawn = Cette carte ne possède pas de base pour que le joueur puisse apparaître! Ajouter un [accent]Noyau orange[] sur cette carte dans l'éditeur.
map.nospawn.pvp = Cette carte n'a pas de base ennemie pour qu'un joueur ennemi puisse y apparaître! Ajoutez au moins une base [scarlet] non-orange[] dans l'éditeur. map.nospawn.pvp = Cette carte n'a pas de base ennemie pour qu'un joueur ennemi puisse y apparaître! Ajoutez au moins un Noyau[scarlet] non-orange[] dans l'éditeur.
map.nospawn.attack = Cette carte n'a aucune base ennemie à attaquer! Veuillez ajouter une base[scarlet] rouge[] sur cette carte dans l'éditeur. map.nospawn.attack = Cette carte n'a aucune base ennemie à attaquer! Veuillez ajouter un Noyau[scarlet] rouge[] sur cette carte dans l'éditeur.
map.invalid = Erreur lors du chargement de la carte: carte corrompue ou invalide. map.invalid = Erreur lors du chargement de la carte: carte corrompue ou invalide.
workshop.update = Mettre à jour workshop.update = Mettre à jour
workshop.error = Erreur lors de la récupération des détails du Steam Workshop: {0} workshop.error = Erreur lors de la récupération des détails du Steam Workshop: {0}
@@ -487,7 +493,7 @@ play = Jouer
campaign = Campagne campaign = Campagne
load = Charger load = Charger
save = Sauvegarder save = Sauvegarder
fps = IPS: {0} fps = FPS: {0}
ping = Ping: {0}ms ping = Ping: {0}ms
memory = Mem: {0}mb memory = Mem: {0}mb
memory2 = Mem:\n {0}mb +\n {1}mb memory2 = Mem:\n {0}mb +\n {1}mb
@@ -601,9 +607,9 @@ sector.craters.description = Ce cratère est une relique d'anciennes guerres. De
sector.ruinousShores.description = Au-delà des déchets, se trouve le littoral. Autrefois, cet endroit abritait un réseau de défense côtière, mais il nen reste pas grand-chose. Seules quelques structures de défense basiques sont restées intactes, tout le reste a été réduit en ferraille.\nContinuez votre exploration en redécouvrant la technologie. sector.ruinousShores.description = Au-delà des déchets, se trouve le littoral. Autrefois, cet endroit abritait un réseau de défense côtière, mais il nen reste pas grand-chose. Seules quelques structures de défense basiques sont restées intactes, tout le reste a été réduit en ferraille.\nContinuez votre exploration en redécouvrant la technologie.
sector.stainedMountains.description = Plus loin, à lintérieur des terres, se trouvent des montagnes qui n'ont pas touchées par les spores.\nExploitez le Titane présent en abondance dans cette zone et apprenez comment l'utiliser.\n\nLa présence ennemie est bien plus grande ici. Ne leur donnez pas le temps denvoyer leurs unités les plus fortes. sector.stainedMountains.description = Plus loin, à lintérieur des terres, se trouvent des montagnes qui n'ont pas touchées par les spores.\nExploitez le Titane présent en abondance dans cette zone et apprenez comment l'utiliser.\n\nLa présence ennemie est bien plus grande ici. Ne leur donnez pas le temps denvoyer leurs unités les plus fortes.
sector.overgrowth.description = Étant plus proche de la source des spores, cette zone a été complètement envahie.\nL'ennemi y a établi un avant-poste. Formez des Titans et détruisez-le. sector.overgrowth.description = Étant plus proche de la source des spores, cette zone a été complètement envahie.\nL'ennemi y a établi un avant-poste. Formez des Titans et détruisez-le.
sector.tarFields.description = La périphérie dune zone de production de pétrole, situé entre les montagnes et le désert. Lune des rares avec des réserves de goudron utilisables.\nBien quabandonnée, cette zone a quelques forces ennemies dangereuses à proximité. Ne les sous-estimez pas!\n\n[lightgray]Recherchez la technologie de traitement de pétrole si possible. sector.tarFields.description = La périphérie dune zone de production de pétrole, situé entre les montagnes et le désert. Lune des rares avec des réserves de goudron utilisables.\nBien quabandonnée, quelques forces ennemies dangereuses se trouvent à proximité. Ne les sous-estimez pas!\n\n[lightgray]Recherchez la technologie de traitement de pétrole si possible.
sector.desolateRift.description = Une zone extrêmement dangereuse. Des ressources abondantes, mais peu despace. Un risque élevé de destruction donc partez dès que possible! Ne vous laissez surtout pas berner par le long temps d'attente entre les vagues ennemies. Vous risquerez de le regretter. sector.desolateRift.description = Une zone extrêmement dangereuse. Des ressources abondantes, mais peu despace. Un risque élevé de destruction donc partez dès que possible! Ne vous laissez surtout pas berner par le long temps d'attente entre les vagues ennemies. Vous risquerez de le regretter.
sector.nuclearComplex.description = Une ancienne installation de production et de traitement de thorium, réduite en ruines.\n[lightgray]Faites des recherches sur le thorium et ses nombreuses utilisations.\n\nLennemi est présent ici en grand nombre, recherchant constamment des attaquants. sector.nuclearComplex.description = Une ancienne installation de production et de traitement de thorium, réduite en ruines.\n[lightgray]Faites des recherches sur ce minerai et ses nombreuses utilisations.\n\nLennemi est présent ici en grand nombre, recherchant constamment des attaquants.
sector.fungalPass.description = Une zone de transition entre les hautes montagnes et les terres plus basses, infestées de spores. Une petite base de reconnaissance ennemie se trouve ici.\nDétruisez les 2 Noyaux ennemis en utilisant des Poingnards et des Rampeurs. sector.fungalPass.description = Une zone de transition entre les hautes montagnes et les terres plus basses, infestées de spores. Une petite base de reconnaissance ennemie se trouve ici.\nDétruisez les 2 Noyaux ennemis en utilisant des Poingnards et des Rampeurs.
sector.biomassFacility.description = Lorigine des spores. Il sagit de linstallation dans laquelle elles ont été étudiées et initialement produites.\nRecherchez la technologie présente sur les lieux et cultivez des spores pour la production de carburant et de plastique.\n\n[lightgray]Lors de la destruction de cette installation, les spores ont été libérées. Rien dans lécosystème local ne pouvait concurrencer un organisme aussi envahissant. sector.biomassFacility.description = Lorigine des spores. Il sagit de linstallation dans laquelle elles ont été étudiées et initialement produites.\nRecherchez la technologie présente sur les lieux et cultivez des spores pour la production de carburant et de plastique.\n\n[lightgray]Lors de la destruction de cette installation, les spores ont été libérées. Rien dans lécosystème local ne pouvait concurrencer un organisme aussi envahissant.
sector.windsweptIslands.description = Au delà du rivage se trouve cette chaîne dîles reculées. Les registres montrent quil y avait autrefois des usines de [accent]Plastanium[].\n\nDéfendez-vous contre les unités navales ennemies, établissez-y une base et faites des recherches sur ces usines. sector.windsweptIslands.description = Au delà du rivage se trouve cette chaîne dîles reculées. Les registres montrent quil y avait autrefois des usines de [accent]Plastanium[].\n\nDéfendez-vous contre les unités navales ennemies, établissez-y une base et faites des recherches sur ces usines.
@@ -631,17 +637,17 @@ settings.clearcampaignsaves = Supprimer la Campagne
settings.clearcampaignsaves.confirm = Êtes-vous sûr de vouloir supprimer toutes les sauvegardes de la campagne? settings.clearcampaignsaves.confirm = Êtes-vous sûr de vouloir supprimer toutes les sauvegardes de la campagne?
paused = [accent]< Pause > paused = [accent]< Pause >
clear = Effacer clear = Effacer
banned = [scarlet]Bannis banned = [scarlet]Banni
yes = Oui yes = Oui
no = Non no = Non
info.title = Info info.title = Info
error.title = [scarlet]Une erreur s'est produite error.title = [scarlet]Une erreur s'est produite
error.crashtitle = Une erreur s'est produite error.crashtitle = Une erreur s'est produite
unit.nobuild = [scarlet]Cette unité ne peut construire unit.nobuild = [scarlet]Cette unité ne peut pas construire
lastaccessed = [lightgray]Dernier accès: {0} lastaccessed = [lightgray]Dernier accès: {0}
block.unknown = [lightgray]??? block.unknown = [lightgray]???
stat.description = But stat.description = Description
stat.input = Ressource(s) requise(s) stat.input = Ressource(s) requise(s)
stat.output = Ressource(s) produite(s) stat.output = Ressource(s) produite(s)
stat.booster = Boosteur stat.booster = Boosteur
@@ -678,6 +684,7 @@ stat.drillspeed = Vitesse de forage de Base
stat.boosteffect = Effet(s) du Boost stat.boosteffect = Effet(s) du Boost
stat.maxunits = Max d'Unités Actives stat.maxunits = Max d'Unités Actives
stat.health = Santé stat.health = Santé
stat.armor = Armure
stat.buildtime = Durée de construction stat.buildtime = Durée de construction
stat.maxconsecutive = Max Consécutif stat.maxconsecutive = Max Consécutif
stat.buildcost = Coût de construction stat.buildcost = Coût de construction
@@ -693,6 +700,7 @@ stat.lightningchance = Chance d'Éclairs
stat.lightningdamage = Dégats des Éclairs stat.lightningdamage = Dégats des Éclairs
stat.flammability = Inflammabilité stat.flammability = Inflammabilité
stat.radioactivity = Radioactivité stat.radioactivity = Radioactivité
stat.charge = Charge
stat.heatcapacity = Capacité Thermique stat.heatcapacity = Capacité Thermique
stat.viscosity = Viscosité stat.viscosity = Viscosité
stat.temperature = Température stat.temperature = Température
@@ -709,7 +717,7 @@ stat.ammouse = Utilisation de munitions
ability.forcefield = Champ de Force ability.forcefield = Champ de Force
ability.repairfield = Champ de Réparation ability.repairfield = Champ de Réparation
ability.statusfield = Champ de statut ability.statusfield = Champ d'Amélioration
ability.unitspawn = Usine de {0} ability.unitspawn = Usine de {0}
ability.shieldregenfield = Champ de regénération de bouclier ability.shieldregenfield = Champ de regénération de bouclier
ability.movelightning = Déplacement éclair ability.movelightning = Déplacement éclair
@@ -736,7 +744,7 @@ bar.progress = Construction en cours
bar.input = Entrée bar.input = Entrée
bar.output = Sortie bar.output = Sortie
units.processorcontrol = [lightgray]Contrôlée par un processeur units.processorcontrol = [lightgray]Contrôlé par un processeur
bullet.damage = [stat]{0}[lightgray] dégâts 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
@@ -775,8 +783,8 @@ unit.thousands = k
unit.millions = mil unit.millions = mil
unit.billions = Md unit.billions = Md
unit.pershot = /tirs unit.pershot = /tirs
category.purpose = But category.purpose = Description
category.general = Général category.general = Caractéristiques
category.power = Énergie category.power = Énergie
category.liquids = Liquides category.liquids = Liquides
category.items = Objets category.items = Objets
@@ -788,6 +796,7 @@ setting.shadows.name = Ombres
setting.blockreplace.name = Suggestion automatique des Blocs 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.flow.name = Afficher le Débit des ressources 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
@@ -799,10 +808,10 @@ setting.indicators.name = Indicateurs ennemis
setting.autotarget.name = Visée automatique setting.autotarget.name = Visée automatique
setting.keyboard.name = Contrôles Souris+Clavier setting.keyboard.name = Contrôles Souris+Clavier
setting.touchscreen.name = Commandes d'écran tactile setting.touchscreen.name = Commandes d'écran tactile
setting.fpscap.name = Max IPS setting.fpscap.name = Max FPS
setting.fpscap.none = Illimité setting.fpscap.none = Illimité
setting.fpscap.text = {0} IPS setting.fpscap.text = {0} FPS
Échelle de l'interface[lightgray] (redémarrage du jeu nécessaire)[] setting.uiscale.name = Échelle de l'interface[lightgray] (redémarrage du jeu nécessaire)[]
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
@@ -821,7 +830,7 @@ 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être sans bords[lightgray] (peut nécessiter le redémarrage du jeu)
setting.fps.name = Afficher IPS 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
setting.pixelate.name = Pixeliser setting.pixelate.name = Pixeliser
@@ -858,7 +867,7 @@ category.blocks.name = Sélection des blocs
command.attack = Attaquer command.attack = Attaquer
command.rally = Rallier command.rally = Rallier
command.retreat = Retraite command.retreat = Retraite
command.idle = Pause command.idle = Inactif
placement.blockselectkeys = \n[lightgray]Raccourci: [{0}, placement.blockselectkeys = \n[lightgray]Raccourci: [{0},
keybind.respawn.name = Réapparaître keybind.respawn.name = Réapparaître
keybind.control.name = Controler une Unité keybind.control.name = Controler une Unité
@@ -948,6 +957,8 @@ rules.blockdamagemultiplier = Multiplicateur de Dégât des Blocs
rules.unitbuildspeedmultiplier = Multiplicateur de Vitesse de Construction des Unités rules.unitbuildspeedmultiplier = Multiplicateur de Vitesse de Construction des Unités
rules.unithealthmultiplier = Multiplicateur de Santé des Unités rules.unithealthmultiplier = Multiplicateur de Santé des Unités
rules.unitdamagemultiplier = Multiplicateur de Dégât des Unités rules.unitdamagemultiplier = Multiplicateur de Dégât des Unités
rules.unitcapvariable = Les Noyaux contribuent à la limite d'Unités actives
rules.unitcap = Limite d'Unités actives de Base
rules.enemycorebuildradius = Périmètre de Non-Construction autour du Noyau ennemi:[lightgray] (blocs) rules.enemycorebuildradius = Périmètre de Non-Construction autour du Noyau ennemi:[lightgray] (blocs)
rules.wavespacing = Temps entre les Vagues:[lightgray] (sec) rules.wavespacing = Temps entre les Vagues:[lightgray] (sec)
rules.buildcostmultiplier = Multiplicateur du prix de construction rules.buildcostmultiplier = Multiplicateur du prix de construction
@@ -1140,7 +1151,7 @@ block.router.name = Routeur
block.distributor.name = Distributeur block.distributor.name = Distributeur
block.sorter.name = Trieur block.sorter.name = Trieur
block.inverted-sorter.name = Trieur Inversé block.inverted-sorter.name = Trieur Inversé
block.message.name = Message block.message.name = Bloc de Message
block.illuminator.name = Illuminateur block.illuminator.name = Illuminateur
block.overflow-gate.name = Barrière de Débordement block.overflow-gate.name = Barrière de Débordement
block.underflow-gate.name = Barrière de Refoulement block.underflow-gate.name = Barrière de Refoulement
@@ -1249,7 +1260,7 @@ block.logic-processor.name = Processeur
block.hyper-processor.name = Hyper Processeur block.hyper-processor.name = Hyper Processeur
block.logic-display.name = Écran block.logic-display.name = Écran
block.large-logic-display.name = Grand Écran block.large-logic-display.name = Grand Écran
block.memory-cell.name = Bloc de mémoire block.memory-cell.name = Cellule de mémoire
block.memory-bank.name = Banque de mémoire block.memory-bank.name = Banque de mémoire
team.blue.name = bleu team.blue.name = bleu
@@ -1286,8 +1297,8 @@ hint.schematicSelect = Retenez [accent][[F][] pour sélectionner des blocs dans
hint.conveyorPathfind = Retenez [accent][[Ctrl-gauche][] pendant que vous placez des convoyeurs, afin de générer un chemin automatiquement. hint.conveyorPathfind = Retenez [accent][[Ctrl-gauche][] pendant que vous placez des convoyeurs, afin de générer un chemin automatiquement.
hint.conveyorPathfind.mobile = Activez le mode \ue844 [accent]Diagonale[] et déplacez des convoyeurs, afin de générer un chemin automatiquement. hint.conveyorPathfind.mobile = Activez le mode \ue844 [accent]Diagonale[] et déplacez des convoyeurs, afin de générer un chemin automatiquement.
hint.boost = Retenez [accent][[Maj-gauche][] pour voler au-dessus des obstacles avec votre unité actuelle.\n\nSeules quelques unités terrestres peuvent voler. hint.boost = Retenez [accent][[Maj-gauche][] pour voler au-dessus des obstacles avec votre unité actuelle.\n\nSeules quelques unités terrestres peuvent voler.
hint.command = Pressez [accent][[G][] pour commander les unités proches d'un [accent]type similaire[] et bouger une formation.\n\nSeules les unités terrestres peuvent controller d'autres unités terrestres. hint.command = Pressez [accent][[G][] pour commander les unités proches d'un [accent]type similaire[] et bouger en formation.\n\nSeules les unités terrestres peuvent controller d'autres unités terrestres.
hint.command.mobile = [accent][[Tapez][] 2 fois votre unité pour commander les unités proches d'un [accent]type similaire[] et bouger une formation. hint.command.mobile = [accent][[Tapez][] 2 fois votre unité pour commander les unités proches d'un [accent]type similaire[] et bouger en formation.
hint.payloadPickup = Pressez [accent][[[] pour transporter des blocs ou des unités. hint.payloadPickup = Pressez [accent][[[] pour transporter des blocs ou des unités.
hint.payloadPickup.mobile = [accent]Tapez et retenez[] votre doigt pour transporter des blocs ou des unités. hint.payloadPickup.mobile = [accent]Tapez et retenez[] votre doigt pour transporter des blocs ou des unités.
hint.payloadDrop = Pressez [accent]][] pour larguer votre chargement. hint.payloadDrop = Pressez [accent]][] pour larguer votre chargement.
@@ -1363,8 +1374,8 @@ block.thorium-wall.description = Un bloc défensif puissant.\nProcure une très
block.thorium-wall-large.description = Un bloc défensif puissant.\nProcure une très bonne protection contre les attaques ennemies. block.thorium-wall-large.description = Un bloc défensif puissant.\nProcure une très bonne protection contre les attaques ennemies.
block.phase-wall.description = Ce mur est moins puissant qu'un mur en thorium, mais il peut dévier les balles, sauf si elles sont trop puissantes. block.phase-wall.description = Ce mur est moins puissant qu'un mur en thorium, mais il peut dévier les balles, sauf si elles sont trop puissantes.
block.phase-wall-large.description = Ce mur est moins puissant qu'un mur en thorium, mais il peut dévier les balles, sauf si elles sont trop puissantes. block.phase-wall-large.description = Ce mur est moins puissant qu'un mur en thorium, mais il peut dévier les balles, sauf si elles sont trop puissantes.
block.surge-wall.description = Le plus puissant bloc défensif.\nA une faible chance de créer des éclairs vers les ennemis. block.surge-wall.description = Le plus puissant bloc défensif.\nA une faible chance d'envoyer des éclairs vers les ennemis.
block.surge-wall-large.description = Le plus puissant bloc défensif.\nA une faible chance de créer des éclairs vers les ennemis. block.surge-wall-large.description = Le plus puissant bloc défensif.\nA une faible chance d'envoyer des éclairs vers les ennemis.
block.door.description = Une petite porte pouvant être ouverte et fermée en appuyant dessus.\nSi elle est ouverte, les ennemis peuvent passer à travers. block.door.description = Une petite porte pouvant être ouverte et fermée en appuyant dessus.\nSi elle est ouverte, les ennemis peuvent passer à travers.
block.door-large.description = Une grande porte pouvant être ouverte et fermée en appuyant dessus.\nSi elle est ouverte, les ennemis peuvent passer à travers. block.door-large.description = Une grande porte pouvant être ouverte et fermée en appuyant dessus.\nSi elle est ouverte, les ennemis peuvent passer à travers.
block.mender.description = Soigne périodiquement les bâtiments autour de lui, ce qui permet de remettre les défenses en bon état entre les vagues ennemies.\nPeut utiliser du silicium pour booster la portée et l'efficacité. block.mender.description = Soigne périodiquement les bâtiments autour de lui, ce qui permet de remettre les défenses en bon état entre les vagues ennemies.\nPeut utiliser du silicium pour booster la portée et l'efficacité.
@@ -1374,7 +1385,7 @@ block.force-projector.description = Crée un champ de force hexagonal autour de
block.shock-mine.description = Blesse les ennemis qui marchent dessus. block.shock-mine.description = Blesse les ennemis qui marchent dessus.
block.conveyor.description = Convoyeur basique servant à transporter des objets. Les objets déplacés en avant sont automatiquement déposés dans les tourelles ou les bâtiments. Peut être tourné. block.conveyor.description = Convoyeur basique servant à transporter des objets. Les objets déplacés en avant sont automatiquement déposés dans les tourelles ou les bâtiments. Peut être tourné.
block.titanium-conveyor.description = Convoyeur avancé. Déplace les objets plus rapidement que les convoyeurs standards. block.titanium-conveyor.description = Convoyeur avancé. Déplace les objets plus rapidement que les convoyeurs standards.
block.plastanium-conveyor.description = Convoyeur transportant les ressources par paquets. Accepte les ressources par derrière et les déchargent par 3 directions à l'avant. Pour une efficacité maximale, utilisez plusieurs points de chargement et de déchargement pour une même ligne. block.plastanium-conveyor.description = Convoyeur transportant les ressources par paquets. Accepte les ressources par derrière et les décharge par 3 directions à l'avant. Pour une efficacité maximale, utilisez plusieurs points de chargement et de déchargement pour une même ligne.
block.junction.description = Agit comme un pont pour deux lignes de convoyeurs se croisant. Utile lorsque deux lignes de convoyeurs différentes déplacent différents matériaux à différents endroits. block.junction.description = Agit comme un pont pour deux lignes de convoyeurs se croisant. Utile lorsque deux lignes de convoyeurs différentes déplacent différents matériaux à différents endroits.
block.bridge-conveyor.description = Bloc de transport avancé permettant de traverser jusqu'à 3 blocs, au-dessus de n'importe quel terrain ou bâtiment. block.bridge-conveyor.description = Bloc de transport avancé permettant de traverser jusqu'à 3 blocs, au-dessus de n'importe quel terrain ou bâtiment.
block.phase-conveyor.description = Convoyeur très avancé. Utilise de l'énergie pour téléporter des objets à un autre convoyeur phasé. Possède une longue portée. block.phase-conveyor.description = Convoyeur très avancé. Utilise de l'énergie pour téléporter des objets à un autre convoyeur phasé. Possède une longue portée.
@@ -1393,13 +1404,13 @@ block.conduit.description = Bloc de transport de liquide de base, faisant avance
block.pulse-conduit.description = Conduit avancé permettant le transport de liquide. Transporte les liquides plus rapidement et en stocke plus que les conduits standards. block.pulse-conduit.description = Conduit avancé permettant le transport de liquide. Transporte les liquides plus rapidement et en stocke plus que les conduits standards.
block.plated-conduit.description = Déplace les liquides au même rythme que les conduits à impulsion, mais est renforcé et empêche les fuites en cas de rupture. N'accepte pas les liquides provenant des côtés, seuls les autres conduits peuvent le faire. block.plated-conduit.description = Déplace les liquides au même rythme que les conduits à impulsion, mais est renforcé et empêche les fuites en cas de rupture. N'accepte pas les liquides provenant des côtés, seuls les autres conduits peuvent le faire.
block.liquid-router.description = Accepte les liquides depuis une direction et les distribue jusqu'à 3 directions équitablement. Utile pour envoyer un liquide à plusieurs endroits. Peut aussi stocker une certaine quantité de liquide. block.liquid-router.description = Accepte les liquides depuis une direction et les distribue jusqu'à 3 directions équitablement. Utile pour envoyer un liquide à plusieurs endroits. Peut aussi stocker une certaine quantité de liquide.
block.liquid-tank.description = Stocke une grande quantité de liquide et peut les distribuer dans tous les côtés, un peu comme un routeur liquide.\nUtile pour réguler la sortie quand la demande en liquide si elle est inconstante ou comme sécurité pour refroidir des bâtiments importants. block.liquid-tank.description = Stocke une grande quantité de liquide et peut les distribuer dans tous les côtés, un peu comme un routeur liquide.\nUtile pour réguler la demande en liquide si elle est inconstante ou comme sécurité pour refroidir des bâtiments importants.
block.liquid-junction.description = Agit comme un pont pour deux conduits se croisant. Utile si deux conduits amènent différents liquides à différents endroits. block.liquid-junction.description = Agit comme un pont pour deux conduits se croisant. Utile si deux conduits amènent différents liquides à différents endroits.
block.bridge-conduit.description = Bloc de transport de liquide avancé permettant de traverser jusqu'à 3 blocs, au-dessus de n'importe quel terrain ou bâtiment. block.bridge-conduit.description = Bloc de transport de liquide avancé permettant de traverser jusqu'à 3 blocs, au-dessus de n'importe quel terrain ou bâtiment.
block.phase-conduit.description = Conduit très avancé permettant le transport de liquide. Utilise de l'énergie pour téléporter les liquides à un autre conduit phasé sur une longue distance. block.phase-conduit.description = Conduit très avancé permettant le transport de liquide. Utilise de l'énergie pour téléporter les liquides à un autre conduit phasé sur une longue distance.
block.power-node.description = Transmet de l'énergie aux autres transmetteurs énergétiques connectés. Le transmetteur recevra de l'énergie ou la transmettra à n'importe quel bâtiment adjacent. La connexion peut être activée/désactivée manuellement. block.power-node.description = Transmet de l'énergie aux autres transmetteurs énergétiques connectés. Le transmetteur recevra de l'énergie ou la transmettra à n'importe quel bâtiment adjacent. La connexion peut être activée/désactivée manuellement.
block.power-node-large.description = Ce transmetteur possède un rayon plus grand que le transmetteur énergétique standard. Il peut aussi accepter plus de connexions. block.power-node-large.description = Ce transmetteur possède un rayon plus grand que le transmetteur énergétique standard. Il peut aussi accepter plus de connexions.
block.surge-tower.description = Un transmetteur énergétique de très grande portée mais avec moins de connections disponibles. block.surge-tower.description = Un transmetteur énergétique à très grande portée mais avec moins de connections disponibles.
block.diode.description = L'énergie ne circule que dans un sens à travers ce bloc, et uniquement si lautre côté présente moins dénergie en stock. Idéal pour protéger les lieux de production d'énergie. block.diode.description = L'énergie ne circule que dans un sens à travers ce bloc, et uniquement si lautre côté présente moins dénergie en stock. Idéal pour protéger les lieux de production d'énergie.
block.battery.description = Stocke le surplus d'énergie et le redistribue en cas de besoin. block.battery.description = Stocke le surplus d'énergie et le redistribue en cas de besoin.
block.battery-large.description = Stocke bien plus d'énergie qu'une batterie normale. block.battery-large.description = Stocke bien plus d'énergie qu'une batterie normale.
@@ -1418,7 +1429,7 @@ block.laser-drill.description = Permet de forer bien plus vite grâce à la tech
block.blast-drill.description = La Foreuse ultime. Demande une grande quantité d'énergie pour fonctionner. block.blast-drill.description = La Foreuse ultime. Demande une grande quantité d'énergie pour fonctionner.
block.water-extractor.description = Extrait l'eau des nappes phréatiques. Utile quand il n'y a pas d'étendue d'eau à proximité. block.water-extractor.description = Extrait l'eau des nappes phréatiques. Utile quand il n'y a pas d'étendue d'eau à proximité.
block.cultivator.description = Cultive une petite quantité de spores atmosphériques afin de former des bulbes sporifères. block.cultivator.description = Cultive une petite quantité de spores atmosphériques afin de former des bulbes sporifères.
block.cultivator.details = Technologie de récupération. Utilisée pour produire des quantités massives de biomasse aussi efficacement que possible. Probablement lincubateur initial des spores qui couvrent maintenant Serpulo. block.cultivator.details = Technologie de récupération. Utilisée pour produire des quantités massives de biomasse aussi efficacement que possible. Probablement lincubateur initial des spores, qui couvrent maintenant Serpulo.
block.oil-extractor.description = Utilise de grandes quantités d'énergie pour extraire le pétrole du sable. Utilisez-le lorsqu'il n'y a pas de source directe de pétrole à proximité. block.oil-extractor.description = Utilise de grandes quantités d'énergie pour extraire le pétrole du sable. Utilisez-le lorsqu'il n'y a pas de source directe de pétrole à proximité.
block.core-shard.description = Le coeur de votre base. Une fois détruit, le secteur est perdu. Ne laissez pas cela arriver. block.core-shard.description = Le coeur de votre base. Une fois détruit, le secteur est perdu. Ne laissez pas cela arriver.
block.core-shard.details = La première version du Noyau. Il est compact, doté d'un module d'auto-réplication et est équippé de propulseurs de lancement à usage unique. Equipped with single-use launch thrusters. Ceux-ci n'ont pas été conçus pour le voyage interplanétaire. block.core-shard.details = La première version du Noyau. Il est compact, doté d'un module d'auto-réplication et est équippé de propulseurs de lancement à usage unique. Equipped with single-use launch thrusters. Ceux-ci n'ont pas été conçus pour le voyage interplanétaire.
@@ -1445,7 +1456,7 @@ block.cyclone.description = Une grande tourelle qui tire rapidement des balles e
block.spectre.description = Une tourelle massive à double cannon qui tire de puissantes balles perçantes. block.spectre.description = Une tourelle massive à double cannon qui tire de puissantes balles perçantes.
block.meltdown.description = Une tourelle massive chargeant et tirant de puissants rayons lasers. Nécessite un liquide de refroidissement. block.meltdown.description = Une tourelle massive chargeant et tirant de puissants rayons lasers. Nécessite un liquide de refroidissement.
block.foreshadow.description = Une tourelle massive tirant une puissante balle sur une cible, sur de très longues distances. Elle vise les unités ayant le plus de santé en priorité. block.foreshadow.description = Une tourelle massive tirant une puissante balle sur une cible, sur de très longues distances. Elle vise les unités ayant le plus de santé en priorité.
block.repair-point.description = Soigne en permanence l'unité endommagée la plus proche à proximité. 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 aux ennemis. Peut éteindre les incendies automatiquement si elle est alimentée en eau.
@@ -1453,7 +1464,7 @@ block.silicon-crucible.description = Raffine du silicium avec du sable et du cha
block.disassembler.description = Cette verion avancée du séparateur peut produire du thorium. block.disassembler.description = Cette verion 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.
block.payload-conveyor.description = Ce grand convoyeur peut déplacer de gros chargements, comme des unité depuis leurs usines ou bien des conteneurs. block.payload-conveyor.description = Ce grand convoyeur peut déplacer de gros chargements, comme des unité depuis leurs usines ou bien des conteneurs.
block.payload-router.description = Distribue les chargements qui entrent dans 3 directions différentes. block.payload-router.description = Distribue les chargements qui entrent jusqu'à 3 directions différentes.
block.command-center.description = Contrôle le comportement des unités avec plusieurs commandes différentes. block.command-center.description = Contrôle le comportement des unités avec plusieurs commandes différentes.
block.ground-factory.description = Produit des unités terrestres. Elles peuvent être soit utilisées directement, soit envoyées vers des reconstructeurs pour être améliorées. block.ground-factory.description = Produit des unités terrestres. Elles peuvent être soit utilisées directement, soit envoyées vers des reconstructeurs pour être améliorées.
block.air-factory.description = Produit des unités aériennes. Elles peuvent être soit utilisées directement, soit envoyées vers des reconstructeurs pour être améliorées. block.air-factory.description = Produit des unités aériennes. Elles peuvent être soit utilisées directement, soit envoyées vers des reconstructeurs pour être améliorées.
@@ -1479,21 +1490,21 @@ unit.scepter.description = Tire un barrage de balles superchargées aux ennemis
unit.reign.description = Tire un barrage de grosses balles perçantes aux ennemis proches. unit.reign.description = Tire un barrage de grosses balles perçantes aux ennemis proches.
unit.nova.description = Tire des balles laser qui infligent des dégâts aux ennemis et réparent les structures alliées. Est capable de voler. unit.nova.description = Tire des balles laser qui infligent des dégâts aux ennemis et réparent les structures alliées. Est capable de voler.
unit.pulsar.description = Tire des arcs électriques qui infligent des dégâts aux ennemis et réparent les structures alliées. Est capable de voler. unit.pulsar.description = Tire des arcs électriques qui infligent des dégâts aux ennemis et réparent les structures alliées. Est capable de voler.
unit.quasar.description = Tire des faisceaux laser qui infligent des dégâts aux ennemis et réparent les structures alliées. Est capable de voler et est dotée d'un champ de force. unit.quasar.description = Tire des faisceaux laser qui infligent des dégâts aux ennemis et réparent les structures alliées. Est capable de voler et est doté d'un champ de force.
unit.vela.description = Tire un rayon laser continu qui inflige des dégâts aux ennemis, cause des incendies aux structures ennemies et répare les structures alliées. Est capable de voler. unit.vela.description = Tire un rayon laser continu qui inflige des dégâts aux ennemis, cause des incendies aux structures ennemies et répare les structures alliées. Est capable de voler.
unit.corvus.description = Tire un rayon laser massif qui inflige des dégâts aux ennemis et répare les structures alliées. Peut marcher sur de la plupart des terrains. unit.corvus.description = Tire un rayon laser massif qui inflige des dégâts aux ennemis et répare les structures alliées. Peut marcher sur la plupart des terrains.
unit.crawler.description = Court vers un ennemi proche pour s'auto-détruire, causant une large explosion. unit.crawler.description = Court vers un ennemi proche pour s'auto-détruire, causant une large explosion.
unit.atrax.description = Tire des orbes débilitants de scories sur des cibles terrestres. Peut marcher sur de la plupart des terrains. unit.atrax.description = Tire des orbes débilitants de scories sur des cibles terrestres. Peut marcher sur la plupart des terrains.
unit.spiroct.description = Tire des faisceaux laser sapants aux ennemis proches, le réparant aussi. Peut marcher sur de la plupart des terrains. unit.spiroct.description = Tire des faisceaux laser sapants aux ennemis proches, le réparant aussi. Peut marcher sur la plupart des terrains.
unit.arkyid.description = Tire de larges faisceaux laser sapants aux ennemis proches, le réparant aussi. Peut marcher sur de la plupart des terrains. unit.arkyid.description = Tire de larges faisceaux laser sapants aux ennemis proches, le réparant aussi. Peut marcher sur la plupart des terrains.
unit.toxopid.description = Tire de larges obus électriques et des lasers perçants aux ennemis proches. Peut marcher sur de la plupart des terrains. unit.toxopid.description = Tire de larges obus électriques et des lasers perçants aux ennemis proches. Peut marcher sur la plupart des terrains.
unit.flare.description = Tire des balles normales cibles terrestres. unit.flare.description = Tire des balles normales aux cibles terrestres.
unit.horizon.description = Largue des bombes sur des cibles terrestres. unit.horizon.description = Largue des bombes sur des cibles terrestres.
unit.zenith.description = Tire des salves de missiles sur les ennemis proches. unit.zenith.description = Tire des salves de missiles sur les ennemis proches.
unit.antumbra.description = Tire un barrage de balles aux ennemis proches. unit.antumbra.description = Tire un barrage de balles aux ennemis proches.
unit.eclipse.description = Tire 2 lasers perçants et un barrage de balles explosives aux ennemis proches. unit.eclipse.description = Tire 2 lasers perçants et un barrage de balles explosives aux ennemis proches.
unit.mono.description = Mine automatiquement du cuivre et du plomb et le dépose dans un Noyau proche. unit.mono.description = Mine automatiquement du cuivre et du plomb et le dépose dans un Noyau proche.
unit.poly.description = Reconstruit automatiquement les structures détruites (sauf les réacteurs au thorium) et assiste les autres unités lorsqu'elles construisent. unit.poly.description = Reconstruit automatiquement les structures détruites (sauf les réacteurs à thorium) et assiste les autres unités lorsqu'elles construisent.
unit.mega.description = Répare automatiquement les structures endommagées. Capable de transporter des blocs et de petites unités terrestres. unit.mega.description = Répare automatiquement les structures endommagées. Capable de transporter des blocs et de petites unités terrestres.
unit.quad.description = Largue de grosses bombes sur des cibles terrestres, réparant les structures alliées et infligeant des dégâts aux ennemis. Capable de transporter des blocs et des unités terrestres de taille moyenne. unit.quad.description = Largue de grosses bombes sur des cibles terrestres, réparant les structures alliées et infligeant des dégâts aux ennemis. Capable de transporter des blocs et des unités terrestres de taille moyenne.
unit.oct.description = Protège les alliés proches avec son champ de force auto-regénérant. Capable de transporter des blocs et de grosses unités terrestres. unit.oct.description = Protège les alliés proches avec son champ de force auto-regénérant. Capable de transporter des blocs et de grosses unités terrestres.
@@ -1505,3 +1516,139 @@ 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.
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.print = Ajoute du texte dans la mémoire tampon de l'imprimante.\nNe montrera aucun texte tant que [accent]Print Flush[] ne sera pas utilisé.
lst.draw = Ajoute une opération dans la mémoire tampon de dessin.\nNe montrera aucune image tant que [accent]Draw Flush[] ne sera pas utilisé.
lst.drawflush = Affiche les opérations [accent]Draw[] en file d'attente vers un écran.
lst.printflush = Affiche les opérations [accent]Print[] en file d'attente vers un bloc de message.
lst.getlink = Obtient un lien de processeur par index. Commence à 0.
lst.control = Contrôle un bâtiment.
lst.radar = Localise des unités dans la portée d'un bâtiment.
lst.sensor = Récupère des données depuis un bâtiment ou une unité.
lst.set = Définit une variable.
lst.operation = Éffectue une opération sur 1 ou 2 variables.
lst.end = Saute au sommet de la série dinstructions.
lst.jump = Saute conditionnelement vers une autre instruction.
lst.unitbind = Se lie à une unité du type donné et la stocke dans [accent]@unit[].
lst.unitcontrol = Contrôle l'unité actuellement liée.
lst.unitradar = Localise des unités dans la portée de l'unité actuellement liée.
lst.unitlocate = Localise une position ou un type spécifique de bâtiment, n'importe où sur la carte.\nRequiert une unité reliée.
lenum.type = Type de bâtiment/unité.\nPar exemple, pour tout routeur, cela retournera [accent]@router[].\nPas en texte.
lenum.shoot = Tire à une position donnée.
lenum.shootp = Tire à une unité/bâtiment avec la prédiction de mouvement.
lenum.configure = La configuration d'un bâtiment. Par exemple, l'objet sélectionné dans un trieur.
lenum.enabled = Retourne si le bloc est activé ou pas.
laccess.color = La couleur d'un illuminateur.
graphicstype.clear = Remplit lécran dune couleur.
graphicstype.color = Définit une couleur pour les prochaines opérations de dessin.
graphicstype.stroke = Définit la largeur d'une ligne.
graphicstype.line = Dessine un segment de droite.
graphicstype.rect = Dessine un rectangle.
graphicstype.linerect = Dessine le contour d'un rectangle.
graphicstype.poly = Dessine un polygone régulier.
graphicstype.linepoly = Dessine le contour un polygone régulier.
graphicstype.triangle = Dessine un triangle.
graphicstype.image = Dessine une image venant du contenu du jeu.\nex: [accent]@router[] ou [accent]@dagger[].
lenum.always = Toujours [accent]true[].
lenum.idiv = Division entière.
lenum.div = Division.\nRetourne [accent]null[] lors d'une division par zéro.
lenum.mod = Modulo.
lenum.equal = Égalité. Conversion des types.\nLes objets non-nuls comparés avec des nombres deviennent 1, sinon 0.
lenum.notequal = Inégalité. Conversion des types.
lenum.strictequal = Égalité stricte. Ne convertit pas les types.\nPeut être utilisé pour vérifier les valeurs [accent]null[].
lenum.shl = Décalage de bits gauche.
lenum.shr = Décalage de bits droite.
lenum.or = Opération binaire OR.
lenum.land = Opération logique AND.
lenum.and = Opération binaire AND.
lenum.not = Opération binaire flip.
lenum.xor = Opération binaire XOR.
lenum.min = Le minimum des 2 nombres.
lenum.max = Le maximum des 2 nombres.
lenum.angle = Angle d'un vecteur en degrés.
lenum.len = Longueur d'un vecteur.
lenum.sin = Sinus, en degrés.
lenum.cos = Cosinus, en degrés.
lenum.tan = Tangente, en degrés.
#not a typo, look up 'range notation'
lenum.rand = Nombre aléatoire dans la plage [0, valeur].
lenum.log = Logarithme naturel (ln).
lenum.log10 = Logarithme de base 10.
lenum.noise = Bruit simplex 2D.
lenum.abs = Valeur absolue.
lenum.sqrt = Racine carrée.
lenum.any = N'importe quelle unité.
lenum.ally = Unité alliée.
lenum.attacker = Unité avec des armes.
lenum.enemy = Unité ennemie.
lenum.boss = Gardien.
lenum.flying = Unité volante.
lenum.ground = Unité terrestre.
lenum.player = Unité controllée par un joueur.
lenum.ore = Gisement de minerai.
lenum.damaged = Bâtiments alliés endommagés.
lenum.spawn = Point d'apparition ennemi.\nPeut être un noyau ou une position.
lenum.building = Bâtiment dans un groupe spécifique.
lenum.core = N'importe quel noyau.
lenum.storage = Bâtiments de stockage, un coffre-fort par exemple.
lenum.generator = Bâtiments générant de l'énergie.
lenum.factory = Bâtiments traitant des ressources.
lenum.repair = Points de réparation.
lenum.rally = Centres de commandes.
lenum.battery = N'importe quelle batterie.
lenum.resupply = Points de rechargement.\nUtile seulement lorsque [accent]"munitions"[] sont limitées.
lenum.reactor = Réacteur à Impact/Thorium.
lenum.turret = N'importe quelle tourelle.
sensor.in = Les bâtiments/unités à analyser.
radar.from = Bâtiment de détection.\nLa portée du détecteur est limitée à la portée du bâtiment.
radar.target = Filtre pour les unités à détecter.
radar.and = Filtres additionnels
radar.order = Ordre de filtrage. 0 pour inverser.
radar.sort = Valeur par laquelle les résultats sont triés.
radar.output = Variable dans laquelle écrire l'unité retournée.
unitradar.target = Filtre pour les unités à détecter.
unitradar.and = Filtres additionnels
unitradar.order = Ordre de filtrage. 0 pour inverser.
unitradar.sort = Valeur par laquelle les résultats sont triés.
unitradar.output = Variable dans laquelle écrire l'unité retournée.
control.of = Bâtiment à contrôler.
control.unit = Unité/bâtiment à viser.
control.shoot = Sil faut tirer ou non.
unitlocate.enemy = S'il faut détecter les bâtiments ennemis au non.
unitlocate.found = Retourne un boolean s'il l'objet a été trouvé ou non.
unitlocate.building = Retourne une variable pour le bâtiment localisé.
unitlocate.outx = Retourne la coordonnée X.
unitlocate.outy = Retourne la coordonnée Y.
unitlocate.group = Le groupe de bâtiments à rechercher.
lenum.stop = Empêche l'unité de bouger/miner/construire.
lenum.move = Bouge vers la position exacte.
lenum.approach = Approche une position avec un rayon.
lenum.pathfind = Détermine un itinéraire et bouge vers le point d'apparition ennemi.
lenum.target = Tire vers la position donnée.
lenum.targetp = Tire sur un cible avec la prédiction de mouvement.
lenum.itemdrop = Lâche un objet.
lenum.itemtake = Prend un objet depuis un bâtiment.
lenum.paydrop = Lâche le chargement actuel.
lenum.paytake = Prend un chargement à la position actuelle.
lenum.flag = Drapeau numérique d'une unité.
lenum.mine = Mine à une position donnée.
lenum.build = Construit une structure.
lenum.getblock = Récupère des données sur un bâtiment et son type aux coordonnées données.\nL'unité doit se trouver dans la portée de la position.\nLes blocs solides qui ne sont pas des bâtiments auront le type [accent]@solid[].
lenum.within = Vérifie si l'unité est près de la position.
lenum.boost = Active/Désactive le boost.

View File

@@ -4,10 +4,10 @@ contributors = 번역가와 기여자
discord = Mindustry Discord 서버에 가입하세요! discord = Mindustry Discord 서버에 가입하세요!
link.discord.description = Mindustry Discord 공식 대화방 link.discord.description = Mindustry Discord 공식 대화방
link.reddit.description = Mindustry 서브레딧 link.reddit.description = Mindustry 서브레딧
link.github.description = Mindustry 개발 홈페이지 link.github.description = Mindustry 소스코드
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 = PC 다운로드가 있는 itch.io 페이지 link.itch.io.description = PC 다운로드가 있는 itch.io 페이지
link.google-play.description = Google Play 스토어 목록 link.google-play.description = Google Play 스토어 목록
link.f-droid.description = F-Droid 카탈로그 목록 link.f-droid.description = F-Droid 카탈로그 목록
@@ -22,7 +22,7 @@ gameover.disconnect = 연결 끊기
gameover.pvp = [accent]{0}[] 팀이 승리했습니다! gameover.pvp = [accent]{0}[] 팀이 승리했습니다!
gameover.waiting = [accent]다음 맵 기다리는 중... gameover.waiting = [accent]다음 맵 기다리는 중...
highscore = [accent]새로운 최고 점수! highscore = [accent]새로운 최고 점수!
copied = 복사 copied = 복사됨.
indev.notready = 이 부분은 아직 준비되지 않았습니다. indev.notready = 이 부분은 아직 준비되지 않았습니다.
indev.campaign = [accent]당신은 캠페인의 끝에 도달했습니다![]\n\n이것으로 캠페인에 있는 대부분의 콘텐츠는 끝났으며, 행성 간 여행은 향후 업데이트에 추가될 예정입니다. indev.campaign = [accent]당신은 캠페인의 끝에 도달했습니다![]\n\n이것으로 캠페인에 있는 대부분의 콘텐츠는 끝났으며, 행성 간 여행은 향후 업데이트에 추가될 예정입니다.
@@ -41,10 +41,11 @@ be.ignore = 무시
be.noupdates = 업데이트가 없습니다. be.noupdates = 업데이트가 없습니다.
be.check = 업데이트 확인 be.check = 업데이트 확인
mod.featured.dialog.title = 모드 탐색 (WIP) 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.sortdate = 최근 업데이트
mods.browser.sortstars = 추천(스타) 수 mods.browser.sortstars = 추천(스타) 수
@@ -56,7 +57,7 @@ schematic.exists = 해당 이름의 설계도가 이미 존재합니다.
schematic.import = 설계도 가져오기 schematic.import = 설계도 가져오기
schematic.exportfile = 파일 내보내기 schematic.exportfile = 파일 내보내기
schematic.importfile = 파일 가져오기 schematic.importfile = 파일 가져오기
schematic.browseworkshop = 창작마당 검색 schematic.browseworkshop = 창작마당 검색
schematic.copy = 클립 보드에 복사 schematic.copy = 클립 보드에 복사
schematic.copy.import = 클립 보드에서 가져오기 schematic.copy.import = 클립 보드에서 가져오기
schematic.shareworkshop = 창작마당에 공유 schematic.shareworkshop = 창작마당에 공유
@@ -118,8 +119,10 @@ mods.none = [lightgray]모드를 찾을 수 없습니다!
mods.guide = 모드 제작 가이드 mods.guide = 모드 제작 가이드
mods.report = 버그 제보하기 mods.report = 버그 제보하기
mods.openfolder = 폴더 열기 mods.openfolder = 폴더 열기
mods.viewcontent = 콘텐츠 보기
mods.reload = 새로 고침 mods.reload = 새로 고침
mods.reloadexit = 게임이 종료된 후 모드를 불러올 것입니다. mods.reloadexit = 게임이 종료된 후 모드를 불러올 것입니다.
mod.installed = [[설치됨]
mod.display = [gray]모드:[orange] {0} mod.display = [gray]모드:[orange] {0}
mod.enabled = [lightgray]활성화됨 mod.enabled = [lightgray]활성화됨
mod.disabled = [scarlet]비활성화됨 mod.disabled = [scarlet]비활성화됨
@@ -127,7 +130,7 @@ 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]V6 버전과 호환되지 않음 (minGameVersion 105 이하인 모드는 사용할 수 없습니다.) mod.outdated = [scarlet]V6 버전과 호환되지 않음 (minGameVersion: 105 이상이 아님)
mod.missingdependencies = [scarlet]누락된 필요 모드: {0} mod.missingdependencies = [scarlet]누락된 필요 모드: {0}
mod.erroredcontent = [scarlet]콘텐츠 오류 mod.erroredcontent = [scarlet]콘텐츠 오류
mod.errors = 콘텐츠를 불러오는 중에 오류가 발생함. mod.errors = 콘텐츠를 불러오는 중에 오류가 발생함.
@@ -139,8 +142,8 @@ mod.reloadrequired = [scarlet]재시작 필요
mod.import = 모드 가져오기 mod.import = 모드 가져오기
mod.import.file = 파일 가져오기 mod.import.file = 파일 가져오기
mod.import.github = Github 에서 모드 가져오기 mod.import.github = Github 에서 모드 가져오기
mod.jarwarn = [scarlet]JAR 모드는 안전하지 않습니다.[]\n신뢰할 수 있는 모드 개발자에게서 얻은 모드만을 사용해야 합니다! mod.jarwarn = [scarlet]JAR 모드는 안전하지 않습니다.[]\n신뢰할 수 있는 개발자에게서 얻은 모드만을 사용해야 합니다!
mod.item.remove = 자원은[accent] '{0}' 모드의 일부입니다. 이를 제거하려면 해당 모드를 제거하세요. mod.item.remove = 아이템은[accent] '{0}' 모드의 일부입니다. 이를 제거하려면 해당 모드를 제거하세요.
mod.remove.confirm = 이 모드가 삭제될 것입니다. mod.remove.confirm = 이 모드가 삭제될 것입니다.
mod.author = [lightgray]제작자:[] {0} mod.author = [lightgray]제작자:[] {0}
mod.missing = 이 저장 파일에는 최근에 업데이트되었거나 현재 기기에 설치되지 않은 모드가 포함되어 있습니다. 저장 파일이 손상될 수 있습니다. 정말로 불러오시겠습니까?\n[lightgray]모드들:\n{0} mod.missing = 이 저장 파일에는 최근에 업데이트되었거나 현재 기기에 설치되지 않은 모드가 포함되어 있습니다. 저장 파일이 손상될 수 있습니다. 정말로 불러오시겠습니까?\n[lightgray]모드들:\n{0}
@@ -150,7 +153,7 @@ mod.scripts.disable = 이 기기는 스크립트가 있는 모드를 지원하
about.button = 정보 about.button = 정보
name = 닉네임 : name = 닉네임 :
noname = 먼저 [accent]닉네임[]을 설정하세요. noname = 먼저 [accent]플레이어 이름[]을 설정하세요.
planetmap = 행성 지도 planetmap = 행성 지도
launchcore = 코어 출격 launchcore = 코어 출격
filename = 파일 이름: filename = 파일 이름:
@@ -173,17 +176,17 @@ 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 = 당신은 이미 이 서버에 있습니다! 두 개의 계정으로 연결하는 건 허용되지 않습니다.
server.kicked.customClient = 이 서버는 사용자 정의 빌드를 지원하지 않습니다. 공식 버전을 다운로드 하세요. server.kicked.customClient = 이 서버는 사용자 정의 빌드를 지원하지 않습니다. 공식 버전을 내려받으세요.
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}[]
@@ -206,7 +209,7 @@ servers.remote = 원격 서버
servers.global = 커뮤니티 서버 servers.global = 커뮤니티 서버
servers.disclaimer = 커뮤니티 서버는 개발자가 소유하거나 제어하지 [accent]않습니다[].\n\n서버들은 전연령대에 적합하지 않은 사용자 지정 콘텐츠를 보유할 수도 있습니다. servers.disclaimer = 커뮤니티 서버는 개발자가 소유하거나 제어하지 [accent]않습니다[].\n\n서버들은 전연령대에 적합하지 않은 사용자 지정 콘텐츠를 보유할 수도 있습니다.
servers.showhidden = 서버 숨기기 / 보이 servers.showhidden = 숨겨진 서버 보이기/숨기
server.shown = 서버 숨기기 server.shown = 서버 숨기기
server.hidden = 서버 보이기 server.hidden = 서버 보이기
@@ -219,7 +222,7 @@ trace.modclient = 사용자 지정 클라이언트: [accent]{0}
invalidid = 잘못된 클라이언트 ID입니다! 버그 보고서를 보내주세요. invalidid = 잘못된 클라이언트 ID입니다! 버그 보고서를 보내주세요.
server.bans = 차단 목록 server.bans = 차단 목록
server.bans.none = 차단된 플레이어를 찾을 수 없습니다! server.bans.none = 차단된 플레이어를 찾을 수 없습니다!
server.admins = 관리자 server.admins = 관리자
server.admins.none = 관리자를 찾을 수 없습니다! server.admins.none = 관리자를 찾을 수 없습니다!
server.add = 서버 추가 server.add = 서버 추가
server.delete = 정말로 이 서버를 삭제하시겠습니까? server.delete = 정말로 이 서버를 삭제하시겠습니까?
@@ -305,11 +308,12 @@ loading = [accent]불러오는중...
reloading = [accent]모드 새로고침하는중... reloading = [accent]모드 새로고침하는중...
saving = [accent]저장중... saving = [accent]저장중...
respawn = [accent][[{0}][] 키를 눌러 코어에서 부활 respawn = [accent][[{0}][] 키를 눌러 코어에서 부활
cancelbuilding = [accent][[{0}][] 를 눌러 건설 계획을 초기화 cancelbuilding = [accent][[{0}][] 를 눌러 건설 계획을 초기화
selectschematic = [accent][[{0}][] 를 눌러 선택+복사 selectschematic = [accent][[{0}][] 를 눌러 선택+복사
pausebuilding = [accent][[{0}][] 를 눌러 건설을 일시중지 pausebuilding = [accent][[{0}][] 를 눌러 건설을 일시중지
resumebuilding = [scarlet][[{0}][] 를 눌러 건설을 재개 resumebuilding = [scarlet][[{0}][] 를 눌러 건설을 재개
showui = [accent][[{0}][] 키를 눌러 UI를 활성 enablebuilding = [scarlet][[{0}][] 키를 눌러 건설을 활성
showui = UI가 숨겨졌습니다. [accent][[{0}][] 키를 눌러 UI를 활성화하세요.
wave = [accent]{0} 단계 wave = [accent]{0} 단계
wave.cap = [accent]단계 {0}/{1} wave.cap = [accent]단계 {0}/{1}
wave.waiting = 다음 단계까지[lightgray] {0}초 wave.waiting = 다음 단계까지[lightgray] {0}초
@@ -341,7 +345,7 @@ workshop.info = 아이템 정보
changelog = 변경점 (선택 사항): changelog = 변경점 (선택 사항):
eula = 스팀 EULA eula = 스팀 EULA
missing = 이 아이템은 삭제되거나 이동되었습니다.\n[lightgray]창작마당 목록이 자동으로 연결 해제되었습니다. missing = 이 아이템은 삭제되거나 이동되었습니다.\n[lightgray]창작마당 목록이 자동으로 연결 해제되었습니다.
publishing = [accent]업로드 중... publishing = [accent]게시 중...
publish.confirm = 이것을 게시하시겠습니까?[lightgray]창작마당 EULA에 동의해야 합니다. 그렇지 않으면 아이템이 표시되지 않습니다! publish.confirm = 이것을 게시하시겠습니까?[lightgray]창작마당 EULA에 동의해야 합니다. 그렇지 않으면 아이템이 표시되지 않습니다!
publish.error = 아이템 게시 오류: {0} publish.error = 아이템 게시 오류: {0}
steam.error = 스팀 서비스를 초기화하지 못했습니다.\n오류: {0} steam.error = 스팀 서비스를 초기화하지 못했습니다.\n오류: {0}
@@ -375,7 +379,7 @@ waves.edit = 편집
waves.copy = 클립보드로 복사 waves.copy = 클립보드로 복사
waves.load = 클립보드에서 불러오기 waves.load = 클립보드에서 불러오기
waves.invalid = 클립보드에 잘못된 단계 데이터가 있습니다. waves.invalid = 클립보드에 잘못된 단계 데이터가 있습니다.
waves.copied = 단계 복사됨 waves.copied = 단계 복사됨.
waves.none = 적 단계가 설정되지 않았습니다.\n비어있을 시 자동으로 기본 적 단계 데이터로 설정됩니다. waves.none = 적 단계가 설정되지 않았습니다.\n비어있을 시 자동으로 기본 적 단계 데이터로 설정됩니다.
#these are intentionally in lower case #these are intentionally in lower case
@@ -384,8 +388,8 @@ wavemode.totals = 총
wavemode.health = 체력 wavemode.health = 체력
editor.default = [lightgray]<기본값> editor.default = [lightgray]<기본값>
details = 설명 details = 설명...
edit = 편집 edit = 편집...
editor.name = 이름: editor.name = 이름:
editor.spawn = 유닛 생성 editor.spawn = 유닛 생성
editor.removeunit = 유닛 삭제 editor.removeunit = 유닛 삭제
@@ -415,7 +419,7 @@ editor.importfile = 파일 가져오기
editor.importfile.description = 외부 맵 파일 가져오기 editor.importfile.description = 외부 맵 파일 가져오기
editor.importimage = 사진 파일 가져오기 editor.importimage = 사진 파일 가져오기
editor.importimage.description = 외부 맵 사진 파일 가져오기 editor.importimage.description = 외부 맵 사진 파일 가져오기
editor.export = 내보내기 editor.export = 내보내기...
editor.exportfile = 파일 내보내기 editor.exportfile = 파일 내보내기
editor.exportfile.description = 맵 파일 내보내기 editor.exportfile.description = 맵 파일 내보내기
editor.exportimage = 지형 이미지 내보내기 editor.exportimage = 지형 이미지 내보내기
@@ -448,15 +452,15 @@ 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 = 코어 1개 제한 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 = 무시
@@ -465,19 +469,19 @@ filter.terrain = 지형
filter.option.scale = 크기 filter.option.scale = 크기
filter.option.chance = 배치 빈도 filter.option.chance = 배치 빈도
filter.option.mag = 크기 filter.option.mag = 크기
filter.option.threshold = 경계선 filter.option.threshold = 한계점
filter.option.circle-scale = 원 크기 filter.option.circle-scale = 원 크기
filter.option.octaves = 옥타브 filter.option.octaves = 옥타브
filter.option.falloff = 경사 filter.option.falloff = 경사
filter.option.angle = 각도 filter.option.angle = 각도
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.wall = filter.option.wall =
filter.option.ore = 자원 filter.option.ore = 광물
filter.option.floor2 = 2층 바닥 filter.option.floor2 = 2번째 타일
filter.option.threshold2 = 2번째 경계선 filter.option.threshold2 = 2번째 경계선
filter.option.radius = 반경 filter.option.radius = 반경
filter.option.percentile = 백분율 filter.option.percentile = 백분율
@@ -488,7 +492,7 @@ menu = 메뉴
play = 플레이 play = 플레이
campaign = 캠페인 campaign = 캠페인
load = 불러오기 load = 불러오기
save = 저장 save = 저장하기
fps = FPS: {0} fps = FPS: {0}
ping = Ping: {0}ms ping = Ping: {0}ms
memory = Mem: {0}mb memory = Mem: {0}mb
@@ -519,7 +523,7 @@ loadout = 출격
resources = 자원 resources = 자원
bannedblocks = 금지된 블록들 bannedblocks = 금지된 블록들
addall = 모두 추가 addall = 모두 추가
launch.from = 점령 코어 송신 지역 : [accent]{0} launch.from = 출격 출발지 : [accent]{0}
launch.destination = 목적지: {0} launch.destination = 목적지: {0}
configure.invalid = 해당 값은 0에서 {0} 사이의 숫자여야 합니다. configure.invalid = 해당 값은 0에서 {0} 사이의 숫자여야 합니다.
add = 추가... add = 추가...
@@ -534,7 +538,7 @@ error.alreadyconnected = 이미 접속 중입니다.
error.mapnotfound = 맵 파일을 찾을 수 없습니다! error.mapnotfound = 맵 파일을 찾을 수 없습니다!
error.io = 네트워크 I/O 오류. error.io = 네트워크 I/O 오류.
error.any = 알 수 없는 네트워크 오류. error.any = 알 수 없는 네트워크 오류.
error.bloom = 블룸 그래픽 효과를 적용하지 못했습니다.\n당신의 기기가 이 기능을 지원하지 않는 것일 수도 있습니다. error.bloom = 블룸 그래픽 효과를 적용하지 못했습니다.\n기기가 이 기능을 지원하지 않는 것일 수도 있습니다.
weather.rain.name = weather.rain.name =
weather.snow.name = weather.snow.name =
@@ -544,27 +548,27 @@ weather.fog.name = 안개
sectors.unexplored = [lightgray]미개척지 sectors.unexplored = [lightgray]미개척지
sectors.resources = 자원: sectors.resources = 자원:
sectors.production = 분당 자원 생산량: sectors.production = 생산량:
sectors.export = 분당 자원 수출량: sectors.export = 수출량:
sectors.time = 지역 진행 시간: sectors.time = 진행 시간:
sectors.threat = 지역 위험도: sectors.threat = 위험도:
sectors.wave = 진행 중 단계: sectors.wave = 단계:
sectors.stored = 저장된 자원 목록: sectors.stored = 저장:
sectors.resume = 재개 sectors.resume = 재개
sectors.launch = 출격 sectors.launch = 출격
sectors.select = 선택 sectors.select = 선택
sectors.nonelaunch = [lightgray]없음 (sun) sectors.nonelaunch = [lightgray]없음 (sun)
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 =진입
sector.curcapture = 점령 sector.curcapture = 지역 점령
sector.curlost = 잃은 지역 sector.curlost = 지역 잃음
sector.missingresources = [scarlet]자원 부족 sector.missingresources = [scarlet]자원 부족
sector.attacked = [accent]{0}[white] 지역이 공격받고 있습니다! 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] 지역을 점령했습니다!
@@ -580,7 +584,7 @@ planet.serpulo.name = 세르플로
planet.sun.name = 태양 planet.sun.name = 태양
sector.impact0078.name = 폐허 : Impact 0078 sector.impact0078.name = 폐허 : Impact 0078
sector.groundZero.name = Zero 전초기지 sector.groundZero.name = 전초기지
sector.craters.name = 크레이터 sector.craters.name = 크레이터
sector.frozenForest.name = 얼어붙은 숲 sector.frozenForest.name = 얼어붙은 숲
sector.ruinousShores.name = 파괴된 해안가 sector.ruinousShores.name = 파괴된 해안가
@@ -602,12 +606,12 @@ sector.saltFlats.description = 이 소금 사막은 매우 척박하여 자원
sector.craters.description = 물이 가득한 이 크레이터에는 옛 전쟁의 유물들이 쌓여있습니다.\n이곳을 다시 점령해 강화 유리를 제작하고 물을 끌어올려 포탑과 드릴에 공급하여 더 좋은 효율로 방어선을 강화하십시오. sector.craters.description = 물이 가득한 이 크레이터에는 옛 전쟁의 유물들이 쌓여있습니다.\n이곳을 다시 점령해 강화 유리를 제작하고 물을 끌어올려 포탑과 드릴에 공급하여 더 좋은 효율로 방어선을 강화하십시오.
sector.ruinousShores.description = 이 지역은 과거 해안방어기지로 사용되었습니다.\n그러나 지금은 기본구조물만 남아있으니 이 지역을 어서 신속히 수리하여 외부로 세력을 확장한 뒤, 잃어버린 기술을 다시 회수하십시오. sector.ruinousShores.description = 이 지역은 과거 해안방어기지로 사용되었습니다.\n그러나 지금은 기본구조물만 남아있으니 이 지역을 어서 신속히 수리하여 외부로 세력을 확장한 뒤, 잃어버린 기술을 다시 회수하십시오.
sector.stainedMountains.description = 더 안쪽에는 포자에 오염된 산맥이 있지만, 이곳은 아직 포자에 오염되지 않았습니다.\n이 지역에서 티타늄을 채굴하고 이것을 어떻게 사용하는지 배우십시오.\n\n적들은 이곳에서 더 강력합니다. 더 강한 유닛들이 나올 때까지 시간을 낭비하지 마십시오. sector.stainedMountains.description = 더 안쪽에는 포자에 오염된 산맥이 있지만, 이곳은 아직 포자에 오염되지 않았습니다.\n이 지역에서 티타늄을 채굴하고 이것을 어떻게 사용하는지 배우십시오.\n\n적들은 이곳에서 더 강력합니다. 더 강한 유닛들이 나올 때까지 시간을 낭비하지 마십시오.
sector.overgrowth.description = 이곳은 포자들의 근원과 가까이에 있는 과성장 지대입니다. 적이 이 곳에 전초기지를 설립했습니다. 거를 생산해 적의 코어를 박살 내고 우리가 잃어버린 것들을 되돌려받으십시오! sector.overgrowth.description = 이곳은 포자들의 근원과 가까이에 있는 과성장 지대입니다. 적이 이곳에 전초기지를 설립했습니다. 거를 생산해 적의 코어를 박살 내고 우리가 잃어버린 것들을 되돌려받으십시오!
sector.tarFields.description = 산지와 사막 사이에 있는 석유 생산지의 외곽 지역이며, 사용 가능한 타르가 매장되어 있는 희귀한 지역 중 하나입니다. 버려진 지역이지만 이곳에는 위험한 적군들이 있습니다. 그들을 과소평가하지 마십시오.\n\n[lightgray]석유 생산기술을 익히는 것이 도움이 될 것입니다. sector.tarFields.description = 산지와 사막 사이에 있는 석유 생산지의 외곽 지역이며, 사용 가능한 타르가 매장되어 있는 희귀한 지역 중 하나입니다. 버려진 지역이지만 이곳에는 위험한 적군들이 있습니다. 그들을 과소평가하지 마십시오.\n\n[lightgray]석유 생산기술을 익히는 것이 도움이 될 것입니다.
sector.desolateRift.description = 극도로 위험한 지역입니다. 자원은 풍부하지만, 사용 가능한 공간은 거의 없습니다. 코어 파괴의 위험성이 높으니 가능한 한 빨리 떠나십시오. 또한, 적의 공격 딜레이가 길다고 안심하지 마십시오. sector.desolateRift.description = 극도로 위험한 지역입니다. 자원은 풍부하지만, 사용 가능한 공간은 거의 없습니다. 코어 파괴의 위험성이 높으니 가능한 한 빨리 떠나십시오. 또한, 적의 공격 딜레이가 길다고 안심하지 마십시오.
sector.nuclearComplex.description = 과거 토륨의 생산, 연구와 처리를 위해 운영되었던 시설입니다. 지금은 그저 폐허로 전락했으며, 다수의 적이 배치된 지역입니다. 그들은 끊임없이 당신을 공격할 것입니다.\n\n[lightgray]토륨의 다양한 사용법을 연구하고 익히십시오. sector.nuclearComplex.description = 과거 토륨의 생산, 연구와 처리를 위해 운영되었던 시설입니다. 지금은 그저 폐허로 전락했으며, 다수의 적이 배치된 지역입니다. 그들은 끊임없이 당신을 공격할 것입니다.\n\n[lightgray]토륨의 다양한 사용법을 연구하고 익히십시오.
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우주선이 파괴된 잔해에서 최대한 많은 자원을 회수하고, 손상되지 않은 그들의 기술을 획득하세요.
@@ -615,9 +619,9 @@ sector.planetaryTerminal.description = 이 행성에서의 마지막 전투를
settings.language = 언어 settings.language = 언어
settings.data = 게임 데이터 settings.data = 게임 데이터
settings.reset = 설정 초기화 settings.reset = 기본값으로 초기화
settings.rebind = 조작키 설정 settings.rebind = 설정
settings.resetKey = 조작키 설정 초기화 settings.resetKey = 초기화
settings.controls = 조작 settings.controls = 조작
settings.game = 게임 settings.game = 게임
settings.sound = 소리 settings.sound = 소리
@@ -633,14 +637,14 @@ settings.clearcampaignsaves = 캠페인 맵 초기화
settings.clearcampaignsaves.confirm = 정말로 캠페인을 초기화하시겠습니까? settings.clearcampaignsaves.confirm = 정말로 캠페인을 초기화하시겠습니까?
paused = [accent]< 일시정지 > paused = [accent]< 일시정지 >
clear = 초기화 clear = 초기화
banned = [scarlet]차단 banned = [scarlet]금지
yes = O yes = O
no = X no = X
info.title = 정보 info.title = 정보
error.title = [scarlet]오류가 발생했습니다. error.title = [scarlet]오류가 발생했습니다
error.crashtitle = 오류가 발생했습니다. error.crashtitle = 오류가 발생했습니다
unit.nobuild = [scarlet]건설 불가 unit.nobuild = [scarlet]건설 불가
lastaccessed = [lightgray]마지막 조작: {0} lastaccessed = [lightgray]마지막 접근: {0}
block.unknown = [lightgray]??? block.unknown = [lightgray]???
stat.description = 특성 stat.description = 특성
@@ -649,52 +653,54 @@ stat.output = 출력
stat.booster = 가속 stat.booster = 가속
stat.tiles = 필요한 타일 stat.tiles = 필요한 타일
stat.affinities = 친화력 stat.affinities = 친화력
stat.powercapacity = 전력량 stat.powercapacity = 전력
stat.powershot = 전력/발 stat.powershot = 전력/발
stat.damage = 공격력 stat.damage = 피해량
stat.targetsair = 공중 공격 stat.targetsair = 공중 조준
stat.targetsground = 지상 공격 stat.targetsground = 지상 조준
stat.itemsmoved = 이동 속도 stat.itemsmoved = 이동 속도
stat.launchtime = 발사 간격 stat.launchtime = 출격 간격
stat.shootrange = 사거리 stat.shootrange = 사거리
stat.size = 크기 stat.size = 크기
stat.displaysize = 화면 크기 stat.displaysize = 화면 크기
stat.liquidcapacity = 액체 용량 stat.liquidcapacity = 액체 용량
stat.powerrange = 전선 길이 stat.powerrange = 전선 길이
stat.linkrange = 감지 길이 stat.linkrange = 연결 길이
stat.instructions = 연산 속도 stat.instructions = 연산 속도
stat.powerconnections = 최대 연결 개수 stat.powerconnections = 최대 연결
stat.poweruse = 전력 요구량 stat.poweruse = 전력 요구량
stat.powerdamage = 전력/피해량 stat.powerdamage = 전력/피해량
stat.itemcapacity = 자원 용량 stat.itemcapacity = 자원 용량
stat.memorycapacity = 최대 변수 개수 stat.memorycapacity = 변수 용량
stat.basepowergeneration = 기본 발전량 stat.basepowergeneration = 기본 전력 발전량
stat.productiontime = 소요 시간 stat.productiontime = 소요 시간
stat.repairtime = 건물 완전 복구 시간 stat.repairtime = 건물 완전 수리 시간
stat.weapons = 무기 stat.weapons = 무기
stat.bullet = 탄환 stat.bullet = 탄환
stat.speedincrease = 속도 증가 stat.speedincrease = 속도 증가
stat.range = 사거리 stat.range = 사거리
stat.drilltier = 채굴 가능 자원 stat.drilltier = 채굴 가능
stat.drillspeed = 기본 채굴 속도 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 = 건설 비용
stat.inaccuracy = 오차각 stat.inaccuracy = 오차각
stat.shots = 발사 당 탄 #stat.shots = 발사 수 (안쓰임)
stat.reload = 발/ stat.reload = 당 발사 수
stat.ammo = 탄약 stat.ammo = 탄약
stat.shieldhealth = 보호막 체력 stat.shieldhealth = 보호막 체력
stat.cooldowntime = 쿨타임 stat.cooldowntime = 쿨타임
stat.explosiveness = 폭발성 stat.explosiveness = 폭발성
stat.basedeflectchance = 기본 반사 확률 stat.basedeflectchance = 기본 반사 확률
stat.lightningchance = 전격 확률 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 = 온도
@@ -702,10 +708,10 @@ stat.speed = 속도
stat.buildspeed = 건설 속도 stat.buildspeed = 건설 속도
stat.minespeed = 채굴 속도 stat.minespeed = 채굴 속도
stat.minetier = 채굴 티어 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 = 탄약 사용
@@ -716,9 +722,9 @@ ability.unitspawn = {0} 공장
ability.shieldregenfield = 방어막 복구 필드 ability.shieldregenfield = 방어막 복구 필드
ability.movelightning = 가속 전격 ability.movelightning = 가속 전격
bar.drilltierreq = 더 좋은 드릴 필요 bar.drilltierreq = 더 좋은 드릴 필요
bar.noresources = 자원 부족 bar.noresources = 자원 부족
bar.corereq = 코어 필요 bar.corereq = 기본 코어 필요
bar.drillspeed = 드릴 속도: {0}/s bar.drillspeed = 드릴 속도: {0}/s
bar.pumpspeed = 펌프 속도: {0}/s bar.pumpspeed = 펌프 속도: {0}/s
bar.efficiency = 효율: {0}% bar.efficiency = 효율: {0}%
@@ -734,14 +740,14 @@ bar.unitcap = {0} {1}/{2}
bar.liquid = 액체 bar.liquid = 액체
bar.heat = 발열 bar.heat = 발열
bar.power = 전력 bar.power = 전력
bar.progress = 생산 진행도 bar.progress = 건설 진행도
bar.input = 입력 bar.input = 입력
bar.output = 출력 bar.output = 출력
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.sapping = [stat]흡혈
bullet.homing = [stat]유도 bullet.homing = [stat]유도
@@ -749,7 +755,7 @@ bullet.shock = [stat]전격
bullet.frag = [stat]파편 bullet.frag = [stat]파편
bullet.buildingdamage = [stat]{0}%[lightgray] 건물 피해량 bullet.buildingdamage = [stat]{0}%[lightgray] 건물 피해량
bullet.knockback = [stat]{0}[lightgray] 넉백 bullet.knockback = [stat]{0}[lightgray] 넉백
bullet.pierce = [stat]{0}[lightgray] 관통 bullet.pierce = [stat]{0}[lightgray] 관통
bullet.infinitepierce = [stat]관통 bullet.infinitepierce = [stat]관통
bullet.healpercent = [stat]{0}[lightgray]% 회복 bullet.healpercent = [stat]{0}[lightgray]% 회복
bullet.freezing = [stat]빙결 bullet.freezing = [stat]빙결
@@ -761,7 +767,7 @@ unit.blocks = 블록
unit.blockssquared = 블록² unit.blockssquared = 블록²
unit.powersecond = 전력/초 unit.powersecond = 전력/초
unit.liquidsecond = 액체/초 unit.liquidsecond = 액체/초
unit.itemssecond = /초 unit.itemssecond = 자원/초
unit.liquidunits = 액체 unit.liquidunits = 액체
unit.powerunits = 전력 unit.powerunits = 전력
unit.degrees = unit.degrees =
@@ -777,19 +783,20 @@ unit.thousands = k
unit.millions = m unit.millions = m
unit.billions = b unit.billions = b
unit.pershot = /발 unit.pershot = /발
category.purpose = 기능 / 목적 category.purpose = 목적
category.general = 일반 category.general = 일반
category.power = 전력 category.power = 전력
category.liquids = 액체 category.liquids = 액체
category.items = 자원 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.flow.name = 자원 흐름량 표시 setting.flow.name = 자원 흐름량 표시
setting.backgroundpause.name = 백그라운드에서 일시정지 setting.backgroundpause.name = 백그라운드에서 일시정지
setting.buildautopause.name = 건설 자동 일시정지 setting.buildautopause.name = 건설 자동 일시정지
@@ -813,14 +820,14 @@ 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}ms setting.milliseconds = {0} 밀리초
setting.fullscreen.name = 전체 화면 setting.fullscreen.name = 전체 화면
setting.borderlesswindow.name = 테두리 없는 창 모드[lightgray] (재시작이 필요할 수 있습니다) setting.borderlesswindow.name = 테두리 없는 창 모드[lightgray] (재시작이 필요할 수 있습니다)
setting.fps.name = FPS와 핑 표시 setting.fps.name = FPS와 핑 표시
@@ -838,7 +845,7 @@ setting.sfxvol.name = 효과음 크기
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 = 전선 투명도
@@ -858,7 +865,7 @@ category.view.name = 보기
category.multiplayer.name = 멀티플레이어 category.multiplayer.name = 멀티플레이어
category.blocks.name = 블록 선택 category.blocks.name = 블록 선택
command.attack = 공격 command.attack = 공격
command.rally = 순찰 command.rally = 집결
command.retreat = 후퇴 command.retreat = 후퇴
command.idle = 대기 command.idle = 대기
placement.blockselectkeys = \n[lightgray]단축키: [{0}, placement.blockselectkeys = \n[lightgray]단축키: [{0},
@@ -874,13 +881,13 @@ keybind.move_x.name = X축 이동
keybind.move_y.name = Y축 이동 keybind.move_y.name = Y축 이동
keybind.mouse_move.name = 커서를 따라서 이동 keybind.mouse_move.name = 커서를 따라서 이동
keybind.pan.name = 펜 보기 keybind.pan.name = 펜 보기
keybind.boost.name = 비행 keybind.boost.name = 이륙
keybind.schematic_select.name = 영역 설정 keybind.schematic_select.name = 영역 설정
keybind.schematic_menu.name = 설계도 메뉴 keybind.schematic_menu.name = 설계도 메뉴
keybind.schematic_flip_x.name = 설계도 X축 뒤집기 keybind.schematic_flip_x.name = 설계도 X축 뒤집기
keybind.schematic_flip_y.name = 설계도 Y축 뒤집기 keybind.schematic_flip_y.name = 설계도 Y축 뒤집기
keybind.category_prev.name = 이전 목록 keybind.category_prev.name = 이전 카테고리
keybind.category_next.name = 다음 목록 keybind.category_next.name = 다음 카테고리
keybind.block_select_left.name = 블록 왼쪽 선택 keybind.block_select_left.name = 블록 왼쪽 선택
keybind.block_select_right.name = 블록 오른쪽 선택 keybind.block_select_right.name = 블록 오른쪽 선택
keybind.block_select_up.name = 블록 위쪽 선택 keybind.block_select_up.name = 블록 위쪽 선택
@@ -905,7 +912,7 @@ keybind.pickupCargo.name = 화물 집기
keybind.dropCargo.name = 화물 내려놓기 keybind.dropCargo.name = 화물 내려놓기
keybind.command.name = 명령 keybind.command.name = 명령
keybind.shoot.name = 사격 keybind.shoot.name = 사격
keybind.zoom.name = 확대 keybind.zoom.name = 확대/축소
keybind.menu.name = 메뉴 keybind.menu.name = 메뉴
keybind.pause.name = 일시중지 keybind.pause.name = 일시중지
keybind.pause_building.name = 건설 일시정지/재개 keybind.pause_building.name = 건설 일시정지/재개
@@ -922,13 +929,13 @@ 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 = 대화 대상 변경 keybind.chat_mode = 대화 대상 변경
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 = 생존
mode.survival.description = 기본 모드. 제한된 자원이 있으며, 단계가 자동으로 시작합니다.\n[gray]플레이하려면 맵에 적의 스폰지점이 필요합니다. mode.survival.description = 기본 모드. 제한된 자원이 있으며, 단계가 자동으로 시작합니다.\n[gray]플레이하려면 맵에 적의 스폰지점이 필요합니다.
mode.sandbox.name = 샌드박스 mode.sandbox.name = 샌드박스
mode.sandbox.description = 무한한 자원이 있으며, 단계 타이머가 없습니다. mode.sandbox.description = 무한한 자원이 있으며, 시간 제한이 없습니다.
mode.editor.name = 편집기 mode.editor.name = 편집기
mode.pvp.name = PvP mode.pvp.name = PvP
mode.pvp.description = 다른 플레이어와 현장에서 싸우십시오.\n[gray]플레이하려면 맵에 다른 색상의 코어가 2개 이상 있어야 합니다. mode.pvp.description = 다른 플레이어와 현장에서 싸우십시오.\n[gray]플레이하려면 맵에 다른 색상의 코어가 2개 이상 있어야 합니다.
@@ -941,7 +948,7 @@ rules.reactorexplosions = 원자로 폭발 허용
rules.coreincinerates = 코어 방화 비허용 rules.coreincinerates = 코어 방화 비허용
rules.schematic = 설계도 허용 rules.schematic = 설계도 허용
rules.wavetimer = 시간 제한이 있는 단계 rules.wavetimer = 시간 제한이 있는 단계
rules.waves = 일반 단계 rules.waves = 단계
rules.attack = 공격 모드 rules.attack = 공격 모드
rules.buildai = AI 건설 rules.buildai = AI 건설
rules.enemyCheat = 무한 AI (빨간팀) 자원 rules.enemyCheat = 무한 AI (빨간팀) 자원
@@ -950,26 +957,28 @@ rules.blockdamagemultiplier = 블록 공격력 배수
rules.unitbuildspeedmultiplier = 유닛 생산 속도 배수 rules.unitbuildspeedmultiplier = 유닛 생산 속도 배수
rules.unithealthmultiplier = 유닛 체력 배수 rules.unithealthmultiplier = 유닛 체력 배수
rules.unitdamagemultiplier = 유닛 공격력 배수 rules.unitdamagemultiplier = 유닛 공격력 배수
rules.unitcapvariable = 코어 유닛 제한 추가
rules.unitcap = 기본 유닛 제한
rules.enemycorebuildradius = 적 코어 건설 금지구역 범위:[lightgray] (타일) rules.enemycorebuildradius = 적 코어 건설 금지구역 범위:[lightgray] (타일)
rules.wavespacing = 단계 간격:[lightgray] (초) rules.wavespacing = 단계 간격:[lightgray] (초)
rules.buildcostmultiplier = 건설 자원소모 배수 rules.buildcostmultiplier = 건설 비용 배수
rules.buildspeedmultiplier = 건설 속도 배수 rules.buildspeedmultiplier = 건설 속도 배수
rules.deconstructrefundmultiplier = 해체 환불 배수 rules.deconstructrefundmultiplier = 철거 환불 배수
rules.waitForWaveToEnd = 한 단계가 끝날때까지 대기 rules.waitForWaveToEnd = 한 단계가 끝날때까지 대기
rules.dropzoneradius = 스폰 구역 범위: [lightgray] (타일) rules.dropzoneradius = 스폰 구역 범위: [lightgray] (타일)
rules.unitammo = 탄약 필요 rules.unitammo = 유닛 탄약 필요
rules.title.waves = 단계 rules.title.waves = 단계
rules.title.resourcesbuilding = 자원 & 건축 rules.title.resourcesbuilding = 자원 & 건축
rules.title.enemy = rules.title.enemy =
rules.title.unit = 유닛 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 = 자연 조명 표시
rules.weather = 날씨 rules.weather = 날씨 추가
rules.weather.frequency = 빈도: rules.weather.frequency = 빈도:
rules.weather.always = 항상 rules.weather.always = 항상
rules.weather.duration = 지속 시간: rules.weather.duration = 지속 시간:
@@ -1038,8 +1047,8 @@ unit.corvus.name = 코르버스
block.resupply-point.name = 보급 지점 block.resupply-point.name = 보급 지점
block.parallax.name = 패럴랙스 block.parallax.name = 패럴랙스
block.cliff.name = 언덕 block.cliff.name = 언덕
block.sand-boulder.name = 사암 block.sand-boulder.name = 사암 바위
block.basalt-boulder.name = 현무암 block.basalt-boulder.name = 현무암 바위
block.grass.name = 잔디 block.grass.name = 잔디
block.slag.name = 용암 block.slag.name = 용암
block.space.name = 우주 block.space.name = 우주
@@ -1264,19 +1273,19 @@ 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.research = 새 기술을 연구하려면 \ue875 [accent]연구[]버튼을 누르십시오.
hint.research.mobile = 새 기술을 연구하려면 \ue88c [accent]메뉴[] 아래의 \ue875 [accent]연구[]버튼을 누르십시오. hint.research.mobile = 새 기술을 연구하려면 \ue88c [accent]메뉴[] 아래의 \ue875 [accent]연구[]버튼을 누르십시오.
@@ -1287,7 +1296,7 @@ hint.launch.mobile = 충분한 자원을 모았으면, 오른쪽 아래의 \ue88
hint.schematicSelect = 블록을 복사하고 붙여넣으려면 [accent][[F][]를 누른 채로 끌어서 구역을 지정하십시오. \n\n [accent][[마우스 휠][]을 누르면 한 개의 블록만 복사할 수 있습니다. hint.schematicSelect = 블록을 복사하고 붙여넣으려면 [accent][[F][]를 누른 채로 끌어서 구역을 지정하십시오. \n\n [accent][[마우스 휠][]을 누르면 한 개의 블록만 복사할 수 있습니다.
hint.conveyorPathfind = [accent][[왼쪽 Ctrl][]을 누른 채로 컨베이어를 대각선으로 끌면 길을 자동으로 만들어줍니다. hint.conveyorPathfind = [accent][[왼쪽 Ctrl][]을 누른 채로 컨베이어를 대각선으로 끌면 길을 자동으로 만들어줍니다.
hint.conveyorPathfind.mobile = \ue844 [accent]diagonal mode[]를 활성화하고 컨베이어를 대각선으로 끌면 길을 자동으로 찾아줍니다. hint.conveyorPathfind.mobile = \ue844 [accent]diagonal mode[]를 활성화하고 컨베이어를 대각선으로 끌면 길을 자동으로 찾아줍니다.
hint.boost = 당신의 유닛과 같이 장애물을 넘어가려면 [accent][[L-Shift][]을 누르고 이동하십시오. \n\n 적은 수의 지상 유닛만 날 수 있습니다. hint.boost = 유닛과 같이 장애물을 넘어가려면 [accent][[L-Shift][]을 누르고 이동하십시오. \n\n 적은 수의 지상 유닛만 날 수 있습니다.
hint.command = 주변의 아군 유닛을 데리고 다니려면 비슷한 단계의 유닛 무리 주변에서 [accent][[G][]를 누르십시오. \n\n 지상 유닛을 데리고 다니기 위해서는 먼저 다른 지상 유닛을 조종하고 있어야 합니다. hint.command = 주변의 아군 유닛을 데리고 다니려면 비슷한 단계의 유닛 무리 주변에서 [accent][[G][]를 누르십시오. \n\n 지상 유닛을 데리고 다니기 위해서는 먼저 다른 지상 유닛을 조종하고 있어야 합니다.
hint.command.mobile = 아군 유닛을 데리고 다니려면 비슷한 단계의 유닛 무리 주변에서 [accent]빠르게 두 번 누르십시오[]. hint.command.mobile = 아군 유닛을 데리고 다니려면 비슷한 단계의 유닛 무리 주변에서 [accent]빠르게 두 번 누르십시오[].
hint.payloadPickup = 작은 블록이나 유닛을 집으려면 [accent][[[]를 누르십시오. hint.payloadPickup = 작은 블록이나 유닛을 집으려면 [accent][[[]를 누르십시오.
@@ -1297,10 +1306,10 @@ hint.payloadDrop.mobile = 다시 내려놓으려면 빈 공간에서 [accent]화
hint.waveFire = [accent]Wave[]포탑에 탄약으로 물을 넣으면 주변의 불을 자동으로 꺼줍니다. hint.waveFire = [accent]Wave[]포탑에 탄약으로 물을 넣으면 주변의 불을 자동으로 꺼줍니다.
hint.generator = \uf879 [accent]화력 발전기[]는 석탄을 태워서 주변 블록에 전력을 전달합니다.\n\n \uf87f 더 넓은 범위의 블록에 전력을 전달하려면 [accent]Power Nodes[]를 사용하십시오. hint.generator = \uf879 [accent]화력 발전기[]는 석탄을 태워서 주변 블록에 전력을 전달합니다.\n\n \uf87f 더 넓은 범위의 블록에 전력을 전달하려면 [accent]Power Nodes[]를 사용하십시오.
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]소각[]될 것입니다.
hint.coopCampaign = [accent]협동 캠페인[]을 할 , 현재 맵에서 생산된 자원들은 [accent]당신의 캠페인 지역으로[]도 보내집니다.\n\n호스트가 새로 해금한 모든 것들도 가져갑니다. hint.coopCampaign = [accent]협동 캠페인[]을 할 , 현재 맵에서 생산된 자원들은 [accent]캠페인 지역[]으로도 보내집니다.\n\n호스트가 새로 해금한 모든 것들도 가져갑니다.
item.copper.description = 가장 기본적인 건설 재료. 모든 유형의 블록에서 광범위하게 사용됩니다. item.copper.description = 가장 기본적인 건설 재료. 모든 유형의 블록에서 광범위하게 사용됩니다.
item.copper.details = 평범한 구리. 세르플로에 비정상적으로 많이 분포합니다. 별다른 보강재 없이는 구조적 문제 때문에 내구성이 비교적 약합니다. item.copper.details = 평범한 구리. 세르플로에 비정상적으로 많이 분포합니다. 별다른 보강재 없이는 구조적 문제 때문에 내구성이 비교적 약합니다.
@@ -1317,9 +1326,9 @@ item.scrap.description = 오래된 건물과 유닛의 남은 잔해. 미량의
item.scrap.details = 오래된 구조물과 유닛의 잔해. item.scrap.details = 오래된 구조물과 유닛의 잔해.
item.silicon.description = 매우 유용한 반도체. 복잡한 전자 장치나 유도탄에 사용됩니다. item.silicon.description = 매우 유용한 반도체. 복잡한 전자 장치나 유도탄에 사용됩니다.
item.plastanium.description = 고급 기체 및 파편화 탄약에 사용되는 가볍고 연성이 있는 재료입니다. item.plastanium.description = 고급 기체 및 파편화 탄약에 사용되는 가볍고 연성이 있는 재료입니다.
item.phase-fabric.description = 최첨단 전자 제품과 자수리 기술에 사용되는 거의 무중력에 가까운 물질입니다. item.phase-fabric.description = 최첨단 전자 제품과 자수리 기술에 사용되는 거의 무중력에 가까운 물질입니다.
item.surge-alloy.description = 독특한 전기적 특성을 가진 고급 합금. item.surge-alloy.description = 독특한 전기적 특성을 가진 고급 합금.
item.spore-pod.description = 산업 목적을 위해 대기 농도에서 합성된 포자 버섯. 석유, 폭발물 연료로 전환하는 데 사용됩니다. item.spore-pod.description = 산업 목적을 위해 대기 농도에서 합성된 포자 버섯. 석유, 폭발물 연료로 전환하는 데 사용됩니다.
item.spore-pod.details = 포자. 유기적인 생명체로 판단된다. 타 유기체에 치명적인 독가스를 내뿜는다. 침입성이 매우 강하다. 특정 조건에서 강력한 인화성을 보입니다. item.spore-pod.details = 포자. 유기적인 생명체로 판단된다. 타 유기체에 치명적인 독가스를 내뿜는다. 침입성이 매우 강하다. 특정 조건에서 강력한 인화성을 보입니다.
item.blast-compound.description = 폭탄과 폭발물에 사용되는 불안정한 화합물. 포자 버섯 및 기타 휘발성 물질로 합성할 수 있습니다. 연료로 사용하지 않는 것이 좋습니다. item.blast-compound.description = 폭탄과 폭발물에 사용되는 불안정한 화합물. 포자 버섯 및 기타 휘발성 물질로 합성할 수 있습니다. 연료로 사용하지 않는 것이 좋습니다.
item.pyratite.description = 소이 무기에서 사용되는 가연성 매우 높은 물질. item.pyratite.description = 소이 무기에서 사용되는 가연성 매우 높은 물질.
@@ -1329,14 +1338,14 @@ liquid.slag.description = 다양한 종류의 금속들이 함께 섞여 녹아
liquid.oil.description = 고급 재료 생산에 사용되는 액체. 석탄으로 전환하거나 무기로 뿌려서 불을 지를 수 있습니다. 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 = 석탄을 흑연으로 압축합니다.
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 = 토륨과 모래로 메타를 합성합니다.
block.alloy-smelter.description = 티타늄, 납, 실리콘, 구리를 결합하여 설금을 생산합니다. block.alloy-smelter.description = 티타늄, 납, 실리콘, 구리를 결합하여 설금을 생산합니다.
@@ -1349,7 +1358,7 @@ block.spore-press.description = 포자를 석유로 압축합니다.
block.pulverizer.description = 고철을 갈아 모래로 만듭니다. block.pulverizer.description = 고철을 갈아 모래로 만듭니다.
block.coal-centrifuge.description = 석유에서 석탄을 추출합니다. block.coal-centrifuge.description = 석유에서 석탄을 추출합니다.
block.incinerator.description = 넘치는 자원이나 액체를 증발시킵니다. block.incinerator.description = 넘치는 자원이나 액체를 증발시킵니다.
block.power-void.description = 입력된 모든 전력을 무효합니다. 샌드박스 전용. block.power-void.description = 입력된 모든 전력을 무효합니다. 샌드박스 전용.
block.power-source.description = 무한한 전력을 공급해주는 블록입니다. 샌드박스 전용. block.power-source.description = 무한한 전력을 공급해주는 블록입니다. 샌드박스 전용.
block.item-source.description = 자원을 무한대로 출력합니다. 샌드박스 전용. block.item-source.description = 자원을 무한대로 출력합니다. 샌드박스 전용.
block.item-void.description = 모든 자원을 파괴합니다. 샌드박스 전용. block.item-void.description = 모든 자원을 파괴합니다. 샌드박스 전용.
@@ -1363,8 +1372,8 @@ block.plastanium-wall.description = 전격 공격을 흡수하고 전력 노드
block.plastanium-wall-large.description = 전격 공격을 흡수하고 전력 노드의 자동 연결을 차단하는 특수 유형의 벽.\n여러 타일을 차지합니다. block.plastanium-wall-large.description = 전격 공격을 흡수하고 전력 노드의 자동 연결을 차단하는 특수 유형의 벽.\n여러 타일을 차지합니다.
block.thorium-wall.description = 강력한 방어 블록.\n적으로부터 적절한 보호를 할 수 있습니다. block.thorium-wall.description = 강력한 방어 블록.\n적으로부터 적절한 보호를 할 수 있습니다.
block.thorium-wall-large.description = 강력한 방어 블록.\n적으로부터 적절한 보호를 할 수 있습니다.\n여러 타일을 차지합니다. block.thorium-wall-large.description = 강력한 방어 블록.\n적으로부터 적절한 보호를 할 수 있습니다.\n여러 타일을 차지합니다.
block.phase-wall.description = 특수 메타기반 반사 화합물로 코팅된 벽. 총알 대부분을 반사시킵니다. block.phase-wall.description = 특수 메타기반 반사 화합물로 코팅된 벽. 총알 대부분을 반사니다.
block.phase-wall-large.description = 특수 메타기반 반사 화합물로 코팅된 벽. 총알 대부분을 반사시킵니다.\n여러 타일을 차지합니다. block.phase-wall-large.description = 특수 메타기반 반사 화합물로 코팅된 벽. 총알 대부분을 반사니다.\n여러 타일을 차지합니다.
block.surge-wall.description = 내구성이 매우 강한 방어 블록.\n총탄이 날아오면 충전량을 높여 무작위로 방출합니다. block.surge-wall.description = 내구성이 매우 강한 방어 블록.\n총탄이 날아오면 충전량을 높여 무작위로 방출합니다.
block.surge-wall-large.description = 내구성이 매우 강한 방어 블록.\n총탄이 날아오면 충전량을 높여 무작위로 방출합니다.\n여러 타일을 차지합니다. block.surge-wall-large.description = 내구성이 매우 강한 방어 블록.\n총탄이 날아오면 충전량을 높여 무작위로 방출합니다.\n여러 타일을 차지합니다.
block.door.description = 작은 문. 탭 하여 열거나 닫을 수 있습니다. block.door.description = 작은 문. 탭 하여 열거나 닫을 수 있습니다.
@@ -1388,13 +1397,13 @@ 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 = 가장 강력한 펌프.
block.conduit.description = 기본 액체 운송 블록. 액체를 앞으로 이동시킵니다. 펌프 및 기타 파이프와 함께 사용됩니다. block.conduit.description = 기본 액체 운송 블록. 액체를 앞으로 이동시킵니다. 펌프 및 기타 파이프와 함께 사용됩니다.
block.pulse-conduit.description = 고급 액체 운송 블록. 액체를 더 빠르게 운반하고 표준 파이프보다 더 많이 저장합니다. block.pulse-conduit.description = 고급 액체 운송 블록. 액체를 더 빠르게 운반하고 표준 파이프보다 더 많이 저장합니다.
block.plated-conduit.description = 펄스 파이프와 같은 속도로 이동하지만 더 높은 방어력을 가지고 있습니다. 측면에서 액체들을 받아들이지 않습니다.\n액체가 누설하지 않습니다. block.plated-conduit.description = 펄스 파이프와 같은 속도로 이동하지만 더 높은 방어력을 가지고 있습니다. 측면에서 액체들을 받아들이지 않습니다.\n액체가 누설하지 않습니다.
block.liquid-router.description = 한 방향에서 액체를 받아 최대 3개의 다른 방향으로 동일하게 출력합니다. 일정량의 액체를 저장할 수도 있으며 한 소스에서 여러 대상으로 액체를 분할하는 데 유용합니다. block.liquid-router.description = 한 방향에서 액체를 받아 최대 3개의 다른 방향으로 같이 출력합니다. 일정량의 액체를 저장할 수도 있으며 한 소스에서 여러 대상으로 액체를 나누는 데 유용합니다.
block.liquid-tank.description = 대량의 액체를 저장합니다. 재료가 일정하지 않은 상황에서 버퍼를 생성하거나 중요한 블록을 냉각하기 위한 보호 장치로 사용하세요. block.liquid-tank.description = 대량의 액체를 저장합니다. 재료가 일정하지 않은 상황에서 버퍼를 생성하거나 중요한 블록을 냉각하기 위한 보호 장치로 사용하세요.
block.liquid-junction.description = 두 개의 교차 파이프를 위한 다리 역할을 합니다. 다른 액체를 다른 위치로 운반하는 두 개의 다른 파이프가 있는 상황에서 유용합니다. block.liquid-junction.description = 두 개의 교차 파이프를 위한 다리 역할을 합니다. 다른 액체를 다른 위치로 운반하는 두 개의 다른 파이프가 있는 상황에서 유용합니다.
block.bridge-conduit.description = 고급 액체 운송 블록. 지형이나 건물을 넘어 최대 3개 타일 위로 액체를 운반할 수 있습니다. block.bridge-conduit.description = 고급 액체 운송 블록. 지형이나 건물을 넘어 최대 3개 타일 위로 액체를 운반할 수 있습니다.
@@ -1403,7 +1412,7 @@ block.power-node.description = 연결된 노드에 전력을 전송합니다.
block.power-node-large.description = 더 넓은 범위의 고급 전력 노드. block.power-node-large.description = 더 넓은 범위의 고급 전력 노드.
block.surge-tower.description = 사용 가능한 연결 수가 적은 장거리 전력 노드. block.surge-tower.description = 사용 가능한 연결 수가 적은 장거리 전력 노드.
block.diode.description = 배터리 전력은 이 블록을 통해 한 방향으로만 흐를 수 있지만, 출력 방향 배터리의 전력이 더 적은 경우에만 가능합니다. block.diode.description = 배터리 전력은 이 블록을 통해 한 방향으로만 흐를 수 있지만, 출력 방향 배터리의 전력이 더 적은 경우에만 가능합니다.
block.battery.description = 기가 넘쳐날 때 전력을 저장할 수 있습니다. 전력에 적자가 발생할 때 전력을 출력합니다. block.battery.description = 력이 넘쳐날 때 저장할 수 있습니다. 전력에 적자가 발생할 때 전력을 출력합니다.
block.battery-large.description = 일반 배터리보다 훨씬 더 많은 전력을 저장합니다. block.battery-large.description = 일반 배터리보다 훨씬 더 많은 전력을 저장합니다.
block.combustion-generator.description = 석탄과 같은 가연성 물질을 연소 시켜 전력을 생산합니다. block.combustion-generator.description = 석탄과 같은 가연성 물질을 연소 시켜 전력을 생산합니다.
block.thermal-generator.description = 열이 있는 곳에 설치하면 전력이 생성됩니다. block.thermal-generator.description = 열이 있는 곳에 설치하면 전력이 생성됩니다.
@@ -1416,7 +1425,7 @@ block.thorium-reactor.description = 토륨으로부터 상당한 양의 전력
block.impact-reactor.description = 최고 효율로 대량의 전력을 생산할 수 있는 고급 발전기. 가동을 시작하려면 상당한 전력 공급이 필요합니다. block.impact-reactor.description = 최고 효율로 대량의 전력을 생산할 수 있는 고급 발전기. 가동을 시작하려면 상당한 전력 공급이 필요합니다.
block.mechanical-drill.description = 가격이 싼 드릴. 적절한 타일에 설치하면 자원을 천천히 느린 속도로 출력합니다. 기본 자원만 채굴할 수 있습니다. block.mechanical-drill.description = 가격이 싼 드릴. 적절한 타일에 설치하면 자원을 천천히 느린 속도로 출력합니다. 기본 자원만 채굴할 수 있습니다.
block.pneumatic-drill.description = 티타늄을 캘 수 있는 향상된 드릴. 기계식 드릴보다 더 빠른 속도로 채굴합니다. block.pneumatic-drill.description = 티타늄을 캘 수 있는 향상된 드릴. 기계식 드릴보다 더 빠른 속도로 채굴합니다.
block.laser-drill.description = 레이저 기술을 통해 더욱 빠르게 채광할 수 있지만, 전력이 필요합니다. 토륨 채굴 가능. block.laser-drill.description = 레이저 기술을 통해 더욱 빠르게 채광할 수 있지만, 전력이 필요합니다. 토륨 채굴 가능.
block.blast-drill.description = 최상위 드릴. 많은 양의 전력이 필요합니다. block.blast-drill.description = 최상위 드릴. 많은 양의 전력이 필요합니다.
block.water-extractor.description = 지하수를 추출합니다. 물을 구하기 어려운 곳에서 사용합니다. block.water-extractor.description = 지하수를 추출합니다. 물을 구하기 어려운 곳에서 사용합니다.
block.cultivator.description = 대기 중의 작은 농도의 포자를 산업용 포자로 배양합니다. block.cultivator.description = 대기 중의 작은 농도의 포자를 산업용 포자로 배양합니다.
@@ -1430,33 +1439,33 @@ block.core-nucleus.description = 기지의 핵심입니다. 방어력이 매우
block.core-nucleus.details = 세 번째, 궁극의 버전. block.core-nucleus.details = 세 번째, 궁극의 버전.
block.vault.description = 각 유형의 많은 양의 자원을 저장합니다. 언로더 블록을 사용하여 창고에서 자원을 빼낼 수 있습니다. block.vault.description = 각 유형의 많은 양의 자원을 저장합니다. 언로더 블록을 사용하여 창고에서 자원을 빼낼 수 있습니다.
block.container.description = 각 유형의 자원을 소량 저장합니다. 언로더 블록을 사용하여 컨테이너에서 자원을 빼낼 수 있습니다. block.container.description = 각 유형의 자원을 소량 저장합니다. 언로더 블록을 사용하여 컨테이너에서 자원을 빼낼 수 있습니다.
block.unloader.description = 근처의 비 수송 블록에서 자원을 빼냅니다. 눌러서 빼낼 자원을 변경할 수 있니다. 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 = 지상 목표물에 강력한 에너지 빔을 충전하여 발사합니다.
block.arc.description = 지상 목표물에 전격 아크를 발사합니다. block.arc.description = 지상 목표물에 전격 아크를 발사합니다.
block.swarmer.description = 적에게 유도탄을 발사합니다. block.swarmer.description = 적에게 유도탄을 발사합니다.
block.salvo.description = 적에게 총알을 빠르게 일제히 발사합니다. block.salvo.description = 적에게 총알을 빠르게 일제히 발사합니다.
block.fuse.description = 주변 적에게 3개의 단거리 관통 레이저를 발사합니다. block.fuse.description = 주변 적에게 3개의 단거리 관통 레이저를 발사합니다.
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 = 장거리에 걸친 거대한 단일 목표 저격탄을 발사합니다. block.foreshadow.description = 장거리에 걸친 거대한 단일 목표 저격탄을 발사합니다.
block.repair-point.description = 인근에 가장 가까운 유닛을 지속적으로 치료합니다. block.repair-point.description = 인근에 가장 가까운 유닛을 지속해서 치료합니다.
block.segment.description = 날아오는 발사체를 요격합니다. 큰 발사체에겐 조준하지 않습니다. block.segment.description = 날아오는 발사체를 요격합니다. 큰 발사체 조준하지 않습니다.
block.parallax.description = 공중 목표물을 끌어오는 견인 광선을 발사하며, 견인 과정에서 데미지를 줍니다. block.parallax.description = 공중 목표물을 끌어오는 견인 광선을 발사하며, 견인 과정에서 데미지를 줍니다.
block.tsunami.description = 적에게 강력한 액체 줄기를 발사합니다. 물이 공급되면 자동으로 주변의 화재를 진압합니다. block.tsunami.description = 적에게 강력한 액체 줄기를 발사합니다. 물이 공급되면 자동으로 주변의 화재를 진압합니다.
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 = 4개의 명령어로 유닛 행동을 제어합니다. block.command-center.description = 4개의 명령어로 유닛 행동을 제어합니다.
block.ground-factory.description = 지상 유닛들을 생산합니다. 생산된 유닛들은 바로 사용될 수 있고, 또는 강화를 위해 재구성기에 들어가질 수 있습니다. block.ground-factory.description = 지상 유닛들을 생산합니다. 생산된 유닛들은 바로 사용될 수 있고, 또는 강화를 위해 재구성기에 들어가질 수 있습니다.
block.air-factory.description = 공중 유닛들을 생산합니다. 생산된 유닛들은 바로 사용될 수 있고, 또는 강화를 위해 재구성기에 들어가질 수 있습니다. block.air-factory.description = 공중 유닛들을 생산합니다. 생산된 유닛들은 바로 사용될 수 있고, 또는 강화를 위해 재구성기에 들어가질 수 있습니다.
block.naval-factory.description = 해상 유닛들을 생산합니다. 생산된 유닛들은 바로 사용될 수 있고, 또는 강화를 위해 재구성기에 들어가질 수 있습니다. block.naval-factory.description = 해상 유닛들을 생산합니다. 생산된 유닛들은 바로 사용될 수 있고, 또는 강화를 위해 재구성기에 들어가질 수 있습니다.
@@ -1507,3 +1516,127 @@ unit.omura.description = 적에게 장거리 관통 레일건을 발사합니다
unit.alpha.description = 적으로부터 코어: 조각을 방어합니다. 구조물을 짓습니다. unit.alpha.description = 적으로부터 코어: 조각을 방어합니다. 구조물을 짓습니다.
unit.beta.description = 적으로부터 코어: 기반을 방어합니다. 구조물을 짓습니다. unit.beta.description = 적으로부터 코어: 기반을 방어합니다. 구조물을 짓습니다.
unit.gamma.description = 적으로부터 코어: 핵심을 방어합니다. 구조물을 짓습니다. unit.gamma.description = 적으로부터 코어: 핵심을 방어합니다. 구조물을 짓습니다.
lst.read = 연결된 메모리 셀에서 숫자 읽기
lst.write = 연결된 메모리 셀에 숫자 쓰기
lst.print = 프린트 버퍼에 텍스트 추가하기\n[accent]Print Flush[]가 사용되기 전까진 아무것도 보여주지 않습니다.
lst.draw = 드로잉 버퍼에 실행문 추가하기\n[accent]Draw Flush[]가 사용되기 전까진 아무것도 보여주지 않습니다.
lst.drawflush = 대기중인 [accent]Draw[]실행문을 디스플레이에 출력하기
lst.printflush = 대기중인 [accent]Print[]실행문을 메시지 블록에 출력하기
lst.getlink = 순서별로 프로세서 연결 가져오기. 0부터 시작
lst.control = 건물 조종하기
lst.radar = 건물 주변의 유닛 검색하기
lst.sensor = 건물 또는 유닛의 정보 얻기
lst.set = 변수 선언/할당하기
lst.operation = 1~2개의 변수로 연산하기
lst.end = 실행줄의 가장 위로 점프하기
lst.jump = 조건부로 다른 실행문으로 점프하기
lst.unitbind = type 옆에 있는 유닛을 지정하고, [accent]@unit[]에 저장하기
lst.unitcontrol = 현재 지정된 유닛을 조종하기
lst.unitradar = 현재 지정된 유닛 주변의 유닛 검색하기
lst.unitlocate = 특정 유형의 위치/건물을 지도상에서 찾기\n지정된 유닛이 필요합니다.
lenum.type = 건물/유닛의 타입\n예로 분배기는 [accent]@router[]를 반환할 것입니다.\n문자열이 아니라.
lenum.shoot = 특정 위치에 발사
lenum.shootp = 목표물 속도를 예측하여 발사
lenum.configure = 필터의 아이템같은 건물의 설정
lenum.enabled = 블록의 활성 여부
lenum.color = 조명 색 설정
lenum.always = 항상 참
lenum.idiv = 정수 나누기
lenum.div = 나누기\n0으로 나누면 [accent]null[]을 반환합니다.
lenum.mod = 나머지
lenum.equal = 동치 비교. 형변환 가능\nNull이 아닌 객체가 숫자와 비교할려면 1이 되고, Null이면 0이 됩니다.
lenum.notequal = 동치 부정. 형변환 가능
lenum.strictequal = 엄격한 동치 비교. 형변환 불가능\n[accent]null[]를 확인하는데 쓸 수 있습니다.
lenum.shl = 왼쪽으로 비트 이동
lenum.shr = 오른쪽으로 비트 이동
lenum.or = 비트연산자 OR
lenum.land = 논리연산자 AND
lenum.and = 비트연산자 AND
lenum.not = 비트연산자 NOT
lenum.xor = 비트연산자 XOR
lenum.min = 두 수의 최솟값
lenum.max = 두 수의 최댓값
lenum.angle = 벡터의 각(도)
lenum.len = 벡터의 길이
lenum.sin = 사인(도)
lenum.cos = 코사인(도)
lenum.tan = 탄젠트(도)
#not a typo, look up 'range notation'
lenum.rand = 범위 내 난수[0 ~ 값)
lenum.log = 자연 로그(진수)
lenum.log10 = 상수 로그
lenum.noise = 2D 심플렉스 노이즈
lenum.abs = 절댓값
lenum.sqrt = 제곱근
lenum.any = 유닛
lenum.ally = 아군 유닛
lenum.attacker = 무기를 가진 유닛
lenum.enemy = 적 유닛
lenum.boss = 수호자 유닛
lenum.flying = 공중 유닛
lenum.ground = 지상 유닛
lenum.player = 플레이어에 의해 조종된 유닛
lenum.ore = 광석 매장지
lenum.damaged = 손상된 아군 건물
lenum.spawn = 적 스폰 지점\n코어 또는 지점일 수 있음.
lenum.building = 특정 건물 집단에 속한 건물
lenum.core = 코어
lenum.storage = 창고같은 저장 건물
lenum.generator = 전력을 생산하는 건물
lenum.factory = 자원을 변환하는 건물
lenum.repair = 수리 지점
lenum.rally = 지휘소
lenum.battery = 배터리
lenum.resupply = 보급 지점.\n[accent]"유닛 탄약 필요"[]가 활성화되었을 때만 유의미합니다.
lenum.reactor = 핵융합로/토륨 원자로
lenum.turret = 포탑ㅁ
sensor.in = 감지할 건물/유닛
radar.from = 감지를 할 건물\n감지 범위는 건물의 감지 범위에 의해 제한됩니다.
radar.target = 유닛 감지 필터
radar.and = 추가 필터
radar.order = 정렬 순서. 0은 반전
radar.sort = 결과를 정렬할 측정 수단
radar.output = 찾은 유닛을 대입할 변수
unitradar.target = 유닛 감지 필터
unitradar.and = 추가 필터
unitradar.order = 정렬 순서. 0은 반전
unitradar.sort = 결과를 정렬할 측정 수단
unitradar.output = 찾은 유닛을 대입할 변수
control.of = 조종할 건물
control.unit = 조준할 유닛/건물
control.shoot = 발사 여부
unitlocate.enemy = 적 건물 포함 여부
unitlocate.found = 대상 발견 여부
unitlocate.building = 찾은 건물을 대입할 변수
unitlocate.outx = X좌표
unitlocate.outy = Y좌표
unitlocate.group = 찾을 건물 집단
lenum.stop = 이동/채광/건설 중단
lenum.move = 특정 위치로 이동
lenum.approach = 특정 위치로 반지름만큼 접근
lenum.pathfind = 적 스폰 지점으로 길찾기
lenum.target = 특정 위치에 발사
lenum.targetp = 목표물 속도를 예측하여 발사
lenum.itemdrop = 아이템 투하
lenum.itemtake = 건물에서 아이템 수송
lenum.paydrop = 현재 화물 투하
lenum.paytake = 현재 위치에서 화물 수송
lenum.flag = 깃발 수 설정
lenum.mine = 특정 위치에서 채광
lenum.build = 구조물 건설
lenum.getblock = 특정 좌표의 빌딩과 블록을 반환합니다.\n위치는 유닛의 인지 범위 내여야 합니다.\n자연 지형은 [accent]@solid[]의 타입을 가집니다.
lenum.within = 좌표 주변 유닛 발견 여부
lenum.boost = 이륙 시작/중단

View File

@@ -43,8 +43,8 @@ be.check = Verifică updateurile
mods.browser = Browser de Moduri mods.browser = Browser de Moduri
mods.browser.selected = Mod selectat mods.browser.selected = Mod selectat
mods.browser.add = Instalează mods.browser.add = Instalare
mods.browser.reinstall = Reinstalează mods.browser.reinstall = Reinstal.
mods.github.open = Github mods.github.open = Github
mods.browser.sortdate = Cele mai recente mods.browser.sortdate = Cele mai recente
mods.browser.sortstars = Cele mai multe stele mods.browser.sortstars = Cele mai multe stele
@@ -113,7 +113,7 @@ committingchanges = Se Încarcă Schimbările
done = Gata done = Gata
feature.unsupported = Dispozitivul tău nu suportă această funcție. feature.unsupported = Dispozitivul tău nu suportă această funcție.
mods.alphainfo = Modurile sunt încă în alpha și[scarlet] pot avea multe buguri[].\nRaportează orice probleme apărute pe Githubul Mindustry. mods.initfailed = [red]⚠[] Instanța Mindustry precedentă a eșuat la inițializare. De obicei se întâmplă din cauza unui mod care nu se acționează cum trebuie.\n\nPt a preveni un lanț de crashuri continue, [red]toate modurile au fost dezactivate.[]\n\nPoți dezactiva asta din [accent]Setări->Joc->Dezactivează Modurile în Cazul unui Crash la Pornire[].
mods = Moduri mods = Moduri
mods.none = [lightgray]Nu s-au găsit moduri! mods.none = [lightgray]Nu s-au găsit moduri!
mods.guide = Ghid de Modding mods.guide = Ghid de Modding
@@ -312,6 +312,7 @@ cancelbuilding = [accent][[{0}][] pt a curăța planul
selectschematic = [accent][[{0}][] pt selectare+copiere selectschematic = [accent][[{0}][] pt selectare+copiere
pausebuilding = [accent][[{0}][] pt a face o pauză de la construit pausebuilding = [accent][[{0}][] pt a face o pauză de la construit
resumebuilding = [scarlet][[{0}][] pt a continua construitul resumebuilding = [scarlet][[{0}][] pt a continua construitul
enablebuilding = [scarlet][[{0}][] pt a construi
showui = Interfață ascunsă.\nApasă [accent][[{0}][] pt a vedea interfața. showui = Interfață ascunsă.\nApasă [accent][[{0}][] pt a vedea interfața.
wave = [accent]Valul {0} wave = [accent]Valul {0}
wave.cap = [accent]Valul {0}/{1} wave.cap = [accent]Valul {0}/{1}
@@ -683,6 +684,7 @@ stat.drillspeed = Viteză Burghiu (Bază)
stat.boosteffect = Efect de Îmbunătățire stat.boosteffect = Efect de Îmbunătățire
stat.maxunits = Maxim Unități Active stat.maxunits = Maxim Unități Active
stat.health = Viață stat.health = Viață
stat.armor = Armură
stat.buildtime = Timp Construcție stat.buildtime = Timp Construcție
stat.maxconsecutive = Maxim Consecutive stat.maxconsecutive = Maxim Consecutive
stat.buildcost = Cost Construcție stat.buildcost = Cost Construcție
@@ -794,9 +796,11 @@ setting.shadows.name = Umbre
setting.blockreplace.name = Sugestii Plasare Automats setting.blockreplace.name = Sugestii Plasare Automats
setting.linear.name = Filtrare Liniară setting.linear.name = Filtrare Liniară
setting.hints.name = Indicii setting.hints.name = Indicii
setting.logichints.name = Indicii Procesoare Logice
setting.flow.name = Afișează Rata de Curgere a lichidelor setting.flow.name = Afișează Rata de Curgere a lichidelor
setting.buildautopause.name = Autopauză de la Construit setting.buildautopause.name = Autopauză de la Construit
setting.backgroundpause.name = Pune Pauză în Fundal setting.backgroundpause.name = Pune Pauză în Fundal
setting.modcrashdisable = 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.antialias.name = Antialiasing[lightgray] (necesită repornire)[]
@@ -954,6 +958,8 @@ rules.blockdamagemultiplier = Multiplicatorul Deteriorării Blocurilor
rules.unitbuildspeedmultiplier = Multiplicatorul Vitezei de Producere a Unităților rules.unitbuildspeedmultiplier = Multiplicatorul Vitezei de Producere a Unităților
rules.unithealthmultiplier = Multiplicatorul Vieții Unităților rules.unithealthmultiplier = Multiplicatorul Vieții Unităților
rules.unitdamagemultiplier = Multiplicatorul Deteriorării Unităților rules.unitdamagemultiplier = Multiplicatorul Deteriorării Unităților
rules.unitcapvariable = Nucleele Contribuie la Limita Unităților
rules.unitcap = Limita de Bază a Unităților
rules.enemycorebuildradius = Interzisă Construirea în Jurul Nucleului Inamic:[lightgray] (pătrate) rules.enemycorebuildradius = Interzisă Construirea în Jurul Nucleului Inamic:[lightgray] (pătrate)
rules.wavespacing = Spațiul Dintre Valuri:[lightgray] (sec) rules.wavespacing = Spațiul Dintre Valuri:[lightgray] (sec)
rules.buildcostmultiplier = Multiplicatorul Costului Construcției rules.buildcostmultiplier = Multiplicatorul Costului Construcției
@@ -1034,7 +1040,7 @@ unit.omura.name = Omura
unit.alpha.name = Alpha unit.alpha.name = Alpha
unit.beta.name = Beta unit.beta.name = Beta
unit.gamma.name = Gamma unit.gamma.name = Gamma
unit.scepter.name = Septer unit.scepter.name = Scepter
unit.reign.name = Reign unit.reign.name = Reign
unit.vela.name = Vela unit.vela.name = Vela
unit.corvus.name = Corvus unit.corvus.name = Corvus
@@ -1144,10 +1150,6 @@ block.armored-conveyor.name = Bandă Armată
block.junction.name = Intersecție block.junction.name = Intersecție
block.router.name = Router block.router.name = Router
block.distributor.name = Distributor block.distributor.name = Distributor
#experimental, pot fi șterse în viitor
block.block-forge.name = Forjă de Blocuri
block.block-loader.name = Încărcător de Blocuri
block.block-unloader.name = Descărcător de Blocuri
block.sorter.name = Sortator block.sorter.name = Sortator
block.inverted-sorter.name = Sortator Invers block.inverted-sorter.name = Sortator Invers
block.message.name = Mesaj block.message.name = Mesaj
@@ -1227,7 +1229,7 @@ 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
block.rtg-generator.name = Generator RTG block.rtg-generator.name = Generator RTG
block.spectre.name = Specter block.spectre.name = Spectre
block.meltdown.name = Meltdown block.meltdown.name = Meltdown
block.foreshadow.name = Foreshadow block.foreshadow.name = Foreshadow
block.container.name = Container block.container.name = Container
@@ -1248,6 +1250,10 @@ block.disassembler.name = Dezasamblator
block.silicon-crucible.name = Creuzet de Silicon block.silicon-crucible.name = Creuzet de Silicon
block.overdrive-dome.name = Dom de Suprasolicitare block.overdrive-dome.name = Dom de Suprasolicitare
block.interplanetary-accelerator.name = Accelerator Interplanetar block.interplanetary-accelerator.name = Accelerator Interplanetar
#experimental, pot fi șterse în viitor
block.block-forge.name = Forjă de Blocuri
block.block-loader.name = Încărcător de Blocuri
block.block-unloader.name = Descărcător de Blocuri
block.switch.name = Întrerupător block.switch.name = Întrerupător
block.micro-processor.name = Microprocesor block.micro-processor.name = Microprocesor
@@ -1450,6 +1456,7 @@ block.ripple.description = Lovește cu capsule către inamici pe distanțe mari.
block.cyclone.description = Trage cu grămezi explozive de material către unitățile inamice din apropiere. block.cyclone.description = Trage cu grămezi explozive de material către unitățile inamice din apropiere.
block.spectre.description = Trage cu gloanțe mari care penetrează scuturile inamicilor din apropiere. block.spectre.description = Trage cu gloanțe mari care penetrează scuturile inamicilor din apropiere.
block.meltdown.description = Se încarcă și trage cu un laser continuu la inamicii din apropiere. Necesită răcitor pt a opera. block.meltdown.description = Se încarcă și trage cu un laser continuu la inamicii din apropiere. Necesită răcitor pt a opera.
block.foreshadow.description = Trage către o țintă cu un glonț imens pe distanțe lungi.
block.repair-point.description = Repară încontinuu cea mai deteriorată unitate din vecinătate. block.repair-point.description = Repară încontinuu cea mai deteriorată unitate din vecinătate.
block.segment.description = Deteriorează și distruge proiectilele din apropiere. Laserele nu sunt afectate. block.segment.description = Deteriorează și distruge proiectilele din apropiere. Laserele nu sunt afectate.
block.parallax.description = Trage cu o rază tractoare care atrage aeronavele inamice, deteriorându-le. block.parallax.description = Trage cu o rază tractoare care atrage aeronavele inamice, deteriorându-le.
@@ -1510,3 +1517,139 @@ 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.
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.print = Adaugă text în bufferul de tipărire.\nNu tipărește decât când se execută [accent]Print Flush[].
lst.draw = Adaugă o operație în bufferul de desenare.\nNu afișează decât când se execută [accent]Draw Flush[].
lst.drawflush = Afișează pe un monitor instrucțiunile [accent]Draw[] aflate în așteptare.
lst.printflush = Tipărește într-un bloc Mesaj instrucțiunile [accent]Print[] aflate în așteptare.
lst.getlink = Obține o conexiune a procesorului după index. Începe de la 0.
lst.control = Controlează o clădire.
lst.radar = Localizează unitățile aflate în jurul unei clădiri. Are o anumită rază de acțiune.
lst.sensor = Obține date de la o clădire sau unitate.
lst.set = Setează o variabilă.
lst.operation = Efectuează o operație pe 1-2 variabile.
lst.end = Sari la începutul listei de instrucțiuni.
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.unitcontrol = Controlează unitatea controlată de procesor.
lst.unitradar = Localizează unitățile din jurul unității controlate de procesor.
lst.unitlocate = Localizează o poziție/clădire specifică oriunde pe hartă.\nNecesită o unitate controlată de procesor.
lenum.type = Tipul clădirii/unității.\nde ex.: pt orice Router, va returna [accent]@router[].\nNu e un șir de caractere.
lenum.shoot = Lovește către o locație.
lenum.shootp = Lovește către o unitate/clădire. Anticipează viteza țintei și a proiectilului.
lenum.configure = Configurașia clădirii, de ex. materialul selectat pt Sortator.
lenum.enabled = Specifică dacă clădirea este pornită.
laccess.color = Culoarea iluminatorului.
graphicstype.clear = Umple monitorul cu o culoare.
graphicstype.color = Setează culoarea pt următoarea instrucțiune Draw.
graphicstype.stroke = Setează grosimea liniei.
graphicstype.line = Desenează un segment de linie.
graphicstype.rect = Desenează un dreptunghi.
graphicstype.linerect = Desenează conturul unui dreptunghi.
graphicstype.poly = Desenează un poligon regulat.
graphicstype.linepoly = Desenează conturul unui poligon regulat.
graphicstype.triangle = Desenează un triunghi.
graphicstype.image = Desenează imaginea unui obiect din joc.\nde ex.: [accent]@router[] sau [accent]@dagger[].
lenum.always = Mereu adevărat.
lenum.idiv = Împărțirea naturală a numerelor (int).
lenum.div = Împărțirea.\nReturnează [accent]null[] dacă împarți la 0.
lenum.mod = Modulo (restul împărțirii).
lenum.equal = Egal. Convertește tipurile variabilelor.\nObiectele nenule comparate cu numere devin 1, cele nule devin 0.
lenum.notequal = Nu e egal. Convertește tipurile variabilelor.
lenum.strictequal = Egalitate strictă. Nu convertește tipurile variabilelor.\nPoate fi folosit pt a verifica dacă ceva este [accent]null[].
lenum.shl = Shift left pe biți.
lenum.shr = Shift right pe biți.
lenum.or = OR/SAU. Ține cont de biți.
lenum.land = Logical AND/ȘI logic. Nu ține cont de biți.
lenum.and = AND/ȘI. Ține cont de biți.
lenum.not = NOT. Inversează biții.
lenum.xor = XOR/disjuncție exclusivă. Ține cont de biți.
lenum.min = Minimul a două numere.
lenum.max = Maximul a două numere.
lenum.angle = Unghiul unui vector în grade.
lenum.len = Lungimea unui vector.
lenum.sin = Sinus în grade.
lenum.cos = Cosinus în grade.
lenum.tan = Tangentă în grade.
#cea de mai jos nu-i o greșeală, caută pe net notarea intervalelor în matematică
lenum.rand = Număr aleatoriu în intervalul [0, val).
lenum.log = Logaritm natural (ln).
lenum.log10 = Logaritm în baza 10.
lenum.noise = 2D simplex noise.
lenum.abs = Valoarea absolută.
lenum.sqrt = Radical/rădăcina pătrată.
lenum.any = Orice unitate.
lenum.ally = Unitate aliată.
lenum.attacker = Unitate cu armă.
lenum.enemy = Unitate inamică.
lenum.boss = Unitate gardian.
lenum.flying = Unitate care zboară.
lenum.ground = Unitate de artilerie.
lenum.player = Unitate controlată de un jucător.
lenum.ore = Depozit de minereu.
lenum.damaged = Clădire aliată deteriorată.
lenum.spawn = Punct de lansare inamic.\nPoate fi un nucleu sau o poziție.
lenum.building = Clădire dintr-un grup specific.
lenum.core = Orice nucleu.
lenum.storage = Clădire de stocare, de ex. Containerul.
lenum.generator = Clădiri care generează electricitate.
lenum.factory = Clădiri care transformă resurse.
lenum.repair = Puncte de Reparare.
lenum.rally = Centre de Comandă.
lenum.battery = Orice baterie.
lenum.resupply = Puncte de Realimentare.\nRelevant doar când [accent]"Unitățile Necesită Muniție"[] este activată.
lenum.reactor = Reactor de Toriu/Impact.
lenum.turret = Orice armă.
sensor.in = Clădirea/unitatea care trebuie detectată.
radar.from = Clădirea de la care detectăm.\nRaza senzorului e limitată de raza de costrucție.
radar.target = Filtru pt unitățile care trebuie detectate.
radar.and = Adaugă filtre.
radar.order = Ordinea de sortare. 0 pt a inversa ordinea.
radar.sort = Modul cum sortăm rezultatele.
radar.output = Variabila în care se va scrie unitatea detectată.
unitradar.target = Filtru pt unitățile care trebuie detectate.
unitradar.and = Adaugă filtre.
unitradar.order = Ordinea de sortare. 0 pt a inversa ordinea.
unitradar.sort = Modul cum sortăm rezultatele.
unitradar.output = Variabila în care se reține unitatea detectată.
control.of = Clădirea de controlat.
control.unit = Unitatea/clădirea către care se țintește.
control.shoot = Specifică dacă armele trag.
unitlocate.enemy = Specifică dacă se detectează clădirile inamice.
unitlocate.found = Specifică dacă obiectul a fost găsit.
unitlocate.building = Clădirea detectată.
unitlocate.outx = Coordonata X a obiectului detectat.
unitlocate.outy = Coordonata Y a obiectului detectat.
unitlocate.group = Grupul clădirilor de detectat.
lenum.stop = Oprește acțiunea curentă. Nu mișca/mina/construi.
lenum.move = Mergi la această poziție.
lenum.approach = Apropie-te la o anumită distanță de poziție.
lenum.pathfind = Găsește ruta către punctul de lansare inamic. Poate fi un nucleu.
lenum.target = Lovește către o poziție.
lenum.targetp = Lovește o țintă. Anticipează viteza țintei și a proiectilului.
lenum.itemdrop = Descarcă o bucată de material.
lenum.itemtake = Ia o bucată de material dintr-o clădire.
lenum.paydrop = Descarcă încărcătura curentă.
lenum.paytake = Ia o încărcătură de la locația curentă.
lenum.flag = Oferă o etichetă numerică unității.
lenum.mine = Minează din această locație.
lenum.build = Construiește o structură.
lenum.getblock = Obține clădirea și tipul clădirii aflate la coordonatele specificate.\nUnitatea trebuie să se afle în raza poziției.\nBlocurile solide care nu sunt clădiri vor avea tipul [accent]@solid[].
lenum.within = Verifică dacă unitatea se află în apropierea poziției.
lenum.boost = Pornește/oprește propulsorul.

View File

@@ -312,6 +312,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 = Интерфейс скрыт.\nНажмите [accent][[{0}][] для отображения интерфейса. showui = Интерфейс скрыт.\nНажмите [accent][[{0}][] для отображения интерфейса.
wave = [accent]Волна {0} wave = [accent]Волна {0}
wave.cap = [accent]Волна {0}/{1} wave.cap = [accent]Волна {0}/{1}
@@ -683,6 +684,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 = Стоимость строительства
@@ -794,6 +796,7 @@ setting.shadows.name = Тени
setting.blockreplace.name = Автоматическая замена блоков setting.blockreplace.name = Автоматическая замена блоков
setting.linear.name = Линейная фильтрация setting.linear.name = Линейная фильтрация
setting.hints.name = Подсказки setting.hints.name = Подсказки
setting.logichints.name = Подсказки для логики
setting.flow.name = Показывать скорость потока ресурсов setting.flow.name = Показывать скорость потока ресурсов
setting.backgroundpause.name = Фоновая пауза setting.backgroundpause.name = Фоновая пауза
setting.buildautopause.name = Автоматическая приостановка строительства setting.buildautopause.name = Автоматическая приостановка строительства
@@ -954,6 +957,8 @@ rules.blockdamagemultiplier = Множитель урона блоков
rules.unitbuildspeedmultiplier = Множитель скорости производства боев. ед. rules.unitbuildspeedmultiplier = Множитель скорости производства боев. ед.
rules.unithealthmultiplier = Множитель здоровья боев. ед. rules.unithealthmultiplier = Множитель здоровья боев. ед.
rules.unitdamagemultiplier = Множитель урона боев. ед. rules.unitdamagemultiplier = Множитель урона боев. ед.
rules.unitcapvariable = Ядра увеличивают лимит единиц
rules.unitcap = Начальный лимит единиц
rules.enemycorebuildradius = Радиус защиты враж. ядер:[lightgray] (блок.) rules.enemycorebuildradius = Радиус защиты враж. ядер:[lightgray] (блок.)
rules.wavespacing = Интервал волн:[lightgray] (сек) rules.wavespacing = Интервал волн:[lightgray] (сек)
rules.buildcostmultiplier = Множитель затрат на строительство rules.buildcostmultiplier = Множитель затрат на строительство
@@ -1511,3 +1516,128 @@ unit.omura.description = Стреляет дальнобойным пробив
unit.alpha.description = Защищает ядро «Осколок» от врагов. Основная строительная единица. unit.alpha.description = Защищает ядро «Осколок» от врагов. Основная строительная единица.
unit.beta.description = Защищает ядро «Штаб» от врагов. Основная строительная единица. unit.beta.description = Защищает ядро «Штаб» от врагов. Основная строительная единица.
unit.gamma.description = Защищает ядро «Атом» от врагов. Основная строительная единица. unit.gamma.description = Защищает ядро «Атом» от врагов. Основная строительная единица.
lst.read = Считывает число из соединённой ячейки памяти.
lst.write = Записывает число в соединённую ячейку памяти.
lst.print = Добавляет текст в текстовый буфер. Ничего не отображает, пока не будет вызван [accent]Print Flush[].
lst.draw = Добавляет операцию в буфер отрисовки. Ничего не отображает, пока не будет вызван [accent]Draw Flush[].
lst.drawflush = Сбрасывает буфер [accent]Draw[] операций на дисплей.
lst.printflush = Сбрасывает буфер [accent]Print[] операций в блок-сообщение.
lst.getlink = Получает соединение процессора по индексу. Начинает с 0.
lst.control = Контролирует блок.
lst.radar = Обнаруживает единицы вокруг постройки с заданным радиусом.
lst.sensor = Получает данные из постройки или единицы.
lst.set = Устанавливает переменную.
lst.operation = Совершает операцию над 1-2 переменными.
lst.end = Переходит к началу стека операций.
lst.jump = Условно переходит к другой операции.
lst.unitbind = Привязывается к единице определённого типа и сохраняет её в [accent]@unit[].
lst.unitcontrol = Управляет привязанной в данный момент единицей.
lst.unitradar = Обнаруживает единицы вокруг привязанной в данный момент единицы.
lst.unitlocate = Обнаруживает позицию/постройку определённого типа где-либо на карте. Требует привязанную единицу.
lenum.type = Тип постройки/единицы. \nНапример, для маршрутизатора это будет [accent]@router[].\nНе строка.
lenum.shoot = Стрельба в определённую позицию.
lenum.shootp = Стрельба в единицу/постройку с расчётом скорости.
lenum.configure = Конфигурация постройки, например, предмет сортировки.
lenum.enabled = Включён ли блок.
laccess.color = Цвет осветителя.
lenum.always = Всегда истина.
lenum.idiv = Целочисленное деление.
lenum.div = Деление.\nВозвращает [accent]null[] при делении на ноль.
lenum.mod = Остаток от деления.
lenum.equal = Равно. Приводит типы.\nНе-null объекты, по сравнению с числами, становятся 1, иначе — 0.
lenum.notequal = Не равно. Приводит типы.
lenum.strictequal = Строгое равенство. Не приводит типы.\nМожет быть использовано для проверки на [accent]null[].
lenum.shl = Побитовый сдвиг влево.
lenum.shr = Побитовый сдвиг вправо.
lenum.or = Побитовое ИЛИ.
lenum.land = Булевое И.
lenum.and = Побитовое И.
lenum.not = Побитовое НЕ.
lenum.xor = Побитовое исключающее ИЛИ.
lenum.min = Минимальное из двух чисел.
lenum.max = Максимальное из двух чисел.
lenum.angle = Угол вектора в градусах.
lenum.len = Длина вектора.
lenum.sin = Синус, в градусах.
lenum.cos = Косинус, в градусах.
lenum.tan = Тангенс, в градусах.
#это не ошибка, поищите 'обозначение диапазонов'
lenum.rand = Случайное число в диапазоне [0, значение).
lenum.log = Натуральный логарифм (ln).
lenum.log10 = Логарифм по основанию 10.
lenum.noise = Симплексный шум, 2D.
lenum.abs = Абсолютная величина.
lenum.sqrt = Квадратный корень.
lenum.any = Любая единица.
lenum.ally = Дружеская единица.
lenum.attacker = Единица с оружием.
lenum.enemy = Вражеская единица.
lenum.boss = Страж.
lenum.flying = Летающая единица.
lenum.ground = Наземная единица.
lenum.player = Единица, управляемая игроком.
lenum.ore = Источник руды.
lenum.damaged = Повреждённая дружеская постройка.
lenum.spawn = Точка появления врагов.\nМожет быть ядром или позицией на карте.
lenum.building = Постройка определённой группы.
lenum.core = Любое ядро.
lenum.storage = Здание хранения, например, хранилище.
lenum.generator = Постройки, вырабатывающие энергию.
lenum.factory = Постройки, перерабатывающие предметы.
lenum.repair = Ремонтные пункты.
lenum.rally = Командный центр.
lenum.battery = Любой аккумулятор.
lenum.resupply = Пункты снабжения.\nАктуально только при включённом [accent]"Боев. ед. требуют боеприпасы"[].
lenum.reactor = Импульсный/ториевый реактор.
lenum.turret = Любая турель.
sensor.in = Постройка/единица для распознавания.
radar.from = Постройка, от которой распознавать.\nДальность сенсора ограничена дальностью постройки.
radar.target = Фильтр для распознавания единиц.
radar.and = Дополнительные фильтры.
radar.order = Порядок сортировки. 0 для обратного.
radar.sort = Показатель для сортировки результатов.
radar.output = Переменная для записи конечной единицы.
unitradar.target = Фильтр для распознавания единиц.
unitradar.and = Дополнительные фильтры.
unitradar.order = Порядок сортировки. 0 для обратного.
unitradar.sort = Показатель для сортировки результатов.
unitradar.output = Переменная для записи конечной единицы.
control.of = Постройка для контролирования.
control.unit = Единица/постройка для прицеливания.
control.shoot = Стрелять ли.
unitlocate.enemy = Обнаруживать ли вражеские постройки.
unitlocate.found = Найден ли объект.
unitlocate.building = Переменная для записи обнаруженной постройки.
unitlocate.outx = Вывод X координаты.
unitlocate.outy = Вывод Y координаты.
unitlocate.group = Группа построек для поиска.
lenum.stop = Остановка передвижения/копания/стротельства.
lenum.move = Перемещение в определённую позицию.
lenum.approach = Приближение к позиции с указанным радиусом.
lenum.pathfind = Перемещение к точке появления врагов.
lenum.target = Стрельба в определённую позицию.
lenum.targetp = Стрельба в единицу/постройку с расчётом скорости.
lenum.itemdrop = Сбрасывание предметов.
lenum.itemtake = Взятие предметов из постройки.
lenum.paydrop = Сбрасывание текущего груза.
lenum.paytake = Взятие груза на текущей позиции.
lenum.flag = Числовой флаг единицы.
lenum.mine = Копание в позиции.
lenum.build = Строительство структур.
lenum.getblock = Распознавание блока и его типа на координатах.\nЕдиница должна находиться в пределах досягаемости.\nТвёрдые не-постройки будут иметь тип [accent]@solid[].
lenum.within = Проверка на нахождение единицы рядом с позицией.
lenum.boost = Включение/выключение полёта.

View File

@@ -40,24 +40,24 @@ be.ignore = Bỏ qua
be.noupdates = Không tìm thấy bản cập nhật mới. be.noupdates = Không tìm thấy bản cập nhật mới.
be.check = Kiểm tra các bản cập nhật. be.check = Kiểm tra các bản cập nhật.
schematic = Schematic schematic = Bản thiết kế
schematic.add = Lưu Schematic... schematic.add = Lưu bản thiết kế...
schematics = Schematics schematics = Các bản thiết kế
schematic.replace = Schematics có tên đó đã tồn tại. Thay thế nó? schematic.replace = Bản thiết kế có tên đó đã tồn tại. Thay thế nó?
schematic.exists = Schematics có tên đó đã tồn tại. schematic.exists = Bản thiết kế có tên đó đã tồn tại.
schematic.import = Nhập Schematic... schematic.import = Nhập Bản thiết kế...
schematic.exportfile = Xuất tệp schematic.exportfile = Xuất tệp
schematic.importfile = Nhập tệp schematic.importfile = Nhập tệp
schematic.browseworkshop = Duyệt qua Workshop schematic.browseworkshop = Duyệt qua Workshop
schematic.copy = Sao chép vào bộ nhớ tạm schematic.copy = Sao chép vào bộ nhớ tạm
schematic.copy.import = Nhập từ bộ nhớ tạm schematic.copy.import = Nhập từ bộ nhớ tạm
schematic.shareworkshop = Chia sẻ từ Workshop schematic.shareworkshop = Chia sẻ từ Workshop
schematic.flip = [accent][[{0}][]/[accent][[{1}][]: Lật Schematic schematic.flip = [accent][[{0}][]/[accent][[{1}][]: Lật bản thiết kế
schematic.saved = Đã lưu Schematic. schematic.saved = Đã lưu bản thiết kế.
schematic.delete.confirm = Schematic này sẽ bị xóa hoàn toàn. schematic.delete.confirm = Bản thiết kế này sẽ bị xóa hoàn toàn.
schematic.rename = Đổi tên Schematic schematic.rename = Đổi tên bản thiết kế
schematic.info = {0}x{1}, {2} khối schematic.info = {0}x{1}, {2} khối
schematic.disabled = [scarlet]Tính năng Schematics đã bị tắt[]\nBạn không được sử dụng schematic trong [accent]bản đồ[] hoặc [accent]máy chủ. schematic.disabled = [scarlet]Tính năng bản thiết kế đã bị tắt[]\nBạn không được sử dụng bản thiết kế trong [accent]bản đồ[] hoặc [accent]máy chủ.
stats = Thống kê stats = Thống kê
stat.wave = Đợt đã vượt qua:[accent] {0} stat.wave = Đợt đã vượt qua:[accent] {0}
@@ -76,7 +76,7 @@ level.select = Chọn cấp độ
level.mode = Chế độ: level.mode = Chế độ:
coreattack = < Căn cứ đang bị tấn công! > coreattack = < Căn cứ đang bị tấn công! >
nearpoint = [[ [scarlet]RỜI KHỎI ĐIỂM THẢ NGAY LẬP TỨC[] ]\nsự hủy diệt sắp xảy ra nearpoint = [[ [scarlet]RỜI KHỎI ĐIỂM THẢ NGAY LẬP TỨC[] ]\nsự hủy diệt sắp xảy ra
database = Cơ sở dữ liệu căn cứ database = Cơ sở dữ liệu
savegame = Lưu trò chơi savegame = Lưu trò chơi
loadgame = Tải trò chơi loadgame = Tải trò chơi
joingame = Tham gia trò chơi joingame = Tham gia trò chơi
@@ -700,11 +700,11 @@ stat.abilities = Khả năng
stat.canboost = Nâng cấp stat.canboost = Nâng cấp
stat.flying = Bay stat.flying = Bay
ability.forcefield = Force Field ability.forcefield = Tạo khiên
ability.repairfield = Repair Field ability.repairfield = Sửa chữa/Xây dựng
ability.statusfield = Status Field ability.statusfield = Status Field
ability.unitspawn = {0} Factory ability.unitspawn = Sản xuất {0}
ability.shieldregenfield = Shield Regen Field ability.shieldregenfield = Tạo khiên nhỏ
ability.movelightning = Movement Lightning ability.movelightning = Movement Lightning
bar.drilltierreq = Cần máy khoan tốt hơn bar.drilltierreq = Cần máy khoan tốt hơn
@@ -735,12 +735,12 @@ bullet.damage = [stat]{0}[lightgray] sát thương
bullet.splashdamage = [stat]{0}[lightgray] sát thương diện rộng ~[stat] {1}[lightgray] ô bullet.splashdamage = [stat]{0}[lightgray] sát thương diện rộng ~[stat] {1}[lightgray] ô
bullet.incendiary = [stat]cháy bullet.incendiary = [stat]cháy
bullet.sapping = [stat]sapping bullet.sapping = [stat]sapping
bullet.homing = [stat]homing bullet.homing = [stat]truy đuổi
bullet.shock = [stat]sốc bullet.shock = [stat]sốc
bullet.frag = [stat]frag bullet.frag = [stat]phá mảnh
bullet.knockback = [stat]{0}[lightgray] bật lùi bullet.knockback = [stat]{0}[lightgray] bật lùi
bullet.pierce = [stat]{0}[lightgray]x xuyên giáp bullet.pierce = [stat]{0}[lightgray]x xuyên giáp
bullet.infinitepierce = [stat]pierce bullet.infinitepierce = [stat]xuyên thấu
bullet.healpercent = [stat]{0}[lightgray]% sửa chửa bullet.healpercent = [stat]{0}[lightgray]% sửa chửa
bullet.freezing = [stat]đóng băng bullet.freezing = [stat]đóng băng
bullet.tarred = [stat]tarred bullet.tarred = [stat]tarred
@@ -789,7 +789,7 @@ setting.playerindicators.name = Hướng người chơi
setting.indicators.name = Hướng kẻ địch setting.indicators.name = Hướng kẻ địch
setting.autotarget.name = Tự động nhắm mục tiêu setting.autotarget.name = Tự động nhắm mục tiêu
setting.keyboard.name = Điều khiển bằng chuột + bàn phím setting.keyboard.name = Điều khiển bằng chuột + bàn phím
setting.touchscreen.name = Điều khiển bằng màng hình cảm ứng setting.touchscreen.name = Điều khiển bằng màn hình cảm ứng
setting.fpscap.name = FPS tối đa setting.fpscap.name = FPS tối đa
setting.fpscap.none = Không giới hạn setting.fpscap.none = Không giới hạn
setting.fpscap.text = {0} FPS setting.fpscap.text = {0} FPS
@@ -810,13 +810,13 @@ setting.sensitivity.name = Độ nhạy điều khiển
setting.saveinterval.name = Khoảng thời gian lưu setting.saveinterval.name = Khoảng thời gian lưu
setting.seconds = {0} giây setting.seconds = {0} giây
setting.milliseconds = {0} mili giây setting.milliseconds = {0} mili giây
setting.fullscreen.name = Toàn màng hình setting.fullscreen.name = Toàn màn hình
setting.borderlesswindow.name = Không viền[lightgray] (yêu cầu khởi động lại) setting.borderlesswindow.name = Không viền[lightgray] (yêu cầu khởi động lại)
setting.fps.name = Hiển thị FPS & Ping setting.fps.name = Hiển thị FPS & Ping
setting.smoothcamera.name = Chế độ mượt mà setting.smoothcamera.name = Chế độ mượt mà
setting.vsync.name = VSync setting.vsync.name = VSync
setting.pixelate.name = Đồ họa pixel setting.pixelate.name = Đồ họa pixel
setting.minimap.name = Hiển thị bảng đồ mini setting.minimap.name = Hiển thị bản đồ mini
setting.coreitems.name = Hiển thị vật phẩm trong căn cứ setting.coreitems.name = Hiển thị vật phẩm trong căn cứ
setting.position.name = Hiển thị vị trí người chơi setting.position.name = Hiển thị vị trí người chơi
setting.musicvol.name = Âm lượng nhạc setting.musicvol.name = Âm lượng nhạc
@@ -855,17 +855,17 @@ keybind.clear_building.name = Xóa công trình
keybind.press = Nhấn một phím... keybind.press = Nhấn một phím...
keybind.press.axis = Nhấn một tổ hợp phím hoặc một phím... keybind.press.axis = Nhấn một tổ hợp phím hoặc một phím...
keybind.screenshot.name = Chụp ảnh bản đồ keybind.screenshot.name = Chụp ảnh bản đồ
keybind.toggle_power_lines.name = Toggle Power Lasers keybind.toggle_power_lines.name = Ẩn/Hiện đường truyền năng lượng
keybind.toggle_block_status.name = Toggle Block Statuses keybind.toggle_block_status.name = Ẩn/Hiện trạng thái khối
keybind.move_x.name = Di chuyển X keybind.move_x.name = Di chuyển X
keybind.move_y.name = Di chuyển Y keybind.move_y.name = Di chuyển Y
keybind.mouse_move.name = Theo chuột keybind.mouse_move.name = Theo chuột
keybind.pan.name = Xem Pan keybind.pan.name = Di chuyển góc nhìn
keybind.boost.name = Tăng tốc keybind.boost.name = Tăng tốc
keybind.schematic_select.name = Chọn khu vực keybind.schematic_select.name = Chọn khu vực
keybind.schematic_menu.name = Menu Schematic keybind.schematic_menu.name = Menu bản thiết kế
keybind.schematic_flip_x.name = Lật Schematic X keybind.schematic_flip_x.name = Lật bản thiết kế X
keybind.schematic_flip_y.name = Lật Schematic Y keybind.schematic_flip_y.name = Lật bản thiết kế Y
keybind.category_prev.name = Danh mục trước keybind.category_prev.name = Danh mục trước
keybind.category_next.name = Danh mục tiếp theo keybind.category_next.name = Danh mục tiếp theo
keybind.block_select_left.name = Chọn khối trái keybind.block_select_left.name = Chọn khối trái
@@ -903,8 +903,8 @@ keybind.chat.name = Trò chuyện
keybind.player_list.name = Danh sách người chơi keybind.player_list.name = Danh sách người chơi
keybind.console.name = Bảng điều khiển keybind.console.name = Bảng điều khiển
keybind.rotate.name = Xoay keybind.rotate.name = Xoay
keybind.rotateplaced.name = Xoay hiện có (Giữ) keybind.rotateplaced.name = Xoay khối (Giữ)
keybind.toggle_menus.name = Chuyển đổi Menus keybind.toggle_menus.name = Ẩn/Hiện Menus
keybind.chat_history_prev.name = Lịch sử trò chuyện trước keybind.chat_history_prev.name = Lịch sử trò chuyện trước
keybind.chat_history_next.name = Lịch sử trò chuyện sau keybind.chat_history_next.name = Lịch sử trò chuyện sau
keybind.chat_scroll.name = Cuộn trò chuyện keybind.chat_scroll.name = Cuộn trò chuyện
@@ -924,7 +924,7 @@ mode.custom = Tùy chỉnh luật
rules.infiniteresources = Tài nguyên vô hạn rules.infiniteresources = Tài nguyên vô hạn
rules.reactorexplosions = Nổ lò phản ứng rules.reactorexplosions = Nổ lò phản ứng
rules.schematic = Cho phép dùng schematic rules.schematic = Cho phép dùng bản thiết kế
rules.wavetimer = Đếm ngược đợt rules.wavetimer = Đếm ngược đợt
rules.waves = Đợt rules.waves = Đợt
rules.attack = Chế độ tấn công rules.attack = Chế độ tấn công
@@ -977,7 +977,7 @@ item.surge-alloy.name = Hợp kim
item.spore-pod.name = Vỏ bào tử item.spore-pod.name = Vỏ bào tử
item.sand.name = Cát item.sand.name = Cát
item.blast-compound.name = Chất nổ item.blast-compound.name = Chất nổ
item.pyratite.name = Tiền chất nổ item.pyratite.name = Nhiệt thạch
item.metaglass.name = Thuỷ tinh item.metaglass.name = Thuỷ tinh
item.scrap.name = Phế liệu item.scrap.name = Phế liệu
liquid.water.name = Nước liquid.water.name = Nước
@@ -1044,7 +1044,7 @@ block.moss.name = Rêu
block.shrubs.name = Bụi cây block.shrubs.name = Bụi cây
block.spore-moss.name = Rêu bào tử block.spore-moss.name = Rêu bào tử
block.shale-wall.name = Tường đá phiến sét block.shale-wall.name = Tường đá phiến sét
block.scrap-wall.name = Tường sắt vụn block.scrap-wall.name = Tường phế liệu
block.scrap-wall-large.name = Tường phế liệu lớn block.scrap-wall-large.name = Tường phế liệu lớn
block.scrap-wall-huge.name = Tường phế liệu khổng lồ block.scrap-wall-huge.name = Tường phế liệu khổng lồ
block.scrap-wall-gigantic.name = Tường phế liệu siêu khổng lồ block.scrap-wall-gigantic.name = Tường phế liệu siêu khổng lồ
@@ -1105,8 +1105,8 @@ block.copper-wall.name = Tường đồng
block.copper-wall-large.name = Tường đồng lớn block.copper-wall-large.name = Tường đồng lớn
block.titanium-wall.name = Tường titan block.titanium-wall.name = Tường titan
block.titanium-wall-large.name = Tường titan lớn block.titanium-wall-large.name = Tường titan lớn
block.plastanium-wall.name = Tường Plastanium block.plastanium-wall.name = Tường Nhựa
block.plastanium-wall-large.name = Tường Plastanium lớn block.plastanium-wall-large.name = Tường Nhựa lớn
block.phase-wall.name = Tường Phase block.phase-wall.name = Tường Phase
block.phase-wall-large.name = Tường Phase lớn block.phase-wall-large.name = Tường Phase lớn
block.thorium-wall.name = Tường Thorium block.thorium-wall.name = Tường Thorium
@@ -1122,9 +1122,9 @@ block.conveyor.name = Băng chuyền
block.titanium-conveyor.name = Băng chuyền titan block.titanium-conveyor.name = Băng chuyền titan
block.plastanium-conveyor.name = Băng chuyền nhựa block.plastanium-conveyor.name = Băng chuyền nhựa
block.armored-conveyor.name = Băng chuyền bọc giáp block.armored-conveyor.name = Băng chuyền bọc giáp
block.junction.name = Junction block.junction.name = Giao điểm
block.router.name = Bộ định tuyến block.router.name = Bộ phân phát
block.distributor.name = Bộ phân phát block.distributor.name = Bộ phân phát lớn
block.sorter.name = Bộ lọc block.sorter.name = Bộ lọc
block.inverted-sorter.name = Bộ lọc ngược block.inverted-sorter.name = Bộ lọc ngược
block.message.name = Thông điệp block.message.name = Thông điệp
@@ -1134,8 +1134,8 @@ block.underflow-gate.name = Cổng tràn ngược
block.silicon-smelter.name = Máy nấu silicon block.silicon-smelter.name = Máy nấu silicon
block.phase-weaver.name = Máy tạo Phase block.phase-weaver.name = Máy tạo Phase
block.pulverizer.name = Máy nghiền block.pulverizer.name = Máy nghiền
block.cryofluid-mixer.name = Máy sản xuất chất làm mát block.cryofluid-mixer.name = Máy sản xuất chất làm lạnh
block.melter.name = Máy nung chảy block.melter.name = nung chảy
block.incinerator.name = Máy phân hủy block.incinerator.name = Máy phân hủy
block.spore-press.name = Máy nén bào tử block.spore-press.name = Máy nén bào tử
block.separator.name = Máy phân tách block.separator.name = Máy phân tách
@@ -1171,9 +1171,9 @@ block.swarmer.name = Swarmer
block.salvo.name = Salvo block.salvo.name = Salvo
block.ripple.name = Ripple block.ripple.name = Ripple
block.phase-conveyor.name = Phase Conveyor block.phase-conveyor.name = Phase Conveyor
block.bridge-conveyor.name = Bridge Conveyor block.bridge-conveyor.name = Cầu dẫn
block.plastanium-compressor.name = Máy sản xuất nhựa block.plastanium-compressor.name = Máy sản xuất nhựa
block.pyratite-mixer.name = Máy trộn tiền chất nổ block.pyratite-mixer.name = Máy trộn nhiệt thạch
block.blast-mixer.name = Máy trộn chất nổ block.blast-mixer.name = Máy trộn chất nổ
block.solar-panel.name = Pin mặt trời block.solar-panel.name = Pin mặt trời
block.solar-panel-large.name = Pin mặt trời lớn block.solar-panel-large.name = Pin mặt trời lớn
@@ -1182,10 +1182,10 @@ block.repair-point.name = Điểm sửa chữa
block.pulse-conduit.name = Ống dẫn titan block.pulse-conduit.name = Ống dẫn titan
block.plated-conduit.name = Ống dẫn bọc giáp block.plated-conduit.name = Ống dẫn bọc giáp
block.phase-conduit.name = Ống dẫn Phase block.phase-conduit.name = Ống dẫn Phase
block.liquid-router.name = Bộ định tuyến chất lỏng block.liquid-router.name = Bộ phân phát chất lỏng
block.liquid-tank.name = Thùng chất lỏng block.liquid-tank.name = Thùng chất lỏng
block.liquid-junction.name = Liquid Junction block.liquid-junction.name = Giao điểm chất lỏng
block.bridge-conduit.name = Bridge Conduit block.bridge-conduit.name = Cầu dẫn chất lỏng
block.rotary-pump.name = Bơm điện block.rotary-pump.name = Bơm điện
block.thorium-reactor.name = Lò phản ứng Thorium block.thorium-reactor.name = Lò phản ứng Thorium
block.mass-driver.name = Máy phóng điện từ block.mass-driver.name = Máy phóng điện từ
@@ -1227,11 +1227,11 @@ block.overdrive-dome.name = Máy tăng tốc lớn
#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 = Điểm dỡ hàng
block.interplanetary-accelerator.name = Máy gia tốc liên hành tinh block.interplanetary-accelerator.name = Máy gia tốc liên hành tinh
block.switch.name = Công tắc block.switch.name = Công tắc
block.micro-processor.name = Bộ xử lí mini block.micro-processor.name = Bộ xử lí nhỏ
block.logic-processor.name = Bộ xử lý block.logic-processor.name = Bộ xử lý
block.hyper-processor.name = Bộ xử lý lớn block.hyper-processor.name = Bộ xử lý lớn
block.logic-display.name = Màn hình block.logic-display.name = Màn hình
@@ -1315,15 +1315,15 @@ block.armored-conveyor.description = Vận chuyển vật phẩm về phía. Kh
block.illuminator.description = Phát sáng. block.illuminator.description = Phát sáng.
block.message.description = Lưu trữ tin nhắn giao tiếp giữa đồng đội. block.message.description = Lưu trữ tin nhắn giao tiếp giữa đồng đội.
block.graphite-press.description = Nén than thành than chì. block.graphite-press.description = Nén than thành than chì.
block.multi-press.description = Nén than thành than chì. Cần nước làm chất làm mát. block.multi-press.description = Nén than thành than chì. Cần nước làm mát.
block.silicon-smelter.description = Tinh chế silicon từ cát và than. block.silicon-smelter.description = Tinh chế silicon từ cát và than.
block.kiln.description = Nấu chảy cát và chì thành thuỷ tinh. block.kiln.description = Nấu chảy cát và chì thành thuỷ tinh.
block.plastanium-compressor.description = Sản xuất nhựa từ dầu và titan. block.plastanium-compressor.description = Sản xuất nhựa từ dầu và titan.
block.phase-weaver.description = Tổng hợp phase fabric từ thorium và cát. block.phase-weaver.description = Tổng hợp phase fabric từ thorium và cát.
block.alloy-smelter.description = Trộn titan, chì, silicon và đồng thành hợp kim. block.alloy-smelter.description = Trộn titan, chì, silicon và đồng thành hợp kim.
block.cryofluid-mixer.description = Trộn nước và bột titan để sản xuất chất làm mát. block.cryofluid-mixer.description = Trộn nước và bột titan để sản xuất chất làm mát.
block.blast-mixer.description = Tạo ra hợp chất nổ từ tiền chất nổ và vỏ bào tử. block.blast-mixer.description = Tạo ra hợp chất nổ từ nhiệt thạch và vỏ bào tử.
block.pyratite-mixer.description = Trộn than, chì và cát thành tiền chất nổ. block.pyratite-mixer.description = Trộn than, chì và cát thành nhiệt thạch.
block.melter.description = Nung phế liệu thành xỉ. block.melter.description = Nung phế liệu thành xỉ.
block.separator.description = Tách xỉ thành các thành phần khoáng của nó. block.separator.description = Tách xỉ thành các thành phần khoáng của nó.
block.spore-press.description = Nén vỏ bào tử thành dầu. block.spore-press.description = Nén vỏ bào tử thành dầu.
@@ -1389,7 +1389,7 @@ block.battery-large.description = Tích trữ năng lượng khi dư thừa. Xu
block.combustion-generator.description = Tạo ra năng lượng bằng cách đốt các vật liệu dễ cháy như than. block.combustion-generator.description = Tạo ra năng lượng bằng cách đốt các vật liệu dễ cháy như than.
block.thermal-generator.description = Tạo ra năng lượng khi đặt ở những nơi nóng. block.thermal-generator.description = Tạo ra năng lượng khi đặt ở những nơi nóng.
block.steam-generator.description = Tạo ra năng lượng bằng cách đốt cháy các vật liệu dễ cháy và chuyển nước thành hơi nước. block.steam-generator.description = Tạo ra năng lượng bằng cách đốt cháy các vật liệu dễ cháy và chuyển nước thành hơi nước.
block.differential-generator.description = Tạo ra một lượng lớn năng lượng. Sử dụng sự chênh lệch nhiệt độ giữa cryofluid và pyratite đang cháy. block.differential-generator.description = Tạo ra một lượng lớn năng lượng. Sử dụng sự chênh lệch nhiệt độ giữa chất làm lạnh và nhiệt thạch đang cháy.
block.rtg-generator.description = Sử dụng nhiệt của các hợp chất phóng xạ đang phân hủy để tạo ra năng lượng với tốc độ chậm. block.rtg-generator.description = Sử dụng nhiệt của các hợp chất phóng xạ đang phân hủy để tạo ra năng lượng với tốc độ chậm.
block.solar-panel.description = Cung cấp một lượng nhỏ năng lượng từ mặt trời. block.solar-panel.description = Cung cấp một lượng nhỏ năng lượng từ mặt trời.
block.solar-panel-large.description = Cung cấp một lượng nhỏ năng lượng từ mặt trời. Hiệu quả hơn pin mặt trời tiêu chuẩn. block.solar-panel-large.description = Cung cấp một lượng nhỏ năng lượng từ mặt trời. Hiệu quả hơn pin mặt trời tiêu chuẩn.
@@ -1405,10 +1405,10 @@ block.cultivator.details = Công nghệ được phục hồi. Được sử d
block.oil-extractor.description = Sử dụng lượng năng lượng năng lớn, sử dụng cát và nước để khoan dầu. block.oil-extractor.description = Sử dụng lượng năng lượng năng lớn, sử dụng cát và nước để khoan dầu.
block.core-shard.description = Trung tâm của căn cứ. Sau khi bị phá hủy, khu vực này sẽ bị mất. block.core-shard.description = Trung tâm của căn cứ. Sau khi bị phá hủy, khu vực này sẽ bị mất.
block.core-shard.details = Lần thử đầu tiên. Gọn nhẹ. Tự thay thế. Được trang bị tên lửa đẩy dùng một lần. Không được thiết kế để di chuyển giữa các hành tinh. block.core-shard.details = Lần thử đầu tiên. Gọn nhẹ. Tự thay thế. Được trang bị tên lửa đẩy dùng một lần. Không được thiết kế để di chuyển giữa các hành tinh.
block.core-foundation.description = Trung tâm của căn cứ. Được bọc giáp. Stores more resources than a Shard. block.core-foundation.description = Trung tâm của căn cứ. Được bọc giáp. Chứa được nhiều tài nguyên hơn Căn cứ: Cơ sỏ.
block.core-foundation.details = The second iteration. block.core-foundation.details = Căn cứ cấp 2.
block.core-nucleus.description = Lõi của căn cứ. Bọc giáp chắc chắn. Lưu trữ lượng lớn tài nguyên. block.core-nucleus.description = Lõi của căn cứ. Bọc giáp chắc chắn. Lưu trữ lượng lớn tài nguyên.
block.core-nucleus.details = Lần thử thứ ba và lần thử cuối. block.core-nucleus.details = Căn cứ cấp 3 và cũng là cấp cao nhất.
block.vault.description = Lưu trữ lượng lớn vật phẩm mỗi loại. Nội dung có thể được lấy ra với điểm dỡ hàng. block.vault.description = Lưu trữ lượng lớn vật phẩm mỗi loại. Nội dung có thể được lấy ra với điểm dỡ hàng.
block.container.description = Lưu trữ lượng lớn vật phẩm mỗi loại. Nội dung có thể được lấy ra với điểm dỡ hàng. block.container.description = Lưu trữ lượng lớn vật phẩm mỗi loại. Nội dung có thể được lấy ra với điểm dỡ hàng.
block.unloader.description = Lấy các vật phẩm được chọn từ các ô gần đó. block.unloader.description = Lấy các vật phẩm được chọn từ các ô gần đó.
@@ -1421,17 +1421,17 @@ block.wave.description = Phóng một tia chất lỏng vào kẻ địch. Tự
block.lancer.description = Tích tụ và phóng tia năng lượng mạnh vào kẻ địch trên mặt đất. block.lancer.description = Tích tụ và phóng tia năng lượng mạnh vào kẻ địch trên mặt đất.
block.arc.description = Phóng tia điện vào kẻ địch trên mặt đất. block.arc.description = Phóng tia điện vào kẻ địch trên mặt đất.
block.swarmer.description = Bắn tên lửa truy đuổi vào kẻ địch. block.swarmer.description = Bắn tên lửa truy đuổi vào kẻ địch.
block.salvo.description = Bắn đạn salvo vào kẻ địch. block.salvo.description = Bắn loạt đạn vào kẻ địch.
block.fuse.description = Bắn ba đạn xuyên giáp tầm gần vào kẻ địch. block.fuse.description = Bắn ba đạn xuyên giáp tầm gần vào kẻ địch.
block.ripple.description = Bắn cụm đạn vào kẻ địch trên mặt đất ở tầm xa. block.ripple.description = Bắn cụm đạn vào kẻ địch trên mặt đất ở tầm xa.
block.cyclone.description = Bắn đạn nổ vào kẻ địch ở gần. block.cyclone.description = Bắn đạn nổ vào kẻ địch ở gần.
block.spectre.description = Bắn đạn xuyên giáp lớn ở kẻ địch trên không và trên mặt đất. block.spectre.description = Bắn đạn xuyên giáp lớn ở kẻ địch trên không và trên mặt đất.
block.meltdown.description = Nạp và bắn một tia laser liên tục vào kẻ địch ở gần. Cần có chất làm mát để hoạt động. block.meltdown.description = Nạp và bắn một tia laser liên tục vào kẻ địch ở gần. Cần có chất làm mát để hoạt động.
block.foreshadow.description = Bắn viên một viên đạn tỉa lớn ở tầm xa. block.foreshadow.description = Bắn viên một viên đạn tỉa lớn ở tầm xa.
block.repair-point.description = Liên tục sửa chữa robot ở gần trong phạm vi hoạt động. block.repair-point.description = Liên tục sửa chữa robot ở trong phạm vi hoạt động.
block.segment.description = Gây hư hại và phá hủy đạn đến. Ngoại trừ tia laser. block.segment.description = Gây hư hại và phá hủy đạn đến. Ngoại trừ tia laser.
block.parallax.description = Bắn một tia kéo máy bay địch và làm hư hỏng nó trong quá trình kéo. block.parallax.description = Bắn một tia kéo máy bay địch và làm hư hỏng nó trong quá trình kéo.
block.tsunami.description = Phóng một tia chất lỏng mạnh vào kẻ địch. Tự chữa cháy nếu được cung cấp nước. block.tsunami.description = Phóng một tia chất lỏng mạnh vào kẻ địch. Tự chữa cháy nếu được cung cấp nước hoặc chất làm mát.
block.silicon-crucible.description = Tinh chế silicon từ cát và than, sử dụng tiền chất nổ làm nguồn nhiệt phụ. Có hiệu quả cao hơn khi ở nơi nóng. block.silicon-crucible.description = Tinh chế silicon từ cát và than, sử dụng tiền chất nổ làm nguồn nhiệt phụ. Có hiệu quả cao hơn khi ở nơi nóng.
block.disassembler.description = Tách xỉ thành các kim loại khác nhau với hiệu suất thấp. Có thể sản xuất thorium. block.disassembler.description = Tách xỉ thành các kim loại khác nhau với hiệu suất thấp. Có thể sản xuất thorium.
block.overdrive-dome.description = Tăng tốc độ làm việc của các công trình lân cận. Sử dụng phase fabric and silicon để hoạt động. block.overdrive-dome.description = Tăng tốc độ làm việc của các công trình lân cận. Sử dụng phase fabric and silicon để hoạt động.
@@ -1447,12 +1447,12 @@ block.exponential-reconstructor.description = Nâng cấp quân của bạn lên
block.tetrative-reconstructor.description = Nâng cấp quân của bạn nên cấp năm (cuối cùng). block.tetrative-reconstructor.description = Nâng cấp quân của bạn nên cấp năm (cuối cùng).
block.switch.description = Công tắc, trạng thái có thể được đọc và điều khiển với vi xử lí logic. block.switch.description = Công tắc, trạng thái có thể được đọc và điều khiển với vi xử lí logic.
block.micro-processor.description = Chạy tập hợp các chỉ dẫn trong một vòng lặp, có thể dùng để điều khiển robot và công trình. block.micro-processor.description = Chạy tập hợp các chỉ dẫn trong một vòng lặp, có thể dùng để điều khiển robot và công trình.
block.logic-processor.description = Chạy tập hợp các chỉ dẫn trong một vòng lặp, có thể dùng để điều khiển robot và công trình. Nhanh hơn vi xử lí micro. block.logic-processor.description = Chạy tập hợp các chỉ dẫn trong một vòng lặp, có thể dùng để điều khiển robot và công trình. Nhanh hơn bộ xử lí nhỏ.
block.hyper-processor.description = Chạy tập hợp các chỉ dẫn trong một vòng lặp, có thể dùng để điều khiển robot và công trình. Nhanh hơn vi xử lí logic. block.hyper-processor.description = Chạy tập hợp các chỉ dẫn trong một vòng lặp, có thể dùng để điều khiển robot và công trình. Nhanh hơn bộ xử lí.
block.memory-cell.description = Lưu trữ thông tin cho bộ xử lí logic. block.memory-cell.description = Lưu trữ thông tin cho bộ xử lí.
block.memory-bank.description = Lưu trữ thông tin cho bộ xử lí logic. Dung lượng cao. block.memory-bank.description = Lưu trữ thông tin cho bộ xử lí. Dung lượng cao.
block.logic-display.description = Hiển thị đồ họa tùy ý từ bộ xử lí logic. block.logic-display.description = Hiển thị đồ họa tùy ý từ bộ xử lí.
block.large-logic-display.description = Hiển thị đồ họa tùy ý từ bộ xử lí logic. block.large-logic-display.description = Hiển thị đồ họa tùy ý từ bộ xử lí.
block.interplanetary-accelerator.description = Tòa súng từ trường cỡ lớn. Tăng tốc vật phóng đến vận tốc thoát để di chuyển giữa các hành tinh. block.interplanetary-accelerator.description = Tòa súng từ trường cỡ lớn. Tăng tốc vật phóng đến vận tốc thoát để di chuyển giữa các hành tinh.
unit.dagger.description = Bắn đạn tiêu chuẩn vào tất cả kẻ địch xung quanh. unit.dagger.description = Bắn đạn tiêu chuẩn vào tất cả kẻ địch xung quanh.
@@ -1466,7 +1466,7 @@ unit.quasar.description = Bắn tia laser xuyên giáp làm tổn hại kẻ đ
unit.vela.description = Bắn tia laser liên tục xuyên giáp làm tổn hại kẻ địch, gây cháy và sửa chữa các tòa nhà. Có khả năng bay. unit.vela.description = Bắn tia laser liên tục xuyên giáp làm tổn hại kẻ địch, gây cháy và sửa chữa các tòa nhà. Có khả năng bay.
unit.corvus.description = Bắn đia laser đánh bật kẻ địch và sửa chữa các tòa nhà. Có thể đi qua đa số địa hình. unit.corvus.description = Bắn đia laser đánh bật kẻ địch và sửa chữa các tòa nhà. Có thể đi qua đa số địa hình.
unit.crawler.description = Chạy đến kẻ địch và nổ. unit.crawler.description = Chạy đến kẻ địch và nổ.
unit.atrax.description = Bắn cục xỉ vào kẻ địch trên mặt đất. Có thể đi qua đa số địa hình. unit.atrax.description = Phun xỉ nóng chảy vào kẻ địch trên mặt đất. Có thể đi qua đa số địa hình.
unit.spiroct.description = Bắn tia laser vào kẻ địch trên mặt đất và tự sửa chữa nó. Có thể đi qua đa số địa hình. unit.spiroct.description = Bắn tia laser vào kẻ địch trên mặt đất và tự sửa chữa nó. Có thể đi qua đa số địa hình.
unit.arkyid.description = Bắn tia laser lớn vào kẻ địch trên mặt đất và tự sửa chữa chính nó. Có thể đi qua đa số địa hình. unit.arkyid.description = Bắn tia laser lớn vào kẻ địch trên mặt đất và tự sửa chữa chính nó. Có thể đi qua đa số địa hình.
unit.toxopid.description = Bắn chùm đạn điện và tia laser xuyên giáp vào kẻ địch trên mặt đất và tự sửa chữa chính nó. Có thể đi qua đa số địa hình. unit.toxopid.description = Bắn chùm đạn điện và tia laser xuyên giáp vào kẻ địch trên mặt đất và tự sửa chữa chính nó. Có thể đi qua đa số địa hình.
@@ -1479,12 +1479,12 @@ unit.mono.description = Tự động khai thác đồng và chì, và vận chuy
unit.poly.description = Tự động xây dựng lại các công trình bị hỏng và hỗ trợ các quân lính khác thi công. unit.poly.description = Tự động xây dựng lại các công trình bị hỏng và hỗ trợ các quân lính khác thi công.
unit.mega.description = Tự động sửa chữa các công trình bị hỏng. Có khả năng mang bộ binh nhỏ. unit.mega.description = Tự động sửa chữa các công trình bị hỏng. Có khả năng mang bộ binh nhỏ.
unit.quad.description = Thả bom to lên kẻ địch, sửa chữa các tòa nhà và tổn hại kẻ địch. Có khả năng mang bộ binh vừa. unit.quad.description = Thả bom to lên kẻ địch, sửa chữa các tòa nhà và tổn hại kẻ địch. Có khả năng mang bộ binh vừa.
unit.oct.description = Bảo vệ đồng minh với giáp. Có kả năng mang đa số bộ binh. unit.oct.description = Bảo vệ đồng minh với giáp. Có khả năng mang đa số bộ binh.
unit.risso.description = Bắn chùm tên lửa và đạn lên kẻ địch tầm gần. unit.risso.description = Bắn chùm tên lửa và đạn lên kẻ địch tầm gần.
unit.minke.description = Bắn đạn và đạn thường lên kẻ địch tầm gần trên mặt đất. unit.minke.description = Bắn đạn và đạn thường lên kẻ địch tầm gần trên mặt đất.
unit.bryde.description = Bắn đạn tầm xa và tên lửa vào kẻ địch. unit.bryde.description = Bắn đạn tầm xa và tên lửa vào kẻ địch.
unit.sei.description = Bắn chùm tên lửa và đạn xuyên giáp vào kẻ địch. unit.sei.description = Bắn chùm tên lửa và đạn xuyên giáp vào kẻ địch.
unit.omura.description = Bắn đạn từ trường xuyên giáp tầm xa vào kẻ địch. Tạo nên drone báo hiệu. unit.omura.description = Bắn đạn từ trường xuyên giáp tầm xa vào kẻ địch. Tạo nên Flare.
unit.alpha.description = Bảo vệ căn cứ cơ sở khỏi kẻ thù. Có thể xây dựng. unit.alpha.description = Bảo vệ căn cứ cơ sở khỏi kẻ thù. Có thể xây dựng.
unit.beta.description = Bảo vệ căn cứ trụ sở khỏi kẻ thù. Có thể xây dựng. unit.beta.description = Bảo vệ căn cứ trụ sở khỏi kẻ thù. Có thể xây dựng.
unit.gamma.description = Bảo vệ căn cứ trung tâm khỏi kẻ thù. Có thể xây dựng. unit.gamma.description = Bảo vệ căn cứ trung tâm khỏi kẻ thù. Có thể xây dựng.

View File

@@ -41,10 +41,11 @@ 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.github.reinstall = 重新安裝
mods.github.open = 查看Github
mods.browser.sortdate = 以最近篩選 mods.browser.sortdate = 以最近篩選
mods.browser.sortstars = 以星數篩選 mods.browser.sortstars = 以星數篩選
@@ -118,9 +119,11 @@ mods.none = [lightgray]找不到模組!
mods.guide = 模組指南 mods.guide = 模組指南
mods.report = 回報錯誤 mods.report = 回報錯誤
mods.openfolder = 開啟模組資料夾 mods.openfolder = 開啟模組資料夾
mods.viewcontent = 查看內容
mods.reload = 重新載入 mods.reload = 重新載入
mods.reloadexit = 遊戲將會結束以重新載入模組。 mods.reloadexit = 遊戲將會結束以重新載入模組。
mod.display = [gray]模組:[orange]{0} mod.display = [gray]模組:[orange]{0}
mod.installed = [[已安裝]
mod.enabled = [lightgray]已啟用 mod.enabled = [lightgray]已啟用
mod.disabled = [scarlet]已禁用 mod.disabled = [scarlet]已禁用
mod.disable = 禁用 mod.disable = 禁用
@@ -309,6 +312,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 = 已隱藏介面。\n按[accent][[{0}][]顯示介面。 showui = 已隱藏介面。\n按[accent][[{0}][]顯示介面。
wave = [accent]第{0}波 wave = [accent]第{0}波
wave.cap = [accent]Wave {0}/{1} wave.cap = [accent]Wave {0}/{1}
@@ -422,7 +426,7 @@ editor.exportimage = 匯出地形圖片檔
editor.exportimage.description = 匯出地形圖片檔 editor.exportimage.description = 匯出地形圖片檔
editor.loadimage = 載入圖片 editor.loadimage = 載入圖片
editor.saveimage = 儲存圖片 editor.saveimage = 儲存圖片
editor.unsaved = [scarlet]未儲存變更[]\n您確定要退出嗎 editor.unsaved = 您確定要退出嗎?\n[scarlet](將遺失未儲存變更)[]
editor.resizemap = 調整地圖大小 editor.resizemap = 調整地圖大小
editor.mapname = 地圖名稱: editor.mapname = 地圖名稱:
editor.overwrite = [accent]警告!這將會覆蓋現有的地圖。 editor.overwrite = [accent]警告!這將會覆蓋現有的地圖。
@@ -680,6 +684,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 = 建造成本
@@ -791,6 +796,7 @@ setting.shadows.name = 陰影
setting.blockreplace.name = 方塊建造建議 setting.blockreplace.name = 方塊建造建議
setting.linear.name = 線性過濾 setting.linear.name = 線性過濾
setting.hints.name = 提示 setting.hints.name = 提示
setting.logichints.name = 邏輯提示
setting.flow.name = 顯示資源輸送速度 setting.flow.name = 顯示資源輸送速度
setting.backgroundpause.name = 背景執行時暫停 setting.backgroundpause.name = 背景執行時暫停
setting.buildautopause.name = 自動暫停建築 setting.buildautopause.name = 自動暫停建築
@@ -951,6 +957,8 @@ rules.blockdamagemultiplier = 建築物傷害倍數
rules.unitbuildspeedmultiplier = 單位建設速度倍數 rules.unitbuildspeedmultiplier = 單位建設速度倍數
rules.unithealthmultiplier = 單位生命值倍數 rules.unithealthmultiplier = 單位生命值倍數
rules.unitdamagemultiplier = 單位傷害倍數 rules.unitdamagemultiplier = 單位傷害倍數
rules.unitcapvariable = 核心限制單位上限
rules.unitcap = 基礎單位上限
rules.enemycorebuildradius = 敵人核心禁止建設半徑︰[lightgray](格) rules.enemycorebuildradius = 敵人核心禁止建設半徑︰[lightgray](格)
rules.wavespacing = 波次間距︰[lightgray](秒) rules.wavespacing = 波次間距︰[lightgray](秒)
rules.buildcostmultiplier = 建設成本倍數 rules.buildcostmultiplier = 建設成本倍數
@@ -1508,3 +1516,139 @@ unit.omura.description = 對敵人發射遠程穿透型砲彈。建造曳光戰
unit.alpha.description = 抵禦敵軍對核心:碎片的攻擊。建造建築物。 unit.alpha.description = 抵禦敵軍對核心:碎片的攻擊。建造建築物。
unit.beta.description = 抵禦敵軍對核心:基地的攻擊。建造建築物。 unit.beta.description = 抵禦敵軍對核心:基地的攻擊。建造建築物。
unit.gamma.description = 抵禦敵軍對核心:核子的攻擊。建造建築物。 unit.gamma.description = 抵禦敵軍對核心:核子的攻擊。建造建築物。
lst.read = [accent]讀取[]記憶體中的一項數值
lst.write = [accent]寫入[]一項數值到記憶體中
lst.print = 將文字加入輸出的暫存中,搭配[accent]Print Flush[]使用
lst.draw = 將圖形加入顯示的暫存中,搭配[accent]Draw Flush[]使用
lst.drawflush = 將所有暫存的[accent]Draw[]指令推到顯示器上
lst.printflush = 將所有暫存的[accent]Print[]指令推到訊息板上
lst.getlink = 由連接順序回傳連接的建築,第一個從"0"開始
lst.control = 控制一個建築
lst.radar = 偵測建築範圍內的單位
lst.sensor = 獲取該建築或單位的數據
lst.set = 設一個變數
lst.operation = 加減乘除和計算機概論
lst.end = 跳到第一個重頭開始執行
lst.jump = 條件式跳到其他指令執行
lst.unitbind = 綁定下一同種單位,存入[accent]@unit[]中.
lst.unitcontrol = 控制現在綁定的單位
lst.unitradar = 偵測綁定單位附近的單位
lst.unitlocate = 尋找整個地圖上特定的位置/建築\n需要綁定的單位
lenum.type = 建築/單位種類。\n例操控單位建造光矛砲應使用[accent]@lancer[],而非字串
lenum.shoot = 對該位置開火
lenum.shootp = 對指定單位/建築開火,具自瞄功能
lenum.configure = 建築設定,如分類器、兵器工廠
lenum.enabled = 確認該建築是否啟用
laacess.color = 設定照明燈的顏色
graphicstype.clear = 重製版面為指定顏色
graphicstype.color = 為接下來的圖畫指令設定顏色
graphicstype.stroke = 為接下來的圖畫指令設定直線寬度
graphicstype.line = 畫一直線
graphicstype.rect = 畫實心長方形
graphicstype.linerect = 畫空心長方形
graphicstype.poly = 畫實心正多邊形
graphicstype.linepoly = 畫空心正多邊形
graphicstype.triangle = 畫實心三角形
graphicstype.image = 繪製內建圖畫\n如: [accent]@router[]或[accent]@dagger[].
lenum.always = 永遠 true (直接跳).
lenum.idiv = 整數除法,無條件捨去.
lenum.div = 除法.\n除以零時回傳 [accent]null[]
lenum.mod = Modulo求餘數
lenum.equal = 是否相等,不管資料型態。\n非null 物件和數值相比時回傳1
lenum.notequal = 不相等,不管資料型態.
lenum.strictequal = 嚴格檢查是否相等,會看資料型態。\n可用來檢查[accent]null[]
lenum.shl = Bit-shift left.
lenum.shr = Bit-shift right.
lenum.or = Bitwise OR.
lenum.land = Logical AND.
lenum.and = Bitwise AND.
lenum.not = Bitwise flip.
lenum.xor = Bitwise XOR.
lenum.min = 兩數取小
lenum.max = 兩數取大
lenum.angle = 向量與x軸夾角
lenum.len = 向量長度
lenum.sin = 度數Sin值
lenum.cos = 度數Cos值
lenum.tan = 度數Tan值
#not a typo, look up 'range notation'
lenum.rand = 產生隨機數值: [0, 值).
lenum.log = 自然對數(ln、log_e).
lenum.log10 = 高中數學.
lenum.noise = 2D simplex noise.
lenum.abs = 取絕對值
lenum.sqrt = 開根號
lenum.any = 任何單位
lenum.ally = 友方單位
lenum.attacker = 具武器的單位
lenum.enemy = 敵方單位
lenum.boss = 頭目單位
lenum.flying = 飛行單位
lenum.ground = 陸上單位
lenum.player = 玩家單位
lenum.ore = 尋找礦物
lenum.damaged = 尋找受損友方建築
lenum.spawn = 敵方重生點\n可以是核心或一個位置
lenum.building = 尋找特定建築
lenum.core = 任何核心
lenum.storage = 儲藏建築
lenum.generator = 會發電的建築
lenum.factory = 生產加工資源的建築,如煉矽場
lenum.repair = 維修點
lenum.rally = 指揮中心
lenum.battery = 電池
lenum.resupply = 補給點\n只有在[accent]"單位需要彈藥"[]被啟用時才有效果
lenum.reactor = 衝擊/釷反應爐
lenum.turret = 任何砲塔
sensor.in = 想查閱的建築/單位
radar.from = 作為雷達的建築\n偵測範圍同該建築的範圍
radar.target = 搜索條件
radar.and = 額外條件
radar.order = 輸出順序1距離最近、血量最大
radar.sort = 篩選方式
radar.output = 回傳該單位為變數
unitradar.target = 搜索條件
unitradar.and = 額外條件
unitradar.order = 輸出順序1距離最近、血量最大
unitradar.sort = 篩選方式
unitradar.output = 存該單位的變數
control.of = 要控制的建築
control.unit = 指定的建築/單位
control.shoot = 是否開火
unitlocate.enemy = 搜索敵方或友方建築
unitlocate.found = 回傳是否找到建築
unitlocate.building = 回傳找到的建築為變數
unitlocate.outx = 回傳 X 座標
unitlocate.outy = 回傳 Y 座標
unitlocate.group = 搜索建築種類
lenum.stop = 停止移動/挖礦/建造
lenum.move = 移動到指定位置
lenum.approach = 移動到距離指定位置一段距離的地方
lenum.pathfind = 由內建AI前往敵方重生點
lenum.target = 射擊指定區域
lenum.targetp = 帶自瞄射擊指定的目標
lenum.itemdrop = 放下物品
lenum.itemtake = 從建築拿取物品
lenum.paydrop = 放下拾取的負載
lenum.paytake = 拾取船身下方的單位/建築
lenum.flag = 單位編號(可異)
lenum.mine = 挖指定位置的礦物
lenum.build = 建造一個建築
lenum.getblock = 獲取指定位置的建築種類和該建築\n必須在單位的範圍內\n實體障礙物如高山會回傳[accent]@solid[]
lenum.within = 單位是否在指定範圍內
lenum.boost = 使用推進器

View File

@@ -14,7 +14,6 @@
63730=magmarock|block-magmarock-medium 63730=magmarock|block-magmarock-medium
63729=sand|block-sand-medium 63729=sand|block-sand-medium
63728=darksand|block-darksand-medium 63728=darksand|block-darksand-medium
63727=holostone|block-holostone-medium
63726=grass|block-grass-medium 63726=grass|block-grass-medium
63725=salt|block-salt-medium 63725=salt|block-salt-medium
63724=snow|block-snow-medium 63724=snow|block-snow-medium
@@ -285,7 +284,6 @@
63451=scepter|unit-scepter-medium 63451=scepter|unit-scepter-medium
63450=reign|unit-reign-medium 63450=reign|unit-reign-medium
63449=dirt|block-dirt-medium 63449=dirt|block-dirt-medium
63448=dirtwall|block-dirtwall-medium
63447=stone-wall|block-stone-wall-medium 63447=stone-wall|block-stone-wall-medium
63446=spore-wall|block-spore-wall-medium 63446=spore-wall|block-spore-wall-medium
63445=ice-wall|block-ice-wall-medium 63445=ice-wall|block-ice-wall-medium
@@ -295,7 +293,6 @@
63441=salt-wall|block-salt-wall-medium 63441=salt-wall|block-salt-wall-medium
63440=shale-wall|block-shale-wall-medium 63440=shale-wall|block-shale-wall-medium
63439=dirt-wall|block-dirt-wall-medium 63439=dirt-wall|block-dirt-wall-medium
63438=holostone-wall|block-holostone-wall-medium
63437=basalt|block-basalt-medium 63437=basalt|block-basalt-medium
63436=dacite|block-dacite-medium 63436=dacite|block-dacite-medium
63435=boulder|block-boulder-medium 63435=boulder|block-boulder-medium

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@@ -133,6 +133,7 @@ const PlayerLeave = Packages.mindustry.game.EventType.PlayerLeave
const PlayerConnect = Packages.mindustry.game.EventType.PlayerConnect const PlayerConnect = Packages.mindustry.game.EventType.PlayerConnect
const PlayerJoin = Packages.mindustry.game.EventType.PlayerJoin const PlayerJoin = Packages.mindustry.game.EventType.PlayerJoin
const UnitChangeEvent = Packages.mindustry.game.EventType.UnitChangeEvent const UnitChangeEvent = Packages.mindustry.game.EventType.UnitChangeEvent
const UnitUnloadEvent = Packages.mindustry.game.EventType.UnitUnloadEvent
const UnitCreateEvent = Packages.mindustry.game.EventType.UnitCreateEvent const UnitCreateEvent = Packages.mindustry.game.EventType.UnitCreateEvent
const UnitDrownEvent = Packages.mindustry.game.EventType.UnitDrownEvent const UnitDrownEvent = Packages.mindustry.game.EventType.UnitDrownEvent
const UnitDestroyEvent = Packages.mindustry.game.EventType.UnitDestroyEvent const UnitDestroyEvent = Packages.mindustry.game.EventType.UnitDestroyEvent
@@ -161,6 +162,7 @@ const LaunchItemEvent = Packages.mindustry.game.EventType.LaunchItemEvent
const SectorInvasionEvent = Packages.mindustry.game.EventType.SectorInvasionEvent const SectorInvasionEvent = Packages.mindustry.game.EventType.SectorInvasionEvent
const SectorLoseEvent = Packages.mindustry.game.EventType.SectorLoseEvent const SectorLoseEvent = Packages.mindustry.game.EventType.SectorLoseEvent
const WorldLoadEvent = Packages.mindustry.game.EventType.WorldLoadEvent const WorldLoadEvent = Packages.mindustry.game.EventType.WorldLoadEvent
const FileTreeInitEvent = Packages.mindustry.game.EventType.FileTreeInitEvent
const ClientLoadEvent = Packages.mindustry.game.EventType.ClientLoadEvent const ClientLoadEvent = Packages.mindustry.game.EventType.ClientLoadEvent
const ContentInitEvent = Packages.mindustry.game.EventType.ContentInitEvent const ContentInitEvent = Packages.mindustry.game.EventType.ContentInitEvent
const BlockInfoEvent = Packages.mindustry.game.EventType.BlockInfoEvent const BlockInfoEvent = Packages.mindustry.game.EventType.BlockInfoEvent

Binary file not shown.

View File

@@ -34,6 +34,7 @@ public abstract class ClientLauncher extends ApplicationCore implements Platform
@Override @Override
public void setup(){ public void setup(){
checkLaunch();
loadLogger(); loadLogger();
loader = new LoadRenderer(); loader = new LoadRenderer();
@@ -145,7 +146,12 @@ public abstract class ClientLauncher extends ApplicationCore implements Platform
finished = true; finished = true;
Events.fire(new ClientLoadEvent()); Events.fire(new ClientLoadEvent());
super.resize(graphics.getWidth(), graphics.getHeight()); super.resize(graphics.getWidth(), graphics.getHeight());
app.post(() -> app.post(() -> app.post(() -> app.post(() -> super.resize(graphics.getWidth(), graphics.getHeight()))))); app.post(() -> app.post(() -> app.post(() -> app.post(() -> {
super.resize(graphics.getWidth(), graphics.getHeight());
//mark initialization as complete
finishLaunch();
}))));
} }
}else{ }else{
asyncCore.begin(); asyncCore.begin();
@@ -168,6 +174,12 @@ public abstract class ClientLauncher extends ApplicationCore implements Platform
lastTime = Time.nanos(); lastTime = Time.nanos();
} }
@Override
public void exit(){
//on graceful exit, finish the launch normally.
Vars.finishLaunch();
}
@Override @Override
public void init(){ public void init(){
setup(); setup();
@@ -182,6 +194,11 @@ public abstract class ClientLauncher extends ApplicationCore implements Platform
@Override @Override
public void pause(){ public void pause(){
//when the user tabs out on mobile, the exit() event doesn't fire reliably - in that case, just assume they're about to kill the app
//this isn't 100% reliable but it should work for most cases
if(mobile){
Vars.finishLaunch();
}
if(finished){ if(finished){
super.pause(); super.pause();
} }

View File

@@ -32,12 +32,16 @@ import java.util.*;
import static arc.Core.*; import static arc.Core.*;
public class Vars implements Loadable{ public class Vars implements Loadable{
/** Whether the game failed to launch last time. */
public static boolean failedToLaunch = false;
/** Whether to load locales.*/ /** Whether to load locales.*/
public static boolean loadLocales = true; public static boolean loadLocales = true;
/** Whether the logger is loaded. */ /** Whether the logger is loaded. */
public static boolean loadedLogger = false, loadedFileLogger = false; public static boolean loadedLogger = false, loadedFileLogger = false;
/** Whether to enable various experimental features (e.g. cliffs) */ /** Whether to enable various experimental features (e.g. cliffs) */
public static boolean experimental = false; public static boolean experimental = false;
/** Name of current Steam player. */
public static String steamPlayerName = "";
/** Maximum extra padding around deployment schematics. */ /** Maximum extra padding around deployment schematics. */
public static final int maxLoadoutSchematicPad = 5; public static final int maxLoadoutSchematicPad = 5;
/** Maximum schematic size.*/ /** Maximum schematic size.*/
@@ -54,16 +58,14 @@ public class Vars implements Loadable{
public static final String ghApi = "https://api.github.com"; public static final String ghApi = "https://api.github.com";
/** URL for discord invite. */ /** URL for discord invite. */
public static final String discordURL = "https://discord.gg/mindustry"; public static final String discordURL = "https://discord.gg/mindustry";
/** URL for sending crash reports to */ /** URL for sending crash reports to. Currently offline. */
public static final String crashReportURL = "http://192.99.169.18/report"; public static final String crashReportURL = "http://192.99.169.18/report";
/** URL the links to the wiki's modding guide.*/ /** URL the links to the wiki's modding guide.*/
public static final String modGuideURL = "https://mindustrygame.github.io/wiki/modding/1-modding/"; public static final String modGuideURL = "https://mindustrygame.github.io/wiki/modding/1-modding/";
/** URL to the JSON file containing all the global, public servers. Not queried in BE. */
public static final String serverJsonURL = "https://raw.githubusercontent.com/Anuken/Mindustry/master/servers.json";
/** URL to the JSON file containing all the BE servers. Only queried in BE. */ /** URL to the JSON file containing all the BE servers. Only queried in BE. */
public static final String serverJsonBeURL = "https://raw.githubusercontent.com/Anuken/Mindustry/master/servers_be.json"; public static final String serverJsonBeURL = "https://raw.githubusercontent.com/Anuken/Mindustry/master/servers_be.json";
/** URL to the JSON file containing all the BE servers. Only queried in the V6 alpha (will be removed once it's out). */ /** URL to the JSON file containing all the stable servers. */
public static final String serverJsonV6URL = "https://raw.githubusercontent.com/Anuken/Mindustry/master/servers_v6.json"; public static final String serverJsonURL = "https://raw.githubusercontent.com/Anuken/Mindustry/master/servers_v6.json";
/** URL of the github issue report template.*/ /** URL of the github issue report template.*/
public static final String reportIssueURL = "https://github.com/Anuken/Mindustry/issues/new?labels=bug&template=bug_report.md"; public static final String reportIssueURL = "https://github.com/Anuken/Mindustry/issues/new?labels=bug&template=bug_report.md";
/** list of built-in servers.*/ /** list of built-in servers.*/
@@ -172,6 +174,8 @@ public class Vars implements Loadable{
public static Fi schematicDirectory; public static Fi schematicDirectory;
/** data subdirectory used for bleeding edge build versions */ /** data subdirectory used for bleeding edge build versions */
public static Fi bebuildDirectory; public static Fi bebuildDirectory;
/** file used to store launch ID */
public static Fi launchIDFile;
/** empty map, indicates no current map */ /** empty map, indicates no current map */
public static Map emptyMap; public static Map emptyMap;
/** map file extension */ /** map file extension */
@@ -284,6 +288,27 @@ public class Vars implements Loadable{
maps.load(); maps.load();
} }
/** Checks if a launch failure occurred.
* If this is the case, failedToLaunch is set to true. */
public static void checkLaunch(){
settings.setAppName(appName);
launchIDFile = settings.getDataDirectory().child("launchid.dat");
if(launchIDFile.exists()){
failedToLaunch = true;
}else{
failedToLaunch = false;
launchIDFile.writeString("go away");
}
}
/** Cleans up after a successful launch. */
public static void finishLaunch(){
if(launchIDFile != null){
launchIDFile.delete();
}
}
public static void loadLogger(){ public static void loadLogger(){
if(loadedLogger) return; if(loadedLogger) return;

View File

@@ -209,6 +209,16 @@ public class BaseAI{
} }
Tile wtile = world.tile(realX, realY); Tile wtile = world.tile(realX, realY);
if(tile.block instanceof PayloadConveyor || tile.block instanceof PayloadAcceptor){
//near a building
for(Point2 point : Edges.getEdges(tile.block.size)){
var t = world.build(tile.x + point.x, tile.y + point.y);
if(t != null){
return false;
}
}
}
//may intersect AI path //may intersect AI path
tmpTiles.clear(); tmpTiles.clear();
if(tile.block.solid && wtile != null && wtile.getLinkedTilesAs(tile.block, tmpTiles).contains(t -> path.contains(t.pos()))){ if(tile.block.solid && wtile != null && wtile.getLinkedTilesAs(tile.block, tmpTiles).contains(t -> path.contains(t.pos()))){

View File

@@ -269,7 +269,6 @@ public class BlockIndexer{
public Building findTile(Team team, float x, float y, float range, Boolf<Building> pred, boolean usePriority){ public Building findTile(Team team, float x, float y, float range, Boolf<Building> pred, boolean usePriority){
Building closest = null; Building closest = null;
float dst = 0; float dst = 0;
float range2 = range * range;
for(int rx = Math.max((int)((x - range) / tilesize / quadrantSize), 0); rx <= (int)((x + range) / tilesize / quadrantSize) && rx < quadWidth(); rx++){ for(int rx = Math.max((int)((x - range) / tilesize / quadrantSize), 0); rx <= (int)((x + range) / tilesize / quadrantSize) && rx < quadWidth(); rx++){
for(int ry = Math.max((int)((y - range) / tilesize / quadrantSize), 0); ry <= (int)((y + range) / tilesize / quadrantSize) && ry < quadHeight(); ry++){ for(int ry = Math.max((int)((y - range) / tilesize / quadrantSize), 0); ry <= (int)((y + range) / tilesize / quadrantSize) && ry < quadHeight(); ry++){
@@ -282,13 +281,13 @@ public class BlockIndexer{
if(e == null || e.team != team || !pred.get(e) || !e.block.targetable || e.team == Team.derelict) continue; if(e == null || e.team != team || !pred.get(e) || !e.block.targetable || e.team == Team.derelict) continue;
float ndst = e.dst2(x, y); float bdst = e.dst(x, y) - e.hitSize() / 2f;
if(ndst < range2 && (closest == null || if(bdst < range && (closest == null ||
//this one is closer, and it is at least of equal priority //this one is closer, and it is at least of equal priority
(ndst < dst && (!usePriority || closest.block.priority.ordinal() <= e.block.priority.ordinal())) || (bdst < dst && (!usePriority || closest.block.priority.ordinal() <= e.block.priority.ordinal())) ||
//priority is used, and new block has higher priority regardless of range //priority is used, and new block has higher priority regardless of range
(usePriority && closest.block.priority.ordinal() < e.block.priority.ordinal()))){ (usePriority && closest.block.priority.ordinal() < e.block.priority.ordinal()))){
dst = ndst; dst = bdst;
closest = e; closest = e;
} }
} }

View File

@@ -13,9 +13,12 @@ import mindustry.world.blocks.ConstructBlock.*;
import static mindustry.Vars.*; import static mindustry.Vars.*;
public class BuilderAI extends AIController{ public class BuilderAI extends AIController{
float buildRadius = 1500; public static float buildRadius = 1500, retreatDst = 110f, fleeRange = 370f, retreatDelay = Time.toSeconds * 2f;
boolean found = false; boolean found = false;
@Nullable Unit following; @Nullable Unit following;
@Nullable Teamc enemy;
float retreatTimer;
@Override @Override
public void updateMovement(){ public void updateMovement(){
@@ -27,6 +30,7 @@ public class BuilderAI extends AIController{
unit.updateBuilding = true; unit.updateBuilding = true;
if(following != null){ if(following != null){
retreatTimer = 0f;
//try to follow and mimic someone //try to follow and mimic someone
//validate follower //validate follower
@@ -39,9 +43,25 @@ 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());
}else if(unit.buildPlan() == null){
//not following anyone or building
if(timer.get(timerTarget4, 40)){
enemy = target(unit.x, unit.y, fleeRange, true, true);
}
//fly away from enemy when not doing anything, but only after a delay
if((retreatTimer += Time.delta) >= retreatDelay){
if(enemy != null){
var core = unit.closestCore();
if(core != null && !unit.within(core, retreatDst)){
moveTo(core, retreatDst);
}
}
}
} }
if(unit.buildPlan() != null){ if(unit.buildPlan() != null){
retreatTimer = 0f;
//approach request if building //approach request if building
BuildPlan req = unit.buildPlan(); BuildPlan req = unit.buildPlan();

View File

@@ -49,10 +49,10 @@ public class FlyingAI extends AIController{
float ang = unit.angleTo(target); float ang = unit.angleTo(target);
float diff = Angles.angleDist(ang, unit.rotation()); float diff = Angles.angleDist(ang, unit.rotation());
if(diff > 100f && vec.len() < circleLength){ if(diff > 70f && vec.len() < circleLength){
vec.setAngle(unit.vel().angle()); vec.setAngle(unit.vel().angle());
}else{ }else{
vec.setAngle(Mathf.slerpDelta(unit.vel().angle(), vec.angle(), 0.6f)); vec.setAngle(Angles.moveToward(unit.vel().angle(), vec.angle(), 6f));
} }
vec.setLength(unit.speed()); vec.setLength(unit.speed());

View File

@@ -128,6 +128,9 @@ public class LogicAI extends AIController{
vec.setZero(); vec.setZero();
} }
//do not move when infinite vectors are used.
if(vec.isNaN() || vec.isInfinite()) return;
unit.approach(vec); unit.approach(vec);
} }

View File

@@ -1,11 +1,16 @@
package mindustry.ai.types; package mindustry.ai.types;
import arc.util.*;
import mindustry.entities.*; import mindustry.entities.*;
import mindustry.entities.units.*; import mindustry.entities.units.*;
import mindustry.gen.*; import mindustry.gen.*;
import mindustry.world.blocks.ConstructBlock.*; import mindustry.world.blocks.ConstructBlock.*;
public class RepairAI extends AIController{ public class RepairAI extends AIController{
public static float retreatDst = 160f, fleeRange = 310f, retreatDelay = Time.toSeconds * 3f;
@Nullable Teamc avoid;
float retreatTimer;
@Override @Override
protected void updateMovement(){ protected void updateMovement(){
@@ -29,6 +34,25 @@ public class RepairAI extends AIController{
unit.lookAt(target); unit.lookAt(target);
} }
//not repairing
if(!(target instanceof Building)){
if(timer.get(timerTarget4, 40)){
avoid = target(unit.x, unit.y, fleeRange, true, true);
}
if((retreatTimer += Time.delta) >= retreatDelay){
//fly away from enemy when not doing anything
if(avoid != null){
var core = unit.closestCore();
if(core != null && !unit.within(core, retreatDst)){
moveTo(core, retreatDst);
}
}
}
}else{
retreatTimer = 0f;
}
} }
@Override @Override

View File

@@ -1,5 +1,6 @@
package mindustry.ai.types; package mindustry.ai.types;
import arc.math.geom.*;
import mindustry.*; import mindustry.*;
import mindustry.ai.*; import mindustry.ai.*;
import mindustry.entities.*; import mindustry.entities.*;
@@ -47,7 +48,8 @@ public class SuicideAI extends GroundAI{
//raycast for target //raycast for target
boolean blocked = Vars.world.raycast(unit.tileX(), unit.tileY(), target.tileX(), target.tileY(), (x, y) -> { boolean blocked = Vars.world.raycast(unit.tileX(), unit.tileY(), target.tileX(), target.tileY(), (x, y) -> {
Tile tile = Vars.world.tile(x, y); for(Point2 p : Geometry.d4c){
Tile tile = Vars.world.tile(x + p.x, y + p.y);
if(tile != null && tile.build == target) return false; if(tile != null && tile.build == target) return false;
if(tile != null && tile.build != null && tile.build.team != unit.team()){ if(tile != null && tile.build != null && tile.build.team != unit.team()){
blockedByBlock = true; blockedByBlock = true;
@@ -55,6 +57,8 @@ public class SuicideAI extends GroundAI{
}else{ }else{
return tile == null || tile.solid(); return tile == null || tile.solid();
} }
}
return false;
}); });
//shoot when there's an enemy block in the way //shoot when there's an enemy block in the way

View File

@@ -1,8 +1,6 @@
package mindustry.content; package mindustry.content;
import arc.*;
import arc.graphics.*; import arc.graphics.*;
import arc.graphics.g2d.*;
import arc.struct.*; import arc.struct.*;
import mindustry.*; import mindustry.*;
import mindustry.ctype.*; import mindustry.ctype.*;
@@ -97,36 +95,9 @@ public class Blocks implements ContentList{
public void load(){ public void load(){
//region environment //region environment
air = new Floor("air"){ air = new AirBlock("air");
{
alwaysReplace = true;
hasShadow = false;
useColor = false;
wall = this;
}
@Override public void drawBase(Tile tile){} spawn = new SpawnBlock("spawn");
@Override public void load(){}
@Override public void init(){}
@Override public boolean isHidden(){ return true; }
@Override
public TextureRegion[] variantRegions(){
if(variantRegions == null){
variantRegions = new TextureRegion[]{Core.atlas.find("clear")};
}
return variantRegions;
}
};
spawn = new OverlayFloor("spawn"){
{
variants = 0;
needsSurface = false;
}
@Override
public void drawBase(Tile tile){}
};
cliff = new Cliff("cliff"){{ cliff = new Cliff("cliff"){{
inEditor = false; inEditor = false;
@@ -2076,6 +2047,7 @@ public class Blocks implements ContentList{
hasPower = true; hasPower = true;
consumes.power(10f); consumes.power(10f);
buildCostMultiplier = 0.5f; buildCostMultiplier = 0.5f;
health = size * size * 80;
}}; }};
//endregion campaign //endregion campaign

View File

@@ -63,7 +63,7 @@ public class Bullets implements ContentList{
lifetime = 80f; lifetime = 80f;
width = height = 11f; width = height = 11f;
collidesTiles = false; collidesTiles = false;
splashDamageRadius = 25f; splashDamageRadius = 25f * 0.75f;
splashDamage = 33f; splashDamage = 33f;
}}; }};
@@ -84,7 +84,7 @@ public class Bullets implements ContentList{
lifetime = 80f; lifetime = 80f;
width = height = 13f; width = height = 13f;
collidesTiles = false; collidesTiles = false;
splashDamageRadius = 35f; splashDamageRadius = 35f * 0.75f;
splashDamage = 45f; splashDamage = 45f;
fragBullet = artilleryPlasticFrag; fragBullet = artilleryPlasticFrag;
fragBullets = 10; fragBullets = 10;
@@ -98,7 +98,7 @@ public class Bullets implements ContentList{
lifetime = 80f; lifetime = 80f;
width = height = 11f; width = height = 11f;
collidesTiles = false; collidesTiles = false;
splashDamageRadius = 25f; splashDamageRadius = 25f * 0.75f;
splashDamage = 33f; splashDamage = 33f;
reloadMultiplier = 1.2f; reloadMultiplier = 1.2f;
ammoMultiplier = 3f; ammoMultiplier = 3f;
@@ -112,7 +112,7 @@ public class Bullets implements ContentList{
lifetime = 80f; lifetime = 80f;
width = height = 13f; width = height = 13f;
collidesTiles = false; collidesTiles = false;
splashDamageRadius = 25f; splashDamageRadius = 25f * 0.75f;
splashDamage = 35f; splashDamage = 35f;
status = StatusEffects.burning; status = StatusEffects.burning;
frontColor = Pal.lightishOrange; frontColor = Pal.lightishOrange;
@@ -128,7 +128,7 @@ public class Bullets implements ContentList{
width = height = 14f; width = height = 14f;
collidesTiles = false; collidesTiles = false;
ammoMultiplier = 4f; ammoMultiplier = 4f;
splashDamageRadius = 45f; splashDamageRadius = 45f * 0.75f;
splashDamage = 50f; splashDamage = 50f;
backColor = Pal.missileYellowBack; backColor = Pal.missileYellowBack;
frontColor = Pal.missileYellow; frontColor = Pal.missileYellow;

View File

@@ -1609,6 +1609,12 @@ public class Fx{
Fill.square(e.x, e.y, e.rotation * tilesize / 2f); Fill.square(e.x, e.y, e.rotation * tilesize / 2f);
}), }),
lightBlock = new Effect(60, e -> {
color(e.color);
alpha(e.fout() * 1);
Fill.square(e.x, e.y, e.rotation * tilesize / 2f);
}),
overdriveBlockFull = new Effect(60, e -> { overdriveBlockFull = new Effect(60, e -> {
color(e.color); color(e.color);
alpha(e.fslope() * 0.4f); alpha(e.fslope() * 0.4f);

View File

@@ -240,8 +240,8 @@ public class UnitTypes implements ContentList{
fragVelocityMin = 0.4f; fragVelocityMin = 0.4f;
hitEffect = Fx.blastExplosion; hitEffect = Fx.blastExplosion;
splashDamage = 18f; splashDamage = 16f;
splashDamageRadius = 30f; splashDamageRadius = 13f;
fragBullets = 2; fragBullets = 2;
fragLifeMin = 0f; fragLifeMin = 0f;
@@ -257,7 +257,7 @@ public class UnitTypes implements ContentList{
lifetime = 20f; lifetime = 20f;
hitEffect = Fx.flakExplosion; hitEffect = Fx.flakExplosion;
splashDamage = 15f; splashDamage = 15f;
splashDamageRadius = 15f; splashDamageRadius = 10f;
}}; }};
}}; }};
}} }}
@@ -565,9 +565,9 @@ public class UnitTypes implements ContentList{
hitEffect = Fx.pulverize; hitEffect = Fx.pulverize;
lifetime = 10f; lifetime = 10f;
speed = 1f; speed = 1f;
splashDamageRadius = 70f; splashDamageRadius = 58f;
instantDisappear = true; instantDisappear = true;
splashDamage = 80f; splashDamage = 85f;
killShooter = true; killShooter = true;
hittable = false; hittable = false;
collidesAir = true; collidesAir = true;
@@ -769,7 +769,7 @@ public class UnitTypes implements ContentList{
width = height = 19f; width = height = 19f;
collidesTiles = true; collidesTiles = true;
ammoMultiplier = 4f; ammoMultiplier = 4f;
splashDamageRadius = 95f; splashDamageRadius = 70f;
splashDamage = 65f; splashDamage = 65f;
backColor = Pal.sapBulletBack; backColor = Pal.sapBulletBack;
frontColor = lightningColor = Pal.sapBullet; frontColor = lightningColor = Pal.sapBullet;
@@ -867,7 +867,7 @@ public class UnitTypes implements ContentList{
width = height = 25f; width = height = 25f;
collidesTiles = collides = true; collidesTiles = collides = true;
ammoMultiplier = 4f; ammoMultiplier = 4f;
splashDamageRadius = 90f; splashDamageRadius = 80f;
splashDamage = 75f; splashDamage = 75f;
backColor = Pal.sapBulletBack; backColor = Pal.sapBulletBack;
frontColor = lightningColor = Pal.sapBullet; frontColor = lightningColor = Pal.sapBullet;
@@ -888,7 +888,7 @@ public class UnitTypes implements ContentList{
lifetime = 90f; lifetime = 90f;
width = height = 20f; width = height = 20f;
collidesTiles = false; collidesTiles = false;
splashDamageRadius = 80f; splashDamageRadius = 70f;
splashDamage = 40f; splashDamage = 40f;
backColor = Pal.sapBulletBack; backColor = Pal.sapBulletBack;
frontColor = lightningColor = Pal.sapBullet; frontColor = lightningColor = Pal.sapBullet;
@@ -1366,8 +1366,8 @@ public class UnitTypes implements ContentList{
collides = false; collides = false;
healPercent = 15f; healPercent = 15f;
splashDamage = 230f; splashDamage = 220f;
splashDamageRadius = 120f; splashDamageRadius = 80f;
}}; }};
}}); }});
}}; }};
@@ -1537,7 +1537,7 @@ public class UnitTypes implements ContentList{
width = 15f; width = 15f;
collidesTiles = false; collidesTiles = false;
ammoMultiplier = 4f; ammoMultiplier = 4f;
splashDamageRadius = 60f; splashDamageRadius = 40f;
splashDamage = 80f; splashDamage = 80f;
backColor = Pal.missileYellowBack; backColor = Pal.missileYellowBack;
frontColor = Pal.missileYellow; frontColor = Pal.missileYellow;
@@ -1590,7 +1590,7 @@ public class UnitTypes implements ContentList{
}}; }};
sei = new UnitType("sei"){{ sei = new UnitType("sei"){{
health = 10200; health = 10500;
armor = 12f; armor = 12f;
speed = 0.73f; speed = 0.73f;

View File

@@ -59,6 +59,15 @@ public class Control implements ApplicationListener, Loadable{
saves = new Saves(); saves = new Saves();
sound = new SoundControl(); sound = new SoundControl();
//show dialog saying that mod loading was skipped.
Events.on(ClientLoadEvent.class, e -> {
if(Vars.mods.skipModLoading() && Vars.mods.list().any()){
Time.runTask(4f, () -> {
ui.showInfo("@mods.initfailed");
});
}
});
Events.on(StateChangeEvent.class, event -> { Events.on(StateChangeEvent.class, event -> {
if((event.from == State.playing && event.to == State.menu) || (event.from == State.menu && event.to != State.menu)){ if((event.from == State.playing && event.to == State.menu) || (event.from == State.menu && event.to != State.menu)){
Time.runTask(5f, platform::updateRPC); Time.runTask(5f, platform::updateRPC);

View File

@@ -75,6 +75,7 @@ public class NetClient implements ApplicationListener{
ConnectPacket c = new ConnectPacket(); ConnectPacket c = new ConnectPacket();
c.name = player.name; c.name = player.name;
c.locale = Core.settings.getString("locale");
c.mods = mods.getModStrings(); c.mods = mods.getModStrings();
c.mobile = mobile; c.mobile = mobile;
c.versionType = Version.type; c.versionType = Version.type;
@@ -480,7 +481,7 @@ public class NetClient implements ApplicationListener{
netClient.byteStream.setBytes(net.decompressSnapshot(coreData, coreDataLen)); netClient.byteStream.setBytes(net.decompressSnapshot(coreData, coreDataLen));
DataInputStream input = netClient.dataStream; DataInputStream input = netClient.dataStream;
byte cores = input.readByte(); int cores = input.readInt();
for(int i = 0; i < cores; i++){ for(int i = 0; i < cores; i++){
int pos = input.readInt(); int pos = input.readInt();
Tile tile = world.tile(pos); Tile tile = world.tile(pos);

View File

@@ -195,6 +195,10 @@ public class NetServer implements ApplicationListener{
return; return;
} }
if(packet.locale == null){
packet.locale = "en_US";
}
String ip = con.address; String ip = con.address;
admins.updatePlayerJoined(uuid, ip, packet.name); admins.updatePlayerJoined(uuid, ip, packet.name);
@@ -215,6 +219,7 @@ public class NetServer implements ApplicationListener{
player.con.uuid = uuid; player.con.uuid = uuid;
player.con.mobile = packet.mobile; player.con.mobile = packet.mobile;
player.name = packet.name; player.name = packet.name;
player.locale = packet.locale;
player.color.set(packet.color).a(1f); player.color.set(packet.color).a(1f);
//save admin ID but don't overwrite it //save admin ID but don't overwrite it
@@ -847,7 +852,7 @@ public class NetServer implements ApplicationListener{
syncStream.reset(); syncStream.reset();
int sum = state.teams.present.sum(t -> t.cores.size); int sum = state.teams.present.sum(t -> t.cores.size);
dataStream.writeByte(sum); dataStream.writeInt(sum);
for(TeamData data : state.teams.present){ for(TeamData data : state.teams.present){
for(CoreBuild entity : data.cores){ for(CoreBuild entity : data.cores){

View File

@@ -20,10 +20,9 @@ import static mindustry.Vars.*;
public interface Platform{ public interface Platform{
/** Dynamically loads a jar file. */ /** Dynamically creates a class loader for a jar file. */
default Class<?> loadJar(Fi jar, String mainClass) throws Exception{ default ClassLoader loadJar(Fi jar, String mainClass) throws Exception{
URLClassLoader classLoader = new URLClassLoader(new URL[]{jar.file().toURI().toURL()}, getClass().getClassLoader()); return new URLClassLoader(new URL[]{jar.file().toURI().toURL()}, getClass().getClassLoader());
return Class.forName(mainClass, true, classLoader);
} }
/** Steam: Update lobby visibility.*/ /** Steam: Update lobby visibility.*/

View File

@@ -67,7 +67,6 @@ public class Renderer implements ApplicationListener{
@Override @Override
public void update(){ public void update(){
Color.white.set(1f, 1f, 1f, 1f); Color.white.set(1f, 1f, 1f, 1f);
Gl.clear(Gl.stencilBufferBit);
float dest = Mathf.round(targetscale, 0.5f); float dest = Mathf.round(targetscale, 0.5f);
camerascale = Mathf.lerpDelta(camerascale, dest, 0.1f); camerascale = Mathf.lerpDelta(camerascale, dest, 0.1f);
@@ -208,7 +207,7 @@ public class Renderer implements ApplicationListener{
Draw.draw(Layer.background, this::drawBackground); Draw.draw(Layer.background, this::drawBackground);
Draw.draw(Layer.floor, blocks.floor::drawFloor); Draw.draw(Layer.floor, blocks.floor::drawFloor);
Draw.draw(Layer.block - 1, blocks::drawShadows); Draw.draw(Layer.block - 1, blocks::drawShadows);
Draw.draw(Layer.block, () -> { Draw.draw(Layer.block - 0.09f, () -> {
blocks.floor.beginDraw(); blocks.floor.beginDraw();
blocks.floor.drawLayer(CacheLayer.walls); blocks.floor.drawLayer(CacheLayer.walls);
blocks.floor.endDraw(); blocks.floor.endDraw();

View File

@@ -108,7 +108,7 @@ public class UI implements ApplicationListener, Loadable{
Dialog.setHideAction(() -> sequence(fadeOut(0.1f))); Dialog.setHideAction(() -> sequence(fadeOut(0.1f)));
Tooltips.getInstance().animations = false; Tooltips.getInstance().animations = false;
Tooltips.getInstance().textProvider = text -> new Tooltip(t -> t.background(Styles.black5).margin(4f).add(text)); Tooltips.getInstance().textProvider = text -> new Tooltip(t -> t.background(Styles.black6).margin(4f).add(text));
Core.settings.setErrorHandler(e -> { Core.settings.setErrorHandler(e -> {
Log.err(e); Log.err(e);

View File

@@ -4,6 +4,7 @@ import arc.*;
import arc.func.*; import arc.func.*;
import arc.math.*; import arc.math.*;
import arc.math.geom.*; import arc.math.geom.*;
import arc.math.geom.Geometry.*;
import arc.struct.*; import arc.struct.*;
import arc.struct.ObjectIntMap.*; import arc.struct.ObjectIntMap.*;
import arc.util.*; import arc.util.*;
@@ -554,10 +555,6 @@ public class World{
return dark; return dark;
} }
public interface Raycaster{
boolean accept(int x, int y);
}
private class Context implements WorldContext{ private class Context implements WorldContext{
Context(){ Context(){

View File

@@ -8,6 +8,7 @@ import arc.math.geom.*;
import arc.struct.*; import arc.struct.*;
import mindustry.content.*; import mindustry.content.*;
import mindustry.editor.DrawOperation.*; import mindustry.editor.DrawOperation.*;
import mindustry.entities.units.*;
import mindustry.game.*; import mindustry.game.*;
import mindustry.gen.*; import mindustry.gen.*;
import mindustry.io.*; import mindustry.io.*;
@@ -259,7 +260,7 @@ public class MapEditor{
clearOp(); clearOp();
Tiles previous = world.tiles; Tiles previous = world.tiles;
int offsetX = -(width - width()) / 2, offsetY = -(height - height()) / 2; int offsetX = (width() - width) / 2, offsetY = (height() - height) / 2;
loading = true; loading = true;
Tiles tiles = world.resize(width, height); Tiles tiles = world.resize(width, height);
@@ -275,7 +276,17 @@ public class MapEditor{
if(tile.build != null && tile.isCenter()){ if(tile.build != null && tile.isCenter()){
tile.build.x = x * tilesize + tile.block().offset; tile.build.x = x * tilesize + tile.block().offset;
tile.build.y = y * tilesize + tile.block().offset; tile.build.y = y * tilesize + tile.block().offset;
//shift links to account for map resize
Object config = tile.build.config();
if(config != null){
Object out = BuildPlan.pointConfig(tile.block(), config, p -> p.sub(offsetX, offsetY));
if(out != config){
tile.build.configureAny(out);
} }
}
}
}else{ }else{
tiles.set(x, y, new EditorTile(x, y, Blocks.stone.id, (short)0, (short)0)); tiles.set(x, y, new EditorTile(x, y, Blocks.stone.id, (short)0, (short)0));
} }

View File

@@ -156,7 +156,10 @@ public class MapEditorDialog extends Dialog implements Disposable{
} }
platform.publish(map); platform.publish(map);
}).padTop(-3).size(swidth * 2f + 10, 60f).update(b -> b.setText(editor.tags.containsKey("steamid") ? editor.tags.get("author").equals(player.name) ? "@workshop.listing" : "@view.workshop" : "@editor.publish.workshop")); }).padTop(-3).size(swidth * 2f + 10, 60f).update(b ->
b.setText(editor.tags.containsKey("steamid") ?
editor.tags.get("author", "").equals(steamPlayerName) ? "@workshop.listing" : "@view.workshop" :
"@editor.publish.workshop"));
menu.cont.row(); menu.cont.row();
} }

View File

@@ -6,7 +6,6 @@ import arc.math.*;
import arc.math.geom.*; import arc.math.geom.*;
import arc.struct.*; import arc.struct.*;
import arc.util.*; import arc.util.*;
import mindustry.annotations.Annotations.*;
import mindustry.content.*; import mindustry.content.*;
import mindustry.core.*; import mindustry.core.*;
import mindustry.game.EventType.*; import mindustry.game.EventType.*;
@@ -25,11 +24,10 @@ public class Damage{
private static Rect hitrect = new Rect(); private static Rect hitrect = new Rect();
private static Vec2 tr = new Vec2(), seg1 = new Vec2(), seg2 = new Vec2(); private static Vec2 tr = new Vec2(), seg1 = new Vec2(), seg2 = new Vec2();
private static Seq<Unit> units = new Seq<>(); private static Seq<Unit> units = new Seq<>();
private static GridBits bits = new GridBits(30, 30);
private static IntQueue propagation = new IntQueue();
private static IntSet collidedBlocks = new IntSet(); private static IntSet collidedBlocks = new IntSet();
private static Building tmpBuilding; private static Building tmpBuilding;
private static Unit tmpUnit; private static Unit tmpUnit;
private static IntFloatMap damages = new IntFloatMap();
/** Creates a dynamic explosion based on specified parameters. */ /** Creates a dynamic explosion based on specified parameters. */
public static void dynamicExplosion(float x, float y, float flammability, float explosiveness, float power, float radius, boolean damage){ public static void dynamicExplosion(float x, float y, float flammability, float explosiveness, float power, float radius, boolean damage){
@@ -116,7 +114,15 @@ public class Damage{
* Only enemies of the specified team are damaged. * Only enemies of the specified team are damaged.
*/ */
public static void collideLine(Bullet hitter, Team team, Effect effect, float x, float y, float angle, float length, boolean large){ public static void collideLine(Bullet hitter, Team team, Effect effect, float x, float y, float angle, float length, boolean large){
length = findLaserLength(hitter, length); collideLine(hitter, team, effect, x, y, angle, length, large, true);
}
/**
* Damages entities in a line.
* Only enemies of the specified team are damaged.
*/
public static void collideLine(Bullet hitter, Team team, Effect effect, float x, float y, float angle, float length, boolean large, boolean laser){
if(laser) length = findLaserLength(hitter, length);
collidedBlocks.clear(); collidedBlocks.clear();
tr.trns(angle, length); tr.trns(angle, length);
@@ -207,9 +213,9 @@ public class Damage{
public static Healthc linecast(Bullet hitter, float x, float y, float angle, float length){ public static Healthc linecast(Bullet hitter, float x, float y, float angle, float length){
tr.trns(angle, length); tr.trns(angle, length);
if(hitter.type.collidesGround){
tmpBuilding = null; tmpBuilding = null;
if(hitter.type.collidesGround){
world.raycastEachWorld(x, y, x + tr.x, y + tr.y, (cx, cy) -> { world.raycastEachWorld(x, y, x + tr.x, y + tr.y, (cx, cy) -> {
Building tile = world.build(cx, cy); Building tile = world.build(cx, cy);
if(tile != null && tile.team != hitter.team){ if(tile != null && tile.team != hitter.team){
@@ -218,8 +224,6 @@ public class Damage{
} }
return false; return false;
}); });
if(tmpBuilding != null) return tmpBuilding;
} }
rect.setPosition(x, y).setSize(tr.x, tr.y); rect.setPosition(x, y).setSize(tr.x, tr.y);
@@ -263,6 +267,14 @@ public class Damage{
Units.nearbyEnemies(hitter.team, rect, cons); Units.nearbyEnemies(hitter.team, rect, cons);
if(tmpBuilding != null && tmpUnit != null){
if(Mathf.dst2(x, y, tmpUnit.getX(), tmpUnit.getY()) <= Mathf.dst2(x, y, tmpBuilding.getX(), tmpBuilding.getY())){
return tmpUnit;
}
}else if(tmpBuilding != null){
return tmpBuilding;
}
return tmpUnit; return tmpUnit;
} }
@@ -351,64 +363,84 @@ public class Damage{
if(ground){ if(ground){
if(!complete){ if(!complete){
int trad = (int)(radius / tilesize); tileDamage(team, World.toTile(x), World.toTile(y), radius / tilesize, damage);
Tile tile = world.tileWorld(x, y);
if(tile != null){
tileDamage(team, tile.x, tile.y, trad, damage);
}
}else{ }else{
completeDamage(team, x, y, radius, damage); completeDamage(team, x, y, radius, damage);
} }
} }
} }
public static void tileDamage(Team team, int startx, int starty, int baseRadius, float baseDamage){ public static void tileDamage(Team team, int x, int y, float baseRadius, float damage){
//tile damage is posted, so that destroying a block that causes a chain explosion will run in the next frame
//this prevents recursive damage calls from messing up temporary variables
Core.app.post(() -> { Core.app.post(() -> {
bits.clear(); var in = world.build(x, y);
propagation.clear(); //spawned inside a multiblock. this means that damage needs to be dealt directly.
int bitOffset = bits.width() / 2; //why? because otherwise the building would absorb everything in one cell, which means much less damage than a nearby explosion.
//this needs to be compensated
if(in != null && in.team != team && in.block.size > 1 && in.health > damage){
//deal the damage of an entire side, to be equivalent with maximum 'standard' damage
in.damage(damage * Math.min((in.block.size), baseRadius * 0.45f));
//no need to continue with the explosion
return;
}
propagation.addFirst(PropCell.get((byte)0, (byte)0, (short)baseDamage)); //cap radius to prevent lag
//clamp radius to fit bits float radius = Math.min(baseRadius, 30), rad2 = radius * radius;
int radius = Math.min(baseRadius, bits.width() / 2); int rays = Mathf.ceil(radius * 2 * Mathf.pi);
double spacing = Math.PI * 2.0 / rays;
damages.clear();
while(!propagation.isEmpty()){ //raycast from each angle
int prop = propagation.removeLast(); for(int i = 0; i <= rays; i++){
int x = PropCell.x(prop); float dealt = 0f;
int y = PropCell.y(prop); int startX = x;
int damage = PropCell.damage(prop); int startY = y;
//manhattan distance used for calculating falloff, results in a diamond pattern int endX = x + (int)(Math.cos(spacing * i) * radius), endY = y + (int)(Math.sin(spacing * i) * radius);
int dst = Math.abs(x) + Math.abs(y);
int scaledDamage = (int)(damage * (1f - (float)dst / radius)); int xDist = Math.abs(endX - startX);
int yDist = -Math.abs(endY - startY);
int xStep = (startX < endX ? +1 : -1);
int yStep = (startY < endY ? +1 : -1);
int error = xDist + yDist;
bits.set(bitOffset + x, bitOffset + y); while(startX != endX || startY != endY){
Tile tile = world.tile(startx + x, starty + y); var build = world.build(startX, startY);
if(build != null && build.team != team){
//damage dealt at circle edge
float edgeScale = 0.6f;
float mult = (1f-(Mathf.dst2(startX, startY, x, y) / rad2) + edgeScale) / (1f + edgeScale);
float next = damage * mult - dealt;
//register damage dealt
int p = Point2.pack(startX, startY);
damages.put(p, Math.max(damages.get(p), next));
//register as hit
dealt += build.health;
if(scaledDamage <= 0 || tile == null) continue; if(next - dealt <= 0){
break;
//apply damage to entity if needed
if(tile.build != null && tile.build.team != team){
int health = (int)(tile.build.health / (tile.block().size * tile.block().size));
if(tile.build.health > 0){
tile.build.damage(scaledDamage);
scaledDamage -= health;
if(scaledDamage <= 0) continue;
} }
} }
for(Point2 p : Geometry.d4){ if(2 * error - yDist > xDist - 2 * error){
if(!bits.get(bitOffset + x + p.x, bitOffset + y + p.y)){ error += yDist;
propagation.addFirst(PropCell.get((byte)(x + p.x), (byte)(y + p.y), (short)scaledDamage)); startX += xStep;
}else{
error += xDist;
startY += yStep;
} }
} }
} }
//apply damage
for(var e : damages){
int cx = Point2.x(e.key), cy = Point2.y(e.key);
var build = world.build(cx, cy);
if(build != null){
build.damage(e.value);
}
}
}); });
} }
private static void completeDamage(Team team, float x, float y, float radius, float damage){ private static void completeDamage(Team team, float x, float y, float radius, float damage){
@@ -429,11 +461,4 @@ public class Damage{
float scaled = Mathf.lerp(1f - dist / radius, 1f, falloff); float scaled = Mathf.lerp(1f - dist / radius, 1f, falloff);
return damage * scaled; return damage * scaled;
} }
@Struct
static class PropCellStruct{
byte x;
byte y;
short damage;
}
} }

View File

@@ -6,6 +6,7 @@ import arc.math.geom.*;
import arc.struct.*; import arc.struct.*;
import mindustry.annotations.Annotations.*; import mindustry.annotations.Annotations.*;
import mindustry.content.*; import mindustry.content.*;
import mindustry.entities.comp.*;
import mindustry.game.*; import mindustry.game.*;
import mindustry.game.Teams.*; import mindustry.game.Teams.*;
import mindustry.gen.*; import mindustry.gen.*;
@@ -75,7 +76,7 @@ public class Units{
if((team == state.rules.waveTeam && !state.rules.pvp) || (state.isCampaign() && team == state.rules.waveTeam)){ if((team == state.rules.waveTeam && !state.rules.pvp) || (state.isCampaign() && team == state.rules.waveTeam)){
return Integer.MAX_VALUE; return Integer.MAX_VALUE;
} }
return state.rules.unitCap + indexer.getExtraUnits(team); return Math.max(0, state.rules.unitCapVariable ? state.rules.unitCap + indexer.getExtraUnits(team) : state.rules.unitCap);
} }
/** @return whether this player can interact with a specific tile. if either of these are null, returns true.*/ /** @return whether this player can interact with a specific tile. if either of these are null, returns true.*/
@@ -93,7 +94,7 @@ public class Units{
* @return whether the target is invalid * @return whether the target is invalid
*/ */
public static boolean invalidateTarget(Posc target, Team team, float x, float y, float range){ public static boolean invalidateTarget(Posc target, Team team, float x, float y, float range){
return target == null || (range != Float.MAX_VALUE && !target.within(x, y, range)) || (target instanceof Teamc && ((Teamc)target).team() == team) || (target instanceof Healthc && !((Healthc)target).isValid()); return target == null || (range != Float.MAX_VALUE && !target.within(x, y, range + (target instanceof Sized hb ? hb.hitSize()/2f : 0f))) || (target instanceof Teamc t && t.team() == team) || (target instanceof Healthc h && !h.isValid());
} }
/** See {@link #invalidateTarget(Posc, Team, float, float, float)} */ /** See {@link #invalidateTarget(Posc, Team, float, float, float)} */
@@ -217,7 +218,7 @@ public class Units{
cdist = 0f; cdist = 0f;
nearbyEnemies(team, x - range, y - range, range*2f, range*2f, e -> { nearbyEnemies(team, x - range, y - range, range*2f, range*2f, e -> {
if(e.dead() || !predicate.get(e) || !e.within(x, y, range)) return; if(e.dead() || !predicate.get(e) || !e.within(x, y, range + e.hitSize/2f)) return;
float cost = sort.cost(e, x, y); float cost = sort.cost(e, x, y);
if(result == null || cost < cdist){ if(result == null || cost < cdist){
@@ -292,7 +293,7 @@ public class Units{
/** Iterates over all units in a circle around this position. */ /** Iterates over all units in a circle around this position. */
public static void nearby(Team team, float x, float y, float radius, Cons<Unit> cons){ public static void nearby(Team team, float x, float y, float radius, Cons<Unit> cons){
nearby(team, x - radius, y - radius, radius*2f, radius*2f, unit -> { nearby(team, x - radius, y - radius, radius*2f, radius*2f, unit -> {
if(unit.within(x, y, radius)){ if(unit.within(x, y, radius + unit.hitSize/2f)){
cons.get(unit); cons.get(unit);
} }
}); });

View File

@@ -273,7 +273,7 @@ public abstract class BulletType extends Content{
if(homingPower > 0.0001f && b.time >= homingDelay){ if(homingPower > 0.0001f && b.time >= homingDelay){
Teamc target = Units.closestTarget(b.team, b.x, b.y, homingRange, e -> (e.isGrounded() && collidesGround) || (e.isFlying() && collidesAir), t -> collidesGround); Teamc target = Units.closestTarget(b.team, b.x, b.y, homingRange, e -> (e.isGrounded() && collidesGround) || (e.isFlying() && collidesAir), t -> collidesGround);
if(target != null){ if(target != null){
b.vel.setAngle(Mathf.slerpDelta(b.rotation(), b.angleTo(target), homingPower)); b.vel.setAngle(Angles.moveToward(b.rotation(), b.angleTo(target), homingPower * Time.delta * 50f));
} }
} }

View File

@@ -8,8 +8,8 @@ import mindustry.gen.*;
import mindustry.graphics.*; import mindustry.graphics.*;
public class LightningBulletType extends BulletType{ public class LightningBulletType extends BulletType{
protected Color lightningColor = Pal.lancerLaser; public Color lightningColor = Pal.lancerLaser;
protected int lightningLength = 25, lightningLengthRand = 0; public int lightningLength = 25, lightningLengthRand = 0;
public LightningBulletType(){ public LightningBulletType(){
super(0.0001f, 1f); super(0.0001f, 1f);

View File

@@ -54,7 +54,7 @@ public class RailBulletType extends BulletType{
super.init(b); super.init(b);
b.fdata = length; b.fdata = length;
Damage.collideLine(b, b.team, b.type.hitEffect, b.x, b.y, b.rotation(), length, false); Damage.collideLine(b, b.team, b.type.hitEffect, b.x, b.y, b.rotation(), length, false, false);
float resultLen = b.fdata; float resultLen = b.fdata;
Vec2 nor = Tmp.v1.set(b.vel).nor(); Vec2 nor = Tmp.v1.set(b.vel).nor();

View File

@@ -43,7 +43,7 @@ import static mindustry.Vars.*;
@EntityDef(value = {Buildingc.class}, isFinal = false, genio = false, serialize = false) @EntityDef(value = {Buildingc.class}, isFinal = false, genio = false, serialize = false)
@Component(base = true) @Component(base = true)
abstract class BuildingComp implements Posc, Teamc, Healthc, Buildingc, Timerc, QuadTreeObject, Displayable, Senseable, Controllable{ abstract class BuildingComp implements Posc, Teamc, Healthc, Buildingc, Timerc, QuadTreeObject, Displayable, Senseable, Controllable, Sized{
//region vars and initialization //region vars and initialization
static final float timeToSleep = 60f * 1, timeToUncontrol = 60f * 6; static final float timeToSleep = 60f * 1, timeToUncontrol = 60f * 6;
static final ObjectSet<Building> tmpTiles = new ObjectSet<>(); static final ObjectSet<Building> tmpTiles = new ObjectSet<>();
@@ -558,7 +558,6 @@ abstract class BuildingComp implements Posc, Teamc, Healthc, Buildingc, Timerc,
if(ofract < fract) transferLiquid(other, (fract - ofract) * block.liquidCapacity / scaling, liquid); if(ofract < fract) transferLiquid(other, (fract - ofract) * block.liquidCapacity / scaling, liquid);
} }
} }
} }
public boolean canDumpLiquid(Building to, Liquid liquid){ public boolean canDumpLiquid(Building to, Liquid liquid){
@@ -793,6 +792,7 @@ abstract class BuildingComp implements Posc, Teamc, Healthc, Buildingc, Timerc,
for(Building other : proximity){ for(Building other : proximity){
if(other != null && other.power != null if(other != null && other.power != null
&& other.team == team
&& !(block.consumesPower && other.block.consumesPower && !block.outputsPower && !other.block.outputsPower) && !(block.consumesPower && other.block.consumesPower && !block.outputsPower && !other.block.outputsPower)
&& conductsTo(other) && other.conductsTo(self()) && !power.links.contains(other.pos())){ && conductsTo(other) && other.conductsTo(self()) && !power.links.contains(other.pos())){
out.add(other); out.add(other);
@@ -801,7 +801,7 @@ abstract class BuildingComp implements Posc, Teamc, Healthc, Buildingc, Timerc,
for(int i = 0; i < power.links.size; i++){ for(int i = 0; i < power.links.size; i++){
Tile link = world.tile(power.links.get(i)); Tile link = world.tile(power.links.get(i));
if(link != null && link.build != null && link.build.power != null) out.add(link.build); if(link != null && link.build != null && link.build.power != null && link.build.team == team) out.add(link.build);
} }
return out; return out;
} }
@@ -911,7 +911,7 @@ abstract class BuildingComp implements Posc, Teamc, Healthc, Buildingc, Timerc,
if(net.client()) return; if(net.client()) return;
if(block.consumesPower || block.outputsPower){ if(block.consumesPower || block.outputsPower){
int range = 10; int range = 12;
tempTiles.clear(); tempTiles.clear();
Geometry.circle(tileX(), tileY(), range, (x, y) -> { Geometry.circle(tileX(), tileY(), range, (x, y) -> {
Building other = world.build(x, y); Building other = world.build(x, y);
@@ -1278,6 +1278,11 @@ abstract class BuildingComp implements Posc, Teamc, Healthc, Buildingc, Timerc,
return tile.build == self() && !dead(); return tile.build == self() && !dead();
} }
@Override
public float hitSize(){
return tile.block().size * tilesize;
}
@Replace @Replace
@Override @Override
public void kill(){ public void kill(){
@@ -1307,6 +1312,7 @@ abstract class BuildingComp implements Posc, Teamc, Healthc, Buildingc, Timerc,
return switch(sensor){ return switch(sensor){
case x -> World.conv(x); case x -> World.conv(x);
case y -> World.conv(y); case y -> World.conv(y);
//case dead -> !isValid(); //TODO 126
case team -> team.id; case team -> team.id;
case health -> health; case health -> health;
case maxHealth -> maxHealth; case maxHealth -> maxHealth;
@@ -1327,7 +1333,7 @@ abstract class BuildingComp implements Posc, Teamc, Healthc, Buildingc, Timerc,
case enabled -> enabled ? 1 : 0; case enabled -> enabled ? 1 : 0;
case controlled -> this instanceof ControlBlock c ? c.isControlled() ? 1 : 0 : 0; case controlled -> this instanceof ControlBlock c ? c.isControlled() ? 1 : 0 : 0;
case payloadCount -> getPayload() != null ? 1 : 0; case payloadCount -> getPayload() != null ? 1 : 0;
default -> 0; default -> Float.NaN; //gets converted to null in logic
}; };
} }
@@ -1340,14 +1346,13 @@ abstract class BuildingComp implements Posc, Teamc, Healthc, Buildingc, Timerc,
case payloadType -> getPayload() instanceof UnitPayload p1 ? p1.unit.type : getPayload() instanceof BuildPayload p2 ? p2.block() : null; case payloadType -> getPayload() instanceof UnitPayload p1 ? p1.unit.type : getPayload() instanceof BuildPayload p2 ? p2.block() : null;
default -> noSensed; default -> noSensed;
}; };
} }
@Override @Override
public double sense(Content content){ public double sense(Content content){
if(content instanceof Item && items != null) return items.get((Item)content); if(content instanceof Item i && items != null) return items.get(i);
if(content instanceof Liquid && liquids != null) return liquids.get((Liquid)content); if(content instanceof Liquid l && liquids != null) return liquids.get(l);
return 0; return Float.NaN; //invalid sense
} }
@Override @Override

View File

@@ -8,7 +8,7 @@ import mindustry.annotations.Annotations.*;
import mindustry.gen.*; import mindustry.gen.*;
@Component @Component
abstract class HitboxComp implements Posc, QuadTreeObject{ abstract class HitboxComp implements Posc, Sized, QuadTreeObject{
@Import float x, y; @Import float x, y;
transient float lastX, lastY, deltaX, deltaY, hitSize; transient float lastX, lastY, deltaX, deltaY, hitSize;
@@ -28,6 +28,11 @@ abstract class HitboxComp implements Posc, QuadTreeObject{
updateLastPosition(); updateLastPosition();
} }
@Override
public float hitSize(){
return hitSize;
}
void getCollisions(Cons<QuadTree> consumer){ void getCollisions(Cons<QuadTree> consumer){
} }

View File

@@ -43,6 +43,8 @@ abstract class PlayerComp implements UnitController, Entityc, Syncc, Timerc, Dra
String name = "noname"; String name = "noname";
Color color = new Color(); Color color = new Color();
//locale should not be synced.
transient String locale = "en";
transient float deathTimer; transient float deathTimer;
transient String lastText = ""; transient String lastText = "";
transient float textFadeTime; transient float textFadeTime;

View File

@@ -0,0 +1,5 @@
package mindustry.entities.comp;
public interface Sized{
float hitSize();
}

View File

@@ -128,6 +128,7 @@ abstract class UnitComp implements Healthc, Physicsc, Hitboxc, Statusc, Teamc, I
case ammoCapacity -> type.ammoCapacity; case ammoCapacity -> type.ammoCapacity;
case x -> World.conv(x); case x -> World.conv(x);
case y -> World.conv(y); case y -> World.conv(y);
//case dead -> dead || !isAdded(); //TODO 126
case team -> team.id; case team -> team.id;
case shooting -> isShooting() ? 1 : 0; case shooting -> isShooting() ? 1 : 0;
case range -> range() / tilesize; case range -> range() / tilesize;
@@ -140,7 +141,7 @@ abstract class UnitComp implements Healthc, Physicsc, Hitboxc, Statusc, Teamc, I
case controlled -> controller instanceof LogicAI || controller instanceof Player ? 1 : 0; case controlled -> controller instanceof LogicAI || controller instanceof Player ? 1 : 0;
case commanded -> controller instanceof FormationAI ? 1 : 0; case commanded -> controller instanceof FormationAI ? 1 : 0;
case payloadCount -> self() instanceof Payloadc pay ? pay.payloads().size : 0; case payloadCount -> self() instanceof Payloadc pay ? pay.payloads().size : 0;
default -> 0; default -> Float.NaN;
}; };
} }
@@ -162,7 +163,7 @@ abstract class UnitComp implements Healthc, Physicsc, Hitboxc, Statusc, Teamc, I
@Override @Override
public double sense(Content content){ public double sense(Content content){
if(content == stack().item) return stack().amount; if(content == stack().item) return stack().amount;
return 0; return Float.NaN;
} }
@Override @Override

View File

@@ -25,8 +25,13 @@ public class MultiEffect extends Effect{
@Override @Override
public void render(EffectContainer e){ public void render(EffectContainer e){
int index = 0;
for(Effect f : effects){ for(Effect f : effects){
e.scaled(f.lifetime, f::render); int i = ++index;
e.scaled(f.lifetime, cont -> {
cont.id = e.id + i;
f.render(cont);
});
clip = Math.max(clip, f.clip); clip = Math.max(clip, f.clip);
} }
} }

View File

@@ -15,7 +15,7 @@ import static mindustry.Vars.*;
public class AIController implements UnitController{ public class AIController implements UnitController{
protected static final Vec2 vec = new Vec2(); protected static final Vec2 vec = new Vec2();
protected static final int timerTarget = 0, timerTarget2 = 1, timerTarget3 = 2; protected static final int timerTarget = 0, timerTarget2 = 1, timerTarget3 = 2, timerTarget4 = 3;
protected Unit unit; protected Unit unit;
protected Interval timer = new Interval(4); protected Interval timer = new Interval(4);
@@ -167,7 +167,7 @@ public class AIController implements UnitController{
} }
protected boolean retarget(){ protected boolean retarget(){
return timer.get(timerTarget, 40); return timer.get(timerTarget, target == null ? 40 : 90);
} }
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){

View File

@@ -44,6 +44,8 @@ public class Rules{
public boolean fire = true; public boolean fire = true;
/** Whether units use and require ammo. */ /** Whether units use and require ammo. */
public boolean unitAmmo = false; public boolean unitAmmo = false;
/** Whether cores add to unit limit */
public boolean unitCapVariable = true;
/** How fast unit pads build units. */ /** How fast unit pads build units. */
public float unitBuildSpeedMultiplier = 1f; public float unitBuildSpeedMultiplier = 1f;
/** How much damage any other units deal. */ /** How much damage any other units deal. */
@@ -63,7 +65,7 @@ public class Rules{
/** 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. */
public float waveSpacing = 60 * 60 * 2; public float waveSpacing = 2 * Time.toMinutes;
/** Wave after which the player 'wins'. Used in sectors. Use a value <= 0 to disable. */ /** Wave after which the player 'wins'. Used in sectors. Use a value <= 0 to disable. */
public int winWave = 0; public int winWave = 0;
/** Base unit cap. Can still be increased by blocks. */ /** Base unit cap. Can still be increased by blocks. */
@@ -137,7 +139,7 @@ public class Rules{
} }
/** A simple map for storing TeamRules in an efficient way without hashing. */ /** A simple map for storing TeamRules in an efficient way without hashing. */
public static class TeamRules implements Serializable{ public static class TeamRules implements JsonSerializable{
final TeamRule[] values = new TeamRule[Team.all.length]; final TeamRule[] values = new TeamRule[Team.all.length];
public TeamRule get(Team team){ public TeamRule get(Team team){

View File

@@ -18,7 +18,7 @@ import static mindustry.Vars.*;
* weapon equipped, ammo used, and status effects. * weapon equipped, ammo used, and status effects.
* Each spawn group can have multiple sub-groups spawned in different areas of the map. * Each spawn group can have multiple sub-groups spawned in different areas of the map.
*/ */
public class SpawnGroup implements Serializable{ public class SpawnGroup implements JsonSerializable{
public static final int never = Integer.MAX_VALUE; public static final int never = Integer.MAX_VALUE;
/** The unit type spawned */ /** The unit type spawned */

View File

@@ -119,6 +119,7 @@ public class FloorRenderer implements Disposable{
return; return;
} }
Draw.flush();
cbatch.setProjection(Core.camera.mat); cbatch.setProjection(Core.camera.mat);
cbatch.beginDraw(); cbatch.beginDraw();

View File

@@ -54,7 +54,7 @@ public class LoadRenderer implements Disposable{
bars = new Bar[]{ bars = new Bar[]{
new Bar("s_proc#", OS.cores / 16f, OS.cores < 4), new Bar("s_proc#", OS.cores / 16f, OS.cores < 4),
new Bar("c_aprog", () -> assets != null, () -> assets.getProgress(), () -> false), new Bar("c_aprog", () -> assets != null, () -> assets.getProgress(), () -> false),
new Bar("g_vtype", graphics.getGLVersion().type == Type.GLES ? 0.5f : 1f, graphics.getGLVersion().type == Type.GLES), new Bar("g_vtype", graphics.getGLVersion().type == GlType.GLES ? 0.5f : 1f, graphics.getGLVersion().type == GlType.GLES),
new Bar("s_mem#", () -> true, () -> Core.app.getJavaHeap() / 1024f / 1024f / 200f, () -> Core.app.getJavaHeap() > 1024 * 1024 * 110), new Bar("s_mem#", () -> true, () -> Core.app.getJavaHeap() / 1024f / 1024f / 200f, () -> Core.app.getJavaHeap() > 1024 * 1024 * 110),
new Bar("v_ver#", () -> Version.build != 0, () -> Version.build == -1 ? 0.3f : (Version.build - 103f) / 10f, () -> !Version.modifier.equals("release")), new Bar("v_ver#", () -> Version.build != 0, () -> Version.build == -1 ? 0.3f : (Version.build - 103f) / 10f, () -> !Version.modifier.equals("release")),
new Bar("s_osv", OS.isWindows ? 0.35f : OS.isLinux ? 0.9f : OS.isMac ? 0.5f : 0.2f, OS.isMac), new Bar("s_osv", OS.isWindows ? 0.35f : OS.isLinux ? 0.9f : OS.isMac ? 0.5f : 0.2f, OS.isMac),

View File

@@ -15,10 +15,10 @@ import mindustry.type.*;
import static mindustry.Vars.*; import static mindustry.Vars.*;
public class Shaders{ public class Shaders{
public static BlockBuild blockbuild; public static BlockBuildShader blockbuild;
public static @Nullable ShieldShader shield; public static @Nullable ShieldShader shield;
public static BuildBeamShader buildBeam; public static BuildBeamShader buildBeam;
public static UnitBuild build; public static UnitBuildShader build;
public static DarknessShader darkness; public static DarknessShader darkness;
public static LightShader light; public static LightShader light;
public static SurfaceShader water, mud, tar, slag, space; public static SurfaceShader water, mud, tar, slag, space;
@@ -31,7 +31,7 @@ public class Shaders{
public static void init(){ public static void init(){
mesh = new MeshShader(); mesh = new MeshShader();
blockbuild = new BlockBuild(); blockbuild = new BlockBuildShader();
try{ try{
shield = new ShieldShader(); shield = new ShieldShader();
}catch(Throwable t){ }catch(Throwable t){
@@ -40,7 +40,7 @@ public class Shaders{
t.printStackTrace(); t.printStackTrace();
} }
buildBeam = new BuildBeamShader(); buildBeam = new BuildBeamShader();
build = new UnitBuild(); build = new UnitBuildShader();
darkness = new DarknessShader(); darkness = new DarknessShader();
light = new LightShader(); light = new LightShader();
water = new SurfaceShader("water"); water = new SurfaceShader("water");
@@ -142,12 +142,16 @@ public class Shaders{
} }
} }
public static class UnitBuild extends LoadShader{ /** @deprecated transition class for mods; use UnitBuildShader instead. */
@Deprecated
public static class UnitBuild extends UnitBuildShader{}
public static class UnitBuildShader extends LoadShader{
public float progress, time; public float progress, time;
public Color color = new Color(); public Color color = new Color();
public TextureRegion region; public TextureRegion region;
public UnitBuild(){ public UnitBuildShader(){
super("unitbuild", "default"); super("unitbuild", "default");
} }
@@ -162,11 +166,11 @@ public class Shaders{
} }
} }
public static class BlockBuild extends LoadShader{ public static class BlockBuildShader extends LoadShader{
public float progress; public float progress;
public TextureRegion region = new TextureRegion(); public TextureRegion region = new TextureRegion();
public BlockBuild(){ public BlockBuildShader(){
super("blockbuild", "default"); super("blockbuild", "default");
} }

View File

@@ -8,7 +8,6 @@ import arc.graphics.g2d.*;
import arc.math.*; import arc.math.*;
import arc.math.geom.*; import arc.math.geom.*;
import arc.scene.*; import arc.scene.*;
import arc.scene.event.*;
import arc.scene.ui.*; import arc.scene.ui.*;
import arc.scene.ui.layout.*; import arc.scene.ui.layout.*;
import arc.util.*; import arc.util.*;
@@ -46,34 +45,36 @@ public class DesktopInput extends InputHandler{
/** Mouse pan speed. */ /** Mouse pan speed. */
public float panScale = 0.005f, panSpeed = 4.5f, panBoostSpeed = 11f; public float panScale = 0.005f, panSpeed = 4.5f, panBoostSpeed = 11f;
boolean showHint(){
return ui.hudfrag.shown && Core.settings.getBool("hints") && selectRequests.isEmpty() &&
(!isBuilding && !Core.settings.getBool("buildautopause") || player.unit().isBuilding() || !player.dead() && !player.unit().spawnedByCore());
}
@Override @Override
public void buildUI(Group group){ public void buildUI(Group group){
//respawn hints //building and respawn hints
group.fill(t -> { group.fill(t -> {
t.visible(() -> Core.settings.getBool("hints") && ui.hudfrag.shown && !player.dead() && !player.unit().spawnedByCore() && !(Core.settings.getBool("hints") && lastSchematic != null && !selectRequests.isEmpty())); t.color.a = 0f;
t.visible(() -> (t.color.a = Mathf.lerpDelta(t.color.a, Mathf.num(showHint()), 0.15f)) > 0.001f);
t.bottom(); t.bottom();
t.table(Styles.black6, b -> { t.table(Styles.black6, b -> {
StringBuilder str = new StringBuilder();
b.defaults().left(); b.defaults().left();
b.label(() -> Core.bundle.format("respawn", Core.keybinds.get(Binding.respawn).key.toString())).style(Styles.outlineLabel); b.label(() -> {
}).margin(6f); if(!showHint()) return str;
}); str.setLength(0);
if(!isBuilding && !Core.settings.getBool("buildautopause") && !player.unit().isBuilding()){
//building hints str.append(Core.bundle.format("enablebuilding", Core.keybinds.get(Binding.pause_building).key.toString()));
group.fill(t -> { }else if(player.unit().isBuilding()){
t.bottom(); str.append(Core.bundle.format(isBuilding ? "pausebuilding" : "resumebuilding", Core.keybinds.get(Binding.pause_building).key.toString()))
t.visible(() -> { .append("\n").append(Core.bundle.format("cancelbuilding", Core.keybinds.get(Binding.clear_building).key.toString()))
t.color.a = Mathf.lerpDelta(t.color.a, player.unit().isBuilding() ? 1f : 0f, 0.15f); .append("\n").append(Core.bundle.format("selectschematic", Core.keybinds.get(Binding.schematic_select).key.toString()));
}
return ui.hudfrag.shown && Core.settings.getBool("hints") && selectRequests.isEmpty() && t.color.a > 0.01f; if(!player.dead() && !player.unit().spawnedByCore()){
}); str.append(str.length() != 0 ? "\n" : "").append(Core.bundle.format("respawn", Core.keybinds.get(Binding.respawn).key.toString()));
t.touchable(() -> t.color.a < 0.1f ? Touchable.disabled : Touchable.childrenOnly); }
t.table(Styles.black6, b -> { return str;
b.defaults().left(); }).style(Styles.outlineLabel);
b.label(() -> Core.bundle.format(!isBuilding ? "resumebuilding" : "pausebuilding", Core.keybinds.get(Binding.pause_building).key.toString())).style(Styles.outlineLabel);
b.row();
b.label(() -> Core.bundle.format("cancelbuilding", Core.keybinds.get(Binding.clear_building).key.toString())).style(Styles.outlineLabel);
b.row();
b.label(() -> Core.bundle.format("selectschematic", Core.keybinds.get(Binding.schematic_select).key.toString())).style(Styles.outlineLabel);
}).margin(10f); }).margin(10f);
}); });

View File

@@ -100,7 +100,7 @@ public class Placement{
i ++; i ++;
} }
if(!addedLast) result.add(base.peek()); if(!addedLast && !base.isEmpty()) result.add(base.peek());
points.clear(); points.clear();
points.addAll(result); points.addAll(result);

View File

@@ -7,6 +7,7 @@ public enum ConditionOp{
lessThanEq("<=", (a, b) -> a <= b), lessThanEq("<=", (a, b) -> a <= b),
greaterThan(">", (a, b) -> a > b), greaterThan(">", (a, b) -> a > b),
greaterThanEq(">=", (a, b) -> a >= b), greaterThanEq(">=", (a, b) -> a >= b),
strictEqual("===", (a, b) -> false),
always("always", (a, b) -> true); always("always", (a, b) -> true);
public static final ConditionOp[] all = values(); public static final ConditionOp[] all = values();

View File

@@ -27,6 +27,7 @@ public enum LAccess{
y, y,
shootX, shootX,
shootY, shootY,
//dead, //TODO 126
range, range,
shooting, shooting,
mineX, mineX,

View File

@@ -13,6 +13,11 @@ public class LAssembler{
public static ObjectMap<String, Func<String[], LStatement>> customParsers = new ObjectMap<>(); public static ObjectMap<String, Func<String[], LStatement>> customParsers = new ObjectMap<>();
public static final int maxTokenLength = 36; public static final int maxTokenLength = 36;
private static final StringMap opNameChanges = StringMap.of(
"atan2", "angle",
"dst", "len"
);
private int lastVar; private int lastVar;
/** Maps names to variable IDs. */ /** Maps names to variable IDs. */
public ObjectMap<String, BVar> vars = new ObjectMap<>(); public ObjectMap<String, BVar> vars = new ObjectMap<>();
@@ -28,6 +33,8 @@ public class LAssembler{
putConst("@unit", null); putConst("@unit", null);
//reference to self //reference to self
putConst("@this", null); putConst("@this", null);
//global tick
putConst("@tick", 0);
} }
public static LAssembler assemble(String data, int maxInstructions){ public static LAssembler assemble(String data, int maxInstructions){
@@ -125,6 +132,11 @@ public class LAssembler{
} }
} }
//fix up changed operaiton names
if(type.equals("op")){
arr[1] = opNameChanges.get(arr[1], arr[1]);
}
LStatement st = LogicIO.read(arr); LStatement st = LogicIO.read(arr);
if(st != null){ if(st != null){

View File

@@ -13,6 +13,7 @@ import arc.scene.ui.*;
import arc.scene.ui.layout.*; import arc.scene.ui.layout.*;
import arc.struct.*; import arc.struct.*;
import arc.util.*; import arc.util.*;
import mindustry.*;
import mindustry.gen.*; import mindustry.gen.*;
import mindustry.graphics.*; import mindustry.graphics.*;
import mindustry.ui.*; import mindustry.ui.*;
@@ -29,10 +30,26 @@ public class LCanvas extends Table{
StatementElem hovered; StatementElem hovered;
float targetWidth; float targetWidth;
int jumpCount = 0; int jumpCount = 0;
Seq<Tooltip> tooltips = new Seq<>();
public LCanvas(){ public LCanvas(){
canvas = this; canvas = this;
Core.scene.addListener(new InputListener(){
@Override
public boolean touchDown(InputEvent event, float x, float y, int pointer, KeyCode button){
//hide tooltips on tap
for(var t : tooltips){
t.container.toFront();
}
Core.app.post(() -> {
tooltips.each(Tooltip::hide);
tooltips.clear();
});
return super.touchDown(event, x, y, pointer, button);
}
});
rebuild(); rebuild();
} }
@@ -41,6 +58,43 @@ public class LCanvas extends Table{
return Core.graphics.getWidth() < Scl.scl(900f) * 1.2f; return Core.graphics.getWidth() < Scl.scl(900f) * 1.2f;
} }
public static void tooltip(Cell<?> cell, String key){
String lkey = key.toLowerCase().replace(" ", "");
if(Core.settings.getBool("logichints", true) && Core.bundle.has(lkey)){
var tip = new Tooltip(t -> t.background(Styles.black8).margin(4f).add("[lightgray]" + Core.bundle.get(lkey)).style(Styles.outlineLabel));
//mobile devices need long-press tooltips
if(Vars.mobile){
cell.get().addListener(new ElementGestureListener(20, 0.4f, 0.43f, 0.15f){
@Override
public boolean longPress(Element element, float x, float y){
tip.show(element, x, y);
canvas.tooltips.add(tip);
//prevent touch down for other listeners
for(var list : cell.get().getListeners()){
if(list instanceof ClickListener cl){
cl.cancel();
}
}
return true;
}
});
}else{
cell.get().addListener(tip);
}
}
}
public static void tooltip(Cell<?> cell, Enum<?> key){
String cl = key.getClass().getSimpleName().toLowerCase() + "." + key.name().toLowerCase();
if(Core.bundle.has(cl)){
tooltip(cell, cl);
}else{
tooltip(cell, "lenum." + key.name());
}
}
public void rebuild(){ public void rebuild(){
targetWidth = useRows() ? 400f : 900f; targetWidth = useRows() ? 400f : 900f;
float s = pane != null ? pane.getScrollPercentY() : 0f; float s = pane != null ? pane.getScrollPercentY() : 0f;

View File

@@ -1,5 +1,6 @@
package mindustry.logic; package mindustry.logic;
import arc.*;
import arc.math.geom.*; import arc.math.geom.*;
import arc.struct.*; import arc.struct.*;
import arc.util.*; import arc.util.*;
@@ -35,7 +36,8 @@ public class LExecutor{
varCounter = 0, varCounter = 0,
varTime = 1, varTime = 1,
varUnit = 2, varUnit = 2,
varThis = 3; varThis = 3,
varTick = 4;
public static final int public static final int
maxGraphicsBuffer = 256, maxGraphicsBuffer = 256,
@@ -60,6 +62,7 @@ public class LExecutor{
public void runOnce(){ public void runOnce(){
//set time //set time
vars[varTime].numval = Time.millis(); vars[varTime].numval = Time.millis();
vars[varTick].numval = Time.time;
//reset to start //reset to start
if(vars[varCounter].numval >= instructions.length || vars[varCounter].numval < 0){ if(vars[varCounter].numval >= instructions.length || vars[varCounter].numval < 0){
@@ -98,6 +101,10 @@ public class LExecutor{
//region utility //region utility
private static boolean invalid(double d){
return Double.isNaN(d) || Double.isInfinite(d);
}
public Var var(int index){ public Var var(int index){
//global constants have variable IDs < 0, and they are fetched from the global constants object after being negated //global constants have variable IDs < 0, and they are fetched from the global constants object after being negated
return index < 0 ? constants.get(-index) : vars[index]; return index < 0 ? constants.get(-index) : vars[index];
@@ -120,12 +127,12 @@ public class LExecutor{
public double num(int index){ public double num(int index){
Var v = var(index); Var v = var(index);
return v.isobj ? v.objval != null ? 1 : 0 : Double.isNaN(v.numval) || Double.isInfinite(v.numval) ? 0 : v.numval; return v.isobj ? v.objval != null ? 1 : 0 : invalid(v.numval) ? 0 : v.numval;
} }
public float numf(int index){ public float numf(int index){
Var v = var(index); Var v = var(index);
return v.isobj ? v.objval != null ? 1 : 0 : Double.isNaN(v.numval) || Double.isInfinite(v.numval) ? 0 : (float)v.numval; return v.isobj ? v.objval != null ? 1 : 0 : invalid(v.numval) ? 0 : (float)v.numval;
} }
public int numi(int index){ public int numi(int index){
@@ -139,10 +146,15 @@ public class LExecutor{
public void setnum(int index, double value){ public void setnum(int index, double value){
Var v = var(index); Var v = var(index);
if(v.constant) return; if(v.constant) return;
v.numval = Double.isNaN(value) || Double.isInfinite(value) ? 0 : value; if(invalid(value)){
v.objval = null;
v.isobj = true;
}else{
v.numval = value;
v.objval = null; v.objval = null;
v.isobj = false; v.isobj = false;
} }
}
public void setobj(int index, Object value){ public void setobj(int index, Object value){
Var v = var(index); Var v = var(index);
@@ -326,17 +338,19 @@ public class LExecutor{
@Nullable @Nullable
public static LogicAI checkLogicAI(LExecutor exec, Object unitObj){ public static LogicAI checkLogicAI(LExecutor exec, Object unitObj){
if(unitObj instanceof Unit unit && exec.obj(varUnit) == unit && unit.team == exec.team && !unit.isPlayer() && !(unit.controller() instanceof FormationAI)){ if(unitObj instanceof Unit unit && exec.obj(varUnit) == unit && unit.team == exec.team && !unit.isPlayer() && !(unit.controller() instanceof FormationAI)){
if(!(unit.controller() instanceof LogicAI)){ if(unit.controller() instanceof LogicAI la){
unit.controller(new LogicAI()); return la;
((LogicAI)unit.controller()).controller = exec.building(varThis); }else{
var la = new LogicAI();
la.controller = exec.building(varThis);
unit.controller(la);
//clear old state //clear old state
unit.mineTile = null; unit.mineTile = null;
unit.clearBuilding(); unit.clearBuilding();
return (LogicAI)unit.controller(); return la;
} }
return (LogicAI)unit.controller();
} }
return null; return null;
} }
@@ -622,21 +636,21 @@ public class LExecutor{
//note that remote units/buildings can be sensed as well //note that remote units/buildings can be sensed as well
if(target instanceof Senseable se){ if(target instanceof Senseable se){
if(sense instanceof Content){ if(sense instanceof Content co){
exec.setnum(to, se.sense(((Content)sense))); exec.setnum(to, se.sense(co));
}else if(sense instanceof LAccess){ }else if(sense instanceof LAccess la){
Object objOut = se.senseObject((LAccess)sense); Object objOut = se.senseObject(la);
if(objOut == Senseable.noSensed){ if(objOut == Senseable.noSensed){
//numeric output //numeric output
exec.setnum(to, se.sense((LAccess)sense)); exec.setnum(to, se.sense(la));
}else{ }else{
//object output //object output
exec.setobj(to, objOut); exec.setobj(to, objOut);
} }
} }
}else{ }else{
exec.setnum(to, 0); exec.setobj(to, null);
} }
} }
} }
@@ -752,7 +766,7 @@ public class LExecutor{
v.objval = f.objval; v.objval = f.objval;
v.isobj = true; v.isobj = true;
}else{ }else{
v.numval = Double.isNaN(f.numval) || Double.isInfinite(f.numval) ? 0 : f.numval; v.numval = invalid(f.numval) ? 0 : f.numval;
v.isobj = false; v.isobj = false;
} }
} }
@@ -774,14 +788,17 @@ public class LExecutor{
@Override @Override
public void run(LExecutor exec){ public void run(LExecutor exec){
if(op.unary){ if(op == LogicOp.strictEqual){
Var v = exec.var(a), v2 = exec.var(b);
exec.setnum(dest, v.isobj == v2.isobj && ((v.isobj && v.objval == v2.objval) || (!v.isobj && v.numval == v2.numval)) ? 1 : 0);
}else if(op.unary){
exec.setnum(dest, op.function1.get(exec.num(a))); exec.setnum(dest, op.function1.get(exec.num(a)));
}else{ }else{
Var va = exec.var(a); Var va = exec.var(a);
Var vb = exec.var(b); Var vb = exec.var(b);
if(op.objFunction2 != null && va.isobj && vb.isobj){ if(op.objFunction2 != null && va.isobj && vb.isobj){
//use object function if provided, and one of the variables is an object //use object function if both are objects
exec.setnum(dest, op.objFunction2.get(exec.obj(a), exec.obj(b))); exec.setnum(dest, op.objFunction2.get(exec.obj(a), exec.obj(b)));
}else{ }else{
//otherwise use the numeric function //otherwise use the numeric function
@@ -951,8 +968,10 @@ public class LExecutor{
Var vb = exec.var(compare); Var vb = exec.var(compare);
boolean cmp; boolean cmp;
if(op.objFunction != null && va.isobj && vb.isobj){ if(op == ConditionOp.strictEqual){
//use object function if provided, and one of the variables is an object cmp = va.isobj == vb.isobj && ((va.isobj && va.objval == vb.objval) || (!va.isobj && va.numval == vb.numval));
}else if(op.objFunction != null && va.isobj && vb.isobj){
//use object function if both are objects
cmp = op.objFunction.get(exec.obj(value), exec.obj(compare)); cmp = op.objFunction.get(exec.obj(value), exec.obj(compare));
}else{ }else{
cmp = op.function.get(exec.num(value), exec.num(compare)); cmp = op.function.get(exec.num(value), exec.num(compare));
@@ -965,5 +984,37 @@ public class LExecutor{
} }
} }
public static class WaitI implements LInstruction{
public int value;
public float curTime;
public double wait;
public long frameId;
public WaitI(int value){
this.value = value;
}
public WaitI(){
}
@Override
public void run(LExecutor exec){
if(curTime >= exec.num(value)){
curTime = 0f;
}else{
//skip back to self.
exec.var(varCounter).numval --;
}
if(Core.graphics.getFrameId() != frameId){
curTime += Time.delta / 60f;
frameId = Core.graphics.getFrameId();
}
}
}
//endregion //endregion
} }

View File

@@ -15,6 +15,8 @@ import mindustry.logic.LCanvas.*;
import mindustry.logic.LExecutor.*; import mindustry.logic.LExecutor.*;
import mindustry.ui.*; import mindustry.ui.*;
import static mindustry.logic.LCanvas.*;
/** /**
* A statement is an intermediate representation of an instruction, to be used mostly in UI. * A statement is an intermediate representation of an instruction, to be used mostly in UI.
* Contains all relevant variable information. */ * Contains all relevant variable information. */
@@ -38,13 +40,18 @@ public abstract class LStatement{
//protected methods are only for internal UI layout utilities //protected methods are only for internal UI layout utilities
protected void param(Cell<Label> label){
String text = name() + "." + label.get().getText().toString().trim();
tooltip(label, text);
}
protected Cell<TextField> field(Table table, String value, Cons<String> setter){ protected Cell<TextField> field(Table table, String value, Cons<String> setter){
return table.field(value, Styles.nodeField, setter) return table.field(value, Styles.nodeField, setter)
.size(144f, 40f).pad(2f).color(table.color).maxTextLength(LAssembler.maxTokenLength).addInputDialog(); .size(144f, 40f).pad(2f).color(table.color).maxTextLength(LAssembler.maxTokenLength).addInputDialog();
} }
protected Cell<TextField> fields(Table table, String desc, String value, Cons<String> setter){ protected Cell<TextField> fields(Table table, String desc, String value, Cons<String> setter){
table.add(desc).padLeft(10).left(); table.add(desc).padLeft(10).left().self(this::param);;
return field(table, value, setter).width(85f).padRight(10).left(); return field(table, value, setter).width(85f).padRight(10).left();
} }
@@ -58,29 +65,40 @@ public abstract class LStatement{
} }
} }
protected <T> void showSelect(Button b, T[] values, T current, Cons<T> getter, int cols, Cons<Cell> sizer){ protected <T extends Enum<T>> void showSelect(Button b, T[] values, T current, Cons<T> getter, int cols, Cons<Cell> sizer){
showSelectTable(b, (t, hide) -> { showSelectTable(b, (t, hide) -> {
ButtonGroup<Button> group = new ButtonGroup<>(); ButtonGroup<Button> group = new ButtonGroup<>();
int i = 0; int i = 0;
t.defaults().size(56f, 40f); t.defaults().size(60f, 38f);
for(T p : values){ for(T p : values){
sizer.get(t.button(p.toString(), Styles.clearTogglet, () -> { sizer.get(t.button(p.toString(), Styles.logicTogglet, () -> {
getter.get(p); getter.get(p);
hide.run(); hide.run();
}).checked(current == p).group(group)); }).self(c -> tooltip(c, p)).checked(current == p).group(group));
if(++i % cols == 0) t.row(); if(++i % cols == 0) t.row();
} }
}); });
} }
protected <T> void showSelect(Button b, T[] values, T current, Cons<T> getter){ protected <T extends Enum<T>> void showSelect(Button b, T[] values, T current, Cons<T> getter){
showSelect(b, values, current, getter, 4, c -> {}); showSelect(b, values, current, getter, 4, c -> {});
} }
protected void showSelectTable(Button b, Cons2<Table, Runnable> hideCons){ protected void showSelectTable(Button b, Cons2<Table, Runnable> hideCons){
Table t = new Table(Tex.button); Table t = new Table(Tex.paneSolid){
@Override
public float getPrefHeight(){
return Math.min(super.getPrefHeight(), Core.graphics.getHeight());
}
@Override
public float getPrefWidth(){
return Math.min(super.getPrefWidth(), Core.graphics.getWidth());
}
};
t.margin(4);
//triggers events behind the element to simulate deselection //triggers events behind the element to simulate deselection
Element hitter = new Element(); Element hitter = new Element();
@@ -110,14 +128,15 @@ public abstract class LStatement{
if(t.getWidth() > Core.scene.getWidth()) t.setWidth(Core.graphics.getWidth()); if(t.getWidth() > Core.scene.getWidth()) t.setWidth(Core.graphics.getWidth());
if(t.getHeight() > Core.scene.getHeight()) t.setHeight(Core.graphics.getHeight()); if(t.getHeight() > Core.scene.getHeight()) t.setHeight(Core.graphics.getHeight());
t.keepInStage(); t.keepInStage();
t.invalidateHierarchy();
t.pack();
}); });
t.actions(Actions.alpha(0), Actions.fadeIn(0.3f, Interp.fade)); t.actions(Actions.alpha(0), Actions.fadeIn(0.3f, Interp.fade));
t.top().pane(inner -> { t.top().pane(inner -> {
inner.marginRight(24f);
inner.top(); inner.top();
hideCons.get(inner, hide); hideCons.get(inner, hide);
}).top(); }).pad(0f).top().get().setScrollingDisabled(true, false);
t.pack(); t.pack();
} }
@@ -139,4 +158,5 @@ public abstract class LStatement{
public String name(){ public String name(){
return Strings.insertSpaces(getClass().getSimpleName().replace("Statement", "")); return Strings.insertSpaces(getClass().getSimpleName().replace("Statement", ""));
} }
} }

View File

@@ -15,6 +15,7 @@ import mindustry.type.*;
import mindustry.ui.*; import mindustry.ui.*;
import mindustry.world.meta.*; import mindustry.world.meta.*;
import static mindustry.logic.LCanvas.*;
import static mindustry.world.blocks.logic.LogicDisplay.*; import static mindustry.world.blocks.logic.LogicDisplay.*;
public class LStatements{ public class LStatements{
@@ -355,7 +356,7 @@ public class LStatements{
}, 2, cell -> cell.size(100, 50))); }, 2, cell -> cell.size(100, 50)));
}, Styles.logict, () -> {}).size(90, 40).color(table.color).left().padLeft(2); }, Styles.logict, () -> {}).size(90, 40).color(table.color).left().padLeft(2);
table.add(" of "); table.add(" of ").self(this::param);
field(table, target, v -> target = v); field(table, target, v -> target = v);
@@ -394,7 +395,7 @@ public class LStatements{
table.defaults().left(); table.defaults().left();
if(buildFrom()){ if(buildFrom()){
table.add(" from "); table.add(" from ").self(this::param);
fields(table, radar, v -> radar = v); fields(table, radar, v -> radar = v);
@@ -405,7 +406,7 @@ public class LStatements{
int fi = i; int fi = i;
Prov<RadarTarget> get = () -> (fi == 0 ? target1 : fi == 1 ? target2 : target3); Prov<RadarTarget> get = () -> (fi == 0 ? target1 : fi == 1 ? target2 : target3);
table.add(i == 0 ? " target " : " and "); table.add(i == 0 ? " target " : " and ").self(this::param);
table.button(b -> { table.button(b -> {
b.label(() -> get.get().name()); b.label(() -> get.get().name());
@@ -419,13 +420,13 @@ public class LStatements{
} }
} }
table.add(" order "); table.add(" order ").self(this::param);
fields(table, sortOrder, v -> sortOrder = v); fields(table, sortOrder, v -> sortOrder = v);
table.row(); table.row();
table.add(" sort "); table.add(" sort ").self(this::param);
table.button(b -> { table.button(b -> {
b.label(() -> sort.name()); b.label(() -> sort.name());
@@ -434,7 +435,7 @@ public class LStatements{
}, 2, cell -> cell.size(100, 50))); }, 2, cell -> cell.size(100, 50)));
}, Styles.logict, () -> {}).size(90, 40).color(table.color).left().padLeft(2); }, Styles.logict, () -> {}).size(90, 40).color(table.color).left().padLeft(2);
table.add(" output "); table.add(" output ").self(this::param);
fields(table, output, v -> output = v); fields(table, output, v -> output = v);
} }
@@ -511,7 +512,7 @@ public class LStatements{
i.button(sensor.name(), Styles.cleart, () -> { i.button(sensor.name(), Styles.cleart, () -> {
stype("@" + sensor.name()); stype("@" + sensor.name());
hide.run(); hide.run();
}).size(240f, 40f).row(); }).size(240f, 40f).self(c -> tooltip(c, sensor)).row();
} }
}) })
}; };
@@ -531,14 +532,14 @@ public class LStatements{
t.parent.parent.pack(); t.parent.parent.pack();
t.parent.parent.invalidateHierarchy(); t.parent.parent.invalidateHierarchy();
}).size(80f, 50f).growX().checked(selected == fi).group(group); }).height(50f).growX().checked(selected == fi).group(group);
} }
t.row(); t.row();
t.add(stack).colspan(3).width(240f).left(); t.add(stack).colspan(3).width(240f).left();
})); }));
}, Styles.logict, () -> {}).size(40f).padLeft(-1).color(table.color); }, Styles.logict, () -> {}).size(40f).padLeft(-1).color(table.color);
table.add(" in "); table.add(" in ").self(this::param);
field(table, from, str -> from = str); field(table, from, str -> from = str);
} }
@@ -608,6 +609,20 @@ public class LStatements{
}else{ }else{
row(table); row(table);
//"function"-type operations have the name at the left and arguments on the right
if(op.func){
if(LCanvas.useRows()){
table.left();
table.row();
table.table(c -> {
c.color.set(color());
c.left();
funcs(c);
}).colspan(2).left();
}else{
funcs(table);
}
}else{
field(table, a, str -> a = str); field(table, a, str -> a = str);
opButton(table); opButton(table);
@@ -615,6 +630,15 @@ public class LStatements{
field(table, b, str -> b = str); field(table, b, str -> b = str);
} }
} }
}
void funcs(Table table){
opButton(table);
field(table, a, str -> a = str);
field(table, b, str -> b = str);
}
void opButton(Table table){ void opButton(Table table){
table.button(b -> { table.button(b -> {
@@ -623,7 +647,7 @@ public class LStatements{
op = o; op = o;
rebuild(table); rebuild(table);
})); }));
}, Styles.logict, () -> {}).size(60f, 40f).pad(4f).color(table.color); }, Styles.logict, () -> {}).size(64f, 40f).pad(4f).color(table.color);
} }
@Override @Override
@@ -637,6 +661,28 @@ public class LStatements{
} }
} }
//TODO untested
//@RegisterStatement("wait")
public static class WaitStatement extends LStatement{
public String value = "0.5";
@Override
public void build(Table table){
field(table, value, str -> value = str);
table.add(" sec");
}
@Override
public Color color(){
return Pal.logicOperations;
}
@Override
public LInstruction build(LAssembler builder){
return new WaitI(builder.var(value));
}
}
@RegisterStatement("end") @RegisterStatement("end")
public static class EndStatement extends LStatement{ public static class EndStatement extends LStatement{
@Override @Override
@@ -855,7 +901,7 @@ public class LStatements{
void rebuild(Table table){ void rebuild(Table table){
table.clearChildren(); table.clearChildren();
table.add(" find ").left(); table.add(" find ").left().self(this::param);;
table.button(b -> { table.button(b -> {
b.label(() -> locate.name()); b.label(() -> locate.name());
@@ -868,14 +914,14 @@ public class LStatements{
switch(locate){ switch(locate){
case building -> { case building -> {
row(table); row(table);
table.add(" type ").left(); table.add(" group ").left().self(this::param);;
table.button(b -> { table.button(b -> {
b.label(() -> flag.name()); b.label(() -> flag.name());
b.clicked(() -> showSelect(b, BlockFlag.all, flag, t -> flag = t, 2, cell -> cell.size(110, 50))); b.clicked(() -> showSelect(b, BlockFlag.allLogic, flag, t -> flag = t, 2, cell -> cell.size(110, 50)));
}, Styles.logict, () -> {}).size(110, 40).color(table.color).left().padLeft(2); }, Styles.logict, () -> {}).size(110, 40).color(table.color).left().padLeft(2);
row(table); row(table);
table.add(" enemy ").left(); table.add(" enemy ").left().self(this::param);;
fields(table, enemy, str -> enemy = str); fields(table, enemy, str -> enemy = str);
@@ -883,7 +929,7 @@ public class LStatements{
} }
case ore -> { case ore -> {
table.add(" ore ").left(); table.add(" ore ").left().self(this::param);
table.table(ts -> { table.table(ts -> {
ts.color.set(table.color); ts.color.set(table.color);
@@ -920,19 +966,19 @@ public class LStatements{
} }
} }
table.add(" outX ").left(); table.add(" outX ").left().self(this::param);
fields(table, outX, str -> outX = str); fields(table, outX, str -> outX = str);
table.add(" outY ").left(); table.add(" outY ").left().self(this::param);
fields(table, outY, str -> outY = str); fields(table, outY, str -> outY = str);
row(table); row(table);
table.add(" found ").left(); table.add(" found ").left().self(this::param);
fields(table, outFound, str -> outFound = str); fields(table, outFound, str -> outFound = str);
if(locate != LLocate.ore){ if(locate != LLocate.ore){
table.add(" building ").left(); table.add(" building ").left().self(this::param);
fields(table, outBuild, str -> outBuild = str); fields(table, outBuild, str -> outBuild = str);
} }

View File

@@ -10,6 +10,7 @@ import mindustry.ui.*;
import mindustry.ui.dialogs.*; import mindustry.ui.dialogs.*;
import static mindustry.Vars.*; import static mindustry.Vars.*;
import static mindustry.logic.LCanvas.*;
public class LogicDialog extends BaseDialog{ public class LogicDialog extends BaseDialog{
public LCanvas canvas; public LCanvas canvas;
@@ -72,7 +73,7 @@ public class LogicDialog extends BaseDialog{
t.button(example.name(), style, () -> { t.button(example.name(), style, () -> {
canvas.add(prov.get()); canvas.add(prov.get());
dialog.hide(); dialog.hide();
}).size(140f, 50f); }).size(140f, 50f).self(c -> tooltip(c, "lst." + example.name()));
if(++i % 2 == 0) t.row(); if(++i % 2 == 0) t.row();
} }
}); });

View File

@@ -19,6 +19,7 @@ public enum LogicOp{
lessThanEq("<=", (a, b) -> a <= b ? 1 : 0), lessThanEq("<=", (a, b) -> a <= b ? 1 : 0),
greaterThan(">", (a, b) -> a > b ? 1 : 0), greaterThan(">", (a, b) -> a > b ? 1 : 0),
greaterThanEq(">=", (a, b) -> a >= b ? 1 : 0), greaterThanEq(">=", (a, b) -> a >= b ? 1 : 0),
strictEqual("===", (a, b) -> 0), //this lambda is not actually used
shl("<<", (a, b) -> (long)a << (long)b), shl("<<", (a, b) -> (long)a << (long)b),
shr(">>", (a, b) -> (long)a >> (long)b), shr(">>", (a, b) -> (long)a >> (long)b),
@@ -27,11 +28,11 @@ public enum LogicOp{
xor("xor", (a, b) -> (long)a ^ (long)b), xor("xor", (a, b) -> (long)a ^ (long)b),
not("flip", a -> ~(long)(a)), not("flip", a -> ~(long)(a)),
max("max", Math::max), max("max", true, Math::max),
min("min", Math::min), min("min", true, Math::min),
atan2("atan2", (x, y) -> Mathf.atan2((float)x, (float)y) * Mathf.radDeg), angle("angle", true, (x, y) -> Angles.angle((float)x, (float)y)),
dst("dst", (x, y) -> Mathf.dst((float)x, (float)y)), len("len", true, (x, y) -> Mathf.dst((float)x, (float)y)),
noise("noise", LExecutor.noise::rawNoise2D), noise("noise", true, LExecutor.noise::rawNoise2D),
abs("abs", a -> Math.abs(a)), abs("abs", a -> Math.abs(a)),
log("log", Math::log), log("log", Math::log),
log10("log10", Math::log10), log10("log10", Math::log10),
@@ -48,19 +49,29 @@ public enum LogicOp{
public final OpObjLambda2 objFunction2; public final OpObjLambda2 objFunction2;
public final OpLambda2 function2; public final OpLambda2 function2;
public final OpLambda1 function1; public final OpLambda1 function1;
public final boolean unary; public final boolean unary, func;
public final String symbol; public final String symbol;
LogicOp(String symbol, OpLambda2 function){ LogicOp(String symbol, OpLambda2 function){
this(symbol, function, null); this(symbol, function, null);
} }
LogicOp(String symbol, boolean func, OpLambda2 function){
this.symbol = symbol;
this.function2 = function;
this.function1 = null;
this.unary = false;
this.objFunction2 = null;
this.func = func;
}
LogicOp(String symbol, OpLambda2 function, OpObjLambda2 objFunction){ LogicOp(String symbol, OpLambda2 function, OpObjLambda2 objFunction){
this.symbol = symbol; this.symbol = symbol;
this.function2 = function; this.function2 = function;
this.function1 = null; this.function1 = null;
this.unary = false; this.unary = false;
this.objFunction2 = objFunction; this.objFunction2 = objFunction;
this.func = false;
} }
LogicOp(String symbol, OpLambda1 function){ LogicOp(String symbol, OpLambda1 function){
@@ -69,6 +80,7 @@ public enum LogicOp{
this.function2 = null; this.function2 = null;
this.unary = true; this.unary = true;
this.objFunction2 = null; this.objFunction2 = null;
this.func = false;
} }
@Override @Override

View File

@@ -0,0 +1,259 @@
package mindustry.mod;
import arc.struct.*;
/** Generated class. Maps simple class names to concrete classes. For use in JSON mods. */
public class ClassMap{
public static final ObjectMap<String, Class<?>> classes = new ObjectMap<>();
static{
classes.put("BuilderAI", mindustry.ai.types.BuilderAI.class);
classes.put("FlyingAI", mindustry.ai.types.FlyingAI.class);
classes.put("FormationAI", mindustry.ai.types.FormationAI.class);
classes.put("GroundAI", mindustry.ai.types.GroundAI.class);
classes.put("LogicAI", mindustry.ai.types.LogicAI.class);
classes.put("MinerAI", mindustry.ai.types.MinerAI.class);
classes.put("RepairAI", mindustry.ai.types.RepairAI.class);
classes.put("SuicideAI", mindustry.ai.types.SuicideAI.class);
classes.put("ArtilleryBulletType", mindustry.entities.bullet.ArtilleryBulletType.class);
classes.put("BasicBulletType", mindustry.entities.bullet.BasicBulletType.class);
classes.put("BombBulletType", mindustry.entities.bullet.BombBulletType.class);
classes.put("BulletType", mindustry.entities.bullet.BulletType.class);
classes.put("ContinuousLaserBulletType", mindustry.entities.bullet.ContinuousLaserBulletType.class);
classes.put("FlakBulletType", mindustry.entities.bullet.FlakBulletType.class);
classes.put("LaserBoltBulletType", mindustry.entities.bullet.LaserBoltBulletType.class);
classes.put("LaserBulletType", mindustry.entities.bullet.LaserBulletType.class);
classes.put("LightningBulletType", mindustry.entities.bullet.LightningBulletType.class);
classes.put("LiquidBulletType", mindustry.entities.bullet.LiquidBulletType.class);
classes.put("MassDriverBolt", mindustry.entities.bullet.MassDriverBolt.class);
classes.put("MissileBulletType", mindustry.entities.bullet.MissileBulletType.class);
classes.put("PointBulletType", mindustry.entities.bullet.PointBulletType.class);
classes.put("RailBulletType", mindustry.entities.bullet.RailBulletType.class);
classes.put("SapBulletType", mindustry.entities.bullet.SapBulletType.class);
classes.put("ShrapnelBulletType", mindustry.entities.bullet.ShrapnelBulletType.class);
classes.put("MultiEffect", mindustry.entities.effect.MultiEffect.class);
classes.put("ParticleEffect", mindustry.entities.effect.ParticleEffect.class);
classes.put("WaveEffect", mindustry.entities.effect.WaveEffect.class);
classes.put("Objectives", mindustry.game.Objectives.class);
classes.put("Objective", mindustry.game.Objectives.Objective.class);
classes.put("Produce", mindustry.game.Objectives.Produce.class);
classes.put("Research", mindustry.game.Objectives.Research.class);
classes.put("SectorComplete", mindustry.game.Objectives.SectorComplete.class);
classes.put("ParticleWeather", mindustry.type.weather.ParticleWeather.class);
classes.put("RainWeather", mindustry.type.weather.RainWeather.class);
classes.put("Attributes", mindustry.world.blocks.Attributes.class);
classes.put("Autotiler", mindustry.world.blocks.Autotiler.class);
classes.put("AutotilerHolder", mindustry.world.blocks.Autotiler.AutotilerHolder.class);
classes.put("SliceMode", mindustry.world.blocks.Autotiler.SliceMode.class);
classes.put("ConstructBlock", mindustry.world.blocks.ConstructBlock.class);
classes.put("ConstructBuild", mindustry.world.blocks.ConstructBlock.ConstructBuild.class);
classes.put("ControlBlock", mindustry.world.blocks.ControlBlock.class);
classes.put("ItemSelection", mindustry.world.blocks.ItemSelection.class);
classes.put("Accelerator", mindustry.world.blocks.campaign.Accelerator.class);
classes.put("AcceleratorBuild", mindustry.world.blocks.campaign.Accelerator.AcceleratorBuild.class);
classes.put("LaunchPad", mindustry.world.blocks.campaign.LaunchPad.class);
classes.put("LaunchPadBuild", mindustry.world.blocks.campaign.LaunchPad.LaunchPadBuild.class);
classes.put("Door", mindustry.world.blocks.defense.Door.class);
classes.put("DoorBuild", mindustry.world.blocks.defense.Door.DoorBuild.class);
classes.put("ForceProjector", mindustry.world.blocks.defense.ForceProjector.class);
classes.put("ForceBuild", mindustry.world.blocks.defense.ForceProjector.ForceBuild.class);
classes.put("MendProjector", mindustry.world.blocks.defense.MendProjector.class);
classes.put("MendBuild", mindustry.world.blocks.defense.MendProjector.MendBuild.class);
classes.put("OverdriveProjector", mindustry.world.blocks.defense.OverdriveProjector.class);
classes.put("OverdriveBuild", mindustry.world.blocks.defense.OverdriveProjector.OverdriveBuild.class);
classes.put("ShockMine", mindustry.world.blocks.defense.ShockMine.class);
classes.put("ShockMineBuild", mindustry.world.blocks.defense.ShockMine.ShockMineBuild.class);
classes.put("Thruster", mindustry.world.blocks.defense.Thruster.class);
classes.put("ThrusterBuild", mindustry.world.blocks.defense.Thruster.ThrusterBuild.class);
classes.put("Wall", mindustry.world.blocks.defense.Wall.class);
classes.put("WallBuild", mindustry.world.blocks.defense.Wall.WallBuild.class);
classes.put("BaseTurret", mindustry.world.blocks.defense.turrets.BaseTurret.class);
classes.put("BaseTurretBuild", mindustry.world.blocks.defense.turrets.BaseTurret.BaseTurretBuild.class);
classes.put("ItemTurret", mindustry.world.blocks.defense.turrets.ItemTurret.class);
classes.put("ItemTurretBuild", mindustry.world.blocks.defense.turrets.ItemTurret.ItemTurretBuild.class);
classes.put("LaserTurret", mindustry.world.blocks.defense.turrets.LaserTurret.class);
classes.put("LaserTurretBuild", mindustry.world.blocks.defense.turrets.LaserTurret.LaserTurretBuild.class);
classes.put("LiquidTurret", mindustry.world.blocks.defense.turrets.LiquidTurret.class);
classes.put("LiquidTurretBuild", mindustry.world.blocks.defense.turrets.LiquidTurret.LiquidTurretBuild.class);
classes.put("PointDefenseTurret", mindustry.world.blocks.defense.turrets.PointDefenseTurret.class);
classes.put("PointDefenseBuild", mindustry.world.blocks.defense.turrets.PointDefenseTurret.PointDefenseBuild.class);
classes.put("PowerTurret", mindustry.world.blocks.defense.turrets.PowerTurret.class);
classes.put("PowerTurretBuild", mindustry.world.blocks.defense.turrets.PowerTurret.PowerTurretBuild.class);
classes.put("ReloadTurret", mindustry.world.blocks.defense.turrets.ReloadTurret.class);
classes.put("ReloadTurretBuild", mindustry.world.blocks.defense.turrets.ReloadTurret.ReloadTurretBuild.class);
classes.put("TractorBeamTurret", mindustry.world.blocks.defense.turrets.TractorBeamTurret.class);
classes.put("TractorBeamBuild", mindustry.world.blocks.defense.turrets.TractorBeamTurret.TractorBeamBuild.class);
classes.put("Turret", mindustry.world.blocks.defense.turrets.Turret.class);
classes.put("AmmoEntry", mindustry.world.blocks.defense.turrets.Turret.AmmoEntry.class);
classes.put("TurretBuild", mindustry.world.blocks.defense.turrets.Turret.TurretBuild.class);
classes.put("ArmoredConveyor", mindustry.world.blocks.distribution.ArmoredConveyor.class);
classes.put("ArmoredConveyorBuild", mindustry.world.blocks.distribution.ArmoredConveyor.ArmoredConveyorBuild.class);
classes.put("BufferedItemBridge", mindustry.world.blocks.distribution.BufferedItemBridge.class);
classes.put("BufferedItemBridgeBuild", mindustry.world.blocks.distribution.BufferedItemBridge.BufferedItemBridgeBuild.class);
classes.put("ChainedBuilding", mindustry.world.blocks.distribution.ChainedBuilding.class);
classes.put("Conveyor", mindustry.world.blocks.distribution.Conveyor.class);
classes.put("ConveyorBuild", mindustry.world.blocks.distribution.Conveyor.ConveyorBuild.class);
classes.put("ExtendingItemBridge", mindustry.world.blocks.distribution.ExtendingItemBridge.class);
classes.put("ExtendingItemBridgeBuild", mindustry.world.blocks.distribution.ExtendingItemBridge.ExtendingItemBridgeBuild.class);
classes.put("ItemBridge", mindustry.world.blocks.distribution.ItemBridge.class);
classes.put("ItemBridgeBuild", mindustry.world.blocks.distribution.ItemBridge.ItemBridgeBuild.class);
classes.put("Junction", mindustry.world.blocks.distribution.Junction.class);
classes.put("JunctionBuild", mindustry.world.blocks.distribution.Junction.JunctionBuild.class);
classes.put("MassDriver", mindustry.world.blocks.distribution.MassDriver.class);
classes.put("DriverBulletData", mindustry.world.blocks.distribution.MassDriver.DriverBulletData.class);
classes.put("DriverState", mindustry.world.blocks.distribution.MassDriver.DriverState.class);
classes.put("MassDriverBuild", mindustry.world.blocks.distribution.MassDriver.MassDriverBuild.class);
classes.put("OverflowGate", mindustry.world.blocks.distribution.OverflowGate.class);
classes.put("OverflowGateBuild", mindustry.world.blocks.distribution.OverflowGate.OverflowGateBuild.class);
classes.put("PayloadConveyor", mindustry.world.blocks.distribution.PayloadConveyor.class);
classes.put("PayloadConveyorBuild", mindustry.world.blocks.distribution.PayloadConveyor.PayloadConveyorBuild.class);
classes.put("PayloadRouter", mindustry.world.blocks.distribution.PayloadRouter.class);
classes.put("PayloadRouterBuild", mindustry.world.blocks.distribution.PayloadRouter.PayloadRouterBuild.class);
classes.put("Router", mindustry.world.blocks.distribution.Router.class);
classes.put("RouterBuild", mindustry.world.blocks.distribution.Router.RouterBuild.class);
classes.put("Sorter", mindustry.world.blocks.distribution.Sorter.class);
classes.put("SorterBuild", mindustry.world.blocks.distribution.Sorter.SorterBuild.class);
classes.put("StackConveyor", mindustry.world.blocks.distribution.StackConveyor.class);
classes.put("StackConveyorBuild", mindustry.world.blocks.distribution.StackConveyor.StackConveyorBuild.class);
classes.put("AirBlock", mindustry.world.blocks.environment.AirBlock.class);
classes.put("Boulder", mindustry.world.blocks.environment.Boulder.class);
classes.put("Cliff", mindustry.world.blocks.environment.Cliff.class);
classes.put("DoubleOverlayFloor", mindustry.world.blocks.environment.DoubleOverlayFloor.class);
classes.put("Floor", mindustry.world.blocks.environment.Floor.class);
classes.put("OreBlock", mindustry.world.blocks.environment.OreBlock.class);
classes.put("OverlayFloor", mindustry.world.blocks.environment.OverlayFloor.class);
classes.put("ShallowLiquid", mindustry.world.blocks.environment.ShallowLiquid.class);
classes.put("SpawnBlock", mindustry.world.blocks.environment.SpawnBlock.class);
classes.put("StaticTree", mindustry.world.blocks.environment.StaticTree.class);
classes.put("StaticWall", mindustry.world.blocks.environment.StaticWall.class);
classes.put("TreeBlock", mindustry.world.blocks.environment.TreeBlock.class);
classes.put("BlockForge", mindustry.world.blocks.experimental.BlockForge.class);
classes.put("BlockForgeBuild", mindustry.world.blocks.experimental.BlockForge.BlockForgeBuild.class);
classes.put("BlockLoader", mindustry.world.blocks.experimental.BlockLoader.class);
classes.put("BlockLoaderBuild", mindustry.world.blocks.experimental.BlockLoader.BlockLoaderBuild.class);
classes.put("BlockUnloader", mindustry.world.blocks.experimental.BlockUnloader.class);
classes.put("BlockUnloaderBuild", mindustry.world.blocks.experimental.BlockUnloader.BlockUnloaderBuild.class);
classes.put("LegacyBlock", mindustry.world.blocks.legacy.LegacyBlock.class);
classes.put("LegacyMechPad", mindustry.world.blocks.legacy.LegacyMechPad.class);
classes.put("LegacyMechPadBuild", mindustry.world.blocks.legacy.LegacyMechPad.LegacyMechPadBuild.class);
classes.put("LegacyUnitFactory", mindustry.world.blocks.legacy.LegacyUnitFactory.class);
classes.put("LegacyUnitFactoryBuild", mindustry.world.blocks.legacy.LegacyUnitFactory.LegacyUnitFactoryBuild.class);
classes.put("ArmoredConduit", mindustry.world.blocks.liquid.ArmoredConduit.class);
classes.put("ArmoredConduitBuild", mindustry.world.blocks.liquid.ArmoredConduit.ArmoredConduitBuild.class);
classes.put("Conduit", mindustry.world.blocks.liquid.Conduit.class);
classes.put("ConduitBuild", mindustry.world.blocks.liquid.Conduit.ConduitBuild.class);
classes.put("LiquidBlock", mindustry.world.blocks.liquid.LiquidBlock.class);
classes.put("LiquidBuild", mindustry.world.blocks.liquid.LiquidBlock.LiquidBuild.class);
classes.put("LiquidBridge", mindustry.world.blocks.liquid.LiquidBridge.class);
classes.put("LiquidBridgeBuild", mindustry.world.blocks.liquid.LiquidBridge.LiquidBridgeBuild.class);
classes.put("LiquidExtendingBridge", mindustry.world.blocks.liquid.LiquidExtendingBridge.class);
classes.put("LiquidExtendingBridgeBuild", mindustry.world.blocks.liquid.LiquidExtendingBridge.LiquidExtendingBridgeBuild.class);
classes.put("LiquidJunction", mindustry.world.blocks.liquid.LiquidJunction.class);
classes.put("LiquidJunctionBuild", mindustry.world.blocks.liquid.LiquidJunction.LiquidJunctionBuild.class);
classes.put("LiquidRouter", mindustry.world.blocks.liquid.LiquidRouter.class);
classes.put("LiquidRouterBuild", mindustry.world.blocks.liquid.LiquidRouter.LiquidRouterBuild.class);
classes.put("LogicBlock", mindustry.world.blocks.logic.LogicBlock.class);
classes.put("LogicBuild", mindustry.world.blocks.logic.LogicBlock.LogicBuild.class);
classes.put("LogicLink", mindustry.world.blocks.logic.LogicBlock.LogicLink.class);
classes.put("LogicDisplay", mindustry.world.blocks.logic.LogicDisplay.class);
classes.put("GraphicsType", mindustry.world.blocks.logic.LogicDisplay.GraphicsType.class);
classes.put("LogicDisplayBuild", mindustry.world.blocks.logic.LogicDisplay.LogicDisplayBuild.class);
classes.put("MemoryBlock", mindustry.world.blocks.logic.MemoryBlock.class);
classes.put("MemoryBuild", mindustry.world.blocks.logic.MemoryBlock.MemoryBuild.class);
classes.put("MessageBlock", mindustry.world.blocks.logic.MessageBlock.class);
classes.put("MessageBuild", mindustry.world.blocks.logic.MessageBlock.MessageBuild.class);
classes.put("SwitchBlock", mindustry.world.blocks.logic.SwitchBlock.class);
classes.put("SwitchBuild", mindustry.world.blocks.logic.SwitchBlock.SwitchBuild.class);
classes.put("BuildPayload", mindustry.world.blocks.payloads.BuildPayload.class);
classes.put("Payload", mindustry.world.blocks.payloads.Payload.class);
classes.put("UnitPayload", mindustry.world.blocks.payloads.UnitPayload.class);
classes.put("Battery", mindustry.world.blocks.power.Battery.class);
classes.put("BatteryBuild", mindustry.world.blocks.power.Battery.BatteryBuild.class);
classes.put("BurnerGenerator", mindustry.world.blocks.power.BurnerGenerator.class);
classes.put("BurnerGeneratorBuild", mindustry.world.blocks.power.BurnerGenerator.BurnerGeneratorBuild.class);
classes.put("ConditionalConsumePower", mindustry.world.blocks.power.ConditionalConsumePower.class);
classes.put("DecayGenerator", mindustry.world.blocks.power.DecayGenerator.class);
classes.put("ImpactReactor", mindustry.world.blocks.power.ImpactReactor.class);
classes.put("ImpactReactorBuild", mindustry.world.blocks.power.ImpactReactor.ImpactReactorBuild.class);
classes.put("ItemLiquidGenerator", mindustry.world.blocks.power.ItemLiquidGenerator.class);
classes.put("ItemLiquidGeneratorBuild", mindustry.world.blocks.power.ItemLiquidGenerator.ItemLiquidGeneratorBuild.class);
classes.put("LightBlock", mindustry.world.blocks.power.LightBlock.class);
classes.put("LightBuild", mindustry.world.blocks.power.LightBlock.LightBuild.class);
classes.put("NuclearReactor", mindustry.world.blocks.power.NuclearReactor.class);
classes.put("NuclearReactorBuild", mindustry.world.blocks.power.NuclearReactor.NuclearReactorBuild.class);
classes.put("PowerBlock", mindustry.world.blocks.power.PowerBlock.class);
classes.put("PowerDiode", mindustry.world.blocks.power.PowerDiode.class);
classes.put("PowerDiodeBuild", mindustry.world.blocks.power.PowerDiode.PowerDiodeBuild.class);
classes.put("PowerDistributor", mindustry.world.blocks.power.PowerDistributor.class);
classes.put("PowerGenerator", mindustry.world.blocks.power.PowerGenerator.class);
classes.put("GeneratorBuild", mindustry.world.blocks.power.PowerGenerator.GeneratorBuild.class);
classes.put("PowerGraph", mindustry.world.blocks.power.PowerGraph.class);
classes.put("PowerNode", mindustry.world.blocks.power.PowerNode.class);
classes.put("PowerNodeBuild", mindustry.world.blocks.power.PowerNode.PowerNodeBuild.class);
classes.put("SingleTypeGenerator", mindustry.world.blocks.power.SingleTypeGenerator.class);
classes.put("SolarGenerator", mindustry.world.blocks.power.SolarGenerator.class);
classes.put("SolarGeneratorBuild", mindustry.world.blocks.power.SolarGenerator.SolarGeneratorBuild.class);
classes.put("ThermalGenerator", mindustry.world.blocks.power.ThermalGenerator.class);
classes.put("ThermalGeneratorBuild", mindustry.world.blocks.power.ThermalGenerator.ThermalGeneratorBuild.class);
classes.put("AttributeSmelter", mindustry.world.blocks.production.AttributeSmelter.class);
classes.put("AttributeSmelterBuild", mindustry.world.blocks.production.AttributeSmelter.AttributeSmelterBuild.class);
classes.put("Cultivator", mindustry.world.blocks.production.Cultivator.class);
classes.put("CultivatorBuild", mindustry.world.blocks.production.Cultivator.CultivatorBuild.class);
classes.put("Drill", mindustry.world.blocks.production.Drill.class);
classes.put("DrillBuild", mindustry.world.blocks.production.Drill.DrillBuild.class);
classes.put("Fracker", mindustry.world.blocks.production.Fracker.class);
classes.put("FrackerBuild", mindustry.world.blocks.production.Fracker.FrackerBuild.class);
classes.put("GenericCrafter", mindustry.world.blocks.production.GenericCrafter.class);
classes.put("GenericCrafterBuild", mindustry.world.blocks.production.GenericCrafter.GenericCrafterBuild.class);
classes.put("GenericSmelter", mindustry.world.blocks.production.GenericSmelter.class);
classes.put("SmelterBuild", mindustry.world.blocks.production.GenericSmelter.SmelterBuild.class);
classes.put("Incinerator", mindustry.world.blocks.production.Incinerator.class);
classes.put("IncineratorBuild", mindustry.world.blocks.production.Incinerator.IncineratorBuild.class);
classes.put("LiquidConverter", mindustry.world.blocks.production.LiquidConverter.class);
classes.put("LiquidConverterBuild", mindustry.world.blocks.production.LiquidConverter.LiquidConverterBuild.class);
classes.put("PayloadAcceptor", mindustry.world.blocks.production.PayloadAcceptor.class);
classes.put("PayloadAcceptorBuild", mindustry.world.blocks.production.PayloadAcceptor.PayloadAcceptorBuild.class);
classes.put("Pump", mindustry.world.blocks.production.Pump.class);
classes.put("PumpBuild", mindustry.world.blocks.production.Pump.PumpBuild.class);
classes.put("Separator", mindustry.world.blocks.production.Separator.class);
classes.put("SeparatorBuild", mindustry.world.blocks.production.Separator.SeparatorBuild.class);
classes.put("SolidPump", mindustry.world.blocks.production.SolidPump.class);
classes.put("SolidPumpBuild", mindustry.world.blocks.production.SolidPump.SolidPumpBuild.class);
classes.put("ItemSource", mindustry.world.blocks.sandbox.ItemSource.class);
classes.put("ItemSourceBuild", mindustry.world.blocks.sandbox.ItemSource.ItemSourceBuild.class);
classes.put("ItemVoid", mindustry.world.blocks.sandbox.ItemVoid.class);
classes.put("ItemVoidBuild", mindustry.world.blocks.sandbox.ItemVoid.ItemVoidBuild.class);
classes.put("LiquidSource", mindustry.world.blocks.sandbox.LiquidSource.class);
classes.put("LiquidSourceBuild", mindustry.world.blocks.sandbox.LiquidSource.LiquidSourceBuild.class);
classes.put("LiquidVoid", mindustry.world.blocks.sandbox.LiquidVoid.class);
classes.put("LiquidVoidBuild", mindustry.world.blocks.sandbox.LiquidVoid.LiquidVoidBuild.class);
classes.put("PowerSource", mindustry.world.blocks.sandbox.PowerSource.class);
classes.put("PowerSourceBuild", mindustry.world.blocks.sandbox.PowerSource.PowerSourceBuild.class);
classes.put("PowerVoid", mindustry.world.blocks.sandbox.PowerVoid.class);
classes.put("CoreBlock", mindustry.world.blocks.storage.CoreBlock.class);
classes.put("CoreBuild", mindustry.world.blocks.storage.CoreBlock.CoreBuild.class);
classes.put("StorageBlock", mindustry.world.blocks.storage.StorageBlock.class);
classes.put("StorageBuild", mindustry.world.blocks.storage.StorageBlock.StorageBuild.class);
classes.put("Unloader", mindustry.world.blocks.storage.Unloader.class);
classes.put("UnloaderBuild", mindustry.world.blocks.storage.Unloader.UnloaderBuild.class);
classes.put("CommandCenter", mindustry.world.blocks.units.CommandCenter.class);
classes.put("CommandBuild", mindustry.world.blocks.units.CommandCenter.CommandBuild.class);
classes.put("Reconstructor", mindustry.world.blocks.units.Reconstructor.class);
classes.put("ReconstructorBuild", mindustry.world.blocks.units.Reconstructor.ReconstructorBuild.class);
classes.put("RepairPoint", mindustry.world.blocks.units.RepairPoint.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("UnitBuild", mindustry.world.blocks.units.UnitBlock.UnitBuild.class);
classes.put("UnitFactory", mindustry.world.blocks.units.UnitFactory.class);
classes.put("UnitFactoryBuild", mindustry.world.blocks.units.UnitFactory.UnitFactoryBuild.class);
classes.put("UnitPlan", mindustry.world.blocks.units.UnitFactory.UnitPlan.class);
classes.put("DrawAnimation", mindustry.world.draw.DrawAnimation.class);
classes.put("DrawBlock", mindustry.world.draw.DrawBlock.class);
classes.put("DrawGlow", mindustry.world.draw.DrawGlow.class);
classes.put("DrawMixer", mindustry.world.draw.DrawMixer.class);
classes.put("DrawRotator", mindustry.world.draw.DrawRotator.class);
classes.put("DrawWeave", mindustry.world.draw.DrawWeave.class);
classes.put("Block", mindustry.world.Block.class);
}
}

View File

@@ -15,10 +15,12 @@ import arc.util.serialization.*;
import arc.util.serialization.Json.*; import arc.util.serialization.Json.*;
import arc.util.serialization.Jval.*; import arc.util.serialization.Jval.*;
import mindustry.*; import mindustry.*;
import mindustry.ai.types.*;
import mindustry.content.*; import mindustry.content.*;
import mindustry.content.TechTree.*; import mindustry.content.TechTree.*;
import mindustry.ctype.*; import mindustry.ctype.*;
import mindustry.entities.*; import mindustry.entities.*;
import mindustry.entities.abilities.*;
import mindustry.entities.bullet.*; import mindustry.entities.bullet.*;
import mindustry.entities.effect.*; import mindustry.entities.effect.*;
import mindustry.game.*; import mindustry.game.*;
@@ -26,6 +28,7 @@ import mindustry.game.Objectives.*;
import mindustry.gen.*; import mindustry.gen.*;
import mindustry.mod.Mods.*; import mindustry.mod.Mods.*;
import mindustry.type.*; import mindustry.type.*;
import mindustry.type.weather.*;
import mindustry.world.*; import mindustry.world.*;
import mindustry.world.blocks.units.*; import mindustry.world.blocks.units.*;
import mindustry.world.blocks.units.UnitFactory.*; import mindustry.world.blocks.units.UnitFactory.*;
@@ -42,14 +45,14 @@ public class ContentParser{
private static final boolean ignoreUnknownFields = true; private static final boolean ignoreUnknownFields = true;
ObjectMap<Class<?>, ContentType> contentTypes = new ObjectMap<>(); ObjectMap<Class<?>, ContentType> contentTypes = new ObjectMap<>();
ObjectSet<Class<?>> implicitNullable = ObjectSet.with(TextureRegion.class, TextureRegion[].class, TextureRegion[][].class); ObjectSet<Class<?>> implicitNullable = ObjectSet.with(TextureRegion.class, TextureRegion[].class, TextureRegion[][].class);
ObjectMap<String, AssetDescriptor> sounds = new ObjectMap<>(); ObjectMap<String, AssetDescriptor<?>> sounds = new ObjectMap<>();
ObjectMap<Class<?>, FieldParser> classParsers = new ObjectMap<>(){{ ObjectMap<Class<?>, FieldParser> classParsers = new ObjectMap<>(){{
put(Effect.class, (type, data) -> { put(Effect.class, (type, data) -> {
if(data.isString()){ if(data.isString()){
return field(Fx.class, data); return field(Fx.class, data);
} }
Class<? extends Effect> bc = data.has("type") ? resolve(data.getString("type"), "mindustry.entities.effect") : ParticleEffect.class; Class<? extends Effect> bc = resolve(data.getString("type", ""), ParticleEffect.class);
data.remove("type"); data.remove("type");
Effect result = make(bc); Effect result = make(bc);
readFields(result, data); readFields(result, data);
@@ -83,12 +86,23 @@ public class ContentParser{
if(data.isString()){ if(data.isString()){
return field(Bullets.class, data); return field(Bullets.class, data);
} }
Class<? extends BulletType> bc = data.has("type") ? resolve(data.getString("type"), "mindustry.entities.bullet") : BasicBulletType.class; var bc = resolve(data.getString("type", ""), BasicBulletType.class);
data.remove("type"); data.remove("type");
BulletType result = make(bc); BulletType result = make(bc);
readFields(result, data); readFields(result, data);
return result; return result;
}); });
put(DrawBlock.class, (type, data) -> {
if(data.isString()){
//try to instantiate
return make(resolve(data.asString()));
}
var bc = resolve(data.getString("type", ""), DrawBlock.class);
data.remove("type");
var result = make(bc);
readFields(result, data);
return result;
});
put(Sound.class, (type, data) -> { put(Sound.class, (type, data) -> {
if(fieldOpt(Sounds.class, data) != null) return fieldOpt(Sounds.class, data); if(fieldOpt(Sounds.class, data) != null) return fieldOpt(Sounds.class, data);
if(Vars.headless) return new Sound(); if(Vars.headless) return new Sound();
@@ -104,12 +118,19 @@ public class ContentParser{
return sound; return sound;
}); });
put(Objectives.Objective.class, (type, data) -> { put(Objectives.Objective.class, (type, data) -> {
Class<? extends Objectives.Objective> oc = data.has("type") ? resolve(data.getString("type"), "mindustry.game.Objectives") : SectorComplete.class; var oc = resolve(data.getString("type", ""), SectorComplete.class);
data.remove("type"); data.remove("type");
Objectives.Objective obj = make(oc); Objectives.Objective obj = make(oc);
readFields(obj, data); readFields(obj, data);
return obj; return obj;
}); });
put(Ability.class, (type, data) -> {
Class<? extends Ability> oc = resolve(data.getString("type", ""));
data.remove("type");
Ability obj = make(oc);
readFields(obj, data);
return obj;
});
put(Weapon.class, (type, data) -> { put(Weapon.class, (type, data) -> {
Weapon weapon = new Weapon(); Weapon weapon = new Weapon();
readFields(weapon, data); readFields(weapon, data);
@@ -118,12 +139,13 @@ public class ContentParser{
}); });
}}; }};
/** Stores things that need to be parsed fully, e.g. reading fields of content. /** Stores things that need to be parsed fully, e.g. reading fields of content.
* This is done to accomodate binding of content names first.*/ * This is done to accommodate binding of content names first.*/
private Seq<Runnable> reads = new Seq<>(); private Seq<Runnable> reads = new Seq<>();
private Seq<Runnable> postreads = new Seq<>(); private Seq<Runnable> postreads = new Seq<>();
private ObjectSet<Object> toBeParsed = new ObjectSet<>(); private ObjectSet<Object> toBeParsed = new ObjectSet<>();
LoadedMod currentMod; LoadedMod currentMod;
private Content currentContent; Content currentContent;
private Json parser = new Json(){ private Json parser = new Json(){
@Override @Override
@@ -160,11 +182,6 @@ public class ContentParser{
} }
} }
//try to load DrawBlock by instantiating it
if(type == DrawBlock.class && jsonData.isString()){
return Reflect.make("mindustry.world.draw." + Strings.capitalize(jsonData.asString()));
}
if(Content.class.isAssignableFrom(type)){ if(Content.class.isAssignableFrom(type)){
ContentType ctype = contentTypes.getThrow(type, () -> new IllegalArgumentException("No content type for class: " + type.getSimpleName())); ContentType ctype = contentTypes.getThrow(type, () -> new IllegalArgumentException("No content type for class: " + type.getSimpleName()));
String prefix = currentMod != null ? currentMod.name + "-" : ""; String prefix = currentMod != null ? currentMod.name + "-" : "";
@@ -194,30 +211,7 @@ public class ContentParser{
throw new IllegalArgumentException("When defining properties for an existing block, you must not re-declare its type. The original type will be used. Block: " + name); throw new IllegalArgumentException("When defining properties for an existing block, you must not re-declare its type. The original type will be used. Block: " + name);
} }
}else{ }else{
//TODO generate dynamically instead of doing.. this block = make(resolve(getType(value), Block.class), mod + "-" + name);
Class<? extends Block> type;
try{
type = resolve(getType(value),
"mindustry.world",
"mindustry.world.blocks",
"mindustry.world.blocks.defense",
"mindustry.world.blocks.defense.turrets",
"mindustry.world.blocks.distribution",
"mindustry.world.blocks.environment",
"mindustry.world.blocks.liquid",
"mindustry.world.blocks.logic",
"mindustry.world.blocks.power",
"mindustry.world.blocks.production",
"mindustry.world.blocks.sandbox",
"mindustry.world.blocks.storage",
"mindustry.world.blocks.units"
);
}catch(IllegalArgumentException e){
type = Block.class;
}
block = make(type, mod + "-" + name);
} }
currentContent = block; currentContent = block;
@@ -225,22 +219,19 @@ public class ContentParser{
read(() -> { read(() -> {
if(value.has("consumes") && value.get("consumes").isObject()){ if(value.has("consumes") && value.get("consumes").isObject()){
for(JsonValue child : value.get("consumes")){ for(JsonValue child : value.get("consumes")){
if(child.name.equals("item")){ switch(child.name){
block.consumes.item(find(ContentType.item, child.asString())); case "item" -> block.consumes.item(find(ContentType.item, child.asString()));
}else if(child.name.equals("items")){ case "items" -> block.consumes.add((Consume)parser.readValue(ConsumeItems.class, child));
block.consumes.add((Consume)parser.readValue(ConsumeItems.class, child)); case "liquid" -> block.consumes.add((Consume)parser.readValue(ConsumeLiquid.class, child));
}else if(child.name.equals("liquid")){ case "power" -> {
block.consumes.add((Consume)parser.readValue(ConsumeLiquid.class, child));
}else if(child.name.equals("power")){
if(child.isNumber()){ if(child.isNumber()){
block.consumes.power(child.asFloat()); block.consumes.power(child.asFloat());
}else{ }else{
block.consumes.add((Consume)parser.readValue(ConsumePower.class, child)); block.consumes.add((Consume)parser.readValue(ConsumePower.class, child));
} }
}else if(child.name.equals("powerBuffered")){ }
block.consumes.powerBuffered(child.asFloat()); case "powerBuffered" -> block.consumes.powerBuffered(child.asFloat());
}else{ default -> throw new IllegalArgumentException("Unknown consumption type: '" + child.name + "' for block '" + block.name + "'.");
throw new IllegalArgumentException("Unknown consumption type: '" + child.name + "' for block '" + block.name + "'.");
} }
} }
value.remove("consumes"); value.remove("consumes");
@@ -284,15 +275,6 @@ public class ContentParser{
if(value.has("requirements")){ if(value.has("requirements")){
JsonValue rec = value.remove("requirements"); JsonValue rec = value.remove("requirements");
//intermediate class for parsing
class UnitReq{
public Block block;
public ItemStack[] requirements = {};
@Nullable
public UnitType previous;
public float time = 60f * 10f;
}
UnitReq req = parser.readValue(UnitReq.class, rec); UnitReq req = parser.readValue(UnitReq.class, rec);
if(req.block instanceof Reconstructor r){ if(req.block instanceof Reconstructor r){
@@ -308,7 +290,7 @@ public class ContentParser{
} }
if(value.has("controller")){ if(value.has("controller")){
unit.defaultController = make(resolve(value.getString("controller"), "mindustry.ai.types")); unit.defaultController = supply(resolve(value.getString("controller"), FlyingAI.class));
} }
//read extra default waves //read extra default waves
@@ -334,8 +316,7 @@ public class ContentParser{
readBundle(ContentType.weather, name, value); readBundle(ContentType.weather, name, value);
}else{ }else{
readBundle(ContentType.weather, name, value); readBundle(ContentType.weather, name, value);
Class<? extends Weather> type = resolve(getType(value), "mindustry.type.weather"); item = make(resolve(getType(value), ParticleWeather.class));
item = make(type);
} }
currentContent = item; currentContent = item;
read(() -> readFields(item, value)); read(() -> readFields(item, value));
@@ -425,6 +406,12 @@ public class ContentParser{
this.currentMod = mod; this.currentMod = mod;
this.currentContent = cont; this.currentContent = cont;
run.run(); run.run();
//check nulls after parsing
if(cont != null){
toBeParsed.remove(cont);
checkNullFields(cont);
}
}); });
} }
@@ -624,8 +611,8 @@ public class ContentParser{
JsonValue research = jsonMap.remove("research"); JsonValue research = jsonMap.remove("research");
toBeParsed.remove(object); toBeParsed.remove(object);
Class type = object.getClass(); var type = object.getClass();
ObjectMap<String, FieldMetadata> fields = parser.getFields(type); var fields = parser.getFields(type);
for(JsonValue child = jsonMap.child; child != null; child = child.next){ for(JsonValue child = jsonMap.child; child != null; child = child.next){
FieldMetadata metadata = fields.get(child.name().replace(" ", "_")); FieldMetadata metadata = fields.get(child.name().replace(" ", "_"));
if(metadata == null){ if(metadata == null){
@@ -654,7 +641,6 @@ public class ContentParser{
} }
} }
if(object instanceof UnlockableContent unlock && research != null){ if(object instanceof UnlockableContent unlock && research != null){
//add research tech node //add research tech node
@@ -706,21 +692,41 @@ public class ContentParser{
} }
} }
/** Tries to resolve a class from a list of potential class names. */ /** Tries to resolve a class from the class type map. */
<T> Class<T> resolve(String base, String... potentials){ <T> Class<T> resolve(String base){
if(!base.isEmpty() && Character.isLowerCase(base.charAt(0))) base = Strings.capitalize(base); return resolve(base, null);
}
for(String type : potentials){ /** Tries to resolve a class from the class type map. */
<T> Class<T> resolve(String base, Class<T> def){
//no base class specified
if(base.isEmpty() && def != null) return def;
//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);
if(out != null) return (Class<T>)out;
//try to resolve it as a raw class name if it's allowed
if(base.indexOf('.') != -1 && Scripts.allowClass(base)){
try{ try{
return (Class<T>)Class.forName(type + '.' + base); return (Class<T>)Class.forName(base);
}catch(Exception ignored){ }catch(Exception ignored){
//try to load from a mod's class loader
for(LoadedMod mod : mods.mods){
if(mod.loader != null){
try{ try{
return (Class<T>)Class.forName(type + '$' + base); return (Class<T>)Class.forName(base, true, mod.loader);
}catch(Exception ignored2){ }catch(Exception ignore){}
} }
} }
} }
throw new IllegalArgumentException("Types not found: " + base + "." + potentials[0]); }
if(def != null){
Log.warn("[@] No type '" + base + "' found, defaulting to type '" + def.getSimpleName() + "'", currentContent == null ? currentMod.name : "");
return def;
}
throw new IllegalArgumentException("Type not found: " + base);
} }
private interface FieldParser{ private interface FieldParser{
@@ -731,4 +737,13 @@ public class ContentParser{
T parse(String mod, String name, JsonValue value) throws Exception; T parse(String mod, String name, JsonValue value) throws Exception;
} }
//intermediate class for parsing
static class UnitReq{
public Block block;
public ItemStack[] requirements = {};
@Nullable
public UnitType previous;
public float time = 60f * 10f;
}
} }

View File

@@ -92,6 +92,8 @@ public class Mods implements Loadable{
var loaded = loadMod(dest, true); var loaded = loadMod(dest, true);
mods.add(loaded); mods.add(loaded);
requiresReload = true; requiresReload = true;
//enable the mod on import
Core.settings.put("mod-" + loaded.name + "-enabled", true);
sortMods(); sortMods();
//try to load the mod's icon so it displays on import //try to load the mod's icon so it displays on import
Core.app.post(() -> { Core.app.post(() -> {
@@ -257,6 +259,11 @@ public class Mods implements Loadable{
return requiresReload; return requiresReload;
} }
/** @return whether to skip mod loading due to previous initialization failure. */
public boolean skipModLoading(){
return failedToLaunch && Core.settings.getBool("modcrashdisable", true);
}
/** Loads all mods from the folder, but does not call any methods on them.*/ /** Loads all mods from the folder, but does not call any methods on them.*/
public void load(){ public void load(){
for(Fi file : modDirectory.list()){ for(Fi file : modDirectory.list()){
@@ -664,9 +671,10 @@ public class Mods implements Loadable{
} }
} }
ClassLoader loader = null;
Mod mainMod; Mod mainMod;
Fi mainFile = zip; Fi mainFile = zip;
if(android){ if(android){
mainFile = mainFile.child("classes.dex"); mainFile = mainFile.child("classes.dex");
}else{ }else{
@@ -680,14 +688,20 @@ public class Mods implements Loadable{
//make sure the main class exists before loading it; if it doesn't just don't put it there //make sure the main class exists before loading it; if it doesn't just don't put it there
//if the mod is explicitly marked as java, try loading it anyway //if the mod is explicitly marked as java, try loading it anyway
if((mainFile.exists() || meta.java) && if(
Core.settings.getBool("mod-" + baseName + "-enabled", true) && Version.isAtLeast(meta.minGameVersion) && (meta.getMinMajor() >= 105 || headless)){ (mainFile.exists() || meta.java) &&
!skipModLoading() &&
Core.settings.getBool("mod-" + baseName + "-enabled", true) &&
Version.isAtLeast(meta.minGameVersion) &&
(meta.getMinMajor() >= 105 || headless)
){
if(ios){ if(ios){
throw new IllegalArgumentException("Java class mods are not supported on iOS."); throw new IllegalArgumentException("Java class mods are not supported on iOS.");
} }
Class<?> main = platform.loadJar(sourceFile, mainClass); loader = platform.loadJar(sourceFile, mainClass);
Class<?> main = Class.forName(mainClass, true, loader);
metas.put(main, meta); metas.put(main, meta);
mainMod = (Mod)main.getDeclaredConstructor().newInstance(); mainMod = (Mod)main.getDeclaredConstructor().newInstance();
}else{ }else{
@@ -707,11 +721,16 @@ public class Mods implements Loadable{
} }
} }
//skip mod loading if it failed
if(skipModLoading()){
Core.settings.put("mod-" + baseName + "-enabled", false);
}
if(!headless){ if(!headless){
Log.info("Loaded mod '@' in @ms", meta.name, Time.elapsed()); Log.info("Loaded mod '@' in @ms", meta.name, Time.elapsed());
} }
return new LoadedMod(sourceFile, zip, mainMod, meta);
return new LoadedMod(sourceFile, zip, mainMod, loader, meta);
}catch(Exception e){ }catch(Exception e){
//delete root zip file so it can be closed on windows //delete root zip file so it can be closed on windows
if(rootZip != null) rootZip.delete(); if(rootZip != null) rootZip.delete();
@@ -743,10 +762,13 @@ public class Mods implements Loadable{
public ModState state = ModState.enabled; public ModState state = ModState.enabled;
/** Icon texture. Should be disposed. */ /** Icon texture. Should be disposed. */
public @Nullable Texture iconTexture; public @Nullable Texture iconTexture;
/** Class loader for JAR mods. Null if the mod isn't loaded or this isn't a jar mod. */
public @Nullable ClassLoader loader;
public LoadedMod(Fi file, Fi root, Mod main, ModMeta meta){ public LoadedMod(Fi file, Fi root, Mod main, ClassLoader loader, ModMeta meta){
this.root = root; this.root = root;
this.file = file; this.file = file;
this.loader = loader;
this.main = main; this.main = main;
this.meta = meta; this.meta = meta;
this.name = meta.name.toLowerCase().replace(" ", "-"); this.name = meta.name.toLowerCase().replace(" ", "-");

View File

@@ -21,20 +21,25 @@ import java.net.*;
import java.util.regex.*; import java.util.regex.*;
public class Scripts implements Disposable{ public class Scripts implements Disposable{
private final Seq<String> blacklist = Seq.with(".net.", "java.net", "files", "reflect", "javax", "rhino", "file", "channels", "jdk", private static final Seq<String> blacklist = Seq.with(".net.", "java.net", "files", "reflect", "javax", "rhino", "file", "channels", "jdk",
"runtime", "util.os", "rmi", "security", "org.", "sun.", "beans", "sql", "http", "exec", "compiler", "process", "system", "runtime", "util.os", "rmi", "security", "org.", "sun.", "beans", "sql", "http", "exec", "compiler", "process", "system",
".awt", "socket", "classloader", "oracle", "invoke", "java.util.function", "java.util.stream", "org.", "arc.net"); ".awt", "socket", "classloader", "oracle", "invoke", "java.util.function", "java.util.stream", "org.", "mod.classmap");
private final Seq<String> whitelist = Seq.with("mindustry.net", "netserver", "netclient", "com.sun.proxy.$proxy", "mindustry.gen.", "mindustry.logic.", "mindustry.async.", "saveio", "systemcursor"); private static final Seq<String> whitelist = Seq.with("mindustry.net", "netserver", "netclient", "com.sun.proxy.$proxy", "mindustry.gen.", "mindustry.logic.", "mindustry.async.", "saveio", "systemcursor", "filetreeinitevent");
private final Context context; private final Context context;
private final Scriptable scope; private final Scriptable scope;
private boolean errored; private boolean errored;
LoadedMod currentMod = null; LoadedMod currentMod = null;
public static boolean allowClass(String type){
return !blacklist.contains(type.toLowerCase()::contains) || whitelist.contains(type.toLowerCase()::contains);
}
public Scripts(){ public Scripts(){
Time.mark(); Time.mark();
context = Vars.platform.getScriptContext(); context = Vars.platform.getScriptContext();
context.setClassShutter(type -> !blacklist.contains(type.toLowerCase()::contains) || whitelist.contains(type.toLowerCase()::contains)); context.setClassShutter(Scripts::allowClass);
context.getWrapFactory().setJavaPrimitiveWrap(false); context.getWrapFactory().setJavaPrimitiveWrap(false);
context.setLanguageVersion(Context.VERSION_ES6); context.setLanguageVersion(Context.VERSION_ES6);
@@ -57,7 +62,7 @@ public class Scripts implements Disposable{
public String runConsole(String text){ public String runConsole(String text){
try{ try{
Object o = context.evaluateString(scope, text, "console.js", 1, null); Object o = context.evaluateString(scope, text, "console.js", 1, null);
if(o instanceof NativeJavaObject) o = ((NativeJavaObject)o).unwrap(); if(o instanceof NativeJavaObject n) o = n.unwrap();
if(o instanceof Undefined) o = "undefined"; if(o instanceof Undefined) o = "undefined";
return String.valueOf(o); return String.valueOf(o);
}catch(Throwable t){ }catch(Throwable t){

View File

@@ -160,7 +160,7 @@ public class Packets{
public int version; public int version;
public String versionType; public String versionType;
public Seq<String> mods; public Seq<String> mods;
public String name, uuid, usid; public String name, locale, uuid, usid;
public boolean mobile; public boolean mobile;
public int color; public int color;
@@ -169,6 +169,7 @@ public class Packets{
buffer.putInt(Version.build); buffer.putInt(Version.build);
TypeIO.writeString(buffer, versionType); TypeIO.writeString(buffer, versionType);
TypeIO.writeString(buffer, name); TypeIO.writeString(buffer, name);
TypeIO.writeString(buffer, locale);
TypeIO.writeString(buffer, usid); TypeIO.writeString(buffer, usid);
byte[] b = Base64Coder.decode(uuid); byte[] b = Base64Coder.decode(uuid);
@@ -190,6 +191,7 @@ public class Packets{
version = buffer.getInt(); version = buffer.getInt();
versionType = TypeIO.readString(buffer); versionType = TypeIO.readString(buffer);
name = TypeIO.readString(buffer); name = TypeIO.readString(buffer);
locale = TypeIO.readString(buffer);
usid = TypeIO.readString(buffer); usid = TypeIO.readString(buffer);
byte[] idbytes = new byte[16]; byte[] idbytes = new byte[16];
buffer.get(idbytes); buffer.get(idbytes);

View File

@@ -10,7 +10,7 @@ import mindustry.world.modules.ItemModule.*;
import java.util.*; import java.util.*;
public class ItemSeq implements Iterable<ItemStack>, Serializable{ public class ItemSeq implements Iterable<ItemStack>, JsonSerializable{
protected final int[] values = new int[Vars.content.items().size]; protected final int[] values = new int[Vars.content.items().size];
public int total; public int total;

View File

@@ -225,6 +225,7 @@ public class UnitType extends UnlockableContent{
Unit inst = constructor.get(); Unit inst = constructor.get();
stats.add(Stat.health, health); stats.add(Stat.health, health);
stats.add(Stat.armor, armor);
stats.add(Stat.speed, speed); stats.add(Stat.speed, speed);
stats.add(Stat.itemCapacity, itemCapacity); stats.add(Stat.itemCapacity, itemCapacity);
stats.add(Stat.range, (int)(maxRange / tilesize), StatUnit.blocks); stats.add(Stat.range, (int)(maxRange / tilesize), StatUnit.blocks);

View File

@@ -24,9 +24,9 @@ import static mindustry.gen.Tex.*;
@StyleDefaults @StyleDefaults
public class Styles{ public class Styles{
//TODO all these names are inconsistent and not descriptive //TODO all these names are inconsistent and not descriptive
public static Drawable black, black9, black8, black6, black3, black5, none, flatDown, flatOver; public static Drawable black, black9, black8, black6, black3, black5, none, flatDown, flatOver, accentDrawable;
public static ButtonStyle defaultb, waveb, modsb; public static ButtonStyle defaultb, waveb, modsb;
public static TextButtonStyle defaultt, squaret, nodet, cleart, discordt, nonet, infot, clearPartialt, clearTogglet, clearToggleMenut, togglet, transt, fullTogglet, logict; public static TextButtonStyle defaultt, squaret, nodet, cleart, discordt, nonet, infot, clearPartialt, clearTogglet, logicTogglet, clearToggleMenut, togglet, transt, fullTogglet, logict;
public static ImageButtonStyle defaulti, nodei, righti, emptyi, emptytogglei, selecti, logici, geni, colori, accenti, cleari, clearFulli, clearPartiali, clearPartial2i, clearTogglei, clearTransi, clearToggleTransi, clearTogglePartiali; public static ImageButtonStyle defaulti, nodei, righti, emptyi, emptytogglei, selecti, logici, geni, colori, accenti, cleari, clearFulli, clearPartiali, clearPartial2i, clearTogglei, clearTransi, clearToggleTransi, clearTogglePartiali;
public static ScrollPaneStyle defaultPane, horizontalPane, smallPane; public static ScrollPaneStyle defaultPane, horizontalPane, smallPane;
public static KeybindDialogStyle defaultKeybindDialog; public static KeybindDialogStyle defaultKeybindDialog;
@@ -46,6 +46,7 @@ public class Styles{
none = whiteui.tint(0f, 0f, 0f, 0f); none = whiteui.tint(0f, 0f, 0f, 0f);
flatDown = createFlatDown(); flatDown = createFlatDown();
flatOver = whiteui.tint(Color.valueOf("454545")); flatOver = whiteui.tint(Color.valueOf("454545"));
accentDrawable = whiteui.tint(Pal.accent);
defaultb = new ButtonStyle(){{ defaultb = new ButtonStyle(){{
down = buttonDown; down = buttonDown;
@@ -151,6 +152,16 @@ public class Styles{
disabled = black; disabled = black;
disabledFontColor = Color.gray; disabledFontColor = Color.gray;
}}; }};
logicTogglet = new TextButtonStyle(){{
font = Fonts.outline;
fontColor = Color.white;
checked = accentDrawable;
down = accentDrawable;
up = black;
over = flatOver;
disabled = black;
disabledFontColor = Color.gray;
}};
clearToggleMenut = new TextButtonStyle(){{ clearToggleMenut = new TextButtonStyle(){{
font = Fonts.def; font = Fonts.def;
fontColor = Color.white; fontColor = Color.white;

View File

@@ -17,7 +17,7 @@ public class ControlsDialog extends KeybindDialog{
@Override @Override
public void addCloseButton(){ public void addCloseButton(){
buttons.button("@back", Icon.left, this::hide).size(230f, 64f); buttons.button("@back", Icon.left, this::hide).size(210f, 64f);
keyDown(key -> { keyDown(key -> {
if(key == KeyCode.escape || key == KeyCode.back) hide(); if(key == KeyCode.escape || key == KeyCode.back) hide();

View File

@@ -161,6 +161,8 @@ public class CustomRulesDialog extends BaseDialog{
title("@rules.title.unit"); title("@rules.title.unit");
check("@rules.unitammo", b -> rules.unitAmmo = b, () -> rules.unitAmmo); check("@rules.unitammo", b -> rules.unitAmmo = b, () -> rules.unitAmmo);
check("@rules.unitcapvariable", b -> rules.unitCapVariable = b, () -> rules.unitCapVariable);
number("@rules.unitcap", true, f -> rules.unitCap = f, () -> rules.unitCap, -999, 999);
number("@rules.unitdamagemultiplier", f -> rules.unitDamageMultiplier = f, () -> rules.unitDamageMultiplier); number("@rules.unitdamagemultiplier", f -> rules.unitDamageMultiplier = f, () -> rules.unitDamageMultiplier);
number("@rules.unitbuildspeedmultiplier", f -> rules.unitBuildSpeedMultiplier = f, () -> rules.unitBuildSpeedMultiplier, 0.001f, 50f); number("@rules.unitbuildspeedmultiplier", f -> rules.unitBuildSpeedMultiplier = f, () -> rules.unitBuildSpeedMultiplier, 0.001f, 50f);
@@ -204,6 +206,17 @@ public class CustomRulesDialog extends BaseDialog{
number(text, false, cons, prov, condition, 0, Float.MAX_VALUE); number(text, false, cons, prov, condition, 0, Float.MAX_VALUE);
} }
void number(String text, boolean integer, Intc cons, Intp prov, int min, int max){
main.table(t -> {
t.left();
t.add(text).left().padRight(5);
t.field((integer ? (int)prov.get() : prov.get()) + "", s -> cons.get(Strings.parseInt(s)))
.padRight(100f)
.valid(f -> Strings.parseInt(f) >= min && Strings.parseInt(f) <= max).width(120f).left().addInputDialog();
}).padTop(0);
main.row();
}
void number(String text, boolean integer, Floatc cons, Floatp prov, Boolp condition, float min, float max){ void number(String text, boolean integer, Floatc cons, Floatp prov, Boolp condition, float min, float max){
main.table(t -> { main.table(t -> {
t.left(); t.left();

View File

@@ -513,7 +513,7 @@ public class JoinDialog extends BaseDialog{
Core.settings.remove("server-list"); Core.settings.remove("server-list");
} }
var url = becontrol.active() ? serverJsonBeURL : serverJsonV6URL; var url = becontrol.active() ? serverJsonBeURL : serverJsonURL;
Log.info("Fetching community servers at @", url); Log.info("Fetching community servers at @", url);
//get servers //get servers

View File

@@ -38,7 +38,7 @@ public class ModsDialog extends BaseDialog{
private String searchtxt = ""; private String searchtxt = "";
private @Nullable Seq<ModListing> modList; private @Nullable Seq<ModListing> modList;
private boolean orderDate = true; private boolean orderDate = false;
private BaseDialog currentContent; private BaseDialog currentContent;
private BaseDialog browser; private BaseDialog browser;
@@ -77,7 +77,6 @@ public class ModsDialog extends BaseDialog{
browser.cont.pane(tablebrow -> { browser.cont.pane(tablebrow -> {
tablebrow.margin(10f).top(); tablebrow.margin(10f).top();
browserTable = tablebrow; browserTable = tablebrow;
rebuildBrowser();
}).get().setScrollingDisabled(true, false); }).get().setScrollingDisabled(true, false);
browser.addCloseButton(); browser.addCloseButton();
@@ -107,11 +106,6 @@ public class ModsDialog extends BaseDialog{
} }
}); });
shown(() -> Core.app.post(() -> {
Core.settings.getBoolOnce("modsalpha", () -> {
ui.showText("@mods", "@mods.alphainfo");
});
}));
} }
void modError(Throwable error){ void modError(Throwable error){
@@ -155,7 +149,7 @@ public class ModsDialog extends BaseDialog{
} }
}); });
}, error -> Core.app.post(() -> ui.showException(error))); }, error -> Core.app.post(() -> modError(error)));
}else{ }else{
listener.get(modList); listener.get(modList);
} }
@@ -267,7 +261,7 @@ public class ModsDialog extends BaseDialog{
title.table(text -> { title.table(text -> {
boolean hideDisabled = !mod.isSupported() || mod.hasUnmetDependencies() || mod.hasContentErrors(); boolean hideDisabled = !mod.isSupported() || mod.hasUnmetDependencies() || mod.hasContentErrors();
text.add("" + Strings.stripColors(mod.meta.displayName()) + "\n[lightgray]v" + Strings.stripColors(trimText(mod.meta.version)) + (mod.enabled() || hideDisabled ? "" : "\n" + Core.bundle.get("mod.disabled") + "")) text.add("[accent]" + Strings.stripColors(mod.meta.displayName()) + "\n[lightgray]v" + Strings.stripColors(trimText(mod.meta.version)) + (mod.enabled() || hideDisabled ? "" : "\n" + Core.bundle.get("mod.disabled") + ""))
.wrap().top().width(300f).growX().left(); .wrap().top().width(300f).growX().left();
text.row(); text.row();
@@ -385,7 +379,7 @@ public class ModsDialog extends BaseDialog{
}).tooltip(c.localizedName); }).tooltip(c.localizedName);
if(++i % Math.min(Core.graphics.getWidth() / Scl.scl(70), 14) == 0) cs.row(); if(++i % Math.min(Core.graphics.getWidth() / Scl.scl(110), 14) == 0) cs.row();
} }
}).grow(); }).grow();
d.addCloseButton(); d.addCloseButton();
@@ -508,6 +502,7 @@ public class ModsDialog extends BaseDialog{
} }
private String trimText(String text){ private String trimText(String text){
if(text == null) return "";
if(text.contains("\n")){ if(text.contains("\n")){
return text.substring(0, text.indexOf("\n")); return text.substring(0, text.indexOf("\n"));
} }

View File

@@ -208,11 +208,11 @@ public class PlanetDialog extends BaseDialog implements PlanetInterfaceRenderer{
} }
void addBack(){ void addBack(){
buttons.button("@back", Icon.left, this::hide).size(200, 54).pad(2).bottom(); buttons.button("@back", Icon.left, this::hide).size(200f, 54f).pad(2).bottom();
} }
void addTech(){ void addTech(){
buttons.button("@techtree", Icon.tree, () -> ui.research.show()).size(200, 54).pad(2).bottom(); buttons.button("@techtree", Icon.tree, () -> ui.research.show()).size(200f, 54f).pad(2).bottom();
} }
public void showOverview(){ public void showOverview(){
@@ -677,7 +677,7 @@ public class PlanetDialog extends BaseDialog implements PlanetInterfaceRenderer{
setFillParent(true); setFillParent(true);
cont.pane(t -> { cont.pane(t -> {
t.marginRight(19f); t.marginRight(19f);
t.defaults().size(48); t.defaults().size(48f);
t.button(Icon.none, Styles.clearTogglei, () -> { t.button(Icon.none, Styles.clearTogglei, () -> {
sector.info.icon = null; sector.info.icon = null;
@@ -701,6 +701,7 @@ public class PlanetDialog extends BaseDialog implements PlanetInterfaceRenderer{
if(++i % 8 == 0) t.row(); if(++i % 8 == 0) t.row();
} }
}); });
buttons.button("@back", Icon.left, this::hide).size(210f, 64f);
}}.show(); }}.show();
}).size(40f); }).size(40f);
}).row(); }).row();

View File

@@ -320,12 +320,17 @@ public class SettingsMenuDialog extends SettingsDialog{
game.checkPref("blockreplace", true); game.checkPref("blockreplace", true);
game.checkPref("conveyorpathfinding", true); game.checkPref("conveyorpathfinding", true);
game.checkPref("hints", true); game.checkPref("hints", true);
game.checkPref("logichints", true);
if(!mobile){ if(!mobile){
game.checkPref("backgroundpause", true); game.checkPref("backgroundpause", true);
game.checkPref("buildautopause", false); game.checkPref("buildautopause", false);
} }
if(!ios){
game.checkPref("modcrashdisable", true);
}
if(steam){ if(steam){
game.sliderPref("playerlimit", 16, 2, 32, i -> { game.sliderPref("playerlimit", 16, 2, 32, i -> {
platform.updateLobby(); platform.updateLobby();
@@ -452,11 +457,24 @@ public class SettingsMenuDialog extends SettingsDialog{
files.addAll(schematicDirectory.list()); files.addAll(schematicDirectory.list());
String base = Core.settings.getDataDirectory().path(); String base = Core.settings.getDataDirectory().path();
//add directories
for(Fi other : files.copy()){
Fi parent = other.parent();
while(!files.contains(parent) && !parent.equals(settings.getDataDirectory())){
files.add(parent);
}
}
try(OutputStream fos = file.write(false, 2048); ZipOutputStream zos = new ZipOutputStream(fos)){ try(OutputStream fos = file.write(false, 2048); ZipOutputStream zos = new ZipOutputStream(fos)){
for(Fi add : files){ for(Fi add : files){
if(add.isDirectory()) continue; String path = add.path().substring(base.length());
zos.putNextEntry(new ZipEntry(add.path().substring(base.length()))); if(add.isDirectory()) path += "/";
//fix trailing / in path
path = path.startsWith("/") ? path.substring(1) : path;
zos.putNextEntry(new ZipEntry(path));
if(!add.isDirectory()){
Streams.copy(add.read(), zos); Streams.copy(add.read(), zos);
}
zos.closeEntry(); zos.closeEntry();
} }
} }
@@ -500,13 +518,13 @@ public class SettingsMenuDialog extends SettingsDialog{
@Override @Override
public void addCloseButton(){ public void addCloseButton(){
buttons.button("@back", Icon.leftOpen, () -> { buttons.button("@back", Icon.left, () -> {
if(prefs.getChildren().first() != menu){ if(prefs.getChildren().first() != menu){
back(); back();
}else{ }else{
hide(); hide();
} }
}).size(230f, 64f); }).size(210f, 64f);
keyDown(key -> { keyDown(key -> {
if(key == KeyCode.escape || key == KeyCode.back){ if(key == KeyCode.escape || key == KeyCode.back){

View File

@@ -15,7 +15,6 @@ import arc.util.*;
import mindustry.*; import mindustry.*;
import mindustry.gen.*; import mindustry.gen.*;
import mindustry.input.*; import mindustry.input.*;
import mindustry.type.*;
import mindustry.ui.*; import mindustry.ui.*;
import static arc.Core.*; import static arc.Core.*;
@@ -206,7 +205,7 @@ public class ChatFragment extends Table{
} }
}else{ }else{
//sending chat has a delay; workaround for issue #1943 //sending chat has a delay; workaround for issue #1943
Time.run(2f, () ->{ Time.runTask(2f, () ->{
scene.setKeyboardFocus(null); scene.setKeyboardFocus(null);
shown = false; shown = false;
scrollPos = 0; scrollPos = 0;

View File

@@ -637,20 +637,12 @@ public class HudFragment extends Fragment{
if(Float.isNaN(value) || Float.isInfinite(value)) value = 1f; if(Float.isNaN(value) || Float.isInfinite(value)) value = 1f;
drawInner(Pal.darkishGray); drawInner(Pal.darkishGray, 1f);
drawInner(Tmp.c1.set(color).lerp(Color.white, blink), value);
Draw.beginStencil();
Fill.crect(x, y, width, height * value);
Draw.beginStenciled();
drawInner(Tmp.c1.set(color).lerp(Color.white, blink));
Draw.endStencil();
} }
void drawInner(Color color){ void drawInner(Color color, float fract){
if(fract < 0) return;
if(flip){ if(flip){
x += width; x += width;
width = -width; width = -width;
@@ -660,19 +652,26 @@ public class HudFragment extends Fragment{
float bh = height/2f; float bh = height/2f;
Draw.color(color); Draw.color(color);
float f1 = Math.min(fract * 2f, 1f), f2 = (fract - 0.5f) * 2f;
float bo = -(1f - f1) * (width - stroke);
Fill.quad( Fill.quad(
x, y, x, y,
x + stroke, y, x + stroke, y,
x + width, y + bh, x + width + bo, y + bh * f1,
x + width - stroke, y + bh x + width - stroke + bo, y + bh * f1
); );
if(f2 > 0){
float bx = x + (width - stroke) * (1f - f2);
Fill.quad( Fill.quad(
x + width, y + bh, x + width, y + bh,
x + width - stroke, y + bh, x + width - stroke, y + bh,
x, y + height, bx, y + height * fract,
x + stroke, y + height bx + stroke, y + height * fract
); );
}
Draw.reset(); Draw.reset();

View File

@@ -160,8 +160,10 @@ public class Block extends UnlockableContent{
public boolean canOverdrive = true; public boolean canOverdrive = true;
/** Outlined icon color.*/ /** Outlined icon color.*/
public Color outlineColor = Color.valueOf("404049"); public Color outlineColor = Color.valueOf("404049");
/** Whether the icon region has an outline added. */ /** Whether any icon region has an outline added. */
public boolean outlineIcon = false; public boolean outlineIcon = false;
/** Which of the icon regions gets the outline added. */
public int outlinedIcon = -1;
/** Whether this block has a shadow under it. */ /** Whether this block has a shadow under it. */
public boolean hasShadow = true; public boolean hasShadow = true;
/** Sounds made when this block breaks.*/ /** Sounds made when this block breaks.*/
@@ -333,7 +335,11 @@ public class Block extends UnlockableContent{
super.setStats(); super.setStats();
stats.add(Stat.size, "@x@", size, size); stats.add(Stat.size, "@x@", size, size);
if(synthetic()){
stats.add(Stat.health, health, StatUnit.none); stats.add(Stat.health, health, StatUnit.none);
}
if(canBeBuilt()){ if(canBeBuilt()){
stats.add(Stat.buildTime, buildCost / 60, StatUnit.seconds); stats.add(Stat.buildTime, buildCost / 60, StatUnit.seconds);
stats.add(Stat.buildCost, new ItemListValue(false, requirements)); stats.add(Stat.buildCost, new ItemListValue(false, requirements));
@@ -428,7 +434,7 @@ public class Block extends UnlockableContent{
TextureRegion reg = getRequestRegion(req, list); TextureRegion reg = getRequestRegion(req, list);
Draw.rect(reg, req.drawx(), req.drawy(), !rotate ? 0 : req.rotation * 90); Draw.rect(reg, req.drawx(), req.drawy(), !rotate ? 0 : req.rotation * 90);
if(req.worldContext && player != null && teamRegion.found()){ if(req.worldContext && player != null && teamRegion != null && teamRegion.found()){
if(teamRegions[player.team().id] == teamRegion) Draw.color(player.team().color); if(teamRegions[player.team().id] == teamRegion) Draw.color(player.team().color);
Draw.rect(teamRegions[player.team().id], req.drawx(), req.drawy()); Draw.rect(teamRegions[player.team().id], req.drawx(), req.drawy());
Draw.color(); Draw.color();
@@ -768,7 +774,7 @@ public class Block extends UnlockableContent{
if(outlineIcon){ if(outlineIcon){
final int radius = 4; final int radius = 4;
PixmapRegion region = Core.atlas.getPixmap(getGeneratedIcons()[getGeneratedIcons().length-1]); PixmapRegion region = Core.atlas.getPixmap(getGeneratedIcons()[outlinedIcon >= 0 ? outlinedIcon : getGeneratedIcons().length -1]);
Pixmap out = new Pixmap(region.width, region.height); Pixmap out = new Pixmap(region.width, region.height);
Color color = new Color(); Color color = new Color();
for(int x = 0; x < region.width; x++){ for(int x = 0; x < region.width; x++){

View File

@@ -153,6 +153,7 @@ public class Build{
(type == check.block() && check.build != null && rotation == check.build.rotation && type.rotate) || //same block, same rotation (type == check.block() && check.build != null && rotation == check.build.rotation && type.rotate) || //same block, same rotation
!check.interactable(team) || //cannot interact !check.interactable(team) || //cannot interact
!check.floor().placeableOn || //solid wall !check.floor().placeableOn || //solid wall
(!checkVisible && !check.block().alwaysReplace) || //replacing a block that should be replaced (e.g. payload placement)
!((type.canReplace(check.block()) || //can replace type !((type.canReplace(check.block()) || //can replace type
//controversial change: allow rebuilding damaged blocks //controversial change: allow rebuilding damaged blocks
//this could be buggy and abuse-able, so I'm not enabling it yet //this could be buggy and abuse-able, so I'm not enabling it yet

View File

@@ -6,7 +6,7 @@ import mindustry.world.meta.*;
import java.util.*; import java.util.*;
public class Attributes implements Serializable{ public class Attributes implements JsonSerializable{
private final float[] arr = new float[Attribute.all.length]; private final float[] arr = new float[Attribute.all.length];
public void clear(){ public void clear(){

View File

@@ -21,7 +21,7 @@ public class Accelerator extends Block{
public @Load("launch-arrow") TextureRegion arrowRegion; public @Load("launch-arrow") TextureRegion arrowRegion;
public Block launching = Blocks.coreNucleus; public Block launching = Blocks.coreNucleus;
public int[] capacities; public int[] capacities = {};
public Accelerator(String name){ public Accelerator(String name){
super(name); super(name);

View File

@@ -178,6 +178,12 @@ public class ForceProjector extends Block{
return (radius + phaseHeat * phaseRadiusBoost) * radscl; return (radius + phaseHeat * phaseRadiusBoost) * radscl;
} }
@Override
public double sense(LAccess sensor){
if(sensor == LAccess.heat) return buildup;
return super.sense(sensor);
}
@Override @Override
public void draw(){ public void draw(){
super.draw(); super.draw();

View File

@@ -27,10 +27,11 @@ public class LiquidTurret extends Turret{
hasLiquids = true; hasLiquids = true;
loopSound = Sounds.spray; loopSound = Sounds.spray;
shootSound = Sounds.none; shootSound = Sounds.none;
outlinedIcon = 1;
} }
/** Initializes accepted ammo map. Format: [liquid1, bullet1, liquid2, bullet2...] */ /** Initializes accepted ammo map. Format: [liquid1, bullet1, liquid2, bullet2...] */
protected void ammo(Object... objects){ public void ammo(Object... objects){
ammoTypes = OrderedMap.of(objects); ammoTypes = OrderedMap.of(objects);
} }
@@ -63,6 +64,12 @@ public class LiquidTurret extends Turret{
super.init(); super.init();
} }
@Override
public TextureRegion[] icons(){
if(topRegion.found()) return new TextureRegion[]{baseRegion, region, topRegion};
return super.icons();
}
public class LiquidTurretBuild extends TurretBuild{ public class LiquidTurretBuild extends TurretBuild{
@Override @Override
public void draw(){ public void draw(){

View File

@@ -98,7 +98,7 @@ public class TractorBeamTurret extends BaseTurret{
any = false; any = false;
//look at target //look at target
if(target != null && target.within(this, range) && target.team() != team && target.checkTarget(targetAir, targetGround) && efficiency() > 0.02f){ if(target != null && target.within(this, range + target.hitSize/2f) && target.team() != team && target.checkTarget(targetAir, targetGround) && efficiency() > 0.02f){
if(!headless){ if(!headless){
control.sound.loop(shootSound, this, shootSoundVolume); control.sound.loop(shootSound, this, shootSoundVolume);
} }

View File

@@ -0,0 +1,43 @@
package mindustry.world.blocks.environment;
import arc.*;
import arc.graphics.g2d.*;
import mindustry.annotations.Annotations.*;
import mindustry.world.*;
public class AirBlock extends Floor{
public AirBlock(String name){
super(name);
alwaysReplace = true;
hasShadow = false;
useColor = false;
wall = this;
}
@Override
public void drawBase(Tile tile){}
@OverrideCallSuper
@Override
public void load(){}
@OverrideCallSuper
@Override
public void init(){
decoration = this;
}
@Override
public boolean isHidden(){
return true;
}
@Override
public TextureRegion[] variantRegions(){
if(variantRegions == null){
variantRegions = new TextureRegion[]{Core.atlas.find("clear")};
}
return variantRegions;
}
}

View File

@@ -6,7 +6,7 @@ import arc.math.*;
import mindustry.world.*; import mindustry.world.*;
public class Boulder extends Block{ public class Boulder extends Block{
protected int variants; public int variants;
public Boulder(String name){ public Boulder(String name){
super(name); super(name);

View File

@@ -1,10 +1,14 @@
package mindustry.world.blocks.environment; package mindustry.world.blocks.environment;
import arc.util.*;
import mindustry.world.*; import mindustry.world.*;
//do not use in mods! /**
* Do not use in mods. This class provides no new functionality, and is only used for the Mindustry sprite generator.
* Use the standard Floor class instead.
* */
public class ShallowLiquid extends Floor{ public class ShallowLiquid extends Floor{
public Floor liquidBase, floorBase; public @Nullable Floor liquidBase, floorBase;
public float liquidOpacity = 0.35f; public float liquidOpacity = 0.35f;
public ShallowLiquid(String name){ public ShallowLiquid(String name){

View File

@@ -0,0 +1,15 @@
package mindustry.world.blocks.environment;
import mindustry.world.*;
public class SpawnBlock extends OverlayFloor{
public SpawnBlock(String name){
super(name);
variants = 0;
needsSurface = false;
}
@Override
public void drawBase(Tile tile){}
}

View File

@@ -83,6 +83,7 @@ public class UnitPayload implements Payload{
public void draw(){ public void draw(){
Drawf.shadow(unit.x, unit.y, 20); Drawf.shadow(unit.x, unit.y, 20);
Draw.rect(unit.type.icon(Cicon.full), unit.x, unit.y, unit.rotation - 90); Draw.rect(unit.type.icon(Cicon.full), unit.x, unit.y, unit.rotation - 90);
unit.type.drawCell(unit);
//draw warning //draw warning
if(deactiveTime > 0){ if(deactiveTime > 0){

View File

@@ -4,6 +4,7 @@ import arc.*;
import arc.graphics.*; import arc.graphics.*;
import arc.graphics.g2d.*; import arc.graphics.g2d.*;
import arc.math.*; import arc.math.*;
import arc.struct.*;
import arc.util.*; import arc.util.*;
import arc.util.io.*; import arc.util.io.*;
import mindustry.annotations.Annotations.*; import mindustry.annotations.Annotations.*;
@@ -23,8 +24,8 @@ public class ImpactReactor extends PowerGenerator{
public float warmupSpeed = 0.001f; public float warmupSpeed = 0.001f;
public float itemDuration = 60f; public float itemDuration = 60f;
public int explosionRadius = 50; public int explosionRadius = 23;
public int explosionDamage = 2000; public int explosionDamage = 1900;
public Color plasma1 = Color.valueOf("ffd06b"), plasma2 = Color.valueOf("ff361b"); public Color plasma1 = Color.valueOf("ffd06b"), plasma2 = Color.valueOf("ff361b");
@@ -38,6 +39,7 @@ public class ImpactReactor extends PowerGenerator{
liquidCapacity = 30f; liquidCapacity = 30f;
hasItems = true; hasItems = true;
outputsPower = consumesPower = true; outputsPower = consumesPower = true;
flags = EnumSet.of(BlockFlag.reactor, BlockFlag.generator);
} }
@Override @Override

View File

@@ -30,12 +30,17 @@ public class NuclearReactor extends PowerGenerator{
public Color lightColor = Color.valueOf("7f19ea"); public Color lightColor = Color.valueOf("7f19ea");
public Color coolColor = new Color(1, 1, 1, 0f); public Color coolColor = new Color(1, 1, 1, 0f);
public Color hotColor = Color.valueOf("ff9575a3"); public Color hotColor = Color.valueOf("ff9575a3");
public float itemDuration = 120; //time to consume 1 fuel /** ticks to consume 1 fuel */
public float heating = 0.01f; //heating per frame * fullness public float itemDuration = 120;
public float smokeThreshold = 0.3f; //threshold at which block starts smoking /** heating per frame * fullness */
public int explosionRadius = 40; public float heating = 0.01f;
public int explosionDamage = 1350; /** threshold at which block starts smoking */
public float flashThreshold = 0.46f; //heat threshold at which the lights start flashing public float smokeThreshold = 0.3f;
/** heat threshold at which lights start flashing */
public float flashThreshold = 0.46f;
public int explosionRadius = 19;
public int explosionDamage = 1250;
/** heat removed per unit of coolant */
public float coolantPower = 0.5f; public float coolantPower = 0.5f;
public @Load("@-top") TextureRegion topRegion; public @Load("@-top") TextureRegion topRegion;
@@ -48,7 +53,7 @@ public class NuclearReactor extends PowerGenerator{
hasItems = true; hasItems = true;
hasLiquids = true; hasLiquids = true;
rebuildable = false; rebuildable = false;
flags = EnumSet.of(BlockFlag.reactor); flags = EnumSet.of(BlockFlag.reactor, BlockFlag.generator);
} }
@Override @Override

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