Compare commits
266 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
69944a2b63 | ||
|
|
0ceb58a105 | ||
|
|
5e8da856e7 | ||
|
|
ee412e1994 | ||
|
|
02736524bd | ||
|
|
c357b97b3b | ||
|
|
dbe7251c6b | ||
|
|
7ae90f655c | ||
|
|
669ce6dfbb | ||
|
|
4dc55e5594 | ||
|
|
4b824f7a4c | ||
|
|
3435132e87 | ||
|
|
d49b15b2a0 | ||
|
|
0c59553b3d | ||
|
|
4a50192937 | ||
|
|
f65ab00250 | ||
|
|
f71c3af2e1 | ||
|
|
77fb9e3d3e | ||
|
|
c1d6674797 | ||
|
|
659aaba0b9 | ||
|
|
a3816f6355 | ||
|
|
4829f040c2 | ||
|
|
59826f5189 | ||
|
|
a6fac9e56a | ||
|
|
68f0ef1bd2 | ||
|
|
d53882a086 | ||
|
|
7c7306d37b | ||
|
|
d5a9938354 | ||
|
|
3fad378b69 | ||
|
|
afb47344c6 | ||
|
|
5ba7e1d08b | ||
|
|
681347e933 | ||
|
|
f1bf8a0f1a | ||
|
|
874b41cb46 | ||
|
|
d3876b6376 | ||
|
|
f72f2bdf5d | ||
|
|
af91e17b13 | ||
|
|
69bfd8f54d | ||
|
|
369c3b569c | ||
|
|
8480e656b9 | ||
|
|
fb29324905 | ||
|
|
ed88633712 | ||
|
|
cd456f80a4 | ||
|
|
6d61515e28 | ||
|
|
38af936e3f | ||
|
|
d59f5ddc59 | ||
|
|
6c07c5006a | ||
|
|
d4d060a500 | ||
|
|
55e43761e9 | ||
|
|
b1edaa1408 | ||
|
|
d8d9762998 | ||
|
|
dd93284062 | ||
|
|
19c76fc741 | ||
|
|
1013455b0f | ||
|
|
066e4380e1 | ||
|
|
55da9df2a1 | ||
|
|
4b26c57a20 | ||
|
|
d0491dd68a | ||
|
|
cd8cc34c31 | ||
|
|
0249ebf718 | ||
|
|
7fb4eeb998 | ||
|
|
0cd7313523 | ||
|
|
5c3fc2a6ba | ||
|
|
19f888061f | ||
|
|
4e8a02be7d | ||
|
|
2231062c19 | ||
|
|
fb4faa15bb | ||
|
|
e6d05926dd | ||
|
|
ca9f18325c | ||
|
|
bd96ae5a48 | ||
|
|
cf1cc2ca49 | ||
|
|
bbaaa91575 | ||
|
|
41b21c81a0 | ||
|
|
44842d3221 | ||
|
|
d9c7665aca | ||
|
|
565b79d1b2 | ||
|
|
f30dc7dcd9 | ||
|
|
e4cdf515c9 | ||
|
|
ad3463cbc4 | ||
|
|
db733bced6 | ||
|
|
7aa71a7201 | ||
|
|
6fe55661ed | ||
|
|
af89efcfc4 | ||
|
|
82493c596d | ||
|
|
5a3fbf33df | ||
|
|
5bed0f3bcc | ||
|
|
87f6ff7be6 | ||
|
|
fa56996e10 | ||
|
|
b867cdb8b9 | ||
|
|
3bac32e04a | ||
|
|
c4c0f45228 | ||
|
|
d981bb95b9 | ||
|
|
c9f0a59339 | ||
|
|
ec58e868fd | ||
|
|
aa5152ac70 | ||
|
|
2cc627e7d0 | ||
|
|
8653e7bbb1 | ||
|
|
4fb7430fb7 | ||
|
|
e90c8c4d3e | ||
|
|
06e6deae42 | ||
|
|
38fe99f10e | ||
|
|
05ab62f038 | ||
|
|
168011586b | ||
|
|
b5f1e566b2 | ||
|
|
9b6fb2f382 | ||
|
|
24bb2428e7 | ||
|
|
75ba33abc0 | ||
|
|
ff54629550 | ||
|
|
b492c7ae27 | ||
|
|
5d04f93a88 | ||
|
|
5651d1b023 | ||
|
|
6822e3f5b8 | ||
|
|
3cbb02f9fb | ||
|
|
0f79298c28 | ||
|
|
8f4bd09635 | ||
|
|
0a9cad2ea6 | ||
|
|
dc21adfda5 | ||
|
|
a7bfe18f4a | ||
|
|
9cc76a148b | ||
|
|
1d95a255bc | ||
|
|
3f8d412d1c | ||
|
|
b2c35d45c3 | ||
|
|
35ab90e445 | ||
|
|
9bfb5216f9 | ||
|
|
b10656294e | ||
|
|
316f4d471f | ||
|
|
ef0b56eb22 | ||
|
|
e640042e5d | ||
|
|
2c0d2c5e22 | ||
|
|
9eed39c2ae | ||
|
|
e8d89b6c43 | ||
|
|
494c3ffbc4 | ||
|
|
40d27c787c | ||
|
|
2fe5b44698 | ||
|
|
5cc32b9001 | ||
|
|
d481af43c7 | ||
|
|
1cd43f938f | ||
|
|
528f5295c2 | ||
|
|
aaedeea870 | ||
|
|
c684c32abe | ||
|
|
34df9cca2c | ||
|
|
c678b53d3f | ||
|
|
ea30cc7d19 | ||
|
|
a2772d09f3 | ||
|
|
a0016f001c | ||
|
|
ca532f271f | ||
|
|
89402fd097 | ||
|
|
75451743aa | ||
|
|
b4d9a6a507 | ||
|
|
335afa56a1 | ||
|
|
485592bdac | ||
|
|
ee9289fc24 | ||
|
|
a0c281a0a9 | ||
|
|
ad0b0858f6 | ||
|
|
c2191872ac | ||
|
|
5f361413bb | ||
|
|
3414026828 | ||
|
|
7089fae0d5 | ||
|
|
80bdf1e19c | ||
|
|
e0c1f2a31a | ||
|
|
92cfa2b033 | ||
|
|
877cd5968c | ||
|
|
b39464a7d1 | ||
|
|
52332e5821 | ||
|
|
7f2c7685b4 | ||
|
|
7e80a60e65 | ||
|
|
44544020ec | ||
|
|
3b9d3fd233 | ||
|
|
4e2d2ee378 | ||
|
|
7aafa8b150 | ||
|
|
6d9a59c60b | ||
|
|
39e0977231 | ||
|
|
f8f140090f | ||
|
|
f063f7b2d3 | ||
|
|
60306f146f | ||
|
|
3b873b7cb2 | ||
|
|
26d44ea030 | ||
|
|
b369751a75 | ||
|
|
6e2cd81c9f | ||
|
|
e953bd40eb | ||
|
|
233ae99d3f | ||
|
|
ddca5ef25a | ||
|
|
ae88f286a6 | ||
|
|
25af0c4302 | ||
|
|
96b398867b | ||
|
|
97d1c49a3c | ||
|
|
e83dfd3d5a | ||
|
|
1142af853d | ||
|
|
4d502fe073 | ||
|
|
b022333df1 | ||
|
|
725b2188aa | ||
|
|
1f20d19aea | ||
|
|
ec9f91519d | ||
|
|
ae4e3e2d33 | ||
|
|
b931493d2f | ||
|
|
7b0c07533b | ||
|
|
33f0d64971 | ||
|
|
d10592a397 | ||
|
|
641937f952 | ||
|
|
b5ed309405 | ||
|
|
9bfbd7c953 | ||
|
|
57924afa3f | ||
|
|
76f11099b7 | ||
|
|
efcf802682 | ||
|
|
b095840dc8 | ||
|
|
5f9370da9a | ||
|
|
7a6eb08e53 | ||
|
|
865c3f28d5 | ||
|
|
d5916f3bc3 | ||
|
|
3ce870fb19 | ||
|
|
a575284bfe | ||
|
|
89d79fdc65 | ||
|
|
05c0fd2f40 | ||
|
|
bc3c2c46a8 | ||
|
|
3d69e9c763 | ||
|
|
9f5a0ca4e9 | ||
|
|
43245681fe | ||
|
|
9d214a77d7 | ||
|
|
5134aca723 | ||
|
|
40405332ec | ||
|
|
8d61f3b479 | ||
|
|
bd15287420 | ||
|
|
5dfc3fd576 | ||
|
|
1e80bdf19f | ||
|
|
76cd7ba8d1 | ||
|
|
1dfa0d08de | ||
|
|
1fc9c82aaf | ||
|
|
600a2b5ad7 | ||
|
|
cb60556ac0 | ||
|
|
62f683b871 | ||
|
|
f22d32c15e | ||
|
|
a3d8586199 | ||
|
|
bbadf6795e | ||
|
|
9ddfd650dd | ||
|
|
cf9cda4936 | ||
|
|
4e43d2a96b | ||
|
|
d68c8fe72c | ||
|
|
c9d0619289 | ||
|
|
8ea33946c4 | ||
|
|
bef7394004 | ||
|
|
4042bf042e | ||
|
|
643b698c30 | ||
|
|
aba3e3985a | ||
|
|
91f679f762 | ||
|
|
3eeed507cc | ||
|
|
988e1d6e30 | ||
|
|
04b4aabcf6 | ||
|
|
d97fe47206 | ||
|
|
0d8748a6ce | ||
|
|
b360a39fcf | ||
|
|
70b071fa26 | ||
|
|
64badb2cb7 | ||
|
|
3da6634242 | ||
|
|
4b8d072854 | ||
|
|
32abd991e7 | ||
|
|
3294f800be | ||
|
|
74e3dc2d7d | ||
|
|
a7a49a823b | ||
|
|
82f43a362f | ||
|
|
f7eea51066 | ||
|
|
98c35c5291 | ||
|
|
33c1579e9c | ||
|
|
e482c2c318 | ||
|
|
5b387e7e17 | ||
|
|
c7d735bf56 | ||
|
|
1f4dbd0024 |
17
.github/workflows/gradle.yml
vendored
Normal file
@@ -0,0 +1,17 @@
|
|||||||
|
name: Java CI
|
||||||
|
|
||||||
|
on: [push]
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
build:
|
||||||
|
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v1
|
||||||
|
- name: Set up JDK 1.8
|
||||||
|
uses: actions/setup-java@v1
|
||||||
|
with:
|
||||||
|
java-version: 1.8
|
||||||
|
- name: Run unit tests with gradle
|
||||||
|
run: ./gradlew test
|
||||||
4
.gitignore
vendored
@@ -20,6 +20,10 @@ logs/
|
|||||||
/tests/build/
|
/tests/build/
|
||||||
/server/build/
|
/server/build/
|
||||||
changelog
|
changelog
|
||||||
|
saves/
|
||||||
|
core/assets/saves/
|
||||||
|
/core/assets/saves/
|
||||||
|
steam_appid.txt
|
||||||
/test_files/
|
/test_files/
|
||||||
/annotations/build/
|
/annotations/build/
|
||||||
/android/assets/mindustry-maps/
|
/android/assets/mindustry-maps/
|
||||||
|
|||||||
19
.travis.yml
@@ -1,11 +1,25 @@
|
|||||||
jdk:
|
jdk:
|
||||||
- openjdk8
|
- openjdk8
|
||||||
|
dist: trusty
|
||||||
|
android:
|
||||||
|
components:
|
||||||
|
- android-29
|
||||||
|
- build-tools-29.0.2
|
||||||
|
|
||||||
script:
|
script:
|
||||||
|
- git clone --depth=1 --branch=master https://github.com/Anuken/MindustryBuilds ../MindustryBuilds
|
||||||
|
- cd ../MindustryBuilds
|
||||||
|
- echo ${TRAVIS_TAG}
|
||||||
|
- if [ -n "$TRAVIS_TAG" ]; then echo versionName=4-fdroid-${TRAVIS_TAG:1}$'\n'versionCode=${TRAVIS_TAG:1} > version_fdroid.txt; git add .; git commit -m "Updating to build ${TRAVIS_TAG}"; fi
|
||||||
|
- git tag ${TRAVIS_BUILD_NUMBER}
|
||||||
|
- git config --global user.name "Build Uploader"
|
||||||
|
- if [ "$TRAVIS_PULL_REQUEST" = "false" ]; then git push https://Anuken:${GH_PUSH_TOKEN}@github.com/Anuken/MindustryBuilds ${TRAVIS_BUILD_NUMBER}; git push https://Anuken:${GH_PUSH_TOKEN}@github.com/Anuken/MindustryBuilds; fi
|
||||||
|
- cd ../Mindustry
|
||||||
- git clone --depth=1 --branch=master https://github.com/Anuken/Arc ../Arc
|
- git clone --depth=1 --branch=master https://github.com/Anuken/Arc ../Arc
|
||||||
|
- if [ -n "$TRAVIS_TAG" ]; then cd ../Arc; git tag ${TRAVIS_TAG}; git push https://Anuken:${GH_PUSH_TOKEN}@github.com/Anuken/Arc ${TRAVIS_TAG}; cd ../Mindustry; fi
|
||||||
- "./gradlew test"
|
- "./gradlew test"
|
||||||
- "./gradlew desktop:dist -Pbuildversion=${TRAVIS_TAG:1}"
|
- "./gradlew desktop:dist -Pbuildversion=${TRAVIS_TAG:1}"
|
||||||
- "./gradlew server:dist -Pbuildversion=${TRAVIS_TAG:1}"
|
- "./gradlew server:dist -Pbuildversion=${TRAVIS_TAG:1}"
|
||||||
|
|
||||||
deploy:
|
deploy:
|
||||||
- provider: releases
|
- provider: releases
|
||||||
skip_cleanup: true
|
skip_cleanup: true
|
||||||
@@ -25,4 +39,5 @@ deploy:
|
|||||||
tags: true
|
tags: true
|
||||||
env:
|
env:
|
||||||
global:
|
global:
|
||||||
secure: TqlUl/ojjkCMVOGbCTKz7Cnr4F08UyWzY/CiJ0vvUOGJGZ1qm7XavAlDf5XT0egU4mvr37THubFO8vojbqmrmy0oZnYh3njKFA8axgyZ8PyKkjGHOfd0i6qyEWsOr9H90/2X8r3LwEeLaDFyHpu3wljIGBjweg53g2qwmDwCFa9UR80FJZ+xDB+rD6B3cXT0DTEkCoLZXLqXm0Y3HvBdSuBL1LR/FNb2BSxNq+tNLGiz1kdQZV5erausbbZypBoGxzz63xAnyz2kkFz73A8xQYVTzGbFodTPz7HM13GVZ5s43I03Y+HYyHBgBaSLziO2hi2kzVJccOwzBp7wS4fs1MqsFY5+IeWJ9k+hm89NiYT7+6zlEgoUMlIniny1qLqWTzx7btUeuC/y/h5TVBNgaV+z0jmHycHfeSyq5I+vmX4J8qe3wmaN8TcdqYKU5nIznOTk3CM5Fzu0Bs9vkCkOxmormmcjMFW1RbdOLc/hpZWZggsBA88sNEAI8eq+r5QEeqzeCx8YKoZDjdrsqvgLMc3El3gS9oMGxkn0Y/TEcqs9Tc4BXtTkqIA68hD0DYzlAxYjVbbkAI9Hh9lHNvV3Dr/oCkGXQ/HflM143kj1L3tSBZpqeqQE2XhngB5nqpS3OZTmZbMTQ8qD2luU18yaTGMLF5tJS/fdKPRx0gQ1kL8=
|
- secure: TqlUl/ojjkCMVOGbCTKz7Cnr4F08UyWzY/CiJ0vvUOGJGZ1qm7XavAlDf5XT0egU4mvr37THubFO8vojbqmrmy0oZnYh3njKFA8axgyZ8PyKkjGHOfd0i6qyEWsOr9H90/2X8r3LwEeLaDFyHpu3wljIGBjweg53g2qwmDwCFa9UR80FJZ+xDB+rD6B3cXT0DTEkCoLZXLqXm0Y3HvBdSuBL1LR/FNb2BSxNq+tNLGiz1kdQZV5erausbbZypBoGxzz63xAnyz2kkFz73A8xQYVTzGbFodTPz7HM13GVZ5s43I03Y+HYyHBgBaSLziO2hi2kzVJccOwzBp7wS4fs1MqsFY5+IeWJ9k+hm89NiYT7+6zlEgoUMlIniny1qLqWTzx7btUeuC/y/h5TVBNgaV+z0jmHycHfeSyq5I+vmX4J8qe3wmaN8TcdqYKU5nIznOTk3CM5Fzu0Bs9vkCkOxmormmcjMFW1RbdOLc/hpZWZggsBA88sNEAI8eq+r5QEeqzeCx8YKoZDjdrsqvgLMc3El3gS9oMGxkn0Y/TEcqs9Tc4BXtTkqIA68hD0DYzlAxYjVbbkAI9Hh9lHNvV3Dr/oCkGXQ/HflM143kj1L3tSBZpqeqQE2XhngB5nqpS3OZTmZbMTQ8qD2luU18yaTGMLF5tJS/fdKPRx0gQ1kL8=
|
||||||
|
- secure: VEskj/0TVX2o7iUVXuVPysj/VSWmPhDl57SrT7/nBNN/P/8N5jFAvx8PMzG7qT0S5FzKxuV20psE4WylUGRKdeRtK7/QNBV7T3YqYYM6BUB1VeRpxe5hLxTeuBK3izglFO8DkdDqjUtzQSjzkoYT75ilROjhBrBUPhVek7UlbBHbaklPWYFXHnJmYS1FpZTdzqIj+Y0Gd1PSL2MzK4X74aAHl0qaDgsTwYwtKs7IAz+kFaTZBRpi9VjQHAFhDlkDR3jo9wQjH8/F6x0lCgV/FulSc37Okdb40sLFG98xcEA6gWh1NPMkz8CulUdVE7mj7SJNxLbNvoMNrWOVRjmEsn59p/9LiNC1F9ncFz9vjQjAmi7rMFFGHGxe5nn8cIAkpTvHQQkZoWHAA9SNJTDMMf09m2pRy/vvzx+a6NVxyC9iNrhLlnBg4gxAqRh0S6NU0uL+fuygKixn7rqlnb7KMT7bAbfcuV+dng6c8V7hYKDCh7sJbH8iJump1xkwoM7ecnU8fxJF/oKOr/fbk0Bfxu+Q9qYLrV1+DEdm93Vl2Thq+DBKmI66jRGSva6HeCLFo81PEiEjP1nLv75+kvVfOqVqJrZD1BrvoG2eWT/3hVLrN2kEIWWlpvQVC7FL11yWmYtAuOBh/vfhI76zKr+YTS6ccG9rqW4XeYjJytshe8M=
|
||||||
|
|||||||
19
README.md
@@ -29,6 +29,13 @@ _Building:_ `./gradlew desktop:dist`
|
|||||||
|
|
||||||
Server builds are bundled with each released build (in Releases). If you'd rather compile on your own, replace 'desktop' with 'server', e.g. `gradlew server:dist`.
|
Server builds are bundled with each released build (in Releases). If you'd rather compile on your own, replace 'desktop' with 'server', e.g. `gradlew server:dist`.
|
||||||
|
|
||||||
|
#### Android
|
||||||
|
|
||||||
|
1. Install the Android SDK [here.](https://developer.android.com/studio#downloads) Make sure you're downloading the "Command line tools only", as Android Studio is not required.
|
||||||
|
2. Create a file named `local.properties` inside the Mindustry directory, with its contents looking like this: `sdk.dir=<Path to Android SDK you just downloaded, without these bracket>`. For example, if you're on Windows and installed the tools to C:\\tools, your local.properties would contain `sdk.dir=C:\\tools` (*note the double backslashes are required instead of single ones!*).
|
||||||
|
3. Run `gradlew android:assembleDebug` (or `./gradlew` if on linux/mac). This will create an unsigned APK in `android/build/outputs/apk`.
|
||||||
|
4. (Optional) To debug the application on a connected phone, do `gradlew android:installDebug android:run`. It is **highly recommended** to use IntelliJ for this instead, however.
|
||||||
|
|
||||||
##### Troubleshooting
|
##### Troubleshooting
|
||||||
|
|
||||||
If the terminal returns `Permission denied` or `Command not found` on Mac/Linux, run `chmod +x ./gradlew` before running `./gradlew`. *This is a one-time procedure.*
|
If the terminal returns `Permission denied` or `Command not found` on Mac/Linux, run `chmod +x ./gradlew` before running `./gradlew`. *This is a one-time procedure.*
|
||||||
@@ -40,6 +47,14 @@ After building, the output .JAR file should be in `/desktop/build/libs/Mindustry
|
|||||||
|
|
||||||
### Downloads
|
### Downloads
|
||||||
|
|
||||||
<a href="https://anuke.itch.io/mindustry"><img src="https://static.itch.io/images/badge.svg" width="auto" height="75"></a>
|
[<img src="https://static.itch.io/images/badge.svg"
|
||||||
|
alt="Get it on Itch.io"
|
||||||
|
height="60">](https://anuke.itch.io/mindustry)
|
||||||
|
|
||||||
<a href="https://play.google.com/store/apps/details?id=io.anuke.mindustry&hl=en"><img src="https://upload.wikimedia.org/wikipedia/commons/thumb/c/cd/Get_it_on_Google_play.svg/1280px-Get_it_on_Google_play.svg.png" width="auto" height="75"></a>
|
[<img src="https://play.google.com/intl/en_us/badges/images/generic/en-play-badge.png"
|
||||||
|
alt="Get it on Google Play"
|
||||||
|
height="80">](https://play.google.com/store/apps/details?id=io.anuke.mindustry)
|
||||||
|
|
||||||
|
[<img src="https://fdroid.gitlab.io/artwork/badge/get-it-on.png"
|
||||||
|
alt="Get it on F-Droid"
|
||||||
|
height="80">](https://f-droid.org/packages/io.anuke.mindustry/)
|
||||||
|
|||||||
@@ -28,14 +28,6 @@
|
|||||||
<category android:name="android.intent.category.LAUNCHER"/>
|
<category android:name="android.intent.category.LAUNCHER"/>
|
||||||
</intent-filter>
|
</intent-filter>
|
||||||
|
|
||||||
<intent-filter>
|
|
||||||
<action android:name="android.intent.action.VIEW"/>
|
|
||||||
<category android:name="android.intent.category.DEFAULT"/>
|
|
||||||
<category android:name="android.intent.category.BROWSABLE"/>
|
|
||||||
<data android:mimeType="application/octet-stream"/>
|
|
||||||
<data android:scheme="file" android:host="*" android:pathPattern=".*\\.mmap"/>
|
|
||||||
</intent-filter>
|
|
||||||
|
|
||||||
<intent-filter>
|
<intent-filter>
|
||||||
<action android:name="android.intent.action.VIEW"/>
|
<action android:name="android.intent.action.VIEW"/>
|
||||||
<category android:name="android.intent.category.DEFAULT"/>
|
<category android:name="android.intent.category.DEFAULT"/>
|
||||||
@@ -43,21 +35,6 @@
|
|||||||
<data android:mimeType="application/octet-stream" />
|
<data android:mimeType="application/octet-stream" />
|
||||||
<data android:scheme="file" android:host="*" android:pathPattern=".*\\.msav"/>
|
<data android:scheme="file" android:host="*" android:pathPattern=".*\\.msav"/>
|
||||||
</intent-filter>
|
</intent-filter>
|
||||||
|
|
||||||
|
|
||||||
<intent-filter android:icon="@mipmap/ic_launcher"
|
|
||||||
android:label="Mindustry Map"
|
|
||||||
android:priority="1">
|
|
||||||
<action android:name="android.intent.action.VIEW"/>
|
|
||||||
<category android:name="android.intent.category.DEFAULT"/>
|
|
||||||
<data android:scheme="file" android:host="*" android:pathPattern=".*\\.mmap" android:mimeType="*/*"/>
|
|
||||||
</intent-filter>
|
|
||||||
|
|
||||||
<intent-filter>
|
|
||||||
<action android:name="android.intent.action.VIEW"/>
|
|
||||||
<category android:name="android.intent.category.DEFAULT"/>
|
|
||||||
<data android:scheme="file" android:host="*" android:pathPattern=".*\\.msav" android:mimeType="*/*"/>
|
|
||||||
</intent-filter>
|
|
||||||
</activity>
|
</activity>
|
||||||
|
|
||||||
</application>
|
</application>
|
||||||
|
|||||||
@@ -26,7 +26,6 @@ repositories{
|
|||||||
|
|
||||||
dependencies{
|
dependencies{
|
||||||
implementation project(":core")
|
implementation project(":core")
|
||||||
implementation project(":net")
|
|
||||||
|
|
||||||
implementation arcModule("backends:backend-android")
|
implementation arcModule("backends:backend-android")
|
||||||
natives "com.badlogicgames.gdx:gdx-platform:$gdxVersion:natives-armeabi"
|
natives "com.badlogicgames.gdx:gdx-platform:$gdxVersion:natives-armeabi"
|
||||||
@@ -50,8 +49,8 @@ task deploy(type: Copy){
|
|||||||
}
|
}
|
||||||
|
|
||||||
android{
|
android{
|
||||||
buildToolsVersion '28.0.3'
|
buildToolsVersion '29.0.2'
|
||||||
compileSdkVersion 28
|
compileSdkVersion 29
|
||||||
sourceSets{
|
sourceSets{
|
||||||
main{
|
main{
|
||||||
manifest.srcFile 'AndroidManifest.xml'
|
manifest.srcFile 'AndroidManifest.xml'
|
||||||
@@ -70,27 +69,19 @@ android{
|
|||||||
}
|
}
|
||||||
|
|
||||||
defaultConfig{
|
defaultConfig{
|
||||||
def vfile = file('../core/assets/version.properties')
|
Properties props = new Properties().with{p -> p.load(file('../core/assets/version.properties').newReader()); return p }
|
||||||
|
Integer vcode = props['androidBuildCode']?.toInteger() ?: 1
|
||||||
def code = 0
|
def versionNameResult = "$versionNumber-$versionType-${getBuildVersion().replace(" ", "-")}"
|
||||||
def versionNameResult = "unknown"
|
|
||||||
|
|
||||||
if(vfile.exists()){
|
|
||||||
def props = new Properties()
|
|
||||||
props.load(new FileInputStream(vfile))
|
|
||||||
|
|
||||||
code = (props['androidBuildCode'] == null ? 0 : props['androidBuildCode']).toInteger() + 1
|
|
||||||
|
|
||||||
props['androidBuildCode'] = code.toString()
|
|
||||||
props.store(vfile.newWriter(), "Autogenerated file. Do not modify.")
|
|
||||||
versionNameResult = "$versionNumber-$versionType-${props['build'].replace(" ", "-")}"
|
|
||||||
}
|
|
||||||
|
|
||||||
applicationId "io.anuke.mindustry"
|
applicationId "io.anuke.mindustry"
|
||||||
minSdkVersion 14
|
minSdkVersion 14
|
||||||
targetSdkVersion 28
|
targetSdkVersion 29
|
||||||
versionCode code
|
|
||||||
versionName versionNameResult
|
versionName versionNameResult
|
||||||
|
versionCode vcode
|
||||||
|
|
||||||
|
props['androidBuildCode'] = (vcode + 1).toString()
|
||||||
|
props.store(file('../core/assets/version.properties').newWriter(), null)
|
||||||
}
|
}
|
||||||
|
|
||||||
compileOptions{
|
compileOptions{
|
||||||
|
|||||||
@@ -1,32 +1,26 @@
|
|||||||
package io.anuke.mindustry;
|
package io.anuke.mindustry;
|
||||||
|
|
||||||
import android.Manifest;
|
import android.app.*;
|
||||||
import android.content.Context;
|
import android.content.*;
|
||||||
import android.content.Intent;
|
import android.content.pm.*;
|
||||||
import android.content.pm.ActivityInfo;
|
import android.net.*;
|
||||||
import android.content.pm.PackageManager;
|
import android.os.Build.*;
|
||||||
import android.net.Uri;
|
import android.os.*;
|
||||||
import android.os.Build;
|
import android.provider.Settings.*;
|
||||||
import android.os.Bundle;
|
import android.telephony.*;
|
||||||
import android.provider.Settings.Secure;
|
import io.anuke.arc.*;
|
||||||
import android.telephony.TelephonyManager;
|
import io.anuke.arc.backends.android.surfaceview.*;
|
||||||
import io.anuke.arc.Core;
|
import io.anuke.arc.files.*;
|
||||||
import io.anuke.arc.backends.android.surfaceview.AndroidApplication;
|
import io.anuke.arc.function.*;
|
||||||
import io.anuke.arc.backends.android.surfaceview.AndroidApplicationConfiguration;
|
import io.anuke.arc.scene.ui.layout.*;
|
||||||
import io.anuke.arc.files.FileHandle;
|
import io.anuke.arc.util.*;
|
||||||
import io.anuke.arc.function.Consumer;
|
import io.anuke.arc.util.serialization.*;
|
||||||
import io.anuke.arc.function.Predicate;
|
import io.anuke.mindustry.game.Saves.*;
|
||||||
import io.anuke.arc.scene.ui.layout.UnitScl;
|
import io.anuke.mindustry.io.*;
|
||||||
import io.anuke.arc.util.Strings;
|
import io.anuke.mindustry.ui.dialogs.*;
|
||||||
import io.anuke.arc.util.serialization.Base64Coder;
|
|
||||||
import io.anuke.mindustry.core.Platform;
|
|
||||||
import io.anuke.mindustry.game.Saves.SaveSlot;
|
|
||||||
import io.anuke.mindustry.io.SaveIO;
|
|
||||||
import io.anuke.mindustry.net.*;
|
|
||||||
import io.anuke.mindustry.ui.dialogs.FileChooser;
|
|
||||||
|
|
||||||
import java.io.*;
|
import java.io.*;
|
||||||
import java.util.ArrayList;
|
import java.lang.System;
|
||||||
|
|
||||||
import static io.anuke.mindustry.Vars.*;
|
import static io.anuke.mindustry.Vars.*;
|
||||||
|
|
||||||
@@ -39,10 +33,11 @@ public class AndroidLauncher extends AndroidApplication{
|
|||||||
@Override
|
@Override
|
||||||
protected void onCreate(Bundle savedInstanceState){
|
protected void onCreate(Bundle savedInstanceState){
|
||||||
super.onCreate(savedInstanceState);
|
super.onCreate(savedInstanceState);
|
||||||
AndroidApplicationConfiguration config = new AndroidApplicationConfiguration();
|
if(doubleScaleTablets && isTablet(this.getContext())){
|
||||||
config.useImmersiveMode = true;
|
Scl.setAddition(0.5f);
|
||||||
config.depth = 0;
|
}
|
||||||
Platform.instance = new Platform(){
|
|
||||||
|
initialize(new ClientLauncher(){
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void hide(){
|
public void hide(){
|
||||||
@@ -67,44 +62,43 @@ public class AndroidLauncher extends AndroidApplication{
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
|
||||||
public void requestExternalPerms(Runnable callback){
|
|
||||||
if(Build.VERSION.SDK_INT < Build.VERSION_CODES.M || (checkSelfPermission(Manifest.permission.WRITE_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED &&
|
|
||||||
checkSelfPermission(Manifest.permission.READ_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED)){
|
|
||||||
callback.run();
|
|
||||||
}else{
|
|
||||||
permCallback = callback;
|
|
||||||
ArrayList<String> perms = new ArrayList<>();
|
|
||||||
if(checkSelfPermission(Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED){
|
|
||||||
perms.add(Manifest.permission.WRITE_EXTERNAL_STORAGE);
|
|
||||||
}
|
|
||||||
if(checkSelfPermission(Manifest.permission.READ_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED){
|
|
||||||
perms.add(Manifest.permission.READ_EXTERNAL_STORAGE);
|
|
||||||
}
|
|
||||||
requestPermissions(perms.toArray(new String[0]), PERMISSION_REQUEST_CODE);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void shareFile(FileHandle file){
|
public void shareFile(FileHandle file){
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void showFileChooser(String text, String content, Consumer<FileHandle> cons, boolean open, Predicate<String> filetype){
|
public void showFileChooser(boolean open, String extension, Consumer<FileHandle> cons){
|
||||||
chooser = new FileChooser(text, file -> filetype.test(file.extension().toLowerCase()), open, cons);
|
if(VERSION.SDK_INT >= 19){
|
||||||
if(Build.VERSION.SDK_INT < Build.VERSION_CODES.M || (checkSelfPermission(Manifest.permission.WRITE_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED &&
|
Intent intent = new Intent(open ? Intent.ACTION_OPEN_DOCUMENT : Intent.ACTION_CREATE_DOCUMENT);
|
||||||
checkSelfPermission(Manifest.permission.READ_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED)){
|
intent.addCategory(Intent.CATEGORY_OPENABLE);
|
||||||
chooser.show();
|
intent.setType("*/*");
|
||||||
chooser = null;
|
addResultListener(i -> startActivityForResult(intent, i), (code, in) -> {
|
||||||
|
if(code == Activity.RESULT_OK && in != null && in.getData() != null){
|
||||||
|
Uri uri = in.getData();
|
||||||
|
|
||||||
|
Core.app.post(() -> Core.app.post(() -> cons.accept(new FileHandle(uri.getPath()){
|
||||||
|
@Override
|
||||||
|
public InputStream read(){
|
||||||
|
try{
|
||||||
|
return getContentResolver().openInputStream(uri);
|
||||||
|
}catch(IOException e){
|
||||||
|
throw new ArcRuntimeException(e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public OutputStream write(boolean append){
|
||||||
|
try{
|
||||||
|
return getContentResolver().openOutputStream(uri);
|
||||||
|
}catch(IOException e){
|
||||||
|
throw new ArcRuntimeException(e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
})));
|
||||||
|
}
|
||||||
|
});
|
||||||
}else{
|
}else{
|
||||||
ArrayList<String> perms = new ArrayList<>();
|
super.showFileChooser(open, extension, cons);
|
||||||
if(checkSelfPermission(Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED){
|
|
||||||
perms.add(Manifest.permission.WRITE_EXTERNAL_STORAGE);
|
|
||||||
}
|
|
||||||
if(checkSelfPermission(Manifest.permission.READ_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED){
|
|
||||||
perms.add(Manifest.permission.READ_EXTERNAL_STORAGE);
|
|
||||||
}
|
|
||||||
requestPermissions(perms.toArray(new String[0]), PERMISSION_REQUEST_CODE);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -122,16 +116,11 @@ public class AndroidLauncher extends AndroidApplication{
|
|||||||
public boolean canDonate(){
|
public boolean canDonate(){
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
};
|
}, new AndroidApplicationConfiguration(){{
|
||||||
|
useImmersiveMode = true;
|
||||||
if(doubleScaleTablets && isTablet(this.getContext())){
|
depth = 0;
|
||||||
UnitScl.dp.addition = 0.5f;
|
hideStatusBar = true;
|
||||||
}
|
}});
|
||||||
|
|
||||||
config.hideStatusBar = true;
|
|
||||||
Net.setClientProvider(new ArcNetClient());
|
|
||||||
Net.setServerProvider(new ArcNetServer());
|
|
||||||
initialize(new Mindustry(), config);
|
|
||||||
checkFiles(getIntent());
|
checkFiles(getIntent());
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -179,10 +168,10 @@ public class AndroidLauncher extends AndroidApplication{
|
|||||||
SaveSlot slot = control.saves.importSave(file);
|
SaveSlot slot = control.saves.importSave(file);
|
||||||
ui.load.runLoadSave(slot);
|
ui.load.runLoadSave(slot);
|
||||||
}catch(IOException e){
|
}catch(IOException e){
|
||||||
ui.showError(Core.bundle.format("save.import.fail", Strings.parseException(e, true)));
|
ui.showException("$save.import.fail", e);
|
||||||
}
|
}
|
||||||
}else{
|
}else{
|
||||||
ui.showError("$save.import.invalid");
|
ui.showErrorMessage("$save.import.invalid");
|
||||||
}
|
}
|
||||||
}else if(map){ //open map
|
}else if(map){ //open map
|
||||||
FileHandle file = Core.files.local("temp-map." + mapExtension);
|
FileHandle file = Core.files.local("temp-map." + mapExtension);
|
||||||
|
|||||||
@@ -4,6 +4,11 @@ import java.lang.annotation.*;
|
|||||||
|
|
||||||
public class Annotations{
|
public class Annotations{
|
||||||
|
|
||||||
|
@Target(ElementType.TYPE)
|
||||||
|
@Retention(RetentionPolicy.SOURCE)
|
||||||
|
public @interface StyleDefaults {
|
||||||
|
}
|
||||||
|
|
||||||
/** Indicates that a method should always call its super version. */
|
/** Indicates that a method should always call its super version. */
|
||||||
@Target(ElementType.METHOD)
|
@Target(ElementType.METHOD)
|
||||||
@Retention(RetentionPolicy.SOURCE)
|
@Retention(RetentionPolicy.SOURCE)
|
||||||
|
|||||||
@@ -1,26 +1,22 @@
|
|||||||
package io.anuke.annotations;
|
package io.anuke.annotations;
|
||||||
|
|
||||||
import com.squareup.javapoet.*;
|
import com.squareup.javapoet.*;
|
||||||
|
import io.anuke.annotations.Annotations.*;
|
||||||
|
|
||||||
import javax.annotation.processing.AbstractProcessor;
|
import javax.annotation.processing.*;
|
||||||
import javax.annotation.processing.ProcessingEnvironment;
|
import javax.lang.model.*;
|
||||||
import javax.annotation.processing.RoundEnvironment;
|
import javax.lang.model.element.*;
|
||||||
import javax.annotation.processing.SupportedSourceVersion;
|
import javax.tools.Diagnostic.*;
|
||||||
import javax.lang.model.SourceVersion;
|
import javax.tools.*;
|
||||||
import javax.lang.model.element.Modifier;
|
import java.nio.file.*;
|
||||||
import javax.lang.model.element.TypeElement;
|
import java.util.*;
|
||||||
import javax.tools.Diagnostic.Kind;
|
|
||||||
import javax.tools.StandardLocation;
|
|
||||||
import java.nio.file.Files;
|
|
||||||
import java.nio.file.Paths;
|
|
||||||
import java.util.Collections;
|
|
||||||
import java.util.HashSet;
|
|
||||||
import java.util.Set;
|
|
||||||
|
|
||||||
@SupportedSourceVersion(SourceVersion.RELEASE_8)
|
@SupportedSourceVersion(SourceVersion.RELEASE_8)
|
||||||
|
@SupportedAnnotationTypes("io.anuke.annotations.Annotations.StyleDefaults")
|
||||||
public class AssetsAnnotationProcessor extends AbstractProcessor{
|
public class AssetsAnnotationProcessor extends AbstractProcessor{
|
||||||
/** Name of the base package to put all the generated classes. */
|
/** Name of the base package to put all the generated classes. */
|
||||||
private static final String packageName = "io.anuke.mindustry.gen";
|
private static final String packageName = "io.anuke.mindustry.gen";
|
||||||
|
private String path;
|
||||||
private int round;
|
private int round;
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -38,13 +34,13 @@ public class AssetsAnnotationProcessor extends AbstractProcessor{
|
|||||||
if(round++ != 0) return false; //only process 1 round
|
if(round++ != 0) return false; //only process 1 round
|
||||||
|
|
||||||
try{
|
try{
|
||||||
|
path = Paths.get(Utils.filer.createResource(StandardLocation.CLASS_OUTPUT, "no", "no")
|
||||||
String path = Paths.get(Utils.filer.createResource(StandardLocation.CLASS_OUTPUT, "no", "no")
|
|
||||||
.toUri().toURL().toString().substring(System.getProperty("os.name").contains("Windows") ? 6 : "file:".length()))
|
.toUri().toURL().toString().substring(System.getProperty("os.name").contains("Windows") ? 6 : "file:".length()))
|
||||||
.getParent().getParent().getParent().getParent().getParent().getParent().toString();
|
.getParent().getParent().getParent().getParent().getParent().getParent().toString();
|
||||||
|
|
||||||
process("Sounds", path + "/assets/sounds", "io.anuke.arc.audio.Sound", "newSound");
|
processSounds("Sounds", path + "/assets/sounds", "io.anuke.arc.audio.Sound");
|
||||||
process("Musics", path + "/assets/music", "io.anuke.arc.audio.Music", "newMusic");
|
processSounds("Musics", path + "/assets/music", "io.anuke.arc.audio.Music");
|
||||||
|
processUI(roundEnv.getElementsAnnotatedWith(StyleDefaults.class));
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}catch(Exception e){
|
}catch(Exception e){
|
||||||
@@ -53,15 +49,73 @@ public class AssetsAnnotationProcessor extends AbstractProcessor{
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
void processUI(Set<? extends Element> elements) throws Exception{
|
||||||
public Set<String> getSupportedAnnotationTypes() {
|
String[] iconSizes = {"small", "smaller", "tiny"};
|
||||||
return Collections.singleton("*");
|
|
||||||
|
TypeSpec.Builder type = TypeSpec.classBuilder("Tex").addModifiers(Modifier.PUBLIC);
|
||||||
|
TypeSpec.Builder ictype = TypeSpec.classBuilder("Icon").addModifiers(Modifier.PUBLIC);
|
||||||
|
MethodSpec.Builder load = MethodSpec.methodBuilder("load").addModifiers(Modifier.PUBLIC, Modifier.STATIC);
|
||||||
|
MethodSpec.Builder loadStyles = MethodSpec.methodBuilder("loadStyles").addModifiers(Modifier.PUBLIC, Modifier.STATIC);
|
||||||
|
MethodSpec.Builder icload = MethodSpec.methodBuilder("load").addModifiers(Modifier.PUBLIC, Modifier.STATIC);
|
||||||
|
String resources = path + "/assets-raw/sprites/ui";
|
||||||
|
Files.walk(Paths.get(resources)).forEach(p -> {
|
||||||
|
if(Files.isDirectory(p) || p.getFileName().toString().equals(".DS_Store")) return;
|
||||||
|
|
||||||
|
String filename = p.getFileName().toString();
|
||||||
|
filename = filename.substring(0, filename.indexOf("."));
|
||||||
|
|
||||||
|
ArrayList<String> names = new ArrayList<>();
|
||||||
|
names.add("");
|
||||||
|
if(filename.contains("icon")){
|
||||||
|
names.addAll(Arrays.asList(iconSizes));
|
||||||
}
|
}
|
||||||
|
|
||||||
void process(String classname, String path, String rtype, String loadMethod) throws Exception{
|
for(String suffix : names){
|
||||||
|
suffix = suffix.isEmpty() ? "" : "-" + suffix;
|
||||||
|
|
||||||
|
String sfilen = filename + suffix;
|
||||||
|
String dtype = p.getFileName().toString().endsWith(".9.png") ? "io.anuke.arc.scene.style.NinePatchDrawable" : "io.anuke.arc.scene.style.TextureRegionDrawable";
|
||||||
|
|
||||||
|
String varname = capitalize(sfilen);
|
||||||
|
TypeSpec.Builder ttype = type;
|
||||||
|
MethodSpec.Builder tload = load;
|
||||||
|
if(varname.startsWith("icon")){
|
||||||
|
varname = varname.substring("icon".length());
|
||||||
|
varname = Character.toLowerCase(varname.charAt(0)) + varname.substring(1);
|
||||||
|
ttype = ictype;
|
||||||
|
tload = icload;
|
||||||
|
if(SourceVersion.isKeyword(varname)) varname += "i";
|
||||||
|
}
|
||||||
|
|
||||||
|
if(SourceVersion.isKeyword(varname)) varname += "s";
|
||||||
|
|
||||||
|
ttype.addField(ClassName.bestGuess(dtype), varname, Modifier.STATIC, Modifier.PUBLIC);
|
||||||
|
tload.addStatement(varname + " = ("+dtype+")io.anuke.arc.Core.atlas.drawable($S)", sfilen);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
for(Element elem : elements){
|
||||||
|
TypeElement t = (TypeElement)elem;
|
||||||
|
t.getEnclosedElements().stream().filter(e -> e.getKind() == ElementKind.FIELD).forEach(field -> {
|
||||||
|
String fname = field.getSimpleName().toString();
|
||||||
|
if(fname.startsWith("default")){
|
||||||
|
loadStyles.addStatement("io.anuke.arc.Core.scene.addStyle(" + field.asType().toString() + ".class, io.anuke.mindustry.ui.Styles." + fname + ")");
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
ictype.addMethod(icload.build());
|
||||||
|
JavaFile.builder(packageName, ictype.build()).build().writeTo(Utils.filer);
|
||||||
|
|
||||||
|
type.addMethod(load.build());
|
||||||
|
type.addMethod(loadStyles.build());
|
||||||
|
JavaFile.builder(packageName, type.build()).build().writeTo(Utils.filer);
|
||||||
|
}
|
||||||
|
|
||||||
|
void processSounds(String classname, String path, String rtype) throws Exception{
|
||||||
TypeSpec.Builder type = TypeSpec.classBuilder(classname).addModifiers(Modifier.PUBLIC);
|
TypeSpec.Builder type = TypeSpec.classBuilder(classname).addModifiers(Modifier.PUBLIC);
|
||||||
MethodSpec.Builder load = MethodSpec.methodBuilder("load").addModifiers(Modifier.PUBLIC, Modifier.STATIC);
|
|
||||||
MethodSpec.Builder dispose = MethodSpec.methodBuilder("dispose").addModifiers(Modifier.PUBLIC, Modifier.STATIC);
|
MethodSpec.Builder dispose = MethodSpec.methodBuilder("dispose").addModifiers(Modifier.PUBLIC, Modifier.STATIC);
|
||||||
|
MethodSpec.Builder loadBegin = MethodSpec.methodBuilder("load").addModifiers(Modifier.PUBLIC, Modifier.STATIC);
|
||||||
|
|
||||||
HashSet<String> names = new HashSet<>();
|
HashSet<String> names = new HashSet<>();
|
||||||
Files.list(Paths.get(path)).forEach(p -> {
|
Files.list(Paths.get(path)).forEach(p -> {
|
||||||
@@ -79,20 +133,40 @@ public class AssetsAnnotationProcessor extends AbstractProcessor{
|
|||||||
name = name + "s";
|
name = name + "s";
|
||||||
}
|
}
|
||||||
|
|
||||||
load.addStatement(name + " = io.anuke.arc.Core.audio."+loadMethod+"(io.anuke.arc.Core.files.internal(io.anuke.arc.Core.app.getType() != io.anuke.arc.Application.ApplicationType.iOS ? $S : $S))",
|
String filepath = path.substring(path.lastIndexOf("/") + 1) + "/" + fname;
|
||||||
path.substring(path.lastIndexOf("/") + 1) + "/" + fname, (path.substring(path.lastIndexOf("/") + 1) + "/" + fname).replace(".ogg", ".mp3"));
|
|
||||||
|
String filename = "io.anuke.arc.Core.app.getType() != io.anuke.arc.Application.ApplicationType.iOS ? \"" + filepath + "\" : \"" + filepath.replace(".ogg", ".mp3")+"\"";
|
||||||
|
|
||||||
|
loadBegin.addStatement("io.anuke.arc.Core.assets.load("+filename +", "+rtype+".class).loaded = a -> " + name + " = ("+rtype+")a", filepath, filepath.replace(".ogg", ".mp3"));
|
||||||
|
|
||||||
dispose.addStatement(name + ".dispose()");
|
dispose.addStatement(name + ".dispose()");
|
||||||
dispose.addStatement(name + " = null");
|
dispose.addStatement(name + " = null");
|
||||||
type.addField(FieldSpec.builder(ClassName.bestGuess(rtype), name, Modifier.STATIC, Modifier.PUBLIC).initializer("new io.anuke.arc.audio.mock.Mock" + rtype.substring(rtype.lastIndexOf(".") + 1)+ "()").build());
|
type.addField(FieldSpec.builder(ClassName.bestGuess(rtype), name, Modifier.STATIC, Modifier.PUBLIC).initializer("new io.anuke.arc.audio.mock.Mock" + rtype.substring(rtype.lastIndexOf(".") + 1)+ "()").build());
|
||||||
//cons.consume(type, fname, name);
|
|
||||||
});
|
});
|
||||||
|
|
||||||
if(classname.equals("Sounds")){
|
if(classname.equals("Sounds")){
|
||||||
type.addField(FieldSpec.builder(ClassName.bestGuess(rtype), "none", Modifier.STATIC, Modifier.PUBLIC).initializer("new io.anuke.arc.audio.mock.Mock" + rtype.substring(rtype.lastIndexOf(".") + 1)+ "()").build());
|
type.addField(FieldSpec.builder(ClassName.bestGuess(rtype), "none", Modifier.STATIC, Modifier.PUBLIC).initializer("new io.anuke.arc.audio.mock.Mock" + rtype.substring(rtype.lastIndexOf(".") + 1)+ "()").build());
|
||||||
}
|
}
|
||||||
|
|
||||||
type.addMethod(load.build());
|
type.addMethod(loadBegin.build());
|
||||||
type.addMethod(dispose.build());
|
type.addMethod(dispose.build());
|
||||||
JavaFile.builder(packageName, type.build()).build().writeTo(Utils.filer);
|
JavaFile.builder(packageName, type.build()).build().writeTo(Utils.filer);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static String capitalize(String s){
|
||||||
|
StringBuilder result = new StringBuilder(s.length());
|
||||||
|
|
||||||
|
for(int i = 0; i < s.length(); i++){
|
||||||
|
char c = s.charAt(i);
|
||||||
|
if(c != '_' && c != '-'){
|
||||||
|
if(i > 0 && (s.charAt(i - 1) == '_' || s.charAt(i - 1) == '-')){
|
||||||
|
result.append(Character.toUpperCase(c));
|
||||||
|
}else{
|
||||||
|
result.append(c);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return result.toString();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -54,8 +54,20 @@ class CodeAnalyzerTreeScanner extends TreePathScanner<Object, Trees> {
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@SuppressWarnings("unchecked")
|
||||||
public boolean checkScope (Scope members) {
|
public boolean checkScope (Scope members) {
|
||||||
for (Symbol s : members.getElements()) {
|
Iterable<Symbol> it;
|
||||||
|
try{
|
||||||
|
it = (Iterable<Symbol>)members.getClass().getMethod("getElements").invoke(members);
|
||||||
|
}catch(Throwable t){
|
||||||
|
try{
|
||||||
|
it = (Iterable<Symbol>)members.getClass().getMethod("getSymbols").invoke(members);
|
||||||
|
}catch(Exception e){
|
||||||
|
throw new RuntimeException(e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
for (Symbol s : it) {
|
||||||
if (s instanceof MethodSymbol) {
|
if (s instanceof MethodSymbol) {
|
||||||
MethodSymbol ms = (MethodSymbol) s;
|
MethodSymbol ms = (MethodSymbol) s;
|
||||||
|
|
||||||
|
|||||||
@@ -118,7 +118,7 @@ public class RemoteReadGenerator{
|
|||||||
if(entry.forward && entry.where.isServer && needsPlayer){
|
if(entry.forward && entry.where.isServer && needsPlayer){
|
||||||
//call forwarded method
|
//call forwarded method
|
||||||
readBlock.addStatement(packageName + "." + entry.className + "." + entry.element.getSimpleName() +
|
readBlock.addStatement(packageName + "." + entry.className + "." + entry.element.getSimpleName() +
|
||||||
"__forward(player.con.id" + (varResult.length() == 0 ? "" : ", ") + varResult.toString() + ")");
|
"__forward(player.con" + (varResult.length() == 0 ? "" : ", ") + varResult.toString() + ")");
|
||||||
}
|
}
|
||||||
|
|
||||||
readBlock.nextControlFlow("catch (java.lang.Exception e)");
|
readBlock.nextControlFlow("catch (java.lang.Exception e)");
|
||||||
|
|||||||
@@ -85,19 +85,19 @@ public class RemoteWriteGenerator{
|
|||||||
|
|
||||||
//if toAll is false, it's a 'send to one player' variant, so add the player as a parameter
|
//if toAll is false, it's a 'send to one player' variant, so add the player as a parameter
|
||||||
if(!toAll){
|
if(!toAll){
|
||||||
method.addParameter(int.class, "playerClientID");
|
method.addParameter(ClassName.bestGuess("io.anuke.mindustry.net.NetConnection"), "playerConnection");
|
||||||
}
|
}
|
||||||
|
|
||||||
//add sender to ignore
|
//add sender to ignore
|
||||||
if(forwarded){
|
if(forwarded){
|
||||||
method.addParameter(int.class, "exceptSenderID");
|
method.addParameter(ClassName.bestGuess("io.anuke.mindustry.net.NetConnection"), "exceptConnection");
|
||||||
}
|
}
|
||||||
|
|
||||||
//call local method if applicable, shouldn't happen when forwarding method as that already happens by default
|
//call local method if applicable, shouldn't happen when forwarding method as that already happens by default
|
||||||
if(!forwarded && methodEntry.local != Loc.none){
|
if(!forwarded && methodEntry.local != Loc.none){
|
||||||
//add in local checks
|
//add in local checks
|
||||||
if(methodEntry.local != Loc.both){
|
if(methodEntry.local != Loc.both){
|
||||||
method.beginControlFlow("if(" + getCheckString(methodEntry.local) + " || !io.anuke.mindustry.net.Net.active())");
|
method.beginControlFlow("if(" + getCheckString(methodEntry.local) + " || !io.anuke.mindustry.Vars.net.active())");
|
||||||
}
|
}
|
||||||
|
|
||||||
//concatenate parameters
|
//concatenate parameters
|
||||||
@@ -159,7 +159,7 @@ public class RemoteWriteGenerator{
|
|||||||
boolean writePlayerSkipCheck = methodEntry.where == Loc.both && i == 0;
|
boolean writePlayerSkipCheck = methodEntry.where == Loc.both && i == 0;
|
||||||
|
|
||||||
if(writePlayerSkipCheck){ //write begin check
|
if(writePlayerSkipCheck){ //write begin check
|
||||||
method.beginControlFlow("if(io.anuke.mindustry.net.Net.server())");
|
method.beginControlFlow("if(io.anuke.mindustry.Vars.net.server())");
|
||||||
}
|
}
|
||||||
|
|
||||||
if(Utils.isPrimitive(typeName)){ //check if it's a primitive, and if so write it
|
if(Utils.isPrimitive(typeName)){ //check if it's a primitive, and if so write it
|
||||||
@@ -194,18 +194,18 @@ public class RemoteWriteGenerator{
|
|||||||
|
|
||||||
if(forwarded){ //forward packet
|
if(forwarded){ //forward packet
|
||||||
if(!methodEntry.local.isClient){ //if the client doesn't get it called locally, forward it back after validation
|
if(!methodEntry.local.isClient){ //if the client doesn't get it called locally, forward it back after validation
|
||||||
sendString = "send(";
|
sendString = "io.anuke.mindustry.Vars.net.send(";
|
||||||
}else{
|
}else{
|
||||||
sendString = "sendExcept(exceptSenderID, ";
|
sendString = "io.anuke.mindustry.Vars.net.sendExcept(exceptConnection, ";
|
||||||
}
|
}
|
||||||
}else if(toAll){ //send to all players / to server
|
}else if(toAll){ //send to all players / to server
|
||||||
sendString = "send(";
|
sendString = "io.anuke.mindustry.Vars.net.send(";
|
||||||
}else{ //send to specific client from server
|
}else{ //send to specific client from server
|
||||||
sendString = "sendTo(playerClientID, ";
|
sendString = "playerConnection.send(";
|
||||||
}
|
}
|
||||||
|
|
||||||
//send the actual packet
|
//send the actual packet
|
||||||
method.addStatement("io.anuke.mindustry.net.Net." + sendString + "packet, " +
|
method.addStatement(sendString + "packet, " +
|
||||||
(methodEntry.unreliable ? "io.anuke.mindustry.net.Net.SendMode.udp" : "io.anuke.mindustry.net.Net.SendMode.tcp") + ")");
|
(methodEntry.unreliable ? "io.anuke.mindustry.net.Net.SendMode.udp" : "io.anuke.mindustry.net.Net.SendMode.tcp") + ")");
|
||||||
|
|
||||||
|
|
||||||
@@ -217,8 +217,8 @@ public class RemoteWriteGenerator{
|
|||||||
}
|
}
|
||||||
|
|
||||||
private String getCheckString(Loc loc){
|
private String getCheckString(Loc loc){
|
||||||
return loc.isClient && loc.isServer ? "io.anuke.mindustry.net.Net.server() || io.anuke.mindustry.net.Net.client()" :
|
return loc.isClient && loc.isServer ? "io.anuke.mindustry.Vars.net.server() || io.anuke.mindustry.Vars.net.client()" :
|
||||||
loc.isClient ? "io.anuke.mindustry.net.Net.client()" :
|
loc.isClient ? "io.anuke.mindustry.Vars.net.client()" :
|
||||||
loc.isServer ? "io.anuke.mindustry.net.Net.server()" : "false";
|
loc.isServer ? "io.anuke.mindustry.Vars.net.server()" : "false";
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
37
build.gradle
@@ -16,14 +16,17 @@ buildscript{
|
|||||||
|
|
||||||
allprojects{
|
allprojects{
|
||||||
version = 'release'
|
version = 'release'
|
||||||
|
apply plugin: 'maven'
|
||||||
|
group = 'com.github.Anuken'
|
||||||
|
|
||||||
ext{
|
ext{
|
||||||
versionNumber = '4'
|
versionNumber = '4'
|
||||||
versionModifier = 'release'
|
if(!project.hasProperty("versionModifier")) versionModifier = 'release'
|
||||||
if(!project.hasProperty("versionType")) versionType = 'official'
|
if(!project.hasProperty("versionType")) versionType = 'official'
|
||||||
appName = 'Mindustry'
|
appName = 'Mindustry'
|
||||||
gdxVersion = '1.9.10'
|
gdxVersion = '1.9.10'
|
||||||
roboVMVersion = '2.3.7'
|
roboVMVersion = '2.3.7'
|
||||||
|
steamworksVersion = '1.8.0'
|
||||||
arcHash = null
|
arcHash = null
|
||||||
|
|
||||||
debugged = {
|
debugged = {
|
||||||
@@ -31,20 +34,11 @@ allprojects{
|
|||||||
}
|
}
|
||||||
|
|
||||||
localArc = {
|
localArc = {
|
||||||
return (!project.hasProperty("release")) && new File(projectDir.parent, '../Arc').exists()
|
return !project.hasProperty("release") && new File(projectDir.parent, '../Arc').exists()
|
||||||
}
|
}
|
||||||
|
|
||||||
getArcHash = {
|
getArcHash = {
|
||||||
//get latest commit hash from github since JITPack's '-snapshot' version doesn't work correctly
|
return new Properties().with{ p -> p.load(new File((File)projectDir, 'gradle.properties').newReader()); return p }["archash"]
|
||||||
if(arcHash == null){
|
|
||||||
try{
|
|
||||||
arcHash = 'git ls-remote https://github.com/Anuken/Arc.git'.execute().text.split("\t")[0]
|
|
||||||
}catch(e){
|
|
||||||
e.printStackTrace()
|
|
||||||
arcHash = "-SNAPSHOT"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return arcHash
|
|
||||||
}
|
}
|
||||||
|
|
||||||
arcModule = { String name ->
|
arcModule = { String name ->
|
||||||
@@ -119,6 +113,7 @@ allprojects{
|
|||||||
props.load(new FileInputStream(pfile))
|
props.load(new FileInputStream(pfile))
|
||||||
|
|
||||||
String buildid = getBuildVersion()
|
String buildid = getBuildVersion()
|
||||||
|
println("Compiling with build: '$buildid'")
|
||||||
|
|
||||||
props["type"] = versionType
|
props["type"] = versionType
|
||||||
props["number"] = versionNumber
|
props["number"] = versionNumber
|
||||||
@@ -147,13 +142,15 @@ project(":desktop"){
|
|||||||
|
|
||||||
dependencies{
|
dependencies{
|
||||||
compile project(":core")
|
compile project(":core")
|
||||||
compile project(":net")
|
|
||||||
|
|
||||||
if(debugged()) compile project(":debug")
|
if(debugged()) compile project(":debug")
|
||||||
|
|
||||||
compile "com.badlogicgames.gdx:gdx-platform:$gdxVersion:natives-desktop"
|
compile "com.badlogicgames.gdx:gdx-platform:$gdxVersion:natives-desktop"
|
||||||
compile "com.badlogicgames.gdx:gdx-freetype-platform:$gdxVersion:natives-desktop"
|
compile "com.badlogicgames.gdx:gdx-freetype-platform:$gdxVersion:natives-desktop"
|
||||||
|
|
||||||
|
compile "com.code-disaster.steamworks4j:steamworks4j:$steamworksVersion"
|
||||||
|
compile "com.code-disaster.steamworks4j:steamworks4j-server:$steamworksVersion"
|
||||||
|
|
||||||
compile arcModule("backends:backend-sdl")
|
compile arcModule("backends:backend-sdl")
|
||||||
compile 'com.github.MinnDevelopment:java-discord-rpc:v2.0.2'
|
compile 'com.github.MinnDevelopment:java-discord-rpc:v2.0.2'
|
||||||
}
|
}
|
||||||
@@ -172,7 +169,7 @@ project(":ios"){
|
|||||||
}
|
}
|
||||||
|
|
||||||
props['app.id'] = 'io.anuke.mindustry'
|
props['app.id'] = 'io.anuke.mindustry'
|
||||||
props['app.version'] = '4.0'
|
props['app.version'] = '4.2.1'
|
||||||
props['app.mainclass'] = 'io.anuke.mindustry.IOSLauncher'
|
props['app.mainclass'] = 'io.anuke.mindustry.IOSLauncher'
|
||||||
props['app.executable'] = 'IOSLauncher'
|
props['app.executable'] = 'IOSLauncher'
|
||||||
props['app.name'] = 'Mindustry'
|
props['app.name'] = 'Mindustry'
|
||||||
@@ -182,7 +179,6 @@ project(":ios"){
|
|||||||
|
|
||||||
dependencies{
|
dependencies{
|
||||||
compile project(":core")
|
compile project(":core")
|
||||||
compile project(":net")
|
|
||||||
compileOnly project(":annotations")
|
compileOnly project(":annotations")
|
||||||
|
|
||||||
compile arcModule("backends:backend-robovm")
|
compile arcModule("backends:backend-robovm")
|
||||||
@@ -198,7 +194,9 @@ project(":core"){
|
|||||||
apply plugin: "java"
|
apply plugin: "java"
|
||||||
|
|
||||||
task preGen{
|
task preGen{
|
||||||
|
outputs.upToDateWhen{ false }
|
||||||
generateLocales()
|
generateLocales()
|
||||||
|
writeVersion()
|
||||||
}
|
}
|
||||||
|
|
||||||
dependencies{
|
dependencies{
|
||||||
@@ -245,7 +243,6 @@ project(":server"){
|
|||||||
|
|
||||||
dependencies{
|
dependencies{
|
||||||
compile project(":core")
|
compile project(":core")
|
||||||
compile project(":net")
|
|
||||||
compile arcModule("backends:backend-headless")
|
compile arcModule("backends:backend-headless")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -290,14 +287,6 @@ project(":annotations"){
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
project(":net"){
|
|
||||||
apply plugin: "java"
|
|
||||||
|
|
||||||
dependencies{
|
|
||||||
compile project(":core")
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
task deployAll{
|
task deployAll{
|
||||||
task cleanDeployOutput{
|
task cleanDeployOutput{
|
||||||
doFirst{
|
doFirst{
|
||||||
|
|||||||
|
Before Width: | Height: | Size: 91 B After Width: | Height: | Size: 91 B |
BIN
core/assets-raw/sprites/ui/icons/icon-fdroid.png
Normal file
|
After Width: | Height: | Size: 1.7 KiB |
BIN
core/assets-raw/sprites/ui/icons/icon-workshop.png
Normal file
|
After Width: | Height: | Size: 3.9 KiB |
BIN
core/assets-raw/sprites/ui/nomap.png
Normal file
|
After Width: | Height: | Size: 6.7 KiB |
|
Before Width: | Height: | Size: 168 B After Width: | Height: | Size: 2.3 KiB |
8
core/assets-raw/sprites/zones/pack.json
Normal file
@@ -0,0 +1,8 @@
|
|||||||
|
{
|
||||||
|
duplicatePadding: true,
|
||||||
|
combineSubdirectories: true,
|
||||||
|
flattenPaths: true,
|
||||||
|
maxWidth: 2048,
|
||||||
|
maxHeight: 2048,
|
||||||
|
fast: true
|
||||||
|
}
|
||||||
|
Before Width: | Height: | Size: 9.7 KiB After Width: | Height: | Size: 9.7 KiB |
|
Before Width: | Height: | Size: 38 KiB After Width: | Height: | Size: 38 KiB |
|
Before Width: | Height: | Size: 8.0 KiB After Width: | Height: | Size: 8.0 KiB |
|
Before Width: | Height: | Size: 8.8 KiB After Width: | Height: | Size: 8.8 KiB |
|
Before Width: | Height: | Size: 7.2 KiB After Width: | Height: | Size: 7.2 KiB |
|
Before Width: | Height: | Size: 29 KiB After Width: | Height: | Size: 29 KiB |
|
Before Width: | Height: | Size: 15 KiB After Width: | Height: | Size: 15 KiB |
|
Before Width: | Height: | Size: 33 KiB After Width: | Height: | Size: 33 KiB |
|
Before Width: | Height: | Size: 19 KiB After Width: | Height: | Size: 19 KiB |
|
Before Width: | Height: | Size: 15 KiB After Width: | Height: | Size: 15 KiB |
|
Before Width: | Height: | Size: 17 KiB After Width: | Height: | Size: 17 KiB |
|
Before Width: | Height: | Size: 14 KiB After Width: | Height: | Size: 14 KiB |
@@ -17,6 +17,12 @@ gameover = Game Over
|
|||||||
gameover.pvp = The[accent] {0}[] team is victorious!
|
gameover.pvp = The[accent] {0}[] team is victorious!
|
||||||
highscore = [accent]New highscore!
|
highscore = [accent]New highscore!
|
||||||
|
|
||||||
|
load.sound = Sounds
|
||||||
|
load.map = Maps
|
||||||
|
load.image = Images
|
||||||
|
load.content = Content
|
||||||
|
load.system = System
|
||||||
|
|
||||||
stat.wave = Waves Defeated:[accent] {0}
|
stat.wave = Waves Defeated:[accent] {0}
|
||||||
stat.enemiesDestroyed = Enemies Destroyed:[accent] {0}
|
stat.enemiesDestroyed = Enemies Destroyed:[accent] {0}
|
||||||
stat.built = Buildings Built:[accent] {0}
|
stat.built = Buildings Built:[accent] {0}
|
||||||
@@ -46,8 +52,17 @@ close = Close
|
|||||||
website = Website
|
website = Website
|
||||||
quit = Quit
|
quit = Quit
|
||||||
maps = Maps
|
maps = Maps
|
||||||
|
maps.browse = Browse Maps
|
||||||
continue = Continue
|
continue = Continue
|
||||||
maps.none = [lightgray]No maps found!
|
maps.none = [lightgray]No maps found!
|
||||||
|
invalid = Invalid
|
||||||
|
preparingconfig = Preparing Config
|
||||||
|
preparingcontent = Preparing Content
|
||||||
|
uploadingcontent = Uploading Content
|
||||||
|
uploadingpreviewfile = Uploading Preview File
|
||||||
|
committingchanges = Comitting Changes
|
||||||
|
done = Done
|
||||||
|
|
||||||
about.button = About
|
about.button = About
|
||||||
name = Name:
|
name = Name:
|
||||||
noname = Pick a[accent] player name[] first.
|
noname = Pick a[accent] player name[] first.
|
||||||
@@ -58,14 +73,18 @@ techtree = Tech Tree
|
|||||||
research.list = [lightgray]Research:
|
research.list = [lightgray]Research:
|
||||||
research = Research
|
research = Research
|
||||||
researched = [lightgray]{0} researched.
|
researched = [lightgray]{0} researched.
|
||||||
players = {0} players online
|
players = {0} players
|
||||||
players.single = {0} player online
|
players.single = {0} player
|
||||||
server.closing = [accent]Closing server...
|
server.closing = [accent]Closing server...
|
||||||
server.kicked.kick = You have been kicked from the server!
|
server.kicked.kick = You have been kicked from the server!
|
||||||
|
server.kicked.whitelist = You are not whitelisted here.
|
||||||
server.kicked.serverClose = Server closed.
|
server.kicked.serverClose = Server closed.
|
||||||
|
server.kicked.vote = You have been vote-kicked. Goodbye.
|
||||||
server.kicked.clientOutdated = Outdated client! Update your game!
|
server.kicked.clientOutdated = Outdated client! Update your game!
|
||||||
server.kicked.serverOutdated = Outdated server! Ask the host to update!
|
server.kicked.serverOutdated = Outdated server! Ask the host to update!
|
||||||
server.kicked.banned = You are banned on this server.
|
server.kicked.banned = You are banned on this server.
|
||||||
|
server.kicked.typeMismatch = This server is not compatible with your build type.
|
||||||
|
server.kicked.playerLimit = This server is full. Wait for an empty slot.
|
||||||
server.kicked.recentKick = You have been kicked recently.\nWait before connecting again.
|
server.kicked.recentKick = You have been kicked recently.\nWait before connecting again.
|
||||||
server.kicked.nameInUse = There is someone with that name\nalready on this server.
|
server.kicked.nameInUse = There is someone with that name\nalready on this server.
|
||||||
server.kicked.nameEmpty = Your chosen name is invalid.
|
server.kicked.nameEmpty = Your chosen name is invalid.
|
||||||
@@ -76,11 +95,13 @@ server.versions = Your version:[accent] {0}[]\nServer version:[accent] {1}[]
|
|||||||
host.info = The [accent]host[] button hosts a server on port [scarlet]6567[]. \nAnybody on the same [lightgray]wifi or local network[] should be able to see your server in their server list.\n\nIf you want people to be able to connect from anywhere by IP, [accent]port forwarding[] is required.\n\n[lightgray]Note: If someone is experiencing trouble connecting to your LAN game, make sure you have allowed Mindustry access to your local network in your firewall settings. Note that public networks sometimes do not allow server discovery.
|
host.info = The [accent]host[] button hosts a server on port [scarlet]6567[]. \nAnybody on the same [lightgray]wifi or local network[] should be able to see your server in their server list.\n\nIf you want people to be able to connect from anywhere by IP, [accent]port forwarding[] is required.\n\n[lightgray]Note: If someone is experiencing trouble connecting to your LAN game, make sure you have allowed Mindustry access to your local network in your firewall settings. Note that public networks sometimes do not allow server discovery.
|
||||||
join.info = Here, you can enter a [accent]server IP[] to connect to, or discover [accent]local network[] servers to connect to.\nBoth LAN and WAN multiplayer is supported.\n\n[lightgray]Note: There is no automatic global server list; if you want to connect to someone by IP, you would need to ask the host for their IP.
|
join.info = Here, you can enter a [accent]server IP[] to connect to, or discover [accent]local network[] servers to connect to.\nBoth LAN and WAN multiplayer is supported.\n\n[lightgray]Note: There is no automatic global server list; if you want to connect to someone by IP, you would need to ask the host for their IP.
|
||||||
hostserver = Host Multiplayer Game
|
hostserver = Host Multiplayer Game
|
||||||
|
invitefriends = Invite Friends
|
||||||
hostserver.mobile = Host\nGame
|
hostserver.mobile = Host\nGame
|
||||||
host = Host
|
host = Host
|
||||||
hosting = [accent]Opening server...
|
hosting = [accent]Opening server...
|
||||||
hosts.refresh = Refresh
|
hosts.refresh = Refresh
|
||||||
hosts.discovering = Discovering LAN games
|
hosts.discovering = Discovering LAN games
|
||||||
|
hosts.discovering.any = Discovering games
|
||||||
server.refreshing = Refreshing server
|
server.refreshing = Refreshing server
|
||||||
hosts.none = [lightgray]No local games found!
|
hosts.none = [lightgray]No local games found!
|
||||||
host.invalid = [scarlet]Can't connect to host.
|
host.invalid = [scarlet]Can't connect to host.
|
||||||
@@ -101,7 +122,7 @@ server.edit = Edit Server
|
|||||||
server.outdated = [crimson]Outdated Server![]
|
server.outdated = [crimson]Outdated Server![]
|
||||||
server.outdated.client = [crimson]Outdated Client![]
|
server.outdated.client = [crimson]Outdated Client![]
|
||||||
server.version = [gray]v{0} {1}
|
server.version = [gray]v{0} {1}
|
||||||
server.custombuild = [yellow]Custom Build
|
server.custombuild = [accent]Custom Build
|
||||||
confirmban = Are you sure you want to ban this player?
|
confirmban = Are you sure you want to ban this player?
|
||||||
confirmkick = Are you sure you want to kick this player?
|
confirmkick = Are you sure you want to kick this player?
|
||||||
confirmunban = Are you sure you want to unban this player?
|
confirmunban = Are you sure you want to unban this player?
|
||||||
@@ -110,13 +131,17 @@ confirmunadmin = Are you sure you want to remove admin status from this player?
|
|||||||
joingame.title = Join Game
|
joingame.title = Join Game
|
||||||
joingame.ip = Address:
|
joingame.ip = Address:
|
||||||
disconnect = Disconnected.
|
disconnect = Disconnected.
|
||||||
|
disconnect.error = Connection error.
|
||||||
|
disconnect.closed = Connection closed.
|
||||||
|
disconnect.timeout = Timed out.
|
||||||
disconnect.data = Failed to load world data!
|
disconnect.data = Failed to load world data!
|
||||||
|
cantconnect = Unable to join game ([accent]{0}[]).
|
||||||
connecting = [accent]Connecting...
|
connecting = [accent]Connecting...
|
||||||
connecting.data = [accent]Loading world data...
|
connecting.data = [accent]Loading world data...
|
||||||
server.port = Port:
|
server.port = Port:
|
||||||
server.addressinuse = Address already in use!
|
server.addressinuse = Address already in use!
|
||||||
server.invalidport = Invalid port number!
|
server.invalidport = Invalid port number!
|
||||||
server.error = [crimson]Error hosting server: [accent]{0}
|
server.error = [crimson]Error hosting server.
|
||||||
save.old = This save is for an older version of the game, and can no longer be used.\n\n[lightgray]Save backwards compatibility will be implemented in the full 4.0 release.
|
save.old = This save is for an older version of the game, and can no longer be used.\n\n[lightgray]Save backwards compatibility will be implemented in the full 4.0 release.
|
||||||
save.new = New Save
|
save.new = New Save
|
||||||
save.overwrite = Are you sure you want to overwrite\nthis save slot?
|
save.overwrite = Are you sure you want to overwrite\nthis save slot?
|
||||||
@@ -143,7 +168,7 @@ off = Off
|
|||||||
save.autosave = Autosave: {0}
|
save.autosave = Autosave: {0}
|
||||||
save.map = Map: {0}
|
save.map = Map: {0}
|
||||||
save.wave = Wave {0}
|
save.wave = Wave {0}
|
||||||
save.difficulty = Difficulty: {0}
|
save.mode = Gamemode: {0}
|
||||||
save.date = Last Saved: {0}
|
save.date = Last Saved: {0}
|
||||||
save.playtime = Playtime: {0}
|
save.playtime = Playtime: {0}
|
||||||
warning = Warning.
|
warning = Warning.
|
||||||
@@ -156,6 +181,11 @@ cancel = Cancel
|
|||||||
openlink = Open Link
|
openlink = Open Link
|
||||||
copylink = Copy Link
|
copylink = Copy Link
|
||||||
back = Back
|
back = Back
|
||||||
|
data.export = Export Data
|
||||||
|
data.import = Import Data
|
||||||
|
data.exported = Data exported.
|
||||||
|
data.invalid = This isn't valid game data.
|
||||||
|
data.import.confirm = Importing external data will erase[scarlet] all[] your current game data.\n[accent]This cannot be undone![]\n\nOnce the data is imported, your game will exit immediately.
|
||||||
classic.export = Export Classic Data
|
classic.export = Export Classic Data
|
||||||
classic.export.text = [accent]Mindustry[] has just had a major update.\nClassic (v3.5 build 40) save or map data has been detected. Would you like to export these saves to your phone's home folder, for use in the Mindustry Classic app?
|
classic.export.text = [accent]Mindustry[] has just had a major update.\nClassic (v3.5 build 40) save or map data has been detected. Would you like to export these saves to your phone's home folder, for use in the Mindustry Classic app?
|
||||||
quit.confirm = Are you sure you want to quit?
|
quit.confirm = Are you sure you want to quit?
|
||||||
@@ -180,6 +210,11 @@ map.nospawn = This map does not have any cores for the player to spawn in! Add a
|
|||||||
map.nospawn.pvp = This map does not have any enemy cores for player to spawn into! Add[SCARLET] non-orange[] cores to this map in the editor.
|
map.nospawn.pvp = This map does not have any enemy cores for player to spawn into! Add[SCARLET] non-orange[] cores to this map in the editor.
|
||||||
map.nospawn.attack = This map does not have any enemy cores for player to attack! Add[SCARLET] red[] cores to this map in the editor.
|
map.nospawn.attack = This map does not have any enemy cores for player to attack! Add[SCARLET] red[] cores to this map in the editor.
|
||||||
map.invalid = Error loading map: corrupted or invalid map file.
|
map.invalid = Error loading map: corrupted or invalid map file.
|
||||||
|
map.publish.error = Error publishing map: {0}
|
||||||
|
map.publish.confirm = Are you sure you want to publish this map?\n\n[lightgray]Make sure you agree to the Workshop EULA first, or your maps will not show up!
|
||||||
|
eula = Steam EULA
|
||||||
|
map.publish = Map published.
|
||||||
|
map.publishing = [accent]Publishing map...
|
||||||
editor.brush = Brush
|
editor.brush = Brush
|
||||||
editor.openin = Open In Editor
|
editor.openin = Open In Editor
|
||||||
editor.oregen = Ore Generation
|
editor.oregen = Ore Generation
|
||||||
@@ -191,7 +226,9 @@ editor.waves = Waves:
|
|||||||
editor.rules = Rules:
|
editor.rules = Rules:
|
||||||
editor.generation = Generation:
|
editor.generation = Generation:
|
||||||
editor.ingame = Edit In-Game
|
editor.ingame = Edit In-Game
|
||||||
|
editor.publish.workshop = Publish On Workshop
|
||||||
editor.newmap = New Map
|
editor.newmap = New Map
|
||||||
|
workshop = Workshop
|
||||||
waves.title = Waves
|
waves.title = Waves
|
||||||
waves.remove = Remove
|
waves.remove = Remove
|
||||||
waves.never = <never>
|
waves.never = <never>
|
||||||
@@ -208,15 +245,17 @@ waves.invalid = Invalid waves in clipboard.
|
|||||||
waves.copied = Waves copied.
|
waves.copied = Waves copied.
|
||||||
waves.none = No enemies defined.\nNote that empty wave layouts will automatically be replaced with the default layout.
|
waves.none = No enemies defined.\nNote that empty wave layouts will automatically be replaced with the default layout.
|
||||||
editor.default = [lightgray]<Default>
|
editor.default = [lightgray]<Default>
|
||||||
|
details = Details...
|
||||||
edit = Edit...
|
edit = Edit...
|
||||||
editor.name = Name:
|
editor.name = Name:
|
||||||
editor.spawn = Spawn Unit
|
editor.spawn = Spawn Unit
|
||||||
editor.removeunit = Remove Unit
|
editor.removeunit = Remove Unit
|
||||||
editor.teams = Teams
|
editor.teams = Teams
|
||||||
editor.errorload = Error loading file:\n[accent]{0}
|
editor.errorload = Error loading file.
|
||||||
editor.errorsave = Error saving file:\n[accent]{0}
|
editor.errorsave = Error saving file.
|
||||||
editor.errorimage = That's an image, not a map. Don't go around changing extensions expecting it to work.\n\nIf you want to import a legacy map, use the 'import legacy map' button in the editor.
|
editor.errorimage = That's an image, not a map.\n\nIf you want to import a 3.5/build 40 map, use the 'Import Legacy Map' button in the editor.
|
||||||
editor.errorlegacy = This map is too old, and uses a legacy map format that is no longer supported.
|
editor.errorlegacy = This map is too old, and uses a legacy map format that is no longer supported.
|
||||||
|
editor.errornot = This is not a map file.
|
||||||
editor.errorheader = This map file is either not valid or corrupt.
|
editor.errorheader = This map file is either not valid or corrupt.
|
||||||
editor.errorname = Map has no name defined. Are you trying to load a save file?
|
editor.errorname = Map has no name defined. Are you trying to load a save file?
|
||||||
editor.update = Update
|
editor.update = Update
|
||||||
@@ -235,7 +274,7 @@ editor.importmap = Import Map
|
|||||||
editor.importmap.description = Import an already existing map
|
editor.importmap.description = Import an already existing map
|
||||||
editor.importfile = Import File
|
editor.importfile = Import File
|
||||||
editor.importfile.description = Import an external map file
|
editor.importfile.description = Import an external map file
|
||||||
editor.importimage = Import Legacy Image
|
editor.importimage = Import Legacy Map
|
||||||
editor.importimage.description = Import an external map image file
|
editor.importimage.description = Import an external map image file
|
||||||
editor.export = Export...
|
editor.export = Export...
|
||||||
editor.exportfile = Export File
|
editor.exportfile = Export File
|
||||||
@@ -249,6 +288,7 @@ editor.resizemap = Resize Map
|
|||||||
editor.mapname = Map Name:
|
editor.mapname = Map Name:
|
||||||
editor.overwrite = [accent]Warning!\nThis overwrites an existing map.
|
editor.overwrite = [accent]Warning!\nThis overwrites an existing map.
|
||||||
editor.overwrite.confirm = [scarlet]Warning![] A map with this name already exists. Are you sure you want to overwrite it?
|
editor.overwrite.confirm = [scarlet]Warning![] A map with this name already exists. Are you sure you want to overwrite it?
|
||||||
|
editor.exists = A map with this name already exists.
|
||||||
editor.selectmap = Select a map to load:
|
editor.selectmap = Select a map to load:
|
||||||
|
|
||||||
toolmode.replace = Replace
|
toolmode.replace = Replace
|
||||||
@@ -332,6 +372,7 @@ launch.skip.confirm = If you skip now, you will not be able to launch until late
|
|||||||
uncover = Uncover
|
uncover = Uncover
|
||||||
configure = Configure Loadout
|
configure = Configure Loadout
|
||||||
configure.locked = [lightgray]Unlock configuring loadout: Wave {0}.
|
configure.locked = [lightgray]Unlock configuring loadout: Wave {0}.
|
||||||
|
configure.invalid = Amount must be a number between 0 and {0}.
|
||||||
zone.unlocked = [lightgray]{0} unlocked.
|
zone.unlocked = [lightgray]{0} unlocked.
|
||||||
zone.requirement.complete = Wave {0} reached:\n{1} zone requirements met.
|
zone.requirement.complete = Wave {0} reached:\n{1} zone requirements met.
|
||||||
zone.config.complete = Wave {0} reached:\nLoadout config unlocked.
|
zone.config.complete = Wave {0} reached:\nLoadout config unlocked.
|
||||||
@@ -384,6 +425,7 @@ zone.impact0078.description = <insert description here>
|
|||||||
zone.crags.description = <insert description here>
|
zone.crags.description = <insert description here>
|
||||||
|
|
||||||
settings.language = Language
|
settings.language = Language
|
||||||
|
settings.data = Game Data
|
||||||
settings.reset = Reset to Defaults
|
settings.reset = Reset to Defaults
|
||||||
settings.rebind = Rebind
|
settings.rebind = Rebind
|
||||||
settings.controls = Controls
|
settings.controls = Controls
|
||||||
@@ -431,6 +473,7 @@ blocks.boosteffect = Boost Effect
|
|||||||
blocks.maxunits = Max Active Units
|
blocks.maxunits = Max Active Units
|
||||||
blocks.health = Health
|
blocks.health = Health
|
||||||
blocks.buildtime = Build Time
|
blocks.buildtime = Build Time
|
||||||
|
blocks.buildcost = Build Cost
|
||||||
blocks.inaccuracy = Inaccuracy
|
blocks.inaccuracy = Inaccuracy
|
||||||
blocks.shots = Shots
|
blocks.shots = Shots
|
||||||
blocks.reload = Shots/Second
|
blocks.reload = Shots/Second
|
||||||
@@ -443,6 +486,7 @@ bar.powerbalance = Power: {0}/s
|
|||||||
bar.poweramount = Power: {0}
|
bar.poweramount = Power: {0}
|
||||||
bar.poweroutput = Power Output: {0}
|
bar.poweroutput = Power Output: {0}
|
||||||
bar.items = Items: {0}
|
bar.items = Items: {0}
|
||||||
|
bar.capacity = Capacity: {0}
|
||||||
bar.liquid = Liquid
|
bar.liquid = Liquid
|
||||||
bar.heat = Heat
|
bar.heat = Heat
|
||||||
bar.power = Power
|
bar.power = Power
|
||||||
@@ -518,8 +562,10 @@ setting.mutemusic.name = Mute Music
|
|||||||
setting.sfxvol.name = SFX Volume
|
setting.sfxvol.name = SFX Volume
|
||||||
setting.mutesound.name = Mute Sound
|
setting.mutesound.name = Mute Sound
|
||||||
setting.crashreport.name = Send Anonymous Crash Reports
|
setting.crashreport.name = Send Anonymous Crash Reports
|
||||||
|
setting.savecreate.name = Auto-Create Saves
|
||||||
|
setting.publichost.name = Public Game Visibility
|
||||||
setting.chatopacity.name = Chat Opacity
|
setting.chatopacity.name = Chat Opacity
|
||||||
setting.playerchat.name = Display In-Game Chat
|
setting.playerchat.name = Display Player Bubble Chat
|
||||||
uiscale.reset = UI scale has been changed.\nPress "OK" to confirm this scale.\n[scarlet]Reverting and exiting in[accent] {0}[] seconds...
|
uiscale.reset = UI scale has been changed.\nPress "OK" to confirm this scale.\n[scarlet]Reverting and exiting in[accent] {0}[] seconds...
|
||||||
uiscale.cancel = Cancel & Exit
|
uiscale.cancel = Cancel & Exit
|
||||||
setting.bloom.name = Bloom
|
setting.bloom.name = Bloom
|
||||||
@@ -870,11 +916,11 @@ unit.lich.name = Lich
|
|||||||
unit.reaper.name = Reaper
|
unit.reaper.name = Reaper
|
||||||
tutorial.next = [lightgray]<Tap to continue>
|
tutorial.next = [lightgray]<Tap to continue>
|
||||||
tutorial.intro = You have entered the[scarlet] Mindustry Tutorial.[]\nBegin by[accent] mining copper[]. Tap a copper ore vein near your core to do this.\n\n[accent]{0}/{1} copper
|
tutorial.intro = You have entered the[scarlet] Mindustry Tutorial.[]\nBegin by[accent] mining copper[]. Tap a copper ore vein near your core to do this.\n\n[accent]{0}/{1} copper
|
||||||
tutorial.drill = Mining manually is inefficient.\n[accent]Drills []can mine automatically.\nClick the drill tab in the bottom right.\nSelect the[accent] mechanical drill[]. Place it on a copper vein by clicking.\n[accent]Right-click[] to stop building.
|
tutorial.drill = Mining manually is inefficient.\n[accent]Drills []can mine automatically.\nClick the drill tab in the bottom right.\nSelect the[accent] mechanical drill[]. Place it on a copper vein by clicking.\n[accent]Right-click[] to stop building, and[accent] Hold Ctrl while scrolling[] to zoom in and out.
|
||||||
tutorial.drill.mobile = Mining manually is inefficient.\n[accent]Drills []can mine automatically.\nTap the drill tab in the bottom right.\nSelect the[accent] mechanical drill[].\nPlace it on a copper vein by tapping, then press the[accent] checkmark[] below to confirm your selection.\nPress the[accent] X button[] to cancel placement.
|
tutorial.drill.mobile = Mining manually is inefficient.\n[accent]Drills []can mine automatically.\nTap the drill tab in the bottom right.\nSelect the[accent] mechanical drill[].\nPlace it on a copper vein by tapping, then press the[accent] checkmark[] below to confirm your selection.\nPress the[accent] X button[] to cancel placement.
|
||||||
tutorial.blockinfo = Each block has different stats. Each drill can only mine certain ores.\nTo check a block's info and stats,[accent] tap the "?" button while selecting it in the build menu.[]\n\n[accent]Access the Mechanical Drill's stats now.[]
|
tutorial.blockinfo = Each block has different stats. Each drill can only mine certain ores.\nTo check a block's info and stats,[accent] tap the "?" button while selecting it in the build menu.[]\n\n[accent]Access the Mechanical Drill's stats now.[]
|
||||||
tutorial.conveyor = [accent]Conveyors[] are used to transport items to the core.\nMake a line of conveyors from the drill to the core.\n[accent]Hold down the mouse to place in a line.[]\nHold[accent] CTRL[] while selecting a line to place diagonally.\n\n[accent]{0}/{1} conveyors placed in line\n[accent]0/1 items delivered
|
tutorial.conveyor = [accent]Conveyors[] are used to transport items to the core.\nMake a line of conveyors from the drill to the core.\n[accent]Hold down the mouse to place in a line.[]\nHold[accent] CTRL[] while selecting a line to place diagonally.\n\n[accent]Place 2 conveyors with the line tool, then deliver an item into the core.
|
||||||
tutorial.conveyor.mobile = [accent]Conveyors[] are used to transport items to the core.\nMake a line of conveyors from the drill to the core.\n[accent] Place in a line by holding down your finger for a few seconds[] and dragging in a direction.\n\n[accent]{0}/{1} conveyors placed in line\n[accent]0/1 items delivered
|
tutorial.conveyor.mobile = [accent]Conveyors[] are used to transport items to the core.\nMake a line of conveyors from the drill to the core.\n[accent] Place in a line by holding down your finger for a few seconds[] and dragging in a direction.\n\n[accent]Place 2 conveyors with the line tool, then deliver an item into the core.
|
||||||
tutorial.turret = Once an item enters your core, it can be used for building.\nKeep in mind that not all items can be used for building.\nItems that are not used for building, such as[accent] coal[] or[accent] scrap[], cannot be put into the core.\nDefensive structures must be built to repel the[lightgray] enemy[].\nBuild a[accent] duo turret[] near your base.
|
tutorial.turret = Once an item enters your core, it can be used for building.\nKeep in mind that not all items can be used for building.\nItems that are not used for building, such as[accent] coal[] or[accent] scrap[], cannot be put into the core.\nDefensive structures must be built to repel the[lightgray] enemy[].\nBuild a[accent] duo turret[] near your base.
|
||||||
tutorial.drillturret = Duo turrets require[accent] copper ammo []to shoot.\nPlace a drill near the turret.\nLead conveyors into the turret to supply it with copper.\n\n[accent]Ammo delivered: 0/1
|
tutorial.drillturret = Duo turrets require[accent] copper ammo []to shoot.\nPlace a drill near the turret.\nLead conveyors into the turret to supply it with copper.\n\n[accent]Ammo delivered: 0/1
|
||||||
tutorial.pause = During battle, you are able to[accent] pause the game.[]\nYou may queue buildings while paused.\n\n[accent]Press space to pause.
|
tutorial.pause = During battle, you are able to[accent] pause the game.[]\nYou may queue buildings while paused.\n\n[accent]Press space to pause.
|
||||||
@@ -889,7 +935,6 @@ tutorial.waves = The[lightgray] enemy[] approaches.\n\nDefend the core for 2 wav
|
|||||||
tutorial.waves.mobile = The[lightgray] enemy[] approaches.\n\nDefend the core for 2 waves. Your ship will automatically fire at enemies.\nBuild more turrets and drills. Mine more copper.
|
tutorial.waves.mobile = The[lightgray] enemy[] approaches.\n\nDefend the core for 2 waves. Your ship will automatically fire at enemies.\nBuild more turrets and drills. Mine more copper.
|
||||||
tutorial.launch = Once you reach a specific wave, you are able to[accent] launch the core[], leaving your defenses behind and[accent] obtaining all the resources in your core.[]\nThese resources can then be used to research new technology.\n\n[accent]Press the launch button.
|
tutorial.launch = Once you reach a specific wave, you are able to[accent] launch the core[], leaving your defenses behind and[accent] obtaining all the resources in your core.[]\nThese resources can then be used to research new technology.\n\n[accent]Press the launch button.
|
||||||
|
|
||||||
|
|
||||||
item.copper.description = The most basic structural material. Used extensively in all types of blocks.
|
item.copper.description = The most basic structural material. Used extensively in all types of blocks.
|
||||||
item.lead.description = A basic starter material. Used extensively in electronics and liquid transportation blocks.
|
item.lead.description = A basic starter material. Used extensively in electronics and liquid transportation blocks.
|
||||||
item.metaglass.description = A super-tough glass compound. Extensively used for liquid distribution and storage.
|
item.metaglass.description = A super-tough glass compound. Extensively used for liquid distribution and storage.
|
||||||
|
|||||||
@@ -16,6 +16,11 @@ screenshot.invalid = Map too large, potentially not enough memory for screenshot
|
|||||||
gameover = Konec hry
|
gameover = Konec hry
|
||||||
gameover.pvp = [accent] {0}[] Tým Vyhrál!
|
gameover.pvp = [accent] {0}[] Tým Vyhrál!
|
||||||
highscore = [accent]Nový Rekord!
|
highscore = [accent]Nový Rekord!
|
||||||
|
load.sound = Sounds
|
||||||
|
load.map = Maps
|
||||||
|
load.image = Images
|
||||||
|
load.content = Content
|
||||||
|
load.system = System
|
||||||
stat.wave = Waves Defeated:[accent] {0}
|
stat.wave = Waves Defeated:[accent] {0}
|
||||||
stat.enemiesDestroyed = Enemies Destroyed:[accent] {0}
|
stat.enemiesDestroyed = Enemies Destroyed:[accent] {0}
|
||||||
stat.built = Buildings Built:[accent] {0}
|
stat.built = Buildings Built:[accent] {0}
|
||||||
@@ -23,8 +28,6 @@ stat.destroyed = Buildings Destroyed:[accent] {0}
|
|||||||
stat.deconstructed = Buildings Deconstructed:[accent] {0}
|
stat.deconstructed = Buildings Deconstructed:[accent] {0}
|
||||||
stat.delivered = Resources Launched:
|
stat.delivered = Resources Launched:
|
||||||
stat.rank = Final Rank: [accent]{0}
|
stat.rank = Final Rank: [accent]{0}
|
||||||
placeline = You have selected a block.\nYou can[accent] place in a line[] by[accent] holding down your finger for a few seconds[] and dragging in a direction.\nTry it.
|
|
||||||
removearea = You have selected removal mode.\nYou can[accent] remove blocks in a rectangle[] by[accent] holding down your finger for a few seconds[] and dragging.\nTry it.
|
|
||||||
launcheditems = [accent]Launched Items
|
launcheditems = [accent]Launched Items
|
||||||
map.delete = Jsi si jistý že chceš smazat mapu "[accent]{0}[]"?
|
map.delete = Jsi si jistý že chceš smazat mapu "[accent]{0}[]"?
|
||||||
level.highscore = Nejvyšší skóre: [accent]{0}
|
level.highscore = Nejvyšší skóre: [accent]{0}
|
||||||
@@ -63,9 +66,11 @@ players.single = {0} hráč online
|
|||||||
server.closing = [accent]Zavírám server...
|
server.closing = [accent]Zavírám server...
|
||||||
server.kicked.kick = Byl jsi vykopnut ze serveru!
|
server.kicked.kick = Byl jsi vykopnut ze serveru!
|
||||||
server.kicked.serverClose = Server je zavřený.
|
server.kicked.serverClose = Server je zavřený.
|
||||||
|
server.kicked.vote = You have been vote-kicked. Goodbye.
|
||||||
server.kicked.clientOutdated = Zastaralý klient hry! Aktualizuj si hru!
|
server.kicked.clientOutdated = Zastaralý klient hry! Aktualizuj si hru!
|
||||||
server.kicked.serverOutdated = Zastaralý server! Řekni hostiteli o aktualizaci!
|
server.kicked.serverOutdated = Zastaralý server! Řekni hostiteli o aktualizaci!
|
||||||
server.kicked.banned = Jsi zabanován na tomto serveru.
|
server.kicked.banned = Jsi zabanován na tomto serveru.
|
||||||
|
server.kicked.typeMismatch = This server is not compatible with your build type.
|
||||||
server.kicked.recentKick = Před nedávnem jsi byl vykopnut.\nPočkej než se znovu připojíš.
|
server.kicked.recentKick = Před nedávnem jsi byl vykopnut.\nPočkej než se znovu připojíš.
|
||||||
server.kicked.nameInUse = Někdo se stejným jménem\nje aktuálně na serveru.
|
server.kicked.nameInUse = Někdo se stejným jménem\nje aktuálně na serveru.
|
||||||
server.kicked.nameEmpty = Tvé jméno je neplatné.
|
server.kicked.nameEmpty = Tvé jméno je neplatné.
|
||||||
@@ -156,6 +161,11 @@ cancel = Zrušit
|
|||||||
openlink = Otevřít Odkaz
|
openlink = Otevřít Odkaz
|
||||||
copylink = Zkopírovat Odkaz
|
copylink = Zkopírovat Odkaz
|
||||||
back = Zpět
|
back = Zpět
|
||||||
|
data.export = Export Data
|
||||||
|
data.import = Import Data
|
||||||
|
data.exported = Data exported.
|
||||||
|
data.invalid = This isn't valid game data.
|
||||||
|
data.import.confirm = Importing external data will erase[scarlet] all[] your current game data.\n[accent]This cannot be undone![]\n\nOnce the data is imported, your game will exit immediately.
|
||||||
classic.export = Export Classic Data
|
classic.export = Export Classic Data
|
||||||
classic.export.text = [accent]Mindustry[] has just had a major update.\nClassic (v3.5 build 40) save or map data has been detected. Would you like to export these saves to your phone's home folder, for use in the Mindustry Classic app?
|
classic.export.text = [accent]Mindustry[] has just had a major update.\nClassic (v3.5 build 40) save or map data has been detected. Would you like to export these saves to your phone's home folder, for use in the Mindustry Classic app?
|
||||||
quit.confirm = Jsi si jistý že chceš ukončit ?
|
quit.confirm = Jsi si jistý že chceš ukončit ?
|
||||||
@@ -376,6 +386,7 @@ zone.fungalPass.description = A transition area between high mountains and lower
|
|||||||
zone.impact0078.description = <insert description here>
|
zone.impact0078.description = <insert description here>
|
||||||
zone.crags.description = <insert description here>
|
zone.crags.description = <insert description here>
|
||||||
settings.language = Jazyk
|
settings.language = Jazyk
|
||||||
|
settings.data = Game Data
|
||||||
settings.reset = nastavit výchozí
|
settings.reset = nastavit výchozí
|
||||||
settings.rebind = Přenastavit
|
settings.rebind = Přenastavit
|
||||||
settings.controls = Ovládání
|
settings.controls = Ovládání
|
||||||
@@ -507,6 +518,7 @@ setting.mutemusic.name = Ztišit hudbu
|
|||||||
setting.sfxvol.name = SFX hlasitost
|
setting.sfxvol.name = SFX hlasitost
|
||||||
setting.mutesound.name = Ztišit zvuky
|
setting.mutesound.name = Ztišit zvuky
|
||||||
setting.crashreport.name = Poslat anonymní spis o zhroucení hry
|
setting.crashreport.name = Poslat anonymní spis o zhroucení hry
|
||||||
|
setting.savecreate.name = Auto-Create Saves
|
||||||
setting.chatopacity.name = Chat Opacity
|
setting.chatopacity.name = Chat Opacity
|
||||||
setting.playerchat.name = Display In-Game Chat
|
setting.playerchat.name = Display In-Game Chat
|
||||||
uiscale.reset = UI scale has been changed.\nPress "OK" to confirm this scale.\n[scarlet]Reverting and exiting in[accent] {0}[] settings...
|
uiscale.reset = UI scale has been changed.\nPress "OK" to confirm this scale.\n[scarlet]Reverting and exiting in[accent] {0}[] settings...
|
||||||
@@ -527,6 +539,7 @@ keybind.press.axis = Stiskni osu nebo klávesu...
|
|||||||
keybind.screenshot.name = Sníměk mapy
|
keybind.screenshot.name = Sníměk mapy
|
||||||
keybind.move_x.name = Pohyb na X
|
keybind.move_x.name = Pohyb na X
|
||||||
keybind.move_y.name = Pohyb na Y
|
keybind.move_y.name = Pohyb na Y
|
||||||
|
keybind.fullscreen.name = Toggle Fullscreen
|
||||||
keybind.select.name = Vybrat/Střílet
|
keybind.select.name = Vybrat/Střílet
|
||||||
keybind.diagonal_placement.name = Diagonal Placement
|
keybind.diagonal_placement.name = Diagonal Placement
|
||||||
keybind.pick.name = Pick Block
|
keybind.pick.name = Pick Block
|
||||||
@@ -790,6 +803,7 @@ block.blast-mixer.name = Výbušninový mixér
|
|||||||
block.solar-panel.name = Solární panel
|
block.solar-panel.name = Solární panel
|
||||||
block.solar-panel-large.name = Velký solární panel
|
block.solar-panel-large.name = Velký solární panel
|
||||||
block.oil-extractor.name = Ropný Extraktor
|
block.oil-extractor.name = Ropný Extraktor
|
||||||
|
block.command-center.name = Command Center
|
||||||
block.draug-factory.name = Draug Miner Drone Factory
|
block.draug-factory.name = Draug Miner Drone Factory
|
||||||
block.spirit-factory.name = Továrna na Spirit Drony
|
block.spirit-factory.name = Továrna na Spirit Drony
|
||||||
block.phantom-factory.name = Továrna na Fantom Drony
|
block.phantom-factory.name = Továrna na Fantom Drony
|
||||||
@@ -1012,6 +1026,7 @@ block.ripple.description = Velká artilérní střílna, která vystřelí něko
|
|||||||
block.cyclone.description = Velká rychle pálící střílna.
|
block.cyclone.description = Velká rychle pálící střílna.
|
||||||
block.spectre.description = Velká střílna, která vystřelí dva mocné projektily naráz.
|
block.spectre.description = Velká střílna, která vystřelí dva mocné projektily naráz.
|
||||||
block.meltdown.description = Velká střílna, která vystřelí mocný paprsek dalekého dosahu.
|
block.meltdown.description = Velká střílna, která vystřelí mocný paprsek dalekého dosahu.
|
||||||
|
block.command-center.description = Issues movement commands to allied units across the map.\nCauses units to patrol, attack an enemy core or retreat to the core/factory. When no enemy core is present, units will default to patrolling under the attack command.
|
||||||
block.draug-factory.description = Produces Draug mining drones.
|
block.draug-factory.description = Produces Draug mining drones.
|
||||||
block.spirit-factory.description = Produkuje lehké drony, kteří teží minerály a opravují budovy
|
block.spirit-factory.description = Produkuje lehké drony, kteří teží minerály a opravují budovy
|
||||||
block.phantom-factory.description = Produkuje pokročilé drony kteří jsou podstatně efektivnější jak spirit droni.
|
block.phantom-factory.description = Produkuje pokročilé drony kteří jsou podstatně efektivnější jak spirit droni.
|
||||||
|
|||||||
@@ -2,12 +2,12 @@ credits.text = Entwickelt von [ROYAL]Anuken[] - [SKY]anukendev@gmail.com[]\n\n[G
|
|||||||
credits = Danksagungen
|
credits = Danksagungen
|
||||||
contributors = Übersetzer und Mitwirkende
|
contributors = Übersetzer und Mitwirkende
|
||||||
discord = Trete dem Mindustry Discord bei!
|
discord = Trete dem Mindustry Discord bei!
|
||||||
link.discord.description = Der offizielle Mindustry Discord Chatroom
|
link.discord.description = Der offizielle Mindustry Discord-Chatroom
|
||||||
link.github.description = Quellcode des Spiels
|
link.github.description = Quellcode des Spiels
|
||||||
link.changelog.description = Liste der Änderungen
|
link.changelog.description = Liste der Änderungen
|
||||||
link.dev-builds.description = Entwicklungs-Builds (instabil)
|
link.dev-builds.description = Entwicklungs-Builds (instabil)
|
||||||
link.trello.description = Offizielles Trello Board für geplante Features
|
link.trello.description = Offizielles Trello Board für geplante Features
|
||||||
link.itch.io.description = itch.io Seite mit Downloads und der Web-Version des Spiels
|
link.itch.io.description = itch.io-Seite mit Downloads und der Web-Version des Spiels
|
||||||
link.google-play.description = Google Play Store Seite
|
link.google-play.description = Google Play Store Seite
|
||||||
link.wiki.description = Offizelles Mindustry Wiki
|
link.wiki.description = Offizelles Mindustry Wiki
|
||||||
linkfail = Fehler beim Öffnen des Links!\nDie URL wurde in die Zwischenablage kopiert.
|
linkfail = Fehler beim Öffnen des Links!\nDie URL wurde in die Zwischenablage kopiert.
|
||||||
@@ -16,24 +16,27 @@ screenshot.invalid = Karte zu groß! Eventuell nicht ausreichend Arbeitsspeicher
|
|||||||
gameover = Der Kern wurde zerstört.
|
gameover = Der Kern wurde zerstört.
|
||||||
gameover.pvp = Das[accent] {0}[] Team ist siegreich!
|
gameover.pvp = Das[accent] {0}[] Team ist siegreich!
|
||||||
highscore = [YELLOW] Neuer Highscore!
|
highscore = [YELLOW] Neuer Highscore!
|
||||||
stat.wave = Wellen Besiegt:[accent] {0}
|
load.sound = Sounds
|
||||||
stat.enemiesDestroyed = Gegner Zerstört:[accent] {0}
|
load.map = Maps
|
||||||
stat.built = Gebäude Gebaut:[accent] {0}
|
load.image = Images
|
||||||
stat.destroyed = Gebäude Zerstört:[accent] {0}
|
load.content = Content
|
||||||
stat.deconstructed = Gebäude Abgebaut:[accent] {0}
|
load.system = System
|
||||||
|
stat.wave = Wellen besiegt:[accent] {0}
|
||||||
|
stat.enemiesDestroyed = Gegner zerstört:[accent] {0}
|
||||||
|
stat.built = Gebäude gebaut:[accent] {0}
|
||||||
|
stat.destroyed = Gebäude zerstört:[accent] {0}
|
||||||
|
stat.deconstructed = Gebäude abgebaut:[accent] {0}
|
||||||
stat.delivered = Übertragene Ressourcen:
|
stat.delivered = Übertragene Ressourcen:
|
||||||
stat.rank = Finaler Rang: [accent]{0}
|
stat.rank = Finaler Rang: [accent]{0}
|
||||||
placeline = Du hast einen Block ausgewählt.\nDu kannst[accent] davon eine Reihe bauen,[] indem du[accent] wenige Sekunden mit einem Finger drückst[] und ihn in eine Richtung ziehst.\nVersuche es.
|
|
||||||
removearea = Du hast den Zerstörungsmodus ausgewählt.\nDu kannst[accent] Blöcke im Rechteck zerstören,[] indem du[accent] wenige Sekunden mit einem Finger drückst[] und ihn ziehst.\nVersuche es.
|
|
||||||
launcheditems = [accent]Übertragene Items
|
launcheditems = [accent]Übertragene Items
|
||||||
map.delete = Bist du sicher, dass du die Karte "[accent]{0}[]" löschen möchtest?
|
map.delete = Bist du sicher, dass du die Karte "[accent]{0}[]" löschen möchtest?
|
||||||
level.highscore = Highscore: [accent]{0}
|
level.highscore = Highscore: [accent]{0}
|
||||||
level.select = Level Auswahl
|
level.select = Level-Auswahl
|
||||||
level.mode = Spielmodus:
|
level.mode = Spielmodus:
|
||||||
showagain = Nächstes mal nicht mehr anzeigen
|
showagain = Nächstes Mal nicht mehr anzeigen
|
||||||
coreattack = < Die Basis wird angegriffen! >
|
coreattack = < Die Basis wird angegriffen! >
|
||||||
nearpoint = [[ [scarlet]SOFORT DEN DROPPOINT VERLASSEN[] ]\nVernichtung droht
|
nearpoint = [[ [scarlet]SOFORT DEN DROPPOINT VERLASSEN[] ]\nVernichtung droht
|
||||||
database = Core Database
|
database = Kern-Datenbank
|
||||||
savegame = Spiel speichern
|
savegame = Spiel speichern
|
||||||
loadgame = Spiel laden
|
loadgame = Spiel laden
|
||||||
joingame = Spiel beitreten
|
joingame = Spiel beitreten
|
||||||
@@ -63,18 +66,20 @@ players.single = {0} Spieler online
|
|||||||
server.closing = [accent]Schließe den Server ...
|
server.closing = [accent]Schließe den Server ...
|
||||||
server.kicked.kick = Du wurdest vom Server gekickt!
|
server.kicked.kick = Du wurdest vom Server gekickt!
|
||||||
server.kicked.serverClose = Server geschlossen.
|
server.kicked.serverClose = Server geschlossen.
|
||||||
|
server.kicked.vote = You have been vote-kicked. Goodbye.
|
||||||
server.kicked.clientOutdated = Veralteter Client! Aktualisiere dein Spiel!
|
server.kicked.clientOutdated = Veralteter Client! Aktualisiere dein Spiel!
|
||||||
server.kicked.serverOutdated = Veralteter Server! Bitte den Host um ein Update!
|
server.kicked.serverOutdated = Veralteter Server! Bitte den Host um ein Update!
|
||||||
server.kicked.banned = Du wurdest vom Server verbannt.
|
server.kicked.banned = Du wurdest vom Server verbannt.
|
||||||
|
server.kicked.typeMismatch = This server is not compatible with your build type.
|
||||||
server.kicked.recentKick = Du wurdest gerade gekickt.\nWarte bevor du dich wieder verbindest.
|
server.kicked.recentKick = Du wurdest gerade gekickt.\nWarte bevor du dich wieder verbindest.
|
||||||
server.kicked.nameInUse = Es ist bereits ein Spieler \nmit diesem Namen auf dem Server.
|
server.kicked.nameInUse = Es ist bereits ein Spieler \nmit diesem Namen auf dem Server.
|
||||||
server.kicked.nameEmpty = Dein Name muss mindestens einen Buchstaben oder eine Zahl enthalten.
|
server.kicked.nameEmpty = Dein Name muss mindestens einen Buchstaben oder eine Zahl enthalten.
|
||||||
server.kicked.idInUse = Du bist bereits auf dem Server! Anmeldungen mit zwei Accounts sind nicht gestattet.
|
server.kicked.idInUse = Du bist bereits auf dem Server! Anmeldungen mit zwei Accounts sind nicht gestattet.
|
||||||
server.kicked.customClient = Der Server akzeptiert keine Custom Builds von Mindustry. Lade dir die offizielle Version herunter.
|
server.kicked.customClient = Der Server akzeptiert keine Custom Builds von Mindustry. Lade dir die offizielle Version herunter.
|
||||||
server.kicked.gameover = Game Over!
|
server.kicked.gameover = Game Over!
|
||||||
server.versions = Your version:[accent] {0}[]\nServer version:[accent] {1}[]
|
server.versions = Deine Version:[accent] {0}[]\nServerversion:[accent] {1}[]
|
||||||
host.info = Der [accent]host[] Knopf startet einen Server auf den Ports [scarlet]6567[] und [scarlet]6568.[]\nJeder im gleichen [LIGHT_GRAY]W-Lan oder lokalem Netzwerk[] sollte deinen Server in seiner Server Liste sehen können.\n\nWenn du Leuten die Verbindung über IP ermöglichen willst, benötigst du [accent]Port-Forwarding[].\n\n[LIGHT_GRAY]Hinweis: Falls es Probleme mit der Verbindung im Netzwerk gibt, stell sicher, dass Mindustry in deinen Firewall Einstellungen Zugriff auf das lokale Netzwerk hat.
|
host.info = Der [accent]host[]-Knopf startet einen Server auf den Ports [scarlet]6567[] und [scarlet]6568.[]\nJeder im gleichen [LIGHT_GRAY]W-Lan oder lokalem Netzwerk[] sollte deinen Server in seiner Server Liste sehen können.\n\nWenn du Leuten die Verbindung über IP ermöglichen willst, benötigst du [accent]Port-Forwarding[].\n\n[LIGHT_GRAY]Hinweis: Falls es Probleme mit der Verbindung im Netzwerk gibt, stell sicher, dass Mindustry in deinen Firewall Einstellungen Zugriff auf das lokale Netzwerk hat.
|
||||||
join.info = Hier kannst du eine [accent]Server IP[] eingeben um dich zu verbinden oder Server im [accent]lokalem Netzwerk[] entdecken und dich mit ihnen verbinden.\nSowohl Spielen über das lokale Netzwerk als auch Spielen über das Internet werden unterstützt.\n\n[LIGHT_GRAY]Hinweis: Es gibt keine globale Server Liste; Wenn du dich mit jemand per IP verbinden willst musst du den Host nach seiner IP fragen.
|
join.info = Hier kannst du eine [accent]Server-IP[] eingeben um dich zu verbinden oder Server im [accent]lokalem Netzwerk[] entdecken und dich mit ihnen verbinden.\nSowohl Spielen über das lokale Netzwerk als auch Spielen über das Internet werden unterstützt.\n\n[LIGHT_GRAY]Hinweis: Es gibt keine globale Server Liste; Wenn du dich mit jemand per IP verbinden willst musst du den Host nach seiner IP fragen.
|
||||||
hostserver = Server hosten
|
hostserver = Server hosten
|
||||||
hostserver.mobile = Host\nSpiel
|
hostserver.mobile = Host\nSpiel
|
||||||
host = Host
|
host = Host
|
||||||
@@ -82,7 +87,7 @@ hosting = [accent] Server wird geöffnet...
|
|||||||
hosts.refresh = Aktualisieren
|
hosts.refresh = Aktualisieren
|
||||||
hosts.discovering = Suche nach LAN-Spielen
|
hosts.discovering = Suche nach LAN-Spielen
|
||||||
server.refreshing = Server wird aktualisiert
|
server.refreshing = Server wird aktualisiert
|
||||||
hosts.none = [lightgray] Keine LAN Spiele gefunden!
|
hosts.none = [lightgray] Keine LAN-Spiele gefunden!
|
||||||
host.invalid = [scarlet] Kann keine Verbindung zum Host herstellen.
|
host.invalid = [scarlet] Kann keine Verbindung zum Host herstellen.
|
||||||
trace = Spieler verfolgen
|
trace = Spieler verfolgen
|
||||||
trace.playername = Spielername: [accent]{0}
|
trace.playername = Spielername: [accent]{0}
|
||||||
@@ -90,7 +95,7 @@ trace.ip = IP: [accent]{0}
|
|||||||
trace.id = Eindeutige ID: [accent]{0}
|
trace.id = Eindeutige ID: [accent]{0}
|
||||||
trace.mobile = Mobiler Client: [accent]{0}
|
trace.mobile = Mobiler Client: [accent]{0}
|
||||||
trace.modclient = Gemoddeter Client: [accent]{0}
|
trace.modclient = Gemoddeter Client: [accent]{0}
|
||||||
invalidid = Ungültige Client ID! Berichte den Bug.
|
invalidid = Ungültige Client-ID! Berichte den Bug.
|
||||||
server.bans = Bans
|
server.bans = Bans
|
||||||
server.bans.none = Keine gebannten Spieler gefunden!
|
server.bans.none = Keine gebannten Spieler gefunden!
|
||||||
server.admins = Admins
|
server.admins = Admins
|
||||||
@@ -156,6 +161,11 @@ cancel = Abbruch
|
|||||||
openlink = Link öffnen
|
openlink = Link öffnen
|
||||||
copylink = Kopiere Link
|
copylink = Kopiere Link
|
||||||
back = Zurück
|
back = Zurück
|
||||||
|
data.export = Export Data
|
||||||
|
data.import = Import Data
|
||||||
|
data.exported = Data exported.
|
||||||
|
data.invalid = This isn't valid game data.
|
||||||
|
data.import.confirm = Importing external data will erase[scarlet] all[] your current game data.\n[accent]This cannot be undone![]\n\nOnce the data is imported, your game will exit immediately.
|
||||||
classic.export = Export Classic Data
|
classic.export = Export Classic Data
|
||||||
classic.export.text = [accent]Mindustry[] has just had a major update.\nClassic (v3.5 build 40) save or map data has been detected. Would you like to export these saves to your phone's home folder, for use in the Mindustry Classic app?
|
classic.export.text = [accent]Mindustry[] has just had a major update.\nClassic (v3.5 build 40) save or map data has been detected. Would you like to export these saves to your phone's home folder, for use in the Mindustry Classic app?
|
||||||
quit.confirm = Willst du wirklich aufhören?
|
quit.confirm = Willst du wirklich aufhören?
|
||||||
@@ -320,7 +330,7 @@ zone.requirement = Welle {0} in Zone {1}
|
|||||||
resume = Zu Zone zurückkehren:\n[LIGHT_GRAY]{0}
|
resume = Zu Zone zurückkehren:\n[LIGHT_GRAY]{0}
|
||||||
bestwave = [LIGHT_GRAY]Beste Welle: {0}
|
bestwave = [LIGHT_GRAY]Beste Welle: {0}
|
||||||
launch = Abschluss
|
launch = Abschluss
|
||||||
launch.title = Abschluss Erfolgreich
|
launch.title = Abschluss erfolgreich
|
||||||
launch.next = [LIGHT_GRAY]Nächste Möglichkeit bei Welle {0}
|
launch.next = [LIGHT_GRAY]Nächste Möglichkeit bei Welle {0}
|
||||||
launch.unable2 = [scarlet]Unable to LAUNCH.[]
|
launch.unable2 = [scarlet]Unable to LAUNCH.[]
|
||||||
launch.confirm = Dies wird alle Ressourcen in deinen Kern übertragen.\nDu kannst nicht wieder zu dieser Karte zurückkehren.
|
launch.confirm = Dies wird alle Ressourcen in deinen Kern übertragen.\nDu kannst nicht wieder zu dieser Karte zurückkehren.
|
||||||
@@ -344,7 +354,7 @@ error.timedout = Zeitüberschreitung!\nStelle sicher, dass die Portweiterleitung
|
|||||||
error.mismatch = Paketfehler:\nClient und Server passen möglicherweise nicht zusammen.\nStelle sicher, dass du und der Host jeweils die neueste Version von Mindustry haben!
|
error.mismatch = Paketfehler:\nClient und Server passen möglicherweise nicht zusammen.\nStelle sicher, dass du und der Host jeweils die neueste Version von Mindustry haben!
|
||||||
error.alreadyconnected = Bereits verbunden.
|
error.alreadyconnected = Bereits verbunden.
|
||||||
error.mapnotfound = Kartendatei nicht gefunden!
|
error.mapnotfound = Kartendatei nicht gefunden!
|
||||||
error.io = Netzwerk I/O Fehler.
|
error.io = Netzwerk-Ein-/Ausgabe-Fehler.
|
||||||
error.any = Unbekannter Netzwerkfehler.
|
error.any = Unbekannter Netzwerkfehler.
|
||||||
error.bloom = Bloom konnte nicht initialisiert werden.\nEs kann sein, dass dein Gerät es nicht unterstützt.
|
error.bloom = Bloom konnte nicht initialisiert werden.\nEs kann sein, dass dein Gerät es nicht unterstützt.
|
||||||
zone.groundZero.name = Ground Zero
|
zone.groundZero.name = Ground Zero
|
||||||
@@ -376,6 +386,7 @@ zone.fungalPass.description = A transition area between high mountains and lower
|
|||||||
zone.impact0078.description = <Beschreibung hier einfügen>
|
zone.impact0078.description = <Beschreibung hier einfügen>
|
||||||
zone.crags.description = <Beschreibung hier einfügen>
|
zone.crags.description = <Beschreibung hier einfügen>
|
||||||
settings.language = Sprache
|
settings.language = Sprache
|
||||||
|
settings.data = Game Data
|
||||||
settings.reset = Auf Standard zurücksetzen
|
settings.reset = Auf Standard zurücksetzen
|
||||||
settings.rebind = Zuweisen
|
settings.rebind = Zuweisen
|
||||||
settings.controls = Steuerung
|
settings.controls = Steuerung
|
||||||
@@ -393,7 +404,7 @@ no = Nein
|
|||||||
info.title = [accent]Info
|
info.title = [accent]Info
|
||||||
error.title = [crimson] Ein Fehler ist aufgetreten
|
error.title = [crimson] Ein Fehler ist aufgetreten
|
||||||
error.crashtitle = Ein Fehler ist aufgetreten!
|
error.crashtitle = Ein Fehler ist aufgetreten!
|
||||||
attackpvponly = [scarlet]Nur in Angriff oder PvP Modus verfügbar.
|
attackpvponly = [scarlet]Nur in Angriff oder PvP-Modus verfügbar.
|
||||||
blocks.input = Input
|
blocks.input = Input
|
||||||
blocks.output = Output
|
blocks.output = Output
|
||||||
blocks.booster = Verstärkung
|
blocks.booster = Verstärkung
|
||||||
@@ -507,6 +518,7 @@ setting.mutemusic.name = Musik stummschalten
|
|||||||
setting.sfxvol.name = Audioeffekt-Lautstärke
|
setting.sfxvol.name = Audioeffekt-Lautstärke
|
||||||
setting.mutesound.name = Audioeffekte stummschalten
|
setting.mutesound.name = Audioeffekte stummschalten
|
||||||
setting.crashreport.name = Anonyme Absturzberichte senden
|
setting.crashreport.name = Anonyme Absturzberichte senden
|
||||||
|
setting.savecreate.name = Auto-Create Saves
|
||||||
setting.chatopacity.name = Chat Deckkraft
|
setting.chatopacity.name = Chat Deckkraft
|
||||||
setting.playerchat.name = Chat im Spiel anzeigen
|
setting.playerchat.name = Chat im Spiel anzeigen
|
||||||
uiscale.reset = UI-Skalierung wurde geändert.\nDrücke "OK", um diese Skalierung zu bestätigen.\n[scarlet]Zurückkehren und Beenden in[accent] {0}[] Einstellungen...
|
uiscale.reset = UI-Skalierung wurde geändert.\nDrücke "OK", um diese Skalierung zu bestätigen.\n[scarlet]Zurückkehren und Beenden in[accent] {0}[] Einstellungen...
|
||||||
@@ -527,6 +539,7 @@ keybind.press.axis = Drücke eine Taste oder bewege eine Achse...
|
|||||||
keybind.screenshot.name = Karten Screenshot
|
keybind.screenshot.name = Karten Screenshot
|
||||||
keybind.move_x.name = X-Achse
|
keybind.move_x.name = X-Achse
|
||||||
keybind.move_y.name = Y-Achse
|
keybind.move_y.name = Y-Achse
|
||||||
|
keybind.fullscreen.name = Toggle Fullscreen
|
||||||
keybind.select.name = Auswählen/Schießen
|
keybind.select.name = Auswählen/Schießen
|
||||||
keybind.diagonal_placement.name = Diagonal platzieren
|
keybind.diagonal_placement.name = Diagonal platzieren
|
||||||
keybind.pick.name = Block Auswählen
|
keybind.pick.name = Block Auswählen
|
||||||
@@ -646,28 +659,28 @@ mech.buildspeed = [LIGHT_GRAY]Baugeschwindigkeit: {0}%
|
|||||||
liquid.heatcapacity = [LIGHT_GRAY]Wärmekapazität: {0}
|
liquid.heatcapacity = [LIGHT_GRAY]Wärmekapazität: {0}
|
||||||
liquid.viscosity = [LIGHT_GRAY]Viskosität: {0}
|
liquid.viscosity = [LIGHT_GRAY]Viskosität: {0}
|
||||||
liquid.temperature = [LIGHT_GRAY]Temperatur: {0}
|
liquid.temperature = [LIGHT_GRAY]Temperatur: {0}
|
||||||
block.sand-boulder.name = Sand Brocken
|
block.sand-boulder.name = Sandbrocken
|
||||||
block.grass.name = Gras
|
block.grass.name = Gras
|
||||||
block.salt.name = Salz
|
block.salt.name = Salz
|
||||||
block.saltrocks.name = Salz Gestein
|
block.saltrocks.name = Salzgestein
|
||||||
block.pebbles.name = Geröll
|
block.pebbles.name = Geröll
|
||||||
block.tendrils.name = Ranken
|
block.tendrils.name = Ranken
|
||||||
block.sandrocks.name = Sandstein
|
block.sandrocks.name = Sandstein
|
||||||
block.spore-pine.name = Sporen Kiefer
|
block.spore-pine.name = Kiefernsporen
|
||||||
block.sporerocks.name = Sporen Gestein
|
block.sporerocks.name = Gesteinssporen
|
||||||
block.rock.name = Gestein
|
block.rock.name = Gestein
|
||||||
block.snowrock.name = Schnee Gestein
|
block.snowrock.name = Schnee-Gestein
|
||||||
block.snow-pine.name = Schnee Kiefer
|
block.snow-pine.name = Schnee-Kiefer
|
||||||
block.shale.name = Schiefer
|
block.shale.name = Schiefer
|
||||||
block.shale-boulder.name = Schiefer Geröll
|
block.shale-boulder.name = Schiefergeröll
|
||||||
block.moss.name = Moos
|
block.moss.name = Moos
|
||||||
block.shrubs.name = Gestrüpp
|
block.shrubs.name = Gestrüpp
|
||||||
block.spore-moss.name = Sporen Moos
|
block.spore-moss.name = Moossporen
|
||||||
block.shalerocks.name = Schiefer Gestein
|
block.shalerocks.name = Schiefer-Gestein
|
||||||
block.scrap-wall.name = Schrott Mauer
|
block.scrap-wall.name = Schrottmauer
|
||||||
block.scrap-wall-large.name = Große Schrott Mauer
|
block.scrap-wall-large.name = Große Schrottmauer
|
||||||
block.scrap-wall-huge.name = Riesige Schrott Mauer
|
block.scrap-wall-huge.name = Riesige Schrottmauer
|
||||||
block.scrap-wall-gigantic.name = Gigantische Schrott Mauer
|
block.scrap-wall-gigantic.name = Gigantische Schrottmauer
|
||||||
block.thruster.name = Schubdüse
|
block.thruster.name = Schubdüse
|
||||||
block.kiln.name = Brennofen
|
block.kiln.name = Brennofen
|
||||||
block.graphite-press.name = Graphit-Presse
|
block.graphite-press.name = Graphit-Presse
|
||||||
@@ -689,23 +702,23 @@ block.ice.name = Eis
|
|||||||
block.snow.name = Schnee
|
block.snow.name = Schnee
|
||||||
block.craters.name = Krater
|
block.craters.name = Krater
|
||||||
block.sand-water.name = Sandiges Wasser
|
block.sand-water.name = Sandiges Wasser
|
||||||
block.darksand-water.name = Dunkles Sandiges Wasser
|
block.darksand-water.name = Dunkles sandiges Wasser
|
||||||
block.char.name = Holzkohle
|
block.char.name = Holzkohle
|
||||||
block.holostone.name = Holo Stein
|
block.holostone.name = Holo-Stein
|
||||||
block.ice-snow.name = Eisschnee
|
block.ice-snow.name = Eisschnee
|
||||||
block.rocks.name = Felsen
|
block.rocks.name = Felsen
|
||||||
block.icerocks.name = Eis Felsen
|
block.icerocks.name = Eis-Felsen
|
||||||
block.snowrocks.name = Schnee Felsen
|
block.snowrocks.name = Schnee-Felsen
|
||||||
block.dunerocks.name = Dünen Felsen
|
block.dunerocks.name = Dünen-Felsen
|
||||||
block.pine.name = Kiefer
|
block.pine.name = Kiefer
|
||||||
block.white-tree-dead.name = Weißer Toter Baum
|
block.white-tree-dead.name = Weißer toter Baum
|
||||||
block.white-tree.name = Weißer Baum
|
block.white-tree.name = Weißer Baum
|
||||||
block.spore-cluster.name = Sporen Cluster
|
block.spore-cluster.name = Sporen-Cluster
|
||||||
block.metal-floor.name = Metallboden
|
block.metal-floor.name = Metallboden
|
||||||
block.metal-floor-2.name = Metallboden 2
|
block.metal-floor-2.name = Metallboden 2
|
||||||
block.metal-floor-3.name = Metallboden 3
|
block.metal-floor-3.name = Metallboden 3
|
||||||
block.metal-floor-5.name = Metallboden 5
|
block.metal-floor-5.name = Metallboden 5
|
||||||
block.metal-floor-damaged.name = Metallboden Beschädigt
|
block.metal-floor-damaged.name = beschädigter Metallboden
|
||||||
block.dark-panel-1.name = Dunkles Panel 1
|
block.dark-panel-1.name = Dunkles Panel 1
|
||||||
block.dark-panel-2.name = Dunkles Panel 2
|
block.dark-panel-2.name = Dunkles Panel 2
|
||||||
block.dark-panel-3.name = Dunkles Panel 3
|
block.dark-panel-3.name = Dunkles Panel 3
|
||||||
@@ -713,9 +726,9 @@ block.dark-panel-4.name = Dunkles Panel 4
|
|||||||
block.dark-panel-5.name = Dunkles Panel 5
|
block.dark-panel-5.name = Dunkles Panel 5
|
||||||
block.dark-panel-6.name = Dunkles Panel 6
|
block.dark-panel-6.name = Dunkles Panel 6
|
||||||
block.dark-metal.name = Dunkles Metall
|
block.dark-metal.name = Dunkles Metall
|
||||||
block.ignarock.name = Igna Felsen
|
block.ignarock.name = Igna-Felsen
|
||||||
block.hotrock.name = Heißer Felsen
|
block.hotrock.name = Heißer Felsen
|
||||||
block.magmarock.name = Magma Felsen
|
block.magmarock.name = Magma-Felsen
|
||||||
block.cliffs.name = Klippen
|
block.cliffs.name = Klippen
|
||||||
block.copper-wall.name = Kupfermauer
|
block.copper-wall.name = Kupfermauer
|
||||||
block.copper-wall-large.name = Große Kupfermauer
|
block.copper-wall-large.name = Große Kupfermauer
|
||||||
@@ -725,8 +738,8 @@ block.phase-wall.name = Phasenmauer
|
|||||||
block.phase-wall-large.name = Große Phasenmauer
|
block.phase-wall-large.name = Große Phasenmauer
|
||||||
block.thorium-wall.name = Thorium-Mauer
|
block.thorium-wall.name = Thorium-Mauer
|
||||||
block.thorium-wall-large.name = Große Thorium-Mauer
|
block.thorium-wall-large.name = Große Thorium-Mauer
|
||||||
block.door.name = Tür
|
block.door.name = Tor
|
||||||
block.door-large.name = Große Tür
|
block.door-large.name = Großes Tor
|
||||||
block.duo.name = Duo
|
block.duo.name = Duo
|
||||||
block.scorch.name = Flammenwerfer
|
block.scorch.name = Flammenwerfer
|
||||||
block.scatter.name = Scatter
|
block.scatter.name = Scatter
|
||||||
@@ -745,12 +758,12 @@ block.pulverizer.name = Pulverisierer
|
|||||||
block.cryofluidmixer.name = Kryoflüssigkeitsmixer
|
block.cryofluidmixer.name = Kryoflüssigkeitsmixer
|
||||||
block.melter.name = Schmelzer
|
block.melter.name = Schmelzer
|
||||||
block.incinerator.name = Verbrennungsanlage
|
block.incinerator.name = Verbrennungsanlage
|
||||||
block.spore-press.name = Sporen Presse
|
block.spore-press.name = Sporenpresse
|
||||||
block.separator.name = Separator
|
block.separator.name = Separator
|
||||||
block.coal-centrifuge.name = Kohlen Zentrifuge
|
block.coal-centrifuge.name = Kohlenzentrifuge
|
||||||
block.power-node.name = Stromknoten
|
block.power-node.name = Stromknoten
|
||||||
block.power-node-large.name = Großer Stromknoten
|
block.power-node-large.name = Großer Stromknoten
|
||||||
block.surge-tower.name = Schwall Turm
|
block.surge-tower.name = Schwall-Turm
|
||||||
block.battery.name = Batterie
|
block.battery.name = Batterie
|
||||||
block.battery-large.name = Große Batterie
|
block.battery-large.name = Große Batterie
|
||||||
block.combustion-generator.name = Verbrennungsgenerator
|
block.combustion-generator.name = Verbrennungsgenerator
|
||||||
@@ -762,13 +775,13 @@ block.pneumatic-drill.name = Pneumatischer Bohrer
|
|||||||
block.laser-drill.name = Laser-Bohrer
|
block.laser-drill.name = Laser-Bohrer
|
||||||
block.water-extractor.name = Wasser-Extraktor
|
block.water-extractor.name = Wasser-Extraktor
|
||||||
block.cultivator.name = Kultivierer
|
block.cultivator.name = Kultivierer
|
||||||
block.dart-mech-pad.name = Dart Mech Pad
|
block.dart-mech-pad.name = Dart Mech-Pad
|
||||||
block.delta-mech-pad.name = Delta Mech Pad
|
block.delta-mech-pad.name = Delta Mech-Pad
|
||||||
block.javelin-ship-pad.name = Javelin Luftschiff Pad
|
block.javelin-ship-pad.name = Javelin Luftschiff-Pad
|
||||||
block.trident-ship-pad.name = Trident Luftschiff Pad
|
block.trident-ship-pad.name = Trident Luftschiff-Pad
|
||||||
block.glaive-ship-pad.name = Glaive Luftschiff Pad
|
block.glaive-ship-pad.name = Glaive Luftschiff-Pad
|
||||||
block.omega-mech-pad.name = Omega Mech Pad
|
block.omega-mech-pad.name = Omega Mech-Pad
|
||||||
block.tau-mech-pad.name = Tau Mech Pad
|
block.tau-mech-pad.name = Tau Mech-Pad
|
||||||
block.conduit.name = Leitungsrohr
|
block.conduit.name = Leitungsrohr
|
||||||
block.mechanical-pump.name = Mechanische Pumpe
|
block.mechanical-pump.name = Mechanische Pumpe
|
||||||
block.item-source.name = Materialquelle
|
block.item-source.name = Materialquelle
|
||||||
@@ -787,10 +800,11 @@ block.bridge-conveyor.name = Brücken-Transportband
|
|||||||
block.plastanium-compressor.name = Plastanium-Verdichter
|
block.plastanium-compressor.name = Plastanium-Verdichter
|
||||||
block.pyratite-mixer.name = Pyratit-Mixer
|
block.pyratite-mixer.name = Pyratit-Mixer
|
||||||
block.blast-mixer.name = Sprengmixer
|
block.blast-mixer.name = Sprengmixer
|
||||||
block.solar-panel.name = Solar Panel
|
block.solar-panel.name = Solarpanel
|
||||||
block.solar-panel-large.name = Großes Solar Panel
|
block.solar-panel-large.name = Großes Solarpanel
|
||||||
block.oil-extractor.name = Öl Extraktor
|
block.oil-extractor.name = Öl-Extraktor
|
||||||
block.draug-factory.name = Draug Miner Drone Factory
|
block.command-center.name = Command Center
|
||||||
|
block.draug-factory.name = Draug Miner-Drohnenfactory
|
||||||
block.spirit-factory.name = Spirit-Drohnenfabrik
|
block.spirit-factory.name = Spirit-Drohnenfabrik
|
||||||
block.phantom-factory.name = Phantom-Drohnenfabrik
|
block.phantom-factory.name = Phantom-Drohnenfabrik
|
||||||
block.wraith-factory.name = Wraith Fighter-Fabrik
|
block.wraith-factory.name = Wraith Fighter-Fabrik
|
||||||
@@ -814,8 +828,8 @@ block.blast-drill.name = Sprengbohrer
|
|||||||
block.thermal-pump.name = Thermische Pumpe
|
block.thermal-pump.name = Thermische Pumpe
|
||||||
block.thermal-generator.name = Thermischer Generator
|
block.thermal-generator.name = Thermischer Generator
|
||||||
block.alloy-smelter.name = Legierungsschmelze
|
block.alloy-smelter.name = Legierungsschmelze
|
||||||
block.mender.name = Heiler
|
block.mender.name = Reparateur
|
||||||
block.mend-projector.name = Heilprojektor
|
block.mend-projector.name = Reparaturprojektor
|
||||||
block.surge-wall.name = Spannungsstoß-Mauer
|
block.surge-wall.name = Spannungsstoß-Mauer
|
||||||
block.surge-wall-large.name = Große Spannungsstoß-Mauer
|
block.surge-wall-large.name = Große Spannungsstoß-Mauer
|
||||||
block.cyclone.name = Zyklon
|
block.cyclone.name = Zyklon
|
||||||
@@ -824,12 +838,12 @@ block.shock-mine.name = Schock-Mine
|
|||||||
block.overdrive-projector.name = Beschleunigungs-Projektor
|
block.overdrive-projector.name = Beschleunigungs-Projektor
|
||||||
block.force-projector.name = Kraftfeld-Projektor
|
block.force-projector.name = Kraftfeld-Projektor
|
||||||
block.arc.name = Arcus
|
block.arc.name = Arcus
|
||||||
block.rtg-generator.name = RTG Generator
|
block.rtg-generator.name = RTG-Generator
|
||||||
block.spectre.name = Phantom
|
block.spectre.name = Phantom
|
||||||
block.meltdown.name = Meltdown
|
block.meltdown.name = Meltdown
|
||||||
block.container.name = Container
|
block.container.name = Container
|
||||||
block.launch-pad.name = Launch Pad
|
block.launch-pad.name = Launchpad
|
||||||
block.launch-pad-large.name = Großes Launch Pad
|
block.launch-pad-large.name = Großes Launchpad
|
||||||
team.blue.name = Blau
|
team.blue.name = Blau
|
||||||
team.crux.name = red
|
team.crux.name = red
|
||||||
team.sharded.name = orange
|
team.sharded.name = orange
|
||||||
@@ -837,14 +851,14 @@ team.orange.name = Orange
|
|||||||
team.derelict.name = derelict
|
team.derelict.name = derelict
|
||||||
team.green.name = Grün
|
team.green.name = Grün
|
||||||
team.purple.name = Lila
|
team.purple.name = Lila
|
||||||
unit.spirit.name = Spirit Drohne
|
unit.spirit.name = Spirit-Drohne
|
||||||
unit.draug.name = Draug Miner Drone
|
unit.draug.name = Draug Miner-Drone
|
||||||
unit.phantom.name = Phantom Drohne
|
unit.phantom.name = Phantom-Drohne
|
||||||
unit.dagger.name = Dagger
|
unit.dagger.name = Dagger
|
||||||
unit.crawler.name = Crawler
|
unit.crawler.name = Crawler
|
||||||
unit.titan.name = Titan
|
unit.titan.name = Titan
|
||||||
unit.ghoul.name = Ghoul Bomber
|
unit.ghoul.name = Ghoul-Bomber
|
||||||
unit.wraith.name = Wraith Fighter
|
unit.wraith.name = Wraith-Fighter
|
||||||
unit.fortress.name = Fortress
|
unit.fortress.name = Fortress
|
||||||
unit.revenant.name = Revenant
|
unit.revenant.name = Revenant
|
||||||
unit.eruptor.name = Eruptor
|
unit.eruptor.name = Eruptor
|
||||||
@@ -874,10 +888,10 @@ tutorial.waves.mobile = The[lightgray] enemy[] approaches.\n\nDefend the core fo
|
|||||||
tutorial.launch = Once you reach a specific wave, you are able to[accent] launch the core[], leaving your defenses behind and[accent] obtaining all the resources in your core.[]\nThese resources can then be used to research new technology.\n\n[accent]Press the launch button.
|
tutorial.launch = Once you reach a specific wave, you are able to[accent] launch the core[], leaving your defenses behind and[accent] obtaining all the resources in your core.[]\nThese resources can then be used to research new technology.\n\n[accent]Press the launch button.
|
||||||
item.copper.description = Ein nützliches Material. Wird in allen Arten von Blöcken verwendet.
|
item.copper.description = Ein nützliches Material. Wird in allen Arten von Blöcken verwendet.
|
||||||
item.lead.description = Ein grundlegendes Material. Häufig in Elektronik und Flüssigkeits-Transport-Blöcken verwendet.
|
item.lead.description = Ein grundlegendes Material. Häufig in Elektronik und Flüssigkeits-Transport-Blöcken verwendet.
|
||||||
item.metaglass.description = Eine super harte Glasmischung. Wird zur Verteilung und Lagerung von Flüssigkeiten benutzt.
|
item.metaglass.description = Eine extrem harte Glasmischung. Wird zur Verteilung und Lagerung von Flüssigkeiten benutzt.
|
||||||
item.graphite.description = Mineralisierter Kohlenstoff Wird für Munition und elektrische Isolierung verwendet.
|
item.graphite.description = Mineralisierter Kohlenstoff Wird für Munition und elektrische Isolierung verwendet.
|
||||||
item.sand.description = Ein gängiges Material, welches häufig in geschmolzener Form, flüssig oder als Legierung verwendet wird.
|
item.sand.description = Ein gängiges Material, welches häufig in geschmolzener Form, flüssig oder als Legierung verwendet wird.
|
||||||
item.coal.description = Ein sehr häufiger vorkommender Kraftstoff.
|
item.coal.description = Ein sehr häufig vorkommender Kraftstoff.
|
||||||
item.titanium.description = Ein seltenes, sehr leichtes Metall. Häufig in Flüssigkeits-Transport-Blöcken, Abbauanlagen und Luftschiffen verwendet.
|
item.titanium.description = Ein seltenes, sehr leichtes Metall. Häufig in Flüssigkeits-Transport-Blöcken, Abbauanlagen und Luftschiffen verwendet.
|
||||||
item.thorium.description = Ein dichtes radioaktives Metall, welches als strukturelle Unterstützung und nuklearer Kraftstoff verwendet wird.
|
item.thorium.description = Ein dichtes radioaktives Metall, welches als strukturelle Unterstützung und nuklearer Kraftstoff verwendet wird.
|
||||||
item.scrap.description = Überreste alter Gebäude und Einheiten. Enthalten Spuren verschiedener Metalle.
|
item.scrap.description = Überreste alter Gebäude und Einheiten. Enthalten Spuren verschiedener Metalle.
|
||||||
@@ -993,8 +1007,8 @@ block.oil-extractor.description = Verwendet große Mengen an Strom, um Öl aus S
|
|||||||
block.core-shard.description = Die erste Version der Kernkapsel. Einmal zerstört, ist jeglicher Kontakt zur Region verloren. Lass das nicht zu.
|
block.core-shard.description = Die erste Version der Kernkapsel. Einmal zerstört, ist jeglicher Kontakt zur Region verloren. Lass das nicht zu.
|
||||||
block.core-foundation.description = Die zweite Version des Kerns. Besser gepanzert. Speichert mehr Ressourcen.
|
block.core-foundation.description = Die zweite Version des Kerns. Besser gepanzert. Speichert mehr Ressourcen.
|
||||||
block.core-nucleus.description = Die dritte und letzte Version der Kernkapsel. Sehr gut gepanzert. Speichert enorme Mengen an Ressourcen.
|
block.core-nucleus.description = Die dritte und letzte Version der Kernkapsel. Sehr gut gepanzert. Speichert enorme Mengen an Ressourcen.
|
||||||
block.vault.description = Speichert eine große Menge an Materialien pro Typ. Benachbarte Container, Tresore und Basen werden zu einem Behälter zusammengefasst. Ein[LIGHT_GRAY] Entlader[] kann verwendet werden, um Materialien auszuladen.
|
block.vault.description = Speichert eine große Menge an Materialien pro Typ. Ein[LIGHT_GRAY] Entlader[] kann verwendet werden, um Materialien auszuladen.
|
||||||
block.container.description = Speichert eine kleine Menge an Materialien pro Typ. Benachbarte Container, Tresore und Basen werden zu einem Behälter zusammengefasst. Ein[LIGHT_GRAY] Entlader[] kann verwendet werden, um Materialien auszuladen.
|
block.container.description = Speichert eine kleine Menge an Materialien pro Typ. Ein[LIGHT_GRAY] Entlader[] kann verwendet werden, um Materialien auszuladen.
|
||||||
block.unloader.description = Entlädt Materialien aus einem Container, Tresor oder einer Basis auf ein Förderband oder direkt in einen benachbarten Block. Der Typ des auszuladenden Materials kann durch darauf tippen verändert werden.
|
block.unloader.description = Entlädt Materialien aus einem Container, Tresor oder einer Basis auf ein Förderband oder direkt in einen benachbarten Block. Der Typ des auszuladenden Materials kann durch darauf tippen verändert werden.
|
||||||
block.launch-pad.description = Startet Stapel von Items, ohne dass ein Kernstart erforderlich ist. Unvollendet.
|
block.launch-pad.description = Startet Stapel von Items, ohne dass ein Kernstart erforderlich ist. Unvollendet.
|
||||||
block.launch-pad-large.description = Eine verbesserte Version des Launchpads. Speichert weitere Items. Wird häufiger gestartet.
|
block.launch-pad-large.description = Eine verbesserte Version des Launchpads. Speichert weitere Items. Wird häufiger gestartet.
|
||||||
@@ -1012,6 +1026,7 @@ block.ripple.description = Ein großer Artillerie-Geschützturm, der mehrere Sch
|
|||||||
block.cyclone.description = Ein großer Schnellfeuer-Geschützturm.
|
block.cyclone.description = Ein großer Schnellfeuer-Geschützturm.
|
||||||
block.spectre.description = Ein großer Geschützturm, der zwei starke Schüsse gleichzeitig abfeuert.
|
block.spectre.description = Ein großer Geschützturm, der zwei starke Schüsse gleichzeitig abfeuert.
|
||||||
block.meltdown.description = Ein großer Geschützturm, der starke Strahlen mit großer Reichweite abfeuert.
|
block.meltdown.description = Ein großer Geschützturm, der starke Strahlen mit großer Reichweite abfeuert.
|
||||||
|
block.command-center.description = Issues movement commands to allied units across the map.\nCauses units to patrol, attack an enemy core or retreat to the core/factory. When no enemy core is present, units will default to patrolling under the attack command.
|
||||||
block.draug-factory.description = Produziert Draug-Mining-Drohnen.
|
block.draug-factory.description = Produziert Draug-Mining-Drohnen.
|
||||||
block.spirit-factory.description = Produziert leichte Drohnen, die Erz abbauen und Blöcke reparieren können.
|
block.spirit-factory.description = Produziert leichte Drohnen, die Erz abbauen und Blöcke reparieren können.
|
||||||
block.phantom-factory.description = Produziert erweiterte Drohnen, die deutlich effizienter sind als Spirit-Drohnen.
|
block.phantom-factory.description = Produziert erweiterte Drohnen, die deutlich effizienter sind als Spirit-Drohnen.
|
||||||
|
|||||||
@@ -16,6 +16,11 @@ screenshot.invalid = Maailm liiga suur, tõenäoliselt pole piisavalt mälu salv
|
|||||||
gameover = Mäng Läbi
|
gameover = Mäng Läbi
|
||||||
gameover.pvp = [accent] {0}[] tiim võitis!
|
gameover.pvp = [accent] {0}[] tiim võitis!
|
||||||
highscore = [accent]Uus rekord!
|
highscore = [accent]Uus rekord!
|
||||||
|
load.sound = Sounds
|
||||||
|
load.map = Maps
|
||||||
|
load.image = Images
|
||||||
|
load.content = Content
|
||||||
|
load.system = System
|
||||||
stat.wave = Raund:[accent] {0}
|
stat.wave = Raund:[accent] {0}
|
||||||
stat.enemiesDestroyed = Vaenlasi hävitatud:[accent] {0}
|
stat.enemiesDestroyed = Vaenlasi hävitatud:[accent] {0}
|
||||||
stat.built = Ehitisi ehitatud:[accent] {0}
|
stat.built = Ehitisi ehitatud:[accent] {0}
|
||||||
@@ -23,8 +28,6 @@ stat.destroyed = Ehitisi hävitatud:[accent] {0}
|
|||||||
stat.deconstructed = Ehitisi lahtivõetud:[accent] {0}
|
stat.deconstructed = Ehitisi lahtivõetud:[accent] {0}
|
||||||
stat.delivered = Materjale kaasa võetud:
|
stat.delivered = Materjale kaasa võetud:
|
||||||
stat.rank = Lõplik Hinne: [accent]{0}
|
stat.rank = Lõplik Hinne: [accent]{0}
|
||||||
placeline = Sa valisid ehitise\nSa saad[accent] panna neid sirges reas[] hoides näpuga all ja, siis viibates mõnes suunas.\n\n[scarlet] TEE SEDA
|
|
||||||
removearea = Sa valisid hävitamise funktsiooni.\nsa saad[accent] hävitada[]hoides oma sõrme all mõne sekundi ja, siis viibates mõnele poole.\n\n[scarlet]TEE SEDA
|
|
||||||
launcheditems = [accent]Kaasa võetud materjalid
|
launcheditems = [accent]Kaasa võetud materjalid
|
||||||
map.delete = Kas oled kindel, et soovid kustutada "[accent]{0}[]".
|
map.delete = Kas oled kindel, et soovid kustutada "[accent]{0}[]".
|
||||||
level.highscore = Rekord: [accent]{0}
|
level.highscore = Rekord: [accent]{0}
|
||||||
@@ -63,9 +66,11 @@ players.single = {0} mängija mängus
|
|||||||
server.closing = [accent]Serveri sulgemine...
|
server.closing = [accent]Serveri sulgemine...
|
||||||
server.kicked.kick = Sind visati serverist välja!
|
server.kicked.kick = Sind visati serverist välja!
|
||||||
server.kicked.serverClose = Server suletud.
|
server.kicked.serverClose = Server suletud.
|
||||||
|
server.kicked.vote = You have been vote-kicked. Goodbye.
|
||||||
server.kicked.clientOutdated = Aegunud versioon! Uuenda oma mängu!
|
server.kicked.clientOutdated = Aegunud versioon! Uuenda oma mängu!
|
||||||
server.kicked.serverOutdated = Aegunud server! Palu omanikul serverit uuendada!
|
server.kicked.serverOutdated = Aegunud server! Palu omanikul serverit uuendada!
|
||||||
server.kicked.banned = Sul on keeld seal mängida.
|
server.kicked.banned = Sul on keeld seal mängida.
|
||||||
|
server.kicked.typeMismatch = This server is not compatible with your build type.
|
||||||
server.kicked.recentKick = Sind visati hiljuti välja.\nOota natuke enne uuesti proovimist.
|
server.kicked.recentKick = Sind visati hiljuti välja.\nOota natuke enne uuesti proovimist.
|
||||||
server.kicked.nameInUse = Keegi sellise nimega\non juba seal serveris.
|
server.kicked.nameInUse = Keegi sellise nimega\non juba seal serveris.
|
||||||
server.kicked.nameEmpty = Sinu valitud nimi ei sobi.
|
server.kicked.nameEmpty = Sinu valitud nimi ei sobi.
|
||||||
@@ -156,6 +161,11 @@ cancel = Tühista
|
|||||||
openlink = Ava Link
|
openlink = Ava Link
|
||||||
copylink = Kopeeri Link
|
copylink = Kopeeri Link
|
||||||
back = Tagasi
|
back = Tagasi
|
||||||
|
data.export = Export Data
|
||||||
|
data.import = Import Data
|
||||||
|
data.exported = Data exported.
|
||||||
|
data.invalid = This isn't valid game data.
|
||||||
|
data.import.confirm = Importing external data will erase[scarlet] all[] your current game data.\n[accent]This cannot be undone![]\n\nOnce the data is imported, your game will exit immediately.
|
||||||
classic.export = Export Classic Data
|
classic.export = Export Classic Data
|
||||||
classic.export.text = [accent]Mindustry[] has just had a major update.\nClassic (v3.5 build 40) save or map data has been detected. Would you like to export these saves to your phone's home folder, for use in the Mindustry Classic app?
|
classic.export.text = [accent]Mindustry[] has just had a major update.\nClassic (v3.5 build 40) save or map data has been detected. Would you like to export these saves to your phone's home folder, for use in the Mindustry Classic app?
|
||||||
quit.confirm = Oled kindel, et soovid lahkuda?
|
quit.confirm = Oled kindel, et soovid lahkuda?
|
||||||
@@ -376,6 +386,7 @@ zone.fungalPass.description = A transition area between high mountains and lower
|
|||||||
zone.impact0078.description = <insert description here>
|
zone.impact0078.description = <insert description here>
|
||||||
zone.crags.description = <insert description here>
|
zone.crags.description = <insert description here>
|
||||||
settings.language = Keel
|
settings.language = Keel
|
||||||
|
settings.data = Game Data
|
||||||
settings.reset = Reset to Defaults
|
settings.reset = Reset to Defaults
|
||||||
settings.rebind = Rebind
|
settings.rebind = Rebind
|
||||||
settings.controls = Controls
|
settings.controls = Controls
|
||||||
@@ -507,6 +518,7 @@ setting.mutemusic.name = Vaigista muusika
|
|||||||
setting.sfxvol.name = SFX Volume
|
setting.sfxvol.name = SFX Volume
|
||||||
setting.mutesound.name = Mute Sound
|
setting.mutesound.name = Mute Sound
|
||||||
setting.crashreport.name = Send Anonymous Crash Reports
|
setting.crashreport.name = Send Anonymous Crash Reports
|
||||||
|
setting.savecreate.name = Auto-Create Saves
|
||||||
setting.chatopacity.name = Chat Opacity
|
setting.chatopacity.name = Chat Opacity
|
||||||
setting.playerchat.name = Display In-Game Chat
|
setting.playerchat.name = Display In-Game Chat
|
||||||
uiscale.reset = UI scale has been changed.\nPress "OK" to confirm this scale.\n[scarlet]Reverting and exiting in[accent] {0}[] seconds...
|
uiscale.reset = UI scale has been changed.\nPress "OK" to confirm this scale.\n[scarlet]Reverting and exiting in[accent] {0}[] seconds...
|
||||||
@@ -527,6 +539,7 @@ keybind.press.axis = Press an axis or key...
|
|||||||
keybind.screenshot.name = Map Screenshot
|
keybind.screenshot.name = Map Screenshot
|
||||||
keybind.move_x.name = Move x
|
keybind.move_x.name = Move x
|
||||||
keybind.move_y.name = Move y
|
keybind.move_y.name = Move y
|
||||||
|
keybind.fullscreen.name = Toggle Fullscreen
|
||||||
keybind.select.name = Select/Shoot
|
keybind.select.name = Select/Shoot
|
||||||
keybind.diagonal_placement.name = Diagonal Placement
|
keybind.diagonal_placement.name = Diagonal Placement
|
||||||
keybind.pick.name = Pick Block
|
keybind.pick.name = Pick Block
|
||||||
@@ -790,6 +803,7 @@ block.blast-mixer.name = Blast Mixer
|
|||||||
block.solar-panel.name = Solar Panel
|
block.solar-panel.name = Solar Panel
|
||||||
block.solar-panel-large.name = Large Solar Panel
|
block.solar-panel-large.name = Large Solar Panel
|
||||||
block.oil-extractor.name = Oil Extractor
|
block.oil-extractor.name = Oil Extractor
|
||||||
|
block.command-center.name = Command Center
|
||||||
block.draug-factory.name = Draug Miner Drone Factory
|
block.draug-factory.name = Draug Miner Drone Factory
|
||||||
block.spirit-factory.name = Spirit Drone Factory
|
block.spirit-factory.name = Spirit Drone Factory
|
||||||
block.phantom-factory.name = Phantom Drone Factory
|
block.phantom-factory.name = Phantom Drone Factory
|
||||||
@@ -1012,6 +1026,7 @@ block.ripple.description = A large artillery turret which fires several shots si
|
|||||||
block.cyclone.description = A large rapid fire turret.
|
block.cyclone.description = A large rapid fire turret.
|
||||||
block.spectre.description = A large turret which shoots two powerful bullets at once.
|
block.spectre.description = A large turret which shoots two powerful bullets at once.
|
||||||
block.meltdown.description = A large turret which shoots powerful long-range beams.
|
block.meltdown.description = A large turret which shoots powerful long-range beams.
|
||||||
|
block.command-center.description = Issues movement commands to allied units across the map.\nCauses units to patrol, attack an enemy core or retreat to the core/factory. When no enemy core is present, units will default to patrolling under the attack command.
|
||||||
block.draug-factory.description = Produces Draug mining drones.
|
block.draug-factory.description = Produces Draug mining drones.
|
||||||
block.spirit-factory.description = Produces light drones which mine ore and repair blocks.
|
block.spirit-factory.description = Produces light drones which mine ore and repair blocks.
|
||||||
block.phantom-factory.description = Produces advanced drone units which are significantly more effective than a spirit drone.
|
block.phantom-factory.description = Produces advanced drone units which are significantly more effective than a spirit drone.
|
||||||
|
|||||||
1069
core/assets/bundles/bundle_eu.properties
Normal file
@@ -4,10 +4,10 @@ contributors = Traducteurs et contributeurs
|
|||||||
discord = Rejoignez le discord de Mindustry !
|
discord = Rejoignez le discord de Mindustry !
|
||||||
link.discord.description = Le discord officiel de Mindustry
|
link.discord.description = Le discord officiel de Mindustry
|
||||||
link.github.description = Code source du jeu
|
link.github.description = Code source du jeu
|
||||||
link.changelog.description = Liste des modifications de mise à jour
|
link.changelog.description = Liste des mises à jour
|
||||||
link.dev-builds.description = Versions instables de développement
|
link.dev-builds.description = Versions instables de développement
|
||||||
link.trello.description = Planning Trello officiel pour les fonctionnalités planifiées.
|
link.trello.description =Trello officiel pour les fonctionnalités planifiées.
|
||||||
link.itch.io.description = Page web itch.io avec les versions ordinateurs téléchargeables et la version web
|
link.itch.io.description = Site itch.io avec les versions téléchargeables pour ordinateur.
|
||||||
link.google-play.description = Page Google Play du jeu
|
link.google-play.description = Page Google Play du jeu
|
||||||
link.wiki.description = Wiki officiel de Mindustry
|
link.wiki.description = Wiki officiel de Mindustry
|
||||||
linkfail = L'ouverture du lien a échoué!\nL'URL a été copiée dans votre presse-papier.
|
linkfail = L'ouverture du lien a échoué!\nL'URL a été copiée dans votre presse-papier.
|
||||||
@@ -16,15 +16,18 @@ screenshot.invalid = Carte trop grande, potentiellement pas assez de mémoire po
|
|||||||
gameover = Le base a été détruite.
|
gameover = Le base a été détruite.
|
||||||
gameover.pvp = L'équipe[accent] {0}[] a gagnée !
|
gameover.pvp = L'équipe[accent] {0}[] a gagnée !
|
||||||
highscore = [accent]Nouveau meilleur score !
|
highscore = [accent]Nouveau meilleur score !
|
||||||
|
load.sound = Son
|
||||||
|
load.map = Maps
|
||||||
|
load.image = Images
|
||||||
|
load.content = Contenu
|
||||||
|
load.system = Système
|
||||||
stat.wave = Vagues vaincues:[accent] {0}
|
stat.wave = Vagues vaincues:[accent] {0}
|
||||||
stat.enemiesDestroyed = Ennemies détruits:[accent] {0}
|
stat.enemiesDestroyed = Ennemies détruits:[accent] {0}
|
||||||
stat.built = Bâtiments construits:[accent] {0}
|
stat.built = Bâtiments construits:[accent] {0}
|
||||||
stat.destroyed = Bâtiments détruits:[accent] {0}
|
stat.destroyed = Bâtiments détruits:[accent] {0}
|
||||||
stat.deconstructed = Bâtiments déconstruits:[accent] {0}
|
stat.deconstructed = Bâtiments déconstruits:[accent] {0}
|
||||||
stat.delivered = Ressources transférées:
|
stat.delivered = Ressources transférées:
|
||||||
stat.rank = FRang Final: [accent]{0}
|
stat.rank = Rang Final: [accent]{0}
|
||||||
placeline = Tu as sélectionné un bloc.\nTu peux les[accent] placer en rangée[] en[accent] maintenant ton doigt sur l'écran pendant quelque secondes[] et en le glissant vers n'importe qu'elle direction.\nEssaye!
|
|
||||||
removearea = Tu as sélectionné le mode de suppression.\nTu peux[accent] supprimer les blocs en rectangle[] en[accent] maintenant ton doigt sur l'écran pendant quelques secondes[] et en le glissant.\nEssaye!
|
|
||||||
launcheditems = [accent]Ressources transférées
|
launcheditems = [accent]Ressources transférées
|
||||||
map.delete = Êtes-vous sûr de vouloir supprimer cette carte ?"[accent]{0}[]"?
|
map.delete = Êtes-vous sûr de vouloir supprimer cette carte ?"[accent]{0}[]"?
|
||||||
level.highscore = Meilleur score: [accent]{0}
|
level.highscore = Meilleur score: [accent]{0}
|
||||||
@@ -58,21 +61,24 @@ techtree = Arbre technologique
|
|||||||
research.list = [LIGHT_GRAY]Recherche:
|
research.list = [LIGHT_GRAY]Recherche:
|
||||||
research = Recherche
|
research = Recherche
|
||||||
researched = [LIGHT_GRAY]{0} recherchée.
|
researched = [LIGHT_GRAY]{0} recherchée.
|
||||||
players = {0} joueurs en ligne
|
players = {0} joueurs
|
||||||
players.single = {0} joueur en ligne
|
players.single = {0} joueur
|
||||||
server.closing = [accent]Fermeture du serveur ...
|
server.closing = [accent]Fermeture du serveur ...
|
||||||
server.kicked.kick = Vous avez été expulsé du serveur !
|
server.kicked.kick = Vous avez été expulsé du serveur !
|
||||||
server.kicked.serverClose = Serveur fermé.
|
server.kicked.serverClose = Serveur fermé.
|
||||||
|
server.kicked.vote = You have been vote-kicked. Goodbye.
|
||||||
server.kicked.clientOutdated = Client dépassé! Mettez à jour votre jeu !
|
server.kicked.clientOutdated = Client dépassé! Mettez à jour votre jeu !
|
||||||
server.kicked.serverOutdated = Serveur dépassé! Demandez à l'hôte de le mettre à jour !
|
server.kicked.serverOutdated = Serveur dépassé! Demandez à l'hôte de le mettre à jour !
|
||||||
server.kicked.banned = Vous êtes banni de ce serveur.
|
server.kicked.banned = Vous êtes banni de ce serveur.
|
||||||
|
server.kicked.typeMismatch = This server is not compatible with your build type.
|
||||||
server.kicked.recentKick = Vous avez été expulsé récemment.\nAttendez avant de vous connecter à nouveau.
|
server.kicked.recentKick = Vous avez été expulsé récemment.\nAttendez avant de vous connecter à nouveau.
|
||||||
server.kicked.nameInUse = Il y a déjà quelqu'un avec ce nom\nsur ce serveur.
|
server.kicked.nameInUse = Il y a déjà quelqu'un avec ce nom\nsur ce serveur.
|
||||||
server.kicked.nameEmpty = Votre nom doit contenir au moins une lettre ou un chiffre.
|
server.kicked.nameEmpty = Votre nom doit contenir au moins une lettre ou un chiffre.
|
||||||
server.kicked.idInUse = Vous êtes déjà sur ce serveur ! Se connecter avec deux comptes n'est pas permis !
|
server.kicked.idInUse = Vous êtes déjà sur ce serveur ! Se connecter avec deux comptes n'est pas permis !
|
||||||
server.kicked.customClient = Ce serveur ne supporte pas les versions personnalisées (Custom builds). Télécharger une version officielle.
|
server.kicked.customClient = Ce serveur ne supporte pas les versions personnalisées (Custom builds). Télécharger une version officielle.
|
||||||
server.kicked.gameover = Vous avez perdu !
|
server.kicked.gameover = Vous avez perdu !
|
||||||
server.versions = Your version:[accent] {0}[]\nServer version:[accent] {1}[]
|
server.kicked.playerLimit = Ce serveur est complet. Attendez qu'une place ce libére.
|
||||||
|
server.versions = Votre version:[accent] {0}[]\nVersion du serveur:[accent] {1}[]
|
||||||
host.info = Le bouton [accent]héberger[] héberge un serveur sur les ports [scarlet]6567[] et [scarlet]6568.[]\nN'importe qui sur le même [LIGHT_GRAY]réseau wifi ou local[] devrait pouvoir voir votre serveur dans sa liste de serveurs.\n\nSi vous voulez que les gens puissent se connecter de n'importe où grâce à l'IP, [accent]rediriger les ports[] est requis.\n\n[LIGHT_GRAY]Note:Si quelqu'un éprouve des difficultés à se connecter à votre partie LAN, assurez-vous que vous avez autorisé Mindustry à accéder à votre réseau local dans les paramètres de votre pare-feu.
|
host.info = Le bouton [accent]héberger[] héberge un serveur sur les ports [scarlet]6567[] et [scarlet]6568.[]\nN'importe qui sur le même [LIGHT_GRAY]réseau wifi ou local[] devrait pouvoir voir votre serveur dans sa liste de serveurs.\n\nSi vous voulez que les gens puissent se connecter de n'importe où grâce à l'IP, [accent]rediriger les ports[] est requis.\n\n[LIGHT_GRAY]Note:Si quelqu'un éprouve des difficultés à se connecter à votre partie LAN, assurez-vous que vous avez autorisé Mindustry à accéder à votre réseau local dans les paramètres de votre pare-feu.
|
||||||
join.info = Ici, vous pouvez entrer l' [accent]IP d'un serveur[] pour s'y connecter, ou découvrir les serveurs[accent]sur votre réseau local[] pour s'y connecter.\nLes parties multijoueur LAN et WAN sont toutes deux supportées.\n\n[LIGHT_GRAY]Note: Aucune liste globale des serveurs n'est génerée automatiquement: si vous voulez vous connecter à un serveur par IP, vous devrez demander l'IP à l'hébergeur.
|
join.info = Ici, vous pouvez entrer l' [accent]IP d'un serveur[] pour s'y connecter, ou découvrir les serveurs[accent]sur votre réseau local[] pour s'y connecter.\nLes parties multijoueur LAN et WAN sont toutes deux supportées.\n\n[LIGHT_GRAY]Note: Aucune liste globale des serveurs n'est génerée automatiquement: si vous voulez vous connecter à un serveur par IP, vous devrez demander l'IP à l'hébergeur.
|
||||||
hostserver = Héberger un serveur
|
hostserver = Héberger un serveur
|
||||||
@@ -101,7 +107,7 @@ server.edit = Modifier le serveur
|
|||||||
server.outdated = [crimson]Serveur obsolète ![]
|
server.outdated = [crimson]Serveur obsolète ![]
|
||||||
server.outdated.client = [crimson]Client obsolète ![]
|
server.outdated.client = [crimson]Client obsolète ![]
|
||||||
server.version = [lightgray]Version: {0} {1}
|
server.version = [lightgray]Version: {0} {1}
|
||||||
server.custombuild = [yellow]Version personnalisée
|
server.custombuild = [accent]Version personnalisée
|
||||||
confirmban = Êtes-vous sûr de vouloir bannir ce joueur ?
|
confirmban = Êtes-vous sûr de vouloir bannir ce joueur ?
|
||||||
confirmkick = Êtes-vous sûr de vouloir expulser ce joueur?
|
confirmkick = Êtes-vous sûr de vouloir expulser ce joueur?
|
||||||
confirmunban = Êtes-vous sûr de vouloir annuler le ban de ce joueur ?
|
confirmunban = Êtes-vous sûr de vouloir annuler le ban de ce joueur ?
|
||||||
@@ -143,7 +149,7 @@ off = Éteint
|
|||||||
save.autosave = Sauvegarde automatique {0}
|
save.autosave = Sauvegarde automatique {0}
|
||||||
save.map = Carte: {0}
|
save.map = Carte: {0}
|
||||||
save.wave = Vague {0}
|
save.wave = Vague {0}
|
||||||
save.difficulty = Difficulté: {0}
|
save.mode = Mode de jeu {0}
|
||||||
save.date = Dernière sauvegarde: {0}
|
save.date = Dernière sauvegarde: {0}
|
||||||
save.playtime = Temps de jeu: {0}
|
save.playtime = Temps de jeu: {0}
|
||||||
warning = Avertissement.
|
warning = Avertissement.
|
||||||
@@ -156,6 +162,11 @@ cancel = Annuler
|
|||||||
openlink = Ouvrir le lien
|
openlink = Ouvrir le lien
|
||||||
copylink = Copier le lien
|
copylink = Copier le lien
|
||||||
back = Retour
|
back = Retour
|
||||||
|
data.export = Export Data
|
||||||
|
data.import = Import Data
|
||||||
|
data.exported = Data exported.
|
||||||
|
data.invalid = This isn't valid game data.
|
||||||
|
data.import.confirm = Importing external data will erase[scarlet] all[] your current game data.\n[accent]This cannot be undone![]\n\nOnce the data is imported, your game will exit immediately.
|
||||||
classic.export = Export Classic Data
|
classic.export = Export Classic Data
|
||||||
classic.export.text = [accent]Mindustry[] has just had a major update.\nClassic (v3.5 build 40) save or map data has been detected. Would you like to export these saves to your phone's home folder, for use in the Mindustry Classic app?
|
classic.export.text = [accent]Mindustry[] has just had a major update.\nClassic (v3.5 build 40) save or map data has been detected. Would you like to export these saves to your phone's home folder, for use in the Mindustry Classic app?
|
||||||
quit.confirm = Êtes-vous sûr de vouloir quitter?
|
quit.confirm = Êtes-vous sûr de vouloir quitter?
|
||||||
@@ -215,7 +226,7 @@ editor.removeunit = Retirer l'unité
|
|||||||
editor.teams = Équipes
|
editor.teams = Équipes
|
||||||
editor.errorload = Erreur lors du chargement du fichier:\n[accent]{0}
|
editor.errorload = Erreur lors du chargement du fichier:\n[accent]{0}
|
||||||
editor.errorsave = Erreur lors de la sauvegarde du fichier:\n[accent]{0}
|
editor.errorsave = Erreur lors de la sauvegarde du fichier:\n[accent]{0}
|
||||||
editor.errorimage = C'est une image, pas une carte. Ne changez pas les extensions en espérant que cela fonctionne.\n\nSi vous souhaitez importer une carte, utilisez le bouton "importer une carte" dans l'éditeur.
|
editor.errorimage = C’est une image, pas une carte.\n\nSi vous souhaitez importer une carte 3.5/build 40, utilisez le bouton "Importer une carte héritée" dans l’éditeur.
|
||||||
editor.errorlegacy = Cette carte est trop ancienne et utilise un format de carte qui n'est plus pris en charge.
|
editor.errorlegacy = Cette carte est trop ancienne et utilise un format de carte qui n'est plus pris en charge.
|
||||||
editor.errorheader = Ce fichier de carte n'est pas valide ou corrompu.
|
editor.errorheader = Ce fichier de carte n'est pas valide ou corrompu.
|
||||||
editor.errorname = La carte n'a pas de nom !
|
editor.errorname = La carte n'a pas de nom !
|
||||||
@@ -225,6 +236,7 @@ editor.apply = Appliquer
|
|||||||
editor.generate = Générer
|
editor.generate = Générer
|
||||||
editor.resize = Redimensionner
|
editor.resize = Redimensionner
|
||||||
editor.loadmap = Charger une carte
|
editor.loadmap = Charger une carte
|
||||||
|
editor.errornot = Ce n'est pas un fichier de carte.
|
||||||
editor.savemap = Sauvegarder une carte
|
editor.savemap = Sauvegarder une carte
|
||||||
editor.saved = Sauvegardé !
|
editor.saved = Sauvegardé !
|
||||||
editor.save.noname = Votre carte ne possède pas de nom ! Ajouter en un dans le menu 'Infos sur la carte'.
|
editor.save.noname = Votre carte ne possède pas de nom ! Ajouter en un dans le menu 'Infos sur la carte'.
|
||||||
@@ -235,7 +247,7 @@ editor.importmap = Importer une carte
|
|||||||
editor.importmap.description = Importer une carte déjà existante
|
editor.importmap.description = Importer une carte déjà existante
|
||||||
editor.importfile = Importer un fichier
|
editor.importfile = Importer un fichier
|
||||||
editor.importfile.description = Importer une carte à partir d'un fichier externe
|
editor.importfile.description = Importer une carte à partir d'un fichier externe
|
||||||
editor.importimage = Importer l'image du terrain
|
editor.importimage = Importer la carte existante
|
||||||
editor.importimage.description = Importer une image de terrain à partir d'un fichier externe
|
editor.importimage.description = Importer une image de terrain à partir d'un fichier externe
|
||||||
editor.export = Exportation en cours...
|
editor.export = Exportation en cours...
|
||||||
editor.exportfile = Exporter un fichier
|
editor.exportfile = Exporter un fichier
|
||||||
@@ -346,7 +358,7 @@ error.alreadyconnected = Déjà connecté.
|
|||||||
error.mapnotfound = Fichier de carte introuvable !
|
error.mapnotfound = Fichier de carte introuvable !
|
||||||
error.io = Network I/O error.
|
error.io = Network I/O error.
|
||||||
error.any = Erreur réseau inconnue.
|
error.any = Erreur réseau inconnue.
|
||||||
error.bloom = Échec d'initialisation de la floraison.\nVotre appareil peut ne pas le supporter.
|
error.bloom = Échec d'initialisation du flou lumineux.\nVotre appareil peut ne pas le supporter.
|
||||||
zone.groundZero.name = Première Bataille
|
zone.groundZero.name = Première Bataille
|
||||||
zone.desertWastes.name = Déchets du désert
|
zone.desertWastes.name = Déchets du désert
|
||||||
zone.craters.name = Les Cratères
|
zone.craters.name = Les Cratères
|
||||||
@@ -376,6 +388,7 @@ zone.fungalPass.description = A transition area between high mountains and lower
|
|||||||
zone.impact0078.description = <insérer la description ici>
|
zone.impact0078.description = <insérer la description ici>
|
||||||
zone.crags.description = <insérer la description ici>
|
zone.crags.description = <insérer la description ici>
|
||||||
settings.language = Langage
|
settings.language = Langage
|
||||||
|
settings.data = Game Data
|
||||||
settings.reset = Valeur par défaut.
|
settings.reset = Valeur par défaut.
|
||||||
settings.rebind = Réatttribuer
|
settings.rebind = Réatttribuer
|
||||||
settings.controls = Contrôles
|
settings.controls = Contrôles
|
||||||
@@ -423,6 +436,7 @@ blocks.boosteffect = Effet boostant
|
|||||||
blocks.maxunits = Maximum d'unitée active
|
blocks.maxunits = Maximum d'unitée active
|
||||||
blocks.health = Santé
|
blocks.health = Santé
|
||||||
blocks.buildtime = Temps de construction
|
blocks.buildtime = Temps de construction
|
||||||
|
blocks.buildcost = Coût de construction
|
||||||
blocks.inaccuracy = Précision
|
blocks.inaccuracy = Précision
|
||||||
blocks.shots = Tirs
|
blocks.shots = Tirs
|
||||||
blocks.reload = Tirs/Seconde
|
blocks.reload = Tirs/Seconde
|
||||||
@@ -507,11 +521,12 @@ setting.mutemusic.name = Couper la musique
|
|||||||
setting.sfxvol.name = Volume des SFX
|
setting.sfxvol.name = Volume des SFX
|
||||||
setting.mutesound.name = Couper les SFX
|
setting.mutesound.name = Couper les SFX
|
||||||
setting.crashreport.name = Envoyer des rapports d'incident anonymement.
|
setting.crashreport.name = Envoyer des rapports d'incident anonymement.
|
||||||
|
setting.savecreate.name = Auto-Create Saves
|
||||||
setting.chatopacity.name = Opacité du tchat
|
setting.chatopacity.name = Opacité du tchat
|
||||||
setting.playerchat.name = Afficher le tchat en jeu
|
setting.playerchat.name = Afficher le tchat en jeu
|
||||||
uiscale.reset = L'échelle de l'interface a été modifiée.\nAppuyez sur "OK" pour confirmer cette échelle.\n[scarlet]Revenir et sortir en[accent] {0}[] réglages...
|
uiscale.reset = L'échelle de l'interface a été modifiée.\nAppuyez sur "OK" pour confirmer cette échelle.\n[scarlet]Revenir et sortir en[accent] {0}[] réglages...
|
||||||
uiscale.cancel = Annuler et quitter
|
uiscale.cancel = Annuler et quitter
|
||||||
setting.bloom.name = Floraison
|
setting.bloom.name = Flou lumineux
|
||||||
keybind.title = Paramétrer les touches
|
keybind.title = Paramétrer les touches
|
||||||
keybinds.mobile = [scarlet]La plupart des raccourcis clavier ne sont pas fonctionnelles sur les appareils mobiles. Seul le mouvement de base est pris en charge.
|
keybinds.mobile = [scarlet]La plupart des raccourcis clavier ne sont pas fonctionnelles sur les appareils mobiles. Seul le mouvement de base est pris en charge.
|
||||||
category.general.name = Général
|
category.general.name = Général
|
||||||
@@ -527,6 +542,7 @@ keybind.press.axis = Appuyez sur un axe ou une touche...
|
|||||||
keybind.screenshot.name = Map Screenshot
|
keybind.screenshot.name = Map Screenshot
|
||||||
keybind.move_x.name = Mouvement X
|
keybind.move_x.name = Mouvement X
|
||||||
keybind.move_y.name = Mouvement Y
|
keybind.move_y.name = Mouvement Y
|
||||||
|
keybind.fullscreen.name = Basculer en plein écran
|
||||||
keybind.select.name = Sélectionner/Tirer
|
keybind.select.name = Sélectionner/Tirer
|
||||||
keybind.diagonal_placement.name = Placement en diagonal
|
keybind.diagonal_placement.name = Placement en diagonal
|
||||||
keybind.pick.name = Choisir un bloc
|
keybind.pick.name = Choisir un bloc
|
||||||
@@ -562,7 +578,7 @@ mode.custom = Règles personnalisées
|
|||||||
rules.infiniteresources = Ressources infinies
|
rules.infiniteresources = Ressources infinies
|
||||||
rules.wavetimer = Temps de vague
|
rules.wavetimer = Temps de vague
|
||||||
rules.waves = Vague
|
rules.waves = Vague
|
||||||
rules.attack = Attack Mode
|
rules.attack = Mode attaque
|
||||||
rules.enemyCheat = Ressources infinies pour l'IA
|
rules.enemyCheat = Ressources infinies pour l'IA
|
||||||
rules.unitdrops = Uniter Drops
|
rules.unitdrops = Uniter Drops
|
||||||
rules.unitbuildspeedmultiplier = Multiplicateur de vitesse de création d'unités
|
rules.unitbuildspeedmultiplier = Multiplicateur de vitesse de création d'unités
|
||||||
@@ -675,7 +691,7 @@ block.multi-press.name = Multi-Presse
|
|||||||
block.constructing = {0}\n[LIGHT_GRAY](En construction)
|
block.constructing = {0}\n[LIGHT_GRAY](En construction)
|
||||||
block.spawn.name = Générateur d'ennemi
|
block.spawn.name = Générateur d'ennemi
|
||||||
block.core-shard.name = Core: Shard
|
block.core-shard.name = Core: Shard
|
||||||
block.core-foundation.name = Core: Foundation
|
block.core-foundation.name = Core: Fondation
|
||||||
block.core-nucleus.name = Core: Nucleus
|
block.core-nucleus.name = Core: Nucleus
|
||||||
block.deepwater.name = Eau profonde
|
block.deepwater.name = Eau profonde
|
||||||
block.water.name = Eau
|
block.water.name = Eau
|
||||||
@@ -790,6 +806,7 @@ block.blast-mixer.name = Mixeur à explosion
|
|||||||
block.solar-panel.name = Panneau solaire
|
block.solar-panel.name = Panneau solaire
|
||||||
block.solar-panel-large.name = Grand panneau solaire
|
block.solar-panel-large.name = Grand panneau solaire
|
||||||
block.oil-extractor.name = Extracteur de pétrol
|
block.oil-extractor.name = Extracteur de pétrol
|
||||||
|
block.command-center.name = Centre de commandement
|
||||||
block.draug-factory.name = Usine de "Drones draug miner"
|
block.draug-factory.name = Usine de "Drones draug miner"
|
||||||
block.spirit-factory.name = Usine de "Drones spirituels"
|
block.spirit-factory.name = Usine de "Drones spirituels"
|
||||||
block.phantom-factory.name = Usine de "Drones fantômes"
|
block.phantom-factory.name = Usine de "Drones fantômes"
|
||||||
@@ -852,26 +869,26 @@ unit.chaos-array.name = Chaos Array
|
|||||||
unit.eradicator.name = Eradicator
|
unit.eradicator.name = Eradicator
|
||||||
unit.lich.name = Lich
|
unit.lich.name = Lich
|
||||||
unit.reaper.name = Reaper
|
unit.reaper.name = Reaper
|
||||||
tutorial.next = [lightgray]<Tap to continue>
|
tutorial.next = [lightgray]<Appuyez pour continuer>
|
||||||
tutorial.intro = You have entered the[scarlet] Mindustry Tutorial.[]\nBegin by[accent] mining copper[]. Tap a copper ore vein near your core to do this.\n\n[accent]{0}/{1} copper
|
tutorial.intro = Vous êtes entré dans le[scarlet] Tutoriel de Mindustry.[]\nCommencez par[accent] miner du cuivre[]. Appuyez ou cliquez sur une veine de minerai de cuivre près de votre base pour commencer à miner.\n\n[accent]{0}/{1} cuivre
|
||||||
tutorial.drill = Le minage manuel est inefficace.\n[accent]Des foreuses[]peuvent miner automatiquement.\nPlacez-en une sur un filon de cuivre.
|
tutorial.drill = Le minage manuel est inefficace.\n[accent]Des foreuses[]peuvent miner automatiquement.\nPlacez-en une sur un filon de cuivre.
|
||||||
tutorial.drill.mobile = Mining manually is inefficient.\n[accent]Drills []can mine automatically.\nTap the drill tab in the bottom right.\nSelect the[accent] mechanical drill[].\nPlace it on a copper vein by tapping, then press the[accent] checkmark[] below to confirm your selection.\nPress the[accent] X button[] to cancel placement.
|
tutorial.drill.mobile = Le minage manuel est inefficace.\n[accent]Des foreuses[]peuvent miner automatiquement.\nAppuyez sur l'onglet de forage en bas à droite.\nSélectionnez la[accent] perceuse mécanique[].\nPlacez-la sur une veine de cuivre, puis appuyez sur la[accent] coche(V)[] ci-dessous pour confirmer votre sélection.\nAppuyez sur le [accent] bouton X[]pour annuler le placement.
|
||||||
tutorial.blockinfo = Each block has different stats. Each drill can only mine certain ores.\nTo check a block's info and stats,[accent] tap the "?" button while selecting it in the build menu.[]\n\n[accent]Access the Mechanical Drill's stats now.[]
|
tutorial.blockinfo = Chaque bloc a des statistiques différentes. Chaque foreuse ne peut extraire que certains minerais.\nPour vérifier les informations et les statistiques d'un bloc,[accent] tapez sur le "?" tout en le sélectionnant dans le menu de compilation.[]\n\n[accent]Accédez aux statistiques de la foreuse mécanique maintenant.[]
|
||||||
tutorial.conveyor = [accent]Les Tapis roulants[] sont utilisés pour transporter des objets jusqu'à la base.\nFaites une ligne de tapis roulants de la foreuse à la base .
|
tutorial.conveyor = [accent]Convoyeurs[] sont utilisés pour transporter des articles à la base.\nFaire une ligne de convoyeurs de la foreusse à la base.\n[accent]Maintenez le clique droit de la souris pour placer dans une ligne.[]\nMaintenir[accent] CTRL[] en sélectionnant une ligne à placer en diagonale.\n\n[accent]Placez 2 convoyeurs avec l'outil ligne, puis livrez un article dans la base.
|
||||||
tutorial.conveyor.mobile = [accent]Conveyors[] are used to transport items to the core.\nMake a line of conveyors from the drill to the core.\n[accent] Place in a line by holding down your finger for a few seconds[] and dragging in a direction.\n\n[accent]{0}/{1} conveyors placed in line\n[accent]0/1 items delivered
|
tutorial.conveyor.mobile = [accent]Convoyeurs[] sont utilisés pour transporter des articles à la base.\nFaire une ligne de convoyeurs de la foreusse à la base.\n[accent] Placez dans une ligne en maintenant votre doigt appuyé pendant quelques secondes[] et en le faisant glisser dans une direction.\n\n[accent]Placez 2 convoyeurs avec l'outil ligne, puis livrez un article dans la base.
|
||||||
tutorial.turret = Des constructions défensives doivent être construites pour repousser [LIGHT_GRAY]les ennemis[].Construisez une tourelle "duo" près de votre base.
|
tutorial.turret = Des constructions défensives doivent être construites pour repousser [LIGHT_GRAY]les ennemis[].Construisez une tourelle "duo" près de votre base.
|
||||||
tutorial.drillturret = Les tourelles "Duo" ont besoin de [accent]munitions en cuivre[] pour tirer.\nPlacez une foreuse à côté de la tourelle pour l'approvisionner avec du cuivre.
|
tutorial.drillturret = Les tourelles "Duo" ont besoin de [accent]munitions en cuivre[] pour tirer.\nPlacez une foreuse à côté de la tourelle pour l'approvisionner avec du cuivre.
|
||||||
tutorial.pause = During battle, you are able to[accent] pause the game.[]\nYou may queue buildings while paused.\n\n[accent]Press space to pause.
|
tutorial.pause = Pendant le combat, vous pouvez[accent] mettre le jeu en pause.[]\nVous pouvez construire des bâtiments pendant que le jeu est en pause.\n\n[accent]Appuyez sur espace pour mettre le jeu en pause.
|
||||||
tutorial.pause.mobile = During battle, you are able to[accent] pause the game.[]\nYou may queue buildings while paused.\n\n[accent]Press this button in the top left to pause.
|
tutorial.pause.mobile = Pendant le combat, vous pouvez[accent] mettre le jeu en pause.[]\nVous pouvez construire des bâtiments pendant que le jeu est en pause.\n\n[accent]Appuyez sur le bouton en haut à gauche pour mettre le jeu en pause.
|
||||||
tutorial.unpause = Now press space again to unpause.
|
tutorial.unpause = Appuyez de nouveau sur espace pour reprendre le cour du jeu
|
||||||
tutorial.unpause.mobile = Now press it again to unpause.
|
tutorial.unpause.mobile = Appuyez de nouveau sur cette touche pour reprendre le cour du jeu
|
||||||
tutorial.breaking = Blocks frequently need to be destroyed.\n[accent]Hold down right-click[] to destroy all blocks in a selection.[]\n\n[accent]Destroy all the scrap blocks to the left of your core using area selection.
|
tutorial.breaking = Les blocs doivent souvent être détruits.\n[accent]Maintenez le bouton droit de la souris enfoncé.[] pour détruire tous les blocs sélectionnés.[]\n\n[accent]Détruisez tous les blocs de ferraille à gauche de votre base à l'aide de la sélection de zone.
|
||||||
tutorial.breaking.mobile = Blocks frequently need to be destroyed.\n[accent]Select deconstruction mode[], then tap a block to begin breaking it.\nDestroy an area by holding down your finger for a few seconds[] and dragging in a direction.\nPress the checkmark button to confirm breaking.\n\n[accent]Destroy all the scrap blocks to the left of your core using area selection.
|
tutorial.breaking.mobile = Les blocs doivent souvent être détruits.\n[accent]Sélectionnez le mode de déconstruction[], puis appuyez sur un bloc pour commencer à le casser.\nDétruisez une zone en maintenant votre doigt enfoncé pendant quelques secondes[] et glisser dans une direction.\nAppuyez sur la coche(V) pour confirmer.\n\n[accent]Détruisez tous les blocs de ferraille à gauche de votre base à l'aide de la sélection de zone.
|
||||||
tutorial.withdraw = In some situations, taking items directly from blocks is necessary.\nTo do this, [accent]tap a block[] with items in it, then [accent]tap the item[] in the inventory.\nMultiple items can be withdrawn by [accent]tapping and holding[].\n\n[accent]Withdraw some copper from the core.[]
|
tutorial.withdraw = Dans certaines situations, il est nécessaire de prendre des articles directement des blocs..\nPour faire ça, [accent]tapez sur un bloc[] avec des articles à l'intérieur, alors [accent]appuyez sur l'élément[] dans l'inventaire.\nPlusieurs éléments peuvent être retirés en [accent]tapotant et en maintenant enfoncée la touche[].\n\n[accent]Retirez un peu de cuivre de votre base.[]
|
||||||
tutorial.deposit = Deposit items into blocks by dragging from your ship to the destination block.\n\n[accent]Deposit your copper back into the core.[]
|
tutorial.deposit = Déposez les éléments dans des blocs en les faisant glisser de votre vaisseau vers un module de stockage.\n\n[accent]Déposez votre cuivre dans la base.[]
|
||||||
tutorial.waves = Les [LIGHT_GRAY]ennemies[] approchent.\n\nDéfendez votre base pour 2 vagues. Construisez plus de tourelles.
|
tutorial.waves = Les [LIGHT_GRAY]ennemies[] approchent.\n\nDéfendez votre base durant 2 vagues.\nConstruisez plus de tourelles et de foreuses. Minez plus de cuivre.
|
||||||
tutorial.waves.mobile = The[lightgray] enemy[] approaches.\n\nDefend the core for 2 waves. Your ship will automatically fire at enemies.\nBuild more turrets and drills. Mine more copper.
|
tutorial.waves.mobile = [lightgray]Les ennemies approchent[].\n\nDéfendez votre base durant 2 vagues. Votre vaisseau tirera automatiquement sur les ennemis.\nConstruisez plus de tourelles et de foreuses. Minez plus de cuivre.
|
||||||
tutorial.launch = Once you reach a specific wave, you are able to[accent] launch the core[], leaving your defenses behind and[accent] obtaining all the resources in your core.[]\nThese resources can then be used to research new technology.\n\n[accent]Press the launch button.
|
tutorial.launch = Une fois que vous atteignez une vague spécifique, vous êtes en mesure de[accent] lancer votre base[], laissant vos défenses derrière vous et[accent] en obtenant toutes les ressources de votre base.[]\nCes ressources peuvent ensuite servir à la recherche de nouvelles technologies.\n\n[accent]Appuyez sur le bouton de lancement.
|
||||||
item.copper.description = Un matériau de construction utile. Utilisé intensivement dans tout les blocs.
|
item.copper.description = Un matériau de construction utile. Utilisé intensivement dans tout les blocs.
|
||||||
item.lead.description = Un matériau de départ. Utilisé intensivement en électronique et pour le transport de blocs.
|
item.lead.description = Un matériau de départ. Utilisé intensivement en électronique et pour le transport de blocs.
|
||||||
item.metaglass.description = Un composé de verre très résistant. Utilisation intensive pour la distribution et le stockage de liquides.
|
item.metaglass.description = Un composé de verre très résistant. Utilisation intensive pour la distribution et le stockage de liquides.
|
||||||
@@ -907,7 +924,7 @@ unit.dagger.description = Une unité terrestre de base. Utile en essaims.
|
|||||||
unit.crawler.description = Unité au sol composée d’un cadre dépouillé sur lequel sont fixés des explosifs puissants. Pas particulièrement durable. Explose au contact des ennemis.
|
unit.crawler.description = Unité au sol composée d’un cadre dépouillé sur lequel sont fixés des explosifs puissants. Pas particulièrement durable. Explose au contact des ennemis.
|
||||||
unit.titan.description = Une unité terrestre cuirassée avancée. Utilise de l'alliage lourd pour munition. Attaque les unités aérinnes comme terrestres.
|
unit.titan.description = Une unité terrestre cuirassée avancée. Utilise de l'alliage lourd pour munition. Attaque les unités aérinnes comme terrestres.
|
||||||
unit.fortress.description = Une unité terrestre d'artillerie lourde.
|
unit.fortress.description = Une unité terrestre d'artillerie lourde.
|
||||||
unit.eruptor.description = Un mech lourd conçu pour abattre des structures. Tire un flot de scories sur les fortifications ennemies, les fait fondre et met le feu aux volatiles.
|
unit.eruptor.description = Un mech lourd conçu pour abattre des structures. Tire un flot de scories sur les fortifications ennemies, les fait fondre et met en feu les volatiles.
|
||||||
unit.wraith.description = Une unité volante rapide harcelant les ennemis. Utilise du plomb comme munitions.
|
unit.wraith.description = Une unité volante rapide harcelant les ennemis. Utilise du plomb comme munitions.
|
||||||
unit.ghoul.description = Un bombardier lourd. Utilise de la pyratite ou des explosifs comme munitions.
|
unit.ghoul.description = Un bombardier lourd. Utilise de la pyratite ou des explosifs comme munitions.
|
||||||
unit.revenant.description = Un arsenal de missiles lourd et planant.
|
unit.revenant.description = Un arsenal de missiles lourd et planant.
|
||||||
@@ -1012,6 +1029,7 @@ block.ripple.description = Une grande tourelle d'artillerie qui tire plusieurs c
|
|||||||
block.cyclone.description = Une grande tourelle à tir rapide.
|
block.cyclone.description = Une grande tourelle à tir rapide.
|
||||||
block.spectre.description = Une grande tourelle qui tire deux balles puissantes à la fois.
|
block.spectre.description = Une grande tourelle qui tire deux balles puissantes à la fois.
|
||||||
block.meltdown.description = Une grande tourelle qui tire de puissants faisceaux à longue portée.
|
block.meltdown.description = Une grande tourelle qui tire de puissants faisceaux à longue portée.
|
||||||
|
block.command-center.description = Donne des ordres aux unités alliées sur la carte.\nPermet aux unités de patrouiller, d’attaquer un noyau ennemi ou de se retirer dans le noyau/l’usine. En l'absence de base ennemi, les unités patrouillent par défaut autour du centre de commandement.
|
||||||
block.draug-factory.description = Produces Draug mining drones.
|
block.draug-factory.description = Produces Draug mining drones.
|
||||||
block.spirit-factory.description = Produit des drones légers qui extraient du minerai et réparent des blocs.
|
block.spirit-factory.description = Produit des drones légers qui extraient du minerai et réparent des blocs.
|
||||||
block.phantom-factory.description = Produit des drones avancés qui sont bien plus efficaces que les drones spirituels.
|
block.phantom-factory.description = Produit des drones avancés qui sont bien plus efficaces que les drones spirituels.
|
||||||
|
|||||||
@@ -16,6 +16,11 @@ screenshot.invalid = Peta terlalu besar, tidak cukp memori untuk menangkap layar
|
|||||||
gameover = Permainan Habis
|
gameover = Permainan Habis
|
||||||
gameover.pvp = Tim[accent] {0}[] menang!
|
gameover.pvp = Tim[accent] {0}[] menang!
|
||||||
highscore = [accent]Rekor Baru!
|
highscore = [accent]Rekor Baru!
|
||||||
|
load.sound = Sounds
|
||||||
|
load.map = Maps
|
||||||
|
load.image = Images
|
||||||
|
load.content = Content
|
||||||
|
load.system = System
|
||||||
stat.wave = Gelombang Terkalahkan:[accent] {0}
|
stat.wave = Gelombang Terkalahkan:[accent] {0}
|
||||||
stat.enemiesDestroyed = Musuh Terhancurkan:[accent] {0}
|
stat.enemiesDestroyed = Musuh Terhancurkan:[accent] {0}
|
||||||
stat.built = Jumlah Blok yang Dibangun:[accent] {0}
|
stat.built = Jumlah Blok yang Dibangun:[accent] {0}
|
||||||
@@ -23,8 +28,6 @@ stat.destroyed = Jumlah Blok Dihancurkan Musuh:[accent] {0}
|
|||||||
stat.deconstructed = Jumlah Blok Dihancurkan Pemain:[accent] {0}
|
stat.deconstructed = Jumlah Blok Dihancurkan Pemain:[accent] {0}
|
||||||
stat.delivered = Sumber Daya yang Diluncurkan:
|
stat.delivered = Sumber Daya yang Diluncurkan:
|
||||||
stat.rank = Nilai Akhir: [accent]{0}
|
stat.rank = Nilai Akhir: [accent]{0}
|
||||||
placeline = Anda telah memilih sebuah blok.\nAnda bisa[accent] menaruhnya berjejeran[] dengan[accent] menekan layar beberapa saat[] dan menarik jarimu ke arah yang dituju.\n\n[scarlet]Cobalah.
|
|
||||||
removearea = Anda telah memilih mode penghancuran.\nAnda bisa[accent] menghancurkan blok dalam sebuah kotak[] dengan[accent] menekan layar beberapa saat[] dan menarik jarimu sampai membentuk sebuah area.\n\n[scarlet]Cobalah.
|
|
||||||
launcheditems = [accent]Sumber Daya
|
launcheditems = [accent]Sumber Daya
|
||||||
map.delete = Apakah Anda yakin ingin menghapus peta "[accent]{0}[]"?
|
map.delete = Apakah Anda yakin ingin menghapus peta "[accent]{0}[]"?
|
||||||
level.highscore = Nilai Tertinggi: [accent]{0}
|
level.highscore = Nilai Tertinggi: [accent]{0}
|
||||||
@@ -63,9 +66,11 @@ players.single = {0} pemain aktif
|
|||||||
server.closing = [accent]Menutup server...
|
server.closing = [accent]Menutup server...
|
||||||
server.kicked.kick = Anda telah dikeluarkan dari server!
|
server.kicked.kick = Anda telah dikeluarkan dari server!
|
||||||
server.kicked.serverClose = Server ditutup.
|
server.kicked.serverClose = Server ditutup.
|
||||||
|
server.kicked.vote = You have been vote-kicked. Goodbye.
|
||||||
server.kicked.clientOutdated = Client kadaluarsa! perbarui permainan Anda!
|
server.kicked.clientOutdated = Client kadaluarsa! perbarui permainan Anda!
|
||||||
server.kicked.serverOutdated = Server kadaluarsa! Tanya host untuk diperbarui!
|
server.kicked.serverOutdated = Server kadaluarsa! Tanya host untuk diperbarui!
|
||||||
server.kicked.banned = Anda telah dilarang untuk memasuki server ini.
|
server.kicked.banned = Anda telah dilarang untuk memasuki server ini.
|
||||||
|
server.kicked.typeMismatch = This server is not compatible with your build type.
|
||||||
server.kicked.recentKick = Anda baru saja dikeluarkan dari server ini.\nTunggu sebelum masuk lagi.
|
server.kicked.recentKick = Anda baru saja dikeluarkan dari server ini.\nTunggu sebelum masuk lagi.
|
||||||
server.kicked.nameInUse = Sudah ada pemain dengan nama itu \ndi server ini.
|
server.kicked.nameInUse = Sudah ada pemain dengan nama itu \ndi server ini.
|
||||||
server.kicked.nameEmpty = Nama yang dipilih tidak valid.
|
server.kicked.nameEmpty = Nama yang dipilih tidak valid.
|
||||||
@@ -156,6 +161,11 @@ cancel = Batal
|
|||||||
openlink = Buka Tautan
|
openlink = Buka Tautan
|
||||||
copylink = Salin Tautan
|
copylink = Salin Tautan
|
||||||
back = Kembali
|
back = Kembali
|
||||||
|
data.export = Export Data
|
||||||
|
data.import = Import Data
|
||||||
|
data.exported = Data exported.
|
||||||
|
data.invalid = This isn't valid game data.
|
||||||
|
data.import.confirm = Importing external data will erase[scarlet] all[] your current game data.\n[accent]This cannot be undone![]\n\nOnce the data is imported, your game will exit immediately.
|
||||||
classic.export = Export Classic Data
|
classic.export = Export Classic Data
|
||||||
classic.export.text = [accent]Mindustry[] has just had a major update.\nClassic (v3.5 build 40) save or map data has been detected. Would you like to export these saves to your phone's home folder, for use in the Mindustry Classic app?
|
classic.export.text = [accent]Mindustry[] has just had a major update.\nClassic (v3.5 build 40) save or map data has been detected. Would you like to export these saves to your phone's home folder, for use in the Mindustry Classic app?
|
||||||
quit.confirm = Apakah Anda yakin ingin keluar?
|
quit.confirm = Apakah Anda yakin ingin keluar?
|
||||||
@@ -376,6 +386,7 @@ zone.fungalPass.description = A transition area between high mountains and lower
|
|||||||
zone.impact0078.description = <insert description here>
|
zone.impact0078.description = <insert description here>
|
||||||
zone.crags.description = <insert description here>
|
zone.crags.description = <insert description here>
|
||||||
settings.language = Bahasa
|
settings.language = Bahasa
|
||||||
|
settings.data = Game Data
|
||||||
settings.reset = Atur ulang ke Default (standar)
|
settings.reset = Atur ulang ke Default (standar)
|
||||||
settings.rebind = Rebind
|
settings.rebind = Rebind
|
||||||
settings.controls = Kontrol
|
settings.controls = Kontrol
|
||||||
@@ -507,6 +518,7 @@ setting.mutemusic.name = Diamkan Musik
|
|||||||
setting.sfxvol.name = Volume SFX
|
setting.sfxvol.name = Volume SFX
|
||||||
setting.mutesound.name = Diamkan Suara
|
setting.mutesound.name = Diamkan Suara
|
||||||
setting.crashreport.name = Laporkan Masalah
|
setting.crashreport.name = Laporkan Masalah
|
||||||
|
setting.savecreate.name = Auto-Create Saves
|
||||||
setting.chatopacity.name = Jelas-Beningnya Chat
|
setting.chatopacity.name = Jelas-Beningnya Chat
|
||||||
setting.playerchat.name = Tunjukkan Chat dalam Permainan
|
setting.playerchat.name = Tunjukkan Chat dalam Permainan
|
||||||
uiscale.reset = UI scale has been changed.\nPress "OK" to confirm this scale.\n[scarlet]Reverting and exiting in[accent] {0}[] settings...
|
uiscale.reset = UI scale has been changed.\nPress "OK" to confirm this scale.\n[scarlet]Reverting and exiting in[accent] {0}[] settings...
|
||||||
@@ -527,6 +539,7 @@ keybind.press.axis = Tekan sumbu atau kunci...
|
|||||||
keybind.screenshot.name = Tangkapan Layar Peta
|
keybind.screenshot.name = Tangkapan Layar Peta
|
||||||
keybind.move_x.name = Pindah x
|
keybind.move_x.name = Pindah x
|
||||||
keybind.move_y.name = Pindah y
|
keybind.move_y.name = Pindah y
|
||||||
|
keybind.fullscreen.name = Toggle Fullscreen
|
||||||
keybind.select.name = Pilih/Tembak
|
keybind.select.name = Pilih/Tembak
|
||||||
keybind.diagonal_placement.name = Penaruhan Diagonal
|
keybind.diagonal_placement.name = Penaruhan Diagonal
|
||||||
keybind.pick.name = Memilih Blok
|
keybind.pick.name = Memilih Blok
|
||||||
@@ -790,6 +803,7 @@ block.blast-mixer.name = Mixer Peledak
|
|||||||
block.solar-panel.name = Panel Surya
|
block.solar-panel.name = Panel Surya
|
||||||
block.solar-panel-large.name = Panel Surya Besar
|
block.solar-panel-large.name = Panel Surya Besar
|
||||||
block.oil-extractor.name = Pegekstrak Oli
|
block.oil-extractor.name = Pegekstrak Oli
|
||||||
|
block.command-center.name = Command Center
|
||||||
block.draug-factory.name = Draug Miner Drone Factory
|
block.draug-factory.name = Draug Miner Drone Factory
|
||||||
block.spirit-factory.name = Pabrik Drone Spirit
|
block.spirit-factory.name = Pabrik Drone Spirit
|
||||||
block.phantom-factory.name = Pabrik Drone Phantom
|
block.phantom-factory.name = Pabrik Drone Phantom
|
||||||
@@ -1012,6 +1026,7 @@ block.ripple.description = Menara meriam besar yang menembak beberapa peluru sek
|
|||||||
block.cyclone.description = Menara Penembak Beruntun Besar.
|
block.cyclone.description = Menara Penembak Beruntun Besar.
|
||||||
block.spectre.description = Menara besar yang menembak dua peluru kuat sekaligus.
|
block.spectre.description = Menara besar yang menembak dua peluru kuat sekaligus.
|
||||||
block.meltdown.description = Menara besar ini menembak sinar panjang yang kuat.
|
block.meltdown.description = Menara besar ini menembak sinar panjang yang kuat.
|
||||||
|
block.command-center.description = Issues movement commands to allied units across the map.\nCauses units to patrol, attack an enemy core or retreat to the core/factory. When no enemy core is present, units will default to patrolling under the attack command.
|
||||||
block.draug-factory.description = Produces Draug mining drones.
|
block.draug-factory.description = Produces Draug mining drones.
|
||||||
block.spirit-factory.description = Memproduksi drone ringan yang menambang sumber daya dan memulih blok.
|
block.spirit-factory.description = Memproduksi drone ringan yang menambang sumber daya dan memulih blok.
|
||||||
block.phantom-factory.description = Memproduksi drone canggih yang lebih efektif dibandingkan drone spirit.
|
block.phantom-factory.description = Memproduksi drone canggih yang lebih efektif dibandingkan drone spirit.
|
||||||
|
|||||||
@@ -16,6 +16,11 @@ screenshot.invalid = マップが広すぎます。スクリーンショット
|
|||||||
gameover = ゲームオーバー
|
gameover = ゲームオーバー
|
||||||
gameover.pvp = [accent] {0}[] チームの勝利!
|
gameover.pvp = [accent] {0}[] チームの勝利!
|
||||||
highscore = [accent]ハイスコアを記録!
|
highscore = [accent]ハイスコアを記録!
|
||||||
|
load.sound = Sounds
|
||||||
|
load.map = Maps
|
||||||
|
load.image = Images
|
||||||
|
load.content = Content
|
||||||
|
load.system = System
|
||||||
stat.wave = 防衛したウェーブ:[accent] {0}
|
stat.wave = 防衛したウェーブ:[accent] {0}
|
||||||
stat.enemiesDestroyed = 敵による破壊数:[accent] {0}
|
stat.enemiesDestroyed = 敵による破壊数:[accent] {0}
|
||||||
stat.built = 建設した建造物数:[accent] {0}
|
stat.built = 建設した建造物数:[accent] {0}
|
||||||
@@ -23,8 +28,6 @@ stat.destroyed = 破壊した建造物数:[accent] {0}
|
|||||||
stat.deconstructed = 解体した建造物数:[accent] {0}
|
stat.deconstructed = 解体した建造物数:[accent] {0}
|
||||||
stat.delivered = 獲得した資源:
|
stat.delivered = 獲得した資源:
|
||||||
stat.rank = 最終ランク: [accent]{0}
|
stat.rank = 最終ランク: [accent]{0}
|
||||||
placeline = ブロックを選択しました。\n[accent]少し長押し[]して、好きな方向にドラッグすると[accent]一直線上にブロックを設置[]することができます。\nやってみよう。
|
|
||||||
removearea = 撤去モードが選択されました。\n[accent]少し長押し[]して、ドラッグすると[accent]範囲内のブロックを撤去[]することができます。\nやってみよう。
|
|
||||||
launcheditems = [accent]回収したアイテム
|
launcheditems = [accent]回収したアイテム
|
||||||
map.delete = マップ "[accent]{0}[]" を削除してもよろしいですか?
|
map.delete = マップ "[accent]{0}[]" を削除してもよろしいですか?
|
||||||
level.highscore = ハイスコア: [accent]{0}
|
level.highscore = ハイスコア: [accent]{0}
|
||||||
@@ -63,9 +66,11 @@ players.single = {0} 人がオンライン
|
|||||||
server.closing = [accent]サーバーを閉じています...
|
server.closing = [accent]サーバーを閉じています...
|
||||||
server.kicked.kick = サーバからキックされました!
|
server.kicked.kick = サーバからキックされました!
|
||||||
server.kicked.serverClose = サーバーが閉じられました。
|
server.kicked.serverClose = サーバーが閉じられました。
|
||||||
|
server.kicked.vote = You have been vote-kicked. Goodbye.
|
||||||
server.kicked.clientOutdated = 古いクライアントです! ゲームをアップデートしてください!
|
server.kicked.clientOutdated = 古いクライアントです! ゲームをアップデートしてください!
|
||||||
server.kicked.serverOutdated = 古いサーバーです! ホストに更新してもらってください!
|
server.kicked.serverOutdated = 古いサーバーです! ホストに更新してもらってください!
|
||||||
server.kicked.banned = サーバーからブロックされています。
|
server.kicked.banned = サーバーからブロックされています。
|
||||||
|
server.kicked.typeMismatch = This server is not compatible with your build type.
|
||||||
server.kicked.recentKick = 直前にキックされています。\nもう一度接続できるまでお待ちください。
|
server.kicked.recentKick = 直前にキックされています。\nもう一度接続できるまでお待ちください。
|
||||||
server.kicked.nameInUse = このサーバーでは、\nすでに同じ名前が使用されています。
|
server.kicked.nameInUse = このサーバーでは、\nすでに同じ名前が使用されています。
|
||||||
server.kicked.nameEmpty = 無効な名前です。
|
server.kicked.nameEmpty = 無効な名前です。
|
||||||
@@ -156,6 +161,11 @@ cancel = キャンセル
|
|||||||
openlink = リンクを開く
|
openlink = リンクを開く
|
||||||
copylink = リンクをコピー
|
copylink = リンクをコピー
|
||||||
back = 戻る
|
back = 戻る
|
||||||
|
data.export = Export Data
|
||||||
|
data.import = Import Data
|
||||||
|
data.exported = Data exported.
|
||||||
|
data.invalid = This isn't valid game data.
|
||||||
|
data.import.confirm = Importing external data will erase[scarlet] all[] your current game data.\n[accent]This cannot be undone![]\n\nOnce the data is imported, your game will exit immediately.
|
||||||
classic.export = Export Classic Data
|
classic.export = Export Classic Data
|
||||||
classic.export.text = [accent]Mindustry[] has just had a major update.\nClassic (v3.5 build 40) save or map data has been detected. Would you like to export these saves to your phone's home folder, for use in the Mindustry Classic app?
|
classic.export.text = [accent]Mindustry[] has just had a major update.\nClassic (v3.5 build 40) save or map data has been detected. Would you like to export these saves to your phone's home folder, for use in the Mindustry Classic app?
|
||||||
quit.confirm = 終了してもよろしいですか?
|
quit.confirm = 終了してもよろしいですか?
|
||||||
@@ -376,6 +386,7 @@ zone.fungalPass.description = A transition area between high mountains and lower
|
|||||||
zone.impact0078.description = <insert description here>
|
zone.impact0078.description = <insert description here>
|
||||||
zone.crags.description = <insert description here>
|
zone.crags.description = <insert description here>
|
||||||
settings.language = 言語
|
settings.language = 言語
|
||||||
|
settings.data = Game Data
|
||||||
settings.reset = デフォルトにリセット
|
settings.reset = デフォルトにリセット
|
||||||
settings.rebind = 再設定
|
settings.rebind = 再設定
|
||||||
settings.controls = コントロール
|
settings.controls = コントロール
|
||||||
@@ -507,6 +518,7 @@ setting.mutemusic.name = 音楽をミュート
|
|||||||
setting.sfxvol.name = 効果音 音量
|
setting.sfxvol.name = 効果音 音量
|
||||||
setting.mutesound.name = 効果音をミュート
|
setting.mutesound.name = 効果音をミュート
|
||||||
setting.crashreport.name = 匿名でクラッシュレポートを送信する
|
setting.crashreport.name = 匿名でクラッシュレポートを送信する
|
||||||
|
setting.savecreate.name = Auto-Create Saves
|
||||||
setting.chatopacity.name = チャットの透明度
|
setting.chatopacity.name = チャットの透明度
|
||||||
setting.playerchat.name = ゲーム内にチャットを表示
|
setting.playerchat.name = ゲーム内にチャットを表示
|
||||||
uiscale.reset = UI scale has been changed.\nPress "OK" to confirm this scale.\n[scarlet]Reverting and exiting in[accent] {0}[] settings...
|
uiscale.reset = UI scale has been changed.\nPress "OK" to confirm this scale.\n[scarlet]Reverting and exiting in[accent] {0}[] settings...
|
||||||
@@ -527,6 +539,7 @@ keybind.press.axis = 軸またはキーを押してください...
|
|||||||
keybind.screenshot.name = スクリーンショット
|
keybind.screenshot.name = スクリーンショット
|
||||||
keybind.move_x.name = 左右移動
|
keybind.move_x.name = 左右移動
|
||||||
keybind.move_y.name = 上下移動
|
keybind.move_y.name = 上下移動
|
||||||
|
keybind.fullscreen.name = Toggle Fullscreen
|
||||||
keybind.select.name = 選択/ショット
|
keybind.select.name = 選択/ショット
|
||||||
keybind.diagonal_placement.name = 斜め設置
|
keybind.diagonal_placement.name = 斜め設置
|
||||||
keybind.pick.name = ブロックの選択
|
keybind.pick.name = ブロックの選択
|
||||||
@@ -790,6 +803,7 @@ block.blast-mixer.name = 化合物ミキサー
|
|||||||
block.solar-panel.name = ソーラーパネル
|
block.solar-panel.name = ソーラーパネル
|
||||||
block.solar-panel-large.name = 大型ソーラーパネル
|
block.solar-panel-large.name = 大型ソーラーパネル
|
||||||
block.oil-extractor.name = 石油抽出機
|
block.oil-extractor.name = 石油抽出機
|
||||||
|
block.command-center.name = Command Center
|
||||||
block.draug-factory.name = Draug Miner Drone Factory
|
block.draug-factory.name = Draug Miner Drone Factory
|
||||||
block.spirit-factory.name = スピリットドローン製造機
|
block.spirit-factory.name = スピリットドローン製造機
|
||||||
block.phantom-factory.name = ファントムドローン製造機
|
block.phantom-factory.name = ファントムドローン製造機
|
||||||
@@ -1012,6 +1026,7 @@ block.ripple.description = 同時に複数ショットを発射する大型タ
|
|||||||
block.cyclone.description = 大型の連射型ターレットです。
|
block.cyclone.description = 大型の連射型ターレットです。
|
||||||
block.spectre.description = 一度に2発の強力な弾を放つ大型のターレットです。
|
block.spectre.description = 一度に2発の強力な弾を放つ大型のターレットです。
|
||||||
block.meltdown.description = 強力な長距離攻撃が可能な大型のターレットです。
|
block.meltdown.description = 強力な長距離攻撃が可能な大型のターレットです。
|
||||||
|
block.command-center.description = Issues movement commands to allied units across the map.\nCauses units to patrol, attack an enemy core or retreat to the core/factory. When no enemy core is present, units will default to patrolling under the attack command.
|
||||||
block.draug-factory.description = Produces Draug mining drones.
|
block.draug-factory.description = Produces Draug mining drones.
|
||||||
block.spirit-factory.description = 鉱石の採掘やブロックの修復を行う小型のドローンユニットのスピリットを製造します。
|
block.spirit-factory.description = 鉱石の採掘やブロックの修復を行う小型のドローンユニットのスピリットを製造します。
|
||||||
block.phantom-factory.description = スピリットドローンの性能を遥かに凌ぐ上位のドローンユニットのファントムドローンを製造します。
|
block.phantom-factory.description = スピリットドローンの性能を遥かに凌ぐ上位のドローンユニットのファントムドローンを製造します。
|
||||||
|
|||||||
@@ -16,6 +16,13 @@ screenshot.invalid = 맵이 너무 커서 스크린샷을 찍을 메모리가
|
|||||||
gameover = 게임 오버
|
gameover = 게임 오버
|
||||||
gameover.pvp = [accent]{0}[] 팀이 승리했습니다!
|
gameover.pvp = [accent]{0}[] 팀이 승리했습니다!
|
||||||
highscore = [accent]최고점수 달성!
|
highscore = [accent]최고점수 달성!
|
||||||
|
|
||||||
|
load.sound = 소리
|
||||||
|
load.map = 맵
|
||||||
|
load.image = 사진
|
||||||
|
load.content = 컨텐츠
|
||||||
|
load.system = 시스템
|
||||||
|
|
||||||
stat.wave = 웨이브 성공:[accent]{0}
|
stat.wave = 웨이브 성공:[accent]{0}
|
||||||
stat.enemiesDestroyed = 파괴한 적 수:[accent]{0}
|
stat.enemiesDestroyed = 파괴한 적 수:[accent]{0}
|
||||||
stat.built = 건설한 건물 수:[accent]{0}
|
stat.built = 건설한 건물 수:[accent]{0}
|
||||||
@@ -23,10 +30,9 @@ stat.destroyed = 파괴된 건물 수:[accent]{0}
|
|||||||
stat.deconstructed = 파괴한 건물 수:[accent]{0}
|
stat.deconstructed = 파괴한 건물 수:[accent]{0}
|
||||||
stat.delivered = 획득한 자원:
|
stat.delivered = 획득한 자원:
|
||||||
stat.rank = 최종 기록: [accent]{0}
|
stat.rank = 최종 기록: [accent]{0}
|
||||||
placeline = 블록을 선택하셨습니다.\n][accent]몇초간 설치 시작지점을 누르고[] 원하는 방향을 향해 드래그 하면 [accent]일렬로[] 설치할 수 있습니다.\n한번 해 보세요.
|
|
||||||
removearea = 블록 제거모드를 선택하셨습니다.\n[accent]몇초간 제거 시작지점을 누르고[] 원하는 구역 끝을 향해 드래그 하면 [accent]직사각형[] 안에 있는 모든 건물을 제거할 수 있습니다.\n한번 해 보세요.
|
|
||||||
launcheditems = [accent]창고
|
launcheditems = [accent]창고
|
||||||
map.delete = 정말로 "[accent]{0}[]" 맵을 삭제하시겠습니까?\n
|
map.delete = 정말로 "[accent]{0}[]" 맵을 삭제하시겠습니까?
|
||||||
level.highscore = 최고 점수: [accent]{0}
|
level.highscore = 최고 점수: [accent]{0}
|
||||||
level.select = 맵 선택
|
level.select = 맵 선택
|
||||||
level.mode = 게임 모드 :
|
level.mode = 게임 모드 :
|
||||||
@@ -46,8 +52,17 @@ close = 닫기
|
|||||||
website = 웹사이트
|
website = 웹사이트
|
||||||
quit = 나가기
|
quit = 나가기
|
||||||
maps = 맵
|
maps = 맵
|
||||||
|
maps.browse = 맵 검색
|
||||||
continue = 계속하기
|
continue = 계속하기
|
||||||
maps.none = [LIGHT_GRAY]맵을 찾을 수 없습니다!
|
maps.none = [LIGHT_GRAY]맵을 찾을 수 없습니다!
|
||||||
|
invalid = 오류
|
||||||
|
preparingconfig = 설정 사전준비
|
||||||
|
preparingcontent = 컨텐츠 사전준비
|
||||||
|
uploadingcontent = 컨텐츠 업로드
|
||||||
|
uploadingpreviewfile = 미리보기 파일 업로드
|
||||||
|
committingchanges = 바뀐 점 적용
|
||||||
|
done = 완료
|
||||||
|
|
||||||
about.button = 정보
|
about.button = 정보
|
||||||
name = 이름 :
|
name = 이름 :
|
||||||
noname = 먼저 [accent] 유저 이름[] 을 설정하세요.
|
noname = 먼저 [accent] 유저 이름[] 을 설정하세요.
|
||||||
@@ -62,25 +77,30 @@ players = 현재 {0}명 접속중
|
|||||||
players.single = 현재 {0}명만 있음.
|
players.single = 현재 {0}명만 있음.
|
||||||
server.closing = [accent]서버 닫는중...
|
server.closing = [accent]서버 닫는중...
|
||||||
server.kicked.kick = 서버에서 추방되었습니다!
|
server.kicked.kick = 서버에서 추방되었습니다!
|
||||||
|
server.kicked.whitelist = 당신은 여기의 화이트리스트가 아닙니다.
|
||||||
server.kicked.serverClose = 서버 종료됨.
|
server.kicked.serverClose = 서버 종료됨.
|
||||||
|
server.kicked.vote = 당신은 투표로 추방되었습니다. 그러니 좀 적당히 하지 그랬어요?
|
||||||
server.kicked.clientOutdated = 오래된 버전의 게임입니다! 게임을 업데이트 하세요!
|
server.kicked.clientOutdated = 오래된 버전의 게임입니다! 게임을 업데이트 하세요!
|
||||||
server.kicked.serverOutdated = 오래된 버전의 서버입니다! 서버 호스트 관리자에게 문의하세요!
|
server.kicked.serverOutdated = 오래된 버전의 서버입니다! 서버 호스트 관리자에게 문의하세요!
|
||||||
server.kicked.banned = 서버 규칙 위반으로 인해, 이제 당신은 영원히 이 서버를 플레이 하실 수 없습니다.
|
server.kicked.banned = 서버 규칙 위반으로 인해, 이제 당신은 영원히 이 서버를 플레이 하실 수 없습니다.
|
||||||
|
server.kicked.typeMismatch = 클라이언트와 호환되지 않는 서버입니다. 디스코드에서 #mods에 들러보는 건 어떨까요?
|
||||||
|
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.versions = 클라이언트 버전 : [accent] {0}[]\n서버 버전 : [accent] {1}[]
|
server.versions = 클라이언트 버전 : [accent] {0}[]\n서버 버전 : [accent] {1}[]
|
||||||
host.info = [accent]호스트[] 버튼은 현재 네트워크의 [scarlet]6567[] 포트를 사용합니다.\n[LIGHT_GRAY]같은 Wi-Fi 또는 로컬 네트워크[] 에서 서버 목록을 볼 수 있습니다.\n\n만약 플레이어들이 이 IP를 통해 어디에서나 연결할 수 있게 하고 싶다면, 공유기 설정에서 [accent]포트 포워딩[]을 하시거나 Vpn을 사용하셔야 합니다.\n\n[LIGHT_GRAY]참고: LAN 게임 연결에 문제가 있는 사람이 있다면, 방화벽 설정에서 Mindustry 가 로컬 네트워크에 액세스하도록 허용했는지 확인 해 주세요.
|
host.info = [accent]호스트[] 버튼은 현재 네트워크의 [scarlet]6567[] 포트를 사용합니다.\n[LIGHT_GRAY]같은 Wi-Fi 또는 로컬 네트워크[] 에서 서버 목록을 볼 수 있습니다.\n\n만약 플레이어들이 이 IP를 통해 어디에서나 연결할 수 있게 하고 싶다면, 공유기 설정에서 [accent]포트 포워딩[]을 하시거나 Vpn을 사용하셔야 합니다.\n\n[LIGHT_GRAY]참고: LAN 게임 연결에 문제가 있는 사람이 있다면, 방화벽 설정에서 Mindustry 가 로컬 네트워크에 액세스하도록 허용했는지 확인 해 주세요.
|
||||||
join.info = 여기서 [accent]서버 IP[]를 입력하여 다른 서버에 접속할 수 있습니다.\n또는 [accent]로컬 네트워크(LAN)[] 서버를 검색하여 접속할 수 있습니다.\nLAN 및 WAN 멀티 플레이어 모두 지원됩니다.\n\n[LIGHT_GRAY]참고:여기에서는 자동으로 글로벌 서버를 추가하지 않습니다. IP로 다른 사람의 서버에 접속할려면 직접 서버 주소를 찾아서 적으셔야합니다.[]\n\n[ROYAL]한국의 공식 서버로는 mindustry.kr[accent](포트없음)[],6568과 server1.mindustry.r-e.kr의 8000,8001,8002,8004포트가 있습니다.\n서버 주소 입력방법은 < 주소:포트 >의 형식입니다.
|
join.info = 여기서 [accent]서버 IP[]를 입력하여 다른 서버에 접속할 수 있습니다.\n또는 [accent]로컬 네트워크(LAN)[] 서버를 검색하여 접속할 수 있습니다.\nLAN 및 WAN 멀티 플레이어 모두 지원됩니다.\n\n[LIGHT_GRAY]참고:여기에서는 자동으로 글로벌 서버를 추가하지 않습니다. IP로 다른 사람의 서버에 접속할려면 직접 서버 주소를 찾아서 적으셔야합니다.[]\n\n[ROYAL]한국의 서버로는 mindustry.kr[accent](포트없음)[],6568과 server1.mindustry.r-e.kr의 8000,8001,8002,8004포트가 있습니다.\n서버 주소 입력방법은 < 주소:포트 >의 형식입니다.
|
||||||
hostserver = 서버 열기
|
hostserver = 서버 열기
|
||||||
hostserver.mobile = 서버\n열기
|
hostserver.mobile = 서버\n열기
|
||||||
host = 서버 열기
|
host = 서버 열기
|
||||||
hosting = [accent]서버 여는중...
|
hosting = [accent]서버 여는중...
|
||||||
hosts.refresh = 새로고침
|
hosts.refresh = 새로고침
|
||||||
hosts.discovering = LAN 게임 찾기
|
hosts.discovering = LAN 게임 찾기
|
||||||
|
hosts.discovering.any = 서버 찾기
|
||||||
server.refreshing = 서버 목록 새로고치는중...
|
server.refreshing = 서버 목록 새로고치는중...
|
||||||
hosts.none = [lightgray]LAN 게임을 찾을 수 없습니다!
|
hosts.none = [lightgray]LAN 게임을 찾을 수 없습니다!
|
||||||
host.invalid = [scarlet]서버에 연결할 수 없습니다!
|
host.invalid = [scarlet]서버에 연결할 수 없습니다!
|
||||||
@@ -110,12 +130,16 @@ confirmunadmin = 이 플레이어를 일반 유저로 만들겠습니까?
|
|||||||
joingame.title = 게임 참가
|
joingame.title = 게임 참가
|
||||||
joingame.ip = 주소:
|
joingame.ip = 주소:
|
||||||
disconnect = 서버와 연결이 해제되었습니다.
|
disconnect = 서버와 연결이 해제되었습니다.
|
||||||
disconnect.data = 맵 데이터를 받아오는데 실패했습니다!
|
disconnect.data = 맵 데이터를 받아오는데 실패했습니다..
|
||||||
|
disconnect.closed = 연결이 끊어졌습니다..
|
||||||
|
disconnect.timeout = 연결 시간 한계 도달..
|
||||||
|
disconnect.data = 월드 데이터 로딩 실패..
|
||||||
|
|
||||||
connecting = [accent]연결중...
|
connecting = [accent]연결중...
|
||||||
connecting.data = [accent]맵 데이터 다운로드중...
|
connecting.data = [accent]월드 데이터 로딩중...
|
||||||
server.port = 포트:
|
server.port = 포트:
|
||||||
server.addressinuse = 이 주소는 이미 사용중입니다!
|
server.addressinuse = 주소가 이미 사용중입니다!
|
||||||
server.invalidport = 포트 번호가 잘못되었습니다.
|
server.invalidport = 포트가 올바르지 않습니다!
|
||||||
server.error = [accent]{0}[crimson]서버를 여는데 오류가 발생했습니다.
|
server.error = [accent]{0}[crimson]서버를 여는데 오류가 발생했습니다.
|
||||||
save.old = 이 저장파일은 이전 버전의 게임용이며, 지금은 사용할 수 없습니다. \n\n[LIGHT_GRAY]4.0 정식때 이전 게임버전에서 만든 저장파일과 호환됩니다.
|
save.old = 이 저장파일은 이전 버전의 게임용이며, 지금은 사용할 수 없습니다. \n\n[LIGHT_GRAY]4.0 정식때 이전 게임버전에서 만든 저장파일과 호환됩니다.
|
||||||
save.new = 새로 저장
|
save.new = 새로 저장
|
||||||
@@ -143,7 +167,7 @@ off = 끄기
|
|||||||
save.autosave = 자동저장: {0}
|
save.autosave = 자동저장: {0}
|
||||||
save.map = 맵: {0}
|
save.map = 맵: {0}
|
||||||
save.wave = 웨이브 {0}
|
save.wave = 웨이브 {0}
|
||||||
save.difficulty = 난이도: {0}
|
save.mode = 게임모드 : {0}
|
||||||
save.date = 마지막 저장날짜: {0}
|
save.date = 마지막 저장날짜: {0}
|
||||||
save.playtime = 플레이시간: {0}
|
save.playtime = 플레이시간: {0}
|
||||||
warning = 경고.
|
warning = 경고.
|
||||||
@@ -156,6 +180,11 @@ cancel = 취소
|
|||||||
openlink = 링크 열기
|
openlink = 링크 열기
|
||||||
copylink = 링크 복사
|
copylink = 링크 복사
|
||||||
back = 뒤로가기
|
back = 뒤로가기
|
||||||
|
data.export = 데이터 내보내기
|
||||||
|
data.import = 데이터 불러오기
|
||||||
|
data.exported = 데이터를 내보냈습니다.
|
||||||
|
data.invalid = 유효한 게임 데이터가 아닙니다.
|
||||||
|
data.import.confirm = 외부 게임 데이터를 불러옵니다...\n[accent]이 작업시 현재 게임 데이터는 삭제되고, 외부의 게임 데이터를 불러오니 주의하세요. 실행 취소가 불가능하며, 작업 후 게임이 바로 꺼집니다.
|
||||||
classic.export = 클래식 데이터 추출
|
classic.export = 클래식 데이터 추출
|
||||||
classic.export.text = Mindustry 클래식 (v3.5 build 40)의 세이브파일 또는 맵 데이터가 발견되었습니다. 이 것들을 Mindustry 클래식 앱에서 사용하기 위해 홈 폴더로 추출할까요?
|
classic.export.text = Mindustry 클래식 (v3.5 build 40)의 세이브파일 또는 맵 데이터가 발견되었습니다. 이 것들을 Mindustry 클래식 앱에서 사용하기 위해 홈 폴더로 추출할까요?
|
||||||
quit.confirm = 정말로 종료하시겠습니까?
|
quit.confirm = 정말로 종료하시겠습니까?
|
||||||
@@ -177,9 +206,12 @@ builtin = 기본맵
|
|||||||
map.delete.confirm = 이 맵을 삭제하시겠습니까? 이 명령은 취소할 수 없습니다!
|
map.delete.confirm = 이 맵을 삭제하시겠습니까? 이 명령은 취소할 수 없습니다!
|
||||||
map.random = [accent]랜덤 맵
|
map.random = [accent]랜덤 맵
|
||||||
map.nospawn = 이 맵에 플레이어가 생성될 코어가 없습니다! 맵 편집기에서 [ROYAL]노랑색 팀[]코어를 맵에 추가하세요.
|
map.nospawn = 이 맵에 플레이어가 생성될 코어가 없습니다! 맵 편집기에서 [ROYAL]노랑색 팀[]코어를 맵에 추가하세요.
|
||||||
map.nospawn.pvp = 이 맵에는 적팀 코어가 없습니다! 에디터에서 [ROYAL]파란색 팀이 아닌[] 코어를 추가하세요.
|
map.nospawn.pvp = 이 맵에는 적팀 코어가 없습니다! 에디터에서 [ROYAL]노랑색 팀이 아닌[] 코어를 추가하세요.
|
||||||
map.nospawn.attack = 이 맵에는 플레이어가 공격할 수 있는 적의 코어가 없습니다! 에디터에서 [ROYAL] 빨강색 팀[] 코어를 맵에 추가하세요.
|
map.nospawn.attack = 이 맵에는 플레이어가 공격할 수 있는 적의 코어가 없습니다! 에디터에서 [ROYAL] 빨강색 팀[] 코어를 맵에 추가하세요.
|
||||||
map.invalid = 파일이 잘못되었거나 손상되어 맵을 열 수 없습니다.
|
map.invalid = 파일이 잘못되었거나 손상되어 맵을 열 수 없습니다.
|
||||||
|
map.publish.error = 맵 업로드 오류 : {0}
|
||||||
|
map.publish = 맵 업로드 완료!
|
||||||
|
map.publishing = [accent]맵 업로드 중...
|
||||||
editor.brush = 브러쉬
|
editor.brush = 브러쉬
|
||||||
editor.openin = 편집기 열기
|
editor.openin = 편집기 열기
|
||||||
editor.oregen = 광물 무작위 생성
|
editor.oregen = 광물 무작위 생성
|
||||||
@@ -191,7 +223,9 @@ editor.waves = 웨이브:
|
|||||||
editor.rules = 규칙:
|
editor.rules = 규칙:
|
||||||
editor.generation = 맵 생성 설정:
|
editor.generation = 맵 생성 설정:
|
||||||
editor.ingame = 인게임 편집
|
editor.ingame = 인게임 편집
|
||||||
|
editor.publish.workshop = 워크샵 업로드
|
||||||
editor.newmap = 신규 맵
|
editor.newmap = 신규 맵
|
||||||
|
workshop = 워크샵
|
||||||
waves.title = 웨이브
|
waves.title = 웨이브
|
||||||
waves.remove = 삭제
|
waves.remove = 삭제
|
||||||
waves.never = 여기까지 유닛생성
|
waves.never = 여기까지 유닛생성
|
||||||
@@ -206,8 +240,9 @@ waves.copy = 클립보드로 복사
|
|||||||
waves.load = 클립보드에서 불러오기
|
waves.load = 클립보드에서 불러오기
|
||||||
waves.invalid = 클립보드의 잘못된 웨이브 데이터
|
waves.invalid = 클립보드의 잘못된 웨이브 데이터
|
||||||
waves.copied = 웨이브 복사됨
|
waves.copied = 웨이브 복사됨
|
||||||
waves.none = No enemies defined.\nNote that empty wave layouts will automatically be replaced with the default layout.
|
waves.none = 적 웨이브가 설정되지 않았습니다.\n비어있을 시 자동으로 기본 적 웨이브로 설정됩니다.
|
||||||
editor.default = [LIGHT_GRAY]<기본값>
|
editor.default = [LIGHT_GRAY]<기본값>
|
||||||
|
details = 설명
|
||||||
edit = 편집
|
edit = 편집
|
||||||
editor.name = 이름:
|
editor.name = 이름:
|
||||||
editor.spawn = 유닛 생성
|
editor.spawn = 유닛 생성
|
||||||
@@ -217,6 +252,7 @@ editor.errorload = [accent]{0} 파일을 불러오는데 실패했습니다.
|
|||||||
editor.errorsave = [accent]{0} 파일을 저장하는데 실패했습니다.
|
editor.errorsave = [accent]{0} 파일을 저장하는데 실패했습니다.
|
||||||
editor.errorimage = 이것은 맵이 아니라 사진입니다.\n\n예전 맵을 가져올려면 편집기의 '예전 맵 가져오기' 버튼을 사용하세요.
|
editor.errorimage = 이것은 맵이 아니라 사진입니다.\n\n예전 맵을 가져올려면 편집기의 '예전 맵 가져오기' 버튼을 사용하세요.
|
||||||
editor.errorlegacy = 이 맵은 너무 오래되어, 더이상 지원하지 않는 맵 형식을 사용합니다.
|
editor.errorlegacy = 이 맵은 너무 오래되어, 더이상 지원하지 않는 맵 형식을 사용합니다.
|
||||||
|
editor.errornot = 선택한 대상이 맵 파일이 아닙니다.
|
||||||
editor.errorheader = 이 맵 파일은 유효하지 않거나 손상되었습니다.
|
editor.errorheader = 이 맵 파일은 유효하지 않거나 손상되었습니다.
|
||||||
editor.errorname = 맵에 이름이 지정되어 있지 않습니다.
|
editor.errorname = 맵에 이름이 지정되어 있지 않습니다.
|
||||||
editor.update = 업데이트
|
editor.update = 업데이트
|
||||||
@@ -250,6 +286,7 @@ editor.mapname = 맵 이름:
|
|||||||
editor.overwrite = [accept]경고!이 명령은 기존 맵을 덮어씌우게 됩니다.
|
editor.overwrite = [accept]경고!이 명령은 기존 맵을 덮어씌우게 됩니다.
|
||||||
editor.overwrite.confirm = [scarlet]경고![] 이 이름을 가진 맵이 이미 있습니다. 덮어 쓰시겠습니까?
|
editor.overwrite.confirm = [scarlet]경고![] 이 이름을 가진 맵이 이미 있습니다. 덮어 쓰시겠습니까?
|
||||||
editor.selectmap = 불러올 맵 선택:
|
editor.selectmap = 불러올 맵 선택:
|
||||||
|
|
||||||
toolmode.replace = 재배치
|
toolmode.replace = 재배치
|
||||||
toolmode.replace.description = 블록을 배치합니다.
|
toolmode.replace.description = 블록을 배치합니다.
|
||||||
toolmode.replaceall = 모두 재배치
|
toolmode.replaceall = 모두 재배치
|
||||||
@@ -264,6 +301,7 @@ toolmode.fillteams = 팀 채우기
|
|||||||
toolmode.fillteams.description = 블록 대신 팀 건물로 채웁니다.
|
toolmode.fillteams.description = 블록 대신 팀 건물로 채웁니다.
|
||||||
toolmode.drawteams = 팀 그리기
|
toolmode.drawteams = 팀 그리기
|
||||||
toolmode.drawteams.description = 블록 대신 팀 건물을 배치합니다.
|
toolmode.drawteams.description = 블록 대신 팀 건물을 배치합니다.
|
||||||
|
|
||||||
filters.empty = [LIGHT_GRAY]필터가 없습니다!! 아래 버튼을 눌러 추가하세요.
|
filters.empty = [LIGHT_GRAY]필터가 없습니다!! 아래 버튼을 눌러 추가하세요.
|
||||||
filter.distort = 왜곡
|
filter.distort = 왜곡
|
||||||
filter.noise = 맵 전체에 타일 혹은 블럭 뿌리기
|
filter.noise = 맵 전체에 타일 혹은 블럭 뿌리기
|
||||||
@@ -295,6 +333,7 @@ filter.option.floor2 = 2번째 바닥
|
|||||||
filter.option.threshold2 = 2번째 한계점
|
filter.option.threshold2 = 2번째 한계점
|
||||||
filter.option.radius = 반경
|
filter.option.radius = 반경
|
||||||
filter.option.percentile = 백분위수
|
filter.option.percentile = 백분위수
|
||||||
|
|
||||||
width = 넓이:
|
width = 넓이:
|
||||||
height = 높이:
|
height = 높이:
|
||||||
menu = 메뉴
|
menu = 메뉴
|
||||||
@@ -312,6 +351,7 @@ tutorial.retake = 튜토리얼
|
|||||||
editor = 편집기
|
editor = 편집기
|
||||||
mapeditor = 맵 편집기
|
mapeditor = 맵 편집기
|
||||||
donate = 기부
|
donate = 기부
|
||||||
|
|
||||||
abandon = 포기
|
abandon = 포기
|
||||||
abandon.text = 이 구역의 모든 자원이 적에게 빼앗길 것입니다.
|
abandon.text = 이 구역의 모든 자원이 적에게 빼앗길 것입니다.
|
||||||
locked = 잠김
|
locked = 잠김
|
||||||
@@ -328,6 +368,7 @@ launch.skip.confirm = 만약 지금 출격하시지 않고 스킵하신다면,
|
|||||||
uncover = 구역 개방
|
uncover = 구역 개방
|
||||||
configure = 코어 시작자원 설정
|
configure = 코어 시작자원 설정
|
||||||
configure.locked = {0} 단계에서 시작자원 설정 잠금이 해제됩니다.
|
configure.locked = {0} 단계에서 시작자원 설정 잠금이 해제됩니다.
|
||||||
|
configure.invalid = 해당 가격은 0 과 {0} 사이여야 합니다.
|
||||||
zone.unlocked = [LIGHT_GRAY] 잠금 해제되었습니다!
|
zone.unlocked = [LIGHT_GRAY] 잠금 해제되었습니다!
|
||||||
zone.requirement.complete = 웨이브 {0} 달성:\n{1} 지역 요구사항이 충족되었습니다!
|
zone.requirement.complete = 웨이브 {0} 달성:\n{1} 지역 요구사항이 충족되었습니다!
|
||||||
zone.config.complete = 웨이브 {0} 달성:\n시작자원 설정 기능이 해금되었습니다!
|
zone.config.complete = 웨이브 {0} 달성:\n시작자원 설정 기능이 해금되었습니다!
|
||||||
@@ -337,6 +378,7 @@ zone.objective.survival = 생존
|
|||||||
zone.objective.attack = 적 코어 파괴
|
zone.objective.attack = 적 코어 파괴
|
||||||
add = 추가...
|
add = 추가...
|
||||||
boss.health = 보스 체력
|
boss.health = 보스 체력
|
||||||
|
|
||||||
connectfail = [crimson]{0}[accent] 서버에 연결하지 못했습니다.[]
|
connectfail = [crimson]{0}[accent] 서버에 연결하지 못했습니다.[]
|
||||||
error.unreachable = 서버에 연결하지 못했습니다.\n서버 주소가 정확히 입력되었나요?
|
error.unreachable = 서버에 연결하지 못했습니다.\n서버 주소가 정확히 입력되었나요?
|
||||||
error.invalidaddress = 잘못된 주소입니다.
|
error.invalidaddress = 잘못된 주소입니다.
|
||||||
@@ -347,6 +389,7 @@ error.mapnotfound = 맵 파일을 찾을 수 없습니다!
|
|||||||
error.io = 네트워크 I/O 오류.
|
error.io = 네트워크 I/O 오류.
|
||||||
error.any = 알 수 없는 네트워크 오류.
|
error.any = 알 수 없는 네트워크 오류.
|
||||||
error.bloom = 블룸 그래픽 효과를 적용하지 못했습니다.\n당신의 기기가 이 기능을 지원하지 않는 것일 수도 있습니다.
|
error.bloom = 블룸 그래픽 효과를 적용하지 못했습니다.\n당신의 기기가 이 기능을 지원하지 않는 것일 수도 있습니다.
|
||||||
|
|
||||||
zone.groundZero.name = 전초기지
|
zone.groundZero.name = 전초기지
|
||||||
zone.desertWastes.name = 쓰레기 사막
|
zone.desertWastes.name = 쓰레기 사막
|
||||||
zone.craters.name = 크레이터
|
zone.craters.name = 크레이터
|
||||||
@@ -361,6 +404,7 @@ zone.saltFlats.name = 소금 사막
|
|||||||
zone.impact0078.name = Impact 0078
|
zone.impact0078.name = Impact 0078
|
||||||
zone.crags.name = 협곡
|
zone.crags.name = 협곡
|
||||||
zone.fungalPass.name = 포자 지대
|
zone.fungalPass.name = 포자 지대
|
||||||
|
|
||||||
zone.groundZero.description = 이 장소는 다시 시작하기에 최적의 환경을 지닌 장소입니다. 적은 수준의 위협이 있으며 자원의 양은 적습니다.\n가능한 한 많은 양의 구리와 납을 수집하십시오.\n출격합시다!
|
zone.groundZero.description = 이 장소는 다시 시작하기에 최적의 환경을 지닌 장소입니다. 적은 수준의 위협이 있으며 자원의 양은 적습니다.\n가능한 한 많은 양의 구리와 납을 수집하십시오.\n출격합시다!
|
||||||
zone.frozenForest.description = 이 지역도 산과 가까운 지역입니다 포자들이 흩뿌려져 있으며 극한의 추위도 포자룰 막을 수 있을거 같지 않습니다.\n전력을 통해서 모험을 시작하십시오 화력 발전소를 짓고 수리드론을 사용하는 법을 배우십시오.
|
zone.frozenForest.description = 이 지역도 산과 가까운 지역입니다 포자들이 흩뿌려져 있으며 극한의 추위도 포자룰 막을 수 있을거 같지 않습니다.\n전력을 통해서 모험을 시작하십시오 화력 발전소를 짓고 수리드론을 사용하는 법을 배우십시오.
|
||||||
zone.desertWastes.description = 이 황무지는 끝을 알수 없을 정도로 광활합니다 그리고 십자가 형태의 버려진 구조물이 존재합니다.\n석탄이 존재하며 이를 화력발전에 쓰거나 흑연정제에 쓰십시오.\n\n[lightgray]이 지역에서의 착륙장소는 확실하지 않습니다.
|
zone.desertWastes.description = 이 황무지는 끝을 알수 없을 정도로 광활합니다 그리고 십자가 형태의 버려진 구조물이 존재합니다.\n석탄이 존재하며 이를 화력발전에 쓰거나 흑연정제에 쓰십시오.\n\n[lightgray]이 지역에서의 착륙장소는 확실하지 않습니다.
|
||||||
@@ -375,7 +419,9 @@ zone.nuclearComplex.description = 과거 토륨의 생산, 연구와 처리를
|
|||||||
zone.fungalPass.description = 고산지대과 포자지대 사이의 지역입니다. 소규모의 적 정찰기지가 있으니 디거와 크롤러를 이용해 적의 코어를 파괴하십시오.
|
zone.fungalPass.description = 고산지대과 포자지대 사이의 지역입니다. 소규모의 적 정찰기지가 있으니 디거와 크롤러를 이용해 적의 코어를 파괴하십시오.
|
||||||
zone.impact0078.description = [ROYAL]죄송합니다. 아직 설명이 준비되지 않았습니다.
|
zone.impact0078.description = [ROYAL]죄송합니다. 아직 설명이 준비되지 않았습니다.
|
||||||
zone.crags.description = [ROYAL]죄송합니다. 아직 설명이 준비되지 않았습니다.
|
zone.crags.description = [ROYAL]죄송합니다. 아직 설명이 준비되지 않았습니다.
|
||||||
|
|
||||||
settings.language = 언어
|
settings.language = 언어
|
||||||
|
settings.data = 게임 데이터
|
||||||
settings.reset = 설정 초기화
|
settings.reset = 설정 초기화
|
||||||
settings.rebind = 키 재설정
|
settings.rebind = 키 재설정
|
||||||
settings.controls = 조작
|
settings.controls = 조작
|
||||||
@@ -400,7 +446,7 @@ blocks.booster = 가속
|
|||||||
block.unknown = [LIGHT_GRAY]???
|
block.unknown = [LIGHT_GRAY]???
|
||||||
blocks.powercapacity = 전력 용량
|
blocks.powercapacity = 전력 용량
|
||||||
blocks.powershot = 1발당 전력 소모량
|
blocks.powershot = 1발당 전력 소모량
|
||||||
blocks.damage = Damage
|
blocks.damage = 공격력
|
||||||
blocks.targetsair = 공중공격 가능
|
blocks.targetsair = 공중공격 가능
|
||||||
blocks.targetsground = 지상공격 가능
|
blocks.targetsground = 지상공격 가능
|
||||||
blocks.itemsmoved = 이동 속도
|
blocks.itemsmoved = 이동 속도
|
||||||
@@ -423,10 +469,12 @@ blocks.boosteffect = 가속 효과
|
|||||||
blocks.maxunits = 최대 활성유닛
|
blocks.maxunits = 최대 활성유닛
|
||||||
blocks.health = 체력
|
blocks.health = 체력
|
||||||
blocks.buildtime = 건설 시간
|
blocks.buildtime = 건설 시간
|
||||||
|
blocks.buildcost = 건설 재료
|
||||||
blocks.inaccuracy = 오차각
|
blocks.inaccuracy = 오차각
|
||||||
blocks.shots = 발포 횟수
|
blocks.shots = 발포 횟수
|
||||||
blocks.reload = 재장전
|
blocks.reload = 재장전
|
||||||
blocks.ammo = 탄약
|
blocks.ammo = 탄약
|
||||||
|
|
||||||
bar.drilltierreq = 드릴이 요구됨
|
bar.drilltierreq = 드릴이 요구됨
|
||||||
bar.drillspeed = 채광 속도 : {0}/s
|
bar.drillspeed = 채광 속도 : {0}/s
|
||||||
bar.efficiency = 효율성 : {0}%
|
bar.efficiency = 효율성 : {0}%
|
||||||
@@ -439,6 +487,7 @@ bar.heat = 발열
|
|||||||
bar.power = 전력
|
bar.power = 전력
|
||||||
bar.progress = 건설 진행
|
bar.progress = 건설 진행
|
||||||
bar.spawned = 유닛: {0}/{1}
|
bar.spawned = 유닛: {0}/{1}
|
||||||
|
|
||||||
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]방화
|
||||||
@@ -450,6 +499,7 @@ bullet.freezing = [stat]동결
|
|||||||
bullet.tarred = [stat]타르
|
bullet.tarred = [stat]타르
|
||||||
bullet.multiplier = [stat]{0}[lightgray]x 탄약 소모율
|
bullet.multiplier = [stat]{0}[lightgray]x 탄약 소모율
|
||||||
bullet.reload = [stat]{0}[lightgray]x 사격 속도
|
bullet.reload = [stat]{0}[lightgray]x 사격 속도
|
||||||
|
|
||||||
unit.blocks = 블록
|
unit.blocks = 블록
|
||||||
unit.powersecond = 전력/초
|
unit.powersecond = 전력/초
|
||||||
unit.liquidsecond = 액체/초
|
unit.liquidsecond = 액체/초
|
||||||
@@ -507,11 +557,13 @@ setting.mutemusic.name = 음소거
|
|||||||
setting.sfxvol.name = 효과음 크기
|
setting.sfxvol.name = 효과음 크기
|
||||||
setting.mutesound.name = 소리 끄기
|
setting.mutesound.name = 소리 끄기
|
||||||
setting.crashreport.name = 오류 보고서 보내기
|
setting.crashreport.name = 오류 보고서 보내기
|
||||||
|
setting.savecreate.name = 자동 저장 활성화
|
||||||
|
setting.publichost.name = 공용 서버 보이기
|
||||||
setting.chatopacity.name = 채팅 투명도
|
setting.chatopacity.name = 채팅 투명도
|
||||||
setting.playerchat.name = 인게임 채팅 표시
|
setting.playerchat.name = 인게임 채팅 표시
|
||||||
uiscale.reset = UI 스케일이 변경되었습니다.\n"확인"버튼을 눌러 스케일을 확인하세요.\n[scarlet]Reverting and exiting in[accent] {0}[] settings...
|
uiscale.reset = UI 스케일이 변경되었습니다.\n"확인"버튼을 눌러 스케일을 확인하세요.\n[scarlet]Reverting and exiting in[accent] {0}[] settings...
|
||||||
uiscale.cancel = Cancel & Exit
|
uiscale.cancel = 취소 & 나가기
|
||||||
setting.bloom.name = Bloom
|
setting.bloom.name = 발광 효과
|
||||||
keybind.title = 조작키 설정
|
keybind.title = 조작키 설정
|
||||||
keybinds.mobile = [scarlet]여기 대부분의 키들은 모바일에서 작동하지 않습니다. 기본적인 것들만 지원됩니다.
|
keybinds.mobile = [scarlet]여기 대부분의 키들은 모바일에서 작동하지 않습니다. 기본적인 것들만 지원됩니다.
|
||||||
category.general.name = 일반
|
category.general.name = 일반
|
||||||
@@ -527,6 +579,7 @@ keybind.press.axis = 축 또는 키를 누르세요.
|
|||||||
keybind.screenshot.name = 맵 스크린샷
|
keybind.screenshot.name = 맵 스크린샷
|
||||||
keybind.move_x.name = 오른쪽/왼쪽 이동
|
keybind.move_x.name = 오른쪽/왼쪽 이동
|
||||||
keybind.move_y.name = 위 / 아래 중간
|
keybind.move_y.name = 위 / 아래 중간
|
||||||
|
keybind.fullscreen.name = 전체 화면
|
||||||
keybind.select.name = 선택
|
keybind.select.name = 선택
|
||||||
keybind.diagonal_placement.name = 대각선 설치
|
keybind.diagonal_placement.name = 대각선 설치
|
||||||
keybind.pick.name = 블록 선택
|
keybind.pick.name = 블록 선택
|
||||||
@@ -559,6 +612,7 @@ mode.pvp.description = 실제 플레이어와 PvP를 합니다. 맵에 적어도
|
|||||||
mode.attack.name = 공격
|
mode.attack.name = 공격
|
||||||
mode.attack.description = 적 기지를 파괴하세요. 맵에 빨간팀 코어가 있어야 플레이 가능합니다.
|
mode.attack.description = 적 기지를 파괴하세요. 맵에 빨간팀 코어가 있어야 플레이 가능합니다.
|
||||||
mode.custom = 사용자 정의 규칙
|
mode.custom = 사용자 정의 규칙
|
||||||
|
|
||||||
rules.infiniteresources = 무한 자원
|
rules.infiniteresources = 무한 자원
|
||||||
rules.wavetimer = 웨이브 타이머
|
rules.wavetimer = 웨이브 타이머
|
||||||
rules.waves = 웨이브
|
rules.waves = 웨이브
|
||||||
@@ -585,6 +639,7 @@ rules.title.resourcesbuilding = 자원 & 건축
|
|||||||
rules.title.player = 플레이어들
|
rules.title.player = 플레이어들
|
||||||
rules.title.enemy = 적
|
rules.title.enemy = 적
|
||||||
rules.title.unit = 유닛
|
rules.title.unit = 유닛
|
||||||
|
|
||||||
content.item.name = 아이템
|
content.item.name = 아이템
|
||||||
content.liquid.name = 액체
|
content.liquid.name = 액체
|
||||||
content.unit.name = 유닛
|
content.unit.name = 유닛
|
||||||
@@ -646,6 +701,7 @@ mech.buildspeed = [LIGHT_GRAY]건설 속도: {0}%
|
|||||||
liquid.heatcapacity = [LIGHT_GRAY]발열 용량: {0}
|
liquid.heatcapacity = [LIGHT_GRAY]발열 용량: {0}
|
||||||
liquid.viscosity = [LIGHT_GRAY]점도: {0}
|
liquid.viscosity = [LIGHT_GRAY]점도: {0}
|
||||||
liquid.temperature = [LIGHT_GRAY]온도: {0}
|
liquid.temperature = [LIGHT_GRAY]온도: {0}
|
||||||
|
|
||||||
block.sand-boulder.name = 사암
|
block.sand-boulder.name = 사암
|
||||||
block.grass.name = 잔디
|
block.grass.name = 잔디
|
||||||
block.salt.name = 소금
|
block.salt.name = 소금
|
||||||
@@ -790,6 +846,7 @@ block.blast-mixer.name = 폭발물 혼합기
|
|||||||
block.solar-panel.name = 태양 전지판
|
block.solar-panel.name = 태양 전지판
|
||||||
block.solar-panel-large.name = 대형 태양 전지판
|
block.solar-panel-large.name = 대형 태양 전지판
|
||||||
block.oil-extractor.name = 석유 추출기
|
block.oil-extractor.name = 석유 추출기
|
||||||
|
block.command-center.name = 유닛 명령
|
||||||
block.draug-factory.name = 광부 드론 공장
|
block.draug-factory.name = 광부 드론 공장
|
||||||
block.spirit-factory.name = 수리 드론 공장
|
block.spirit-factory.name = 수리 드론 공장
|
||||||
block.phantom-factory.name = 건설 드론 공장
|
block.phantom-factory.name = 건설 드론 공장
|
||||||
@@ -872,6 +929,8 @@ tutorial.deposit = 자원을 다시 블록에 넣을수도 있습니다.\n\n[acc
|
|||||||
tutorial.waves = [LIGHT_GRAY]적[]이 접근합니다.\n당신의 기체는 적을 향해 클릭하여 공격할 수 있습니다. 또한, 구리를 더 캐내고 포탑을 더 지어서 방어를 강화하세요.\n\n[accent]2단계 동안 코어를 보호하세요.[]
|
tutorial.waves = [LIGHT_GRAY]적[]이 접근합니다.\n당신의 기체는 적을 향해 클릭하여 공격할 수 있습니다. 또한, 구리를 더 캐내고 포탑을 더 지어서 방어를 강화하세요.\n\n[accent]2단계 동안 코어를 보호하세요.[]
|
||||||
tutorial.waves.mobile = [LIGHT_GRAY]적[]이 접근합니다.\n당신의 기체는 적을 자동조준하지만, 원하는 적을 클릭하여 공격하고 싶은 대상을 바꿀 수 있습니다.\n구리를 더 캐내고 포탑을 더 지어서 방어를 강화하세요.\n\n[accent]2단계동안 코어를 방어하세요.[]
|
tutorial.waves.mobile = [LIGHT_GRAY]적[]이 접근합니다.\n당신의 기체는 적을 자동조준하지만, 원하는 적을 클릭하여 공격하고 싶은 대상을 바꿀 수 있습니다.\n구리를 더 캐내고 포탑을 더 지어서 방어를 강화하세요.\n\n[accent]2단계동안 코어를 방어하세요.[]
|
||||||
tutorial.launch = 특정 단계에 도달하면 [accent]출격[]이 가능합니다.\n[accent]출격[]을 하게되면 해당 지역의 코어에 들어있는 자원들을 캠페인의 자원 창고로 보내지만, 해당 지역의 [accent]모든 것들[]은 날라가게 되니 주의하세요.
|
tutorial.launch = 특정 단계에 도달하면 [accent]출격[]이 가능합니다.\n[accent]출격[]을 하게되면 해당 지역의 코어에 들어있는 자원들을 캠페인의 자원 창고로 보내지만, 해당 지역의 [accent]모든 것들[]은 날라가게 되니 주의하세요.
|
||||||
|
|
||||||
|
|
||||||
item.copper.description = 모든 종류의 블록에서 광범위하게 사용되는 자원입니다.
|
item.copper.description = 모든 종류의 블록에서 광범위하게 사용되는 자원입니다.
|
||||||
item.lead.description = 쉽게 구할 수 있으며, 전자 및 액체 수송 블록에서 광범위하게 사용되는 자원입니다.
|
item.lead.description = 쉽게 구할 수 있으며, 전자 및 액체 수송 블록에서 광범위하게 사용되는 자원입니다.
|
||||||
item.metaglass.description = 초강력 유리 화합물. 액체 분배 및 저장에 광범위하게 사용됩니다.\n\n[royal]빨리 생산할수록 게임이 편해집니다.
|
item.metaglass.description = 초강력 유리 화합물. 액체 분배 및 저장에 광범위하게 사용됩니다.\n\n[royal]빨리 생산할수록 게임이 편해집니다.
|
||||||
@@ -883,7 +942,7 @@ item.thorium.description = 건물의 재료, 터렛의 탄약 또는 핵연료
|
|||||||
item.scrap.description = 오래된 건물과 유닛의 남은 잔해. 미량의 다양한 금속들이 포함되어 있습니다.
|
item.scrap.description = 오래된 건물과 유닛의 남은 잔해. 미량의 다양한 금속들이 포함되어 있습니다.
|
||||||
item.silicon.description = 매우 유용한 물질로, 기체를 만들거나 태양 전지판 등 전자 건물에 사용할 수 있습니다.\n\n[royal]이 것이 생산되면 발전속도가 급속도로 빨라집니다.
|
item.silicon.description = 매우 유용한 물질로, 기체를 만들거나 태양 전지판 등 전자 건물에 사용할 수 있습니다.\n\n[royal]이 것이 생산되면 발전속도가 급속도로 빨라집니다.
|
||||||
item.plastanium.description = 고급 항공기 및 분열 탄약에 사용되는 가벼운 연성 재료.
|
item.plastanium.description = 고급 항공기 및 분열 탄약에 사용되는 가벼운 연성 재료.
|
||||||
item.phase-fabric.description = 최첨단 전자 제품과 자기수리 기술에 사용되는 거의 무중력에 가까운 물질입니다.\n\n[royal]직물이면서 직물이 아니랍니다.
|
item.phase-fabric.description = 최첨단 전자 제품과 자기수리 기술에 사용되는 거의 무중력에 가까운 물질입니다.\n\n[royal]발전기 근처에 있는 오버드라이브에 함부로 이 것을 넣지마세요.
|
||||||
item.surge-alloy.description = 순간적으로 전압이 증가하는 전기 특성을 가진 고급 합금입니다.
|
item.surge-alloy.description = 순간적으로 전압이 증가하는 전기 특성을 가진 고급 합금입니다.
|
||||||
item.spore-pod.description = 석유를 만들거나 탄약과 합성해 연료로 전환하는데 사용됩니다.
|
item.spore-pod.description = 석유를 만들거나 탄약과 합성해 연료로 전환하는데 사용됩니다.
|
||||||
item.blast-compound.description = 터렛 및 건설의 재료로 사용되는 휘발성 폭발물.\n연료로도 사용할 수 있지만, 별로 추천하지는 않습니다.
|
item.blast-compound.description = 터렛 및 건설의 재료로 사용되는 휘발성 폭발물.\n연료로도 사용할 수 있지만, 별로 추천하지는 않습니다.
|
||||||
@@ -897,7 +956,7 @@ mech.delta-mech.description = 빠르게 이동하는 적을 처치하기 위한
|
|||||||
mech.tau-mech.description = 지원형 기체.\n총을 발사하여 건물을 치료하고 회복 능력 사용으로 화재를 진압하거나, 반경 내 아군을 치유시킵니다.
|
mech.tau-mech.description = 지원형 기체.\n총을 발사하여 건물을 치료하고 회복 능력 사용으로 화재를 진압하거나, 반경 내 아군을 치유시킵니다.
|
||||||
mech.omega-mech.description = 지상 기체 최종판이자 건물 파괴용으로 적합한 부피가 크고 튼튼한 기체.\n방어 모드는 최대 90% 의 피해를 줄일 수 있습니다.
|
mech.omega-mech.description = 지상 기체 최종판이자 건물 파괴용으로 적합한 부피가 크고 튼튼한 기체.\n방어 모드는 최대 90% 의 피해를 줄일 수 있습니다.
|
||||||
mech.dart-ship.description = 표준 비행선.\n빠르고 가볍지만 공격력이 거의 없고 채광 속도가 느립니다.
|
mech.dart-ship.description = 표준 비행선.\n빠르고 가볍지만 공격력이 거의 없고 채광 속도가 느립니다.
|
||||||
mech.javelin-ship.description = 치고 빠지는 공격을 위한 비행선.\n처음에는 느리지만, 가속도가 붙어 엄청난 속도로 미사일 피해를 입힐 수 있으며, 전격 능력을 사용할 수 있습니다.
|
mech.javelin-ship.description = 치고 빠지는 공격을 위한 비행선.\n처음에는 느리지만, 가속도가 붙어 엄청난 속도로 미사일 피해를 입힐 수 있으며, 전격 능력을 사용할 수 있습니다.\n\n[royal]보호막을 제거하기에 가장 좋습니다.
|
||||||
mech.trident-ship.description = 대형 공중 폭격능력과 빠른 건설능력을 가진 폭격기.\n당연하게도 엄청 단단합니다.
|
mech.trident-ship.description = 대형 공중 폭격능력과 빠른 건설능력을 가진 폭격기.\n당연하게도 엄청 단단합니다.
|
||||||
mech.glaive-ship.description = 크고 잘 무장된 총을 가진 비행선.\n방화용 리피터가 장착되어 있으며, 가속도와 최대속도가 높습니다.
|
mech.glaive-ship.description = 크고 잘 무장된 총을 가진 비행선.\n방화용 리피터가 장착되어 있으며, 가속도와 최대속도가 높습니다.
|
||||||
unit.draug.description = 가장 기본적인 채굴 드론입니다 저렴하게 생산 가능하며 자동으로 구리와 납을 캐내 가까운 코어에 저장합니다.
|
unit.draug.description = 가장 기본적인 채굴 드론입니다 저렴하게 생산 가능하며 자동으로 구리와 납을 캐내 가까운 코어에 저장합니다.
|
||||||
@@ -976,27 +1035,27 @@ block.battery.description = 전력 생산량에 여유가 있을경우, 생산
|
|||||||
block.battery-large.description = 일반 배터리보다 훨씬 많은 량의 전력을 저장합니다.\n\n[ROYAL]임시 전력을 만들어서 냉각기에 전기가 부족해 원자로 폭발이 일어나는 것을 막아보는 것은 어떨까요?
|
block.battery-large.description = 일반 배터리보다 훨씬 많은 량의 전력을 저장합니다.\n\n[ROYAL]임시 전력을 만들어서 냉각기에 전기가 부족해 원자로 폭발이 일어나는 것을 막아보는 것은 어떨까요?
|
||||||
block.combustion-generator.description = 인화성 물질을 태워 소량의 전력을 생산합니다.
|
block.combustion-generator.description = 인화성 물질을 태워 소량의 전력을 생산합니다.
|
||||||
block.thermal-generator.description = 건설가능한 열이 있는 타일 위에 건설하면 전력을 생산합니다.\n\n[ROYAL]용암 웅덩이 혹은 열기지대에서 무한정 열을 발산합니다.
|
block.thermal-generator.description = 건설가능한 열이 있는 타일 위에 건설하면 전력을 생산합니다.\n\n[ROYAL]용암 웅덩이 혹은 열기지대에서 무한정 열을 발산합니다.
|
||||||
block.turbine-generator.description = 화력 발전기보다 효율적이지만, 액체가 추가적으로 필요합니다.\n\n[ROYAL]3*2<7.8
|
block.turbine-generator.description = 화력 발전기보다 효율적이지만, 액체가 추가적으로 필요합니다.\n\n[ROYAL]일반 타일에서 물추출기 1개로 2개가 가동가능합니다.
|
||||||
block.differential-generator.description = 냉각수와 파이라타이트의 온도 차를 이용해 안정적으로 원자로에 버금가는 양의 전기를 생산합니다.
|
block.differential-generator.description = 냉각수와 파이라타이트의 온도 차를 이용해 안정적으로 원자로에 버금가는 양의 전기를 생산합니다.
|
||||||
block.rtg-generator.description = 방사성동위원소 열전기 발전기\n토륨또는 현상 구조체를 사용하며, 냉각이 필요없는 발전을 하지만 토륨 원자로에 비해 발전량이 매우 적습니다.
|
block.rtg-generator.description = 방사성동위원소 열전기 발전기\n토륨또는 현상 구조체를 사용하며, 냉각이 필요없는 발전을 하지만 토륨 원자로에 비해 발전량이 매우 적습니다.
|
||||||
block.solar-panel.description = 태양광으로 극소량의 전기을 생산합니다.\n\n[royal]??? : [][yellow]PRAISE THE SUN [T]/
|
block.solar-panel.description = 태양광으로 극소량의 전기을 생산합니다.
|
||||||
block.solar-panel-large.description = 일반 태양 전지판보다 훨씬 발전량이 많지만, 건축비도 훨씬 비쌉니다.
|
block.solar-panel-large.description = 일반 태양 전지판보다 훨씬 발전량이 많지만, 건축비도 훨씬 비쌉니다.
|
||||||
block.thorium-reactor.description = 토륨을 이용해 막대한 양의 전기를 생산합니다. 지속적인 냉각이 필요하며 냉각제의 양이 부족하면 크게 폭발합니다.\n\n[royal]폭발로 인한 피해를 버틸 수 있는 건물은 없습니다.
|
block.thorium-reactor.description = 토륨을 이용해 막대한 양의 전기를 생산합니다. 지속적인 냉각이 필요하며 냉각제의 양이 부족하면 크게 폭발합니다.\n\n[royal]폭발로 인한 피해를 버틸 수 있는 건물은 없습니다.
|
||||||
block.impact-reactor.description = 최첨단 발전기\n폭발물과 냉각수를 이용해 최고의 효율로 매우 많은 양의 전기를 생산할 수 있습니다. 발전을 시작하는데 전기가 필요하며 발전기를 가동하는데 시간이 많이 걸립니다.\n[royal]오버드라이브 프로젝터로 10000이상의 전기를 생산할 수 있으며, 가동중에 전기가 끊기면 가동을 다시 해야되기 때문에 창고,물탱크,배터리 등을 주위에 설치하고 나서 가동하는 것을 추천합니다.
|
block.impact-reactor.description = 최첨단 발전기\n폭발물과 냉각수를 이용해 최고의 효율로 매우 많은 양의 전기를 생산할 수 있습니다. 발전을 시작하는데 전기가 필요하며 발전기를 가동하는데 시간이 많이 걸립니다.\n[royal]오버드라이브 프로젝터로 10000이상의 전기를 생산할 수 있으며, 가동중에 전기가 끊기면 가동을 다시 해야되기 때문에 창고,물탱크,배터리 등을 주위에 설치하고 나서 가동하는 것을 추천합니다.
|
||||||
block.mechanical-drill.description = 싸구려 드릴. 적절한 타일 위에 놓였을때 매우 느린 속도로 계속 채광합니다.\n\n[ROYAL]구리와 납은 광부 드론으로 대체가 가능합니다.
|
block.mechanical-drill.description = 싸구려 드릴. 적절한 타일 위에 놓였을때 매우 느린 속도로 채광합니다.\n\n[ROYAL]구리와 납은 광부 드론으로 대체가 가능합니다.
|
||||||
block.pneumatic-drill.description = 기압을 이용하여 보다 빠르게 단단한 물질을 채광할 수 있는 향상된 드릴.\n\n[ROYAL]전기를 사용하지 않는 드릴이라도 물과 오버드라이브를 이용하여 가속할 수 있습니다.
|
block.pneumatic-drill.description = 기압을 이용하여 보다 빠르게 단단한 물질을 채광할 수 있는 향상된 드릴.\n\n[ROYAL]전기를 사용하지 않는 드릴이라도 물과 오버드라이브를 이용하여 가속할 수 있습니다.
|
||||||
block.laser-drill.description = 토륨을 채광할 수 있는 고급 드릴입니다. 전력과 물을 공급하여 빠른 속도로 채광할 수 있습니다.\n\n[ROYAL]드릴아래에 배치된 광물타일의 비율에 따라 채광량이 달라집니다.
|
block.laser-drill.description = 토륨을 채광할 수 있는 고급 드릴입니다. 전력과 물을 공급하여 빠른 속도로 채광할 수 있습니다.\n\n[ROYAL]드릴아래에 배치된 광물타일의 비율에 따라 채광량이 달라집니다.
|
||||||
block.blast-drill.description = 최상위 드릴입니다. 많은량의 전력이 필요합니다.\n\n[ROYAL]물추출기 하나면 충분합니다.
|
block.blast-drill.description = 최상위 드릴입니다. 많은량의 전력이 필요합니다.\n\n[ROYAL]물추출기 하나면 충분합니다.
|
||||||
block.water-extractor.description = 땅에서 물을 추출합니다. 근처에 호수가 없을 때 사용하세요.\n\n[ROYAL]물추출기의 효율이 달라지는 타일이 있습니다.
|
block.water-extractor.description = 땅에서 물을 추출합니다. 근처에 호수가 없을 때 사용하세요.\n\n[ROYAL]물추출기의 효율이 달라지는 타일이 있습니다.
|
||||||
block.cultivator.description = 소량의 포자를 산업용으로 사용가능한 포자로 배양하는 건물입니다.
|
block.cultivator.description = 소량의 포자를 산업용으로 사용가능한 포자로 배양하는 건물입니다.
|
||||||
block.oil-extractor.description = 대량의 전력과 물을 사용하여 모래에서 기름을 추출합니다. 근처에 직접적인 석유 공급원이 없을때 사용하세요.\n\n[royal]모래 또는 고철을 이용하여
|
block.oil-extractor.description = 대량의 전력과 물을 사용하여 모래에서 기름을 추출합니다. 근처에 직접적인 석유 공급원이 없을때 사용하세요.\n\n[royal]모래 또는 고철을 이용하여 창조경제가 가능합니다.
|
||||||
block.core-shard.description = 코어의 1단계 형태입니다.\n이것이 파괴되면 플레이하고 있는 지역과의 연결이 끊어지니 적의 공격에 파괴되지 않도록 주의하세요.\n[ROYAL]연결이 끊긴다는 말은 게임오버와 일맥상통합니다.
|
block.core-shard.description = 코어의 1단계 형태입니다.\n이것이 파괴되면 플레이하고 있는 지역과의 연결이 끊어지니 적의 공격에 파괴되지 않도록 주의하세요.\n[ROYAL]연결이 끊긴다는 말은 게임오버와 일맥상통합니다.
|
||||||
block.core-foundation.description = 코어의 2단계 형태입니다.\n첫 번째 코어보다 더 튼튼하고 더 많은 자원을 저장할 수 있습니다.\n\n[ROYAL]크기도 좀 더 큽니다.
|
block.core-foundation.description = 코어의 2단계 형태입니다.\n첫 번째 코어보다 더 튼튼하고 더 많은 자원을 저장할 수 있습니다.\n\n[ROYAL]크기도 좀 더 큽니다.
|
||||||
block.core-nucleus.description = 코어의 3단계이자 마지막 형태입니다.\n최고로 튼튼하며 막대한 양의 자원들을 저장할 수 있습니다.
|
block.core-nucleus.description = 코어의 3단계이자 마지막 형태입니다.\n최고로 튼튼하며 막대한 양의 자원들을 저장할 수 있습니다.
|
||||||
block.vault.description = 각종 대량의 자원을 저장할 수 있습니다.[LIGHT_GRAY]언로더[]를 사용하여 창고에서 물건을 회수할 수 있습니다.\n\n[royal]포탑의 탄약, ☆핵융합로의 폭발물☆, 원자로 냉각수의 티타늄등 여러 자원들의 여분을 미리 저장하여 혹시모를 사태를 예방하세요.
|
block.vault.description = 각종 대량의 자원을 저장할 수 있습니다.[LIGHT_GRAY]언로더[]를 사용하여 창고에서 물건을 회수할 수 있습니다.\n\n[royal]포탑의 탄약, ☆핵융합로의 폭발물☆, 원자로 냉각수의 티타늄등 여러 자원들의 여분을 미리 저장하여 혹시모를 사태를 예방하세요.
|
||||||
block.container.description = 각종 소량의 자원을 저장할 수 있습니다.[LIGHT_GRAY]언로더[]를 사용하여 컨테이너에서 자원을 회수할 수 있습니다.\n\n[royal]또는 컨테이너를 클릭하고 자원을 눌러 자원을 강탈해갈수도 있습니다.
|
block.container.description = 각종 소량의 자원을 저장할 수 있습니다.[LIGHT_GRAY]언로더[]를 사용하여 컨테이너에서 자원을 회수할 수 있습니다.\n\n[royal]또는 컨테이너를 클릭하고 자원을 눌러 자원을 강탈해갈수도 있습니다.
|
||||||
block.unloader.description = 컨테이너, 창고 또는 코어에서 인접한 블록으로 자원을 출하합니다. 출하시킬 자원의 종류는 언로더를 눌러 지정할 수 있습니다.
|
block.unloader.description = 컨테이너, 창고 또는 코어에서 인접한 블록으로 자원을 출하합니다. 출하시킬 자원의 종류는 언로더를 눌러 지정할 수 있습니다.
|
||||||
block.launch-pad.description = 출격할 필요 없이 자원을 수송시킵시다.\n\n[royal]아ㅏㅏ 코어에 출격패드 연결하고 잠수타지 마라잉? 손모가지 날아가뿌릴라!
|
block.launch-pad.description = 출격할 필요 없이 자원을 수송시킵시다.\n\n[royal]제발 멀티에서 이거 설치하고 잠수좀 타지마세요. 하는 것도 없이 자원만 빼가는 건 너무 민폐입니다.
|
||||||
block.launch-pad-large.description = 출격 패드의 강화버전\n더 많은 자원을 더 자주 출격시킵니다.\n\n[ROYAL]크기도 더 크다죠
|
block.launch-pad-large.description = 출격 패드의 강화버전\n더 많은 자원을 더 자주 출격시킵니다.\n\n[ROYAL]크기도 더 크다죠
|
||||||
block.duo.description = 소형 포탑입니다.\n가장 기본적인 포탑으로 약한 탄환을 발사합니다.
|
block.duo.description = 소형 포탑입니다.\n가장 기본적인 포탑으로 약한 탄환을 발사합니다.
|
||||||
block.scatter.description = 중형 대공 포탑입니다.\n납이나 고철 덩어리를 적에게 쏩니다.
|
block.scatter.description = 중형 대공 포탑입니다.\n납이나 고철 덩어리를 적에게 쏩니다.
|
||||||
@@ -1004,7 +1063,7 @@ block.scorch.description = 소형 포탑입니다.\n지상의 적을 매우 강
|
|||||||
block.hail.description = 소형 포탑입니다.\n장거리로 포탄을 발사합니다.
|
block.hail.description = 소형 포탑입니다.\n장거리로 포탄을 발사합니다.
|
||||||
block.wave.description = 중형 포탑입니다. 대상에게 포탑에 공급된 액체를 발사합니다. 물또는 냉각수가 공급되면 자동으로 불을 끕니다.
|
block.wave.description = 중형 포탑입니다. 대상에게 포탑에 공급된 액체를 발사합니다. 물또는 냉각수가 공급되면 자동으로 불을 끕니다.
|
||||||
block.lancer.description = 중형 포탑입니다.\n적을 레이저로 관통합니다.
|
block.lancer.description = 중형 포탑입니다.\n적을 레이저로 관통합니다.
|
||||||
block.arc.description = 소형 포탑입니다.\n적을 전기로 지집니다.\n\n[royal]63 : JSA!!\n88 : 이젠..아니야...
|
block.arc.description = 소형 포탑입니다.\n적을 전기로 지집니다.
|
||||||
block.swarmer.description = 중형 포탑입니다.\n지상과 공중 적 모두를 공격하는 유도 미사일 포탑입니다.
|
block.swarmer.description = 중형 포탑입니다.\n지상과 공중 적 모두를 공격하는 유도 미사일 포탑입니다.
|
||||||
block.salvo.description = 중형 포탑입니다.\n3연발 탄환을 발사합니다.
|
block.salvo.description = 중형 포탑입니다.\n3연발 탄환을 발사합니다.
|
||||||
block.fuse.description = 대형 포탑입니다.\n강력한 단거리 빔을 쏩니다.
|
block.fuse.description = 대형 포탑입니다.\n강력한 단거리 빔을 쏩니다.
|
||||||
@@ -1012,6 +1071,7 @@ block.ripple.description = 대형 포탑입니다.\n여러 발의 사격을 동
|
|||||||
block.cyclone.description = 대형 포탑입니다.\n초고속으로 사격합니다.
|
block.cyclone.description = 대형 포탑입니다.\n초고속으로 사격합니다.
|
||||||
block.spectre.description = 초대형 포탑입니다.\n한 번에 두 발의 강력한 총알을 쏩니다.
|
block.spectre.description = 초대형 포탑입니다.\n한 번에 두 발의 강력한 총알을 쏩니다.
|
||||||
block.meltdown.description = 초대형 포탑.\n장거리의 강력한 열광선을 발사합니다.
|
block.meltdown.description = 초대형 포탑.\n장거리의 강력한 열광선을 발사합니다.
|
||||||
|
block.command-center.description = 아군 유닛에게 이동 명령을 내릴 수 있는 건물입니다.\n명령의 종류는 순찰/공격/후퇴가 있으며, 순찰은 유닛이 맵 주위를 돌아다니게, 공격은 유닛들을 적 코어를 향해 공격하도록, 후퇴는 유닛들을 아군 코어 또는 공장으로 돌아오게 합니다.\n\n[royal]이제 공중유닛도 모아서 보낼 수 있습니다!
|
||||||
block.draug-factory.description = 구리와 납을 캐는 채광 드론을 생산합니다.\n\n[ROYAL]이 드론은 영혼을 가지고 있습니다.
|
block.draug-factory.description = 구리와 납을 캐는 채광 드론을 생산합니다.\n\n[ROYAL]이 드론은 영혼을 가지고 있습니다.
|
||||||
block.spirit-factory.description = 블록을 수리하는 수리 드론을 생산합니다.\n\n[ROYAL]드론에도 정령이 있다죠.
|
block.spirit-factory.description = 블록을 수리하는 수리 드론을 생산합니다.\n\n[ROYAL]드론에도 정령이 있다죠.
|
||||||
block.phantom-factory.description = 건설을 도와주는 빌더 드론을 생산합니다.\n\n[ROYAL]당신의 환영입니다.
|
block.phantom-factory.description = 건설을 도와주는 빌더 드론을 생산합니다.\n\n[ROYAL]당신의 환영입니다.
|
||||||
@@ -1019,7 +1079,7 @@ block.wraith-factory.description = 빠른 뺑소니 요격기 유닛을 생산
|
|||||||
block.ghoul-factory.description = 중탄두 폭격기를 생산합니다.\n\n[ROYAL]적 위를 유령처럼 맴돕니다.
|
block.ghoul-factory.description = 중탄두 폭격기를 생산합니다.\n\n[ROYAL]적 위를 유령처럼 맴돕니다.
|
||||||
block.revenant-factory.description = 중량의 폭발물 스웜 포대를 가진 전함을 생산합니다.\n\n[ROYAL]캠페인과 사용자 정의 게임에서 ai가 다른 대표적인 유닛이라죠.
|
block.revenant-factory.description = 중량의 폭발물 스웜 포대를 가진 전함을 생산합니다.\n\n[ROYAL]캠페인과 사용자 정의 게임에서 ai가 다른 대표적인 유닛이라죠.
|
||||||
block.dagger-factory.description = 기본 지상 유닛을 생산합니다.\n\n[ROYAL]원래대로라면 대거라 읽어야 되지만 총을 쏜다는 것이 이상하기도 해서 한국 커뮤니티에서는 그냥 디거라 부른다죠. 그게 좀 더 입에 붙잖아요?
|
block.dagger-factory.description = 기본 지상 유닛을 생산합니다.\n\n[ROYAL]원래대로라면 대거라 읽어야 되지만 총을 쏜다는 것이 이상하기도 해서 한국 커뮤니티에서는 그냥 디거라 부른다죠. 그게 좀 더 입에 붙잖아요?
|
||||||
block.crawler-factory.description = 자폭하는 지상 유닛을 생산합니다.\n\n[ROYAL]개복치.
|
block.crawler-factory.description = 자폭하는 지상 유닛을 생산합니다.\n\n[ROYAL]가까이 가기만 해도 죽는 섬세한 친구랍니다.
|
||||||
block.titan-factory.description = 화염방사기를 장착한 지상유닛를 생산합니다.\n\n[ROYAL]최강이 될 수도, 최약이 될 수도 있습니다.
|
block.titan-factory.description = 화염방사기를 장착한 지상유닛를 생산합니다.\n\n[ROYAL]최강이 될 수도, 최약이 될 수도 있습니다.
|
||||||
block.fortress-factory.description = 중대포 지상유닛를 생산합니다.
|
block.fortress-factory.description = 중대포 지상유닛를 생산합니다.
|
||||||
block.repair-point.description = 주변에서 가장 가까운 손상된 유닛을 지속적으로 치료합니다.\n\n[ROYAL]이 것으로 플래이어는 지속적인 교전이 가능해집니다.
|
block.repair-point.description = 주변에서 가장 가까운 손상된 유닛을 지속적으로 치료합니다.\n\n[ROYAL]이 것으로 플래이어는 지속적인 교전이 가능해집니다.
|
||||||
|
|||||||
@@ -16,6 +16,11 @@ screenshot.invalid = Map too large, potentially not enough memory for screenshot
|
|||||||
gameover = Game Over
|
gameover = Game Over
|
||||||
gameover.pvp = het[accent] {0}[] team heeft gewonnen!
|
gameover.pvp = het[accent] {0}[] team heeft gewonnen!
|
||||||
highscore = [accent]Nieuw topscore!
|
highscore = [accent]Nieuw topscore!
|
||||||
|
load.sound = Sounds
|
||||||
|
load.map = Maps
|
||||||
|
load.image = Images
|
||||||
|
load.content = Content
|
||||||
|
load.system = System
|
||||||
stat.wave = Waves Verslagen:[accent] {0}
|
stat.wave = Waves Verslagen:[accent] {0}
|
||||||
stat.enemiesDestroyed = Vijanden Vernietigd:[accent] {0}
|
stat.enemiesDestroyed = Vijanden Vernietigd:[accent] {0}
|
||||||
stat.built = Gebouwen Gebouwd:[accent] {0}
|
stat.built = Gebouwen Gebouwd:[accent] {0}
|
||||||
@@ -23,8 +28,6 @@ stat.destroyed = Gebouwen Vernietigd:[accent] {0}
|
|||||||
stat.deconstructed = Gebouwen Gesloopt:[accent] {0}
|
stat.deconstructed = Gebouwen Gesloopt:[accent] {0}
|
||||||
stat.delivered = Middelen Gelanceerd:
|
stat.delivered = Middelen Gelanceerd:
|
||||||
stat.rank = Eindrang: [accent]{0}
|
stat.rank = Eindrang: [accent]{0}
|
||||||
placeline = You have selected a block.\nYou can[accent] place in a line[] by[accent] holding down your finger for a few seconds[] and dragging in a direction.\nTry it.
|
|
||||||
removearea = You have selected removal mode.\nYou can[accent] remove blocks in a rectangle[] by[accent] holding down your finger for a few seconds[] and dragging.\nTry it.
|
|
||||||
launcheditems = [accent]Launched Items
|
launcheditems = [accent]Launched Items
|
||||||
map.delete = Weet je zeker dat je de map wilt verwijderen? "[accent]{0}[]"?
|
map.delete = Weet je zeker dat je de map wilt verwijderen? "[accent]{0}[]"?
|
||||||
level.highscore = Topscore: [accent]{0}
|
level.highscore = Topscore: [accent]{0}
|
||||||
@@ -63,9 +66,11 @@ players.single = {0} player online
|
|||||||
server.closing = [accent]Closing server...
|
server.closing = [accent]Closing server...
|
||||||
server.kicked.kick = You have been kicked from the server!
|
server.kicked.kick = You have been kicked from the server!
|
||||||
server.kicked.serverClose = Server closed.
|
server.kicked.serverClose = Server closed.
|
||||||
|
server.kicked.vote = You have been vote-kicked. Goodbye.
|
||||||
server.kicked.clientOutdated = Outdated client! Update your game!
|
server.kicked.clientOutdated = Outdated client! Update your game!
|
||||||
server.kicked.serverOutdated = Outdated server! Ask the host to update!
|
server.kicked.serverOutdated = Outdated server! Ask the host to update!
|
||||||
server.kicked.banned = You are banned on this server.
|
server.kicked.banned = You are banned on this server.
|
||||||
|
server.kicked.typeMismatch = This server is not compatible with your build type.
|
||||||
server.kicked.recentKick = You have been kicked recently.\nWait before connecting again.
|
server.kicked.recentKick = You have been kicked recently.\nWait before connecting again.
|
||||||
server.kicked.nameInUse = There is someone with that name\nalready on this server.
|
server.kicked.nameInUse = There is someone with that name\nalready on this server.
|
||||||
server.kicked.nameEmpty = Your chosen name is invalid.
|
server.kicked.nameEmpty = Your chosen name is invalid.
|
||||||
@@ -156,6 +161,11 @@ cancel = Cancel
|
|||||||
openlink = Open Link
|
openlink = Open Link
|
||||||
copylink = Copy Link
|
copylink = Copy Link
|
||||||
back = Back
|
back = Back
|
||||||
|
data.export = Export Data
|
||||||
|
data.import = Import Data
|
||||||
|
data.exported = Data exported.
|
||||||
|
data.invalid = This isn't valid game data.
|
||||||
|
data.import.confirm = Importing external data will erase[scarlet] all[] your current game data.\n[accent]This cannot be undone![]\n\nOnce the data is imported, your game will exit immediately.
|
||||||
classic.export = Export Classic Data
|
classic.export = Export Classic Data
|
||||||
classic.export.text = [accent]Mindustry[] has just had a major update.\nClassic (v3.5 build 40) save or map data has been detected. Would you like to export these saves to your phone's home folder, for use in the Mindustry Classic app?
|
classic.export.text = [accent]Mindustry[] has just had a major update.\nClassic (v3.5 build 40) save or map data has been detected. Would you like to export these saves to your phone's home folder, for use in the Mindustry Classic app?
|
||||||
quit.confirm = Are you sure you want to quit?
|
quit.confirm = Are you sure you want to quit?
|
||||||
@@ -376,6 +386,7 @@ zone.fungalPass.description = A transition area between high mountains and lower
|
|||||||
zone.impact0078.description = <insert description here>
|
zone.impact0078.description = <insert description here>
|
||||||
zone.crags.description = <insert description here>
|
zone.crags.description = <insert description here>
|
||||||
settings.language = Language
|
settings.language = Language
|
||||||
|
settings.data = Game Data
|
||||||
settings.reset = Reset to Defaults
|
settings.reset = Reset to Defaults
|
||||||
settings.rebind = Rebind
|
settings.rebind = Rebind
|
||||||
settings.controls = Controls
|
settings.controls = Controls
|
||||||
@@ -507,6 +518,7 @@ setting.mutemusic.name = Mute Music
|
|||||||
setting.sfxvol.name = SFX Volume
|
setting.sfxvol.name = SFX Volume
|
||||||
setting.mutesound.name = Mute Sound
|
setting.mutesound.name = Mute Sound
|
||||||
setting.crashreport.name = Send Anonymous Crash Reports
|
setting.crashreport.name = Send Anonymous Crash Reports
|
||||||
|
setting.savecreate.name = Auto-Create Saves
|
||||||
setting.chatopacity.name = Chat Opacity
|
setting.chatopacity.name = Chat Opacity
|
||||||
setting.playerchat.name = Display In-Game Chat
|
setting.playerchat.name = Display In-Game Chat
|
||||||
uiscale.reset = UI scale has been changed.\nPress "OK" to confirm this scale.\n[scarlet]Reverting and exiting in[accent] {0}[] settings...
|
uiscale.reset = UI scale has been changed.\nPress "OK" to confirm this scale.\n[scarlet]Reverting and exiting in[accent] {0}[] settings...
|
||||||
@@ -527,6 +539,7 @@ keybind.press.axis = Press an axis or key...
|
|||||||
keybind.screenshot.name = Map Screenshot
|
keybind.screenshot.name = Map Screenshot
|
||||||
keybind.move_x.name = Move x
|
keybind.move_x.name = Move x
|
||||||
keybind.move_y.name = Move y
|
keybind.move_y.name = Move y
|
||||||
|
keybind.fullscreen.name = Toggle Fullscreen
|
||||||
keybind.select.name = Select/Shoot
|
keybind.select.name = Select/Shoot
|
||||||
keybind.diagonal_placement.name = Diagonal Placement
|
keybind.diagonal_placement.name = Diagonal Placement
|
||||||
keybind.pick.name = Pick Block
|
keybind.pick.name = Pick Block
|
||||||
@@ -790,6 +803,7 @@ block.blast-mixer.name = Blast Mixer
|
|||||||
block.solar-panel.name = Solar Panel
|
block.solar-panel.name = Solar Panel
|
||||||
block.solar-panel-large.name = Large Solar Panel
|
block.solar-panel-large.name = Large Solar Panel
|
||||||
block.oil-extractor.name = Oil Extractor
|
block.oil-extractor.name = Oil Extractor
|
||||||
|
block.command-center.name = Command Center
|
||||||
block.draug-factory.name = Draug Miner Drone Factory
|
block.draug-factory.name = Draug Miner Drone Factory
|
||||||
block.spirit-factory.name = Spirit Drone Factory
|
block.spirit-factory.name = Spirit Drone Factory
|
||||||
block.phantom-factory.name = Phantom Drone Factory
|
block.phantom-factory.name = Phantom Drone Factory
|
||||||
@@ -1012,6 +1026,7 @@ block.ripple.description = A large artillery turret which fires several shots si
|
|||||||
block.cyclone.description = A large rapid fire turret.
|
block.cyclone.description = A large rapid fire turret.
|
||||||
block.spectre.description = A large turret which shoots two powerful bullets at once.
|
block.spectre.description = A large turret which shoots two powerful bullets at once.
|
||||||
block.meltdown.description = A large turret which shoots powerful long-range beams.
|
block.meltdown.description = A large turret which shoots powerful long-range beams.
|
||||||
|
block.command-center.description = Issues movement commands to allied units across the map.\nCauses units to patrol, attack an enemy core or retreat to the core/factory. When no enemy core is present, units will default to patrolling under the attack command.
|
||||||
block.draug-factory.description = Produces Draug mining drones.
|
block.draug-factory.description = Produces Draug mining drones.
|
||||||
block.spirit-factory.description = Produces light drones which mine ore and repair blocks.
|
block.spirit-factory.description = Produces light drones which mine ore and repair blocks.
|
||||||
block.phantom-factory.description = Produces advanced drone units which are significantly more effective than a spirit drone.
|
block.phantom-factory.description = Produces advanced drone units which are significantly more effective than a spirit drone.
|
||||||
|
|||||||
@@ -16,6 +16,11 @@ screenshot.invalid = Kaart te groot, mogelijks te weinig geheugen voor een scree
|
|||||||
gameover = Game Over
|
gameover = Game Over
|
||||||
gameover.pvp = Het[accent] {0}[] team heeft gewonnen!
|
gameover.pvp = Het[accent] {0}[] team heeft gewonnen!
|
||||||
highscore = [accent]Nieuw record!
|
highscore = [accent]Nieuw record!
|
||||||
|
load.sound = Sounds
|
||||||
|
load.map = Maps
|
||||||
|
load.image = Images
|
||||||
|
load.content = Content
|
||||||
|
load.system = System
|
||||||
stat.wave = Je overleefde tot aanvalsgolf: [accent]{0}[].
|
stat.wave = Je overleefde tot aanvalsgolf: [accent]{0}[].
|
||||||
stat.enemiesDestroyed = Vijanden vernietigd:[accent] {0}
|
stat.enemiesDestroyed = Vijanden vernietigd:[accent] {0}
|
||||||
stat.built = Gebouwen gebouwd:[accent] {0}
|
stat.built = Gebouwen gebouwd:[accent] {0}
|
||||||
@@ -23,8 +28,6 @@ stat.destroyed = Gebouwen vernietigd:[accent] {0}
|
|||||||
stat.deconstructed = Gebouwen afgebroken:[accent] {0}
|
stat.deconstructed = Gebouwen afgebroken:[accent] {0}
|
||||||
stat.delivered = Gronstoffen meegenomen:
|
stat.delivered = Gronstoffen meegenomen:
|
||||||
stat.rank = Eindresultaat: [accent]{0}
|
stat.rank = Eindresultaat: [accent]{0}
|
||||||
placeline = Je hebt een blok geselecteerd.\nJe kan[accent] in een lijn plaatsen[] door[accent] je vinger voor enkele seconden ingedrukt te houden[] en in een richting te slepen.\n\n[scarlet]DOE HET.
|
|
||||||
removearea = Je hebt verwijderingsmodus geselecteerd.\nJe kan[accent] blokken verwijderen in een rechthoek[] door[accent] je vinger voor enkele seconden ingedrukt te houden[] en te slepen.\n\n[scarlet]DOE HET.
|
|
||||||
launcheditems = [accent]Meegenomen grondstoffen
|
launcheditems = [accent]Meegenomen grondstoffen
|
||||||
map.delete = Ben je zeker dat je de kaart "[accent]{0}[]" wilt verwijderen?
|
map.delete = Ben je zeker dat je de kaart "[accent]{0}[]" wilt verwijderen?
|
||||||
level.highscore = Beste score: [accent]{0}
|
level.highscore = Beste score: [accent]{0}
|
||||||
@@ -63,9 +66,11 @@ players.single = {0} speler online
|
|||||||
server.closing = [accent]Server wordt gesloten...
|
server.closing = [accent]Server wordt gesloten...
|
||||||
server.kicked.kick = Je bent uit de server gegooid!
|
server.kicked.kick = Je bent uit de server gegooid!
|
||||||
server.kicked.serverClose = Server gesloten.
|
server.kicked.serverClose = Server gesloten.
|
||||||
|
server.kicked.vote = You have been vote-kicked. Goodbye.
|
||||||
server.kicked.clientOutdated = Verouderde versie! Update Mindustry!
|
server.kicked.clientOutdated = Verouderde versie! Update Mindustry!
|
||||||
server.kicked.serverOutdated = Verouderde server! Vraag de eigenaar van de server om de server te updaten!
|
server.kicked.serverOutdated = Verouderde server! Vraag de eigenaar van de server om de server te updaten!
|
||||||
server.kicked.banned = Je bent verbannen van deze server.
|
server.kicked.banned = Je bent verbannen van deze server.
|
||||||
|
server.kicked.typeMismatch = This server is not compatible with your build type.
|
||||||
server.kicked.recentKick = Je bent daarnet van de server gegooid.\nWacht even voor je weer verbindt
|
server.kicked.recentKick = Je bent daarnet van de server gegooid.\nWacht even voor je weer verbindt
|
||||||
server.kicked.nameInUse = Er is al iemand met dezelfde naam op de server.
|
server.kicked.nameInUse = Er is al iemand met dezelfde naam op de server.
|
||||||
server.kicked.nameEmpty = Je gekozen naam is ongeldig.
|
server.kicked.nameEmpty = Je gekozen naam is ongeldig.
|
||||||
@@ -156,6 +161,11 @@ cancel = Annuleer
|
|||||||
openlink = Open Link
|
openlink = Open Link
|
||||||
copylink = Kopiëer Link
|
copylink = Kopiëer Link
|
||||||
back = Terug
|
back = Terug
|
||||||
|
data.export = Export Data
|
||||||
|
data.import = Import Data
|
||||||
|
data.exported = Data exported.
|
||||||
|
data.invalid = This isn't valid game data.
|
||||||
|
data.import.confirm = Importing external data will erase[scarlet] all[] your current game data.\n[accent]This cannot be undone![]\n\nOnce the data is imported, your game will exit immediately.
|
||||||
classic.export = Export Classic Data
|
classic.export = Export Classic Data
|
||||||
classic.export.text = [accent]Mindustry[] has just had a major update.\nClassic (v3.5 build 40) save or map data has been detected. Would you like to export these saves to your phone's home folder, for use in the Mindustry Classic app?
|
classic.export.text = [accent]Mindustry[] has just had a major update.\nClassic (v3.5 build 40) save or map data has been detected. Would you like to export these saves to your phone's home folder, for use in the Mindustry Classic app?
|
||||||
quit.confirm = Weet je zeker dat je wilt stoppen?
|
quit.confirm = Weet je zeker dat je wilt stoppen?
|
||||||
@@ -376,6 +386,7 @@ zone.fungalPass.description = A transition area between high mountains and lower
|
|||||||
zone.impact0078.description = <insert description here>
|
zone.impact0078.description = <insert description here>
|
||||||
zone.crags.description = <insert description here>
|
zone.crags.description = <insert description here>
|
||||||
settings.language = Language
|
settings.language = Language
|
||||||
|
settings.data = Game Data
|
||||||
settings.reset = Reset to Defaults
|
settings.reset = Reset to Defaults
|
||||||
settings.rebind = Rebind
|
settings.rebind = Rebind
|
||||||
settings.controls = Controls
|
settings.controls = Controls
|
||||||
@@ -507,6 +518,7 @@ setting.mutemusic.name = Mute Music
|
|||||||
setting.sfxvol.name = SFX Volume
|
setting.sfxvol.name = SFX Volume
|
||||||
setting.mutesound.name = Mute Sound
|
setting.mutesound.name = Mute Sound
|
||||||
setting.crashreport.name = Send Anonymous Crash Reports
|
setting.crashreport.name = Send Anonymous Crash Reports
|
||||||
|
setting.savecreate.name = Auto-Create Saves
|
||||||
setting.chatopacity.name = Chat Opacity
|
setting.chatopacity.name = Chat Opacity
|
||||||
setting.playerchat.name = Display In-Game Chat
|
setting.playerchat.name = Display In-Game Chat
|
||||||
uiscale.reset = UI scale has been changed.\nPress "OK" to confirm this scale.\n[scarlet]Reverting and exiting in[accent] {0}[] settings...
|
uiscale.reset = UI scale has been changed.\nPress "OK" to confirm this scale.\n[scarlet]Reverting and exiting in[accent] {0}[] settings...
|
||||||
@@ -527,6 +539,7 @@ keybind.press.axis = Press an axis or key...
|
|||||||
keybind.screenshot.name = Map Screenshot
|
keybind.screenshot.name = Map Screenshot
|
||||||
keybind.move_x.name = Move x
|
keybind.move_x.name = Move x
|
||||||
keybind.move_y.name = Move y
|
keybind.move_y.name = Move y
|
||||||
|
keybind.fullscreen.name = Toggle Fullscreen
|
||||||
keybind.select.name = Select/Shoot
|
keybind.select.name = Select/Shoot
|
||||||
keybind.diagonal_placement.name = Diagonal Placement
|
keybind.diagonal_placement.name = Diagonal Placement
|
||||||
keybind.pick.name = Pick Block
|
keybind.pick.name = Pick Block
|
||||||
@@ -790,6 +803,7 @@ block.blast-mixer.name = Blast Mixer
|
|||||||
block.solar-panel.name = Solar Panel
|
block.solar-panel.name = Solar Panel
|
||||||
block.solar-panel-large.name = Large Solar Panel
|
block.solar-panel-large.name = Large Solar Panel
|
||||||
block.oil-extractor.name = Oil Extractor
|
block.oil-extractor.name = Oil Extractor
|
||||||
|
block.command-center.name = Command Center
|
||||||
block.draug-factory.name = Draug Miner Drone Factory
|
block.draug-factory.name = Draug Miner Drone Factory
|
||||||
block.spirit-factory.name = Spirit Drone Factory
|
block.spirit-factory.name = Spirit Drone Factory
|
||||||
block.phantom-factory.name = Phantom Drone Factory
|
block.phantom-factory.name = Phantom Drone Factory
|
||||||
@@ -1012,6 +1026,7 @@ block.ripple.description = A large artillery turret which fires several shots si
|
|||||||
block.cyclone.description = A large rapid fire turret.
|
block.cyclone.description = A large rapid fire turret.
|
||||||
block.spectre.description = A large turret which shoots two powerful bullets at once.
|
block.spectre.description = A large turret which shoots two powerful bullets at once.
|
||||||
block.meltdown.description = A large turret which shoots powerful long-range beams.
|
block.meltdown.description = A large turret which shoots powerful long-range beams.
|
||||||
|
block.command-center.description = Issues movement commands to allied units across the map.\nCauses units to patrol, attack an enemy core or retreat to the core/factory. When no enemy core is present, units will default to patrolling under the attack command.
|
||||||
block.draug-factory.description = Produces Draug mining drones.
|
block.draug-factory.description = Produces Draug mining drones.
|
||||||
block.spirit-factory.description = Produces light drones which mine ore and repair blocks.
|
block.spirit-factory.description = Produces light drones which mine ore and repair blocks.
|
||||||
block.phantom-factory.description = Produces advanced drone units which are significantly more effective than a spirit drone.
|
block.phantom-factory.description = Produces advanced drone units which are significantly more effective than a spirit drone.
|
||||||
|
|||||||
@@ -4,7 +4,7 @@ contributors = Tłumacze i pomocnicy
|
|||||||
discord = Odwiedź nasz serwer Discord!
|
discord = Odwiedź nasz serwer Discord!
|
||||||
link.discord.description = Oficjalny serwer Discord Mindustry
|
link.discord.description = Oficjalny serwer Discord Mindustry
|
||||||
link.github.description = Kod Gry
|
link.github.description = Kod Gry
|
||||||
link.changelog.description = List of update changes
|
link.changelog.description = Informacje o aktualizacjach
|
||||||
link.dev-builds.description = Niestabilne wersje gry
|
link.dev-builds.description = Niestabilne wersje gry
|
||||||
link.trello.description = Oficjalna tablica Trello z planowanym funkcjami
|
link.trello.description = Oficjalna tablica Trello z planowanym funkcjami
|
||||||
link.itch.io.description = Strona itch.io z oficjanymi wersjami do pobrania
|
link.itch.io.description = Strona itch.io z oficjanymi wersjami do pobrania
|
||||||
@@ -16,6 +16,13 @@ screenshot.invalid = Zrzut ekranu jest zbyt duży. Najprawdopodobniej brakuje mi
|
|||||||
gameover = Rdzeń został zniszczony.
|
gameover = Rdzeń został zniszczony.
|
||||||
gameover.pvp = Zwyciężyła drużyna [accent]{0}[]!
|
gameover.pvp = Zwyciężyła drużyna [accent]{0}[]!
|
||||||
highscore = [YELLOW] Nowy rekord!
|
highscore = [YELLOW] Nowy rekord!
|
||||||
|
|
||||||
|
load.sound = Dźwięki
|
||||||
|
load.map = Mapy
|
||||||
|
load.image = Obrazy
|
||||||
|
load.content = Treść
|
||||||
|
load.system = System
|
||||||
|
|
||||||
stat.wave = Fale powstrzymane:[accent] {0}
|
stat.wave = Fale powstrzymane:[accent] {0}
|
||||||
stat.enemiesDestroyed = Przeciwnicy zniszczeni:[accent] {0}
|
stat.enemiesDestroyed = Przeciwnicy zniszczeni:[accent] {0}
|
||||||
stat.built = Budynki zbudowane:[accent] {0}
|
stat.built = Budynki zbudowane:[accent] {0}
|
||||||
@@ -23,8 +30,7 @@ stat.destroyed = Budynki zniszczone:[accent] {0}
|
|||||||
stat.deconstructed = Budynki zrekonstruowane:[accent] {0}
|
stat.deconstructed = Budynki zrekonstruowane:[accent] {0}
|
||||||
stat.delivered = Surowce wystrzelone:
|
stat.delivered = Surowce wystrzelone:
|
||||||
stat.rank = Ocena: [accent]{0}
|
stat.rank = Ocena: [accent]{0}
|
||||||
placeline = Wybrałeś blok.\nMożesz umieścić[accent] w linii,[] [accent]przytrzymując palec przez kilka sekund[] i przeciągając.\nSpróbuj.
|
|
||||||
removearea = Wybrałeś tryb usuwania.\nMożesz[accent] usunąć bloki w prostokoncie,[] [accent]przytrzymując palec przez kilka sekund i przeciągając[] and dragging.\nTry it.
|
|
||||||
launcheditems = [accent]Wystrzelone przedmioty
|
launcheditems = [accent]Wystrzelone przedmioty
|
||||||
map.delete = Jesteś pewny, że chcesz usunąć "[accent]{0}[]"?
|
map.delete = Jesteś pewny, że chcesz usunąć "[accent]{0}[]"?
|
||||||
level.highscore = Rekord: [accent]{0}
|
level.highscore = Rekord: [accent]{0}
|
||||||
@@ -43,11 +49,18 @@ newgame = Nowa Gra
|
|||||||
none = <none>
|
none = <none>
|
||||||
minimap = Minimapa
|
minimap = Minimapa
|
||||||
close = Zamknij
|
close = Zamknij
|
||||||
website = Website
|
website = Strona Gry
|
||||||
quit = Wyjdź
|
quit = Wyjdź
|
||||||
maps = Mapy
|
maps = Mapy
|
||||||
continue = Kontynuuj
|
continue = Kontynuuj
|
||||||
maps.none = [LIGHT_GRAY]Nie znaleziono żadnych map!
|
maps.none = [LIGHT_GRAY]Nie znaleziono żadnych map!
|
||||||
|
invalid = Invalid
|
||||||
|
preparingconfig = Preparing Config
|
||||||
|
preparingcontent = Preparing Content
|
||||||
|
uploadingcontent = Uploading Content
|
||||||
|
uploadingpreviewfile = Uploading Preview File
|
||||||
|
committingchanges = Comitting Changes
|
||||||
|
done = Done
|
||||||
about.button = O grze
|
about.button = O grze
|
||||||
name = Nazwa:
|
name = Nazwa:
|
||||||
noname = Najpierw wybierz [accent]nazwę gracza[]
|
noname = Najpierw wybierz [accent]nazwę gracza[]
|
||||||
@@ -62,17 +75,21 @@ players = {0} graczy online
|
|||||||
players.single = {0} gracz online
|
players.single = {0} gracz online
|
||||||
server.closing = [accent] Zamykanie serwera...
|
server.closing = [accent] Zamykanie serwera...
|
||||||
server.kicked.kick = Zostałeś wyrzucony z serwera!
|
server.kicked.kick = Zostałeś wyrzucony z serwera!
|
||||||
|
server.kicked.whitelist = You are not whitelisted here.
|
||||||
server.kicked.serverClose = Serwer został zamknięty.
|
server.kicked.serverClose = Serwer został zamknięty.
|
||||||
|
server.kicked.vote = Zostałeś wyrzucony z gry. Żegnaj.
|
||||||
server.kicked.clientOutdated = Nieaktualna gra! Zaktualizują ją!
|
server.kicked.clientOutdated = Nieaktualna gra! Zaktualizują ją!
|
||||||
server.kicked.serverOutdated = Nieaktualny serwer! Poproś hosta o jego aktualizację.
|
server.kicked.serverOutdated = Nieaktualny serwer! Poproś hosta o jego aktualizację.
|
||||||
server.kicked.banned = Zostałeś zbanowany na tym serwerze.
|
server.kicked.banned = Zostałeś zbanowany na tym serwerze.
|
||||||
|
server.kicked.typeMismatch = Ten serwer jest niekompatybilny z twoją wersją gry.
|
||||||
|
server.kicked.playerLimit = Serwer pełny. Poczekaj na wolny slot.
|
||||||
server.kicked.recentKick = Zostałeś niedawno wyrzucony.\nPoczekaj chwilę przed ponownym połączniem.
|
server.kicked.recentKick = Zostałeś niedawno wyrzucony.\nPoczekaj chwilę przed ponownym połączniem.
|
||||||
server.kicked.nameInUse = Ta nazwa jest już zajęta na tym serwerze.
|
server.kicked.nameInUse = Ta nazwa jest już zajęta na tym serwerze.
|
||||||
server.kicked.nameEmpty = Wybrana przez Ciebie nazwa jest nieprawidłowa.
|
server.kicked.nameEmpty = Wybrana przez Ciebie nazwa jest nieprawidłowa.
|
||||||
server.kicked.idInUse = Jesteś już na serwerze! Używanie tego samego konta na 2 urządzeniach jest zabronione.
|
server.kicked.idInUse = Jesteś już na serwerze! Używanie tego samego konta na 2 urządzeniach jest zabronione.
|
||||||
server.kicked.customClient = Ten serwer nie wspomaga wersji deweloperskich. Pobierz oficjalną wersję.
|
server.kicked.customClient = Ten serwer nie wspomaga wersji deweloperskich. Pobierz oficjalną wersję.
|
||||||
server.kicked.gameover = Koniec gry!
|
server.kicked.gameover = Koniec gry!
|
||||||
server.versions = Your version:[accent] {0}[]\nServer version:[accent] {1}[]
|
server.versions = Twoja wersja gry:[accent] {0}[]\nWersja gry serwera:[accent] {1}[]
|
||||||
host.info = Przycisk [accent]host[] hostuje serwer na porcie [scarlet]6567[] i [scarlet]6568.[]\nKtokolwiek z tym samym [LIGHT_GRAY]wifi lub hotspotem[] powinien zobaczyć twój serwer.\n\nJeśli chcesz, aby każdy z twoim IP mógł dołączyć, [accent]przekierowywanie portów[] jest potrzebne.\n\n[LIGHT_GRAY]Notka:Jeśli ktokolwiek ma problem z dołączeniem do gry, upewnij się, że udostępniłeś Mindustry dostęp do sieci.
|
host.info = Przycisk [accent]host[] hostuje serwer na porcie [scarlet]6567[] i [scarlet]6568.[]\nKtokolwiek z tym samym [LIGHT_GRAY]wifi lub hotspotem[] powinien zobaczyć twój serwer.\n\nJeśli chcesz, aby każdy z twoim IP mógł dołączyć, [accent]przekierowywanie portów[] jest potrzebne.\n\n[LIGHT_GRAY]Notka:Jeśli ktokolwiek ma problem z dołączeniem do gry, upewnij się, że udostępniłeś Mindustry dostęp do sieci.
|
||||||
join.info = Tutaj możesz wpisać [accent]IP serwera[], aby dołączyć lub wyszukaj [accent]serwery w lokalnej sieci[], do których chcesz dołączyć .\nGra wieloosobowa na LAN i WAN jest wspomagana.\n\n[LIGHT_GRAY]Notka: Nie ma automatycznej listy wszystkich serwerów; jeśli chcesz dołączyć przez IP, musisz zapytać się hosta o IP.
|
join.info = Tutaj możesz wpisać [accent]IP serwera[], aby dołączyć lub wyszukaj [accent]serwery w lokalnej sieci[], do których chcesz dołączyć .\nGra wieloosobowa na LAN i WAN jest wspomagana.\n\n[LIGHT_GRAY]Notka: Nie ma automatycznej listy wszystkich serwerów; jeśli chcesz dołączyć przez IP, musisz zapytać się hosta o IP.
|
||||||
hostserver = Stwórz Serwer
|
hostserver = Stwórz Serwer
|
||||||
@@ -81,6 +98,7 @@ host = Hostuj
|
|||||||
hosting = [accent] Otwieranie serwera...
|
hosting = [accent] Otwieranie serwera...
|
||||||
hosts.refresh = Odśwież
|
hosts.refresh = Odśwież
|
||||||
hosts.discovering = Wyszukiwanie gier w sieci LAN
|
hosts.discovering = Wyszukiwanie gier w sieci LAN
|
||||||
|
hosts.discovering.any = Discovering games
|
||||||
server.refreshing = Odświeżanie serwera
|
server.refreshing = Odświeżanie serwera
|
||||||
hosts.none = [lightgray] Brak serwerów w sieci LAN!
|
hosts.none = [lightgray] Brak serwerów w sieci LAN!
|
||||||
host.invalid = [scarlet] Nie można połączyć się z hostem.
|
host.invalid = [scarlet] Nie można połączyć się z hostem.
|
||||||
@@ -88,7 +106,7 @@ trace = Zlokalizuj gracza
|
|||||||
trace.playername = Nazwa gracza: [accent]{0}
|
trace.playername = Nazwa gracza: [accent]{0}
|
||||||
trace.ip = IP: [accent]{0}
|
trace.ip = IP: [accent]{0}
|
||||||
trace.id = Wyjątkowe ID: [accent]{0}
|
trace.id = Wyjątkowe ID: [accent]{0}
|
||||||
trace.mobile = Mobile Client: [accent]{0}
|
trace.mobile = Klient Mobilny: [accent]{0}
|
||||||
trace.modclient = Zmodowany klient: [accent]{0}
|
trace.modclient = Zmodowany klient: [accent]{0}
|
||||||
invalidid = Złe ID klienta! Udostępnij raport błędu.
|
invalidid = Złe ID klienta! Udostępnij raport błędu.
|
||||||
server.bans = Bany
|
server.bans = Bany
|
||||||
@@ -110,6 +128,9 @@ confirmunadmin = Jesteś pewny, że chcesz zabrać rangę admina temu graczowi?
|
|||||||
joingame.title = Dołącz do gry
|
joingame.title = Dołącz do gry
|
||||||
joingame.ip = IP:
|
joingame.ip = IP:
|
||||||
disconnect = Rozłączono.
|
disconnect = Rozłączono.
|
||||||
|
disconnect.error = Błąd połączenia.
|
||||||
|
disconnect.closed = Połączenie zostało zamknięte.
|
||||||
|
disconnect.timeout = Przekroczono limit czasu.
|
||||||
disconnect.data = Nie udało się załadować mapy!
|
disconnect.data = Nie udało się załadować mapy!
|
||||||
connecting = [accent]Łączenie...
|
connecting = [accent]Łączenie...
|
||||||
connecting.data = [accent]Ładowanie danych świata...
|
connecting.data = [accent]Ładowanie danych świata...
|
||||||
@@ -136,7 +157,7 @@ save.rename = Zmień nazwę
|
|||||||
save.rename.text = Nowa nazwa:
|
save.rename.text = Nowa nazwa:
|
||||||
selectslot = Wybierz zapis.
|
selectslot = Wybierz zapis.
|
||||||
slot = [accent]Slot {0}
|
slot = [accent]Slot {0}
|
||||||
save.corrupted = [accent]Zapis gry jest uszkodzony lub nieprawidłowy! Jeżeli aktualizowałeś grę, najprawdopodobniej zmiana w formacie zapisu i [scarlet]nie jest[] to błąd.
|
save.corrupted = [accent]Zapis gry jest uszkodzony lub nieprawidłowy! Jeżeli aktualizowałeś grę, najprawdopodobniej jest to zmiana w formacie zapisu i [scarlet]nie jest[] to błąd.
|
||||||
empty = <pusto>
|
empty = <pusto>
|
||||||
on = Włączone
|
on = Włączone
|
||||||
off = Wyłączone
|
off = Wyłączone
|
||||||
@@ -151,20 +172,25 @@ confirm = Potwierdź
|
|||||||
delete = Usuń
|
delete = Usuń
|
||||||
ok = Ok
|
ok = Ok
|
||||||
open = Otwórz
|
open = Otwórz
|
||||||
customize = Customize
|
customize = Dostosuj
|
||||||
cancel = Anuluj
|
cancel = Anuluj
|
||||||
openlink = Otwórz link
|
openlink = Otwórz link
|
||||||
copylink = Kopiuj link
|
copylink = Kopiuj link
|
||||||
back = Wróć
|
back = Wróć
|
||||||
classic.export = Export Classic Data
|
data.export = Eksportuj Dane
|
||||||
classic.export.text = [accent]Mindustry[] has just had a major update.\nClassic (v3.5 build 40) save or map data has been detected. Would you like to export these saves to your phone's home folder, for use in the Mindustry Classic app?
|
data.import = Importuj Dane
|
||||||
|
data.exported = Dane wyeksportowane.
|
||||||
|
data.invalid = Nieprawidłowe dane gry.
|
||||||
|
data.import.confirm = Zaimportowanie zewnętrznych danych usunie[scarlet] wszystkie[] obecne dane gry.\n[accent]Nie można tego cofnąć![]\n\nGdy dane zostaną zimportowane, gra automatycznie się wyłączy.
|
||||||
|
classic.export = Eksportuj dane wersji klasycznej
|
||||||
|
classic.export.text = [accent]Mindustry[] otrzymało ostatnio ważną aktualizację.\nClassic (v3.5 build 40) zapis albo mapa zostały wykryte. Czy chciałbyś eksportować te zapisy do katalogu domowego swojego telefonu, do użycia w aplikacji Mindustry Classic?
|
||||||
quit.confirm = Czy na pewno chcesz wyjść?
|
quit.confirm = Czy na pewno chcesz wyjść?
|
||||||
quit.confirm.tutorial = Are you sure you know what you're doing?\nThe tutorial can be re-taken in[accent] Settings->Game->Re-Take Tutorial.[]
|
quit.confirm.tutorial = Czy jesteś pewien tego co robisz?\nSamouczek może zostać powtórzony w[accent] Opcje->Gra->Powtórz samouczek.[]
|
||||||
loading = [accent]Ładowanie...
|
loading = [accent]Ładowanie...
|
||||||
saving = [accent]Zapisywanie...
|
saving = [accent]Zapisywanie...
|
||||||
wave = [accent]Fala {0}
|
wave = [accent]Fala {0}
|
||||||
wave.waiting = Fala za {0}
|
wave.waiting = Fala za {0}
|
||||||
wave.waveInProgress = [LIGHT_GRAY]Wave in progress
|
wave.waveInProgress = [LIGHT_GRAY]Fala w trakcie
|
||||||
waiting = [LIGHT_GRAY]Oczekiwanie...
|
waiting = [LIGHT_GRAY]Oczekiwanie...
|
||||||
waiting.players = Oczekiwanie na graczy...
|
waiting.players = Oczekiwanie na graczy...
|
||||||
wave.enemies = Pozostało [LIGHT_GRAY]{0} wrogów
|
wave.enemies = Pozostało [LIGHT_GRAY]{0} wrogów
|
||||||
@@ -180,6 +206,9 @@ map.nospawn = Ta mapa nie zawiera żadnego rdzenia! Dodaj [ROYAL]niebieski[] rdz
|
|||||||
map.nospawn.pvp = Ta mapa nie ma żadnego rdzenia przeciwnika, aby mogli się zrespić przeciwnicy! Dodaj[SCARLET] inny niż niebieski[] rdzeń do mapy w edytorze.
|
map.nospawn.pvp = Ta mapa nie ma żadnego rdzenia przeciwnika, aby mogli się zrespić przeciwnicy! Dodaj[SCARLET] inny niż niebieski[] rdzeń do mapy w edytorze.
|
||||||
map.nospawn.attack = Ta mapa nie ma żadnego rdzenia przeciwnika, aby można było go zaatakować! Dodaj[SCARLET] czerwony[] rdzeń do mapy w edytorze.
|
map.nospawn.attack = Ta mapa nie ma żadnego rdzenia przeciwnika, aby można było go zaatakować! Dodaj[SCARLET] czerwony[] rdzeń do mapy w edytorze.
|
||||||
map.invalid = Błąd podczas ładowania mapy: uszkodzony lub niepoprawny plik mapy.
|
map.invalid = Błąd podczas ładowania mapy: uszkodzony lub niepoprawny plik mapy.
|
||||||
|
map.publish.error = Błąd podczas publikowania mapy: {0}
|
||||||
|
map.publish = Opublikowano mapę.
|
||||||
|
map.publishing = [accent]Publikowanie mapy...
|
||||||
editor.brush = Pędzel
|
editor.brush = Pędzel
|
||||||
editor.openin = Otwórz w edytorze
|
editor.openin = Otwórz w edytorze
|
||||||
editor.oregen = Generacja złóż
|
editor.oregen = Generacja złóż
|
||||||
@@ -188,19 +217,21 @@ editor.mapinfo = Informacje o mapie
|
|||||||
editor.author = Autor:
|
editor.author = Autor:
|
||||||
editor.description = Opis:
|
editor.description = Opis:
|
||||||
editor.waves = Fale:
|
editor.waves = Fale:
|
||||||
editor.rules = Rules:
|
editor.rules = Zasady:
|
||||||
editor.generation = Generation:
|
editor.generation = Generacja:
|
||||||
editor.ingame = Edytuj w grze
|
editor.ingame = Edytuj w grze
|
||||||
editor.newmap = New Map
|
editor.publish.workshop = Opublikuj w Workshop
|
||||||
|
editor.newmap = Nowa Mapa
|
||||||
|
workshop = Workshop
|
||||||
waves.title = Fale
|
waves.title = Fale
|
||||||
waves.remove = Usuń
|
waves.remove = Usuń
|
||||||
waves.never = <nigdy>
|
waves.never = <nigdy>
|
||||||
waves.every = co
|
waves.every = co
|
||||||
waves.waves = wave(s)
|
waves.waves = fal(e)
|
||||||
waves.perspawn = per spawn
|
waves.perspawn = co pojawienie
|
||||||
waves.to = do
|
waves.to = do
|
||||||
waves.boss = Boss
|
waves.boss = Boss
|
||||||
waves.preview = Preview
|
waves.preview = Podgląd
|
||||||
waves.edit = Edytuj...
|
waves.edit = Edytuj...
|
||||||
waves.copy = Kopiuj do schowka
|
waves.copy = Kopiuj do schowka
|
||||||
waves.load = Załaduj ze schowka
|
waves.load = Załaduj ze schowka
|
||||||
@@ -208,15 +239,17 @@ waves.invalid = Nieprawidłowe fale w schowku.
|
|||||||
waves.copied = Fale zostały skopiowane.
|
waves.copied = Fale zostały skopiowane.
|
||||||
waves.none = Brak zdefiniowanych wrogów.\nPamiętaj, że puste układy fal zostaną automatycznie zastąpione układem domyślnym.
|
waves.none = Brak zdefiniowanych wrogów.\nPamiętaj, że puste układy fal zostaną automatycznie zastąpione układem domyślnym.
|
||||||
editor.default = [LIGHT_GRAY]<Domyślne>
|
editor.default = [LIGHT_GRAY]<Domyślne>
|
||||||
|
details = Detale...
|
||||||
edit = Edytuj...
|
edit = Edytuj...
|
||||||
editor.name = Nazwa:
|
editor.name = Nazwa:
|
||||||
editor.spawn = Spawn Unit
|
editor.spawn = Stwórz jednostkę
|
||||||
editor.removeunit = Remove Unit
|
editor.removeunit = Usuń jednostkę
|
||||||
editor.teams = Drużyny
|
editor.teams = Drużyny
|
||||||
editor.errorload = Błąd podczas ładowania pliku:\n[accent]{0}
|
editor.errorload = Błąd podczas ładowania pliku:\n[accent]{0}
|
||||||
editor.errorsave = Błąd podczas zapisywania pliku:\n[accent]{0}
|
editor.errorsave = Błąd podczas zapisywania pliku:\n[accent]{0}
|
||||||
editor.errorimage = To obraz, nie mapa. Nie zmieniaj rozszeżenia spodziewając sie że to coś zmieni.\n\nJeśli chcesz zaimportować starszą mapę, użyj przycisku „importuj starszą mapę” w edytorze.
|
editor.errorimage = To obraz, nie mapa. Nie zmieniaj rozszeżenia spodziewając sie że to coś zmieni.\n\nJeśli chcesz zaimportować starszą mapę, użyj przycisku „importuj starszą mapę” w edytorze.
|
||||||
editor.errorlegacy = Ta mapa jest zbyt stara i używa starszego formatu mapy, który nie jest już obsługiwany.
|
editor.errorlegacy = Ta mapa jest zbyt stara i używa starszego formatu mapy, który nie jest już obsługiwany.
|
||||||
|
editor.errornot = To nie jest plik mapy.
|
||||||
editor.errorheader = Ten plik mapy jest nieprawidłowy lub uszkodzony.
|
editor.errorheader = Ten plik mapy jest nieprawidłowy lub uszkodzony.
|
||||||
editor.errorname = Mapa nie zawiera nazwy.
|
editor.errorname = Mapa nie zawiera nazwy.
|
||||||
editor.update = Aktualizuj
|
editor.update = Aktualizuj
|
||||||
@@ -250,6 +283,7 @@ editor.mapname = Nazwa mapy:
|
|||||||
editor.overwrite = [accent]Uwaga!\nSpowoduje to nadpisanie istniejącej mapy.
|
editor.overwrite = [accent]Uwaga!\nSpowoduje to nadpisanie istniejącej mapy.
|
||||||
editor.overwrite.confirm = [scarlet]Uwaga![] Mapa pod tą nazwą już istnieje. Jesteś pewny, że chcesz ją nadpisać?
|
editor.overwrite.confirm = [scarlet]Uwaga![] Mapa pod tą nazwą już istnieje. Jesteś pewny, że chcesz ją nadpisać?
|
||||||
editor.selectmap = Wybierz mapę do załadowania:
|
editor.selectmap = Wybierz mapę do załadowania:
|
||||||
|
|
||||||
toolmode.replace = Zastąp
|
toolmode.replace = Zastąp
|
||||||
toolmode.replace.description = Rysuje tylko na stałych blokach.
|
toolmode.replace.description = Rysuje tylko na stałych blokach.
|
||||||
toolmode.replaceall = Zastąp wszystko
|
toolmode.replaceall = Zastąp wszystko
|
||||||
@@ -257,30 +291,31 @@ toolmode.replaceall.description = Zastąp wszystkie bloki na mapie.
|
|||||||
toolmode.orthogonal = Prostokątny
|
toolmode.orthogonal = Prostokątny
|
||||||
toolmode.orthogonal.description = Rysuje tylko prostopadłe linie.
|
toolmode.orthogonal.description = Rysuje tylko prostopadłe linie.
|
||||||
toolmode.square = Kwadrat
|
toolmode.square = Kwadrat
|
||||||
toolmode.square.description = Square brush.
|
toolmode.square.description = Kwadratowy pędzel.
|
||||||
toolmode.eraseores = Wymaż Rudy
|
toolmode.eraseores = Wymaż Rudy
|
||||||
toolmode.eraseores.description = Usuń tylko rudy.
|
toolmode.eraseores.description = Usuń tylko rudy.
|
||||||
toolmode.fillteams = Wypełń Drużyny
|
toolmode.fillteams = Wypełń Drużyny
|
||||||
toolmode.fillteams.description = Wypełniaj drużyny zamiast bloków.
|
toolmode.fillteams.description = Wypełniaj drużyny zamiast bloków.
|
||||||
toolmode.drawteams = Rysuj Drużyny
|
toolmode.drawteams = Rysuj Drużyny
|
||||||
toolmode.drawteams.description = Rysuj drużyny zamiast bloków.
|
toolmode.drawteams.description = Rysuj drużyny zamiast bloków.
|
||||||
|
|
||||||
filters.empty = [LIGHT_GRAY]Brak filtrów! Dodaj jeden za pomocą przycisku poniżej.
|
filters.empty = [LIGHT_GRAY]Brak filtrów! Dodaj jeden za pomocą przycisku poniżej.
|
||||||
filter.distort = Zniekształcanie
|
filter.distort = Zniekształcanie
|
||||||
filter.noise = Szum
|
filter.noise = Szum
|
||||||
filter.median = Median
|
filter.median = Mediana
|
||||||
filter.oremedian = Ore Median
|
filter.oremedian = Mediana rud
|
||||||
filter.blend = Blend
|
filter.blend = Wtopienie
|
||||||
filter.defaultores = Domyślne rudy
|
filter.defaultores = Domyślne rudy
|
||||||
filter.ore = Ruda
|
filter.ore = Ruda
|
||||||
filter.rivernoise = Szum rzeki
|
filter.rivernoise = Szum rzeki
|
||||||
filter.mirror = Lustro
|
filter.mirror = Lustro
|
||||||
filter.clear = Oczyść
|
filter.clear = Oczyść
|
||||||
filter.option.ignore = Ignore
|
filter.option.ignore = Ignoruj
|
||||||
filter.scatter = Zozprosz
|
filter.scatter = Rozprosz
|
||||||
filter.terrain = Teren
|
filter.terrain = Teren
|
||||||
filter.option.scale = Skala
|
filter.option.scale = Skala
|
||||||
filter.option.chance = Szansa
|
filter.option.chance = Szansa
|
||||||
filter.option.mag = Magnituda
|
filter.option.mag = Wielkość
|
||||||
filter.option.threshold = Próg
|
filter.option.threshold = Próg
|
||||||
filter.option.circle-scale = Skala koła
|
filter.option.circle-scale = Skala koła
|
||||||
filter.option.octaves = Oktawy
|
filter.option.octaves = Oktawy
|
||||||
@@ -292,14 +327,15 @@ filter.option.flooronto = Podłoga Docelowa
|
|||||||
filter.option.wall = Ściana
|
filter.option.wall = Ściana
|
||||||
filter.option.ore = Ruda
|
filter.option.ore = Ruda
|
||||||
filter.option.floor2 = Druga podłoga
|
filter.option.floor2 = Druga podłoga
|
||||||
filter.option.threshold2 = Secondary Threshold
|
filter.option.threshold2 = Drugi próg
|
||||||
filter.option.radius = Zasięg
|
filter.option.radius = Zasięg
|
||||||
filter.option.percentile = Percentyl
|
filter.option.percentile = Percentyl
|
||||||
|
|
||||||
width = Szerokość:
|
width = Szerokość:
|
||||||
height = Wysokość:
|
height = Wysokość:
|
||||||
menu = Menu
|
menu = Menu
|
||||||
play = Graj
|
play = Graj
|
||||||
campaign = Campaign
|
campaign = Kampania
|
||||||
load = Wczytaj
|
load = Wczytaj
|
||||||
save = Zapisz
|
save = Zapisz
|
||||||
fps = FPS: {0}
|
fps = FPS: {0}
|
||||||
@@ -308,10 +344,11 @@ ping = Ping: {0}ms
|
|||||||
language.restart = Uruchom grę ponownie, aby ustawiony język zaczął funkcjonować.
|
language.restart = Uruchom grę ponownie, aby ustawiony język zaczął funkcjonować.
|
||||||
settings = Ustawienia
|
settings = Ustawienia
|
||||||
tutorial = Poradnik
|
tutorial = Poradnik
|
||||||
tutorial.retake = Re-Take Tutorial
|
tutorial.retake = Ponów Samouczek
|
||||||
editor = Edytor
|
editor = Edytor
|
||||||
mapeditor = Edytor map
|
mapeditor = Edytor map
|
||||||
donate = Wspomóż nas
|
donate = Wspomóż nas
|
||||||
|
|
||||||
abandon = Opuść
|
abandon = Opuść
|
||||||
abandon.text = Ta strefa i wszystkie jej surowce będą przejęte przez przeciwników.
|
abandon.text = Ta strefa i wszystkie jej surowce będą przejęte przez przeciwników.
|
||||||
locked = Zablokowane
|
locked = Zablokowane
|
||||||
@@ -322,21 +359,23 @@ bestwave = [LIGHT_GRAY]Najwyższa fala: {0}
|
|||||||
launch = < WYSTRZEL >
|
launch = < WYSTRZEL >
|
||||||
launch.title = Wystrzelenie Udane
|
launch.title = Wystrzelenie Udane
|
||||||
launch.next = [LIGHT_GRAY]Następna okazja przy fali {0}
|
launch.next = [LIGHT_GRAY]Następna okazja przy fali {0}
|
||||||
launch.unable2 = [scarlet]Unable to LAUNCH.[]
|
launch.unable2 = [scarlet]WYSTZRZELENIE niedostępne.[]
|
||||||
launch.confirm = Spowoduje to wystrzelenie wszystkich surowców w rdzeniu.\nNie będziesz mógł wrócić do tej bazy.
|
launch.confirm = Spowoduje to wystrzelenie wszystkich surowców w rdzeniu.\nNie będziesz mógł wrócić do tej bazy.
|
||||||
launch.skip.confirm = If you skip now, you will not be able to launch until later waves.
|
launch.skip.confirm = Jeśli teraz przejdziesz do kolejnej fali, Nie biędziesz miał możliwości wystrzelenia do czasu pokonania dalszych fal.
|
||||||
uncover = Odkryj
|
uncover = Odkryj
|
||||||
configure = Skonfiguruj ładunek
|
configure = Skonfiguruj ładunek
|
||||||
configure.locked = [LIGHT_GRAY]Dotrzyj do fali {0}\nAby skonfigurować ładunek.
|
configure.locked = [LIGHT_GRAY]Dotrzyj do fali {0}\nAby skonfigurować ładunek.
|
||||||
|
configure.invalid = Ilość musi być liczbą pomiędzy 0 a {0}.
|
||||||
zone.unlocked = [LIGHT_GRAY]Strefa {0} odblokowana.
|
zone.unlocked = [LIGHT_GRAY]Strefa {0} odblokowana.
|
||||||
zone.requirement.complete = Fala {0} osiągnięta:\n{1} Wymagania strefy zostały spełnione.
|
zone.requirement.complete = Fala {0} osiągnięta:\n{1} Wymagania strefy zostały spełnione.
|
||||||
zone.config.complete = Fala {0} osiągnięta:\nKonfiguracja ładunku odblokowana.
|
zone.config.complete = Fala {0} osiągnięta:\nKonfiguracja ładunku odblokowana.
|
||||||
zone.resources = Wykryte Zasoby:
|
zone.resources = Wykryte Zasoby:
|
||||||
zone.objective = [lightgray]Objective: [accent]{0}
|
zone.objective = [lightgray]Cel: [accent]{0}
|
||||||
zone.objective.survival = Przeżyj
|
zone.objective.survival = Przeżyj
|
||||||
zone.objective.attack = Zniszcz Rdzeń Wroga
|
zone.objective.attack = Zniszcz Rdzeń Wroga
|
||||||
add = Dodaj...
|
add = Dodaj...
|
||||||
boss.health = Boss Health
|
boss.health = Zdrowie Bossa
|
||||||
|
|
||||||
connectfail = [crimson]Nie można połączyć się z serwerem:\n\n[accent]{0}
|
connectfail = [crimson]Nie można połączyć się z serwerem:\n\n[accent]{0}
|
||||||
error.unreachable = Serwer niedostępny.\nCzy adres jest wpisany poprawnie?
|
error.unreachable = Serwer niedostępny.\nCzy adres jest wpisany poprawnie?
|
||||||
error.invalidaddress = Niepoprawny adres.
|
error.invalidaddress = Niepoprawny adres.
|
||||||
@@ -346,36 +385,39 @@ error.alreadyconnected = Jesteś już połączony.
|
|||||||
error.mapnotfound = Plik mapy nie został znaleziony!
|
error.mapnotfound = Plik mapy nie został znaleziony!
|
||||||
error.io = Błąd siecowy I/O.
|
error.io = Błąd siecowy I/O.
|
||||||
error.any = Nieznany błąd sieci.
|
error.any = Nieznany błąd sieci.
|
||||||
error.bloom = Failed to initialize bloom.\nYour device may not support it.
|
error.bloom = Nie udało się załadować bloom.\nTwoje urządzenie może nie wspierać tej funkcji.
|
||||||
|
|
||||||
zone.groundZero.name = Wybuch Lądowy
|
zone.groundZero.name = Wybuch Lądowy
|
||||||
zone.desertWastes.name = Pustynne Pustkowia
|
zone.desertWastes.name = Pustynne Pustkowia
|
||||||
zone.craters.name = Kratery
|
zone.craters.name = Kratery
|
||||||
zone.frozenForest.name = Zamrożony Las
|
zone.frozenForest.name = Zamrożony Las
|
||||||
zone.ruinousShores.name = Zniszczone Przybrzerza
|
zone.ruinousShores.name = Zniszczone Przybrzeża
|
||||||
zone.stainedMountains.name = Zabarwione Góry
|
zone.stainedMountains.name = Zabarwione Góry
|
||||||
zone.desolateRift.name = Ponura Szczelina
|
zone.desolateRift.name = Ponura Szczelina
|
||||||
zone.nuclearComplex.name = Centrum Wyrobu Jądrowego
|
zone.nuclearComplex.name = Centrum Wyrobu Jądrowego
|
||||||
zone.overgrowth.name = Przerośnięty Las
|
zone.overgrowth.name = Przerośnięty Las
|
||||||
zone.tarFields.name = Pola Smołowe
|
zone.tarFields.name = Pola Smołowe
|
||||||
zone.saltFlats.name = Salt Flats
|
zone.saltFlats.name = Solne Równiny
|
||||||
zone.impact0078.name = Uderzenie 0078
|
zone.impact0078.name = Uderzenie 0078
|
||||||
zone.crags.name = Urwisko
|
zone.crags.name = Urwisko
|
||||||
zone.fungalPass.name = Fungal Pass
|
zone.fungalPass.name = Grzybowa Przełęcz
|
||||||
zone.groundZero.description = Optymalna lokalizacja, aby rozpocząć jeszcze raz. Niskie zagrożenie. Niewiele zasobów.\nZbierz jak najwięcej miedzi i ołowiu, tyle ile jest możliwe.\nPrzejdź do następnej strefy jak najszybciej.
|
zone.groundZero.description = Optymalna lokalizacja, aby rozpocząć jeszcze raz. Niskie zagrożenie. Niewiele zasobów.\nZbierz jak najwięcej miedzi i ołowiu, tyle ile jest możliwe.\nPrzejdź do następnej strefy jak najszybciej.
|
||||||
zone.frozenForest.description = Nawet tutaj, bliżej gór, zarodniki rozprzestrzeniły się. Niskie temperatury nie mogą ich zatrzymać na zawsze.\n\nRozpocznij przedsięwzięcie od władzy. Buduj generatory spalinowe. Naucz się korzystać z naprawiaczy.
|
zone.frozenForest.description = Nawet tutaj, bliżej gór, zarodniki rozprzestrzeniły się. Niskie temperatury nie mogą ich zatrzymać na zawsze.\n\nRozpocznij przedsięwzięcie od władzy. Buduj generatory spalinowe. Naucz się korzystać z naprawiaczy.
|
||||||
zone.desertWastes.description = These wastes are vast, unpredictable, and criss-crossed with derelict sector structures.\nCoal is present in the region. Burn it for power, or synthesize graphite.\n\n[lightgray]This landing location cannot be guaranteed.
|
zone.desertWastes.description = Te pustkowia są rozległe, nieprzewidywalne, i znajdują się na nich opuszczone struktury.\nWęgiel jest obecny w tym regionie. Użyj go do produkcji energii, lub do stworzenia grafitu.\n\n[lightgray]Miejsce lądowania nie jest pewne.
|
||||||
zone.saltFlats.description = On the outskirts of the desert lie the Salt Flats. Few resources can be found in this location.\n\nThe enemy has erected a resource storage complex here. Eradicate their core. Leave nothing standing.
|
zone.saltFlats.description = Na obrzeżach pustyni spoczywają Solne Równiny. Można tu znaleźć niewiele surowców.\n\nWrogowie zbudowali tu bazę składującą surowce. Zniszcz ich rdżeń. Zniszcz wszystko co stanie ci na drodze.
|
||||||
zone.craters.description = Water has accumulated in this crater, relic of the old wars. Reclaim the area. Collect sand. Smelt metaglass. Pump water to cool turrets and drills.
|
zone.craters.description = W tym kraterze zebrała się woda. Pozostałość dawnych wojen. Odzyskaj ten teren. Wykop piasek. Wytop metaszkło. Pompuj wodę do działek obronnych i wierteł by je schłodzić
|
||||||
zone.ruinousShores.description = Past the wastes, is the shoreline. Once, this location housed a coastal defense array. Not much of it remains. Only the most basic defense structures have remained unscathed, everything else reduced to scrap.\nContinue the expansion outwards. Rediscover the technology.
|
zone.ruinousShores.description = Za pustkowiami ciągnie się linia brzegowa. Kiedyś znajdowała się tu przybrzeżna linia obronna. Niewiele z niej zostało. Ostały się tylko podstawowe struktury obronne, z reszty został tylko złom.\nKontynuuj eksploracje. Odkryj pozostawioną tu technologię.
|
||||||
zone.stainedMountains.description = W głębi lądu leżą góry, jeszcze nieskażone przez zarodniki.\nWydobądź obfity tytan w tym obszarze. Dowiedz się, jak z niego korzystać.\n\nObecność wroga jest tutaj większa. Nie daj im czasu na wysłanie swoich najsilniejszych jednostek.
|
zone.stainedMountains.description = W głębi lądu leżą góry, jeszcze nieskażone przez zarodniki.\nWydobądź obfity tytan w tym obszarze. Dowiedz się, jak z niego korzystać.\n\nObecność wroga jest tutaj większa. Nie daj im czasu na wysłanie swoich najsilniejszych jednostek.
|
||||||
zone.overgrowth.description = Obszar ten jest zarośnięty, bliżej źródła zarodników.\nWróg założył tu placówkę. Zbuduj jednostki Nóż. Zniszcz to. Odzyskaj to, co nam odebrano.
|
zone.overgrowth.description = Obszar ten jest zarośnięty, bliżej źródła zarodników.\nWróg założył tu placówkę. Zbuduj jednostki Nóż. Zniszcz to. Odzyskaj to, co nam odebrano.
|
||||||
zone.tarFields.description = Obrzeża strefy produkcji ropy, między górami a pustynią. Jeden z niewielu obszarów z rezerwami użytecznej smoły.\nMimo że ta strefa jest opuszczona, w pobliżu znajdują się niebezpieczne siły wroga. Nie lekceważ ich.\n\n[lightgray]Jeśli to możliwe, zbadaj technologię przetwarzania oleju.
|
zone.tarFields.description = Obrzeża strefy produkcji ropy, między górami a pustynią. Jeden z niewielu obszarów z rezerwami użytecznej smoły.\nMimo że ta strefa jest opuszczona, w pobliżu znajdują się niebezpieczne siły wroga. Nie lekceważ ich.\n\n[lightgray]Jeśli to możliwe, zbadaj technologię przetwarzania oleju.
|
||||||
zone.desolateRift.description = Strefa wyjątkowo niebezpieczna. Opfita w zasoby ale mało miejsca. Wysokie ryzyko zniszczenia. Opuść tę strefe jak najszybciej. Nie daj się zwieść długiemu odstępowi między atakami wroga.
|
zone.desolateRift.description = Strefa wyjątkowo niebezpieczna. Obfita w zasoby ale mało miejsca. Wysokie ryzyko zniszczenia. Opuść tę strefe jak najszybciej. Nie daj się zwieść długiemu odstępowi między atakami wroga.
|
||||||
zone.nuclearComplex.description = Dawny zakład produkcji i przetwarzania toru, zredukowny do ruin.\n[lightgray]Zbadaj tor i jego zastosowania.\n\nWróg jest tutaj obecny w dużej ilości, nieustannie poszukuje napastników.
|
zone.nuclearComplex.description = Dawny zakład produkcji i przetwarzania toru, zredukowny do ruin.\n[lightgray]Zbadaj tor i jego zastosowania.\n\nWróg jest tutaj obecny w dużej ilości, nieustannie poszukuje napastników.
|
||||||
zone.fungalPass.description = A transition area between high mountains and lower, spore-ridden lands. A small enemy reconnaissance base is located here.\nDestroy it.\nUse Dagger and Crawler units. Take out the two cores.
|
zone.fungalPass.description = Przejściowy obszar pomiędzy wysokimi górami a nisko znajdującymi się, ogarniętymi przez zarodniki równinami. Znajduje się tu mała postawiona przez wrogów baza zwiadowcza.\nZniszcz ją.\nUżyj jednostek Nóż i Pełzak. Zniszcz oba rdżenie.
|
||||||
zone.impact0078.description = <insert description here>
|
zone.impact0078.description = <insert description here>
|
||||||
zone.crags.description = <insert description here>
|
zone.crags.description = <insert description here>
|
||||||
|
|
||||||
settings.language = Język
|
settings.language = Język
|
||||||
|
settings.data = Dane Gry
|
||||||
settings.reset = Przywróć domyślne
|
settings.reset = Przywróć domyślne
|
||||||
settings.rebind = Zmień
|
settings.rebind = Zmień
|
||||||
settings.controls = Sterowanie
|
settings.controls = Sterowanie
|
||||||
@@ -393,14 +435,14 @@ no = Nie ma mowy!
|
|||||||
info.title = Informacje
|
info.title = Informacje
|
||||||
error.title = [crimson]Wystąpił błąd
|
error.title = [crimson]Wystąpił błąd
|
||||||
error.crashtitle = Wystąpił błąd
|
error.crashtitle = Wystąpił błąd
|
||||||
attackpvponly = [scarlet]Only available in Attack/PvP modes
|
attackpvponly = [scarlet]Dostępne tylko w trybach Atak/PvP
|
||||||
blocks.input = Wejście
|
blocks.input = Wejście
|
||||||
blocks.output = Wyjście
|
blocks.output = Wyjście
|
||||||
blocks.booster = Wzmacniacz
|
blocks.booster = Wzmacniacz
|
||||||
block.unknown = [LIGHT_GRAY]???
|
block.unknown = [LIGHT_GRAY]???
|
||||||
blocks.powercapacity = Pojemność mocy
|
blocks.powercapacity = Pojemność mocy
|
||||||
blocks.powershot = moc/strzał
|
blocks.powershot = moc/strzał
|
||||||
blocks.damage = Damage
|
blocks.damage = Obrażenia
|
||||||
blocks.targetsair = Namierzanie wrogów powietrznych
|
blocks.targetsair = Namierzanie wrogów powietrznych
|
||||||
blocks.targetsground = Namierzanie wrogów lądowych
|
blocks.targetsground = Namierzanie wrogów lądowych
|
||||||
blocks.itemsmoved = Prędkość poruszania się
|
blocks.itemsmoved = Prędkość poruszania się
|
||||||
@@ -423,22 +465,26 @@ blocks.boosteffect = Efekt wzmocnienia
|
|||||||
blocks.maxunits = Maksymalna ilość jednostek
|
blocks.maxunits = Maksymalna ilość jednostek
|
||||||
blocks.health = Zdrowie
|
blocks.health = Zdrowie
|
||||||
blocks.buildtime = Czas budowy
|
blocks.buildtime = Czas budowy
|
||||||
|
blocks.buildcost = Koszt budowy
|
||||||
blocks.inaccuracy = Niedokładność
|
blocks.inaccuracy = Niedokładność
|
||||||
blocks.shots = Strzały
|
blocks.shots = Strzały
|
||||||
blocks.reload = Strzałów/sekundę
|
blocks.reload = Strzałów/sekundę
|
||||||
blocks.ammo = Amunicja
|
blocks.ammo = Amunicja
|
||||||
bar.drilltierreq = Better Drill Required
|
|
||||||
|
bar.drilltierreq = Wymagane Lepsze Wiertło
|
||||||
bar.drillspeed = Prędkość wiertła: {0}/s
|
bar.drillspeed = Prędkość wiertła: {0}/s
|
||||||
bar.efficiency = Efektywność: {0}%
|
bar.efficiency = Efektywność: {0}%
|
||||||
bar.powerbalance = Moc: {0}
|
bar.powerbalance = Moc: {0}
|
||||||
bar.poweramount = Moc: {0}
|
bar.poweramount = Moc: {0}
|
||||||
bar.poweroutput = Wyjście mocy: {0}
|
bar.poweroutput = Wyjście mocy: {0}
|
||||||
bar.items = Przedmiotów: {0}
|
bar.items = Przedmiotów: {0}
|
||||||
|
bar.capacity = Pojemność: {0}
|
||||||
bar.liquid = Płyn
|
bar.liquid = Płyn
|
||||||
bar.heat = Ciepło
|
bar.heat = Ciepło
|
||||||
bar.power = Prąd
|
bar.power = Prąd
|
||||||
bar.progress = Postęp Budowy
|
bar.progress = Postęp Budowy
|
||||||
bar.spawned = Jednostki: {0}/{1}
|
bar.spawned = Jednostki: {0}/{1}
|
||||||
|
|
||||||
bullet.damage = [stat]{0}[lightgray] Obrażenia
|
bullet.damage = [stat]{0}[lightgray] Obrażenia
|
||||||
bullet.splashdamage = [stat]{0}[lightgray] Obrażenia obszarowe ~[stat] {1}[lightgray] kratki
|
bullet.splashdamage = [stat]{0}[lightgray] Obrażenia obszarowe ~[stat] {1}[lightgray] kratki
|
||||||
bullet.incendiary = [stat]zapalający
|
bullet.incendiary = [stat]zapalający
|
||||||
@@ -450,6 +496,7 @@ bullet.freezing = [stat]zamrażający
|
|||||||
bullet.tarred = [stat]smolny
|
bullet.tarred = [stat]smolny
|
||||||
bullet.multiplier = [stat]{0}[lightgray]x mnożnik amunicji
|
bullet.multiplier = [stat]{0}[lightgray]x mnożnik amunicji
|
||||||
bullet.reload = [stat]{0}[lightgray]x szybkość ataku
|
bullet.reload = [stat]{0}[lightgray]x szybkość ataku
|
||||||
|
|
||||||
unit.blocks = Klocki
|
unit.blocks = Klocki
|
||||||
unit.powersecond = jednostek prądu na sekundę
|
unit.powersecond = jednostek prądu na sekundę
|
||||||
unit.liquidsecond = jednostek płynów na sekundę
|
unit.liquidsecond = jednostek płynów na sekundę
|
||||||
@@ -471,17 +518,17 @@ category.shooting = Strzelanie
|
|||||||
category.optional = Dodatkowe ulepszenia
|
category.optional = Dodatkowe ulepszenia
|
||||||
setting.landscape.name = Zablokuj tryb panoramiczny
|
setting.landscape.name = Zablokuj tryb panoramiczny
|
||||||
setting.shadows.name = Cienie
|
setting.shadows.name = Cienie
|
||||||
setting.linear.name = Linear Filtering
|
setting.linear.name = Filtrowanie Liniowe
|
||||||
setting.animatedwater.name = Animowana woda
|
setting.animatedwater.name = Animowana woda
|
||||||
setting.animatedshields.name = Animowana Tarcza
|
setting.animatedshields.name = Animowana Tarcza
|
||||||
setting.antialias.name = Antialias[LIGHT_GRAY] (wymaga restartu)[]
|
setting.antialias.name = Antialias[LIGHT_GRAY] (wymaga restartu)[]
|
||||||
setting.indicators.name = Wskaźniki Przyjaciół
|
setting.indicators.name = Wskaźniki Przyjaciół
|
||||||
setting.autotarget.name = Automatyczne Celowanie
|
setting.autotarget.name = Automatyczne Celowanie
|
||||||
setting.keyboard.name = Mouse+Keyboard Controls
|
setting.keyboard.name = Sterowanie Myszka+Klawiatura
|
||||||
setting.fpscap.name = Maksymalny FPS
|
setting.fpscap.name = Maksymalny FPS
|
||||||
setting.fpscap.none = Nieograniczone
|
setting.fpscap.none = Nieograniczone
|
||||||
setting.fpscap.text = {0} FPS
|
setting.fpscap.text = {0} FPS
|
||||||
setting.uiscale.name = UI Scaling[lightgray] (require restart)[]
|
setting.uiscale.name = Skalowanie Interfejsu[lightgray] (wymaga restartu)[]
|
||||||
setting.swapdiagonal.name = Pozwala na ukośne stawianie
|
setting.swapdiagonal.name = Pozwala na ukośne stawianie
|
||||||
setting.difficulty.training = trening
|
setting.difficulty.training = trening
|
||||||
setting.difficulty.easy = Łatwy
|
setting.difficulty.easy = Łatwy
|
||||||
@@ -502,18 +549,21 @@ setting.lasers.name = Pokaż lasery zasilające
|
|||||||
setting.pixelate.name = Pikselacja [LIGHT_GRAY](wyłącza animacje)
|
setting.pixelate.name = Pikselacja [LIGHT_GRAY](wyłącza animacje)
|
||||||
setting.minimap.name = Pokaż Minimapę
|
setting.minimap.name = Pokaż Minimapę
|
||||||
setting.musicvol.name = Głośność muzyki
|
setting.musicvol.name = Głośność muzyki
|
||||||
setting.ambientvol.name = Ambient Volume
|
setting.ambientvol.name = Głośność otoczenia
|
||||||
setting.mutemusic.name = Wycisz muzykę
|
setting.mutemusic.name = Wycisz muzykę
|
||||||
setting.sfxvol.name = Głośność dźwięków
|
setting.sfxvol.name = Głośność dźwięków
|
||||||
setting.mutesound.name = Wycisz dźwięki
|
setting.mutesound.name = Wycisz dźwięki
|
||||||
setting.crashreport.name = Wysyłaj anonimowo dane o crashu gry
|
setting.crashreport.name = Wysyłaj anonimowo dane o crashu gry
|
||||||
|
setting.savecreate.name = Automatyczne tworzenie zapisu
|
||||||
|
setting.publichost.name = Widoczność gry publicznej
|
||||||
|
|
||||||
setting.chatopacity.name = Przezroczystość czatu
|
setting.chatopacity.name = Przezroczystość czatu
|
||||||
setting.playerchat.name = Wyświetlaj czat w grze
|
setting.playerchat.name = Wyświetlaj czat w grze
|
||||||
uiscale.reset = UI scale has been changed.\nPress "OK" to confirm this scale.\n[scarlet]Reverting and exiting in[accent] {0}[] settings...
|
uiscale.reset = Skala interfejsu uległa zmianie.\nNaciśnij "OK" by potwierdzić zmiany.\n[scarlet]Cofanie zmian i wyjście z gry za[accent] {0}[]
|
||||||
uiscale.cancel = Cancel & Exit
|
uiscale.cancel = Anuluj i wyjdź
|
||||||
setting.bloom.name = Bloom
|
setting.bloom.name = Bloom
|
||||||
keybind.title = Zmień
|
keybind.title = Zmień
|
||||||
keybinds.mobile = [scarlet]Most keybinds here are not functional on mobile. Only basic movement is supported.
|
keybinds.mobile = [scarlet]Większość skrótów klawiszowych nie funkcjonuje w wersji mobilnej. Tylko podstawowe poruszanie się jest wspierane.
|
||||||
category.general.name = Ogólne
|
category.general.name = Ogólne
|
||||||
category.view.name = Wyświetl
|
category.view.name = Wyświetl
|
||||||
category.multiplayer.name = Multiplayer
|
category.multiplayer.name = Multiplayer
|
||||||
@@ -527,8 +577,9 @@ keybind.press.axis = Naciśnij oś lub klawisz...
|
|||||||
keybind.screenshot.name = Zrzut ekranu mapy
|
keybind.screenshot.name = Zrzut ekranu mapy
|
||||||
keybind.move_x.name = Poruszanie w poziomie
|
keybind.move_x.name = Poruszanie w poziomie
|
||||||
keybind.move_y.name = Poruszanie w pionie
|
keybind.move_y.name = Poruszanie w pionie
|
||||||
|
keybind.fullscreen.name = Toggle Fullscreen
|
||||||
keybind.select.name = Zaznacz
|
keybind.select.name = Zaznacz
|
||||||
keybind.diagonal_placement.name = Diagonal Placement
|
keybind.diagonal_placement.name = Budowa po skosie
|
||||||
keybind.pick.name = Wybierz Blok
|
keybind.pick.name = Wybierz Blok
|
||||||
keybind.break_block.name = Zniszcz Blok
|
keybind.break_block.name = Zniszcz Blok
|
||||||
keybind.deselect.name = Odznacz
|
keybind.deselect.name = Odznacz
|
||||||
@@ -537,7 +588,7 @@ keybind.zoom_hold.name = Inicjator przybliżania
|
|||||||
keybind.zoom.name = Przybliżanie
|
keybind.zoom.name = Przybliżanie
|
||||||
keybind.menu.name = Menu
|
keybind.menu.name = Menu
|
||||||
keybind.pause.name = Pauza
|
keybind.pause.name = Pauza
|
||||||
keybind.minimap.name = Minimap
|
keybind.minimap.name = Minimapa
|
||||||
keybind.dash.name = Przyspieszenie
|
keybind.dash.name = Przyspieszenie
|
||||||
keybind.chat.name = Czat
|
keybind.chat.name = Czat
|
||||||
keybind.player_list.name = Lista graczy
|
keybind.player_list.name = Lista graczy
|
||||||
@@ -559,24 +610,25 @@ mode.pvp.description = Walcz przeciwko innym graczom.
|
|||||||
mode.attack.name = Atak
|
mode.attack.name = Atak
|
||||||
mode.attack.description = Brak fal, celem jest zniszczenie bazy przeciwnika.
|
mode.attack.description = Brak fal, celem jest zniszczenie bazy przeciwnika.
|
||||||
mode.custom = Własny tryb
|
mode.custom = Własny tryb
|
||||||
|
|
||||||
rules.infiniteresources = Nieskończone zasoby
|
rules.infiniteresources = Nieskończone zasoby
|
||||||
rules.wavetimer = Zegar fal
|
rules.wavetimer = Zegar fal
|
||||||
rules.waves = Fale
|
rules.waves = Fale
|
||||||
rules.attack = Attack Mode
|
rules.attack = Tryb Ataku
|
||||||
rules.enemyCheat = Nieskończone zasoby komputera-przeciwnika (czerwonego zespołu)
|
rules.enemyCheat = Nieskończone zasoby komputera-przeciwnika (czerwonego zespołu)
|
||||||
rules.unitdrops = Unit Drops
|
rules.unitdrops = Surowce z zniszczonych jednostek
|
||||||
rules.unitbuildspeedmultiplier = Mnożnik Prędkości Tworzenia Jednostek
|
rules.unitbuildspeedmultiplier = Mnożnik Prędkości Tworzenia Jednostek
|
||||||
rules.unithealthmultiplier = Mnożnik Życia Jednostek
|
rules.unithealthmultiplier = Mnożnik Życia Jednostek
|
||||||
rules.playerhealthmultiplier = Mnożnik Życia Gracza
|
rules.playerhealthmultiplier = Mnożnik Życia Gracza
|
||||||
rules.playerdamagemultiplier = Mnożnik Obrażeń Gracza
|
rules.playerdamagemultiplier = Mnożnik Obrażeń Gracza
|
||||||
rules.unitdamagemultiplier = Mnożnik Obrażeń Jednostek
|
rules.unitdamagemultiplier = Mnożnik Obrażeń Jednostek
|
||||||
rules.enemycorebuildradius = Enemy Core No-Build Radius:[LIGHT_GRAY] (tiles)
|
rules.enemycorebuildradius = Zasięg blokady budowy przy rdżeniu wroga:[LIGHT_GRAY] (kratki)
|
||||||
rules.respawntime = Respawn Time:[LIGHT_GRAY] (sec)
|
rules.respawntime = Czas Odrodzenia:[LIGHT_GRAY] (sek)
|
||||||
rules.wavespacing = Odstępy między falami:[LIGHT_GRAY] (sek)
|
rules.wavespacing = Odstępy między falami:[LIGHT_GRAY] (sek)
|
||||||
rules.buildcostmultiplier = Mnożnik Kosztów Budowania
|
rules.buildcostmultiplier = Mnożnik Kosztów Budowania
|
||||||
rules.buildspeedmultiplier = Mnożnik Prędkości Budowania
|
rules.buildspeedmultiplier = Mnożnik Prędkości Budowania
|
||||||
rules.waitForWaveToEnd = Fale czekają na przeciwników
|
rules.waitForWaveToEnd = Fale czekają na przeciwników
|
||||||
rules.dropzoneradius = Drop Zone Radius:[LIGHT_GRAY] (tiles)
|
rules.dropzoneradius = Zasięg strefy zrzutu:[LIGHT_GRAY] (kratki)
|
||||||
rules.respawns = Maksymalna ilośc odrodzeń na falę
|
rules.respawns = Maksymalna ilośc odrodzeń na falę
|
||||||
rules.limitedRespawns = Ogranicz Odrodzenia
|
rules.limitedRespawns = Ogranicz Odrodzenia
|
||||||
rules.title.waves = Fale
|
rules.title.waves = Fale
|
||||||
@@ -585,22 +637,23 @@ rules.title.resourcesbuilding = Zasoby i Budowanie
|
|||||||
rules.title.player = Gracze
|
rules.title.player = Gracze
|
||||||
rules.title.enemy = Przeciwnicy
|
rules.title.enemy = Przeciwnicy
|
||||||
rules.title.unit = Jednostki
|
rules.title.unit = Jednostki
|
||||||
|
|
||||||
content.item.name = Przedmioty
|
content.item.name = Przedmioty
|
||||||
content.liquid.name = Płyny
|
content.liquid.name = Płyny
|
||||||
content.unit.name = Jednostki
|
content.unit.name = Jednostki
|
||||||
content.block.name = Klocki
|
content.block.name = Klocki
|
||||||
content.mech.name = Mechs
|
content.mech.name = Mechy
|
||||||
item.copper.name = Miedź
|
item.copper.name = Miedź
|
||||||
item.lead.name = Ołów
|
item.lead.name = Ołów
|
||||||
item.coal.name = Węgiel
|
item.coal.name = Węgiel
|
||||||
item.graphite.name = Grafit
|
item.graphite.name = Grafit
|
||||||
item.titanium.name = Tytan
|
item.titanium.name = Tytan
|
||||||
item.thorium.name = Uran
|
item.thorium.name = Tor
|
||||||
item.silicon.name = Krzem
|
item.silicon.name = Krzem
|
||||||
item.plastanium.name = Plastan
|
item.plastanium.name = Plastan
|
||||||
item.phase-fabric.name = Włókno Fazowe
|
item.phase-fabric.name = Włókno Fazowe
|
||||||
item.surge-alloy.name = Energon
|
item.surge-alloy.name = Elektrum
|
||||||
item.spore-pod.name = Kapsułka Zarodników
|
item.spore-pod.name = Zarodnia
|
||||||
item.sand.name = Piasek
|
item.sand.name = Piasek
|
||||||
item.blast-compound.name = Wybuchowy związek
|
item.blast-compound.name = Wybuchowy związek
|
||||||
item.pyratite.name = Piratian
|
item.pyratite.name = Piratian
|
||||||
@@ -624,7 +677,7 @@ mech.omega-mech.weapon = Rakiety Chmarowe
|
|||||||
mech.omega-mech.ability = Układ Obronny
|
mech.omega-mech.ability = Układ Obronny
|
||||||
mech.dart-ship.name = Strzałka
|
mech.dart-ship.name = Strzałka
|
||||||
mech.dart-ship.weapon = Karabin
|
mech.dart-ship.weapon = Karabin
|
||||||
mech.javelin-ship.name = Javelin
|
mech.javelin-ship.name = Oszczep
|
||||||
mech.javelin-ship.weapon = Seria Rakiet
|
mech.javelin-ship.weapon = Seria Rakiet
|
||||||
mech.javelin-ship.ability = Wyładowania Dopalacza
|
mech.javelin-ship.ability = Wyładowania Dopalacza
|
||||||
mech.trident-ship.name = Trójząb
|
mech.trident-ship.name = Trójząb
|
||||||
@@ -642,11 +695,12 @@ mech.itemcapacity = [LIGHT_GRAY]Pojemność przedmiotów: {0}
|
|||||||
mech.minespeed = [LIGHT_GRAY]Prędkość kopania: {0}
|
mech.minespeed = [LIGHT_GRAY]Prędkość kopania: {0}
|
||||||
mech.minepower = [LIGHT_GRAY]Moc kopania: {0}
|
mech.minepower = [LIGHT_GRAY]Moc kopania: {0}
|
||||||
mech.ability = [LIGHT_GRAY]Umiejętność: {0}
|
mech.ability = [LIGHT_GRAY]Umiejętność: {0}
|
||||||
mech.buildspeed = [LIGHT_GRAY]Building Speed: {0}%
|
mech.buildspeed = [LIGHT_GRAY]Szybkość Budowy: {0}%
|
||||||
liquid.heatcapacity = [LIGHT_GRAY]Wytrzymałość na przegrzewanie: {0}
|
liquid.heatcapacity = [LIGHT_GRAY]Wytrzymałość na przegrzewanie: {0}
|
||||||
liquid.viscosity = [LIGHT_GRAY]Lepkość: {0}
|
liquid.viscosity = [LIGHT_GRAY]Lepkość: {0}
|
||||||
liquid.temperature = [LIGHT_GRAY]Temperatura: {0}
|
liquid.temperature = [LIGHT_GRAY]Temperatura: {0}
|
||||||
block.sand-boulder.name = Sand Boulder
|
|
||||||
|
block.sand-boulder.name = Piaskowy Głaz
|
||||||
block.grass.name = Trawa
|
block.grass.name = Trawa
|
||||||
block.salt.name = Sól
|
block.salt.name = Sól
|
||||||
block.saltrocks.name = Skały Solne
|
block.saltrocks.name = Skały Solne
|
||||||
@@ -657,7 +711,7 @@ block.spore-pine.name = Sosna Zarodkowa
|
|||||||
block.sporerocks.name = Skała z Zarodkami
|
block.sporerocks.name = Skała z Zarodkami
|
||||||
block.rock.name = Skały
|
block.rock.name = Skały
|
||||||
block.snowrock.name = Skały śnieżne
|
block.snowrock.name = Skały śnieżne
|
||||||
block.snow-pine.name = Snow Pine
|
block.snow-pine.name = Sosna śniegowa
|
||||||
block.shale.name = Łupek
|
block.shale.name = Łupek
|
||||||
block.shale-boulder.name = Głaz Łupkowy
|
block.shale-boulder.name = Głaz Łupkowy
|
||||||
block.moss.name = Mech
|
block.moss.name = Mech
|
||||||
@@ -690,13 +744,13 @@ block.snow.name = Śnieg
|
|||||||
block.craters.name = Kratery
|
block.craters.name = Kratery
|
||||||
block.sand-water.name = Woda z Piaskiem
|
block.sand-water.name = Woda z Piaskiem
|
||||||
block.darksand-water.name = Woda z Ciemnym Piaskiem
|
block.darksand-water.name = Woda z Ciemnym Piaskiem
|
||||||
block.char.name = Char
|
block.char.name = Popiół
|
||||||
block.holostone.name = Holo stone
|
block.holostone.name = Błyszczący kamień
|
||||||
block.ice-snow.name = Lodowy Śnieg
|
block.ice-snow.name = Lodowy Śnieg
|
||||||
block.rocks.name = Skały
|
block.rocks.name = Skały
|
||||||
block.icerocks.name = Lodowe skały
|
block.icerocks.name = Lodowe skały
|
||||||
block.snowrocks.name = Śnieżne Skały
|
block.snowrocks.name = Śnieżne Skały
|
||||||
block.dunerocks.name = Dune Rocks
|
block.dunerocks.name = Skały wydmowe
|
||||||
block.pine.name = Sosna
|
block.pine.name = Sosna
|
||||||
block.white-tree-dead.name = Białe Drzewo Martwe
|
block.white-tree-dead.name = Białe Drzewo Martwe
|
||||||
block.white-tree.name = Białe Drzewo
|
block.white-tree.name = Białe Drzewo
|
||||||
@@ -715,7 +769,7 @@ block.dark-panel-6.name = Ciemny Panel 6
|
|||||||
block.dark-metal.name = Ciemny Metal
|
block.dark-metal.name = Ciemny Metal
|
||||||
block.ignarock.name = Skała Wulkaniczna
|
block.ignarock.name = Skała Wulkaniczna
|
||||||
block.hotrock.name = Gorący Kamień
|
block.hotrock.name = Gorący Kamień
|
||||||
block.magmarock.name = Magma Rock
|
block.magmarock.name = Skała magmowa
|
||||||
block.cliffs.name = Klify
|
block.cliffs.name = Klify
|
||||||
block.copper-wall.name = Miedziana Ściana
|
block.copper-wall.name = Miedziana Ściana
|
||||||
block.copper-wall-large.name = Duża miedziana ściana
|
block.copper-wall-large.name = Duża miedziana ściana
|
||||||
@@ -730,7 +784,7 @@ block.door-large.name = Duże drzwi
|
|||||||
block.duo.name = Podwójne działko
|
block.duo.name = Podwójne działko
|
||||||
block.scorch.name = Płomień
|
block.scorch.name = Płomień
|
||||||
block.scatter.name = Flak
|
block.scatter.name = Flak
|
||||||
block.hail.name = Hail
|
block.hail.name = Grad
|
||||||
block.lancer.name = Lancer
|
block.lancer.name = Lancer
|
||||||
block.conveyor.name = Przenośnik
|
block.conveyor.name = Przenośnik
|
||||||
block.titanium-conveyor.name = Tytanowy przenośnik
|
block.titanium-conveyor.name = Tytanowy przenośnik
|
||||||
@@ -745,9 +799,9 @@ block.pulverizer.name = Rozkruszacz
|
|||||||
block.cryofluidmixer.name = Mieszacz Lodocieczy
|
block.cryofluidmixer.name = Mieszacz Lodocieczy
|
||||||
block.melter.name = Przetapiacz
|
block.melter.name = Przetapiacz
|
||||||
block.incinerator.name = Spalacz
|
block.incinerator.name = Spalacz
|
||||||
block.spore-press.name = Spore Press
|
block.spore-press.name = Prasa Zarodni
|
||||||
block.separator.name = Rozdzielacz
|
block.separator.name = Rozdzielacz
|
||||||
block.coal-centrifuge.name = Coal Centrifuge
|
block.coal-centrifuge.name = Wirówka węglowa
|
||||||
block.power-node.name = Węzeł Prądu
|
block.power-node.name = Węzeł Prądu
|
||||||
block.power-node-large.name = Duży Węzeł Prądu
|
block.power-node-large.name = Duży Węzeł Prądu
|
||||||
block.surge-tower.name = Wieża Energetyczna
|
block.surge-tower.name = Wieża Energetyczna
|
||||||
@@ -776,9 +830,9 @@ block.item-void.name = Próżnia przedmiotów
|
|||||||
block.liquid-source.name = Źródło płynów
|
block.liquid-source.name = Źródło płynów
|
||||||
block.power-void.name = Próżnia prądu
|
block.power-void.name = Próżnia prądu
|
||||||
block.power-source.name = Nieskończony Prąd
|
block.power-source.name = Nieskończony Prąd
|
||||||
block.unloader.name = Wyciągacz
|
block.unloader.name = Ekstraktor
|
||||||
block.vault.name = Magazyn
|
block.vault.name = Magazyn
|
||||||
block.wave.name = Wave
|
block.wave.name = Strumyk
|
||||||
block.swarmer.name = Działo Rojowe
|
block.swarmer.name = Działo Rojowe
|
||||||
block.salvo.name = Działo Salwowe
|
block.salvo.name = Działo Salwowe
|
||||||
block.ripple.name = Działo falowe
|
block.ripple.name = Działo falowe
|
||||||
@@ -790,6 +844,7 @@ block.blast-mixer.name = Wybuchowy Mieszacz
|
|||||||
block.solar-panel.name = Panel Słoneczny
|
block.solar-panel.name = Panel Słoneczny
|
||||||
block.solar-panel-large.name = Duży Panel Słoneczny
|
block.solar-panel-large.name = Duży Panel Słoneczny
|
||||||
block.oil-extractor.name = Ekstraktor Ropy
|
block.oil-extractor.name = Ekstraktor Ropy
|
||||||
|
block.command-center.name = Centrum Dowodzenia
|
||||||
block.draug-factory.name = Fabryka Dronów Draug
|
block.draug-factory.name = Fabryka Dronów Draug
|
||||||
block.spirit-factory.name = Fabryka Dronów Duch
|
block.spirit-factory.name = Fabryka Dronów Duch
|
||||||
block.phantom-factory.name = Fabryka Dronów Widmo
|
block.phantom-factory.name = Fabryka Dronów Widmo
|
||||||
@@ -798,7 +853,7 @@ block.ghoul-factory.name = Fabryka Bombowców Upiór
|
|||||||
block.dagger-factory.name = Fabryka Mechów Nóż
|
block.dagger-factory.name = Fabryka Mechów Nóż
|
||||||
block.crawler-factory.name = Fabryka Mechów Pełzacz
|
block.crawler-factory.name = Fabryka Mechów Pełzacz
|
||||||
block.titan-factory.name = Fabryka Mechów Tytan
|
block.titan-factory.name = Fabryka Mechów Tytan
|
||||||
block.fortress-factory.name = Fabryka Mechów Fortreca
|
block.fortress-factory.name = Fabryka Mechów Forteca
|
||||||
block.revenant-factory.name = Fabryka Wojowników Zjawa
|
block.revenant-factory.name = Fabryka Wojowników Zjawa
|
||||||
block.repair-point.name = Punkt Napraw
|
block.repair-point.name = Punkt Napraw
|
||||||
block.pulse-conduit.name = Rura Pulsacyjna
|
block.pulse-conduit.name = Rura Pulsacyjna
|
||||||
@@ -816,8 +871,8 @@ block.thermal-generator.name = Generator Termalny
|
|||||||
block.alloy-smelter.name = Piec Mieszający
|
block.alloy-smelter.name = Piec Mieszający
|
||||||
block.mender.name = Naprawiacz
|
block.mender.name = Naprawiacz
|
||||||
block.mend-projector.name = Projektor Napraw
|
block.mend-projector.name = Projektor Napraw
|
||||||
block.surge-wall.name = Ściana Energonu
|
block.surge-wall.name = Ściana Elektronu
|
||||||
block.surge-wall-large.name = Duża Ściana Energonu
|
block.surge-wall-large.name = Duża Ściana Elektronu
|
||||||
block.cyclone.name = Cyklon
|
block.cyclone.name = Cyklon
|
||||||
block.fuse.name = Lont
|
block.fuse.name = Lont
|
||||||
block.shock-mine.name = Mina
|
block.shock-mine.name = Mina
|
||||||
@@ -828,12 +883,12 @@ block.rtg-generator.name = Generator RTG
|
|||||||
block.spectre.name = Huragan
|
block.spectre.name = Huragan
|
||||||
block.meltdown.name = Rozpad
|
block.meltdown.name = Rozpad
|
||||||
block.container.name = Kontener
|
block.container.name = Kontener
|
||||||
block.launch-pad.name = Skocznia
|
block.launch-pad.name = Wyrzutnia
|
||||||
block.launch-pad-large.name = Duża skocznia
|
block.launch-pad-large.name = Duża Wyrzutnia
|
||||||
team.blue.name = niebieski
|
team.blue.name = niebieski
|
||||||
team.crux.name = czerwony
|
team.crux.name = czerwony
|
||||||
team.sharded.name = pomarańczowy
|
team.sharded.name = żółty
|
||||||
team.orange.name = orange
|
team.orange.name = pomarańczowy
|
||||||
team.derelict.name = szary
|
team.derelict.name = szary
|
||||||
team.green.name = zielony
|
team.green.name = zielony
|
||||||
team.purple.name = fioletowy
|
team.purple.name = fioletowy
|
||||||
@@ -854,32 +909,32 @@ unit.lich.name = Obudzony
|
|||||||
unit.reaper.name = Żeniec
|
unit.reaper.name = Żeniec
|
||||||
tutorial.next = [lightgray]<Kliknij, aby kontynuować>
|
tutorial.next = [lightgray]<Kliknij, aby kontynuować>
|
||||||
tutorial.intro = Wszedłeś do[scarlet] Samouczka Mindustry.[]\nZacznij od[accent] wydobycia miedzi[]. Aby to zrobić, dotknij żyły rudy miedzi w pobliżu rdzenia.\n\n[accent]{0}/{1} miedź
|
tutorial.intro = Wszedłeś do[scarlet] Samouczka Mindustry.[]\nZacznij od[accent] wydobycia miedzi[]. Aby to zrobić, dotknij żyły rudy miedzi w pobliżu rdzenia.\n\n[accent]{0}/{1} miedź
|
||||||
tutorial.drill = Wydobywanie ręczne jest nieefektywne.\n[accent]Wiertła []mogą kopać automatycznie.\nKliknij zakładkę wiertła w prawym dolnym rogu.\nWybierz[accent] wiertło mechaniczne[]. Umieść go na złożu miedzi, klikając.\n[accent]Kliknij prawym przyciskiem myszy[], aby przestać budować.
|
tutorial.drill = Wydobywanie ręczne nie jest efektywne.\n[accent]Wiertła []mogą kopać automatycznie.\nKliknij zakładkę wiertła w prawym dolnym rogu.\nWybierz[accent] wiertło mechaniczne[]. Umieść go na złożu miedzi, klikając.\n[accent]Kliknij prawym przyciskiem myszy[], aby przestać budować.
|
||||||
tutorial.drill.mobile = Mining manually is inefficient.\n[accent]Drills []can mine automatically.\nTap the drill tab in the bottom right.\nSelect the[accent] mechanical drill[].\nPlace it on a copper vein by tapping, then press the[accent] checkmark[] below to confirm your selection.\nPress the[accent] X button[] to cancel placement.
|
tutorial.drill.mobile = Wydobywanie ręczne jest nieefektywne.\n[accent]Wiertła []mogą kopać automatycznie.\nDotknij zakładkę wiertła w prawym dolnym rogu.\nWybierz[accent] wiertło mechaniczne[].\nUmieść go na złożu miedzi poprzez Stuknięcie, potem wciśnij[accent] ptaszek[] na dole by potwierdzić wybór.\nNaciśnij przycisk[accent] X[] by anulować budowe.
|
||||||
tutorial.blockinfo = Each block has different stats. Each drill can only mine certain ores.\nTo check a block's info and stats,[accent] tap the "?" button while selecting it in the build menu.[]\n\n[accent]Access the Mechanical Drill's stats now.[]
|
tutorial.blockinfo = Każdy blok ma inne statystyki. Każde wiertło może kopać tylko wybrane rudy.\nBy sprawdzić informacje i statystyki bloku,[accent] kliknij przycisk "?" podczas jego wyboru w menu budowy.[]\n\n[accent]Sprawdź teraz statystyki mechanicznego wiertła.[]
|
||||||
tutorial.conveyor = [accent]Conveyors[] are used to transport items to the core.\nMake a line of conveyors from the drill to the core.\n[accent]Hold down the mouse to place in a line.[]\nHold[accent] CTRL[] while selecting a line to place diagonally.\n\n[accent]{0}/{1} conveyors placed in line\n[accent]0/1 items delivered
|
tutorial.conveyor = [accent]Przenośnik[] jest używany do transportowania przedmiotów do rdzenia.\nStwórz linie przenośników z wierteł do rdzenia.\n[accent]Przytrzymaj przycisk myszy by położyć w linii.[]\nPrzytrzymaj[accent] CTRL[] podczas wybierania linii, by budować po skosie.\n\n[accent]{0}/{1} Przenośniki położone w linii\n[accent]0/1 Przedmioty dostarczone
|
||||||
tutorial.conveyor.mobile = [accent]Conveyors[] are used to transport items to the core.\nMake a line of conveyors from the drill to the core.\n[accent] Place in a line by holding down your finger for a few seconds[] and dragging in a direction.\n\n[accent]{0}/{1} conveyors placed in line\n[accent]0/1 items delivered
|
tutorial.conveyor.mobile = [accent]Przenośnik[] jest używany do transportowania przedmiotów do rdzenia.\nStwórz linie przenośników z wierteł do rdzenia.\n[accent] Zbuduj w linii poprzez przytrzymanie palcem przez moment[] i przesunięcie w którymś kierunku.\n\n[accent]{0}/{1} Przenośniki położone w linii\n[accent]0/1 Przedmioty dostarczone
|
||||||
tutorial.turret = Once an item enters your core, it can be used for building.\nKeep in mind that not all items can be used for building.\nItems that are not used for building, such as[accent] coal[] or[accent] scrap[], cannot be put into the core.\nDefensive structures must be built to repel the[lightgray] enemy[].\nBuild a[accent] duo turret[] near your base.
|
tutorial.turret = Kiedy przedmiot dociera do rdzenia, może zostać użyty do budowy.\nPamiętaj że nie każdy przedmiot może zostać użyty do budowy.\nprzedmioty które nie są używane do budowy, takie jak[accent] Węgiel[] lub[accent] złom[], nie moga zostać wprowadzone do rdzenia.\nStruktury obronne muszą zostać zbudowane by odeprzeć[lightgray] wroga[].\nZbuduj[accent] podwójne działko[] niedaleko swojej bazy.
|
||||||
tutorial.drillturret = Duo turrets require[accent] copper ammo []to shoot.\nPlace a drill near the turret.\nLead conveyors into the turret to supply it with copper.\n\n[accent]Ammo delivered: 0/1
|
tutorial.drillturret = Podwójne działka wymagają[accent] miedzianej amunicji []do strzelania.\nPołóż wiertło obok działka.\nPoprowadź przenośniki do działek by zaopatrzyć je w miedź.\n\n[accent]Amunicja dostarczona: 0/1
|
||||||
tutorial.pause = During battle, you are able to[accent] pause the game.[]\nYou may queue buildings while paused.\n\n[accent]Press space to pause.
|
tutorial.pause = Podczas gry, możesz[accent] zatrzymać grę.[]\nMożesz ustalić kolejkę budowy podczas pauzy.\n\n[accent]Naciśnij spacje by zapauzować.
|
||||||
tutorial.pause.mobile = During battle, you are able to[accent] pause the game.[]\nYou may queue buildings while paused.\n\n[accent]Press this button in the top left to pause.
|
tutorial.pause.mobile = Podczas gry, możesz[accent] zatrzymać grę.[]\nMożesz ustalić kolejkę budowy podczas pauzy.\n\n[accent]Nacniśnij przycisk w lewym górnym rogu by zapauzować.
|
||||||
tutorial.unpause = Now press space again to unpause.
|
tutorial.unpause = Teraz znowu naciśnij spacje by odpauzować.
|
||||||
tutorial.unpause.mobile = Now press it again to unpause.
|
tutorial.unpause.mobile = Naciśnij go znowu by odpauzować.
|
||||||
tutorial.breaking = Blocks frequently need to be destroyed.\n[accent]Hold down right-click[] to destroy all blocks in a selection.[]\n\n[accent]Destroy all the scrap blocks to the left of your core using area selection.
|
tutorial.breaking = Bloki często wymagają rozbiórki.\n[accent]Przytrzymaj prawy przcisk myszy[] by niszczyć wszystkie wybrane bloki.[]\n\n[accent]Zniszcz wszystkie bloki złomu na lewo od twojego rdzenia używając selekcji obszarowej.
|
||||||
tutorial.breaking.mobile = Blocks frequently need to be destroyed.\n[accent]Select deconstruction mode[], then tap a block to begin breaking it.\nDestroy an area by holding down your finger for a few seconds[] and dragging in a direction.\nPress the checkmark button to confirm breaking.\n\n[accent]Destroy all the scrap blocks to the left of your core using area selection.
|
tutorial.breaking.mobile = Bloki często wymagają rozbiórki.\n[accent]Wybierz tryb dekonstrukcji[], a następnie dotknij blok by zacząć go niszczyć.\nZdekonstruuj obszarowo poprzez przytrzymanie palcem przez moment[] i przesunięcie go w jakimś kierunku.\nNaciśnij przycisk ptaszka by potwierdzić rozbiórkę.\n\n[accent]Zniszcz wszystkie bloki złomu na lewo od twojego rdzenia używając selekcji obszarowej.
|
||||||
tutorial.withdraw = In some situations, taking items directly from blocks is necessary.\nTo do this, [accent]tap a block[] with items in it, then [accent]tap the item[] in the inventory.\nMultiple items can be withdrawn by [accent]tapping and holding[].\n\n[accent]Withdraw some copper from the core.[]
|
tutorial.withdraw = Czasami, konieczne jest wyjmowanie przedmiotów prosto z bloków.\nBy tego dokonać, [accent]kliknij blok[] z przedmiotami w nim, potem [accent]kliknij przedmiot[] w inwentarzu.\nMożesz zebrać wiele przedmiotów naraz poprzez [accent]kliknięcie i przytrzymanie[].\n\n[accent]Zabierz trochę miedzi z rdzenia.[]
|
||||||
tutorial.deposit = Deposit items into blocks by dragging from your ship to the destination block.\n\n[accent]Deposit your copper back into the core.[]
|
tutorial.deposit = Włóż przedmioty do bloków poprzez przeciągnięcie z twojego statku do danego bloku.\n\n[accent]Włóż miedź z powrotem do rdzenia .[]
|
||||||
tutorial.waves = The[lightgray] enemy[] approaches.\n\nDefend the core for 2 waves.[accent] Click[] to shoot.\nBuild more turrets and drills. Mine more copper.
|
tutorial.waves = [lightgray] Wrogowie[] nadchodzą.\n\nBroń swój rdżeń przez 2 fale.[accent] Kliknij[] by strzelać.\nZbuduj wiecej działek i wierteł. Wydobądź więcej miedzi.
|
||||||
tutorial.waves.mobile = The[lightgray] enemy[] approaches.\n\nDefend the core for 2 waves. Your ship will automatically fire at enemies.\nBuild more turrets and drills. Mine more copper.
|
tutorial.waves.mobile = [lightgray] Wrogowie[] nadchodzą.\n\nBroń swój rdzeń przez 2 fale. Twój statek będzie automatycznie atakował wrogów.\nZbuduj wiecej działek i wierteł. Wydobądź więcej miedzi.
|
||||||
tutorial.launch = Once you reach a specific wave, you are able to[accent] launch the core[], leaving your defenses behind and[accent] obtaining all the resources in your core.[]\nThese resources can then be used to research new technology.\n\n[accent]Press the launch button.
|
tutorial.launch = Kiedy dotrzesz do określonej fali, masz możliwość[accent] wystrzelenia rdzenia[], pozostawiając struktury obronne za sobą i[accent] otrzymując wszystkie surowce znajdujące się w rdzeniu.[]\nSurowce te mogą potem zostać użyte do odkrywania nowych technologii.\n\n[accent]Naciśnij przycisk Wystrzału.
|
||||||
item.copper.description = Przydatny materiał budowlany. Szeroko używany w prawie każdej konstrukcji.
|
item.copper.description = Przydatny materiał budowlany. Szeroko używany w prawie każdej konstrukcji.
|
||||||
item.lead.description = Podstawowy matriał. Używany w przesyle przemiotów i płynów. Nie jest on przypadkiem szkodliwy?
|
item.lead.description = Podstawowy matriał. Używany w przesyle przemiotów i płynów. Nie jest on przypadkiem szkodliwy?
|
||||||
item.metaglass.description = Niesamowite silne szkło. Szeroko używane w transporcie i przechowywaniu płynów.
|
item.metaglass.description = Wyjątkowo wytrzymały stop szkła. Szeroko używany w transporcie i przechowywaniu płynów.
|
||||||
item.graphite.description = Zmineralizowany węgiel, wykorzystywany do amunicji i izolacji elektrycznej.
|
item.graphite.description = Zmineralizowany węgiel, wykorzystywany do amunicji i izolacji elektrycznej.
|
||||||
item.sand.description = Zwykły materiał używany pospolicie w przepalaniu, stopach i jako topnik. Dostanie piaskiem po oczach nie jest przyjemne.
|
item.sand.description = Zwykły materiał używany pospolicie w przepalaniu, stopach i jako topnik. Dostanie piaskiem po oczach nie jest przyjemne.
|
||||||
item.coal.description = Zwykły i łatwo dostępny materiał energetyczny.
|
item.coal.description = Zwykły i łatwo dostępny materiał energetyczny.
|
||||||
item.titanium.description = Rzadki i bardzo lekki materiał. Używany w bardzo zaawansowanym przewodnictwie, wiertłach i samolotach. Poczuj się jak Tytan!
|
item.titanium.description = Rzadki i bardzo lekki materiał. Używany w bardzo zaawansowanym przewodnictwie, wiertłach i samolotach. Poczuj się jak Tytan!
|
||||||
item.thorium.description = Zwarty i radioaktywny materiał używany w struktucrach i paliwie nuklearnym. Nie trzymaj go w rękach!
|
item.thorium.description = Zwarty i radioaktywny materiał używany w strukturach i paliwie nuklearnym. Nie trzymaj go w rękach!
|
||||||
item.scrap.description = Pozostałości starych budynków i jednostek. Składa się z małej ilości wszystkiego.
|
item.scrap.description = Pozostałości starych budynków i jednostek. Składa się z małej ilości wszystkiego.
|
||||||
item.silicon.description = Niesamowicie przydatny półprzewodnk uźywany w panelach słonecznych i skomplikowanej elektronice. Nie, w Dolinie Krzemowej już nie ma krzemu.
|
item.silicon.description = Niesamowicie przydatny półprzewodnk uźywany w panelach słonecznych i skomplikowanej elektronice. Nie, w Dolinie Krzemowej już nie ma krzemu.
|
||||||
item.plastanium.description = Lekki i plastyczny materiał używany w amunicji odłamkowej i samolotach. Używany też w klockach LEGO (dlatego są niezniszczalne)!
|
item.plastanium.description = Lekki i plastyczny materiał używany w amunicji odłamkowej i samolotach. Używany też w klockach LEGO (dlatego są niezniszczalne)!
|
||||||
@@ -889,42 +944,42 @@ item.spore-pod.description = Używany do wyrobu oleju, materiałów wybuchowych
|
|||||||
item.blast-compound.description = Lotny związek używany w pirotechnice. Może być używany jako materiał energetyczny, ale nie polecam, ale i tak warto spróbować.
|
item.blast-compound.description = Lotny związek używany w pirotechnice. Może być używany jako materiał energetyczny, ale nie polecam, ale i tak warto spróbować.
|
||||||
item.pyratite.description = Niesamowicie palny związek używany w zbrojeniu. Nielegalny w 9 państwach.
|
item.pyratite.description = Niesamowicie palny związek używany w zbrojeniu. Nielegalny w 9 państwach.
|
||||||
liquid.water.description = Powszechnie używana do schładzania budowli i przetwarzania odpadów.
|
liquid.water.description = Powszechnie używana do schładzania budowli i przetwarzania odpadów.
|
||||||
liquid.slag.description = Various different types of molten metal mixed together. Can be separated into its constituent minerals, or sprayed at enemy units as a weapon.
|
liquid.slag.description = Wiele różnych metali stopionych i zmieszanych razem. Może zostać rozdzielony na jego metale składowe, albo wystrzelony w wrogie jednostki i użyty jako broń.
|
||||||
liquid.oil.description = Może się palić, eksplodować lub być używana do schładzania.
|
liquid.oil.description = Używany w do produkcji złożonych materiałów. Może zostać przetworzony na węgiel, lub wystrzelony w wrogów przez wieżyczke.
|
||||||
liquid.cryofluid.description = Najefektywniejsza ciecz do schładzania budowli.
|
liquid.cryofluid.description = Najefektywniejsza ciecz do schładzania budowli.
|
||||||
mech.alpha-mech.description = Standardowy mech. Średnia broń i prędkość, leć potrafi stworzyć trzy małe drony do walki.
|
mech.alpha-mech.description = Standardowy mech. Średnia broń i prędkość, leć potrafi stworzyć trzy małe drony do walki.
|
||||||
mech.delta-mech.description = Szybki i wrażliwy mech stworzony do szybkih ataków i ucieczki. Budynką robi prawie nic, lec jest wstanie szybko rozwalić grupę wrogich jednostek piorunami.
|
mech.delta-mech.description = Szybki i wrażliwy mech stworzony do szybkich ataków i ucieczki. Zadaje niewielkie obrażenia strukturom, lecz może bardzo szybko niszczyć spore grupy jednostek wroga przy pomocy jego działek tesli.
|
||||||
mech.tau-mech.description = Mech pomocny. Naprawia budynki drużyny, strzelając w nie. Potrafi wygasić niedalekie pożary i uleczyć bliskich przyjaciół.
|
mech.tau-mech.description = Mech wsparcia. Naprawia budynki drużyny, strzelając w nie. Potrafi wygasić niedalekie pożary i uleczyć bliskich przyjaciół.
|
||||||
mech.omega-mech.description = Duży i silny mech, zaprojektowany na ataki. Jego zdolność pozwala mu na zablokowanie do 90% obrażeń.
|
mech.omega-mech.description = Duży i silny mech, zaprojektowany na ataki. Jego zdolność pozwala mu na zablokowanie do 90% obrażeń.
|
||||||
mech.dart-ship.description = Standardowy statek. Lekki i szybki, ale jest kiepski jak chodzi o walkę i kopanie.
|
mech.dart-ship.description = Standardowy statek. Lekki i szybki, ale jest kiepski jak chodzi o walkę i kopanie.
|
||||||
mech.javelin-ship.description = Statek do ataku i szybkiej ucieczki. Zaczyna powoli, ale przyspiesza do wielkiej prędkości. Przy tej prędkości, może przelecieć koło wrogiej bazy i atakować piorunami czy rakietami.
|
mech.javelin-ship.description = Statek do ataku i szybkiej ucieczki. Zaczyna powoli, ale przyspiesza do wielkiej prędkości. Przy tej prędkości, może przelecieć koło wrogiej bazy i atakować piorunami czy rakietami.
|
||||||
mech.trident-ship.description = Ciężki bombowiec. Dobrze uzbrojony.
|
mech.trident-ship.description = Ciężki bombowiec, zbudowany do budowy i niszczenia fortyfikacji wroga. Dość dobrze opancerzony.
|
||||||
mech.glaive-ship.description = Duży, uzbrojony statek. Dobra prędkość i przyspieszenie. Ma ognisty karabin.
|
mech.glaive-ship.description = Duży, uzbrojony statek. Dobra prędkość i przyspieszenie. Wyposażony w karabin zapalający.
|
||||||
unit.draug.description = A primitive mining drone. Cheap to produce. Expendable. Automatically mines copper and lead in the vicinity. Delivers mined resources to the closest core.
|
unit.draug.description = Prymitywny dron górniczy. Tani w produkcji. Przeznaczony na stracenie. Automatycznie wydobywa miedź i ołów w pobliżu. Dostarcza wydobyte zasoby do najbliższego rdzenia.
|
||||||
unit.spirit.description = Początkowy dron. Rdzeń zawsze tworzy jeden. Wydobywa surowce, naprawia budynki oraz pomaga przy budowie.
|
unit.spirit.description = Zmodyfikowany dron draug, zaprojektowany do naprawy zamiast do wydobywania. Automatycznie naprawia wszelkie uszkodzone bloki w obszarze.
|
||||||
unit.phantom.description = Zaawansowany dron. Wydobywa surowce, naprawia budynki oraz pomaga przy budowie szybciej niż dron Duch.
|
unit.phantom.description = Zaawansowana jednostka dronów. Podąża za użytkownikiem. Pomaga w budowie bloków.
|
||||||
unit.dagger.description = Podstawowy mech lądowy. Sam jest słaby, lecz przydatny w dużych ilościach.
|
unit.dagger.description = Podstawowy mech lądowy. Sam jest słaby, lecz przydatny w dużych ilościach.
|
||||||
unit.crawler.description = Jednostka naziemna składająca się z rozebranej ramy z przypiętymi na górze materiałami wybuchowymi. Niezbyt trwały. Wybucha przy kontakcie z wrogami. Chodzi na czterech nogach jak pies.
|
unit.crawler.description = Jednostka naziemna składająca się z rozebranej ramy z przypiętymi na górze materiałami wybuchowymi. Niezbyt trwały. Wybucha przy kontakcie z wrogami. Chodzi na czterech nogach jak pies.
|
||||||
unit.titan.description = Bardziej zaawansowany mech lądowy. Atakuje cele lądowe i powietrzne.
|
unit.titan.description = Zaawansowana, opancerzona jednostka naziemna. Atakuje zarówno cele naziemne, jak i powietrzne. Wyposażony w dwa miniaturowe miotacze ognia typu Płomień.
|
||||||
unit.fortress.description = Wielka jednostka artyleryjna lądowa.
|
unit.fortress.description = Ciężki mech artyleryjski. Wyposażony w dwa zmodyfikowane działa typu gradowego do ataku na dalekie odległości na konstrukcje i jednostki wroga.
|
||||||
unit.eruptor.description = A heavy mech designed to take down structures. Fires a stream of slag at enemy fortifications, melting them and setting volatiles on fire.
|
unit.eruptor.description = Ciężki mech stworzony do niszczenia struktur. Strzela wiązką żużlu w kierunku fortyfikacji wroga, Topiąc je oraz podpalając łatwopalne przedmioty.
|
||||||
unit.wraith.description = Szybka jednostka, stosuje taktyke uderz-uciekaj.
|
unit.wraith.description = Szybka jednostka, stosuje taktyke uderz-uciekaj Namierza jakiekolwiek źródło prądu.
|
||||||
unit.ghoul.description = Ciężki bombowiec.
|
unit.ghoul.description = Ciężki bombowiec dywanowy. Rozdziera struktury wroga, atakując krytyczną infrastrukturę.
|
||||||
unit.revenant.description = Ciężka, unosząca sie platforma z rakietami.
|
unit.revenant.description = Ciężka, unosząca sie platforma z rakietami.
|
||||||
block.graphite-press.description = Kompresuje kawałki węgla w czyste blaszki grafitu.
|
block.graphite-press.description = Kompresuje kawałki węgla w czyste blaszki grafitu.
|
||||||
block.multi-press.description = An upgraded version of the graphite press. Employs water and power to process coal quickly and efficiently.
|
block.multi-press.description = Ulepszona wersja prasy grafitowej. Używa wody i prądu do kompresowania węgla szybko i efektywnie.
|
||||||
block.silicon-smelter.description = Redukuje piasek za pomocą wysoce czystego węgla w celu wytworzenia krzemu.
|
block.silicon-smelter.description = Redukuje piasek za pomocą wysoce czystego węgla w celu wytworzenia krzemu.
|
||||||
block.kiln.description = Stapia ołów i piasek na metaszkło. Wymaga małej ilości energii.
|
block.kiln.description = Stapia ołów i piasek na metaszkło. Wymaga małej ilości energii.
|
||||||
block.plastanium-compressor.description = Wytwarza plastan z oleju i tytanu.
|
block.plastanium-compressor.description = Wytwarza plastan z oleju i tytanu.
|
||||||
block.phase-weaver.description = Produces phase fabric from radioactive thorium and high amounts of sand.
|
block.phase-weaver.description = Produkuje Włókna Fazowe z radioaktywnego toru i dużych ilości piasku.
|
||||||
block.alloy-smelter.description = Produces surge alloy from titanium, lead, silicon and copper.
|
block.alloy-smelter.description = Produkuje stop Elektrum z tytanu, ołowiu, krzemu i miedzi.
|
||||||
block.cryofluidmixer.description = Combines water and titanium into cryofluid which is much more efficient for cooling.
|
block.cryofluidmixer.description = Łączy wodę i tytan w lodociecz, który jest znacznie bardziej wydajny w chłodzeniu niż woda.
|
||||||
block.blast-mixer.description = Uses oil for transforming pyratite into the less flammable but more explosive blast compound.
|
block.blast-mixer.description = Kruszy i miesza skupiska zarodników z piratytem, tworząc związek wybuchowy.
|
||||||
block.pyratite-mixer.description = Mixes coal, lead and sand into highly flammable pyratite.
|
block.pyratite-mixer.description = Miesza węgiel, ołów i piasek tworząc bardzo łatwopalny piratian.
|
||||||
block.melter.description = Przetapia złom na żużel do dalszego przetwarzania lub użycia w wieżyczkach
|
block.melter.description = Przetapia złom na żużel do dalszego przetwarzania lub użycia w wieżyczkach
|
||||||
block.separator.description = Oddziel użyteczne materiały z mieszaniny jaką jest żużel.
|
block.separator.description = Oddziela użyteczne materiały z mieszaniny jaką jest żużel.
|
||||||
block.spore-press.description = Kompresuje kapsułki zarodników w olej.
|
block.spore-press.description = Kompresuje kapsułki zarodników w olej.
|
||||||
block.pulverizer.description = Mieli złom w drobny piaske. Przydatne, gdy brakuje naturalnego piasku.
|
block.pulverizer.description = Mieli złom w drobny piasek. Przydatne, gdy brakuje naturalnego piasku.
|
||||||
block.coal-centrifuge.description = Zestala olej w kawałki węgla.
|
block.coal-centrifuge.description = Zestala olej w kawałki węgla.
|
||||||
block.incinerator.description = Pozbywa się nadmiaru przedmiotów lub płynu
|
block.incinerator.description = Pozbywa się nadmiaru przedmiotów lub płynu
|
||||||
block.power-void.description = Niszczy całą energię wprowadzoną do tego bloku. Dostępny tylko w trybie sandbox.
|
block.power-void.description = Niszczy całą energię wprowadzoną do tego bloku. Dostępny tylko w trybie sandbox.
|
||||||
@@ -944,21 +999,21 @@ block.surge-wall.description = Najsilniejszy blok obronny.\nMa niewielką szans
|
|||||||
block.surge-wall-large.description = Najsilniejszy blok obronny.\nMa niewielką szansę na wywołanie błyskawicy w kierunku atakującego.\nObejmuje wiele kratek.
|
block.surge-wall-large.description = Najsilniejszy blok obronny.\nMa niewielką szansę na wywołanie błyskawicy w kierunku atakującego.\nObejmuje wiele kratek.
|
||||||
block.door.description = Małe drzwi, które można otwierać i zamykać, klikając na nie.\nJeśli są otwarte, wrogowie mogą strzelać i się przemieszczać przez nie.
|
block.door.description = Małe drzwi, które można otwierać i zamykać, klikając na nie.\nJeśli są otwarte, wrogowie mogą strzelać i się przemieszczać przez nie.
|
||||||
block.door-large.description = Duże drzwi, które można otwierać i zamykać, klikając na nie.\nJeśli są otwarte, wrogowie mogą strzelać i się przemieszczać przez nie.\nObejmuje wiele kratek.
|
block.door-large.description = Duże drzwi, które można otwierać i zamykać, klikając na nie.\nJeśli są otwarte, wrogowie mogą strzelać i się przemieszczać przez nie.\nObejmuje wiele kratek.
|
||||||
block.mender.description = Periodically repairs blocks in its vicinity. Keeps defenses repaired in-between waves.\nOptionally uses silicon to boost range and efficiency.
|
block.mender.description = Co jakiś czas naprawia bloki w zasięgu. Utrzymuje struktury obronne w dobrym stanie.\nOpcjonalnie używa silikonu do zwiększenia zasięgu i szybkości naprawy.
|
||||||
block.mend-projector.description = Periodically heals blocks in its vicinity.
|
block.mend-projector.description = Co jakiś czas naprawia bloki w zasięgu. Lepsza wersja naprawiacza.
|
||||||
block.overdrive-projector.description = Increases the speed of nearby buildings like drills and conveyors.
|
block.overdrive-projector.description = Zwiększa szybkość budynków w zasięgu takich jak wiertła czy przenośniki.
|
||||||
block.force-projector.description = Creates a hexagonal force field around itself, protecting buildings and units inside from damage through bullets.
|
block.force-projector.description = Wytwarza pole siłowe w kształcie sześciokąta wokół siebie, chroniąc budynki i jednostki wewnątrz od obrażeń zadanych przez pociski.
|
||||||
block.shock-mine.description = Damages enemies stepping on the mine. Nearly invisible to the enemy.
|
block.shock-mine.description = Zadaje obrażenia jednostkom wroga którzy na nią wejdą. Ledwo widoczne dla wrogów.
|
||||||
block.conveyor.description = Basic item transport block. Moves items forward and automatically deposits them into turrets or crafters. Rotatable.
|
block.conveyor.description = Podstawowy blok transportowy dla przedmiotów. Automatycznie przesyła przedmioty naprzód do działek oraz maszyn. Można obrócić.
|
||||||
block.titanium-conveyor.description = Advanced item transport block. Moves items faster than standard conveyors.
|
block.titanium-conveyor.description = Zaawansowany blok transportowy dla przedmiotów. Przesyła przedmioty szybciej od zwykłego przenośnika.
|
||||||
block.junction.description = Acts as a bridge for two crossing conveyor belts. Useful in situations with two different conveyors carrying different materials to different locations.
|
block.junction.description = Używany jako most dla dwóch krzyżujących się przenośników. Przydatne w sytuacjach kiedy dwa różne przenośniki transportują różne surowce do różnych miejsc.
|
||||||
block.bridge-conveyor.description = Zaawansowany blok transportujący. Pozwala na przenoszenie przedmiotów nawet do 3 bloków na każdym terenie, przez każdy budynek.
|
block.bridge-conveyor.description = Zaawansowany blok transportujący. Pozwala na przenoszenie przedmiotów nawet do 3 bloków na każdym terenie, przez każdy budynek.
|
||||||
block.phase-conveyor.description = Advanced item transport block. Uses power to teleport items to a connected phase conveyor over several tiles.
|
block.phase-conveyor.description = Zaawansowany blok transportowy dla przedmiotów. Używa energii przy teleportacji przedmiotów do podłączonego transportera fazowego na spore odległości.
|
||||||
block.sorter.description = Sortuje przedmioty. Jeśli przedmiot pasuje to przechodzi dalej, jeśli nie - to przechodzi na boki.
|
block.sorter.description = Sortuje przedmioty. Jeśli przedmiot pasuje to przechodzi dalej, jeśli nie - to przechodzi na boki.
|
||||||
block.router.description = Akceptuje przedmioty z jednego miejsca i rozdziela je do trzech innych kierunków. Przydatne w rozdzielaniu materiałów z jednego źródła do wielu celów.
|
block.router.description = Akceptuje przedmioty z jednego miejsca i rozdziela je do trzech innych kierunków. Przydatne w rozdzielaniu materiałów z jednego źródła do wielu celów.
|
||||||
block.distributor.description = Zaawansowany rozdzielacz, rozdzielający przedmioty do 7 innych kierunków.
|
block.distributor.description = Zaawansowany rozdzielacz, rozdzielający przedmioty do 7 innych kierunków.
|
||||||
block.overflow-gate.description = Rozdzielacz, który przerzuca przedmioty, kiedy główna droga jest przepełniona
|
block.overflow-gate.description = Rozdzielacz, który przerzuca przedmioty, kiedy główna droga jest przepełniona
|
||||||
block.mass-driver.description = Ultimate item transport block. Collects several items and then shoots them to another mass driver over a long range.
|
block.mass-driver.description = Najlepszy blok do transportu przedmiotów. Zbiera wiele przedmiotów naraz a potem wystrzeliwuje je do kolejnej katapulty masy na bardzo duże odległości.
|
||||||
block.mechanical-pump.description = Tania pompa o niskiej przepustowości. Nie wymaga prądu.
|
block.mechanical-pump.description = Tania pompa o niskiej przepustowości. Nie wymaga prądu.
|
||||||
block.rotary-pump.description = Zaawansowana pompa, dwukrotnie większa przepustowość od mechanicznej pompy. Wymaga prądu.
|
block.rotary-pump.description = Zaawansowana pompa, dwukrotnie większa przepustowość od mechanicznej pompy. Wymaga prądu.
|
||||||
block.thermal-pump.description = Najlepsza pompa. Trzy razy szybsza od mechanicznej pompy i jedyna, która może wypompować lawę.
|
block.thermal-pump.description = Najlepsza pompa. Trzy razy szybsza od mechanicznej pompy i jedyna, która może wypompować lawę.
|
||||||
@@ -970,41 +1025,41 @@ block.liquid-junction.description = Działa jak most dla dwóch krzyżujących s
|
|||||||
block.bridge-conduit.description = Zaawansowany blok przenoszący ciecze. Pozwala na przenoszenie cieczy nawet do 3 bloków na każdym terenie, przez każdy budynek.
|
block.bridge-conduit.description = Zaawansowany blok przenoszący ciecze. Pozwala na przenoszenie cieczy nawet do 3 bloków na każdym terenie, przez każdy budynek.
|
||||||
block.phase-conduit.description = Zaawansowany blok do przenoszenia cieczy. Używa prądu, aby przenieść ciecz do połączonego transportera fazowego przez kilka bloków.
|
block.phase-conduit.description = Zaawansowany blok do przenoszenia cieczy. Używa prądu, aby przenieść ciecz do połączonego transportera fazowego przez kilka bloków.
|
||||||
block.power-node.description = Przesyła moc do połączonych węzłów. Można podłączyć do czterech źródeł zasilania, zlewów lub węzłów. Zasila też bloki które go dotykają.
|
block.power-node.description = Przesyła moc do połączonych węzłów. Można podłączyć do czterech źródeł zasilania, zlewów lub węzłów. Zasila też bloki które go dotykają.
|
||||||
block.power-node-large.description = Has a larger radius than the power node and connects to up to six power sources, sinks or nodes.
|
block.power-node-large.description = Posiada większy zasięg niż zwykły węzeł prądu. Można podłączyć do sześciu źródeł zasilania, zlewów lub węzłów.
|
||||||
block.surge-tower.description = An extremely long-range power node with fewer available connections.
|
block.surge-tower.description = Węzęł prądu z bardzo dużym zasięgiem, posiadający mniej możliwych podłączeń.
|
||||||
block.battery.description = Stores power whenever there is an abundance and provides power whenever there is a shortage, as long as there is capacity left.
|
block.battery.description = Przechowuje energię przy nadwyżce produkcji oraz dostarcza energię kiedy jest jej brak, dopóki jest w niej miejsce.
|
||||||
block.battery-large.description = Stores much more power than a regular battery.
|
block.battery-large.description = Przechowuje o wiele wiecej prądu niż standardowa bateria.
|
||||||
block.combustion-generator.description = Wytwarza energię poprzez spalanie łatwopalnych materiałów.
|
block.combustion-generator.description = Wytwarza energię poprzez spalanie łatwopalnych materiałów.
|
||||||
block.thermal-generator.description = Generates power when placed in hot locations.
|
block.thermal-generator.description = Generuje prąd kiedy jest postawiony na źródłach ciepła.
|
||||||
block.turbine-generator.description = Bardziej wydajny niż generator spalania, ale wymaga dodatkowej wody.
|
block.turbine-generator.description = Bardziej wydajny niż generator spalania, ale wymaga dodatkowej wody.
|
||||||
block.differential-generator.description = Generates large amounts of energy. Utilizes the temperature difference between cryofluid and burning pyratite.
|
block.differential-generator.description = Generuje duże ilości prądu. Wykorzystuje różnice temperatur pomiędzy Lodocieczą a spalanym Piratianem.
|
||||||
block.rtg-generator.description = A radioisotope thermoelectric generator which does not require cooling but provides less power than a thorium reactor.
|
block.rtg-generator.description = Termoelektryczny generator wykorzystujący izotopy promieniotwórcze. Nie wymaga chłodzenia, ale produkuje mniej energii od reaktora torowego.
|
||||||
block.solar-panel.description = Provides a small amount of power from the sun.
|
block.solar-panel.description = Wytwarza małe ilości prądu wykorzystując energię słoneczną.
|
||||||
block.solar-panel-large.description = Provides much better power supply than a standard solar panel, but is also much more expensive to build.
|
block.solar-panel-large.description = Wytwarza o wiele więcej prądu niż zwykły panel słoneczny, ale jest o wiele droższy w budowie.
|
||||||
block.thorium-reactor.description = Generates huge amounts of power from highly radioactive thorium. Requires constant cooling. Will explode violently if insufficient amounts of coolant are supplied. Power output depends on fullness, with base power generated at full capacity.
|
block.thorium-reactor.description = Produkuje bardzo duże ilości prądu z wysoce radioaktywnego toru. Wymaga ciągłego chłodzenia. Silnie eksploduje jeśli nie zostanie dostarczona wystarczająca ilość chłodziwa. Produkcja energii zależy od zapełnienia, produkując bazową ilość energii przy całkowitym zapełnieniu.
|
||||||
block.impact-reactor.description = An advanced generator, capable of creating massive amounts of power at peak efficiency. Requires a significant power input to kickstart the process.
|
block.impact-reactor.description = Zaawansowany generator, zdolny do produkcji ogromnych ilości prądu u szczytu swoich możliwości. Wymaga znacznych ilości energii do rozpoczęcia procesu.
|
||||||
block.mechanical-drill.description = Tanie wiertło. Kiedy położnone na odpowiednich polach, wysyła przedmioty w wolnym tempie.
|
block.mechanical-drill.description = Tanie wiertło. Kiedy położnone na odpowiednich polach, wysyła przedmioty w wolnym tempie.
|
||||||
block.pneumatic-drill.description = An improved drill which is faster and able to process harder materials by making use of air pressure.
|
block.pneumatic-drill.description = Ulepszone wiertło, które jest szybsze i może wykopywać twardsze surowce przy użyciu ciśnienia.
|
||||||
block.laser-drill.description = Allows drilling even faster through laser technology, but requires power. Additionally, radioactive thorium can be retrieved with this drill.
|
block.laser-drill.description = Pozwala kopać jeszcze szybciej poprzez technologię laserową, ale wymaga energii. Dodatkowo, radioaktywny tor może zostać wydobyty przez to wiertło.
|
||||||
block.blast-drill.description = The ultimate drill. Requires large amounts of power.
|
block.blast-drill.description = Najlepsze wiertło. Wymaga dużych ilości energii.
|
||||||
block.water-extractor.description = Wydobywa wodę z ziemi. Użyj go, gdy w pobliżu nie ma jeziora.
|
block.water-extractor.description = Wydobywa wodę z ziemi. Użyj go, gdy w pobliżu nie ma jeziora.
|
||||||
block.cultivator.description = Uprawia małe skupiska zarodników w gotowe do użytku kapsułki.
|
block.cultivator.description = Uprawia małe skupiska zarodników w gotowe do użytku kapsułki.
|
||||||
block.oil-extractor.description = Uses large amounts of power in order to extract oil from sand. Use it when there is no direct source of oil nearby.
|
block.oil-extractor.description = Używa bardzo dużych ilości energii do ekstrakcji ropy z piasku. Używaj go w sytuacji kiedy nie ma bezpośredniego źródła ropy w okolicy.
|
||||||
block.core-shard.description = The first iteration of the core capsule. Once destroyed, all contact to the region is lost. Do not let this happen.
|
block.core-shard.description = Pierwsza wersja rdzenia. Gdy zostaje zniszczony, wszelki kontakt do regionu zostaje utracony. Nie pozwól na to.
|
||||||
block.core-foundation.description = The second version of the core. Better armored. Stores more resources.
|
block.core-foundation.description = Druga wersja rdzenia. Lepiej opancerzony. Przechowuje więcej surowców.
|
||||||
block.core-nucleus.description = The third and final iteration of the core capsule. Extremely well armored. Stores massive amounts of resources.
|
block.core-nucleus.description = Trzecia i ostatnia wersja rdzenia. Bardzo dobrze opanczerzony. Przechowuje ogromne ilości surowców.
|
||||||
block.vault.description = Stores a large amount of items of each type. An[LIGHT_GRAY] unloader[] can be used to retrieve items from the vault.
|
block.vault.description = Przechowuje duże ilości przedmiotów każdego rodzaju. [LIGHT_GRAY] Ekstraktor[] może zostać użyty do rozładowania magazynu.
|
||||||
block.container.description = Stores a small amount of items of each type. An[LIGHT_GRAY] unloader[] can be used to retrieve items from the container.
|
block.container.description = Przechowuje małe ilości przedmiotów każdego rodzaju. [LIGHT_GRAY] ekstraktor[] może zostać użyty do rozładowania kontenera.
|
||||||
block.unloader.description = Unloads items from a container, vault or core onto a conveyor or directly into an adjacent block. The type of item to be unloaded can be changed by tapping on the unloader.
|
block.unloader.description = Wyciąga przedmioty z kontenera, magazynu oraz rdżenia na przenośniki lub bezpośrednio na przyległe bloki. Typ przedmiotu jaki zostanie wyciągniety może zostać zmieniony poprzez kliknięcie.
|
||||||
block.launch-pad.description = Launches batches of items without any need for a core launch. Unfinished.
|
block.launch-pad.description = Wysyła pakiety przedmiotów bez potrzeby wystrzeliwania rdżenia. Niedokończona.
|
||||||
block.launch-pad-large.description = An improved version of the launch pad. Stores more items. Launches more frequently.
|
block.launch-pad-large.description = Ulepszona wersja wyrzutni. Magazynuje więcej przedmiotów. Wysyła częściej.
|
||||||
block.duo.description = Mała, tania wieża. Przydatny przeciwko jednostkom naziemnym.
|
block.duo.description = Mała, tania wieża. Przydatna przeciwko jednostkom naziemnym.
|
||||||
block.scatter.description = Średniej wielkości wieża przeciwlotnicza. Rozsiewa śruty z ołowiu lub strzępy złomu na jednostki wroga.
|
block.scatter.description = Średniej wielkości wieża przeciwlotnicza. Rozsiewa śruty z ołowiu lub strzępy złomu na jednostki wroga.
|
||||||
block.scorch.description = Spala wszystkich wrogów naziemnych w pobliżu. Bardzo skuteczny z bliskiej odległości.
|
block.scorch.description = Spala wszystkich wrogów naziemnych w pobliżu. Bardzo skuteczny z bliskiej odległości.
|
||||||
block.hail.description = Mała wieża artyleryjska, bardzo przydatna, atakuje tylko jednostki naziemne.
|
block.hail.description = Mała wieża artyleryjska, bardzo przydatna, atakuje tylko jednostki naziemne.
|
||||||
block.wave.description = Średniej wielkości szybkostrzelna wieżyczka, która wystrzeliwuje płynne bąbelki. Gasi ogień jeżeli jest w niej woda lub lodociecz
|
block.wave.description = Średniej wielkości szybkostrzelna wieżyczka, która wystrzeliwuje płynne bąbelki. Gasi ogień jeżeli jest w niej woda lub lodociecz
|
||||||
block.lancer.description = Średniej wielkości wieżyczka, która strzela naładowanymi wiązkami elektryczności.
|
block.lancer.description = Średniej wielkości wieżyczka, która strzela naładowanymi wiązkami elektryczności.
|
||||||
block.arc.description = Mała wieża bliskiego zasięgu, która wystrzeliwuje elektryczność losowym łukiem w kierunku wroga.
|
block.arc.description = Mała wieża bliskiego zasięgu, która wystrzeliwuje wiązki tesli losowym łukiem w kierunku wroga.
|
||||||
block.swarmer.description = Średniej wielkości wieżyczka, która strzela rakietami wybuchowymi.
|
block.swarmer.description = Średniej wielkości wieżyczka, która strzela rakietami wybuchowymi.
|
||||||
block.salvo.description = Średniej wielkości wieża strzelająca salwami.
|
block.salvo.description = Średniej wielkości wieża strzelająca salwami.
|
||||||
block.fuse.description = Duża wieża, która strzela potężnymi wiązkami krótkiego zasięgu.
|
block.fuse.description = Duża wieża, która strzela potężnymi wiązkami krótkiego zasięgu.
|
||||||
@@ -1012,21 +1067,22 @@ block.ripple.description = Duża wieża artyleryjska, która strzela jednocześn
|
|||||||
block.cyclone.description = Duża szybkostrzelna wieża.
|
block.cyclone.description = Duża szybkostrzelna wieża.
|
||||||
block.spectre.description = Duża wieża, która strzela dwoma potężnymi pociskami jednocześnie.
|
block.spectre.description = Duża wieża, która strzela dwoma potężnymi pociskami jednocześnie.
|
||||||
block.meltdown.description = Duża wieża, która strzela potężnymi wiązkami dalekiego zasięgu.
|
block.meltdown.description = Duża wieża, która strzela potężnymi wiązkami dalekiego zasięgu.
|
||||||
|
block.command-center.description = Wydaje polecenia ruchu sojuszniczym jednostkom na całej mapie.\nPowoduje patrolowanie jednostek, atakowanie wrogiego rdzenia lub wycofanie się do rdzenia / fabryki. Gdy nie ma rdzenia wroga, jednostki będą domyślnie patrolować pod dowództwem ataku.
|
||||||
block.draug-factory.description = Produkuje drony wydobywcze Draug.
|
block.draug-factory.description = Produkuje drony wydobywcze Draug.
|
||||||
block.spirit-factory.description = Produkuje lekkie drony, które naprawiają bloki.
|
block.spirit-factory.description = Produkuje lekkie drony, które naprawiają bloki.
|
||||||
block.phantom-factory.description = Produkuje zaawansowane drony które pomgają przy budowie.
|
block.phantom-factory.description = Produkuje zaawansowane drony które pomagają przy budowie.
|
||||||
block.wraith-factory.description = Produces fast, hit-and-run interceptor units.
|
block.wraith-factory.description = Produkuje szybkie jednostki powietrzne typu "uderz-uciekaj".
|
||||||
block.ghoul-factory.description = Produces heavy carpet bombers.
|
block.ghoul-factory.description = Produkuje ciężkie bombowce dywanowe.
|
||||||
block.revenant-factory.description = Produces heavy laser air units.
|
block.revenant-factory.description = Produkuje ciężkie jednostki powietrzne z wyrzutniami rakiet.
|
||||||
block.dagger-factory.description = Produces basic ground units.
|
block.dagger-factory.description = Produkuje podstawowe jednostki lądowe.
|
||||||
block.crawler-factory.description = Produces fast self-destructing swarm units.
|
block.crawler-factory.description = Produkuje szybkie jednostki lądowe typu "kamikaze".
|
||||||
block.titan-factory.description = Produces advanced, armored ground units.
|
block.titan-factory.description = Produkuje zaawansowane, opancerzone jednostki lądowe.
|
||||||
block.fortress-factory.description = Produces heavy artillery ground units.
|
block.fortress-factory.description = Produkuje naziemne jednostki ciężkiej artylerii.
|
||||||
block.repair-point.description = Bez przerw ulecza najbliższą zniszczoną jednostkę w jego zasięgu.
|
block.repair-point.description = Bez przerw ulecza najbliższą zniszczoną jednostkę w jego zasięgu.
|
||||||
block.dart-mech-pad.description = Provides transformation into a basic attack mech.\nUse by tapping while standing on it.
|
block.dart-mech-pad.description = Umożliwia transformacje w podstawowego mecha bojowego.\nUżyj klikając podczas stania na nim.
|
||||||
block.delta-mech-pad.description = Leave your current vessel and change into a fast, lightly-armored mech made for hit-and-run attacks.\nUse the pad by double tapping while standing on it.
|
block.delta-mech-pad.description = Opuść swój obecny statek i zamień go na szybki, lekko opancerzony mech stworzony do ataków typu uderz-uciekaj.\nUżyj, klikając dwukrotnie podczas stania na lądowisku.
|
||||||
block.tau-mech-pad.description = Leave your current vessel and change into a support mech which can heal friendly buildings and units.\nUse the pad by double tapping while standing on it.
|
block.tau-mech-pad.description = Opuść swój obecny statek i zamień go na mech wsparcia który może leczyć sojusznicze struktury i jednostki.\nUżyj, klikając dwukrotnie podczas stania na lądowisku.
|
||||||
block.omega-mech-pad.description = Leave your current vessel and change into a bulky and well-armored mech, made for front-line assaults.\nUse the pad by double tapping while standing on it.
|
block.omega-mech-pad.description = Opuść swój obecny statek i zamień go na masywny, dobrze opancerzony mech, przeznaczony do ataków na froncie.\nUżyj, klikając dwukrotnie podczas stania na lądowisku.
|
||||||
block.javelin-ship-pad.description = Leave your current vessel and change into a strong and fast interceptor with lightning weapons.\nUse the pad by double tapping while standing on it.
|
block.javelin-ship-pad.description = Opuść swój obecny statek i zamień go na silny i szybki statek przechwytujący z bronią błyskawicową.\nUżyj, klikając dwukrotnie podczas stania na lądowisku.
|
||||||
block.trident-ship-pad.description = Leave your current vessel and change into a reasonably well armored heavy bomber.\nUse the pad by double tapping while standing on it.
|
block.trident-ship-pad.description = Opuść swój obecny statek i zamień go na dość dobrze opancerzony ciężki bombowiec.\nUżyj, klikając dwukrotnie podczas stania na lądowisku.
|
||||||
block.glaive-ship-pad.description = Leave your current vessel and change into a large, well-armored gunship.\nUse the pad by double tapping while standing on it.
|
block.glaive-ship-pad.description = Opuść swój obecny statek i zamień go na duży, mocno opancerzony statek bojowy.\nUżyj, klikając dwukrotnie podczas stania na lądowisku.
|
||||||
|
|||||||
@@ -16,6 +16,11 @@ screenshot.invalid = Mapa grande demais, Potencialmente sem memoria suficiente p
|
|||||||
gameover = O núcleo foi destruído.
|
gameover = O núcleo foi destruído.
|
||||||
gameover.pvp = O time[accent] {0}[] É vitorioso!
|
gameover.pvp = O time[accent] {0}[] É vitorioso!
|
||||||
highscore = [YELLOW]Novo recorde!
|
highscore = [YELLOW]Novo recorde!
|
||||||
|
load.sound = Sounds
|
||||||
|
load.map = Maps
|
||||||
|
load.image = Images
|
||||||
|
load.content = Content
|
||||||
|
load.system = System
|
||||||
stat.wave = Hordas derrotadas:[accent] {0}
|
stat.wave = Hordas derrotadas:[accent] {0}
|
||||||
stat.enemiesDestroyed = Enimigos Destruídos:[accent] {0}
|
stat.enemiesDestroyed = Enimigos Destruídos:[accent] {0}
|
||||||
stat.built = Construções construídas:[accent] {0}
|
stat.built = Construções construídas:[accent] {0}
|
||||||
@@ -23,8 +28,6 @@ stat.destroyed = Construções destruídas:[accent] {0}
|
|||||||
stat.deconstructed = Construções desconstruídas:[accent] {0}
|
stat.deconstructed = Construções desconstruídas:[accent] {0}
|
||||||
stat.delivered = Recursos lançados:
|
stat.delivered = Recursos lançados:
|
||||||
stat.rank = Rank Final: [accent]{0}
|
stat.rank = Rank Final: [accent]{0}
|
||||||
placeline = Você selecionou um bloco.\nVocê pode[accent] colocar uma linha[] por[accent] carregar o seu dedo por alguns segundos[] e arrastar em uma direção.\nTente.
|
|
||||||
removearea = Você selecionou o modo de remoção.\nVocê pode[accent] remover blocos dentro de um retângulo[] por[accent] carregar o seu dedo por alguns segundos[] e arrastar.\nTente.
|
|
||||||
launcheditems = [accent]Itens lançados
|
launcheditems = [accent]Itens lançados
|
||||||
map.delete = Certeza que quer deletar o mapa "[accent]{0}[]"?
|
map.delete = Certeza que quer deletar o mapa "[accent]{0}[]"?
|
||||||
level.highscore = Melhor\npontuação: [accent] {0}
|
level.highscore = Melhor\npontuação: [accent] {0}
|
||||||
@@ -63,9 +66,11 @@ players.single = {0} Jogador Ativo
|
|||||||
server.closing = [accent]Fechando servidor...
|
server.closing = [accent]Fechando servidor...
|
||||||
server.kicked.kick = Voce foi expulso do servidor!
|
server.kicked.kick = Voce foi expulso do servidor!
|
||||||
server.kicked.serverClose = Servidor Fechado.
|
server.kicked.serverClose = Servidor Fechado.
|
||||||
|
server.kicked.vote = You have been vote-kicked. Goodbye.
|
||||||
server.kicked.clientOutdated = Cliente desatualizado! Atualize seu jogo!
|
server.kicked.clientOutdated = Cliente desatualizado! Atualize seu jogo!
|
||||||
server.kicked.serverOutdated = Servidor desatualiado! Peca ao dono para atualizar!
|
server.kicked.serverOutdated = Servidor desatualiado! Peca ao dono para atualizar!
|
||||||
server.kicked.banned = Voce foi banido do servidor.
|
server.kicked.banned = Voce foi banido do servidor.
|
||||||
|
server.kicked.typeMismatch = This server is not compatible with your build type.
|
||||||
server.kicked.recentKick = Voce foi banido recentemente.\nEspere para conectar de novo.
|
server.kicked.recentKick = Voce foi banido recentemente.\nEspere para conectar de novo.
|
||||||
server.kicked.nameInUse = Este nome ja esta sendo usado\nneste servidor.
|
server.kicked.nameInUse = Este nome ja esta sendo usado\nneste servidor.
|
||||||
server.kicked.nameEmpty = Voce deve ter pelo menos uma letra ou numero.
|
server.kicked.nameEmpty = Voce deve ter pelo menos uma letra ou numero.
|
||||||
@@ -156,6 +161,11 @@ cancel = Cancelar
|
|||||||
openlink = Abrir Link
|
openlink = Abrir Link
|
||||||
copylink = Copiar link
|
copylink = Copiar link
|
||||||
back = Voltar
|
back = Voltar
|
||||||
|
data.export = Export Data
|
||||||
|
data.import = Import Data
|
||||||
|
data.exported = Data exported.
|
||||||
|
data.invalid = This isn't valid game data.
|
||||||
|
data.import.confirm = Importing external data will erase[scarlet] all[] your current game data.\n[accent]This cannot be undone![]\n\nOnce the data is imported, your game will exit immediately.
|
||||||
classic.export = Export Classic Data
|
classic.export = Export Classic Data
|
||||||
classic.export.text = [accent]Mindustry[] has just had a major update.\nClassic (v3.5 build 40) save or map data has been detected. Would you like to export these saves to your phone's home folder, for use in the Mindustry Classic app?
|
classic.export.text = [accent]Mindustry[] has just had a major update.\nClassic (v3.5 build 40) save or map data has been detected. Would you like to export these saves to your phone's home folder, for use in the Mindustry Classic app?
|
||||||
quit.confirm = Você tem certeza que quer sair?
|
quit.confirm = Você tem certeza que quer sair?
|
||||||
@@ -376,6 +386,7 @@ zone.fungalPass.description = A transition area between high mountains and lower
|
|||||||
zone.impact0078.description = <insert description here>
|
zone.impact0078.description = <insert description here>
|
||||||
zone.crags.description = <insert description here>
|
zone.crags.description = <insert description here>
|
||||||
settings.language = Linguagem
|
settings.language = Linguagem
|
||||||
|
settings.data = Game Data
|
||||||
settings.reset = Restaurar Padrões
|
settings.reset = Restaurar Padrões
|
||||||
settings.rebind = Religar
|
settings.rebind = Religar
|
||||||
settings.controls = Controles
|
settings.controls = Controles
|
||||||
@@ -507,6 +518,7 @@ setting.mutemusic.name = Desligar Música
|
|||||||
setting.sfxvol.name = Volume de Efeitos
|
setting.sfxvol.name = Volume de Efeitos
|
||||||
setting.mutesound.name = Desligar Som
|
setting.mutesound.name = Desligar Som
|
||||||
setting.crashreport.name = Enviar denuncias de crash anonimas
|
setting.crashreport.name = Enviar denuncias de crash anonimas
|
||||||
|
setting.savecreate.name = Auto-Create Saves
|
||||||
setting.chatopacity.name = Opacidade do chat
|
setting.chatopacity.name = Opacidade do chat
|
||||||
setting.playerchat.name = Mostrar chat em-jogo
|
setting.playerchat.name = Mostrar chat em-jogo
|
||||||
uiscale.reset = UI scale has been changed.\nPress "OK" to confirm this scale.\n[scarlet]Reverting and exiting in[accent] {0}[] settings...
|
uiscale.reset = UI scale has been changed.\nPress "OK" to confirm this scale.\n[scarlet]Reverting and exiting in[accent] {0}[] settings...
|
||||||
@@ -527,6 +539,7 @@ keybind.press.axis = Pressione uma Axis ou tecla...
|
|||||||
keybind.screenshot.name = Captura do mapa
|
keybind.screenshot.name = Captura do mapa
|
||||||
keybind.move_x.name = mover_x
|
keybind.move_x.name = mover_x
|
||||||
keybind.move_y.name = mover_y
|
keybind.move_y.name = mover_y
|
||||||
|
keybind.fullscreen.name = Toggle Fullscreen
|
||||||
keybind.select.name = selecionar
|
keybind.select.name = selecionar
|
||||||
keybind.diagonal_placement.name = Colocação diagonal
|
keybind.diagonal_placement.name = Colocação diagonal
|
||||||
keybind.pick.name = Pegar bloco
|
keybind.pick.name = Pegar bloco
|
||||||
@@ -790,6 +803,7 @@ block.blast-mixer.name = Misturador de Explosão
|
|||||||
block.solar-panel.name = Painel Solar
|
block.solar-panel.name = Painel Solar
|
||||||
block.solar-panel-large.name = Painel Solar Grande
|
block.solar-panel-large.name = Painel Solar Grande
|
||||||
block.oil-extractor.name = Extrator de Óleo
|
block.oil-extractor.name = Extrator de Óleo
|
||||||
|
block.command-center.name = Command Center
|
||||||
block.draug-factory.name = Draug Miner Drone Factory
|
block.draug-factory.name = Draug Miner Drone Factory
|
||||||
block.spirit-factory.name = Fabrica de Drone Spirit
|
block.spirit-factory.name = Fabrica de Drone Spirit
|
||||||
block.phantom-factory.name = Fabrica de Drone Phantom
|
block.phantom-factory.name = Fabrica de Drone Phantom
|
||||||
@@ -1012,6 +1026,7 @@ block.ripple.description = Uma grande torre que atira simultaneamente.
|
|||||||
block.cyclone.description = Uma grande torre de tiro rapido.
|
block.cyclone.description = Uma grande torre de tiro rapido.
|
||||||
block.spectre.description = Uma grande torre que da dois tiros poderosos ao mesmo tempo.
|
block.spectre.description = Uma grande torre que da dois tiros poderosos ao mesmo tempo.
|
||||||
block.meltdown.description = Uma grande torre que atira dois raios poderosos ao mesmo tempo.
|
block.meltdown.description = Uma grande torre que atira dois raios poderosos ao mesmo tempo.
|
||||||
|
block.command-center.description = Issues movement commands to allied units across the map.\nCauses units to patrol, attack an enemy core or retreat to the core/factory. When no enemy core is present, units will default to patrolling under the attack command.
|
||||||
block.draug-factory.description = Produces Draug mining drones.
|
block.draug-factory.description = Produces Draug mining drones.
|
||||||
block.spirit-factory.description = Produz drones leves que mineram e reparam blocos.
|
block.spirit-factory.description = Produz drones leves que mineram e reparam blocos.
|
||||||
block.phantom-factory.description = Produz unidades de drone avancadas Que são significativamente mais efetivos que um drone spirit.
|
block.phantom-factory.description = Produz unidades de drone avancadas Que são significativamente mais efetivos que um drone spirit.
|
||||||
|
|||||||
@@ -16,6 +16,11 @@ screenshot.invalid = Map too large, potentially not enough memory for screenshot
|
|||||||
gameover = Game Over
|
gameover = Game Over
|
||||||
gameover.pvp = The[accent] {0}[] team is victorious!
|
gameover.pvp = The[accent] {0}[] team is victorious!
|
||||||
highscore = [accent]Nytt rekord!
|
highscore = [accent]Nytt rekord!
|
||||||
|
load.sound = Sounds
|
||||||
|
load.map = Maps
|
||||||
|
load.image = Images
|
||||||
|
load.content = Content
|
||||||
|
load.system = System
|
||||||
stat.wave = Waves Defeated:[accent] {0}
|
stat.wave = Waves Defeated:[accent] {0}
|
||||||
stat.enemiesDestroyed = Enemies Destroyed:[accent] {0}
|
stat.enemiesDestroyed = Enemies Destroyed:[accent] {0}
|
||||||
stat.built = Buildings Built:[accent] {0}
|
stat.built = Buildings Built:[accent] {0}
|
||||||
@@ -23,8 +28,6 @@ stat.destroyed = Buildings Destroyed:[accent] {0}
|
|||||||
stat.deconstructed = Buildings Deconstructed:[accent] {0}
|
stat.deconstructed = Buildings Deconstructed:[accent] {0}
|
||||||
stat.delivered = Resources Launched:
|
stat.delivered = Resources Launched:
|
||||||
stat.rank = Final Rank: [accent]{0}
|
stat.rank = Final Rank: [accent]{0}
|
||||||
placeline = Du har valt ett block.\nDu kan[accent] placera i en linje[] genom att[accent] hålla ner ett finger i några sekunder[] och sedan dra åt ett håll.\n\n[scarlet]GÖR DET.
|
|
||||||
removearea = Du har valt borttagningsläget.\nDu kan[accent] ta bort block inom en rektangel[] genom att[accent] hålla ner ett finger i några sekunder[] och dra.\n\n[scarlet]GÖR DET.
|
|
||||||
launcheditems = [accent]Launched Items
|
launcheditems = [accent]Launched Items
|
||||||
map.delete = Are you sure you want to delete the map "[accent]{0}[]"?
|
map.delete = Are you sure you want to delete the map "[accent]{0}[]"?
|
||||||
level.highscore = High Score: [accent]{0}
|
level.highscore = High Score: [accent]{0}
|
||||||
@@ -63,9 +66,11 @@ players.single = {0} spelare online
|
|||||||
server.closing = [accent]Stänger server...
|
server.closing = [accent]Stänger server...
|
||||||
server.kicked.kick = You have been kicked from the server!
|
server.kicked.kick = You have been kicked from the server!
|
||||||
server.kicked.serverClose = Server stängd.
|
server.kicked.serverClose = Server stängd.
|
||||||
|
server.kicked.vote = You have been vote-kicked. Goodbye.
|
||||||
server.kicked.clientOutdated = Outdated client! Uppdatera ditt spel!
|
server.kicked.clientOutdated = Outdated client! Uppdatera ditt spel!
|
||||||
server.kicked.serverOutdated = Outdated server! Ask the host to update!
|
server.kicked.serverOutdated = Outdated server! Ask the host to update!
|
||||||
server.kicked.banned = Du är bannad från servern.
|
server.kicked.banned = Du är bannad från servern.
|
||||||
|
server.kicked.typeMismatch = This server is not compatible with your build type.
|
||||||
server.kicked.recentKick = You have been kicked recently.\nWait before connecting again.
|
server.kicked.recentKick = You have been kicked recently.\nWait before connecting again.
|
||||||
server.kicked.nameInUse = Någon med det namnet finns redan\npå servern.
|
server.kicked.nameInUse = Någon med det namnet finns redan\npå servern.
|
||||||
server.kicked.nameEmpty = Ditt namn är ogiltigt.
|
server.kicked.nameEmpty = Ditt namn är ogiltigt.
|
||||||
@@ -156,6 +161,11 @@ cancel = Avbryt
|
|||||||
openlink = Öppna Länk
|
openlink = Öppna Länk
|
||||||
copylink = Kopiera Länk
|
copylink = Kopiera Länk
|
||||||
back = Tillbaka
|
back = Tillbaka
|
||||||
|
data.export = Export Data
|
||||||
|
data.import = Import Data
|
||||||
|
data.exported = Data exported.
|
||||||
|
data.invalid = This isn't valid game data.
|
||||||
|
data.import.confirm = Importing external data will erase[scarlet] all[] your current game data.\n[accent]This cannot be undone![]\n\nOnce the data is imported, your game will exit immediately.
|
||||||
classic.export = Exportera Classic-Data
|
classic.export = Exportera Classic-Data
|
||||||
classic.export.text = Sparad data från Classic (v3.5 build 40) har hittats. Vill du exportera den här datan till telefonens hem-mapp för att använda i Mindustry Classic-appen?
|
classic.export.text = Sparad data från Classic (v3.5 build 40) har hittats. Vill du exportera den här datan till telefonens hem-mapp för att använda i Mindustry Classic-appen?
|
||||||
quit.confirm = Är du säker på att du vill avsluta?
|
quit.confirm = Är du säker på att du vill avsluta?
|
||||||
@@ -376,6 +386,7 @@ zone.fungalPass.description = A transition area between high mountains and lower
|
|||||||
zone.impact0078.description = <insert description here>
|
zone.impact0078.description = <insert description here>
|
||||||
zone.crags.description = <insert description here>
|
zone.crags.description = <insert description here>
|
||||||
settings.language = Språk
|
settings.language = Språk
|
||||||
|
settings.data = Game Data
|
||||||
settings.reset = Återställ till Standardvärden
|
settings.reset = Återställ till Standardvärden
|
||||||
settings.rebind = Byt
|
settings.rebind = Byt
|
||||||
settings.controls = Kontroller
|
settings.controls = Kontroller
|
||||||
@@ -507,6 +518,7 @@ setting.mutemusic.name = Stäng Av Musik
|
|||||||
setting.sfxvol.name = Ljudeffektvolym
|
setting.sfxvol.name = Ljudeffektvolym
|
||||||
setting.mutesound.name = Stäng Av Ljudeffekter
|
setting.mutesound.name = Stäng Av Ljudeffekter
|
||||||
setting.crashreport.name = Skicka Anonyma Krashrapporter
|
setting.crashreport.name = Skicka Anonyma Krashrapporter
|
||||||
|
setting.savecreate.name = Auto-Create Saves
|
||||||
setting.chatopacity.name = Chattgenomskinlighet
|
setting.chatopacity.name = Chattgenomskinlighet
|
||||||
setting.playerchat.name = Visa Chatt
|
setting.playerchat.name = Visa Chatt
|
||||||
uiscale.reset = UI-skalan har ändrats.\nTryck "OK" för att använda den här skalan.\n[scarlet]Avslutar och återställer om[accent] {0}[] sekunder...
|
uiscale.reset = UI-skalan har ändrats.\nTryck "OK" för att använda den här skalan.\n[scarlet]Avslutar och återställer om[accent] {0}[] sekunder...
|
||||||
@@ -527,6 +539,7 @@ keybind.press.axis = Press an axis or key...
|
|||||||
keybind.screenshot.name = Map Screenshot
|
keybind.screenshot.name = Map Screenshot
|
||||||
keybind.move_x.name = Move x
|
keybind.move_x.name = Move x
|
||||||
keybind.move_y.name = Move y
|
keybind.move_y.name = Move y
|
||||||
|
keybind.fullscreen.name = Toggle Fullscreen
|
||||||
keybind.select.name = Select/Shoot
|
keybind.select.name = Select/Shoot
|
||||||
keybind.diagonal_placement.name = Diagonal Placement
|
keybind.diagonal_placement.name = Diagonal Placement
|
||||||
keybind.pick.name = Pick Block
|
keybind.pick.name = Pick Block
|
||||||
@@ -790,6 +803,7 @@ block.blast-mixer.name = Blast Mixer
|
|||||||
block.solar-panel.name = Solpanel
|
block.solar-panel.name = Solpanel
|
||||||
block.solar-panel-large.name = Stor Solpanel
|
block.solar-panel-large.name = Stor Solpanel
|
||||||
block.oil-extractor.name = Oljeextraktor
|
block.oil-extractor.name = Oljeextraktor
|
||||||
|
block.command-center.name = Command Center
|
||||||
block.draug-factory.name = Draug Miner Drone Factory
|
block.draug-factory.name = Draug Miner Drone Factory
|
||||||
block.spirit-factory.name = Spirit Repair Drone Factory
|
block.spirit-factory.name = Spirit Repair Drone Factory
|
||||||
block.phantom-factory.name = Phantom Builder Drone Factory
|
block.phantom-factory.name = Phantom Builder Drone Factory
|
||||||
@@ -1012,6 +1026,7 @@ block.ripple.description = An extremely poweful artillery turret. Shoots cluster
|
|||||||
block.cyclone.description = A large anti-air and anti-ground turret. Fires explosive clumps of flak at nearby units.
|
block.cyclone.description = A large anti-air and anti-ground turret. Fires explosive clumps of flak at nearby units.
|
||||||
block.spectre.description = A massive dual-barreled cannon. Shoots large armor-piercing bullets at air and ground targets.
|
block.spectre.description = A massive dual-barreled cannon. Shoots large armor-piercing bullets at air and ground targets.
|
||||||
block.meltdown.description = A massive laser cannon. Charges and fires a persistent laser beam at nearby enemies. Requires coolant to operate.
|
block.meltdown.description = A massive laser cannon. Charges and fires a persistent laser beam at nearby enemies. Requires coolant to operate.
|
||||||
|
block.command-center.description = Issues movement commands to allied units across the map.\nCauses units to patrol, attack an enemy core or retreat to the core/factory. When no enemy core is present, units will default to patrolling under the attack command.
|
||||||
block.draug-factory.description = Produces Draug mining drones.
|
block.draug-factory.description = Produces Draug mining drones.
|
||||||
block.spirit-factory.description = Produces Spirit structural repair drones.
|
block.spirit-factory.description = Produces Spirit structural repair drones.
|
||||||
block.phantom-factory.description = Produces advanced construction drones.
|
block.phantom-factory.description = Produces advanced construction drones.
|
||||||
|
|||||||
@@ -16,6 +16,11 @@ screenshot.invalid = Map too large, potentially not enough memory for screenshot
|
|||||||
gameover = Cekirdegin yok edildi.
|
gameover = Cekirdegin yok edildi.
|
||||||
gameover.pvp = The[accent] {0}[] team is victorious!
|
gameover.pvp = The[accent] {0}[] team is victorious!
|
||||||
highscore = [accent]Yeni Yuksek skor!
|
highscore = [accent]Yeni Yuksek skor!
|
||||||
|
load.sound = Sounds
|
||||||
|
load.map = Maps
|
||||||
|
load.image = Images
|
||||||
|
load.content = Content
|
||||||
|
load.system = System
|
||||||
stat.wave = Waves Defeated:[accent] {0}
|
stat.wave = Waves Defeated:[accent] {0}
|
||||||
stat.enemiesDestroyed = Enemies Destroyed:[accent] {0}
|
stat.enemiesDestroyed = Enemies Destroyed:[accent] {0}
|
||||||
stat.built = Buildings Built:[accent] {0}
|
stat.built = Buildings Built:[accent] {0}
|
||||||
@@ -23,8 +28,6 @@ stat.destroyed = Buildings Destroyed:[accent] {0}
|
|||||||
stat.deconstructed = Buildings Deconstructed:[accent] {0}
|
stat.deconstructed = Buildings Deconstructed:[accent] {0}
|
||||||
stat.delivered = Resources Launched:
|
stat.delivered = Resources Launched:
|
||||||
stat.rank = Final Rank: [accent]{0}
|
stat.rank = Final Rank: [accent]{0}
|
||||||
placeline = You have selected a block.\nYou can[accent] place in a line[] by[accent] holding down your finger for a few seconds[] and dragging in a direction.\nTry it.
|
|
||||||
removearea = You have selected removal mode.\nYou can[accent] remove blocks in a rectangle[] by[accent] holding down your finger for a few seconds[] and dragging.\nTry it.
|
|
||||||
launcheditems = [accent]Launched Items
|
launcheditems = [accent]Launched Items
|
||||||
map.delete = Su haritayi silmek istediginden emin misin? "[accent]{0}[]"?
|
map.delete = Su haritayi silmek istediginden emin misin? "[accent]{0}[]"?
|
||||||
level.highscore = Yuksek Skor: [accent]{0}
|
level.highscore = Yuksek Skor: [accent]{0}
|
||||||
@@ -63,9 +66,11 @@ players.single = {0} oyuncu cevrimici
|
|||||||
server.closing = [accent]Oyun kapaniyor.
|
server.closing = [accent]Oyun kapaniyor.
|
||||||
server.kicked.kick = Oyundan cikarildin
|
server.kicked.kick = Oyundan cikarildin
|
||||||
server.kicked.serverClose = Oyun kapandi
|
server.kicked.serverClose = Oyun kapandi
|
||||||
|
server.kicked.vote = You have been vote-kicked. Goodbye.
|
||||||
server.kicked.clientOutdated = Yeni bir versiyon mevcut! Hemen indir!
|
server.kicked.clientOutdated = Yeni bir versiyon mevcut! Hemen indir!
|
||||||
server.kicked.serverOutdated = Eski oyun! Yapimciya guncellemesini soyle!
|
server.kicked.serverOutdated = Eski oyun! Yapimciya guncellemesini soyle!
|
||||||
server.kicked.banned = Oyundan kalici olarak cikarildin.
|
server.kicked.banned = Oyundan kalici olarak cikarildin.
|
||||||
|
server.kicked.typeMismatch = This server is not compatible with your build type.
|
||||||
server.kicked.recentKick = Oyundan cikarilmistin.\nBaglanmadn once biraz bekle.
|
server.kicked.recentKick = Oyundan cikarilmistin.\nBaglanmadn once biraz bekle.
|
||||||
server.kicked.nameInUse = Oyunda bu isimde bir\nkisi zaten var.
|
server.kicked.nameInUse = Oyunda bu isimde bir\nkisi zaten var.
|
||||||
server.kicked.nameEmpty = ismin gecerli degil.
|
server.kicked.nameEmpty = ismin gecerli degil.
|
||||||
@@ -156,6 +161,11 @@ cancel = iptal
|
|||||||
openlink = Linki ac
|
openlink = Linki ac
|
||||||
copylink = Linki kopyala
|
copylink = Linki kopyala
|
||||||
back = Geri don
|
back = Geri don
|
||||||
|
data.export = Export Data
|
||||||
|
data.import = Import Data
|
||||||
|
data.exported = Data exported.
|
||||||
|
data.invalid = This isn't valid game data.
|
||||||
|
data.import.confirm = Importing external data will erase[scarlet] all[] your current game data.\n[accent]This cannot be undone![]\n\nOnce the data is imported, your game will exit immediately.
|
||||||
classic.export = Export Classic Data
|
classic.export = Export Classic Data
|
||||||
classic.export.text = [accent]Mindustry[] has just had a major update.\nClassic (v3.5 build 40) save or map data has been detected. Would you like to export these saves to your phone's home folder, for use in the Mindustry Classic app?
|
classic.export.text = [accent]Mindustry[] has just had a major update.\nClassic (v3.5 build 40) save or map data has been detected. Would you like to export these saves to your phone's home folder, for use in the Mindustry Classic app?
|
||||||
quit.confirm = Cikmak istedigine emin misin?
|
quit.confirm = Cikmak istedigine emin misin?
|
||||||
@@ -376,6 +386,7 @@ zone.fungalPass.description = A transition area between high mountains and lower
|
|||||||
zone.impact0078.description = <insert description here>
|
zone.impact0078.description = <insert description here>
|
||||||
zone.crags.description = <insert description here>
|
zone.crags.description = <insert description here>
|
||||||
settings.language = Dil
|
settings.language = Dil
|
||||||
|
settings.data = Game Data
|
||||||
settings.reset = ilk ayarlara geri al
|
settings.reset = ilk ayarlara geri al
|
||||||
settings.rebind = Geri al
|
settings.rebind = Geri al
|
||||||
settings.controls = Kontroller
|
settings.controls = Kontroller
|
||||||
@@ -507,6 +518,7 @@ setting.mutemusic.name = Sesi kapat
|
|||||||
setting.sfxvol.name = Ses seviyesi
|
setting.sfxvol.name = Ses seviyesi
|
||||||
setting.mutesound.name = Sesi kapat
|
setting.mutesound.name = Sesi kapat
|
||||||
setting.crashreport.name = Send Anonymous Crash Reports
|
setting.crashreport.name = Send Anonymous Crash Reports
|
||||||
|
setting.savecreate.name = Auto-Create Saves
|
||||||
setting.chatopacity.name = Chat Opacity
|
setting.chatopacity.name = Chat Opacity
|
||||||
setting.playerchat.name = Display In-Game Chat
|
setting.playerchat.name = Display In-Game Chat
|
||||||
uiscale.reset = UI scale has been changed.\nPress "OK" to confirm this scale.\n[scarlet]Reverting and exiting in[accent] {0}[] settings...
|
uiscale.reset = UI scale has been changed.\nPress "OK" to confirm this scale.\n[scarlet]Reverting and exiting in[accent] {0}[] settings...
|
||||||
@@ -527,6 +539,7 @@ keybind.press.axis = Bir yone cevir yada tusa bas...
|
|||||||
keybind.screenshot.name = Map Screenshot
|
keybind.screenshot.name = Map Screenshot
|
||||||
keybind.move_x.name = Sol/Sag hareket
|
keybind.move_x.name = Sol/Sag hareket
|
||||||
keybind.move_y.name = Yukari/asagi hareket
|
keybind.move_y.name = Yukari/asagi hareket
|
||||||
|
keybind.fullscreen.name = Toggle Fullscreen
|
||||||
keybind.select.name = Sec/silahi sik
|
keybind.select.name = Sec/silahi sik
|
||||||
keybind.diagonal_placement.name = Diagonal Placement
|
keybind.diagonal_placement.name = Diagonal Placement
|
||||||
keybind.pick.name = Pick Block
|
keybind.pick.name = Pick Block
|
||||||
@@ -790,6 +803,7 @@ block.blast-mixer.name = Patlayici karistiricisi
|
|||||||
block.solar-panel.name = gunes paneli
|
block.solar-panel.name = gunes paneli
|
||||||
block.solar-panel-large.name = genis gunes paneli
|
block.solar-panel-large.name = genis gunes paneli
|
||||||
block.oil-extractor.name = benzin ayirici
|
block.oil-extractor.name = benzin ayirici
|
||||||
|
block.command-center.name = Command Center
|
||||||
block.draug-factory.name = Draug Miner Drone Factory
|
block.draug-factory.name = Draug Miner Drone Factory
|
||||||
block.spirit-factory.name = Spirit Drone Factory
|
block.spirit-factory.name = Spirit Drone Factory
|
||||||
block.phantom-factory.name = Phantom Drone Factory
|
block.phantom-factory.name = Phantom Drone Factory
|
||||||
@@ -1012,6 +1026,7 @@ block.ripple.description = A large artillery turret which fires several shots si
|
|||||||
block.cyclone.description = A large rapid fire turret.
|
block.cyclone.description = A large rapid fire turret.
|
||||||
block.spectre.description = A large turret which shoots two powerful bullets at once.
|
block.spectre.description = A large turret which shoots two powerful bullets at once.
|
||||||
block.meltdown.description = A large turret which shoots powerful long-range beams.
|
block.meltdown.description = A large turret which shoots powerful long-range beams.
|
||||||
|
block.command-center.description = Issues movement commands to allied units across the map.\nCauses units to patrol, attack an enemy core or retreat to the core/factory. When no enemy core is present, units will default to patrolling under the attack command.
|
||||||
block.draug-factory.description = Produces Draug mining drones.
|
block.draug-factory.description = Produces Draug mining drones.
|
||||||
block.spirit-factory.description = Produces light drones which mine ore and repair blocks.
|
block.spirit-factory.description = Produces light drones which mine ore and repair blocks.
|
||||||
block.phantom-factory.description = Produces advanced drone units which are significantly more effective than a spirit drone.
|
block.phantom-factory.description = Produces advanced drone units which are significantly more effective than a spirit drone.
|
||||||
|
|||||||
@@ -1,164 +1,185 @@
|
|||||||
credits.text = Created by [ROYAL]Anuken[] - [SKY]anukendev@gmail.com[]
|
credits.text = [ROYAL]Anuken[] tarafından yapıldı - [SKY]anukendev@gmail.com[]
|
||||||
credits = Credits
|
credits = Jenerik
|
||||||
contributors = Translators and Contributors
|
contributors = Çevirmenler ve Katkıda Bulunanlar
|
||||||
discord = Join the Mindustry Discord!
|
discord = Mindustry'nin Discord sunucusuna Katıl!
|
||||||
link.discord.description = The official Mindustry Discord chatroom
|
link.discord.description = Resmi Mindustry Discord sunucusu
|
||||||
link.github.description = Game source code
|
link.github.description = Oyun kaynak kodu
|
||||||
link.changelog.description = List of update changes
|
link.changelog.description = Güncelleme değişikliklerini
|
||||||
link.dev-builds.description = Unstable development builds
|
link.dev-builds.description = Dengesiz oyun sürümleri
|
||||||
link.trello.description = Official Trello board for planned features
|
link.trello.description = Planlanan özellikler için resmi Trello Sayfası
|
||||||
link.itch.io.description = itch.io page with PC downloads
|
link.itch.io.description = Bilgisayar sürümleri için itch.io sayfası
|
||||||
link.google-play.description = Google Play store listing
|
link.google-play.description = Google Play mağaza sayfası
|
||||||
link.wiki.description = Official Mindustry wiki
|
link.wiki.description = Resmi Mindustry wikisi
|
||||||
linkfail = Failed to open link!\nThe URL has been copied to your clipboard.
|
linkfail = Link açılamadı!\nURL kopyalandı.
|
||||||
screenshot = Screenshot saved to {0}
|
screenshot = Ekran görüntüsü {0} 'na kaydedildi
|
||||||
screenshot.invalid = Map too large, potentially not enough memory for screenshot.
|
screenshot.invalid = Harita çok büyük, ekran görüntüsü için potansiyel olarak yeterli bellek yok.
|
||||||
gameover = Game Over
|
gameover = Kaybettin
|
||||||
gameover.pvp = The[accent] {0}[] team is victorious!
|
gameover.pvp = [accent] {0}[] Takımı kazandı!
|
||||||
highscore = [accent]New highscore!
|
highscore = [accent]Yeni rekor!
|
||||||
|
load.sound = Sesler
|
||||||
stat.wave = Waves Defeated:[accent] {0}
|
load.map = Haritalar
|
||||||
stat.enemiesDestroyed = Enemies Destroyed:[accent] {0}
|
load.image = Resimler
|
||||||
stat.built = Buildings Built:[accent] {0}
|
load.content = İçerik
|
||||||
stat.destroyed = Buildings Destroyed:[accent] {0}
|
load.system = Sistem
|
||||||
stat.deconstructed = Buildings Deconstructed:[accent] {0}
|
stat.wave = Yenilen Dalgalar:[accent] {0}
|
||||||
stat.delivered = Resources Launched:
|
stat.enemiesDestroyed = Yok Edilen Düşmanlar:[accent] {0}
|
||||||
stat.rank = Final Rank: [accent]{0}
|
stat.built = İnşa Edilen Yapılar:[accent] {0}
|
||||||
|
stat.destroyed = Yok Edilen Yapılar:[accent] {0}
|
||||||
placeline = You have selected a block.\nYou can[accent] place in a line[] by[accent] holding down your finger for a few seconds[] and dragging in a direction.\n\n[scarlet]DO IT.
|
stat.deconstructed = Yıkılan Yapılar:[accent] {0}
|
||||||
removearea = You have selected removal mode.\nYou can[accent] remove blocks in a rectangle[] by[accent] holding down your finger for a few seconds[] and dragging.\n\n[scarlet]DO IT.
|
stat.delivered = Gönderilen Kaynaklar:
|
||||||
|
stat.rank = Rütbe: [accent]{0}
|
||||||
launcheditems = [accent]Launched Items
|
launcheditems = [accent]Gönderilen Kaynaklar
|
||||||
map.delete = Are you sure you want to delete the map "[accent]{0}[]"?
|
map.delete = "[accent]{0}[]"Haritasını silmek istediğine emin misin?
|
||||||
level.highscore = High Score: [accent]{0}
|
level.highscore = Rekor: [accent]{0}
|
||||||
level.select = Level Select
|
level.select = Seviye Seçimi
|
||||||
level.mode = Gamemode:
|
level.mode = Oyun Modu:
|
||||||
showagain = Don't show again next session
|
showagain = Bir daha gösterme
|
||||||
coreattack = < Core is under attack! >
|
coreattack = < Çekirdek saldırı altında! >
|
||||||
nearpoint = [[ [scarlet]LEAVE DROP POINT IMMEDIATELY[] ]\nannihilation imminent
|
nearpoint = [[ [scarlet]İNİŞ PİSTİNDEN AYRIL[] ]\nimha tehlikesi
|
||||||
database = Core Database
|
database = Çekirdek Veritabanı
|
||||||
savegame = Save Game
|
savegame = Oyunu Kaydet
|
||||||
loadgame = Load Game
|
loadgame = Oyunu Yükle
|
||||||
joingame = Join Game
|
joingame = Oyuna Katıl
|
||||||
addplayers = Add/Remove Players
|
addplayers = Oyuncu Ekle/Kaldır
|
||||||
customgame = Custom Game
|
customgame = Özel Oyun
|
||||||
newgame = New Game
|
newgame = Yeni Oyun
|
||||||
none = <none>
|
none = <yok>
|
||||||
minimap = Minimap
|
minimap = Harita
|
||||||
close = Close
|
close = Kapat
|
||||||
website = Website
|
website = Website
|
||||||
quit = Quit
|
quit = Çık
|
||||||
maps = Maps
|
maps = Haritalar
|
||||||
continue = Continue
|
maps.browse = Haritaları gör
|
||||||
maps.none = [lightgray]No maps found!
|
continue = Devam et
|
||||||
about.button = About
|
maps.none = [lightgray]Harita Bulunamadı!
|
||||||
name = Name:
|
invalid = Invalid
|
||||||
noname = Pick a[accent] player name[] first.
|
preparingconfig = Yapılandırma Hazırlanıyor
|
||||||
filename = File Name:
|
preparingcontent = İçerik Hazırlanıyor
|
||||||
unlocked = New content unlocked!
|
uploadingcontent = İçerik Yükleniyor
|
||||||
completed = [accent]Completed
|
uploadingpreviewfile = Önizleme Dosyası Yükleniyor
|
||||||
techtree = Tech Tree
|
committingchanges = Değişiklikler Uygulanıyor
|
||||||
research.list = [lightgray]Research:
|
done = Bittti
|
||||||
research = Research
|
|
||||||
researched = [lightgray]{0} researched.
|
about.button = Hakkında
|
||||||
players = {0} players online
|
name = İsim:
|
||||||
players.single = {0} player online
|
noname = Bir[accent] kullanıcı adı[] seçmelisin.
|
||||||
server.closing = [accent]Closing server...
|
filename = Dosya Adı:
|
||||||
server.kicked.kick = You have been kicked from the server!
|
unlocked = Yeni içerik açıldı!
|
||||||
server.kicked.serverClose = Server closed.
|
completed = [accent]Tamamlandı
|
||||||
server.kicked.clientOutdated = Outdated client! Update your game!
|
techtree = Yetenek Ağacı
|
||||||
server.kicked.serverOutdated = Outdated server! Ask the host to update!
|
research.list = [lightgray]Araştırmalar:
|
||||||
server.kicked.banned = You are banned on this server.
|
research = Araştır
|
||||||
server.kicked.recentKick = You have been kicked recently.\nWait before connecting again.
|
researched = [lightgray]{0} Araştırıldı.
|
||||||
server.kicked.nameInUse = There is someone with that name\nalready on this server.
|
players = {0} çevrimiçi oyuncu
|
||||||
server.kicked.nameEmpty = Your chosen name is invalid.
|
players.single = {0} çevrimiçi oyuncu
|
||||||
server.kicked.idInUse = You are already on this server! Connecting with two accounts is not permitted.
|
server.closing = [accent]Sunucu kapatılıyor...
|
||||||
server.kicked.customClient = This server does not support custom builds. Download an official version.
|
server.kicked.whitelist = Beyaz listede değilsin.
|
||||||
server.kicked.gameover = Game over!
|
server.kicked.kick = Sunucudan atıldın!
|
||||||
server.versions = Your version:[accent] {0}[]\nServer version:[accent] {1}[]
|
server.kicked.serverClose = Sunucu kapandı.
|
||||||
host.info = The [accent]host[] button hosts a server on port [scarlet]6567[]. \nAnybody on the same [lightgray]wifi or local network[] should be able to see your server in their server list.\n\nIf you want people to be able to connect from anywhere by IP, [accent]port forwarding[] is required.\n\n[lightgray]Note: If someone is experiencing trouble connecting to your LAN game, make sure you have allowed Mindustry access to your local network in your firewall settings. Note that public networks sometimes do not allow server discovery.
|
server.kicked.vote = Oylama ile atıldın. Görüşürüz.
|
||||||
join.info = Here, you can enter a [accent]server IP[] to connect to, or discover [accent]local network[] servers to connect to.\nBoth LAN and WAN multiplayer is supported.\n\n[lightgray]Note: There is no automatic global server list; if you want to connect to someone by IP, you would need to ask the host for their IP.
|
server.kicked.clientOutdated = Eski sürüm! Oyununu güncelle!
|
||||||
hostserver = Host Multiplayer Game
|
server.kicked.serverOutdated = Geçersiz sunucu!\nKurucudan oyununu güncellemesini iste!
|
||||||
hostserver.mobile = Host\nGame
|
server.kicked.banned = Bu sunucudan yasaklandın.
|
||||||
host = Host
|
server.kicked.typeMismatch = Bu sunucu senin inşa türünle uyumlu değil.
|
||||||
hosting = [accent]Opening server...
|
server.kicked.playerLimit = Sunucu dolu. Yer açılmasını bekle.
|
||||||
hosts.refresh = Refresh
|
server.kicked.recentKick = Yakın bir zamanda bir sunucudan atıldın.\nBağlanmadan önce bir süre bekle.
|
||||||
hosts.discovering = Discovering LAN games
|
server.kicked.nameInUse = Sunucuda zaten o isimde biri var.
|
||||||
server.refreshing = Refreshing server
|
server.kicked.nameEmpty = Seçtiğin isim geçersiz.
|
||||||
hosts.none = [lightgray]No local games found!
|
server.kicked.idInUse = Zaten bu sunucudasın! İki hesapla bir sunucuya bağlanamazsın.
|
||||||
host.invalid = [scarlet]Can't connect to host.
|
server.kicked.customClient = Bu sunucu özel sürümleri kabul etmiyor. Resmi bir sürüm indir.
|
||||||
trace = Trace Player
|
server.kicked.gameover = Oyun bitti!
|
||||||
trace.playername = Player name: [accent]{0}
|
server.versions = Kullandığın surum:[accent] {0}[]\nSunucunun sürümü:[accent] {1}[]
|
||||||
|
host.info = [accent]host[], [scarlet]6567[] portunda bir sunucuya ev sahipliği yapıyor. \nAynı [lightgray]wifi veya yerel ağdaki[] herkes sunucu listelerinde senin sunucunu görebiliyor olmalı.\n\nEğer diğerlerinin herhangi bir yerden IP ile bağlanabilmesini istiyorsan [accent]port yönlendirmesi[] gerekli.\n\n[lightgray]Not: Eğer birisi senin yerel ağ oyununa katılmakta sorun yaşıyorsa güvenlik duvarı ayarlarında Mindustry'ye yerel ağ bağlantısı izni verdiğinden emin olun. Halka açık ağların zaman zaman sunucu aramaya engel olduğunu unutmayın.
|
||||||
|
join.info = Burada, bağlanmak istediğin sunucunun [accent]IP[] adresini girebilir veya [accent]yerel ağ[] sunucularını görebilirsin..\nHem yerel ağ hem de geniş alan ağı çoklu oyuncu için destekleniyor.\n\n[lightgray]Not: Otomatik bir global sunucu listesi yok; eğer birisine IP adresi kullanarak bağlanmak istiyorsan IP adresini istemelisin.
|
||||||
|
hostserver = Çok Oyunculu Oyun Aç
|
||||||
|
hostserver.mobile = Oyun\nKur
|
||||||
|
host = Kur
|
||||||
|
hosting = [accent]Sunucu açılıyor...
|
||||||
|
hosts.refresh = Yenile
|
||||||
|
hosts.discovering = Yerel ağ oyunu aranıyor
|
||||||
|
server.refreshing = Sunucu yenileniyor
|
||||||
|
hosts.none = [lightgray]Yerel oyun bulunamadı!
|
||||||
|
host.invalid = [scarlet]Kurucuya bağlanılamıyor.
|
||||||
|
trace = Oyuncuyu Takip Et
|
||||||
|
trace.playername = Oyuncu İsmi: [accent]{0}
|
||||||
trace.ip = IP: [accent]{0}
|
trace.ip = IP: [accent]{0}
|
||||||
trace.id = Unique ID: [accent]{0}
|
trace.id = Özel ID: [accent]{0}
|
||||||
trace.mobile = Mobile Client: [accent]{0}
|
trace.mobile = Mobil Sürüm: [accent]{0}
|
||||||
trace.modclient = Custom Client: [accent]{0}
|
trace.modclient = Özel Sürüm: [accent]{0}
|
||||||
invalidid = Invalid client ID! Submit a bug report.
|
invalidid = Geçersiz Sürüm ID'si! Bir hata raporu gönder.
|
||||||
server.bans = Bans
|
server.bans = Yasaklılar
|
||||||
server.bans.none = No banned players found!
|
server.bans.none = Yasaklanmış oyuncu bulunamadı!
|
||||||
server.admins = Admins
|
server.admins = Yönetici
|
||||||
server.admins.none = No admins found!
|
server.admins.none = Yönetici bulunamadı!
|
||||||
server.add = Add Server
|
server.add = Sunucu Ekle
|
||||||
server.delete = Are you sure you want to delete this server?
|
server.delete = Bu sunucuyu silmek istediğine emin misin?
|
||||||
server.edit = Edit Server
|
server.edit = Sunucuyu Düzenle
|
||||||
server.outdated = [crimson]Outdated Server![]
|
server.outdated = [crimson]Güncel Olmayan Sunucu![]
|
||||||
server.outdated.client = [crimson]Outdated Client![]
|
server.outdated.client = [crimson]Güncel Olmayan Sürüm![]
|
||||||
server.version = [gray]v{0} {1}
|
server.version = [gray]v{0} {1}
|
||||||
server.custombuild = [yellow]Custom Build
|
server.custombuild = [yellow]Özel Sürüm
|
||||||
confirmban = Are you sure you want to ban this player?
|
confirmban = Bu kullanıcıyı yasaklamak istediğine emin misin?confirmkick = Bu kullanıcıyı atmak istediğine emin misin?
|
||||||
confirmkick = Are you sure you want to kick this player?
|
confirmunban = Bu kullanıcının yasağını kaldırmak istediğine emin misin?
|
||||||
confirmunban = Are you sure you want to unban this player?
|
confirmadmin = Bu kullanıcıyı bir yönetici yapmak istediğine emin misin?
|
||||||
confirmadmin = Are you sure you want to make this player an admin?
|
confirmunadmin = Bu kullanıcının yönetici yetkilerini almak istediğine istediğine emin misin?
|
||||||
confirmunadmin = Are you sure you want to remove admin status from this player?
|
joingame.title = Oyuna Katıl
|
||||||
joingame.title = Join Game
|
joingame.ip = Adres:
|
||||||
joingame.ip = Address:
|
disconnect = Bağlantı kesildi.
|
||||||
disconnect = Disconnected.
|
disconnect.error = Bağlantı hatası.
|
||||||
disconnect.data = Failed to load world data!
|
disconnect.closed = Bağlantı kapatıldı.
|
||||||
connecting = [accent]Connecting...
|
disconnect.timeout = Zaman aşımı.
|
||||||
connecting.data = [accent]Loading world data...
|
disconnect.data = Dünya verisi yüklenemedi!
|
||||||
|
connecting = [accent]Bağlanılıyor...
|
||||||
|
connecting.data = [accent]Dünya verisi yükleniyor...
|
||||||
server.port = Port:
|
server.port = Port:
|
||||||
server.addressinuse = Address already in use!
|
server.addressinuse = Adres zaten kullanılıyor!
|
||||||
server.invalidport = Invalid port number!
|
server.invalidport = Geçersiz port sayısı!
|
||||||
server.error = [crimson]Error hosting server: [accent]{0}
|
server.error = [crimson]Sunucu kurulamadı: [accent]{0}
|
||||||
save.old = This save is for an older version of the game, and can no longer be used.\n\n[lightgray]Save backwards compatibility will be implemented in the full 4.0 release.
|
save.old = Bu kayıt oyunun eski bir sürümü için ve artık kullanılamaz.\n\n[lightgray]Tam 4.0 sürümü yayınlandığında geri kayıt özelliği eklenecek.
|
||||||
save.new = New Save
|
save.new = Yeni kayıt
|
||||||
save.overwrite = Are you sure you want to overwrite\nthis save slot?
|
save.overwrite = Bu kayıdın üstüne yazmak istediğine\nemin misin?
|
||||||
overwrite = Overwrite
|
overwrite = Üstüne yaz
|
||||||
save.none = No saves found!
|
save.none = Kayıt bulunamadı!
|
||||||
saveload = Saving...
|
saveload = Kaydediliyor...
|
||||||
savefail = Failed to save game!
|
savefail = Oyun kaydedilemedi!
|
||||||
save.delete.confirm = Are you sure you want to delete this save?
|
save.delete.confirm = Bu kaydı silmek istediğine emin misin?
|
||||||
save.delete = Delete
|
save.delete = Sil
|
||||||
save.export = Export Save
|
save.export = Kayıdı Dışa Aktar
|
||||||
save.import.invalid = [accent]This save is invalid!
|
save.import.invalid = [accent]Bu kayıt geçersiz!
|
||||||
save.import.fail = [crimson]Failed to import save: [accent]{0}
|
save.import.fail = [crimson]Kayıt içe aktarılamadı: [accent]{0}
|
||||||
save.export.fail = [crimson]Failed to export save: [accent]{0}
|
save.export.fail = [crimson]Kayıt dışa aktarılamadı: [accent]{0}
|
||||||
save.import = Import Save
|
save.import = Kayıdı İçe Aktar
|
||||||
save.newslot = Save name:
|
save.newslot = İsmi kaydet:
|
||||||
save.rename = Rename
|
save.rename = Yeniden isimlendir
|
||||||
save.rename.text = New name:
|
save.rename.text = Yeni isim:
|
||||||
selectslot = Select a save.
|
selectslot = Bir kayıt seçin.
|
||||||
slot = [accent]Slot {0}
|
slot = [accent]Slot {0}
|
||||||
save.corrupted = [accent]Save file corrupted or invalid!\nIf you have just updated your game, this is probably a change in the save format and [scarlet]not[] a bug.
|
save.corrupted = [accent]Kayıt dosyası bozuk veya geçersiz!\nEğer oyununuzu kısa süre öce güncellediyseniz bu, kayıt formatındaki bir değişiklik. Bir hata [scarlet]değil[].
|
||||||
empty = <empty>
|
empty = <boş>
|
||||||
on = On
|
on = Aç
|
||||||
off = Off
|
off = Kapa
|
||||||
save.autosave = Autosave: {0}
|
save.autosave = Otomatk kayıt: {0}
|
||||||
save.map = Map: {0}
|
save.map = Harita: {0}
|
||||||
save.wave = Wave {0}
|
save.wave = Dalga {0}
|
||||||
save.difficulty = Difficulty: {0}
|
save.mode = Oyun modu: {0}
|
||||||
save.date = Last Saved: {0}
|
save.difficulty = Zorluk: {0}
|
||||||
save.playtime = Playtime: {0}
|
save.date = Son Kayıt: {0}
|
||||||
warning = Warning.
|
save.playtime = Oynama süresi: {0}
|
||||||
confirm = Confirm
|
warning = Uyarı.
|
||||||
delete = Delete
|
confirm = Doğrula
|
||||||
|
delete = Sil
|
||||||
ok = OK
|
ok = OK
|
||||||
open = Open
|
open = Aç
|
||||||
customize = Customize Rules
|
customize = Kuralları Özelleştir
|
||||||
cancel = Cancel
|
cancel = İptal
|
||||||
openlink = Open Link
|
openlink = Bağlantıyı Aç
|
||||||
copylink = Copy Link
|
copylink = Bağlantıyı Kopyala
|
||||||
back = Back
|
back = Geri
|
||||||
|
data.export = Veriyi Dışa Aktar
|
||||||
|
data.import = Veriyi İçe Aktar
|
||||||
|
data.exported = Veri dışa aktarıldı.
|
||||||
|
data.invalid = Bu oyun verisi geçerli değil.
|
||||||
|
data.import.confirm = Importing external data will erase[scarlet] all[] your current game data.\n[accent]This cannot be undone![]\n\nOnce the data is imported, your game will exit immediately.
|
||||||
classic.export = Export Classic Data
|
classic.export = Export Classic Data
|
||||||
classic.export.text = [accent]Mindustry[] has just had a major update.\nClassic (v3.5 build 40) save or map data has been detected. Would you like to export these saves to your phone's home folder, for use in the Mindustry Classic app?
|
classic.export.text = [accent]Mindustry[] has just had a major update.\nClassic (v3.5 build 40) save or map data has been detected. Would you like to export these saves to your phone's home folder, for use in the Mindustry Classic app?
|
||||||
quit.confirm = Are you sure you want to quit?
|
quit.confirm = Are you sure you want to quit?
|
||||||
@@ -253,7 +274,6 @@ editor.mapname = Map Name:
|
|||||||
editor.overwrite = [accent]Warning!\nThis overwrites an existing map.
|
editor.overwrite = [accent]Warning!\nThis overwrites an existing map.
|
||||||
editor.overwrite.confirm = [scarlet]Warning![] A map with this name already exists. Are you sure you want to overwrite it?
|
editor.overwrite.confirm = [scarlet]Warning![] A map with this name already exists. Are you sure you want to overwrite it?
|
||||||
editor.selectmap = Select a map to load:
|
editor.selectmap = Select a map to load:
|
||||||
|
|
||||||
toolmode.replace = Replace
|
toolmode.replace = Replace
|
||||||
toolmode.replace.description = Draws only on solid blocks.
|
toolmode.replace.description = Draws only on solid blocks.
|
||||||
toolmode.replaceall = Replace All
|
toolmode.replaceall = Replace All
|
||||||
@@ -268,7 +288,6 @@ toolmode.fillteams = Fill Teams
|
|||||||
toolmode.fillteams.description = Fill teams instead of blocks.
|
toolmode.fillteams.description = Fill teams instead of blocks.
|
||||||
toolmode.drawteams = Draw Teams
|
toolmode.drawteams = Draw Teams
|
||||||
toolmode.drawteams.description = Draw teams instead of blocks.
|
toolmode.drawteams.description = Draw teams instead of blocks.
|
||||||
|
|
||||||
filters.empty = [lightgray]No filters! Add one with the button below.
|
filters.empty = [lightgray]No filters! Add one with the button below.
|
||||||
filter.distort = Distort
|
filter.distort = Distort
|
||||||
filter.noise = Noise
|
filter.noise = Noise
|
||||||
@@ -300,7 +319,6 @@ filter.option.floor2 = Secondary Floor
|
|||||||
filter.option.threshold2 = Secondary Threshold
|
filter.option.threshold2 = Secondary Threshold
|
||||||
filter.option.radius = Radius
|
filter.option.radius = Radius
|
||||||
filter.option.percentile = Percentile
|
filter.option.percentile = Percentile
|
||||||
|
|
||||||
width = Width:
|
width = Width:
|
||||||
height = Height:
|
height = Height:
|
||||||
menu = Menu
|
menu = Menu
|
||||||
@@ -318,7 +336,6 @@ tutorial.retake = Re-Take Tutorial
|
|||||||
editor = Editor
|
editor = Editor
|
||||||
mapeditor = Map Editor
|
mapeditor = Map Editor
|
||||||
donate = Donate
|
donate = Donate
|
||||||
|
|
||||||
abandon = Abandon
|
abandon = Abandon
|
||||||
abandon.text = This zone and all its resources will be lost to the enemy.
|
abandon.text = This zone and all its resources will be lost to the enemy.
|
||||||
locked = Locked
|
locked = Locked
|
||||||
@@ -344,7 +361,6 @@ zone.objective.survival = Survive
|
|||||||
zone.objective.attack = Destroy Enemy Core
|
zone.objective.attack = Destroy Enemy Core
|
||||||
add = Add...
|
add = Add...
|
||||||
boss.health = Boss Health
|
boss.health = Boss Health
|
||||||
|
|
||||||
connectfail = [crimson]Connection error:\n\n[accent]{0}
|
connectfail = [crimson]Connection error:\n\n[accent]{0}
|
||||||
error.unreachable = Server unreachable.\nIs the address spelled correctly?
|
error.unreachable = Server unreachable.\nIs the address spelled correctly?
|
||||||
error.invalidaddress = Invalid address.
|
error.invalidaddress = Invalid address.
|
||||||
@@ -355,7 +371,6 @@ error.mapnotfound = Map file not found!
|
|||||||
error.io = Network I/O error.
|
error.io = Network I/O error.
|
||||||
error.any = Unknown network error.
|
error.any = Unknown network error.
|
||||||
error.bloom = Failed to initialize bloom.\nYour device may not support it.
|
error.bloom = Failed to initialize bloom.\nYour device may not support it.
|
||||||
|
|
||||||
zone.groundZero.name = Ground Zero
|
zone.groundZero.name = Ground Zero
|
||||||
zone.desertWastes.name = Desert Wastes
|
zone.desertWastes.name = Desert Wastes
|
||||||
zone.craters.name = The Craters
|
zone.craters.name = The Craters
|
||||||
@@ -370,7 +385,6 @@ zone.saltFlats.name = Salt Flats
|
|||||||
zone.impact0078.name = Impact 0078
|
zone.impact0078.name = Impact 0078
|
||||||
zone.crags.name = Crags
|
zone.crags.name = Crags
|
||||||
zone.fungalPass.name = Fungal Pass
|
zone.fungalPass.name = Fungal Pass
|
||||||
|
|
||||||
zone.groundZero.description = The optimal location to begin once more. Low enemy threat. Few resources.\nGather as much lead and copper as possible.\nMove on.
|
zone.groundZero.description = The optimal location to begin once more. Low enemy threat. Few resources.\nGather as much lead and copper as possible.\nMove on.
|
||||||
zone.frozenForest.description = Even here, closer to mountains, the spores have spread. The frigid temperatures cannot contain them forever.\n\nBegin the venture into power. Build combustion generators. Learn to use menders.
|
zone.frozenForest.description = Even here, closer to mountains, the spores have spread. The frigid temperatures cannot contain them forever.\n\nBegin the venture into power. Build combustion generators. Learn to use menders.
|
||||||
zone.desertWastes.description = These wastes are vast, unpredictable, and criss-crossed with derelict sector structures.\nCoal is present in the region. Burn it for power, or synthesize graphite.\n\n[lightgray]This landing location cannot be guaranteed.
|
zone.desertWastes.description = These wastes are vast, unpredictable, and criss-crossed with derelict sector structures.\nCoal is present in the region. Burn it for power, or synthesize graphite.\n\n[lightgray]This landing location cannot be guaranteed.
|
||||||
@@ -385,8 +399,8 @@ zone.nuclearComplex.description = A former facility for the production and proce
|
|||||||
zone.fungalPass.description = A transition area between high mountains and lower, spore-ridden lands. A small enemy reconnaissance base is located here.\nDestroy it.\nUse Dagger and Crawler units. Take out the two cores.
|
zone.fungalPass.description = A transition area between high mountains and lower, spore-ridden lands. A small enemy reconnaissance base is located here.\nDestroy it.\nUse Dagger and Crawler units. Take out the two cores.
|
||||||
zone.impact0078.description = <insert description here>
|
zone.impact0078.description = <insert description here>
|
||||||
zone.crags.description = <insert description here>
|
zone.crags.description = <insert description here>
|
||||||
|
|
||||||
settings.language = Language
|
settings.language = Language
|
||||||
|
settings.data = Game Data
|
||||||
settings.reset = Reset to Defaults
|
settings.reset = Reset to Defaults
|
||||||
settings.rebind = Rebind
|
settings.rebind = Rebind
|
||||||
settings.controls = Controls
|
settings.controls = Controls
|
||||||
@@ -438,7 +452,6 @@ blocks.inaccuracy = Inaccuracy
|
|||||||
blocks.shots = Shots
|
blocks.shots = Shots
|
||||||
blocks.reload = Shots/Second
|
blocks.reload = Shots/Second
|
||||||
blocks.ammo = Ammo
|
blocks.ammo = Ammo
|
||||||
|
|
||||||
bar.drilltierreq = Better Drill Required
|
bar.drilltierreq = Better Drill Required
|
||||||
bar.drillspeed = Drill Speed: {0}/s
|
bar.drillspeed = Drill Speed: {0}/s
|
||||||
bar.efficiency = Efficiency: {0}%
|
bar.efficiency = Efficiency: {0}%
|
||||||
@@ -451,7 +464,6 @@ bar.heat = Heat
|
|||||||
bar.power = Power
|
bar.power = Power
|
||||||
bar.progress = Build Progress
|
bar.progress = Build Progress
|
||||||
bar.spawned = Units: {0}/{1}
|
bar.spawned = Units: {0}/{1}
|
||||||
|
|
||||||
bullet.damage = [stat]{0}[lightgray] damage
|
bullet.damage = [stat]{0}[lightgray] damage
|
||||||
bullet.splashdamage = [stat]{0}[lightgray] area dmg ~[stat] {1}[lightgray] tiles
|
bullet.splashdamage = [stat]{0}[lightgray] area dmg ~[stat] {1}[lightgray] tiles
|
||||||
bullet.incendiary = [stat]incendiary
|
bullet.incendiary = [stat]incendiary
|
||||||
@@ -463,7 +475,6 @@ bullet.freezing = [stat]freezing
|
|||||||
bullet.tarred = [stat]tarred
|
bullet.tarred = [stat]tarred
|
||||||
bullet.multiplier = [stat]{0}[lightgray]x ammo multiplier
|
bullet.multiplier = [stat]{0}[lightgray]x ammo multiplier
|
||||||
bullet.reload = [stat]{0}[lightgray]x fire rate
|
bullet.reload = [stat]{0}[lightgray]x fire rate
|
||||||
|
|
||||||
unit.blocks = blocks
|
unit.blocks = blocks
|
||||||
unit.powersecond = power units/second
|
unit.powersecond = power units/second
|
||||||
unit.liquidsecond = liquid units/second
|
unit.liquidsecond = liquid units/second
|
||||||
@@ -521,6 +532,7 @@ setting.mutemusic.name = Mute Music
|
|||||||
setting.sfxvol.name = SFX Volume
|
setting.sfxvol.name = SFX Volume
|
||||||
setting.mutesound.name = Mute Sound
|
setting.mutesound.name = Mute Sound
|
||||||
setting.crashreport.name = Send Anonymous Crash Reports
|
setting.crashreport.name = Send Anonymous Crash Reports
|
||||||
|
setting.savecreate.name = Auto-Create Saves
|
||||||
setting.chatopacity.name = Chat Opacity
|
setting.chatopacity.name = Chat Opacity
|
||||||
setting.playerchat.name = Display In-Game Chat
|
setting.playerchat.name = Display In-Game Chat
|
||||||
uiscale.reset = UI scale has been changed.\nPress "OK" to confirm this scale.\n[scarlet]Reverting and exiting in[accent] {0}[] seconds...
|
uiscale.reset = UI scale has been changed.\nPress "OK" to confirm this scale.\n[scarlet]Reverting and exiting in[accent] {0}[] seconds...
|
||||||
@@ -541,6 +553,7 @@ keybind.press.axis = Press an axis or key...
|
|||||||
keybind.screenshot.name = Map Screenshot
|
keybind.screenshot.name = Map Screenshot
|
||||||
keybind.move_x.name = Move x
|
keybind.move_x.name = Move x
|
||||||
keybind.move_y.name = Move y
|
keybind.move_y.name = Move y
|
||||||
|
keybind.fullscreen.name = Toggle Fullscreen
|
||||||
keybind.select.name = Select/Shoot
|
keybind.select.name = Select/Shoot
|
||||||
keybind.diagonal_placement.name = Diagonal Placement
|
keybind.diagonal_placement.name = Diagonal Placement
|
||||||
keybind.pick.name = Pick Block
|
keybind.pick.name = Pick Block
|
||||||
@@ -573,7 +586,6 @@ mode.pvp.description = Fight against other players locally.\n[gray]Requires at l
|
|||||||
mode.attack.name = Attack
|
mode.attack.name = Attack
|
||||||
mode.attack.description = Destroy the enemy's base. No waves.\n[gray]Requires a red core in the map to play.
|
mode.attack.description = Destroy the enemy's base. No waves.\n[gray]Requires a red core in the map to play.
|
||||||
mode.custom = Custom Rules
|
mode.custom = Custom Rules
|
||||||
|
|
||||||
rules.infiniteresources = Infinite Resources
|
rules.infiniteresources = Infinite Resources
|
||||||
rules.wavetimer = Wave Timer
|
rules.wavetimer = Wave Timer
|
||||||
rules.waves = Waves
|
rules.waves = Waves
|
||||||
@@ -600,7 +612,6 @@ rules.title.resourcesbuilding = Resources & Building
|
|||||||
rules.title.player = Players
|
rules.title.player = Players
|
||||||
rules.title.enemy = Enemies
|
rules.title.enemy = Enemies
|
||||||
rules.title.unit = Units
|
rules.title.unit = Units
|
||||||
|
|
||||||
content.item.name = Items
|
content.item.name = Items
|
||||||
content.liquid.name = Liquids
|
content.liquid.name = Liquids
|
||||||
content.unit.name = Units
|
content.unit.name = Units
|
||||||
@@ -662,7 +673,6 @@ mech.buildspeed = [lightgray]Building Speed: {0}%
|
|||||||
liquid.heatcapacity = [lightgray]Heat Capacity: {0}
|
liquid.heatcapacity = [lightgray]Heat Capacity: {0}
|
||||||
liquid.viscosity = [lightgray]Viscosity: {0}
|
liquid.viscosity = [lightgray]Viscosity: {0}
|
||||||
liquid.temperature = [lightgray]Temperature: {0}
|
liquid.temperature = [lightgray]Temperature: {0}
|
||||||
|
|
||||||
block.sand-boulder.name = Sand Boulder
|
block.sand-boulder.name = Sand Boulder
|
||||||
block.grass.name = Grass
|
block.grass.name = Grass
|
||||||
block.salt.name = Salt
|
block.salt.name = Salt
|
||||||
@@ -807,6 +817,7 @@ block.blast-mixer.name = Blast Mixer
|
|||||||
block.solar-panel.name = Solar Panel
|
block.solar-panel.name = Solar Panel
|
||||||
block.solar-panel-large.name = Large Solar Panel
|
block.solar-panel-large.name = Large Solar Panel
|
||||||
block.oil-extractor.name = Oil Extractor
|
block.oil-extractor.name = Oil Extractor
|
||||||
|
block.command-center.name = Command Center
|
||||||
block.draug-factory.name = Draug Miner Drone Factory
|
block.draug-factory.name = Draug Miner Drone Factory
|
||||||
block.spirit-factory.name = Spirit Repair Drone Factory
|
block.spirit-factory.name = Spirit Repair Drone Factory
|
||||||
block.phantom-factory.name = Phantom Builder Drone Factory
|
block.phantom-factory.name = Phantom Builder Drone Factory
|
||||||
@@ -889,8 +900,6 @@ tutorial.deposit = Deposit items into blocks by dragging from your ship to the d
|
|||||||
tutorial.waves = The[lightgray] enemy[] approaches.\n\nDefend the core for 2 waves.[accent] Click[] to shoot.\nBuild more turrets and drills. Mine more copper.
|
tutorial.waves = The[lightgray] enemy[] approaches.\n\nDefend the core for 2 waves.[accent] Click[] to shoot.\nBuild more turrets and drills. Mine more copper.
|
||||||
tutorial.waves.mobile = The[lightgray] enemy[] approaches.\n\nDefend the core for 2 waves. Your ship will automatically fire at enemies.\nBuild more turrets and drills. Mine more copper.
|
tutorial.waves.mobile = The[lightgray] enemy[] approaches.\n\nDefend the core for 2 waves. Your ship will automatically fire at enemies.\nBuild more turrets and drills. Mine more copper.
|
||||||
tutorial.launch = Once you reach a specific wave, you are able to[accent] launch the core[], leaving your defenses behind and[accent] obtaining all the resources in your core.[]\nThese resources can then be used to research new technology.\n\n[accent]Press the launch button.
|
tutorial.launch = Once you reach a specific wave, you are able to[accent] launch the core[], leaving your defenses behind and[accent] obtaining all the resources in your core.[]\nThese resources can then be used to research new technology.\n\n[accent]Press the launch button.
|
||||||
|
|
||||||
|
|
||||||
item.copper.description = The most basic structural material. Used extensively in all types of blocks.
|
item.copper.description = The most basic structural material. Used extensively in all types of blocks.
|
||||||
item.lead.description = A basic starter material. Used extensively in electronics and liquid transportation blocks.
|
item.lead.description = A basic starter material. Used extensively in electronics and liquid transportation blocks.
|
||||||
item.metaglass.description = A super-tough glass compound. Extensively used for liquid distribution and storage.
|
item.metaglass.description = A super-tough glass compound. Extensively used for liquid distribution and storage.
|
||||||
@@ -1031,6 +1040,7 @@ block.ripple.description = An extremely powerful artillery turret. Shoots cluste
|
|||||||
block.cyclone.description = A large anti-air and anti-ground turret. Fires explosive clumps of flak at nearby units.
|
block.cyclone.description = A large anti-air and anti-ground turret. Fires explosive clumps of flak at nearby units.
|
||||||
block.spectre.description = A massive dual-barreled cannon. Shoots large armor-piercing bullets at air and ground targets.
|
block.spectre.description = A massive dual-barreled cannon. Shoots large armor-piercing bullets at air and ground targets.
|
||||||
block.meltdown.description = A massive laser cannon. Charges and fires a persistent laser beam at nearby enemies. Requires coolant to operate.
|
block.meltdown.description = A massive laser cannon. Charges and fires a persistent laser beam at nearby enemies. Requires coolant to operate.
|
||||||
|
block.command-center.description = Issues movement commands to allied units across the map.\nCauses units to patrol, attack an enemy core or retreat to the core/factory. When no enemy core is present, units will default to patrolling under the attack command.
|
||||||
block.draug-factory.description = Produces Draug mining drones.
|
block.draug-factory.description = Produces Draug mining drones.
|
||||||
block.spirit-factory.description = Produces Spirit structural repair drones.
|
block.spirit-factory.description = Produces Spirit structural repair drones.
|
||||||
block.phantom-factory.description = Produces advanced construction drones.
|
block.phantom-factory.description = Produces advanced construction drones.
|
||||||
|
|||||||
@@ -1,30 +1,36 @@
|
|||||||
credits.text = Створив [ROYAL]Anuken[] — [SKY]anukendev@gmail.com[]\n\nЄ питання по грі або проблеми з перекладом?\nЙдіть в офіційний сервер discord Mindustry у канал #український.\nПерекладач: [blue]Prosta4ok_ua[green]#[yellow]6336
|
credits.text = Створив [ROYAL]Anuken[] — [SKY]anukendev@gmail.com[]\n\nЄ питання по грі або проблеми з перекладом?\nЙдіть в офіційний сервер discord Mindustrу\nу канал #український.\nПерекладач: [blue]Prosta4ok_ua[green]#[yellow]6336
|
||||||
credits = Автори
|
credits = Творці
|
||||||
contributors = Перекладачі та помічники
|
contributors = Перекладачі та помічники
|
||||||
discord = Приєднуйтесь до нашого Discord!
|
discord = Приєднуйтесь до Mindustry Discord!
|
||||||
link.discord.description = Офіційний Discord-сервер Mindustry
|
link.discord.description = Офіційний Discord-сервер Mindustry
|
||||||
link.github.description = Вихідний код гри
|
link.github.description = Вихідний код гри
|
||||||
link.changelog.description = Список змін
|
link.changelog.description = Список змін
|
||||||
link.dev-builds.description = Нестабільні версії
|
link.dev-builds.description = Нестабільні версії
|
||||||
link.trello.description = Офіційна дошка Trello для запланованих функцій
|
link.trello.description = Офіційна дошка Trello для запланованих функцій
|
||||||
link.itch.io.description = Itch.io сторінка з веб-версією і завантаженнями
|
link.itch.io.description = Itch.io сторінка, на якій можна завантажити гру
|
||||||
link.google-play.description = Скачати для Android з Google Play
|
link.google-play.description = Завантажити для Android з Google Play
|
||||||
link.wiki.description = Офіційна вікі
|
link.wiki.description = Офіційна Mindustry wiki
|
||||||
linkfail = Не вдалося відкрити посилання!\nURL-адреса була скопійована у буфер обміну.
|
linkfail = Не вдалося відкрити посилання!\nURL-адреса скопійована в буфер обміну.
|
||||||
screenshot = Зняток мапи збережено у {0}
|
screenshot = Зняток мапи збережено в {0}
|
||||||
screenshot.invalid = Мапа занадто велика, тому, мабуть, не вистачає пам’яті для знятку екрана.
|
screenshot.invalid = Мапа занадто велика, тому, мабуть, не вистачає пам’яті для знятку мапи.
|
||||||
gameover = Гру закінчено
|
gameover = Гра завершена
|
||||||
gameover.pvp = [accent] {0}[] команда перемогла!
|
gameover.pvp = [accent] {0}[] команда перемогла!
|
||||||
highscore = [YELLOW]Новий рекорд!
|
highscore = [YELLOW]Новий рекорд!
|
||||||
|
|
||||||
|
load.sound = Звуки
|
||||||
|
load.map = Мапи
|
||||||
|
load.image = Зображення
|
||||||
|
load.content = Зміст
|
||||||
|
load.system = Система
|
||||||
|
|
||||||
stat.wave = Хвиль відбито:[accent] {0}
|
stat.wave = Хвиль відбито:[accent] {0}
|
||||||
stat.enemiesDestroyed = Ворогів вбито:[accent] {0}
|
stat.enemiesDestroyed = Ворогів знищено:[accent] {0}
|
||||||
stat.built = Будівель збудувано:[accent] {0}
|
stat.built = Будівель збудувано:[accent] {0}
|
||||||
stat.destroyed = Будівель знищено:[accent] {0}
|
stat.destroyed = Будівель знищено:[accent] {0}
|
||||||
stat.deconstructed = Будівель декоструйовано[accent] {0}
|
stat.deconstructed = Будівель декоструйовано[accent] {0}
|
||||||
stat.delivered = Ресурсів видобуто:
|
stat.delivered = Ресурсів запущено:
|
||||||
stat.rank = Фінальний рахунок: [accent]{0}
|
stat.rank = Фінальний рахунок: [accent]{0}
|
||||||
placeline = Ви вибрали блок.\nВи можете [accent]будувати в лінію[] [accent]утримуючи палець протягом декількох секунд[] і потім перетягуючи його.\n\n[scarlet]ЗРОБИ ЦЕ.
|
|
||||||
removearea = Ви вибрали режим видалення.\nВи можете [accent]видаляти блоки в обраній області[],[accent]утримуючи палець кілька секунд[] і потім перетягуючи його.\n\n[scarlet]ЗРОБИ ЦЕ.
|
|
||||||
launcheditems = [accent]Запущені предмети
|
launcheditems = [accent]Запущені предмети
|
||||||
map.delete = Ви впевнені, що хочете видалити мапу «[accent]{0}[]»?
|
map.delete = Ви впевнені, що хочете видалити мапу «[accent]{0}[]»?
|
||||||
level.highscore = Рекорд: [accent]{0}
|
level.highscore = Рекорд: [accent]{0}
|
||||||
@@ -32,53 +38,66 @@ level.select = Вибір мапи
|
|||||||
level.mode = Режим гри:
|
level.mode = Режим гри:
|
||||||
showagain = Не показувати знову до наступного сеансу
|
showagain = Не показувати знову до наступного сеансу
|
||||||
coreattack = < Ядро знаходиться під атакою! >
|
coreattack = < Ядро знаходиться під атакою! >
|
||||||
nearpoint = [[ [scarlet]ЗАЛИШТЕ ЦЮ ЗОНУ НЕГАЙНО[] ]\nАннігіляція неминуча.
|
nearpoint = [[ [scarlet]ЗАЛИШТЕ ЗОНУ ВИСАДКИ НЕГАЙНО[] ]\nАннігіляція неминуча.
|
||||||
database = База даних ядра
|
database = База даних ядра
|
||||||
savegame = Зберегти гру
|
savegame = Зберегти гру
|
||||||
loadgame = Завантажити гру
|
loadgame = Завантажити гру
|
||||||
joingame = Мережева гра
|
joingame = Мережева гра
|
||||||
addplayers = Дод./Видалити гравців
|
addplayers = Додати/Видалити гравців
|
||||||
customgame = Користувальницька гра
|
customgame = Користувацька гра
|
||||||
newgame = Нова гра
|
newgame = Нова гра
|
||||||
none = <нічого>
|
none = <нічого>
|
||||||
minimap = Міні-мапа
|
minimap = Мінімапа
|
||||||
close = Закрити
|
close = Закрити
|
||||||
website = Веб-сайт
|
website = Веб-сайт
|
||||||
quit = Вихід
|
quit = Вихід
|
||||||
maps = Мапи
|
maps = Мапи
|
||||||
|
maps.browse = Перегляд мап
|
||||||
continue = Продовжити
|
continue = Продовжити
|
||||||
maps.none = [LIGHT_GRAY]Мап не знайдено!
|
maps.none = [lightgray]Мап не знайдено!
|
||||||
|
invalid = Недійсне
|
||||||
|
preparingconfig = Підготовка конфігурації
|
||||||
|
preparingcontent = Підготовка вмісту
|
||||||
|
uploadingcontent = Вивантаження вмісту
|
||||||
|
uploadingpreviewfile = Вивантаження файлу передперегляду
|
||||||
|
committingchanges = Здійснення змін
|
||||||
|
done = Зроблено
|
||||||
|
|
||||||
about.button = Про гру
|
about.button = Про гру
|
||||||
name = Ім’я:
|
name = Ім’я:
|
||||||
noname = Спочатку придумайте[accent] собі ім’я[].
|
noname = Спочатку придумайте[accent] собі ім’я[].
|
||||||
filename = Ім’я файлу:
|
filename = Ім’я файлу:
|
||||||
unlocked = Новий контент розблоковано!
|
unlocked = Доступний новий вміст!
|
||||||
completed = [accent]Завершено
|
completed = [accent]Завершено
|
||||||
techtree = Технологічне дерево
|
techtree = Дерево технологій
|
||||||
research.list = [LIGHT_GRAY]Дослідження:
|
research.list = [lightgray]Дослідження:
|
||||||
research = Дослідження
|
research = Дослідження
|
||||||
researched = [LIGHT_GRAY]{0} досліджено.
|
researched = [lightgray]{0} досліджено.
|
||||||
players = Гравців на сервері: {0}
|
players = Гравців на сервері: {0}
|
||||||
players.single = {0} гравець на сервері
|
players.single = {0} гравець на сервері
|
||||||
server.closing = [accent]Закриття серверу...
|
server.closing = [accent]Закриття серверу…
|
||||||
server.kicked.kick = Ви були вигнані з сервера!
|
server.kicked.kick = Ви були вигнані з сервера!
|
||||||
|
server.kicked.whitelist = Ви не в білому спискі сервері.
|
||||||
server.kicked.serverClose = Сервер закрито.
|
server.kicked.serverClose = Сервер закрито.
|
||||||
|
server.kicked.vote = Вас було вигнано із сервера за допомогою голосування. Прощавайте.
|
||||||
server.kicked.clientOutdated = Застарілий клієнт! Оновіть свою гру!
|
server.kicked.clientOutdated = Застарілий клієнт! Оновіть свою гру!
|
||||||
server.kicked.serverOutdated = Застарілий сервер! Попросіть адміністратора серверу оновити сервер/гру!
|
server.kicked.serverOutdated = Застарілий сервер! Попросіть адміністратора серверу оновити сервер/гру!
|
||||||
server.kicked.banned = Ви заблоковані на цьому сервері.
|
server.kicked.banned = Ви заблоковані на цьому сервері.
|
||||||
server.kicked.recentKick = Нещодавно Вас вигнали. \nПочекайте трохи перед наступним підключенням.
|
server.kicked.typeMismatch = Цей сервер не сумісний з вашим типом збірки.
|
||||||
|
server.kicked.playerLimit = Цей сервер — заповнений. Дочекайтесь вільного слота.
|
||||||
|
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.versions = Your version:[accent] {0}[]\nServer version:[accent] {1}[]
|
server.versions = Ваша версія:[accent] {0}[]\nВерсія на сервері:[accent] {1}[]
|
||||||
host.info = Кнопка [accent]Сервер[] розміщує сервер на порті [scarlet]6567[]. \nКористувачі, які знаходяться у тій же [LIGHT_GRAY]WiFi або локальній мережі[] повинні бачити ваш сервер у своєму списку серверів.\n\nЯкщо ви хочете, щоб люди могли приєднуватися з будь-якої точки через IP, то [accent] переадресація порту [] обов’язкова.\n\n[LIGHT_GRAY] Примітка. Якщо у вас виникли проблеми з підключенням до вашої локальної гри, переконайтеся, що ви дозволили Mindustry доступ до вашої локальної мережі в налаштуваннях брандмауера. Зауважте, що публічні мережі іноді не дозволяють виявити сервер.
|
host.info = Кнопка [accent]Сервер[] розміщує сервер на порті [scarlet]6567[]. \nКористувачі, які знаходяться у тій же [lightgray]WiFi або локальній мережі[], повинні бачити ваш сервер у своєму списку серверів.\n\nЯкщо ви хочете, щоб люди могли приєднуватися з будь-якої точки через IP, то[accent] переадресація порту []обов’язкова.\n\n[lightgray]Примітка. Якщо у вас виникли проблеми з підключенням до вашої локальної гри, переконайтеся, що ви дозволили Mindustry доступ до вашої локальної мережі в налаштуваннях брандмауера. Зауважте, що публічні мережі іноді не дозволяють виявити сервер.
|
||||||
join.info = Тут Ви можете ввести [accent]IP серверу[] для підключення або знайти сервери у [accent]локальній мережі[] для підключення до них.\nПідтримується локальна мережа(LAN) і широкосмугова мережа(WAN).\n\n[LIGHT_GRAY] Примітка. Тут немає автоматичного глобального списку серверів; якщо ви хочете підключитися до когось через IP, вам доведеться попросити створювача серверу дати свій ip.
|
join.info = Тут ви можете ввести [accent]IP серверу[] для підключення або знайти сервери у [accent]локальній мережі[] для підключення до них.\nПідтримується локальна мережа(LAN) і широкосмугова мережа(WAN).\n\n[lightgray] Примітка. Тут немає автоматичного глобального списку серверів; якщо ви хочете підключитися до когось через IP, вам доведеться попросити створювача серверу дати свій ip.
|
||||||
hostserver = Запустити багатокористувальницький сервер
|
hostserver = Запустити багатокористувацький сервер
|
||||||
hostserver.mobile = Запустити\nсервер
|
hostserver.mobile = Запустити\nсервер
|
||||||
host = Сервер
|
host = Сервер
|
||||||
hosting = [accent]Відкриття серверу...
|
hosting = [accent]Відкриття серверу…
|
||||||
hosts.refresh = Оновити
|
hosts.refresh = Оновити
|
||||||
hosts.discovering = Пошук локальних ігор
|
hosts.discovering = Пошук локальних ігор
|
||||||
server.refreshing = Оновлення серверу
|
server.refreshing = Оновлення серверу
|
||||||
@@ -92,51 +111,51 @@ trace.mobile = Мобільний клієнт: [accent]{0}
|
|||||||
trace.modclient = Користувацький клієнт: [accent]{0}
|
trace.modclient = Користувацький клієнт: [accent]{0}
|
||||||
invalidid = Невірний ідентифікатор клієнта! Надішліть звіт про помилку.
|
invalidid = Невірний ідентифікатор клієнта! Надішліть звіт про помилку.
|
||||||
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 = Ви впевнені, що хочете видалити цей сервер?
|
||||||
server.edit = Редагувати сервер
|
server.edit = Редагувати сервер
|
||||||
server.outdated = [crimson]Застарілий сервер![]
|
server.outdated = [crimson]Застарілий сервер![]
|
||||||
server.outdated.client = [crimson]Застарілий клієнт![]
|
server.outdated.client = [crimson]Застарілий клієнт![]
|
||||||
server.version = [lightgray]Версія: {0}
|
server.version = [lightgray]Версія: {0}
|
||||||
server.custombuild = [yellow]Користувальницька збірка
|
server.custombuild = [yellow]Користувацька збірка
|
||||||
confirmban = Ви впевнені, що хочете заблокувати цього гравця?
|
confirmban = Ви дійсно хочете заблокувати цього гравця?
|
||||||
confirmkick = Ви впевнені, що хочете викинути цього гравця?
|
confirmkick = Ви дійсно хочете викинути цього гравця?
|
||||||
confirmunban = Ви впевнені, що хочете розблокувати цього гравця?
|
confirmunban = Ви дійсно хочете розблокувати цього гравця?
|
||||||
confirmadmin = Ви впевнені, що хочете зробити цього гравця адміністратором?
|
confirmadmin = Ви дійсно хочете зробити цього гравця адміністратором?
|
||||||
confirmunadmin = Ви впевнені, що хочете видалити статус адміністратора з цього гравця?
|
confirmunadmin = Ви дійсно хочете видалити статус адміністратора з цього гравця?
|
||||||
joingame.title = Приєднатися до гри
|
joingame.title = Приєднатися до гри
|
||||||
joingame.ip = IP:
|
joingame.ip = IP:
|
||||||
disconnect = Відключено.
|
disconnect = Відключено.
|
||||||
disconnect.data = Не вдалося завантажити дані світу!
|
disconnect.data = Не вдалося завантажити дані світу!
|
||||||
connecting = [accent]Підключення...
|
connecting = [accent]Підключення…
|
||||||
connecting.data = [accent]Завантаження даних світу...
|
connecting.data = [accent]Завантаження даних світу…
|
||||||
server.port = Порт:
|
server.port = Порт:
|
||||||
server.addressinuse = Ця адреса вже використовується!
|
server.addressinuse = Ця адреса вже використовується!
|
||||||
server.invalidport = Недійсний номер порту!
|
server.invalidport = Недійсний номер порту!
|
||||||
server.error = [crimson]Помилка створення серверу: [accent]{0}
|
server.error = [crimson]Помилка створення серверу: [accent]{0}
|
||||||
save.old = Це збереження для старої версії гри, і його більше не можна використовувати.\n\n [LIGHT_GRAY]Зворотна сумісність буде реалізована у фінальній версії 4.0.
|
save.old = Це збереження для старої версії гри, і його більше не можна використовувати.\n\n [lightgray]Зворотна сумісність буде реалізована у фінальній версії 4.0.
|
||||||
save.new = Нове збереження
|
save.new = Нове збереження
|
||||||
save.overwrite = Ви впевнені, що хочете перезаписати цей слот для збереження?
|
save.overwrite = Ви впевнені, що хочете перезаписати цей слот для збереження?
|
||||||
overwrite = Перезаписати
|
overwrite = Перезаписати
|
||||||
save.none = Збережень не знайдено!
|
save.none = Збережень не знайдено!
|
||||||
saveload = [accent]Збереження...
|
saveload = [accent]Збереження…
|
||||||
savefail = Не вдалося зберегти гру!
|
savefail = Не вдалося зберегти гру!
|
||||||
save.delete.confirm = Ви впевнені, що хочете видалити це збереження?
|
save.delete.confirm = Ви впевнені, що хочете видалити це збереження?
|
||||||
save.delete = Видалити
|
save.delete = Видалити
|
||||||
save.export = Експортувати збереження
|
save.export = Експортувати збереження
|
||||||
save.import.invalid = [accent]Це збереження недійсне!
|
save.import.invalid = [accent]Це збереження недійсне!
|
||||||
save.import.fail = [crimson]Не вдалося імпортувати збереження: [accent]{0}
|
save.import.fail = [crimson]Не вдалося імпортувати збереження: [accent]{0}
|
||||||
save.export.fail = [crimson]Не вдалося экспортувати збереження: [accent]{0}
|
save.export.fail = [crimson]Не вдалося експортувати збереження: [accent]{0}
|
||||||
save.import = Імпортувати збереження
|
save.import = Імпортувати збереження
|
||||||
save.newslot = Ім’я збереження:
|
save.newslot = Ім’я збереження:
|
||||||
save.rename = Перейменувати
|
save.rename = Перейменувати
|
||||||
save.rename.text = Нова назва:
|
save.rename.text = Нова назва:
|
||||||
selectslot = Виберіть збереження.
|
selectslot = Виберіть збереження.
|
||||||
slot = [accent]Слот {0}
|
slot = [accent]Слот {0}
|
||||||
save.corrupted = [accent]Збережений файл пошкоджено або э недійсним! \nЯкщо ви щойно оновили свою гру, це, мабуть, є зміною формату збереження та [scarlet] не є[] помилкою.
|
save.corrupted = [accent]Збережений файл пошкоджено або є недійсним! \nЯкщо ви щойно оновили свою гру, це, мабуть, є зміною формату збереження та [scarlet] не є[] помилкою.
|
||||||
empty = <Порожньо>
|
empty = <Порожньо>
|
||||||
on = Увімкнено
|
on = Увімкнено
|
||||||
off = Вимкнено
|
off = Вимкнено
|
||||||
@@ -156,23 +175,28 @@ cancel = Скасувати
|
|||||||
openlink = Відкрити посилання
|
openlink = Відкрити посилання
|
||||||
copylink = Скопіювати посилання
|
copylink = Скопіювати посилання
|
||||||
back = Назад
|
back = Назад
|
||||||
|
data.export = Експортувати дані
|
||||||
|
data.import = Импортувати дані
|
||||||
|
data.exported = Дані імпортовано.
|
||||||
|
data.invalid = Це не дійсні ігрові дані.
|
||||||
|
data.import.confirm = Імпорт зовнішніх даних видалить[scarlet] ВСІ[] віші поточні ігрові дані.\n[accent]Це не може бути скасоване![]\n\nЩойно дані імпортуються, гра негайно завершена.
|
||||||
classic.export = Експортувати класичні дані
|
classic.export = Експортувати класичні дані
|
||||||
classic.export.text = Класичне (версія 3.5 збірка 40) збереження або мапа були знайдені. Ви хочете експортувати ці дані в домашню папку телефону, для використання у додатку Mindustry Classic?
|
classic.export.text = Класичне (версія 3.5 збірка 40) збереження або мапа були знайдені. Ви хочете експортувати ці дані в домашню теку телефону, для використання у додатку Mindustry Classic?
|
||||||
quit.confirm = Ви впевнені, що хочете вийти?
|
quit.confirm = Ви впевнені, що хочете вийти?
|
||||||
quit.confirm.tutorial = Ви впевнені, що хочете вийти з навчання?
|
quit.confirm.tutorial = Ви впевнені, що хочете вийти з навчання?
|
||||||
loading = [accent]Завантаження...
|
loading = [accent]Завантаження…
|
||||||
saving = [accent]Збереження...
|
saving = [accent]Збереження…
|
||||||
wave = [accent]Хвиля {0}
|
wave = [accent]Хвиля {0}
|
||||||
wave.waiting = Хвиля через {0}
|
wave.waiting = Хвиля через {0}
|
||||||
wave.waveInProgress = [LIGHT_GRAY]Хвиля триває
|
wave.waveInProgress = [lightgray]Хвиля триває
|
||||||
waiting = Очікування...
|
waiting = Очікування…
|
||||||
waiting.players = Очікування гравців...
|
waiting.players = Очікування гравців…
|
||||||
wave.enemies = [LIGHT_GRAY]{0} ворог. залишилося
|
wave.enemies = [lightgray]{0} ворог. залишилося
|
||||||
wave.enemy = [LIGHT_GRAY]{0} ворог залишився
|
wave.enemy = [lightgray]{0} ворог залишився
|
||||||
loadimage = Завантажити зображення
|
loadimage = Завантажити зображення
|
||||||
saveimage = Зберегти зображення
|
saveimage = Зберегти зображення
|
||||||
unknown = Невідомо
|
unknown = Невідомо
|
||||||
custom = Користувальницька
|
custom = Користувацька
|
||||||
builtin = Вбудована
|
builtin = Вбудована
|
||||||
map.delete.confirm = Ви впевнені, що хочете видалити цю мапу? Цю дію неможливо скасувати!
|
map.delete.confirm = Ви впевнені, що хочете видалити цю мапу? Цю дію неможливо скасувати!
|
||||||
map.random = [accent]Випадкова мапа
|
map.random = [accent]Випадкова мапа
|
||||||
@@ -195,25 +219,25 @@ editor.newmap = Нова мапа
|
|||||||
waves.title = Хвилі
|
waves.title = Хвилі
|
||||||
waves.remove = Видалити
|
waves.remove = Видалити
|
||||||
waves.never = <ніколи>
|
waves.never = <ніколи>
|
||||||
waves.every = Кожен
|
waves.every = кожен
|
||||||
waves.waves = хвиля(і)
|
waves.waves = хвиля(і)
|
||||||
waves.perspawn = за появу
|
waves.perspawn = за появу
|
||||||
waves.to = до
|
waves.to = до
|
||||||
waves.boss = Бос
|
waves.boss = Бос
|
||||||
waves.preview = Попередній перегляд
|
waves.preview = Попередній перегляд
|
||||||
waves.edit = Редагувати ...
|
waves.edit = Редагувати …
|
||||||
waves.copy = Копіювати у буфер обміну
|
waves.copy = Копіювати у буфер обміну
|
||||||
waves.load = Завантажити з буфера обміну
|
waves.load = Завантажити з буфера обміну
|
||||||
waves.invalid = Недійсні хвилі у буфері обміну.
|
waves.invalid = Недійсні хвилі у буфері обміну.
|
||||||
waves.copied = Хвилі скопійовані.
|
waves.copied = Хвилі скопійовані.
|
||||||
waves.none = Вороги не були встановлені.\nЗазначимо, що пуста хвиля буде автоматично замінена звичайною хвилею.
|
waves.none = Вороги не були встановлені.\nЗазначимо, що пусті хвилі будуть автоматично замінені звичайною хвилею.
|
||||||
editor.default = [LIGHT_GRAY]<За замовчуванням>
|
editor.default = [lightgray]<За замовчуванням>
|
||||||
edit = Редагувати...
|
edit = Редагувати…
|
||||||
editor.name = Назва:
|
editor.name = Назва:
|
||||||
editor.spawn = Створити бойову одиницю
|
editor.spawn = Створити бойову одиницю
|
||||||
editor.removeunit = Видалити бойову одиницю
|
editor.removeunit = Видалити бойову одиницю
|
||||||
editor.teams = Команди
|
editor.teams = Команди
|
||||||
editor.errorload = Помилка завантаження зображення:[accent] {0}
|
editor.errorload = Помилка завантаження зображення:\n[accent] {0}
|
||||||
editor.errorsave = Помилка збереження зображення:\n[accent]{0}
|
editor.errorsave = Помилка збереження зображення:\n[accent]{0}
|
||||||
editor.errorimage = Це зображення, а не мапа. Не змінюйте розширення, очікуючи, що це запрацює.\n\nЯкщо Ви хочете імпортувати застарілку мапу, то використовуйте кнопку «Імпортувати застаріле зображення» у редакторі.
|
editor.errorimage = Це зображення, а не мапа. Не змінюйте розширення, очікуючи, що це запрацює.\n\nЯкщо Ви хочете імпортувати застарілку мапу, то використовуйте кнопку «Імпортувати застаріле зображення» у редакторі.
|
||||||
editor.errorlegacy = Ця мапа занадто стара і використовує попередній формат мапи, який більше не підтримується.
|
editor.errorlegacy = Ця мапа занадто стара і використовує попередній формат мапи, який більше не підтримується.
|
||||||
@@ -230,14 +254,14 @@ editor.saved = Збережено!
|
|||||||
editor.save.noname = Ваша мапа не має імені! Встановіть його в «Інформація про мапу».
|
editor.save.noname = Ваша мапа не має імені! Встановіть його в «Інформація про мапу».
|
||||||
editor.save.overwrite = Ваша мапа перезаписує вбудовану мапу! Виберіть інше ім’я в «Інформація про мапу».
|
editor.save.overwrite = Ваша мапа перезаписує вбудовану мапу! Виберіть інше ім’я в «Інформація про мапу».
|
||||||
editor.import.exists = [scarlet]Неможливо імпортувати:[] вбудована мапа з назвою «{0}» вже існує!
|
editor.import.exists = [scarlet]Неможливо імпортувати:[] вбудована мапа з назвою «{0}» вже існує!
|
||||||
editor.import = Імпорт...
|
editor.import = Імпорт…
|
||||||
editor.importmap = Імпортувати мапу
|
editor.importmap = Імпортувати мапу
|
||||||
editor.importmap.description = Імпортувати вже існуючу мапу
|
editor.importmap.description = Імпортувати вже існуючу мапу
|
||||||
editor.importfile = Імпортувати файл
|
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 = Експорт зображення місцевості
|
||||||
@@ -251,20 +275,20 @@ editor.overwrite = [accent]Попередження!\nЦе перезапису
|
|||||||
editor.overwrite.confirm = [scarlet]Попередження![] Мапа з такою назвою вже існує. Ви впевнені, що хочете переписати її?
|
editor.overwrite.confirm = [scarlet]Попередження![] Мапа з такою назвою вже існує. Ви впевнені, що хочете переписати її?
|
||||||
editor.selectmap = Виберіть мапу для завантаження:
|
editor.selectmap = Виберіть мапу для завантаження:
|
||||||
toolmode.replace = Замінити
|
toolmode.replace = Замінити
|
||||||
toolmode.replace.description = Малює тільки на суцільних блоках.
|
toolmode.replace.description = Малює тільки\nна суцільних блоках.
|
||||||
toolmode.replaceall = Замінити все
|
toolmode.replaceall = Замінити все
|
||||||
toolmode.replaceall.description = Замінює усі блоки на мапі.
|
toolmode.replaceall.description = Замінює усі блоки на мапі.
|
||||||
toolmode.orthogonal = Ортогональна
|
toolmode.orthogonal = Ортогональна
|
||||||
toolmode.orthogonal.description = Малює лише ортогональні лінії.
|
toolmode.orthogonal.description = Малює лише\nортогональні лінії.
|
||||||
toolmode.square = Прямокутник
|
toolmode.square = Прямокутник
|
||||||
toolmode.square.description = Прямокутна кисть.
|
toolmode.square.description = Прямокутна кисть.
|
||||||
toolmode.eraseores = Видалення руд
|
toolmode.eraseores = Видалення руд
|
||||||
toolmode.eraseores.description = Видалити тільки руди.
|
toolmode.eraseores.description = Видалити тільки руди.
|
||||||
toolmode.fillteams = Змінити блок в команді
|
toolmode.fillteams = Змінити блок в команді
|
||||||
toolmode.fillteams.description = Змінити блок в команді.
|
toolmode.fillteams.description = Змінює належність\nблоків до команди.
|
||||||
toolmode.drawteams = Змінити команду блока
|
toolmode.drawteams = Змінити команду блока
|
||||||
toolmode.drawteams.description = Змінює блок команди.
|
toolmode.drawteams.description = Змінює належність\nблока до команди.
|
||||||
filters.empty = [LIGHT_GRAY]Немає фільтрів! Додайте хоча б один за допомогою кнопки нижче.
|
filters.empty = [lightgray]Немає фільтрів! Додайте хоча б один за допомогою кнопки нижче.
|
||||||
filter.distort = Спотворення
|
filter.distort = Спотворення
|
||||||
filter.noise = Шум
|
filter.noise = Шум
|
||||||
filter.median = Медіана
|
filter.median = Медіана
|
||||||
@@ -273,18 +297,18 @@ filter.blend = Змішування
|
|||||||
filter.defaultores = Руди за замовчуванням
|
filter.defaultores = Руди за замовчуванням
|
||||||
filter.ore = Руда
|
filter.ore = Руда
|
||||||
filter.rivernoise = Річковий шум
|
filter.rivernoise = Річковий шум
|
||||||
filter.mirror = Дзеркало
|
filter.mirror = Відображення
|
||||||
filter.clear = Очистити
|
filter.clear = Очистити
|
||||||
filter.option.ignore = Ігнорувати
|
filter.option.ignore = Ігнорувати
|
||||||
filter.scatter = Розпилювач
|
filter.scatter = Сіяч
|
||||||
filter.terrain = Ландшафт
|
filter.terrain = Ландшафт
|
||||||
filter.option.scale = Масштаб
|
filter.option.scale = Масштаб фільтра
|
||||||
filter.option.chance = Шанс
|
filter.option.chance = Шанс
|
||||||
filter.option.mag = Величина
|
filter.option.mag = Сила застосування
|
||||||
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.block = Блок
|
filter.option.block = Блок
|
||||||
filter.option.floor = Поверхня
|
filter.option.floor = Поверхня
|
||||||
@@ -292,7 +316,7 @@ filter.option.flooronto = Цільова поверхня
|
|||||||
filter.option.wall = Стіна
|
filter.option.wall = Стіна
|
||||||
filter.option.ore = Руда
|
filter.option.ore = Руда
|
||||||
filter.option.floor2 = Друга поверхня
|
filter.option.floor2 = Друга поверхня
|
||||||
filter.option.threshold2 = Вторинний спад
|
filter.option.threshold2 = Вторинний граничний порог
|
||||||
filter.option.radius = Радіус
|
filter.option.radius = Радіус
|
||||||
filter.option.percentile = Спад
|
filter.option.percentile = Спад
|
||||||
width = Ширина:
|
width = Ширина:
|
||||||
@@ -315,38 +339,38 @@ donate = Пожертву\nвання
|
|||||||
abandon = Покинути
|
abandon = Покинути
|
||||||
abandon.text = Ця зона і всі її ресурси будуть втрачені.
|
abandon.text = Ця зона і всі її ресурси будуть втрачені.
|
||||||
locked = Заблоковано
|
locked = Заблоковано
|
||||||
complete = [LIGHT_GRAY]Досягнута:
|
complete = [lightgray]Досягнута:
|
||||||
zone.requirement = Хвиля {0} у зоні {1}
|
zone.requirement = Хвиля {0} у зоні {1}
|
||||||
resume = Відновити зону:\n[LIGHT_GRAY]{0}
|
resume = Відновити зону:\n[lightgray]{0}
|
||||||
bestwave = [LIGHT_GRAY]Найкраща хвиля: {0}
|
bestwave = [lightgray]Найкраща хвиля: {0}
|
||||||
launch = < ЗАПУСК >
|
launch = < ЗАПУСК >
|
||||||
launch.title = Запуск вдалий
|
launch.title = Запуск вдалий
|
||||||
launch.next = [LIGHT_GRAY]наступна можливість на {0}-тій хвилі
|
launch.next = [lightgray]наступна можливість на {0}-тій хвилі
|
||||||
launch.unable2 = [scarlet]ЗАПУСК неможливий.[]
|
launch.unable2 = [scarlet]ЗАПУСК неможливий.[]
|
||||||
launch.confirm = Це видалить всі ресурси у Вашому ядрі.\nВи не зможете повернутися до цієї бази.
|
launch.confirm = Це видалить всі ресурси у Вашому ядрі.\nВи не зможете повернутися до цієї бази.
|
||||||
launch.skip.confirm = Якщо Ви пропустите зараз, Ви не зможете не запускати до більш пізніх хвиль.
|
launch.skip.confirm = Якщо Ви пропустите зараз, Ви не зможете не запускати до більш пізніх хвиль.
|
||||||
uncover = Розкрити
|
uncover = Розкрити
|
||||||
configure = Вивантажити конфігурацію
|
configure = Вивантажити конфігурацію
|
||||||
configure.locked = [LIGHT_GRAY]Можливість розблокувати вивантаження ресурсів буде доступна на {0}-тій хвилі.
|
configure.locked = [lightgray]Можливість розблокувати вивантаження ресурсів буде доступна на {0}-тій хвилі.
|
||||||
zone.unlocked = Зона «[LIGHT_GRAY]{0}» тепер розблокована.
|
zone.unlocked = Зона «[lightgray]{0}» тепер розблокована.
|
||||||
zone.requirement.complete = Ви досягли {0}-тої хвилі,\nВимоги до зони «{1}» виконані.
|
zone.requirement.complete = Ви досягли {0}-тої хвилі,\nВимоги до зони «{1}» виконані.
|
||||||
zone.config.complete = Ви досягли {0}-тої хвилі.\nМожливість вивантаження ресурсів тепер розблокована.
|
zone.config.complete = Ви досягли {0}-тої хвилі.\nМожливість вивантаження ресурсів тепер розблокована.
|
||||||
zone.resources = Виявлені ресурси:
|
zone.resources = Виявлені ресурси:
|
||||||
zone.objective = [lightgray]Мета: [accent]{0}
|
zone.objective = [lightgray]Мета: [accent]{0}
|
||||||
zone.objective.survival = Вижити
|
zone.objective.survival = Вижити
|
||||||
zone.objective.attack = Знищити вороже ядро
|
zone.objective.attack = Знищити вороже ядро
|
||||||
add = Додати...
|
add = Додати…
|
||||||
boss.health = Здоров’я босу
|
boss.health = Здоров’я босу
|
||||||
connectfail = [crimson]Помилка підключення: [accent]{0}
|
connectfail = [crimson]Помилка підключення: [accent]{0}
|
||||||
error.unreachable = Сервер не доступний.
|
error.unreachable = Сервер не доступний.
|
||||||
error.invalidaddress = Некоректна адреса.
|
error.invalidaddress = Некоректна адреса.
|
||||||
error.timedout = Час очікування вийшов.\nПереконайтеся, що адреса коректна і що власник сервера налаштував переадресацію порту!
|
error.timedout = Час очікування вийшов.\nПереконайтеся, що адреса коректна і що власник сервера налаштував переадресацію порту!
|
||||||
error.mismatch = Помилка пакету:\nможливе невідповідність версії клієнта/сервера.\nПереконайтеся, що у Вас та у володара сервера встановлена остання версія Mindustry!
|
error.mismatch = Помилка пакету:\nможливе невідповідність версії клієнта/сервера.\nПереконайтеся, що у вас та у володара сервера встановлена остання версія Mindustry!
|
||||||
error.alreadyconnected = Ви вже підключилися.
|
error.alreadyconnected = Ви вже підключилися.
|
||||||
error.mapnotfound = Файл мапи не знайдено
|
error.mapnotfound = Файл мапи не знайдено
|
||||||
error.io = Мережева помилка введення-виведення
|
error.io = Мережева помилка введення-виведення
|
||||||
error.any = Невідома мережева помилка
|
error.any = Невідома мережева помилка
|
||||||
error.bloom = Не вдалося ініціалізувати світіння.\nВаш пристрій, мабуть, не підтримує це.
|
error.bloom = Не вдалося ініціалізувати цвітіння.\nВаш пристрій, мабуть, не підтримує це.
|
||||||
zone.groundZero.name = Нульова земля
|
zone.groundZero.name = Нульова земля
|
||||||
zone.desertWastes.name = Пустельні відходи
|
zone.desertWastes.name = Пустельні відходи
|
||||||
zone.craters.name = Кратери
|
zone.craters.name = Кратери
|
||||||
@@ -376,13 +400,14 @@ zone.fungalPass.description = Перехідна зона між високим
|
|||||||
zone.impact0078.description = <вставити опис тут>
|
zone.impact0078.description = <вставити опис тут>
|
||||||
zone.crags.description = <вставити опис тут>
|
zone.crags.description = <вставити опис тут>
|
||||||
settings.language = Мова
|
settings.language = Мова
|
||||||
|
settings.data = Ігрові дані
|
||||||
settings.reset = Скинути за замовчуванням
|
settings.reset = Скинути за замовчуванням
|
||||||
settings.rebind = Зміна
|
settings.rebind = Зміна
|
||||||
settings.controls = Керування
|
settings.controls = Керування
|
||||||
settings.game = Гра
|
settings.game = Гра
|
||||||
settings.sound = Звук
|
settings.sound = Звук
|
||||||
settings.graphics = Графіка
|
settings.graphics = Графіка
|
||||||
settings.cleardata = Очистити дані...
|
settings.cleardata = Очистити дані…
|
||||||
settings.clear.confirm = Ви впевнені, що хочете очистити ці дані?\nЦя дія не може бути скасовано!
|
settings.clear.confirm = Ви впевнені, що хочете очистити ці дані?\nЦя дія не може бути скасовано!
|
||||||
settings.clearall.confirm = [scarlet]УВАГА![]\nЦе очистить всі дані, включаючи збереження, мапи, розблоковане та налаштування керування.\nПісля того, як ви натиснете ОК, гра видалить усі дані та автоматично закриється.
|
settings.clearall.confirm = [scarlet]УВАГА![]\nЦе очистить всі дані, включаючи збереження, мапи, розблоковане та налаштування керування.\nПісля того, як ви натиснете ОК, гра видалить усі дані та автоматично закриється.
|
||||||
settings.clearunlocks = Очистити розблоковане
|
settings.clearunlocks = Очистити розблоковане
|
||||||
@@ -397,7 +422,7 @@ attackpvponly = [scarlet]Наявне тільки у режимах атаки/
|
|||||||
blocks.input = Вхід
|
blocks.input = Вхід
|
||||||
blocks.output = Вихід
|
blocks.output = Вихід
|
||||||
blocks.booster = Прискорювач
|
blocks.booster = Прискорювач
|
||||||
block.unknown = [LIGHT_GRAY]???
|
block.unknown = [lightgray]???
|
||||||
blocks.powercapacity = Місткість енергії
|
blocks.powercapacity = Місткість енергії
|
||||||
blocks.powershot = Енергія/постріл
|
blocks.powershot = Енергія/постріл
|
||||||
blocks.damage = Шкода
|
blocks.damage = Шкода
|
||||||
@@ -474,7 +499,7 @@ setting.shadows.name = Тіні
|
|||||||
setting.linear.name = Лінійна фільтрація
|
setting.linear.name = Лінійна фільтрація
|
||||||
setting.animatedwater.name = Анімована вода
|
setting.animatedwater.name = Анімована вода
|
||||||
setting.animatedshields.name = Анімовані щити
|
setting.animatedshields.name = Анімовані щити
|
||||||
setting.antialias.name = Згладжування[LIGHT_GRAY] (потребує перезапуску)[]
|
setting.antialias.name = Згладжування[lightgray] (потребує перезапуску)[]
|
||||||
setting.indicators.name = Показувати у сторону ворогів та союзників
|
setting.indicators.name = Показувати у сторону ворогів та союзників
|
||||||
setting.autotarget.name = Авто-стрільба
|
setting.autotarget.name = Авто-стрільба
|
||||||
setting.keyboard.name = Миш+Керування з клавіатури
|
setting.keyboard.name = Миш+Керування з клавіатури
|
||||||
@@ -495,11 +520,11 @@ setting.sensitivity.name = Чутливість контролера
|
|||||||
setting.saveinterval.name = Інтервал збереження
|
setting.saveinterval.name = Інтервал збереження
|
||||||
setting.seconds = {0} сек.
|
setting.seconds = {0} сек.
|
||||||
setting.fullscreen.name = Повноекранний режим
|
setting.fullscreen.name = Повноекранний режим
|
||||||
setting.borderlesswindow.name = Вікно без полів[LIGHT_GRAY] (може потребувати перезапуску)
|
setting.borderlesswindow.name = Вікно без полів[lightgray] (може потребувати перезапуску)
|
||||||
setting.fps.name = Показувати FPS
|
setting.fps.name = Показувати FPS
|
||||||
setting.vsync.name = Вертикальна синхронізація
|
setting.vsync.name = Вертикальна синхронізація
|
||||||
setting.lasers.name = Показувати енергію лазерів
|
setting.lasers.name = Показувати енергію лазерів
|
||||||
setting.pixelate.name = Пікселізація[LIGHT_GRAY] (вимикає анімації)
|
setting.pixelate.name = Пікселізація[lightgray] (вимикає анімації)
|
||||||
setting.minimap.name = Показувати міні-мапу
|
setting.minimap.name = Показувати міні-мапу
|
||||||
setting.musicvol.name = Гучність музики
|
setting.musicvol.name = Гучність музики
|
||||||
setting.ambientvol.name = Звуки навколишнього середовища
|
setting.ambientvol.name = Звуки навколишнього середовища
|
||||||
@@ -507,9 +532,10 @@ setting.mutemusic.name = Заглушити музику
|
|||||||
setting.sfxvol.name = Гучність звукових ефектів
|
setting.sfxvol.name = Гучність звукових ефектів
|
||||||
setting.mutesound.name = Заглушити звук
|
setting.mutesound.name = Заглушити звук
|
||||||
setting.crashreport.name = Відсилати анонімні звіти про аварійне завершення гри
|
setting.crashreport.name = Відсилати анонімні звіти про аварійне завершення гри
|
||||||
|
setting.savecreate.name = Автоматичне створення збережень
|
||||||
setting.chatopacity.name = Непрозорість чату
|
setting.chatopacity.name = Непрозорість чату
|
||||||
setting.playerchat.name = Відображати чат у грі
|
setting.playerchat.name = Відображати чат у грі
|
||||||
uiscale.reset = Масштаб користувальницького інтерфейсу було змінено.\nНатисніть «ОК» для підтверждення цього масшатабу.\n[scarlet]Повернення налаштувань і вихід через[accent] {0}[] ...
|
uiscale.reset = Масштаб користувальницького інтерфейсу було змінено.\nНатисніть «ОК» для підтверждення цього масшатабу.\n[scarlet]Повернення налаштувань і вихід через[accent] {0}[] …
|
||||||
uiscale.cancel = Скасувати & Вийти
|
uiscale.cancel = Скасувати & Вийти
|
||||||
setting.bloom.name = Світіння
|
setting.bloom.name = Світіння
|
||||||
keybind.title = Налаштування керування
|
keybind.title = Налаштування керування
|
||||||
@@ -522,11 +548,12 @@ command.retreat = Відступити
|
|||||||
command.patrol = Патрулювати
|
command.patrol = Патрулювати
|
||||||
keybind.gridMode.name = Вибрати блок
|
keybind.gridMode.name = Вибрати блок
|
||||||
keybind.gridModeShift.name = Вибрати категорію
|
keybind.gridModeShift.name = Вибрати категорію
|
||||||
keybind.press = Натисніть клавішу...
|
keybind.press = Натисніть клавішу…
|
||||||
keybind.press.axis = Натисніть клавішу...
|
keybind.press.axis = Натисніть клавішу…
|
||||||
keybind.screenshot.name = Зняток мапи
|
keybind.screenshot.name = Зняток мапи
|
||||||
keybind.move_x.name = Рух по осі x
|
keybind.move_x.name = Рух по осі x
|
||||||
keybind.move_y.name = Рух по осі x
|
keybind.move_y.name = Рух по осі y
|
||||||
|
keybind.fullscreen.name = Повноекранний
|
||||||
keybind.select.name = Вибір/Постріл
|
keybind.select.name = Вибір/Постріл
|
||||||
keybind.diagonal_placement.name = Діагональне розміщення
|
keybind.diagonal_placement.name = Діагональне розміщення
|
||||||
keybind.pick.name = Вибрати блок
|
keybind.pick.name = Вибрати блок
|
||||||
@@ -570,13 +597,13 @@ rules.unithealthmultiplier = Множник здоров’я бойов. од.
|
|||||||
rules.playerhealthmultiplier = Множник здоров’я гравця
|
rules.playerhealthmultiplier = Множник здоров’я гравця
|
||||||
rules.playerdamagemultiplier = Множник шкоди гравця
|
rules.playerdamagemultiplier = Множник шкоди гравця
|
||||||
rules.unitdamagemultiplier = Множник шкоди бойових одиниць
|
rules.unitdamagemultiplier = Множник шкоди бойових одиниць
|
||||||
rules.enemycorebuildradius = Радіус захисту для ворожого ядра:[LIGHT_GRAY] (блоків)
|
rules.enemycorebuildradius = Радіус захисту для ворожого ядра:[lightgray] (блоків)
|
||||||
rules.respawntime = Час відродження:[LIGHT_GRAY] (sec)
|
rules.respawntime = Час відродження:[lightgray] (sec)
|
||||||
rules.wavespacing = Інтервал хвиль:[LIGHT_GRAY] (sec)
|
rules.wavespacing = Інтервал хвиль:[lightgray] (sec)
|
||||||
rules.buildcostmultiplier = Множник затрат на будівництво
|
rules.buildcostmultiplier = Множник затрат на будівництво
|
||||||
rules.buildspeedmultiplier = Множник швидкості будування
|
rules.buildspeedmultiplier = Множник швидкості будування
|
||||||
rules.waitForWaveToEnd = Хвилі чекають на ворогів
|
rules.waitForWaveToEnd = Хвилі чекають на ворогів
|
||||||
rules.dropzoneradius = Радіус зони висадки:[LIGHT_GRAY] (блоків)
|
rules.dropzoneradius = Радіус зони висадки:[lightgray] (блоків)
|
||||||
rules.respawns = Максимальна кількість відроджень за хвилю
|
rules.respawns = Максимальна кількість відроджень за хвилю
|
||||||
rules.limitedRespawns = Обмеження відроджень
|
rules.limitedRespawns = Обмеження відроджень
|
||||||
rules.title.waves = Хвилі
|
rules.title.waves = Хвилі
|
||||||
@@ -631,21 +658,23 @@ mech.trident-ship.name = Тризубець
|
|||||||
mech.trident-ship.weapon = Бомби
|
mech.trident-ship.weapon = Бомби
|
||||||
mech.glaive-ship.name = Спис
|
mech.glaive-ship.name = Спис
|
||||||
mech.glaive-ship.weapon = Вогняний кулемет
|
mech.glaive-ship.weapon = Вогняний кулемет
|
||||||
item.explosiveness = [LIGHT_GRAY]Вибухонебезпечність: {0}%
|
item.explosiveness = [lightgray]Вибухонебезпечність: {0}%
|
||||||
item.flammability = [LIGHT_GRAY]Вогненебезпечність: {0}%
|
item.flammability = [lightgray]Вогненебезпечність: {0}%
|
||||||
item.radioactivity = [LIGHT_GRAY]Радіоактивність: {0}%
|
item.radioactivity = [lightgray]Радіоактивність: {0}%
|
||||||
unit.health = [LIGHT_GRAY]Здоров’я: {0}
|
unit.health = [lightgray]Здоров’я: {0}
|
||||||
unit.speed = [LIGHT_GRAY]Швидкість: {0}
|
unit.speed = [lightgray]Швидкість: {0}
|
||||||
mech.weapon = [LIGHT_GRAY]Зброя: {0}
|
mech.weapon = [lightgray]Зброя: {0}
|
||||||
mech.health = [LIGHT_GRAY]Здоров’я: {0}
|
mech.health = [lightgray]Здоров’я: {0}
|
||||||
mech.itemcapacity = [LIGHT_GRAY]Місткість елементів: {0}
|
mech.itemcapacity = [lightgray]Місткість елементів: {0}
|
||||||
mech.minespeed = [LIGHT_GRAY]Швидкість видобутку: {0}%
|
mech.minespeed = [lightgray]Швидкість видобутку: {0}%
|
||||||
mech.minepower = [LIGHT_GRAY]Потужність видобутку: {0}
|
mech.minepower = [lightgray]Потужність видобутку: {0}
|
||||||
mech.ability = [LIGHT_GRAY]Здібність: {0}
|
mech.ability = [lightgray]Здібність: {0}
|
||||||
mech.buildspeed = [LIGHT_GRAY]Швидкість будування: {0}%
|
mech.buildspeed = [lightgray]Швидкість будування: {0}%
|
||||||
liquid.heatcapacity = [LIGHT_GRAY]Теплоємність: {0}
|
liquid.heatcapacity = [lightgray]Теплоємність: {0}
|
||||||
liquid.viscosity = [LIGHT_GRAY]В’язкість: {0}
|
liquid.viscosity = [lightgray]В’язкість: {0}
|
||||||
liquid.temperature = [LIGHT_GRAY]Температура: {0}
|
liquid.temperature = [lightgray]Температура: {0}
|
||||||
|
block.sand-boulder.name = Sand Boulder
|
||||||
|
block.grass.name = Трава
|
||||||
block.sand-boulder.name = Пісочний валун
|
block.sand-boulder.name = Пісочний валун
|
||||||
block.grass.name = Трава
|
block.grass.name = Трава
|
||||||
block.salt.name = Сіль
|
block.salt.name = Сіль
|
||||||
@@ -672,7 +701,7 @@ block.thruster.name = Штовхач
|
|||||||
block.kiln.name = Піч
|
block.kiln.name = Піч
|
||||||
block.graphite-press.name = Графітний прес
|
block.graphite-press.name = Графітний прес
|
||||||
block.multi-press.name = Мульти-прес
|
block.multi-press.name = Мульти-прес
|
||||||
block.constructing = {0}\n[LIGHT_GRAY](В процесі)
|
block.constructing = {0}\n[lightgray](В процесі)
|
||||||
block.spawn.name = Місце появи ворога
|
block.spawn.name = Місце появи ворога
|
||||||
block.core-shard.name = Ядро «Осколок»
|
block.core-shard.name = Ядро «Осколок»
|
||||||
block.core-foundation.name = Ядро «Штаб»
|
block.core-foundation.name = Ядро «Штаб»
|
||||||
@@ -790,6 +819,7 @@ block.blast-mixer.name = Мішалка вибухонебезпечного з
|
|||||||
block.solar-panel.name = Сонячна панель
|
block.solar-panel.name = Сонячна панель
|
||||||
block.solar-panel-large.name = Велика сонячна панель
|
block.solar-panel-large.name = Велика сонячна панель
|
||||||
block.oil-extractor.name = Нафтова вежа
|
block.oil-extractor.name = Нафтова вежа
|
||||||
|
block.command-center.name = Командний центр
|
||||||
block.draug-factory.name = Завод дронів «Драугр»
|
block.draug-factory.name = Завод дронів «Драугр»
|
||||||
block.spirit-factory.name = Завод дронів-ремонтників «Привид»
|
block.spirit-factory.name = Завод дронів-ремонтників «Привид»
|
||||||
block.phantom-factory.name = Завод дронів-будівників «Фантом»
|
block.phantom-factory.name = Завод дронів-будівників «Фантом»
|
||||||
@@ -1012,6 +1042,7 @@ block.ripple.description = Надзвичайно потужна артилер
|
|||||||
block.cyclone.description = Велика протиповітряна та протиземна башта. Підпалює вибухонебезпечними грудками скупчення ворогів.
|
block.cyclone.description = Велика протиповітряна та протиземна башта. Підпалює вибухонебезпечними грудками скупчення ворогів.
|
||||||
block.spectre.description = Масивна двоствольна гармата. Стріляє великими бронебійними кулями в повітряні та наземні цілі.
|
block.spectre.description = Масивна двоствольна гармата. Стріляє великими бронебійними кулями в повітряні та наземні цілі.
|
||||||
block.meltdown.description = Масивна лазерна гармата. Заряджає і стріляє стійким лазерним променем у сусідніх ворогів. Для роботи потрібен теплоносій.
|
block.meltdown.description = Масивна лазерна гармата. Заряджає і стріляє стійким лазерним променем у сусідніх ворогів. Для роботи потрібен теплоносій.
|
||||||
|
block.command-center.description = Наказує бойовим одиницям пересуватися по всій мапі.\nНаявні команди: патрулювання, атакувати вороже ядро, відступити до ядра/заводу. Якщо ворожого ядра немає, то бойові одиниці будуть патрулювати за замовчуванням, коли була застосована команда атакувати.
|
||||||
block.draug-factory.description = Виробляє дронів, які видобувають ресурси.
|
block.draug-factory.description = Виробляє дронів, які видобувають ресурси.
|
||||||
block.spirit-factory.description = Виробляє дронів, які ремонтують блоки.
|
block.spirit-factory.description = Виробляє дронів, які ремонтують блоки.
|
||||||
block.phantom-factory.description = Виробляє дронів, які допомогають у будівництві.
|
block.phantom-factory.description = Виробляє дронів, які допомогають у будівництві.
|
||||||
|
|||||||
@@ -16,6 +16,11 @@ screenshot.invalid = 地图太大,可能没有足够的内存用于截图。
|
|||||||
gameover = 你的核心被摧毁了!
|
gameover = 你的核心被摧毁了!
|
||||||
gameover.pvp = [accent] {0}[] 队获胜!
|
gameover.pvp = [accent] {0}[] 队获胜!
|
||||||
highscore = [accent]新纪录!
|
highscore = [accent]新纪录!
|
||||||
|
load.sound = 音乐加载中
|
||||||
|
load.map = 地图加载中
|
||||||
|
load.image = 图片加载中
|
||||||
|
load.content = 内容加载中
|
||||||
|
load.system = 系统加载中
|
||||||
stat.wave = 战胜的波数:[accent]{0}
|
stat.wave = 战胜的波数:[accent]{0}
|
||||||
stat.enemiesDestroyed = 消灭的敌人:[accent]{0}
|
stat.enemiesDestroyed = 消灭的敌人:[accent]{0}
|
||||||
stat.built = 建造的建筑:[accent]{0}
|
stat.built = 建造的建筑:[accent]{0}
|
||||||
@@ -23,8 +28,6 @@ stat.destroyed = 摧毁的建筑:[accent]{0}
|
|||||||
stat.deconstructed = 拆除的建筑:[accent]{0}
|
stat.deconstructed = 拆除的建筑:[accent]{0}
|
||||||
stat.delivered = 发射的资源:
|
stat.delivered = 发射的资源:
|
||||||
stat.rank = 最终等级:[accent]{0}
|
stat.rank = 最终等级:[accent]{0}
|
||||||
placeline = 你选择了一个方块。\n你可以[accent]长按几秒钟[]并向一个方向拖动来[accent]直线放置方块[]。\n试试看吧。
|
|
||||||
removearea = 你选择了拆除模式。\n你可以[accent]长按几秒钟[]并拖动来[accent]删除矩形内的方块[]。\n试试看吧。
|
|
||||||
launcheditems = [accent]发射的资源
|
launcheditems = [accent]发射的资源
|
||||||
map.delete = 确定要删除 "[accent]{0}[]" 地图吗?
|
map.delete = 确定要删除 "[accent]{0}[]" 地图吗?
|
||||||
level.highscore = 最高分:[accent]{0}
|
level.highscore = 最高分:[accent]{0}
|
||||||
@@ -43,7 +46,7 @@ newgame = 新游戏
|
|||||||
none = <无>
|
none = <无>
|
||||||
minimap = 小地图
|
minimap = 小地图
|
||||||
close = 关闭
|
close = 关闭
|
||||||
website = Website
|
website = 官网
|
||||||
quit = 退出
|
quit = 退出
|
||||||
maps = 地图
|
maps = 地图
|
||||||
continue = 继续
|
continue = 继续
|
||||||
@@ -61,18 +64,21 @@ researched = [LIGHT_GRAY]{0}己研究。
|
|||||||
players = {0} 玩家在线
|
players = {0} 玩家在线
|
||||||
players.single = {0}玩家在线
|
players.single = {0}玩家在线
|
||||||
server.closing = [accent]正在关闭服务器……
|
server.closing = [accent]正在关闭服务器……
|
||||||
server.kicked.kick = 你被踢出服务器了!
|
server.kicked.kick = 你被踢出了服务器。
|
||||||
|
server.kicked.whitelist = 你不在白名单中。
|
||||||
server.kicked.serverClose = 服务器已关闭。
|
server.kicked.serverClose = 服务器已关闭。
|
||||||
|
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.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.versions = Your version:[accent] {0}[]\nServer version:[accent] {1}[]
|
server.versions = 客户端版本:[accent] {0}[]\n服务器版本:[accent] {1}[]
|
||||||
host.info = [accent]创建局域网游戏[]按钮会在[scarlet]6567[]端口运行一个服务器。[]\n任何在同一个[LIGHT_GRAY]wifi或本地网络[]下的人都应该可以在服务器列表中看到你的服务器。\n\n如果你想让别人在任何地方都能通过IP地址连接,你需要设定[accent]端口转发[]。\n\n[LIGHT_GRAY]注意:如果某人无法连接到你的局域网游戏,请确保你在防火墙设置里允许了Mindustry访问本地网络。
|
host.info = [accent]创建局域网游戏[]按钮会在[scarlet]6567[]端口运行一个服务器。[]\n任何在同一个[LIGHT_GRAY]wifi或本地网络[]下的人都应该可以在服务器列表中看到你的服务器。\n\n如果你想让别人在任何地方都能通过IP地址连接,你需要设定[accent]端口转发[]。\n\n[LIGHT_GRAY]注意:如果某人无法连接到你的局域网游戏,请确保你在防火墙设置里允许了Mindustry访问本地网络。
|
||||||
join.info = 此时,可以输入[accent]服务器的IP地址[]来连接,或寻找[accent]本地网络[]中的服务器来连接。\n局域网或广域网多人游戏都被支持。\n\n[LIGHT_GRAY]注意:没有全球服务器列表;如果你想通过IP地址连接某个服务器,你需要向房主询问IP地址。
|
join.info = 此时,可以输入[accent]服务器的IP地址[]来连接,或寻找[accent]本地网络[]中的服务器来连接。\n局域网或广域网多人游戏都被支持。\n\n[LIGHT_GRAY]注意:没有全球服务器列表;如果你想通过IP地址连接某个服务器,你需要向房主询问IP地址。
|
||||||
hostserver = 创建服务器
|
hostserver = 创建服务器
|
||||||
@@ -88,18 +94,18 @@ trace = 跟踪玩家
|
|||||||
trace.playername = 玩家名称:[accent]{0}
|
trace.playername = 玩家名称:[accent]{0}
|
||||||
trace.ip = IP地址:[accent]{0}
|
trace.ip = IP地址:[accent]{0}
|
||||||
trace.id = 唯一的ID:[accent]{0}
|
trace.id = 唯一的ID:[accent]{0}
|
||||||
trace.mobile = Mobile Client: [accent]{0}
|
trace.mobile = 移动客户端:[accent]{0}
|
||||||
trace.modclient = 定制版客户端:[accent]{0}
|
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 = 你确定要删除这个服务器吗?
|
||||||
server.edit = 编辑服务器
|
server.edit = 编辑服务器
|
||||||
server.outdated = [crimson]过旧的服务器![]
|
server.outdated = [crimson]服务器过旧![]
|
||||||
server.outdated.client = [crimson]过旧的客户端![]
|
server.outdated.client = [crimson]客户端过旧![]
|
||||||
server.version = [lightgray]版本:{0} {1}
|
server.version = [lightgray]版本:{0} {1}
|
||||||
server.custombuild = [yellow]定制版
|
server.custombuild = [yellow]定制版
|
||||||
confirmban = 确认拉黑这名玩家?
|
confirmban = 确认拉黑这名玩家?
|
||||||
@@ -156,11 +162,16 @@ cancel = 取消
|
|||||||
openlink = 打开链接
|
openlink = 打开链接
|
||||||
copylink = 复制链接
|
copylink = 复制链接
|
||||||
back = 返回
|
back = 返回
|
||||||
classic.export = Export Classic Data
|
data.export = 导出数据
|
||||||
classic.export.text = [accent]Mindustry[] has just had a major update.\nClassic (v3.5 build 40) save or map data has been detected. Would you like to export these saves to your phone's home folder, for use in the Mindustry Classic app?
|
data.import = 导入数据
|
||||||
|
data.exported = 数据已导入。
|
||||||
|
data.invalid = 非有效游戏数据。
|
||||||
|
data.import.confirm = 导入外部游戏数据讲覆盖本地[scarlet]全部[]游戏数据。\n[accent]此操作无法撤销![]\n\n数据导入后将自动退出游戏。
|
||||||
|
classic.export = 导出老版本数据
|
||||||
|
classic.export.text = [accent]Mindustry []有了一个重要的更新。\n检测到此为老版本(v3.5 build 40)的存档或地图。是否要将这些保存导出到手机的主文件夹中,以便在 Mindustry 老版本应用程序中使用?
|
||||||
quit.confirm = 确定退出?
|
quit.confirm = 确定退出?
|
||||||
quit.confirm.tutorial = Are you sure you know what you're doing?\nThe tutorial can be re-taken in[accent] Settings->Game->Re-Take Tutorial.[]
|
quit.confirm.tutorial = 你确定不玩教程就开始游戏?\n教程可以通过[accent]设置->游戏->重新游玩教程[]来再次游玩。
|
||||||
loading = [accent]加载中……
|
loading = [accent]老滑稽祈祷中……
|
||||||
saving = [accent]保存中……
|
saving = [accent]保存中……
|
||||||
wave = [accent]波次 {0}
|
wave = [accent]波次 {0}
|
||||||
wave.waiting = [LIGHT_GRAY]下一波将在{0}秒后到来
|
wave.waiting = [LIGHT_GRAY]下一波将在{0}秒后到来
|
||||||
@@ -229,7 +240,7 @@ editor.savemap = 保存地图
|
|||||||
editor.saved = 已保存!
|
editor.saved = 已保存!
|
||||||
editor.save.noname = 你的地图没有名字!在“地图信息”菜单里设置一个。
|
editor.save.noname = 你的地图没有名字!在“地图信息”菜单里设置一个。
|
||||||
editor.save.overwrite = 你的地图覆盖了一个内建的地图!在“地图信息”菜单里重新设置一个不同的名称。
|
editor.save.overwrite = 你的地图覆盖了一个内建的地图!在“地图信息”菜单里重新设置一个不同的名称。
|
||||||
editor.import.exists = [scarlet]无法导入:[]名为‘{0}’的内建地图已存在!
|
editor.import.exists = [scarlet]无法导入:[]名为‘{0}’的内建地图已存在!
|
||||||
editor.import = 导入……
|
editor.import = 导入……
|
||||||
editor.importmap = 导入地图
|
editor.importmap = 导入地图
|
||||||
editor.importmap.description = 导入一个已经存在的地图
|
editor.importmap.description = 导入一个已经存在的地图
|
||||||
@@ -308,7 +319,7 @@ ping = 延迟:{0}毫秒
|
|||||||
language.restart = 为了使语言设置生效请重启游戏。
|
language.restart = 为了使语言设置生效请重启游戏。
|
||||||
settings = 设置
|
settings = 设置
|
||||||
tutorial = 教程
|
tutorial = 教程
|
||||||
tutorial.retake = Re-Take Tutorial
|
tutorial.retake = 重新游玩教程
|
||||||
editor = 编辑器
|
editor = 编辑器
|
||||||
mapeditor = 地图编辑器
|
mapeditor = 地图编辑器
|
||||||
donate = 打赏
|
donate = 打赏
|
||||||
@@ -322,12 +333,12 @@ bestwave = [LIGHT_GRAY]最高波次:{0}
|
|||||||
launch = < 发射 >
|
launch = < 发射 >
|
||||||
launch.title = 发射成功
|
launch.title = 发射成功
|
||||||
launch.next = [LIGHT_GRAY]下一个发射机会在第 {0} 波
|
launch.next = [LIGHT_GRAY]下一个发射机会在第 {0} 波
|
||||||
launch.unable2 = [scarlet]Unable to LAUNCH.[]
|
launch.unable2 = [scarlet]无法发射[]
|
||||||
launch.confirm = 您将发射核心中所有资源。\n此地图将被重置。
|
launch.confirm = 您将发射核心中所有资源。\n此地图将重置。
|
||||||
launch.skip.confirm = If you skip now, you will not be able to launch until later waves.
|
launch.skip.confirm = 如果你现在跳过,在后来的波次前你将无法发射。
|
||||||
uncover = 解锁
|
uncover = 解锁
|
||||||
configure = 设定发射资源数量
|
configure = 设定发射资源数量
|
||||||
configure.locked = [LIGHT_GRAY]到达第 {0} 波\n才设定发射资源。
|
configure.locked = [LIGHT_GRAY]到达第 {0} 波\n才能设定发射资源。
|
||||||
zone.unlocked = [LIGHT_GRAY]{0} 已解锁。
|
zone.unlocked = [LIGHT_GRAY]{0} 已解锁。
|
||||||
zone.requirement.complete = 已达到第{0}波。\n达到解锁{1}的需求。
|
zone.requirement.complete = 已达到第{0}波。\n达到解锁{1}的需求。
|
||||||
zone.config.complete = 已达到第{0}波。\n允许携带发射的资源进入此地区。
|
zone.config.complete = 已达到第{0}波。\n允许携带发射的资源进入此地区。
|
||||||
@@ -360,7 +371,7 @@ zone.tarFields.name = 石油田
|
|||||||
zone.saltFlats.name = 盐碱荒滩
|
zone.saltFlats.name = 盐碱荒滩
|
||||||
zone.impact0078.name = 0078号冲击
|
zone.impact0078.name = 0078号冲击
|
||||||
zone.crags.name = 悬崖
|
zone.crags.name = 悬崖
|
||||||
zone.fungalPass.name = Fungal Pass
|
zone.fungalPass.name = 真菌通道
|
||||||
zone.groundZero.description = 重新开始的最佳位置。敌人威胁很小,资源少。\n尽可能收集多的铅和铜。\n行动。
|
zone.groundZero.description = 重新开始的最佳位置。敌人威胁很小,资源少。\n尽可能收集多的铅和铜。\n行动。
|
||||||
zone.frozenForest.description = 即使在这里,靠近山脉的地方,孢子也已经扩散。寒冷的温度不可能永远容纳它们。\n\n此行动须投入电力。建造燃烧发电机并学会使用修理者。
|
zone.frozenForest.description = 即使在这里,靠近山脉的地方,孢子也已经扩散。寒冷的温度不可能永远容纳它们。\n\n此行动须投入电力。建造燃烧发电机并学会使用修理者。
|
||||||
zone.desertWastes.description = 这些废物是巨大的,不可预测的,并且与废弃的结构交错在一起。燃烧它以获取动力或合成石墨。\n\n[lightgray]无法保证此着陆位置。
|
zone.desertWastes.description = 这些废物是巨大的,不可预测的,并且与废弃的结构交错在一起。燃烧它以获取动力或合成石墨。\n\n[lightgray]无法保证此着陆位置。
|
||||||
@@ -368,14 +379,15 @@ zone.saltFlats.description = 在沙漠的郊区有盐滩。在这个地方几乎
|
|||||||
zone.craters.description = 水在这个火山口积聚,这是旧战争的遗迹。夺下该区域。收集沙子来冶炼玻璃。用水泵抽水冷却炮塔和钻头。
|
zone.craters.description = 水在这个火山口积聚,这是旧战争的遗迹。夺下该区域。收集沙子来冶炼玻璃。用水泵抽水冷却炮塔和钻头。
|
||||||
zone.ruinousShores.description = 穿过荒地,就是海岸线。曾经这个地方安置了一个海岸防御阵列。现在剩下的不多了,只有最基本的防御结构仍然毫发无损,其他一切都被销毁了。\n继续向外扩展。继续研究科技。
|
zone.ruinousShores.description = 穿过荒地,就是海岸线。曾经这个地方安置了一个海岸防御阵列。现在剩下的不多了,只有最基本的防御结构仍然毫发无损,其他一切都被销毁了。\n继续向外扩展。继续研究科技。
|
||||||
zone.stainedMountains.description = 在更远的内陆地区是山脉,但没有被孢子污染。\n在这一地区分布着丰富的钛。学习如何使用它。\n\n这里敌人的存在更大。不要给他们时间派出最强的部队。
|
zone.stainedMountains.description = 在更远的内陆地区是山脉,但没有被孢子污染。\n在这一地区分布着丰富的钛。学习如何使用它。\n\n这里敌人的存在更大。不要给他们时间派出最强的部队。
|
||||||
zone.overgrowth.description = 这个地区生长过度,靠近孢子的来源。\n敌人在这里建立了一个前哨站。建造尖刀单位来摧毁它并找回丢失的东西。
|
zone.overgrowth.description = 这个地区靠近孢子的来源,生长过度。\n敌人在这里建立了一个前哨站。建造尖刀单位来摧毁它并找回丢失的东西。
|
||||||
zone.tarFields.description = 位于山脉和沙漠之间的产油区的郊区是少数几个有可用焦油储量的地区之一。\n尽管被废弃,但附近仍有一些危险的敌军。不要低估它们。\n\n[lightgray]如果可能,研究石油加工技术。
|
zone.tarFields.description = 位于山脉和沙漠之间的产油区的郊区是少数几个有可用焦油储量的地区之一。\n尽管被废弃,但附近仍有一些危险的敌军。不要低估它们。\n\n[lightgray]如果可能,研究石油加工技术。
|
||||||
zone.desolateRift.description = 非常危险的区域。资源丰富但空间小。破坏风险高。尽快离开,不要被敌人的攻击间隔太长所愚弄。
|
zone.desolateRift.description = 非常危险的区域。资源丰富但空间小。破坏风险高。尽快离开,不要被敌人的攻击间隔太长所愚弄。
|
||||||
zone.nuclearComplex.description = 以前生产和加工钍的设施已变成废墟。\n[浅灰色]研究钍及其多种用途。\n\n敌人在这里大量存在,不断侦察入侵者。
|
zone.nuclearComplex.description = 以前生产和加工钍的设施已变成废墟。\n[lightgray]研究钍及其多种用途。\n\n敌人在这里大量存在,不断侦察入侵者。
|
||||||
zone.fungalPass.description = A transition area between high mountains and lower, spore-ridden lands. A small enemy reconnaissance base is located here.\nDestroy it.\nUse Dagger and Crawler units. Take out the two cores.
|
zone.fungalPass.description = 介于高山和低矮孢子丛生的土地之间的过渡地带。这里有一个小型的敌方侦察基地。\n侦察它。\n使用尖刀和爬行者单位来消灭两个核心。
|
||||||
zone.impact0078.description = <在此处插入说明>
|
zone.impact0078.description = <在此处插入说明>
|
||||||
zone.crags.description = <在此处插入说明>
|
zone.crags.description = <在此处插入说明>
|
||||||
settings.language = 语言
|
settings.language = 语言
|
||||||
|
settings.data = 游戏数据
|
||||||
settings.reset = 恢复默认
|
settings.reset = 恢复默认
|
||||||
settings.rebind = 重新绑定
|
settings.rebind = 重新绑定
|
||||||
settings.controls = 控制
|
settings.controls = 控制
|
||||||
@@ -424,10 +436,10 @@ blocks.maxunits = 最大单位数量
|
|||||||
blocks.health = 生命值
|
blocks.health = 生命值
|
||||||
blocks.buildtime = 建造时间
|
blocks.buildtime = 建造时间
|
||||||
blocks.inaccuracy = 误差
|
blocks.inaccuracy = 误差
|
||||||
blocks.shots = 发射数
|
blocks.shots = 每秒发射数
|
||||||
blocks.reload = 重新装弹
|
blocks.reload = 重新装弹
|
||||||
blocks.ammo = 子弹
|
blocks.ammo = 子弹
|
||||||
bar.drilltierreq = Better Drill Required
|
bar.drilltierreq = 需要更好的钻头
|
||||||
bar.drillspeed = 挖掘速度:{0}/s
|
bar.drillspeed = 挖掘速度:{0}/s
|
||||||
bar.efficiency = 效率:{0}%
|
bar.efficiency = 效率:{0}%
|
||||||
bar.powerbalance = 能量:{0}
|
bar.powerbalance = 能量:{0}
|
||||||
@@ -471,7 +483,7 @@ category.shooting = 发射
|
|||||||
category.optional = 可选的增强物品
|
category.optional = 可选的增强物品
|
||||||
setting.landscape.name = 锁定横屏
|
setting.landscape.name = 锁定横屏
|
||||||
setting.shadows.name = 影子
|
setting.shadows.name = 影子
|
||||||
setting.linear.name = 线性滤波
|
setting.linear.name = 光滑贴图
|
||||||
setting.animatedwater.name = 流动的水
|
setting.animatedwater.name = 流动的水
|
||||||
setting.animatedshields.name = 动态画面
|
setting.animatedshields.name = 动态画面
|
||||||
setting.antialias.name = 抗锯齿[LIGHT_GRAY](需要重新启动)[]
|
setting.antialias.name = 抗锯齿[LIGHT_GRAY](需要重新启动)[]
|
||||||
@@ -499,14 +511,15 @@ setting.borderlesswindow.name = 无边框窗口[LIGHT_GRAY] (可能需要重启)
|
|||||||
setting.fps.name = 显示 FPS
|
setting.fps.name = 显示 FPS
|
||||||
setting.vsync.name = 垂直同步
|
setting.vsync.name = 垂直同步
|
||||||
setting.lasers.name = 显示能量射线
|
setting.lasers.name = 显示能量射线
|
||||||
setting.pixelate.name = 像素画面 [LIGHT_GRAY](可能会降低性能)
|
setting.pixelate.name = 像素画面 [LIGHT_GRAY](禁用动画)
|
||||||
setting.minimap.name = 显示小地图
|
setting.minimap.name = 显示小地图
|
||||||
setting.musicvol.name = 音乐音量
|
setting.musicvol.name = 音乐音量
|
||||||
setting.ambientvol.name = Ambient Volume
|
setting.ambientvol.name = 环境体积
|
||||||
setting.mutemusic.name = 静音
|
setting.mutemusic.name = 静音
|
||||||
setting.sfxvol.name = 音效音量
|
setting.sfxvol.name = 音效音量
|
||||||
setting.mutesound.name = 静音
|
setting.mutesound.name = 静音
|
||||||
setting.crashreport.name = 发送匿名崩溃报告
|
setting.crashreport.name = 发送匿名崩溃报告
|
||||||
|
setting.savecreate.name = 自动创建存档
|
||||||
setting.chatopacity.name = 聊天界面透明度
|
setting.chatopacity.name = 聊天界面透明度
|
||||||
setting.playerchat.name = 显示游戏内聊天界面
|
setting.playerchat.name = 显示游戏内聊天界面
|
||||||
uiscale.reset = UI缩放比例已经改变。\n按下“确定”来确定缩放比例\n[accent]{0}[]秒后[scarlet]退出并恢复设定。
|
uiscale.reset = UI缩放比例已经改变。\n按下“确定”来确定缩放比例\n[accent]{0}[]秒后[scarlet]退出并恢复设定。
|
||||||
@@ -527,7 +540,8 @@ keybind.press.axis = 按一下轴或键……
|
|||||||
keybind.screenshot.name = 地图截图
|
keybind.screenshot.name = 地图截图
|
||||||
keybind.move_x.name = 水平移动
|
keybind.move_x.name = 水平移动
|
||||||
keybind.move_y.name = 垂直移动
|
keybind.move_y.name = 垂直移动
|
||||||
keybind.select.name = 选择
|
keybind.fullscreen.name = 切换全屏
|
||||||
|
keybind.select.name = 选择/射击
|
||||||
keybind.diagonal_placement.name = 自动铺设
|
keybind.diagonal_placement.name = 自动铺设
|
||||||
keybind.pick.name = 选择方块
|
keybind.pick.name = 选择方块
|
||||||
keybind.break_block.name = 破坏方块
|
keybind.break_block.name = 破坏方块
|
||||||
@@ -635,7 +649,7 @@ item.explosiveness = [LIGHT_GRAY]爆炸性:{0}
|
|||||||
item.flammability = [LIGHT_GRAY]易燃性:{0}
|
item.flammability = [LIGHT_GRAY]易燃性:{0}
|
||||||
item.radioactivity = [LIGHT_GRAY]放射性:{0}
|
item.radioactivity = [LIGHT_GRAY]放射性:{0}
|
||||||
unit.health = [LIGHT_GRAY]生命值:{0}
|
unit.health = [LIGHT_GRAY]生命值:{0}
|
||||||
unit.speed = [LIGHT_GRAY]速度:{0}有
|
unit.speed = [LIGHT_GRAY]速度:{0}
|
||||||
mech.weapon = [LIGHT_GRAY]武器:{0}
|
mech.weapon = [LIGHT_GRAY]武器:{0}
|
||||||
mech.health = [LIGHT_GRAY]生命值: {0}
|
mech.health = [LIGHT_GRAY]生命值: {0}
|
||||||
mech.itemcapacity = [LIGHT_GRAY]物品容量:{0}
|
mech.itemcapacity = [LIGHT_GRAY]物品容量:{0}
|
||||||
@@ -731,7 +745,7 @@ block.duo.name = 双管炮
|
|||||||
block.scorch.name = 火焰炮
|
block.scorch.name = 火焰炮
|
||||||
block.scatter.name = 分裂炮
|
block.scatter.name = 分裂炮
|
||||||
block.hail.name = 冰雹炮
|
block.hail.name = 冰雹炮
|
||||||
block.lancer.name = 激光矛
|
block.lancer.name = 蓝瑟炮
|
||||||
block.conveyor.name = 传送带
|
block.conveyor.name = 传送带
|
||||||
block.titanium-conveyor.name = 钛传送带
|
block.titanium-conveyor.name = 钛传送带
|
||||||
block.junction.name = 连接点
|
block.junction.name = 连接点
|
||||||
@@ -790,6 +804,7 @@ block.blast-mixer.name = 爆炸混合器
|
|||||||
block.solar-panel.name = 太阳能电池
|
block.solar-panel.name = 太阳能电池
|
||||||
block.solar-panel-large.name = 大型太阳能电池
|
block.solar-panel-large.name = 大型太阳能电池
|
||||||
block.oil-extractor.name = 石油钻井
|
block.oil-extractor.name = 石油钻井
|
||||||
|
block.command-center.name = 指挥中心
|
||||||
block.draug-factory.name = 德鲁格采矿机工厂
|
block.draug-factory.name = 德鲁格采矿机工厂
|
||||||
block.spirit-factory.name = 幽灵修理机工厂
|
block.spirit-factory.name = 幽灵修理机工厂
|
||||||
block.phantom-factory.name = 鬼怪建造机工厂
|
block.phantom-factory.name = 鬼怪建造机工厂
|
||||||
@@ -852,26 +867,26 @@ unit.chaos-array.name = 混沌者
|
|||||||
unit.eradicator.name = 根除者
|
unit.eradicator.name = 根除者
|
||||||
unit.lich.name = 尸鬼
|
unit.lich.name = 尸鬼
|
||||||
unit.reaper.name = 死神
|
unit.reaper.name = 死神
|
||||||
tutorial.next = [lightgray]<Tap to continue>
|
tutorial.next = [lightgray]<点击以继续>
|
||||||
tutorial.intro = You have entered the[scarlet] Mindustry Tutorial.[]\nBegin by[accent] mining copper[]. Tap a copper ore vein near your core to do this.\n\n[accent]{0}/{1} copper
|
tutorial.intro = 你进入了[scarlet] Mindustry 教程[]。\n[accent]采集铜矿[]以开始。点击附近的一处铜矿。\n\n[accent]{0}/{1} 铜
|
||||||
tutorial.drill = 手动采矿效率低.\n[accent] 钻头 []可以自动采矿.\n放一个在铜矿上吧.
|
tutorial.drill = 手动采矿效率低。\n[accent]钻头[]可以自动采矿。\n放一个在铜矿上吧。\n点击右下角的钻头菜单。\n选择[accent]机械钻头[]。\n单击将其放置在铜矿上。\n[accent]右键单击[]来停止。
|
||||||
tutorial.drill.mobile = Mining manually is inefficient.\n[accent]Drills []can mine automatically.\nTap the drill tab in the bottom right.\nSelect the[accent] mechanical drill[].\nPlace it on a copper vein by tapping, then press the[accent] checkmark[] below to confirm your selection.\nPress the[accent] X button[] to cancel placement.
|
tutorial.drill.mobile = 手动采矿效率低。\n[accent]钻头[]可以自动采矿。\n点击右下角的钻头菜单。\n选择[accent]机械钻头[]。\n点击将其放在铜矿上,点击[accent]对号[]来确定。\n点击[accent]叉号[]来取消。
|
||||||
tutorial.blockinfo = Each block has different stats. Each drill can only mine certain ores.\nTo check a block's info and stats,[accent] tap the "?" button while selecting it in the build menu.[]\n\n[accent]Access the Mechanical Drill's stats now.[]
|
tutorial.blockinfo = 每个方块具有不同的数据。每个钻头只能开采某些矿石。\n要检查块的信息和统计信息,[accent]在菜单中点击问号。[]\n\n[accent]现在查看机械钻头的数据吧。[]
|
||||||
tutorial.conveyor = [accent]传送带[] 可以把物资传送到核心.\n请造一个传送线,从钻头到核心.
|
tutorial.conveyor = [accent]传送带[]可以把物资传送到核心。\n请从钻头到核心间造一条传送带。
|
||||||
tutorial.conveyor.mobile = [accent]Conveyors[] are used to transport items to the core.\nMake a line of conveyors from the drill to the core.\n[accent] Place in a line by holding down your finger for a few seconds[] and dragging in a direction.\n\n[accent]{0}/{1} conveyors placed in line\n[accent]0/1 items delivered
|
tutorial.conveyor.mobile = [accent]传送带[]可以把物资传送到核心。\n请从钻头到核心间造一条传送带。\n[accent]长按数秒[]并向一个方向拖动来直线放置。\n\n[accent]{0}/{1} 条传送带\n[accent]0/1 物品
|
||||||
tutorial.turret = 必须建造防御建筑来击退[LIGHT_GRAY] 敌人[].\n请在你核心附近造一个双人炮塔.
|
tutorial.turret = 必须建造防御建筑来击退[LIGHT_GRAY]敌人[]。\n请在你核心附近造一个双管炮。
|
||||||
tutorial.drillturret = 双人炮塔需要[accent] 铜质弹药 []来射击.\n可以放一个钻头在炮塔附近供应铜.
|
tutorial.drillturret = 双管炮需要[accent]铜[]作弹药来射击。\n可以放一个钻头在炮塔附近供应铜。
|
||||||
tutorial.pause = During battle, you are able to[accent] pause the game.[]\nYou may queue buildings while paused.\n\n[accent]Press space to pause.
|
tutorial.pause = 在战斗中,您可以[accent]暂停游戏[]。\n暂停时您可以规划建筑物。\n\n按[accent]空格[]暂停。
|
||||||
tutorial.pause.mobile = During battle, you are able to[accent] pause the game.[]\nYou may queue buildings while paused.\n\n[accent]Press this button in the top left to pause.
|
tutorial.pause.mobile = 在战斗中,您可以[accent]暂停游戏[]。\n暂停时您可以规划建筑物。\n\n[accent]点击左上角的按钮以暂停。
|
||||||
tutorial.unpause = Now press space again to unpause.
|
tutorial.unpause = 现在再次按空格以继续。
|
||||||
tutorial.unpause.mobile = Now press it again to unpause.
|
tutorial.unpause.mobile = 现在再次点击以继续。
|
||||||
tutorial.breaking = Blocks frequently need to be destroyed.\n[accent]Hold down right-click[] to destroy all blocks in a selection.[]\n\n[accent]Destroy all the scrap blocks to the left of your core using area selection.
|
tutorial.breaking = 方块经常需要拆除。\n[accent]按住鼠标右键[]来拆除选中的方块。[]\n\n[accent]使用范围拆除来拆除核心左侧的废墙。
|
||||||
tutorial.breaking.mobile = Blocks frequently need to be destroyed.\n[accent]Select deconstruction mode[], then tap a block to begin breaking it.\nDestroy an area by holding down your finger for a few seconds[] and dragging in a direction.\nPress the checkmark button to confirm breaking.\n\n[accent]Destroy all the scrap blocks to the left of your core using area selection.
|
tutorial.breaking.mobile = 方块经常需要拆除。\n[accent]选择拆除模式[],点击方块以拆除。\n[accent]长按几秒[]并拖动来范围拆除。\n点击对号来确定。\n\n[accent]使用范围拆除来拆除核心左侧的废墙。
|
||||||
tutorial.withdraw = In some situations, taking items directly from blocks is necessary.\nTo do this, [accent]tap a block[] with items in it, then [accent]tap the item[] in the inventory.\nMultiple items can be withdrawn by [accent]tapping and holding[].\n\n[accent]Withdraw some copper from the core.[]
|
tutorial.withdraw = 有时,从方块中取出物品是必要的。\n[accent]点击有物品的方块[],然后[accent]点击在方框中的物品[]。\n可以通过[accent]点击或长按[]来取出物品。\n\n[accent]从核心中取出一些铜[]。
|
||||||
tutorial.deposit = Deposit items into blocks by dragging from your ship to the destination block.\n\n[accent]Deposit your copper back into the core.[]
|
tutorial.deposit = 将物品从机甲拖向方块来放下物品。\n\n[accent]将铜放回核心[]。
|
||||||
tutorial.waves = [LIGHT_GRAY]敌人[] 来了.\n\n保护基地,防御2波攻击. 造更多的炮塔.
|
tutorial.waves = [lightgray]敌人[]来了。\n\n保护核心,防御2波攻击。造更多的炮塔。[accent]点击[]以射击。\n建造更多的炮塔和钻头,并采更多的矿。
|
||||||
tutorial.waves.mobile = The[lightgray] enemy[] approaches.\n\nDefend the core for 2 waves. Your ship will automatically fire at enemies.\nBuild more turrets and drills. Mine more copper.
|
tutorial.waves.mobile = [lightgray]敌人[]来了。\n\n保护核心,防御2波攻击。造更多的炮塔。你的机甲将对敌人自动开火。\n建造更多的炮塔和钻头,并采更多的矿。
|
||||||
tutorial.launch = Once you reach a specific wave, you are able to[accent] launch the core[], leaving your defenses behind and[accent] obtaining all the resources in your core.[]\nThese resources can then be used to research new technology.\n\n[accent]Press the launch button.
|
tutorial.launch = 特定波次中,你可以[accent]发射核心[],[accent]携带核心中所有资源[]离开所有的建筑。\n资源可用来研究科技。\n\n[accent]点击发射按钮。
|
||||||
item.copper.description = 一种有用的结构材料。在各种类型的方块中广泛使用。
|
item.copper.description = 一种有用的结构材料。在各种类型的方块中广泛使用。
|
||||||
item.lead.description = 一种基本的起始材料。被广泛用于电子设备和液体运输方块。
|
item.lead.description = 一种基本的起始材料。被广泛用于电子设备和液体运输方块。
|
||||||
item.metaglass.description = 一种超级强硬的复合玻璃。通常用来传送和收藏液体。
|
item.metaglass.description = 一种超级强硬的复合玻璃。通常用来传送和收藏液体。
|
||||||
@@ -893,7 +908,7 @@ liquid.slag.description = 各种不同类型的熔融金属混合在一起的液
|
|||||||
liquid.oil.description = 用于先进材料生产的液体。可以转换成煤作为燃料,或作为武器喷射和放火。
|
liquid.oil.description = 用于先进材料生产的液体。可以转换成煤作为燃料,或作为武器喷射和放火。
|
||||||
liquid.cryofluid.description = 一种由水和钛制成的惰性、无腐蚀性的液体。具有极高的热容量。广泛用作冷却剂。
|
liquid.cryofluid.description = 一种由水和钛制成的惰性、无腐蚀性的液体。具有极高的热容量。广泛用作冷却剂。
|
||||||
mech.alpha-mech.description = 标准控制机甲。基于尖刀单位,具有升级的装甲和建筑能力。比Dart有更多的伤害输出。
|
mech.alpha-mech.description = 标准控制机甲。基于尖刀单位,具有升级的装甲和建筑能力。比Dart有更多的伤害输出。
|
||||||
mech.delta-mech.description = 一种快速,轻便的机甲,一击即退。对结构造成的伤害很小,但可以用弧形闪电武器很快杀死大量敌方单位。
|
mech.delta-mech.description = 一种快速,轻便的机甲,一击即退。对结构造成的伤害很小,但可以用弧形闪电武器快速杀死大量敌方单位。
|
||||||
mech.tau-mech.description = 后勤机甲。治疗友军。可以熄灭火焰并治疗一定范围内的友军。
|
mech.tau-mech.description = 后勤机甲。治疗友军。可以熄灭火焰并治疗一定范围内的友军。
|
||||||
mech.omega-mech.description = 一种装甲厚重的机甲,用于在前线攻击。它的护甲可以阻挡高达90%的伤害。
|
mech.omega-mech.description = 一种装甲厚重的机甲,用于在前线攻击。它的护甲可以阻挡高达90%的伤害。
|
||||||
mech.dart-ship.description = 标准飞船。快速轻便,但攻击能力低,采矿速度慢。
|
mech.dart-ship.description = 标准飞船。快速轻便,但攻击能力低,采矿速度慢。
|
||||||
@@ -907,10 +922,10 @@ unit.dagger.description = 一种最基本的地面机甲。生产成本低。在
|
|||||||
unit.crawler.description = 一种地面装置,由一个框架和绑在上面的烈性炸药组成。不是特别耐用。与敌人接触后爆炸。
|
unit.crawler.description = 一种地面装置,由一个框架和绑在上面的烈性炸药组成。不是特别耐用。与敌人接触后爆炸。
|
||||||
unit.titan.description = 一种先进的装甲地面部队。攻击地面和空中目标。配备两个微型灼烧级火焰喷射器。
|
unit.titan.description = 一种先进的装甲地面部队。攻击地面和空中目标。配备两个微型灼烧级火焰喷射器。
|
||||||
unit.fortress.description = 一种重型炮兵机甲。装备两门改进型冰雹炮,用于对敌军建筑物和部队进行远程攻击。
|
unit.fortress.description = 一种重型炮兵机甲。装备两门改进型冰雹炮,用于对敌军建筑物和部队进行远程攻击。
|
||||||
unit.eruptor.description = 一种用来拆除建筑物的重型机甲。在敌人的防御工事上发射一股熔渣,将它们熔化并点燃挥发物。
|
unit.eruptor.description = 一种用来拆除建筑物的重型机甲。在敌人的防御工事上发射矿渣,将它们熔化并点燃挥发物。
|
||||||
unit.wraith.description = 一种快速、一击即退的拦截器机甲。目标是发电机。
|
unit.wraith.description = 一种快速、一击即退的拦截器机甲。目标是发电机。
|
||||||
unit.ghoul.description = 一种地毯式轰炸机。通过敌人的结构进行攻击,并瞄准关键的基础设施。
|
unit.ghoul.description = 一种地毯式轰炸机。通过敌人的结构进行攻击,并瞄准关键的基础设施。
|
||||||
unit.revenant.description = 一种发射导弹的重型飞行机甲
|
unit.revenant.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 = 用高纯度的焦炭来加工沙子以生产硅。
|
||||||
@@ -920,7 +935,7 @@ block.phase-weaver.description = 用放射性钍和大量沙子生产相织物
|
|||||||
block.alloy-smelter.description = 用钛,铅,硅和铜生产浪涌合金。
|
block.alloy-smelter.description = 用钛,铅,硅和铜生产浪涌合金。
|
||||||
block.cryofluidmixer.description = 水和钛结合到低温流体中,冷却效率更高。
|
block.cryofluidmixer.description = 水和钛结合到低温流体中,冷却效率更高。
|
||||||
block.blast-mixer.description = 用油将硫转化为不易燃但更具爆炸性的爆炸化合物。
|
block.blast-mixer.description = 用油将硫转化为不易燃但更具爆炸性的爆炸化合物。
|
||||||
block.pyratite-mixer.description = 用煤,铅和沙子混合成高度易燃的硫。
|
block.pyratite-mixer.description = 将煤,铅和沙子混合成高度易燃的硫。
|
||||||
block.melter.description = 将废料熔化成矿渣,以便进一步加工或用于炮塔子弹。
|
block.melter.description = 将废料熔化成矿渣,以便进一步加工或用于炮塔子弹。
|
||||||
block.separator.description = 从矿渣中提取有用的矿物。
|
block.separator.description = 从矿渣中提取有用的矿物。
|
||||||
block.spore-press.description = 压缩孢子荚得到石油。
|
block.spore-press.description = 压缩孢子荚得到石油。
|
||||||
@@ -955,39 +970,39 @@ block.junction.description = 两条交叉传送带的桥梁。适用于两条不
|
|||||||
block.bridge-conveyor.description = 高级项目传输块。允许在跨越任何地形或建筑物上运输物品,最多跨越3个块。
|
block.bridge-conveyor.description = 高级项目传输块。允许在跨越任何地形或建筑物上运输物品,最多跨越3个块。
|
||||||
block.phase-conveyor.description = 高级传送带。使用电力将物品传送到距离几个块的相位传送带上。
|
block.phase-conveyor.description = 高级传送带。使用电力将物品传送到距离几个块的相位传送带上。
|
||||||
block.sorter.description = 对物品进行分类。如果物品与所选种类,则允许其通过。否则,物品将从左边和右边输出。
|
block.sorter.description = 对物品进行分类。如果物品与所选种类,则允许其通过。否则,物品将从左边和右边输出。
|
||||||
block.router.description = 从一个方向接受物品,并将它们平均输出到最多3个其他方向。用于将材料从一个源分割为多个目标。
|
block.router.description = 从一个方向接受物品,并将它们平均输出到最多3个其他方向。用于将材料分成多份。
|
||||||
block.distributor.description = 一个高级路由器,可以将物品分成最多7个方向。
|
block.distributor.description = 一个高级路由器,可以将物品向最多7个方向输出。
|
||||||
block.overflow-gate.description = 分离器和路由器的组合,如果前面被挡住,则向从左和右输出。
|
block.overflow-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.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个块上运输液体。
|
||||||
block.phase-conduit.description = 高级液体传输块。使用电力将液体传送到多个块上的连接相管道。
|
block.phase-conduit.description = 高级液体传输块。使用电力将液体传送到多个块上的连接相管道。
|
||||||
block.power-node.description = 连接节点传输电源。最多可连接四个电源,用电器或节点。节点将从任何相邻块接收电力或向其供电。
|
block.power-node.description = 将电源传输到连接的节点。节点将接收来自或向任何相邻块供电。
|
||||||
block.power-node-large.description = 传输径大于电源节点,最多可连接六个电源,接收器或节点。
|
block.power-node-large.description = 具有更大范围和更多连接点的高级能量节点。
|
||||||
block.surge-tower.description = 具有较少可用连接的远程电源节点。
|
block.surge-tower.description = 具有较少可用连接的远程电源节点。
|
||||||
block.battery.description = 储存电力,当储存有能量时,可在电力短缺时提供电力。
|
block.battery.description = 储存电力,当储存有能量时,可在电力短缺时提供电力。
|
||||||
block.battery-large.description = 比普通电池容量更大。
|
block.battery-large.description = 比普通电池容量更大。
|
||||||
block.combustion-generator.description = 通过燃烧油或易燃材料产生电力。
|
block.combustion-generator.description = 燃烧煤等易燃材料发电。
|
||||||
block.thermal-generator.description = 当放置在热的地方时发电。
|
block.thermal-generator.description = 当放置在热的地方时发电。
|
||||||
block.turbine-generator.description = 比燃烧发电机更有效,但需要额外的水。
|
block.turbine-generator.description = 先进的燃烧发电机,效率更高,但需要额外的水来产生蒸汽。
|
||||||
block.differential-generator.description = 产生大量的能量。利用低温流体和燃烧的硫之间的温差。
|
block.differential-generator.description = 利用低温流体和燃烧的硫之间的温差产生大量的能量。
|
||||||
block.rtg-generator.description = 一种放射性同位素热电发电机,它不需要冷却,但功率低于钍反应堆。
|
block.rtg-generator.description = 简单可靠的发电机。利用衰变放射性化合物的热量以缓慢的速度产生能量。
|
||||||
block.solar-panel.description = 标准太阳能面板,提供少量电力。
|
block.solar-panel.description = 标准太阳能面板,提供少量电力。
|
||||||
block.solar-panel-large.description = 比标准太阳能电池板提供更好的电源,但构建起来要贵得多。
|
block.solar-panel-large.description = 比标准太阳能电池板提供更好的电源,但构建起来要贵得多。
|
||||||
block.thorium-reactor.description = 高放射性钍产生大量电力。需要持续冷却。如果供应的冷却剂量不足,会剧烈爆炸。
|
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 = 将微小浓度的孢子培养成工业用的孢子荚。
|
||||||
block.oil-extractor.description = 使用大量的电力从沙子中提取石油。当附近没有直接的石油来源时使用它。
|
block.oil-extractor.description = 使用大量的电力从沙子中提取石油。当附近没有直接的石油来源时使用它。
|
||||||
block.core-shard.description = 核心第一代。一旦被摧毁,与该地区的所有联系都将失去。不要让这种情况发生。
|
block.core-shard.description = 核心第一代。一旦被摧毁,与该地区的所有联系都将失去。不要让这种情况发生。
|
||||||
@@ -1001,17 +1016,18 @@ block.launch-pad-large.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 = 大型炮塔,发射三道刺穿敌人的短程光束。
|
block.fuse.description = 大型炮塔,发射三道刺穿敌人的短程光束。
|
||||||
block.ripple.description = 大型远程炮台,非常强力,向远处的敌人投射一簇弹药。
|
block.ripple.description = 大型远程炮台,非常强力,向远处的敌人投射一簇弹药。
|
||||||
block.cyclone.description = 大型快速炮塔,对空对地,向周围敌人发射爆炸弹。
|
block.cyclone.description = 大型快速炮塔,对空对地,向周围敌人发射爆炸弹。
|
||||||
block.spectre.description = 超大型炮塔,对空对地,一次射出两颗强大的穿甲子弹。
|
block.spectre.description = 超大型炮塔,对空对地,一次射出两颗强大的穿甲子弹。
|
||||||
block.meltdown.description = 超大型激光炮塔,充能之后持续发射光束,需要冷却剂。
|
block.meltdown.description = 超大型激光炮塔,充能之后持续发射光束,需要冷却剂。
|
||||||
|
block.command-center.description = 在地图上向盟军发出移动命令。\n使用部队巡逻、攻击敌军核心或撤退到核心/工厂。当没有敌人核心时,部队默认在攻击命令下巡逻。
|
||||||
block.draug-factory.description = 生产德鲁格釆矿机。
|
block.draug-factory.description = 生产德鲁格釆矿机。
|
||||||
block.spirit-factory.description = 生产幽灵修理机。
|
block.spirit-factory.description = 生产幽灵修理机。
|
||||||
block.phantom-factory.description = 生产鬼怪建造机。
|
block.phantom-factory.description = 生产鬼怪建造机。
|
||||||
@@ -1023,10 +1039,10 @@ block.crawler-factory.description = 生产快速自毁单元。
|
|||||||
block.titan-factory.description = 生产先进的装甲地面单位。
|
block.titan-factory.description = 生产先进的装甲地面单位。
|
||||||
block.fortress-factory.description = 生产重型地面火炮部队。
|
block.fortress-factory.description = 生产重型地面火炮部队。
|
||||||
block.repair-point.description = 连续治疗附近最近的受损单位。
|
block.repair-point.description = 连续治疗附近最近的受损单位。
|
||||||
block.dart-mech-pad.description = 离开你当前的装置,换成一个基本攻击机甲。\n站在上面时双击切换。
|
block.dart-mech-pad.description = 离开你当前的装置,换成一个基本攻击机甲。\n站在上面时点击切换。
|
||||||
block.delta-mech-pad.description = 离开你当前的装置并换成一个快速,轻装甲的机械装置,用于快速攻击。\n站在上面时双击切换。
|
block.delta-mech-pad.description = 离开你当前的装置并换成一个快速,轻装甲的机械装置,用于快速攻击。\n站在上面时点击切换。
|
||||||
block.tau-mech-pad.description = 离开你当前的装置并换成一个可以治愈友方建筑物和单位的支撑机械。\n站在上面时双击切换。
|
block.tau-mech-pad.description = 离开你当前的装置并换成一个可以治愈友方建筑物和单位的后勤机甲。\n站在上面时点击切换。
|
||||||
block.omega-mech-pad.description = 离开你当前的装置并换成一个笨重且装甲良好的机甲,用于前线攻击。\n站在上面时双击切换。
|
block.omega-mech-pad.description = 离开你当前的装置并换成一个笨重且装甲良好的机甲,用于前线攻击。\n站在上面时点击切换。
|
||||||
block.javelin-ship-pad.description = 离开你当前的装置,换成一个强大而快速的截击机,用闪电武器。\n站在上面时双击切换。
|
block.javelin-ship-pad.description = 离开你当前的装置,换成一个强大而快速的截击机,用闪电武器。\n站在上面时点击切换。
|
||||||
block.trident-ship-pad.description = 离开你当前的装置,换成一个装甲合理的重型轰炸机。\n站在上面时双击切换。
|
block.trident-ship-pad.description = 离开你当前的装置,换成一个装甲合理的重型轰炸机。\n站在上面时点击切换。
|
||||||
block.glaive-ship-pad.description = 离开现有的装置,换成装甲良好的大型武装直升机。\n站在上面时双击切换。
|
block.glaive-ship-pad.description = 离开现有的装置,换成装甲良好的大型武装直升机。\n站在上面时点击切换。
|
||||||
|
|||||||
@@ -16,6 +16,11 @@ screenshot.invalid = 地圖太大了,可能沒有足夠的內存用於截圖
|
|||||||
gameover = 遊戲結束
|
gameover = 遊戲結束
|
||||||
gameover.pvp = [accent]{0}[]隊獲勝!
|
gameover.pvp = [accent]{0}[]隊獲勝!
|
||||||
highscore = [accent]新的高分紀錄!
|
highscore = [accent]新的高分紀錄!
|
||||||
|
load.sound = Sounds
|
||||||
|
load.map = Maps
|
||||||
|
load.image = Images
|
||||||
|
load.content = Content
|
||||||
|
load.system = System
|
||||||
stat.wave = 打敗的波次:[accent]{0}
|
stat.wave = 打敗的波次:[accent]{0}
|
||||||
stat.enemiesDestroyed = 摧毀的敵人:[accent]{0}
|
stat.enemiesDestroyed = 摧毀的敵人:[accent]{0}
|
||||||
stat.built = 建設的建築:[accent]{0}
|
stat.built = 建設的建築:[accent]{0}
|
||||||
@@ -23,8 +28,6 @@ stat.destroyed = 摧毀的建築:[accent]{0}
|
|||||||
stat.deconstructed = 移除的建築:[accent]{0}
|
stat.deconstructed = 移除的建築:[accent]{0}
|
||||||
stat.delivered = 發射的資源:
|
stat.delivered = 發射的資源:
|
||||||
stat.rank = 最終排名:[accent]{0}
|
stat.rank = 最終排名:[accent]{0}
|
||||||
placeline = 你選擇了一個方塊。\n[accent]按住你的手指幾秒鐘[]並拖動以[accent]直線放置方塊[]。\n試試吧。
|
|
||||||
removearea = 你選擇了移除模式。\n[accent]按住你的手指幾秒鐘[]並拖動以[accent]移除矩形中的方塊[]。\n試試吧。
|
|
||||||
launcheditems = [accent]發射了的物品
|
launcheditems = [accent]發射了的物品
|
||||||
map.delete = 確認要刪除「[accent]{0}[]」地圖嗎?
|
map.delete = 確認要刪除「[accent]{0}[]」地圖嗎?
|
||||||
level.highscore = 最高分:[accent]{0}
|
level.highscore = 最高分:[accent]{0}
|
||||||
@@ -63,9 +66,11 @@ players.single = {0}個線上玩家
|
|||||||
server.closing = [accent]正在關閉伺服器……
|
server.closing = [accent]正在關閉伺服器……
|
||||||
server.kicked.kick = 您已被踢出伺服器!
|
server.kicked.kick = 您已被踢出伺服器!
|
||||||
server.kicked.serverClose = 伺服器已關閉。
|
server.kicked.serverClose = 伺服器已關閉。
|
||||||
|
server.kicked.vote = You have been vote-kicked. Goodbye.
|
||||||
server.kicked.clientOutdated = 客戶端版本過舊!請更新遊戲!
|
server.kicked.clientOutdated = 客戶端版本過舊!請更新遊戲!
|
||||||
server.kicked.serverOutdated = 伺服器版本過舊!請聯絡伺服主更新伺服器!
|
server.kicked.serverOutdated = 伺服器版本過舊!請聯絡伺服主更新伺服器!
|
||||||
server.kicked.banned = 您已經從這個伺服器被封禁。
|
server.kicked.banned = 您已經從這個伺服器被封禁。
|
||||||
|
server.kicked.typeMismatch = This server is not compatible with your build type.
|
||||||
server.kicked.recentKick = 您已經從伺服器被踢除。\n請稍後再進行連線。
|
server.kicked.recentKick = 您已經從伺服器被踢除。\n請稍後再進行連線。
|
||||||
server.kicked.nameInUse = 伺服器中已經\n有人有相同的名稱了。
|
server.kicked.nameInUse = 伺服器中已經\n有人有相同的名稱了。
|
||||||
server.kicked.nameEmpty = 你的名稱必須至少包含一個字母或數字。
|
server.kicked.nameEmpty = 你的名稱必須至少包含一個字母或數字。
|
||||||
@@ -156,6 +161,11 @@ cancel = 取消
|
|||||||
openlink = 開啟連結
|
openlink = 開啟連結
|
||||||
copylink = 複製連結
|
copylink = 複製連結
|
||||||
back = 返回
|
back = 返回
|
||||||
|
data.export = Export Data
|
||||||
|
data.import = Import Data
|
||||||
|
data.exported = Data exported.
|
||||||
|
data.invalid = This isn't valid game data.
|
||||||
|
data.import.confirm = Importing external data will erase[scarlet] all[] your current game data.\n[accent]This cannot be undone![]\n\nOnce the data is imported, your game will exit immediately.
|
||||||
classic.export = Export Classic Data
|
classic.export = Export Classic Data
|
||||||
classic.export.text = [accent]Mindustry[] has just had a major update.\nClassic (v3.5 build 40) save or map data has been detected. Would you like to export these saves to your phone's home folder, for use in the Mindustry Classic app?
|
classic.export.text = [accent]Mindustry[] has just had a major update.\nClassic (v3.5 build 40) save or map data has been detected. Would you like to export these saves to your phone's home folder, for use in the Mindustry Classic app?
|
||||||
quit.confirm = 您確定要退出嗎?
|
quit.confirm = 您確定要退出嗎?
|
||||||
@@ -376,6 +386,7 @@ zone.fungalPass.description = A transition area between high mountains and lower
|
|||||||
zone.impact0078.description = <insert description here>
|
zone.impact0078.description = <insert description here>
|
||||||
zone.crags.description = <insert description here>
|
zone.crags.description = <insert description here>
|
||||||
settings.language = 語言
|
settings.language = 語言
|
||||||
|
settings.data = Game Data
|
||||||
settings.reset = 重設為預設設定
|
settings.reset = 重設為預設設定
|
||||||
settings.rebind = 重新綁定
|
settings.rebind = 重新綁定
|
||||||
settings.controls = 操作
|
settings.controls = 操作
|
||||||
@@ -507,6 +518,7 @@ setting.mutemusic.name = 靜音
|
|||||||
setting.sfxvol.name = 音效音量
|
setting.sfxvol.name = 音效音量
|
||||||
setting.mutesound.name = 靜音
|
setting.mutesound.name = 靜音
|
||||||
setting.crashreport.name = 發送匿名崩潰報告
|
setting.crashreport.name = 發送匿名崩潰報告
|
||||||
|
setting.savecreate.name = Auto-Create Saves
|
||||||
setting.chatopacity.name = 聊天框不透明度
|
setting.chatopacity.name = 聊天框不透明度
|
||||||
setting.playerchat.name = 在遊戲中顯示聊天框
|
setting.playerchat.name = 在遊戲中顯示聊天框
|
||||||
uiscale.reset = UI scale has been changed.\nPress "OK" to confirm this scale.\n[scarlet]Reverting and exiting in[accent] {0}[] settings...
|
uiscale.reset = UI scale has been changed.\nPress "OK" to confirm this scale.\n[scarlet]Reverting and exiting in[accent] {0}[] settings...
|
||||||
@@ -527,6 +539,7 @@ keybind.press.axis = 按一下軸心或鍵……
|
|||||||
keybind.screenshot.name = 地圖截圖
|
keybind.screenshot.name = 地圖截圖
|
||||||
keybind.move_x.name = 水平移動
|
keybind.move_x.name = 水平移動
|
||||||
keybind.move_y.name = 垂直移動
|
keybind.move_y.name = 垂直移動
|
||||||
|
keybind.fullscreen.name = Toggle Fullscreen
|
||||||
keybind.select.name = 選取
|
keybind.select.name = 選取
|
||||||
keybind.diagonal_placement.name = 對角線放置
|
keybind.diagonal_placement.name = 對角線放置
|
||||||
keybind.pick.name = 選擇方塊
|
keybind.pick.name = 選擇方塊
|
||||||
@@ -790,6 +803,7 @@ block.blast-mixer.name = 爆炸混合器
|
|||||||
block.solar-panel.name = 太陽能板
|
block.solar-panel.name = 太陽能板
|
||||||
block.solar-panel-large.name = 大型太陽能板
|
block.solar-panel-large.name = 大型太陽能板
|
||||||
block.oil-extractor.name = 石油鑽井
|
block.oil-extractor.name = 石油鑽井
|
||||||
|
block.command-center.name = Command Center
|
||||||
block.draug-factory.name = Draug Miner Drone Factory
|
block.draug-factory.name = Draug Miner Drone Factory
|
||||||
block.spirit-factory.name = 輕型無人機工廠
|
block.spirit-factory.name = 輕型無人機工廠
|
||||||
block.phantom-factory.name = 幻影無人機工廠
|
block.phantom-factory.name = 幻影無人機工廠
|
||||||
@@ -1012,6 +1026,7 @@ block.ripple.description = 一種一次射出幾發子彈的大型火砲。
|
|||||||
block.cyclone.description = 一種快速射擊的大型砲塔。
|
block.cyclone.description = 一種快速射擊的大型砲塔。
|
||||||
block.spectre.description = 一種一次射出兩顆強大的子彈的大型砲塔。
|
block.spectre.description = 一種一次射出兩顆強大的子彈的大型砲塔。
|
||||||
block.meltdown.description = 一種射出強大的遠程光束的大型砲塔。
|
block.meltdown.description = 一種射出強大的遠程光束的大型砲塔。
|
||||||
|
block.command-center.description = Issues movement commands to allied units across the map.\nCauses units to patrol, attack an enemy core or retreat to the core/factory. When no enemy core is present, units will default to patrolling under the attack command.
|
||||||
block.draug-factory.description = Produces Draug mining drones.
|
block.draug-factory.description = Produces Draug mining drones.
|
||||||
block.spirit-factory.description = 生產輕型無人機,用於開採礦石和修復方塊。
|
block.spirit-factory.description = 生產輕型無人機,用於開採礦石和修復方塊。
|
||||||
block.phantom-factory.description = 生產高級的無人機,比輕型無人機明顯更有效。
|
block.phantom-factory.description = 生產高級的無人機,比輕型無人機明顯更有效。
|
||||||
|
|||||||
@@ -72,3 +72,7 @@ Dominik
|
|||||||
Arkanic
|
Arkanic
|
||||||
Potion
|
Potion
|
||||||
Markus G
|
Markus G
|
||||||
|
itskatt
|
||||||
|
Agent-Laevain
|
||||||
|
AzariasB
|
||||||
|
amrsoll
|
||||||
|
|||||||
BIN
core/assets/sprites/error.png
Normal file
|
After Width: | Height: | Size: 276 B |
|
Before Width: | Height: | Size: 278 KiB After Width: | Height: | Size: 134 KiB |
|
Before Width: | Height: | Size: 581 KiB After Width: | Height: | Size: 278 KiB |
BIN
core/assets/sprites/sprites5.png
Normal file
|
After Width: | Height: | Size: 577 KiB |
@@ -1,367 +0,0 @@
|
|||||||
{
|
|
||||||
Color: {
|
|
||||||
black: { a: 1, b: 0, g: 0, r: 0 },
|
|
||||||
white: { a: 1, b: 1, g: 1, r: 1 },
|
|
||||||
gray: { a: 1, b: 0.32, g: 0.32, r: 0.32 },
|
|
||||||
lightgray: { a: 1, b: 0.65, g: 0.65, r: 0.65 }
|
|
||||||
orange: { hex: "FFA500" },
|
|
||||||
accent: { hex: "ffd37f" }
|
|
||||||
},
|
|
||||||
TintedDrawable: {
|
|
||||||
dialogDim: {
|
|
||||||
name: whiteui,
|
|
||||||
color: { r: 0, g: 0, b: 0, a: 0.9 }
|
|
||||||
},
|
|
||||||
guideDim: {
|
|
||||||
name: whiteui,
|
|
||||||
color: { r: 0, g: 0, b: 0, a: 0.3 }
|
|
||||||
},
|
|
||||||
invis: {
|
|
||||||
name: whiteui,
|
|
||||||
color: { r: 0, g: 0, b: 0, a: 0 }
|
|
||||||
}
|
|
||||||
loadDim: {
|
|
||||||
name: white,
|
|
||||||
color: { r: 0, g: 0, b: 0, a: 0.8 }
|
|
||||||
},
|
|
||||||
chatfield: {
|
|
||||||
name: whiteui,
|
|
||||||
color: { r: 0, g: 0, b: 0, a: 0.2 }
|
|
||||||
},
|
|
||||||
dark: {
|
|
||||||
name: whiteui,
|
|
||||||
color: { hex: "#000000ff" }
|
|
||||||
},
|
|
||||||
none: {
|
|
||||||
name: whiteui,
|
|
||||||
color: { r: 0, g: 0, b: 0, a: 0 }
|
|
||||||
},
|
|
||||||
flat-trans: {
|
|
||||||
name: whiteui,
|
|
||||||
color: { r: 0.0, g: 0.0, b: 0.0, a: 0.6 }
|
|
||||||
},
|
|
||||||
flat: {
|
|
||||||
name: whiteui,
|
|
||||||
color: { r: 0.0, g: 0.0, b: 0.0, a: 1 }
|
|
||||||
},
|
|
||||||
flat-over: {
|
|
||||||
name: whiteui,
|
|
||||||
color: { hex: "#454545ff" }
|
|
||||||
}
|
|
||||||
},
|
|
||||||
ButtonStyle: {
|
|
||||||
default: {
|
|
||||||
down: button-down,
|
|
||||||
up: button,
|
|
||||||
over: button-over,
|
|
||||||
disabled: button-disabled
|
|
||||||
},
|
|
||||||
square: {
|
|
||||||
over: button-square-over,
|
|
||||||
disabled: button-disabled,
|
|
||||||
down: button-square-down,
|
|
||||||
up: button-square
|
|
||||||
},
|
|
||||||
toggle: {
|
|
||||||
checked: button-down,
|
|
||||||
down: button-down,
|
|
||||||
up: button
|
|
||||||
},
|
|
||||||
wave: {
|
|
||||||
up: button-edge-4,
|
|
||||||
over: button-edge-over-4,
|
|
||||||
disabled: button-edge-4
|
|
||||||
},
|
|
||||||
},
|
|
||||||
TextButtonStyle: {
|
|
||||||
default: {
|
|
||||||
over: button-over,
|
|
||||||
disabled: button-disabled,
|
|
||||||
font: default,
|
|
||||||
fontColor: white,
|
|
||||||
disabledFontColor: gray,
|
|
||||||
down: button-down,
|
|
||||||
up: button
|
|
||||||
},
|
|
||||||
square: {
|
|
||||||
font: default,
|
|
||||||
fontColor: white,
|
|
||||||
disabledFontColor: gray,
|
|
||||||
over: button-square-over,
|
|
||||||
disabled: button-disabled,
|
|
||||||
down: button-square-down,
|
|
||||||
up: button-square
|
|
||||||
},
|
|
||||||
node: {
|
|
||||||
disabled: button,
|
|
||||||
font: default,
|
|
||||||
fontColor: white,
|
|
||||||
disabledFontColor: gray,
|
|
||||||
up: button-over,
|
|
||||||
over: button-down
|
|
||||||
},
|
|
||||||
right: {
|
|
||||||
over: button-right-over,
|
|
||||||
font: default,
|
|
||||||
fontColor: white,
|
|
||||||
disabledFontColor: gray,
|
|
||||||
down: button-right-down,
|
|
||||||
up: button-right
|
|
||||||
},
|
|
||||||
wave: {
|
|
||||||
font: default,
|
|
||||||
fontColor: white,
|
|
||||||
disabledFontColor: gray,
|
|
||||||
up: button-edge-4
|
|
||||||
},
|
|
||||||
clear: {
|
|
||||||
over: flat-over,
|
|
||||||
font: default,
|
|
||||||
fontColor: white,
|
|
||||||
disabledFontColor: gray,
|
|
||||||
down: flat-over,
|
|
||||||
up: flat
|
|
||||||
},
|
|
||||||
discord: {
|
|
||||||
font: default,
|
|
||||||
fontColor: white,
|
|
||||||
up: discord-banner
|
|
||||||
},
|
|
||||||
info: {
|
|
||||||
font: default,
|
|
||||||
fontColor: white,
|
|
||||||
up: info-banner
|
|
||||||
},
|
|
||||||
clear-partial: {
|
|
||||||
down: whiteui,
|
|
||||||
up: pane,
|
|
||||||
over: flat-down,
|
|
||||||
font: default,
|
|
||||||
fontColor: white,
|
|
||||||
disabledFontColor: gray
|
|
||||||
},
|
|
||||||
clear-partial-2: {
|
|
||||||
down: flat-over,
|
|
||||||
up: none,
|
|
||||||
over: flat-over,
|
|
||||||
font: default,
|
|
||||||
fontColor: white,
|
|
||||||
disabledFontColor: gray
|
|
||||||
},
|
|
||||||
empty: {
|
|
||||||
font: default
|
|
||||||
},
|
|
||||||
clear-toggle: {
|
|
||||||
font: default,
|
|
||||||
fontColor: white,
|
|
||||||
checked: flat-down,
|
|
||||||
down: flat-down,
|
|
||||||
up: flat,
|
|
||||||
over: flat-over,
|
|
||||||
disabled: flat,
|
|
||||||
disabledFontColor: gray
|
|
||||||
},
|
|
||||||
clear-toggle-menu: {
|
|
||||||
font: default,
|
|
||||||
fontColor: white,
|
|
||||||
checked: flat-down,
|
|
||||||
down: flat-down,
|
|
||||||
up: clear,
|
|
||||||
over: flat-over,
|
|
||||||
disabled: flat,
|
|
||||||
disabledFontColor: gray
|
|
||||||
}
|
|
||||||
toggle: {
|
|
||||||
font: default,
|
|
||||||
fontColor: white,
|
|
||||||
checked: button-down,
|
|
||||||
down: button-down,
|
|
||||||
up: button,
|
|
||||||
over: button-over,
|
|
||||||
disabled: button-disabled,
|
|
||||||
disabledFontColor: gray
|
|
||||||
}
|
|
||||||
},
|
|
||||||
ImageButtonStyle: {
|
|
||||||
default: {
|
|
||||||
down: button-down,
|
|
||||||
up: button,
|
|
||||||
over: button-over,
|
|
||||||
imageDisabledColor: gray,
|
|
||||||
imageUpColor: white,
|
|
||||||
disabled: button-disabled
|
|
||||||
},
|
|
||||||
node: {
|
|
||||||
up: button-over,
|
|
||||||
over: button-down
|
|
||||||
},
|
|
||||||
right: {
|
|
||||||
over: button-right-over,
|
|
||||||
down: button-right-down,
|
|
||||||
up: button-right
|
|
||||||
},
|
|
||||||
empty: {
|
|
||||||
imageDownColor: accent,
|
|
||||||
imageUpColor: white
|
|
||||||
},
|
|
||||||
emptytoggle: {
|
|
||||||
imageCheckedColor: white,
|
|
||||||
imageDownColor: white,
|
|
||||||
imageUpColor: gray
|
|
||||||
},
|
|
||||||
static: {
|
|
||||||
up: button
|
|
||||||
},
|
|
||||||
static-down: {
|
|
||||||
up: button-down
|
|
||||||
},
|
|
||||||
toggle: {
|
|
||||||
checked: button-down,
|
|
||||||
down: button-down,
|
|
||||||
up: button,
|
|
||||||
imageDisabledColor: gray,
|
|
||||||
imageUpColor: white
|
|
||||||
},
|
|
||||||
select: {
|
|
||||||
checked: button-select,
|
|
||||||
up: none
|
|
||||||
},
|
|
||||||
clear: {
|
|
||||||
down: flat-over,
|
|
||||||
up: flat,
|
|
||||||
over: flat-over
|
|
||||||
},
|
|
||||||
clear-full: {
|
|
||||||
down: whiteui,
|
|
||||||
up: pane,
|
|
||||||
over: flat-down
|
|
||||||
},
|
|
||||||
clear-partial: {
|
|
||||||
down: flat-down,
|
|
||||||
up: none,
|
|
||||||
over: flat-over
|
|
||||||
},
|
|
||||||
clear-toggle: {
|
|
||||||
down: flat-down,
|
|
||||||
checked: flat-down,
|
|
||||||
up: flat,
|
|
||||||
over: flat-over
|
|
||||||
},
|
|
||||||
clear-trans: {
|
|
||||||
down: flat-down,
|
|
||||||
up: flat-trans,
|
|
||||||
over: flat-over
|
|
||||||
},
|
|
||||||
clear-toggle-trans: {
|
|
||||||
down: flat-down,
|
|
||||||
checked: flat-down,
|
|
||||||
up: flat-trans,
|
|
||||||
over: flat-over
|
|
||||||
},
|
|
||||||
clear-toggle-partial: {
|
|
||||||
down: flat-down,
|
|
||||||
checked: flat-down,
|
|
||||||
up: none,
|
|
||||||
over: flat-over
|
|
||||||
},
|
|
||||||
},
|
|
||||||
ScrollPaneStyle: {
|
|
||||||
default: {
|
|
||||||
vScroll: scroll,
|
|
||||||
vScrollKnob: scroll-knob-vertical-black
|
|
||||||
},
|
|
||||||
horizontal: {
|
|
||||||
vScroll: scroll,
|
|
||||||
vScrollKnob: scroll-knob-vertical-black,
|
|
||||||
hScroll: scroll-horizontal,
|
|
||||||
hScrollKnob: scroll-knob-horizontal-black
|
|
||||||
},
|
|
||||||
},
|
|
||||||
WindowStyle: {
|
|
||||||
default: {
|
|
||||||
titleFont: default,
|
|
||||||
titleFontColor: accent
|
|
||||||
},
|
|
||||||
dialog: {
|
|
||||||
stageBackground: dialogDim,
|
|
||||||
titleFont: default,
|
|
||||||
background: window-empty,
|
|
||||||
titleFontColor: accent
|
|
||||||
},
|
|
||||||
fulldialog: {
|
|
||||||
stageBackground: dark,
|
|
||||||
titleFont: default,
|
|
||||||
background: window-empty,
|
|
||||||
titleFontColor: accent
|
|
||||||
}
|
|
||||||
},
|
|
||||||
KeybindDialogStyle: {
|
|
||||||
default: {
|
|
||||||
keyColor: accent,
|
|
||||||
keyNameColor: white,
|
|
||||||
controllerColor: lightgray
|
|
||||||
},
|
|
||||||
},
|
|
||||||
SliderStyle: {
|
|
||||||
default-horizontal: {
|
|
||||||
background: slider,
|
|
||||||
knob: slider-knob,
|
|
||||||
knobOver: slider-knob-over,
|
|
||||||
knobDown: slider-knob-down
|
|
||||||
},
|
|
||||||
default-vertical: {
|
|
||||||
background: slider-vertical,
|
|
||||||
knob: slider-knob,
|
|
||||||
knobOver: slider-knob-over,
|
|
||||||
knobDown: slider-knob-down
|
|
||||||
}
|
|
||||||
},
|
|
||||||
LabelStyle: {
|
|
||||||
default: {
|
|
||||||
font: default,
|
|
||||||
fontColor: white
|
|
||||||
},
|
|
||||||
outline: {
|
|
||||||
font: outline,
|
|
||||||
fontColor: white
|
|
||||||
}
|
|
||||||
},
|
|
||||||
TextFieldStyle: {
|
|
||||||
default: {
|
|
||||||
font: chat,
|
|
||||||
fontColor: white,
|
|
||||||
disabledFontColor: gray,
|
|
||||||
disabledBackground: underline-disabled,
|
|
||||||
selection: selection,
|
|
||||||
background: underline,
|
|
||||||
invalidBackground: underline-red,
|
|
||||||
cursor: cursor,
|
|
||||||
messageFont: default,
|
|
||||||
messageFontColor: gray
|
|
||||||
}
|
|
||||||
textarea: {
|
|
||||||
font: chat,
|
|
||||||
fontColor: white,
|
|
||||||
disabledFontColor: gray,
|
|
||||||
selection: selection,
|
|
||||||
background: underline,
|
|
||||||
cursor: cursor,
|
|
||||||
messageFont: default,
|
|
||||||
messageFontColor: gray
|
|
||||||
}
|
|
||||||
},
|
|
||||||
CheckBoxStyle: {
|
|
||||||
default: {
|
|
||||||
checkboxOn: check-on,
|
|
||||||
checkboxOff: check-off,
|
|
||||||
checkboxOnOver: check-on-over,
|
|
||||||
checkboxOver: check-over,
|
|
||||||
checkboxOnDisabled: check-on-disabled,
|
|
||||||
checkboxOffDisabled: check-disabled,
|
|
||||||
font: default,
|
|
||||||
fontColor: white,
|
|
||||||
disabledFontColor: gray,
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
Before Width: | Height: | Size: 7.7 KiB |
190
core/src/io/anuke/mindustry/ClientLauncher.java
Normal file
@@ -0,0 +1,190 @@
|
|||||||
|
package io.anuke.mindustry;
|
||||||
|
|
||||||
|
import io.anuke.arc.*;
|
||||||
|
import io.anuke.arc.assets.*;
|
||||||
|
import io.anuke.arc.graphics.*;
|
||||||
|
import io.anuke.arc.graphics.g2d.*;
|
||||||
|
import io.anuke.arc.math.*;
|
||||||
|
import io.anuke.arc.scene.ui.layout.*;
|
||||||
|
import io.anuke.arc.util.*;
|
||||||
|
import io.anuke.mindustry.core.*;
|
||||||
|
import io.anuke.mindustry.game.*;
|
||||||
|
import io.anuke.mindustry.game.EventType.*;
|
||||||
|
import io.anuke.mindustry.gen.*;
|
||||||
|
import io.anuke.mindustry.graphics.*;
|
||||||
|
import io.anuke.mindustry.maps.*;
|
||||||
|
import io.anuke.mindustry.net.Net;
|
||||||
|
|
||||||
|
import static io.anuke.arc.Core.*;
|
||||||
|
import static io.anuke.mindustry.Vars.*;
|
||||||
|
|
||||||
|
public abstract class ClientLauncher extends ApplicationCore implements Platform{
|
||||||
|
private static final int loadingFPS = 20;
|
||||||
|
|
||||||
|
private float smoothProgress;
|
||||||
|
private long lastTime;
|
||||||
|
private long beginTime;
|
||||||
|
private boolean finished = false;
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void setup(){
|
||||||
|
Vars.platform = this;
|
||||||
|
Log.setUseColors(false);
|
||||||
|
beginTime = Time.millis();
|
||||||
|
|
||||||
|
Time.setDeltaProvider(() -> {
|
||||||
|
float result = Core.graphics.getDeltaTime() * 60f;
|
||||||
|
return (Float.isNaN(result) || Float.isInfinite(result)) ? 1f : Mathf.clamp(result, 0.0001f, 60f / 10f);
|
||||||
|
});
|
||||||
|
|
||||||
|
batch = new SpriteBatch();
|
||||||
|
assets = new AssetManager();
|
||||||
|
assets.setLoader(Texture.class, "." + mapExtension, new MapPreviewLoader());
|
||||||
|
atlas = TextureAtlas.blankAtlas();
|
||||||
|
Vars.net = new Net(platform.getNet());
|
||||||
|
|
||||||
|
UI.loadSystemCursors();
|
||||||
|
|
||||||
|
assets.load(new Vars());
|
||||||
|
|
||||||
|
UI.loadDefaultFont();
|
||||||
|
|
||||||
|
assets.load(new AssetDescriptor<>("sprites/sprites.atlas", TextureAtlas.class)).loaded = t -> {
|
||||||
|
atlas = (TextureAtlas)t;
|
||||||
|
};
|
||||||
|
|
||||||
|
assets.loadRun("maps", Map.class, () -> maps.loadPreviews());
|
||||||
|
|
||||||
|
Musics.load();
|
||||||
|
Sounds.load();
|
||||||
|
|
||||||
|
assets.loadRun("contentcreate", Content.class, () -> {
|
||||||
|
content.createContent();
|
||||||
|
content.loadColors();
|
||||||
|
});
|
||||||
|
|
||||||
|
add(logic = new Logic());
|
||||||
|
add(control = new Control());
|
||||||
|
add(renderer = new Renderer());
|
||||||
|
add(ui = new UI());
|
||||||
|
add(netServer = new NetServer());
|
||||||
|
add(netClient = new NetClient());
|
||||||
|
|
||||||
|
assets.loadRun("contentinit", ContentLoader.class, () -> {
|
||||||
|
content.init();
|
||||||
|
content.load();
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void add(ApplicationListener module){
|
||||||
|
super.add(module);
|
||||||
|
|
||||||
|
//autoload modules when necessary
|
||||||
|
if(module instanceof Loadable){
|
||||||
|
assets.load((Loadable)module);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void resize(int width, int height){
|
||||||
|
if(assets == null) return;
|
||||||
|
|
||||||
|
if(!assets.isFinished()){
|
||||||
|
Draw.proj().setOrtho(0, 0, width, height);
|
||||||
|
}else{
|
||||||
|
super.resize(width, height);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void update(){
|
||||||
|
if(!finished){
|
||||||
|
drawLoading();
|
||||||
|
if(assets.update(1000 / loadingFPS)){
|
||||||
|
Log.info("Total time to load: {0}", Time.timeSinceMillis(beginTime));
|
||||||
|
for(ApplicationListener listener : modules){
|
||||||
|
listener.init();
|
||||||
|
}
|
||||||
|
super.resize(graphics.getWidth(), graphics.getHeight());
|
||||||
|
finished = true;
|
||||||
|
Events.fire(new ClientLoadEvent());
|
||||||
|
}
|
||||||
|
}else{
|
||||||
|
super.update();
|
||||||
|
}
|
||||||
|
|
||||||
|
int targetfps = Core.settings.getInt("fpscap", 120);
|
||||||
|
|
||||||
|
if(targetfps > 0 && targetfps <= 240){
|
||||||
|
long target = (1000 * 1000000) / targetfps; //target in nanos
|
||||||
|
long elapsed = Time.timeSinceNanos(lastTime);
|
||||||
|
if(elapsed < target){
|
||||||
|
try{
|
||||||
|
Thread.sleep((target - elapsed) / 1000000, (int)((target - elapsed) % 1000000));
|
||||||
|
}catch(InterruptedException ignored){
|
||||||
|
//ignore
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
lastTime = Time.nanos();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void init(){
|
||||||
|
setup();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void resume(){
|
||||||
|
if(finished){
|
||||||
|
super.resume();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void pause(){
|
||||||
|
if(finished){
|
||||||
|
super.pause();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void drawLoading(){
|
||||||
|
smoothProgress = Mathf.lerpDelta(smoothProgress, assets.getProgress(), 0.1f);
|
||||||
|
|
||||||
|
Core.graphics.clear(Pal.darkerGray);
|
||||||
|
Draw.proj().setOrtho(0, 0, Core.graphics.getWidth(), Core.graphics.getHeight());
|
||||||
|
|
||||||
|
float height = Scl.scl(50f);
|
||||||
|
|
||||||
|
Draw.color(Color.black);
|
||||||
|
Fill.poly(graphics.getWidth()/2f, graphics.getHeight()/2f, 6, Mathf.dst(graphics.getWidth()/2f, graphics.getHeight()/2f) * smoothProgress);
|
||||||
|
Draw.reset();
|
||||||
|
|
||||||
|
float w = graphics.getWidth()*0.6f;
|
||||||
|
|
||||||
|
Draw.color(Color.black);
|
||||||
|
Fill.rect(graphics.getWidth()/2f, graphics.getHeight()/2f, w, height);
|
||||||
|
|
||||||
|
Draw.color(Pal.accent);
|
||||||
|
Fill.crect(graphics.getWidth()/2f-w/2f, graphics.getHeight()/2f - height/2f, w * smoothProgress, height);
|
||||||
|
|
||||||
|
for(int i : Mathf.signs){
|
||||||
|
Fill.tri(graphics.getWidth()/2f + w/2f*i, graphics.getHeight()/2f + height/2f, graphics.getWidth()/2f + w/2f*i, graphics.getHeight()/2f - height/2f, graphics.getWidth()/2f + w/2f*i + height/2f*i, graphics.getHeight()/2f);
|
||||||
|
}
|
||||||
|
|
||||||
|
if(assets.isLoaded("outline")){
|
||||||
|
BitmapFont font = assets.get("outline");
|
||||||
|
font.draw((int)(assets.getProgress() * 100) + "%", graphics.getWidth() / 2f, graphics.getHeight() / 2f + Scl.scl(10f), Align.center);
|
||||||
|
font.draw(bundle.get("loading", "").replace("[accent]", ""), graphics.getWidth() / 2f, graphics.getHeight() / 2f + height / 2f + Scl.scl(20), Align.center);
|
||||||
|
|
||||||
|
if(assets.getCurrentLoading() != null){
|
||||||
|
String name = assets.getCurrentLoading().fileName.toLowerCase();
|
||||||
|
String key = name.contains("content") ? "content" : name.contains("msav") || name.contains("maps") ? "map" : name.contains("ogg") || name.contains("mp3") ? "sound" : name.contains("png") ? "image" : "system";
|
||||||
|
font.draw(bundle.get("load." + key, ""), graphics.getWidth() / 2f, graphics.getHeight() / 2f - height / 2f - Scl.scl(10f), Align.center);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
Draw.flush();
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -1,72 +0,0 @@
|
|||||||
package io.anuke.mindustry;
|
|
||||||
|
|
||||||
import io.anuke.arc.*;
|
|
||||||
import io.anuke.arc.math.*;
|
|
||||||
import io.anuke.arc.util.*;
|
|
||||||
import io.anuke.mindustry.core.*;
|
|
||||||
import io.anuke.mindustry.game.EventType.*;
|
|
||||||
import io.anuke.mindustry.gen.*;
|
|
||||||
import io.anuke.mindustry.io.*;
|
|
||||||
|
|
||||||
import static io.anuke.mindustry.Vars.*;
|
|
||||||
|
|
||||||
public class Mindustry extends ApplicationCore{
|
|
||||||
private long lastTime;
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void setup(){
|
|
||||||
Time.setDeltaProvider(() -> {
|
|
||||||
float result = Core.graphics.getDeltaTime() * 60f;
|
|
||||||
return (Float.isNaN(result) || Float.isInfinite(result)) ? 1f : Mathf.clamp(result, 0.0001f, 60f / 10f);
|
|
||||||
});
|
|
||||||
|
|
||||||
Time.mark();
|
|
||||||
UI.loadSystemCursors();
|
|
||||||
|
|
||||||
Vars.init();
|
|
||||||
Log.setUseColors(false);
|
|
||||||
BundleLoader.load();
|
|
||||||
Musics.load();
|
|
||||||
Sounds.load();
|
|
||||||
|
|
||||||
content.load();
|
|
||||||
content.loadColors();
|
|
||||||
|
|
||||||
add(logic = new Logic());
|
|
||||||
add(world = new World());
|
|
||||||
add(control = new Control());
|
|
||||||
add(renderer = new Renderer());
|
|
||||||
add(ui = new UI());
|
|
||||||
add(netServer = new NetServer());
|
|
||||||
add(netClient = new NetClient());
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void update(){
|
|
||||||
super.update();
|
|
||||||
|
|
||||||
int targetfps = Core.settings.getInt("fpscap", 120);
|
|
||||||
|
|
||||||
if(targetfps > 0 && targetfps <= 240){
|
|
||||||
long target = (1000 * 1000000) / targetfps; //target in nanos
|
|
||||||
long elapsed = Time.timeSinceNanos(lastTime);
|
|
||||||
if(elapsed < target){
|
|
||||||
try{
|
|
||||||
Thread.sleep((target - elapsed) / 1000000, (int)((target - elapsed) % 1000000));
|
|
||||||
}catch(InterruptedException ignored){
|
|
||||||
//ignore
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
lastTime = Time.nanos();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void init(){
|
|
||||||
super.init();
|
|
||||||
|
|
||||||
Log.info("Time to load [total]: {0}", Time.elapsed());
|
|
||||||
Events.fire(new ClientLoadEvent());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,36 +1,39 @@
|
|||||||
package io.anuke.mindustry;
|
package io.anuke.mindustry;
|
||||||
|
|
||||||
|
import io.anuke.arc.Application.*;
|
||||||
import io.anuke.arc.*;
|
import io.anuke.arc.*;
|
||||||
import io.anuke.arc.Application.ApplicationType;
|
import io.anuke.arc.assets.*;
|
||||||
import io.anuke.arc.files.FileHandle;
|
import io.anuke.arc.collection.*;
|
||||||
import io.anuke.arc.graphics.Color;
|
import io.anuke.arc.files.*;
|
||||||
import io.anuke.arc.util.Structs;
|
import io.anuke.arc.graphics.*;
|
||||||
|
import io.anuke.arc.scene.ui.layout.*;
|
||||||
|
import io.anuke.arc.util.*;
|
||||||
|
import io.anuke.mindustry.ai.*;
|
||||||
import io.anuke.mindustry.core.*;
|
import io.anuke.mindustry.core.*;
|
||||||
import io.anuke.mindustry.entities.*;
|
import io.anuke.mindustry.entities.*;
|
||||||
import io.anuke.mindustry.entities.bullet.Bullet;
|
import io.anuke.mindustry.entities.effect.*;
|
||||||
import io.anuke.mindustry.entities.effect.Fire;
|
import io.anuke.mindustry.entities.traits.*;
|
||||||
import io.anuke.mindustry.entities.effect.Puddle;
|
|
||||||
import io.anuke.mindustry.entities.impl.EffectEntity;
|
|
||||||
import io.anuke.mindustry.entities.traits.DrawTrait;
|
|
||||||
import io.anuke.mindustry.entities.traits.SyncTrait;
|
|
||||||
import io.anuke.mindustry.entities.type.*;
|
import io.anuke.mindustry.entities.type.*;
|
||||||
import io.anuke.mindustry.game.*;
|
import io.anuke.mindustry.game.*;
|
||||||
import io.anuke.mindustry.game.EventType.*;
|
import io.anuke.mindustry.gen.*;
|
||||||
import io.anuke.mindustry.gen.Serialization;
|
import io.anuke.mindustry.input.*;
|
||||||
|
import io.anuke.mindustry.maps.*;
|
||||||
import io.anuke.mindustry.net.Net;
|
import io.anuke.mindustry.net.Net;
|
||||||
import io.anuke.mindustry.world.blocks.defense.ForceProjector.ShieldEntity;
|
import io.anuke.mindustry.plugin.*;
|
||||||
|
import io.anuke.mindustry.world.blocks.defense.ForceProjector.*;
|
||||||
|
|
||||||
import java.nio.charset.Charset;
|
import java.nio.charset.*;
|
||||||
import java.util.Arrays;
|
import java.util.*;
|
||||||
import java.util.Locale;
|
|
||||||
|
import static io.anuke.arc.Core.settings;
|
||||||
|
|
||||||
@SuppressWarnings("unchecked")
|
@SuppressWarnings("unchecked")
|
||||||
public class Vars{
|
public class Vars implements Loadable{
|
||||||
/** Whether to load locales.*/
|
/** Whether to load locales.*/
|
||||||
public static boolean loadLocales = true;
|
public static boolean loadLocales = true;
|
||||||
/** IO buffer size. */
|
/** IO buffer size. */
|
||||||
public static final int bufferSize = 8192;
|
public static final int bufferSize = 8192;
|
||||||
/** global charset */
|
/** global charset, since Android doesn't support the Charsets class */
|
||||||
public static final Charset charset = Charset.forName("UTF-8");
|
public static final Charset charset = Charset.forName("UTF-8");
|
||||||
/** main application name, capitalized */
|
/** main application name, capitalized */
|
||||||
public static final String appName = "Mindustry";
|
public static final String appName = "Mindustry";
|
||||||
@@ -40,6 +43,8 @@ public class Vars{
|
|||||||
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 */
|
||||||
public static final String crashReportURL = "http://mins.us.to/report";
|
public static final String crashReportURL = "http://mins.us.to/report";
|
||||||
|
/** list of built-in servers.*/
|
||||||
|
public static final Array<String> defaultServers = Array.with(/*"mins.us.to"*/);
|
||||||
/** maximum distance between mine and core that supports automatic transferring */
|
/** maximum distance between mine and core that supports automatic transferring */
|
||||||
public static final float mineTransferRange = 220f;
|
public static final float mineTransferRange = 220f;
|
||||||
/** team of the player by default */
|
/** team of the player by default */
|
||||||
@@ -56,14 +61,6 @@ public class Vars{
|
|||||||
public static final float itemSize = 5f;
|
public static final float itemSize = 5f;
|
||||||
/** extra padding around the world; units outside this bound will begin to self-destruct. */
|
/** extra padding around the world; units outside this bound will begin to self-destruct. */
|
||||||
public static final float worldBounds = 100f;
|
public static final float worldBounds = 100f;
|
||||||
/** default size of UI icons.*/
|
|
||||||
public static final int iconsize = 48;
|
|
||||||
/** size of UI icons (small)*/
|
|
||||||
public static final int iconsizesmall = 32;
|
|
||||||
/** size of UI icons (medium)*/
|
|
||||||
public static final int iconsizemed = 30;
|
|
||||||
/** size of UI icons (medium)*/
|
|
||||||
public static final int iconsizetiny = 16;
|
|
||||||
/** units outside of this bound will simply die instantly */
|
/** units outside of this bound will simply die instantly */
|
||||||
public static final float finalWorldBounds = worldBounds + 500;
|
public static final float finalWorldBounds = worldBounds + 500;
|
||||||
/** ticks spent out of bound until self destruct. */
|
/** ticks spent out of bound until self destruct. */
|
||||||
@@ -109,16 +106,22 @@ public class Vars{
|
|||||||
public static boolean android;
|
public static boolean android;
|
||||||
/** whether the game is running on a headless server */
|
/** whether the game is running on a headless server */
|
||||||
public static boolean headless;
|
public static boolean headless;
|
||||||
|
/** whether steam is enabled for this game */
|
||||||
|
public static boolean steam;
|
||||||
/** application data directory, equivalent to {@link io.anuke.arc.Settings#getDataDirectory()} */
|
/** application data directory, equivalent to {@link io.anuke.arc.Settings#getDataDirectory()} */
|
||||||
public static FileHandle dataDirectory;
|
public static FileHandle dataDirectory;
|
||||||
/** data subdirectory used for screenshots */
|
/** data subdirectory used for screenshots */
|
||||||
public static FileHandle screenshotDirectory;
|
public static FileHandle screenshotDirectory;
|
||||||
/** data subdirectory used for custom mmaps */
|
/** data subdirectory used for custom mmaps */
|
||||||
public static FileHandle customMapDirectory;
|
public static FileHandle customMapDirectory;
|
||||||
|
/** data subdirectory used for custom mmaps */
|
||||||
|
public static FileHandle mapPreviewDirectory;
|
||||||
/** tmp subdirectory for map conversion */
|
/** tmp subdirectory for map conversion */
|
||||||
public static FileHandle tmpDirectory;
|
public static FileHandle tmpDirectory;
|
||||||
/** data subdirectory used for saves */
|
/** data subdirectory used for saves */
|
||||||
public static FileHandle saveDirectory;
|
public static FileHandle saveDirectory;
|
||||||
|
/** data subdirectory used for plugins */
|
||||||
|
public static FileHandle pluginDirectory;
|
||||||
/** old map file extension, for conversion */
|
/** old map file extension, for conversion */
|
||||||
public static final String oldMapExtension = "mmap";
|
public static final String oldMapExtension = "mmap";
|
||||||
/** map file extension */
|
/** map file extension */
|
||||||
@@ -129,21 +132,30 @@ public class Vars{
|
|||||||
/** list of all locales that can be switched to */
|
/** list of all locales that can be switched to */
|
||||||
public static Locale[] locales;
|
public static Locale[] locales;
|
||||||
|
|
||||||
|
public static Net net;
|
||||||
public static ContentLoader content;
|
public static ContentLoader content;
|
||||||
public static GameState state;
|
public static GameState state;
|
||||||
public static GlobalData data;
|
public static GlobalData data;
|
||||||
public static EntityCollisions collisions;
|
public static EntityCollisions collisions;
|
||||||
public static DefaultWaves defaultWaves;
|
public static DefaultWaves defaultWaves;
|
||||||
public static LoopControl loops;
|
public static LoopControl loops;
|
||||||
|
public static Platform platform;
|
||||||
|
public static Plugins plugins;
|
||||||
|
|
||||||
|
public static World world;
|
||||||
|
public static Maps maps;
|
||||||
|
public static WaveSpawner spawner;
|
||||||
|
public static BlockIndexer indexer;
|
||||||
|
public static Pathfinder pathfinder;
|
||||||
|
|
||||||
public static Control control;
|
public static Control control;
|
||||||
public static Logic logic;
|
public static Logic logic;
|
||||||
public static Renderer renderer;
|
public static Renderer renderer;
|
||||||
public static UI ui;
|
public static UI ui;
|
||||||
public static World world;
|
|
||||||
public static NetServer netServer;
|
public static NetServer netServer;
|
||||||
public static NetClient netClient;
|
public static NetClient netClient;
|
||||||
|
|
||||||
|
public static Entities entities;
|
||||||
public static EntityGroup<Player> playerGroup;
|
public static EntityGroup<Player> playerGroup;
|
||||||
public static EntityGroup<TileEntity> tileGroup;
|
public static EntityGroup<TileEntity> tileGroup;
|
||||||
public static EntityGroup<Bullet> bulletGroup;
|
public static EntityGroup<Bullet> bulletGroup;
|
||||||
@@ -154,9 +166,14 @@ public class Vars{
|
|||||||
public static EntityGroup<Fire> fireGroup;
|
public static EntityGroup<Fire> fireGroup;
|
||||||
public static EntityGroup<BaseUnit>[] unitGroups;
|
public static EntityGroup<BaseUnit>[] unitGroups;
|
||||||
|
|
||||||
/** all local players, currently only has one player. may be used for local co-op in the future */
|
|
||||||
public static Player player;
|
public static Player player;
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void loadAsync(){
|
||||||
|
loadSettings();
|
||||||
|
init();
|
||||||
|
}
|
||||||
|
|
||||||
public static void init(){
|
public static void init(){
|
||||||
Serialization.init();
|
Serialization.init();
|
||||||
|
|
||||||
@@ -179,31 +196,34 @@ public class Vars{
|
|||||||
Version.init();
|
Version.init();
|
||||||
|
|
||||||
content = new ContentLoader();
|
content = new ContentLoader();
|
||||||
if(!headless){
|
|
||||||
content.setVerbose();
|
|
||||||
}
|
|
||||||
|
|
||||||
loops = new LoopControl();
|
loops = new LoopControl();
|
||||||
defaultWaves = new DefaultWaves();
|
defaultWaves = new DefaultWaves();
|
||||||
collisions = new EntityCollisions();
|
collisions = new EntityCollisions();
|
||||||
|
world = new World();
|
||||||
|
|
||||||
playerGroup = Entities.addGroup(Player.class).enableMapping();
|
maps = new Maps();
|
||||||
tileGroup = Entities.addGroup(TileEntity.class, false);
|
spawner = new WaveSpawner();
|
||||||
bulletGroup = Entities.addGroup(Bullet.class).enableMapping();
|
indexer = new BlockIndexer();
|
||||||
effectGroup = Entities.addGroup(EffectEntity.class, false);
|
pathfinder = new Pathfinder();
|
||||||
groundEffectGroup = Entities.addGroup(DrawTrait.class, false);
|
|
||||||
puddleGroup = Entities.addGroup(Puddle.class).enableMapping();
|
entities = new Entities();
|
||||||
shieldGroup = Entities.addGroup(ShieldEntity.class, false);
|
playerGroup = entities.add(Player.class).enableMapping();
|
||||||
fireGroup = Entities.addGroup(Fire.class).enableMapping();
|
tileGroup = entities.add(TileEntity.class, false);
|
||||||
|
bulletGroup = entities.add(Bullet.class).enableMapping();
|
||||||
|
effectGroup = entities.add(EffectEntity.class, false);
|
||||||
|
groundEffectGroup = entities.add(DrawTrait.class, false);
|
||||||
|
puddleGroup = entities.add(Puddle.class).enableMapping();
|
||||||
|
shieldGroup = entities.add(ShieldEntity.class, false);
|
||||||
|
fireGroup = entities.add(Fire.class).enableMapping();
|
||||||
unitGroups = new EntityGroup[Team.all.length];
|
unitGroups = new EntityGroup[Team.all.length];
|
||||||
|
|
||||||
for(Team team : Team.all){
|
for(Team team : Team.all){
|
||||||
unitGroups[team.ordinal()] = Entities.addGroup(BaseUnit.class).enableMapping();
|
unitGroups[team.ordinal()] = entities.add(BaseUnit.class).enableMapping();
|
||||||
}
|
}
|
||||||
|
|
||||||
for(EntityGroup<?> group : Entities.getAllGroups()){
|
for(EntityGroup<?> group : entities.all()){
|
||||||
group.setRemoveListener(entity -> {
|
group.setRemoveListener(entity -> {
|
||||||
if(entity instanceof SyncTrait && Net.client()){
|
if(entity instanceof SyncTrait && net.client()){
|
||||||
netClient.addRemovedEntity((entity).getID());
|
netClient.addRemovedEntity((entity).getID());
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
@@ -216,14 +236,67 @@ public class Vars{
|
|||||||
ios = Core.app.getType() == ApplicationType.iOS;
|
ios = Core.app.getType() == ApplicationType.iOS;
|
||||||
android = Core.app.getType() == ApplicationType.Android;
|
android = Core.app.getType() == ApplicationType.Android;
|
||||||
|
|
||||||
Core.settings.setAppName(appName);
|
|
||||||
|
|
||||||
dataDirectory = Core.settings.getDataDirectory();
|
dataDirectory = Core.settings.getDataDirectory();
|
||||||
screenshotDirectory = dataDirectory.child("screenshots/");
|
screenshotDirectory = dataDirectory.child("screenshots/");
|
||||||
customMapDirectory = dataDirectory.child("maps/");
|
customMapDirectory = dataDirectory.child("maps/");
|
||||||
|
mapPreviewDirectory = dataDirectory.child("previews/");
|
||||||
saveDirectory = dataDirectory.child("saves/");
|
saveDirectory = dataDirectory.child("saves/");
|
||||||
tmpDirectory = dataDirectory.child("tmp/");
|
tmpDirectory = dataDirectory.child("tmp/");
|
||||||
|
pluginDirectory = dataDirectory.child("plugins/");
|
||||||
|
|
||||||
Events.fire(new AppLoadEvent());
|
maps.load();
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void loadSettings(){
|
||||||
|
Core.settings.setAppName(appName);
|
||||||
|
|
||||||
|
if(steam){
|
||||||
|
Core.settings.setDataDirectory(Core.files.local("saves/"));
|
||||||
|
}
|
||||||
|
|
||||||
|
Core.settings.defaults("locale", "default");
|
||||||
|
Core.keybinds.setDefaults(Binding.values());
|
||||||
|
Core.settings.load();
|
||||||
|
|
||||||
|
Scl.setProduct(settings.getInt("uiscale", 100) / 100f);
|
||||||
|
|
||||||
|
if(!loadLocales) return;
|
||||||
|
|
||||||
|
try{
|
||||||
|
//try loading external bundle
|
||||||
|
FileHandle handle = Core.files.local("bundle");
|
||||||
|
|
||||||
|
Locale locale = Locale.ENGLISH;
|
||||||
|
Core.bundle = I18NBundle.createBundle(handle, locale);
|
||||||
|
|
||||||
|
Log.info("NOTE: external translation bundle has been loaded.");
|
||||||
|
|
||||||
|
if(!headless){
|
||||||
|
Time.run(10f, () -> ui.showInfo("Note: You have successfully loaded an external translation bundle."));
|
||||||
|
}
|
||||||
|
}catch(Throwable e){
|
||||||
|
//no external bundle found
|
||||||
|
|
||||||
|
FileHandle handle = Core.files.internal("bundles/bundle");
|
||||||
|
|
||||||
|
Locale locale;
|
||||||
|
String loc = Core.settings.getString("locale");
|
||||||
|
if(loc.equals("default")){
|
||||||
|
locale = Locale.getDefault();
|
||||||
|
}else{
|
||||||
|
Locale lastLocale;
|
||||||
|
if(loc.contains("_")){
|
||||||
|
String[] split = loc.split("_");
|
||||||
|
lastLocale = new Locale(split[0], split[1]);
|
||||||
|
}else{
|
||||||
|
lastLocale = new Locale(loc);
|
||||||
|
}
|
||||||
|
|
||||||
|
locale = lastLocale;
|
||||||
|
}
|
||||||
|
|
||||||
|
Locale.setDefault(locale);
|
||||||
|
Core.bundle = I18NBundle.createBundle(handle, locale);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -24,7 +24,7 @@ public class BlockIndexer{
|
|||||||
private final static int quadrantSize = 16;
|
private final static int quadrantSize = 16;
|
||||||
|
|
||||||
/** Set of all ores that are being scanned. */
|
/** Set of all ores that are being scanned. */
|
||||||
private final ObjectSet<Item> scanOres = ObjectSet.with(Item.getAllOres().toArray(Item.class));
|
private final ObjectSet<Item> scanOres = new ObjectSet<>();
|
||||||
private final ObjectSet<Item> itemSet = new ObjectSet<>();
|
private final ObjectSet<Item> itemSet = new ObjectSet<>();
|
||||||
/** Stores all ore quadtrants on the map. */
|
/** Stores all ore quadtrants on the map. */
|
||||||
private ObjectMap<Item, ObjectSet<Tile>> ores;
|
private ObjectMap<Item, ObjectSet<Tile>> ores;
|
||||||
@@ -57,6 +57,8 @@ public class BlockIndexer{
|
|||||||
});
|
});
|
||||||
|
|
||||||
Events.on(WorldLoadEvent.class, event -> {
|
Events.on(WorldLoadEvent.class, event -> {
|
||||||
|
scanOres.clear();
|
||||||
|
scanOres.addAll(Item.getAllOres());
|
||||||
damagedTiles = new ObjectSet[Team.all.length];
|
damagedTiles = new ObjectSet[Team.all.length];
|
||||||
flagMap = new ObjectSet[Team.all.length][BlockFlag.all.length];
|
flagMap = new ObjectSet[Team.all.length][BlockFlag.all.length];
|
||||||
|
|
||||||
@@ -240,14 +242,13 @@ public class BlockIndexer{
|
|||||||
int quadrantY = tile.y / quadrantSize;
|
int quadrantY = tile.y / quadrantSize;
|
||||||
itemSet.clear();
|
itemSet.clear();
|
||||||
|
|
||||||
Tile rounded = world.tile(Mathf.clamp(quadrantX * quadrantSize + quadrantSize / 2, 0, world.width() - 1),
|
Tile rounded = world.tile(Mathf.clamp(quadrantX * quadrantSize + quadrantSize / 2, 0, world.width() - 1), Mathf.clamp(quadrantY * quadrantSize + quadrantSize / 2, 0, world.height() - 1));
|
||||||
Mathf.clamp(quadrantY * quadrantSize + quadrantSize / 2, 0, world.height() - 1));
|
|
||||||
|
|
||||||
//find all items that this quadrant contains
|
//find all items that this quadrant contains
|
||||||
for(int x = quadrantX * quadrantSize; x < world.width() && x < (quadrantX + 1) * quadrantSize; x++){
|
for(int x = Math.max(0, rounded.x - quadrantSize / 2); x < rounded.x + quadrantSize / 2 && x < world.width(); x++){
|
||||||
for(int y = quadrantY * quadrantSize; y < world.height() && y < (quadrantY + 1) * quadrantSize; y++){
|
for(int y = Math.max(0, rounded.y - quadrantSize / 2); y < rounded.y + quadrantSize / 2 && y < world.height(); y++){
|
||||||
Tile result = world.tile(x, y);
|
Tile result = world.tile(x, y);
|
||||||
if(result == null || result.drop() == null || !scanOres.contains(result.drop())) continue;
|
if(result == null || result.drop() == null || !scanOres.contains(result.drop()) || result.block() != Blocks.air) continue;
|
||||||
|
|
||||||
itemSet.add(result.drop());
|
itemSet.add(result.drop());
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -5,8 +5,7 @@ import io.anuke.arc.collection.IntArray;
|
|||||||
import io.anuke.arc.collection.IntQueue;
|
import io.anuke.arc.collection.IntQueue;
|
||||||
import io.anuke.arc.math.geom.Geometry;
|
import io.anuke.arc.math.geom.Geometry;
|
||||||
import io.anuke.arc.math.geom.Point2;
|
import io.anuke.arc.math.geom.Point2;
|
||||||
import io.anuke.arc.util.Structs;
|
import io.anuke.arc.util.*;
|
||||||
import io.anuke.arc.util.Time;
|
|
||||||
import io.anuke.mindustry.game.EventType.TileChangeEvent;
|
import io.anuke.mindustry.game.EventType.TileChangeEvent;
|
||||||
import io.anuke.mindustry.game.EventType.WorldLoadEvent;
|
import io.anuke.mindustry.game.EventType.WorldLoadEvent;
|
||||||
import io.anuke.mindustry.game.Team;
|
import io.anuke.mindustry.game.Team;
|
||||||
@@ -16,8 +15,7 @@ import io.anuke.mindustry.world.Pos;
|
|||||||
import io.anuke.mindustry.world.Tile;
|
import io.anuke.mindustry.world.Tile;
|
||||||
import io.anuke.mindustry.world.meta.BlockFlag;
|
import io.anuke.mindustry.world.meta.BlockFlag;
|
||||||
|
|
||||||
import static io.anuke.mindustry.Vars.state;
|
import static io.anuke.mindustry.Vars.*;
|
||||||
import static io.anuke.mindustry.Vars.world;
|
|
||||||
|
|
||||||
public class Pathfinder{
|
public class Pathfinder{
|
||||||
private static final long maxUpdate = Time.millisToNanos(4);
|
private static final long maxUpdate = Time.millisToNanos(4);
|
||||||
@@ -27,7 +25,7 @@ public class Pathfinder{
|
|||||||
public Pathfinder(){
|
public Pathfinder(){
|
||||||
Events.on(WorldLoadEvent.class, event -> clear());
|
Events.on(WorldLoadEvent.class, event -> clear());
|
||||||
Events.on(TileChangeEvent.class, event -> {
|
Events.on(TileChangeEvent.class, event -> {
|
||||||
if(Net.client()) return;
|
if(net.client()) return;
|
||||||
|
|
||||||
for(Team team : Team.all){
|
for(Team team : Team.all){
|
||||||
TeamData data = state.teams.get(team);
|
TeamData data = state.teams.get(team);
|
||||||
@@ -45,7 +43,7 @@ public class Pathfinder{
|
|||||||
}
|
}
|
||||||
|
|
||||||
public void update(){
|
public void update(){
|
||||||
if(Net.client() || paths == null) return;
|
if(net.client() || paths == null) return;
|
||||||
|
|
||||||
for(Team team : Team.all){
|
for(Team team : Team.all){
|
||||||
if(state.teams.isActive(team)){
|
if(state.teams.isActive(team)){
|
||||||
@@ -87,7 +85,7 @@ public class Pathfinder{
|
|||||||
}
|
}
|
||||||
|
|
||||||
private boolean passable(Tile tile, Team team){
|
private boolean passable(Tile tile, Team team){
|
||||||
return (!tile.solid()) || (tile.breakable() && (tile.getTeam() != team));
|
return ((!tile.solid()) || (tile.breakable() && (tile.getTeam() != team))) && tile.floor().drownTime <= 0f;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -117,7 +115,7 @@ public class Pathfinder{
|
|||||||
path.lastSearchTime = Time.millis();
|
path.lastSearchTime = Time.millis();
|
||||||
|
|
||||||
//add all targets to the frontier
|
//add all targets to the frontier
|
||||||
for(Tile other : world.indexer.getEnemy(team, BlockFlag.target)){
|
for(Tile other : indexer.getEnemy(team, BlockFlag.target)){
|
||||||
path.weights[other.x][other.y] = 0;
|
path.weights[other.x][other.y] = 0;
|
||||||
path.searches[other.x][other.y] = (short)path.search;
|
path.searches[other.x][other.y] = (short)path.search;
|
||||||
path.frontier.addFirst(other.pos());
|
path.frontier.addFirst(other.pos());
|
||||||
|
|||||||
@@ -14,7 +14,6 @@ import io.anuke.mindustry.entities.Effects;
|
|||||||
import io.anuke.mindustry.entities.type.BaseUnit;
|
import io.anuke.mindustry.entities.type.BaseUnit;
|
||||||
import io.anuke.mindustry.game.EventType.WorldLoadEvent;
|
import io.anuke.mindustry.game.EventType.WorldLoadEvent;
|
||||||
import io.anuke.mindustry.game.SpawnGroup;
|
import io.anuke.mindustry.game.SpawnGroup;
|
||||||
import io.anuke.mindustry.net.Net;
|
|
||||||
import io.anuke.mindustry.world.Tile;
|
import io.anuke.mindustry.world.Tile;
|
||||||
|
|
||||||
import static io.anuke.mindustry.Vars.*;
|
import static io.anuke.mindustry.Vars.*;
|
||||||
@@ -116,7 +115,7 @@ public class WaveSpawner{
|
|||||||
}
|
}
|
||||||
|
|
||||||
public boolean isSpawning(){
|
public boolean isSpawning(){
|
||||||
return spawning && !Net.client();
|
return spawning && !net.client();
|
||||||
}
|
}
|
||||||
|
|
||||||
private void reset(){
|
private void reset(){
|
||||||
|
|||||||
@@ -8,6 +8,7 @@ import io.anuke.arc.util.*;
|
|||||||
import io.anuke.mindustry.*;
|
import io.anuke.mindustry.*;
|
||||||
import io.anuke.mindustry.entities.*;
|
import io.anuke.mindustry.entities.*;
|
||||||
import io.anuke.mindustry.entities.bullet.*;
|
import io.anuke.mindustry.entities.bullet.*;
|
||||||
|
import io.anuke.mindustry.entities.type.Bullet;
|
||||||
import io.anuke.mindustry.game.*;
|
import io.anuke.mindustry.game.*;
|
||||||
import io.anuke.mindustry.gen.*;
|
import io.anuke.mindustry.gen.*;
|
||||||
import io.anuke.mindustry.graphics.*;
|
import io.anuke.mindustry.graphics.*;
|
||||||
@@ -500,6 +501,7 @@ public class Blocks implements ContentList{
|
|||||||
|
|
||||||
consumes.items(new ItemStack(Items.thorium, 4), new ItemStack(Items.sand, 10));
|
consumes.items(new ItemStack(Items.thorium, 4), new ItemStack(Items.sand, 10));
|
||||||
consumes.power(5f);
|
consumes.power(5f);
|
||||||
|
itemCapacity = 20;
|
||||||
|
|
||||||
int bottomRegion = reg("-bottom"), weaveRegion = reg("-weave");
|
int bottomRegion = reg("-bottom"), weaveRegion = reg("-weave");
|
||||||
|
|
||||||
@@ -589,7 +591,7 @@ public class Blocks implements ContentList{
|
|||||||
|
|
||||||
pyratiteMixer = new GenericSmelter("pyratite-mixer"){{
|
pyratiteMixer = new GenericSmelter("pyratite-mixer"){{
|
||||||
requirements(Category.crafting, ItemStack.with(Items.copper, 50, Items.lead, 25));
|
requirements(Category.crafting, ItemStack.with(Items.copper, 50, Items.lead, 25));
|
||||||
flameColor = Color.CLEAR;
|
flameColor = Color.clear;
|
||||||
hasItems = true;
|
hasItems = true;
|
||||||
hasPower = true;
|
hasPower = true;
|
||||||
outputItem = new ItemStack(Items.pyratite, 1);
|
outputItem = new ItemStack(Items.pyratite, 1);
|
||||||
@@ -660,7 +662,7 @@ public class Blocks implements ContentList{
|
|||||||
|
|
||||||
Draw.rect(region, tile.drawx(), tile.drawy());
|
Draw.rect(region, tile.drawx(), tile.drawy());
|
||||||
Draw.rect(reg(frameRegions[(int)Mathf.absin(entity.totalProgress, 5f, 2.999f)]), tile.drawx(), tile.drawy());
|
Draw.rect(reg(frameRegions[(int)Mathf.absin(entity.totalProgress, 5f, 2.999f)]), tile.drawx(), tile.drawy());
|
||||||
Draw.color(Color.CLEAR, tile.entity.liquids.current().color, tile.entity.liquids.total() / liquidCapacity);
|
Draw.color(Color.clear, tile.entity.liquids.current().color, tile.entity.liquids.total() / liquidCapacity);
|
||||||
Draw.rect(reg(liquidRegion), tile.drawx(), tile.drawy());
|
Draw.rect(reg(liquidRegion), tile.drawx(), tile.drawy());
|
||||||
Draw.color();
|
Draw.color();
|
||||||
Draw.rect(reg(topRegion), tile.drawx(), tile.drawy());
|
Draw.rect(reg(topRegion), tile.drawx(), tile.drawy());
|
||||||
@@ -982,7 +984,6 @@ public class Blocks implements ContentList{
|
|||||||
pulseConduit = new Conduit("pulse-conduit"){{
|
pulseConduit = new Conduit("pulse-conduit"){{
|
||||||
requirements(Category.liquid, ItemStack.with(Items.titanium, 1, Items.metaglass, 1));
|
requirements(Category.liquid, ItemStack.with(Items.titanium, 1, Items.metaglass, 1));
|
||||||
liquidCapacity = 16f;
|
liquidCapacity = 16f;
|
||||||
liquidFlowFactor = 4.9f;
|
|
||||||
health = 90;
|
health = 90;
|
||||||
}};
|
}};
|
||||||
|
|
||||||
@@ -1397,7 +1398,7 @@ public class Blocks implements ContentList{
|
|||||||
smokeEffect = Fx.lancerLaserShootSmoke;
|
smokeEffect = Fx.lancerLaserShootSmoke;
|
||||||
chargeEffect = Fx.lancerLaserCharge;
|
chargeEffect = Fx.lancerLaserCharge;
|
||||||
chargeBeginEffect = Fx.lancerLaserChargeBegin;
|
chargeBeginEffect = Fx.lancerLaserChargeBegin;
|
||||||
heatColor = Color.RED;
|
heatColor = Color.red;
|
||||||
size = 2;
|
size = 2;
|
||||||
health = 280 * size * size;
|
health = 280 * size * size;
|
||||||
targetAir = false;
|
targetAir = false;
|
||||||
@@ -1405,16 +1406,16 @@ public class Blocks implements ContentList{
|
|||||||
}};
|
}};
|
||||||
|
|
||||||
arc = new PowerTurret("arc"){{
|
arc = new PowerTurret("arc"){{
|
||||||
requirements(Category.turret, ItemStack.with(Items.copper, 35, Items.lead, 35));
|
requirements(Category.turret, ItemStack.with(Items.copper, 35, Items.lead, 50));
|
||||||
shootType = Bullets.arc;
|
shootType = Bullets.arc;
|
||||||
reload = 24f;
|
reload = 35f;
|
||||||
shootCone = 40f;
|
shootCone = 40f;
|
||||||
rotatespeed = 8f;
|
rotatespeed = 8f;
|
||||||
powerUse = 0.9f;
|
powerUse = 1.5f;
|
||||||
targetAir = false;
|
targetAir = false;
|
||||||
range = 95f;
|
range = 90f;
|
||||||
shootEffect = Fx.lightningShoot;
|
shootEffect = Fx.lightningShoot;
|
||||||
heatColor = Color.RED;
|
heatColor = Color.red;
|
||||||
recoil = 1f;
|
recoil = 1f;
|
||||||
size = 1;
|
size = 1;
|
||||||
health = 260;
|
health = 260;
|
||||||
@@ -1493,7 +1494,7 @@ public class Blocks implements ContentList{
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void init(Bullet b){
|
public void init(io.anuke.mindustry.entities.type.Bullet b){
|
||||||
for(int i = 0; i < rays; i++){
|
for(int i = 0; i < rays; i++){
|
||||||
Damage.collideLine(b, b.getTeam(), hitEffect, b.x, b.y, b.rot(), rayLength - Math.abs(i - (rays / 2)) * 20f);
|
Damage.collideLine(b, b.getTeam(), hitEffect, b.x, b.y, b.rot(), rayLength - Math.abs(i - (rays / 2)) * 20f);
|
||||||
}
|
}
|
||||||
@@ -1502,7 +1503,7 @@ public class Blocks implements ContentList{
|
|||||||
@Override
|
@Override
|
||||||
public void draw(Bullet b){
|
public void draw(Bullet b){
|
||||||
super.draw(b);
|
super.draw(b);
|
||||||
Draw.color(Color.WHITE, Pal.lancerLaser, b.fin());
|
Draw.color(Color.white, Pal.lancerLaser, b.fin());
|
||||||
//Draw.alpha(b.fout());
|
//Draw.alpha(b.fout());
|
||||||
for(int i = 0; i < 7; i++){
|
for(int i = 0; i < 7; i++){
|
||||||
Tmp.v1.trns(b.rot(), i * 8f);
|
Tmp.v1.trns(b.rot(), i * 8f);
|
||||||
@@ -1690,8 +1691,8 @@ public class Blocks implements ContentList{
|
|||||||
type = UnitTypes.crawler;
|
type = UnitTypes.crawler;
|
||||||
produceTime = 300;
|
produceTime = 300;
|
||||||
size = 2;
|
size = 2;
|
||||||
maxSpawn = 8;
|
maxSpawn = 6;
|
||||||
consumes.power(0.4f);
|
consumes.power(0.5f);
|
||||||
consumes.items(new ItemStack(Items.coal, 10));
|
consumes.items(new ItemStack(Items.coal, 10));
|
||||||
}};
|
}};
|
||||||
|
|
||||||
|
|||||||
@@ -7,12 +7,14 @@ import io.anuke.arc.util.*;
|
|||||||
import io.anuke.mindustry.entities.*;
|
import io.anuke.mindustry.entities.*;
|
||||||
import io.anuke.mindustry.entities.bullet.*;
|
import io.anuke.mindustry.entities.bullet.*;
|
||||||
import io.anuke.mindustry.entities.effect.*;
|
import io.anuke.mindustry.entities.effect.*;
|
||||||
|
import io.anuke.mindustry.entities.type.*;
|
||||||
|
import io.anuke.mindustry.entities.type.Bullet;
|
||||||
import io.anuke.mindustry.game.*;
|
import io.anuke.mindustry.game.*;
|
||||||
import io.anuke.mindustry.graphics.*;
|
import io.anuke.mindustry.graphics.*;
|
||||||
import io.anuke.mindustry.world.*;
|
import io.anuke.mindustry.world.*;
|
||||||
import io.anuke.mindustry.world.blocks.*;
|
import io.anuke.mindustry.world.blocks.*;
|
||||||
|
|
||||||
import static io.anuke.mindustry.Vars.world;
|
import static io.anuke.mindustry.Vars.*;
|
||||||
|
|
||||||
public class Bullets implements ContentList{
|
public class Bullets implements ContentList{
|
||||||
public static BulletType
|
public static BulletType
|
||||||
@@ -249,7 +251,7 @@ public class Bullets implements ContentList{
|
|||||||
splashDamageRadius = 25f;
|
splashDamageRadius = 25f;
|
||||||
splashDamage = 10f;
|
splashDamage = 10f;
|
||||||
lifetime = 120f;
|
lifetime = 120f;
|
||||||
trailColor = Color.GRAY;
|
trailColor = Color.gray;
|
||||||
backColor = Pal.bulletYellowBack;
|
backColor = Pal.bulletYellowBack;
|
||||||
frontColor = Pal.bulletYellow;
|
frontColor = Pal.bulletYellow;
|
||||||
hitEffect = Fx.blastExplosion;
|
hitEffect = Fx.blastExplosion;
|
||||||
@@ -395,7 +397,7 @@ public class Bullets implements ContentList{
|
|||||||
Draw.color(Pal.heal);
|
Draw.color(Pal.heal);
|
||||||
Lines.stroke(2f);
|
Lines.stroke(2f);
|
||||||
Lines.lineAngleCenter(b.x, b.y, b.rot(), 7f);
|
Lines.lineAngleCenter(b.x, b.y, b.rot(), 7f);
|
||||||
Draw.color(Color.WHITE);
|
Draw.color(Color.white);
|
||||||
Lines.lineAngleCenter(b.x, b.y, b.rot(), 3f);
|
Lines.lineAngleCenter(b.x, b.y, b.rot(), 3f);
|
||||||
Draw.reset();
|
Draw.reset();
|
||||||
}
|
}
|
||||||
@@ -429,7 +431,7 @@ public class Bullets implements ContentList{
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void draw(Bullet b){
|
public void draw(Bullet b){
|
||||||
Draw.color(Pal.lightFlame, Pal.darkFlame, Color.GRAY, b.fin());
|
Draw.color(Pal.lightFlame, Pal.darkFlame, Color.gray, b.fin());
|
||||||
Fill.circle(b.x, b.y, 3f * b.fout());
|
Fill.circle(b.x, b.y, 3f * b.fout());
|
||||||
Draw.reset();
|
Draw.reset();
|
||||||
}
|
}
|
||||||
@@ -497,7 +499,7 @@ public class Bullets implements ContentList{
|
|||||||
};
|
};
|
||||||
|
|
||||||
lancerLaser = new BulletType(0.001f, 140){
|
lancerLaser = new BulletType(0.001f, 140){
|
||||||
Color[] colors = {Pal.lancerLaser.cpy().mul(1f, 1f, 1f, 0.4f), Pal.lancerLaser, Color.WHITE};
|
Color[] colors = {Pal.lancerLaser.cpy().mul(1f, 1f, 1f, 0.4f), Pal.lancerLaser, Color.white};
|
||||||
float[] tscales = {1f, 0.7f, 0.5f, 0.2f};
|
float[] tscales = {1f, 0.7f, 0.5f, 0.2f};
|
||||||
float[] lenscales = {1f, 1.1f, 1.13f, 1.14f};
|
float[] lenscales = {1f, 1.1f, 1.13f, 1.14f};
|
||||||
float length = 160f;
|
float length = 160f;
|
||||||
@@ -539,7 +541,7 @@ public class Bullets implements ContentList{
|
|||||||
|
|
||||||
meltdownLaser = new BulletType(0.001f, 70){
|
meltdownLaser = new BulletType(0.001f, 70){
|
||||||
Color tmpColor = new Color();
|
Color tmpColor = new Color();
|
||||||
Color[] colors = {Color.valueOf("ec745855"), Color.valueOf("ec7458aa"), Color.valueOf("ff9c5a"), Color.WHITE};
|
Color[] colors = {Color.valueOf("ec745855"), Color.valueOf("ec7458aa"), Color.valueOf("ff9c5a"), Color.white};
|
||||||
float[] tscales = {1f, 0.7f, 0.5f, 0.2f};
|
float[] tscales = {1f, 0.7f, 0.5f, 0.2f};
|
||||||
float[] strokes = {2f, 1.5f, 1f, 0.3f};
|
float[] strokes = {2f, 1.5f, 1f, 0.3f};
|
||||||
float[] lenscales = {1f, 1.12f, 1.15f, 1.17f};
|
float[] lenscales = {1f, 1.12f, 1.15f, 1.17f};
|
||||||
@@ -631,11 +633,11 @@ public class Bullets implements ContentList{
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void init(Bullet b){
|
public void init(Bullet b){
|
||||||
Lightning.create(b.getTeam(), Pal.lancerLaser, damage, b.x, b.y, b.rot(), 30);
|
Lightning.create(b.getTeam(), Pal.lancerLaser, damage * (b.getOwner() instanceof Player ? state.rules.playerDamageMultiplier : 1f), b.x, b.y, b.rot(), 30);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
arc = new BulletType(0.001f, 25){
|
arc = new BulletType(0.001f, 21){
|
||||||
{
|
{
|
||||||
lifetime = 1;
|
lifetime = 1;
|
||||||
despawnEffect = Fx.none;
|
despawnEffect = Fx.none;
|
||||||
@@ -687,7 +689,7 @@ public class Bullets implements ContentList{
|
|||||||
bulletHeight = 12f;
|
bulletHeight = 12f;
|
||||||
hitEffect = Fx.pulverize;
|
hitEffect = Fx.pulverize;
|
||||||
backColor = new Color(0x4f4f4fff);
|
backColor = new Color(0x4f4f4fff);
|
||||||
frontColor = Color.GRAY;
|
frontColor = Color.gray;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|||||||
@@ -1,19 +1,17 @@
|
|||||||
package io.anuke.mindustry.content;
|
package io.anuke.mindustry.content;
|
||||||
|
|
||||||
import io.anuke.arc.Core;
|
import io.anuke.arc.*;
|
||||||
import io.anuke.arc.graphics.Color;
|
import io.anuke.arc.graphics.*;
|
||||||
import io.anuke.arc.graphics.g2d.*;
|
import io.anuke.arc.graphics.g2d.*;
|
||||||
import io.anuke.arc.math.Angles;
|
import io.anuke.arc.math.*;
|
||||||
import io.anuke.arc.math.Mathf;
|
import io.anuke.arc.util.*;
|
||||||
import io.anuke.arc.util.Tmp;
|
import io.anuke.mindustry.entities.Effects.*;
|
||||||
import io.anuke.mindustry.entities.Effects.Effect;
|
import io.anuke.mindustry.entities.effect.GroundEffectEntity.*;
|
||||||
import io.anuke.mindustry.entities.effect.GroundEffectEntity.GroundEffect;
|
import io.anuke.mindustry.entities.type.*;
|
||||||
import io.anuke.mindustry.entities.type.BaseUnit;
|
import io.anuke.mindustry.game.*;
|
||||||
import io.anuke.mindustry.game.ContentList;
|
import io.anuke.mindustry.graphics.*;
|
||||||
import io.anuke.mindustry.graphics.Pal;
|
import io.anuke.mindustry.type.*;
|
||||||
import io.anuke.mindustry.graphics.Drawf;
|
import io.anuke.mindustry.type.Item.*;
|
||||||
import io.anuke.mindustry.type.Item;
|
|
||||||
import io.anuke.mindustry.type.Item.Icon;
|
|
||||||
|
|
||||||
import static io.anuke.mindustry.Vars.tilesize;
|
import static io.anuke.mindustry.Vars.tilesize;
|
||||||
|
|
||||||
@@ -32,7 +30,7 @@ public class Fx implements ContentList{
|
|||||||
bigShockwave, nuclearShockwave, explosion, blockExplosion, blockExplosionSmoke, shootSmall, shootHeal, shootSmallSmoke, shootBig, shootBig2, shootBigSmoke,
|
bigShockwave, nuclearShockwave, explosion, blockExplosion, blockExplosionSmoke, shootSmall, shootHeal, shootSmallSmoke, shootBig, shootBig2, shootBigSmoke,
|
||||||
shootBigSmoke2, shootSmallFlame, shootPyraFlame, shootLiquid, shellEjectSmall, shellEjectMedium,
|
shootBigSmoke2, shootSmallFlame, shootPyraFlame, shootLiquid, shellEjectSmall, shellEjectMedium,
|
||||||
shellEjectBig, lancerLaserShoot, lancerLaserShootSmoke, lancerLaserCharge, lancerLaserChargeBegin, lightningCharge, lightningShoot,
|
shellEjectBig, lancerLaserShoot, lancerLaserShootSmoke, lancerLaserCharge, lancerLaserChargeBegin, lightningCharge, lightningShoot,
|
||||||
unitSpawn, spawnShockwave, magmasmoke, impactShockwave, impactcloud, impactsmoke, dynamicExplosion, padlaunch, commandSend;
|
unitSpawn, spawnShockwave, magmasmoke, impactShockwave, impactcloud, impactsmoke, dynamicExplosion, padlaunch, commandSend, coreLand;
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void load(){
|
public void load(){
|
||||||
@@ -93,14 +91,14 @@ public class Fx implements ContentList{
|
|||||||
});
|
});
|
||||||
|
|
||||||
smoke = new Effect(100, e -> {
|
smoke = new Effect(100, e -> {
|
||||||
Draw.color(Color.GRAY, Pal.darkishGray, e.fin());
|
Draw.color(Color.gray, Pal.darkishGray, e.fin());
|
||||||
float size = 7f - e.fin() * 7f;
|
float size = 7f - e.fin() * 7f;
|
||||||
Draw.rect("circle", e.x, e.y, size, size);
|
Draw.rect("circle", e.x, e.y, size, size);
|
||||||
Draw.reset();
|
Draw.reset();
|
||||||
});
|
});
|
||||||
|
|
||||||
magmasmoke = new Effect(110, e -> {
|
magmasmoke = new Effect(110, e -> {
|
||||||
Draw.color(Color.GRAY);
|
Draw.color(Color.gray);
|
||||||
Fill.circle(e.x, e.y, e.fslope() * 6f);
|
Fill.circle(e.x, e.y, e.fslope() * 6f);
|
||||||
Draw.reset();
|
Draw.reset();
|
||||||
});
|
});
|
||||||
@@ -180,7 +178,7 @@ public class Fx implements ContentList{
|
|||||||
|
|
||||||
|
|
||||||
hitBulletSmall = new Effect(14, e -> {
|
hitBulletSmall = new Effect(14, e -> {
|
||||||
Draw.color(Color.WHITE, Pal.lightOrange, e.fin());
|
Draw.color(Color.white, Pal.lightOrange, e.fin());
|
||||||
|
|
||||||
e.scaled(7f, s -> {
|
e.scaled(7f, s -> {
|
||||||
Lines.stroke(0.5f + s.fout());
|
Lines.stroke(0.5f + s.fout());
|
||||||
@@ -199,7 +197,7 @@ public class Fx implements ContentList{
|
|||||||
});
|
});
|
||||||
|
|
||||||
hitFuse = new Effect(14, e -> {
|
hitFuse = new Effect(14, e -> {
|
||||||
Draw.color(Color.WHITE, Pal.surge, e.fin());
|
Draw.color(Color.white, Pal.surge, e.fin());
|
||||||
|
|
||||||
e.scaled(7f, s -> {
|
e.scaled(7f, s -> {
|
||||||
Lines.stroke(0.5f + s.fout());
|
Lines.stroke(0.5f + s.fout());
|
||||||
@@ -218,7 +216,7 @@ public class Fx implements ContentList{
|
|||||||
});
|
});
|
||||||
|
|
||||||
hitBulletBig = new Effect(13, e -> {
|
hitBulletBig = new Effect(13, e -> {
|
||||||
Draw.color(Color.WHITE, Pal.lightOrange, e.fin());
|
Draw.color(Color.white, Pal.lightOrange, e.fin());
|
||||||
Lines.stroke(0.5f + e.fout() * 1.5f);
|
Lines.stroke(0.5f + e.fout() * 1.5f);
|
||||||
|
|
||||||
Angles.randLenVectors(e.id, 8, e.finpow() * 30f, e.rotation, 50f, (x, y) -> {
|
Angles.randLenVectors(e.id, 8, e.finpow() * 30f, e.rotation, 50f, (x, y) -> {
|
||||||
@@ -252,7 +250,7 @@ public class Fx implements ContentList{
|
|||||||
});
|
});
|
||||||
|
|
||||||
hitLancer = new Effect(12, e -> {
|
hitLancer = new Effect(12, e -> {
|
||||||
Draw.color(Color.WHITE);
|
Draw.color(Color.white);
|
||||||
Lines.stroke(e.fout() * 1.5f);
|
Lines.stroke(e.fout() * 1.5f);
|
||||||
|
|
||||||
Angles.randLenVectors(e.id, 8, e.finpow() * 17f, e.rotation, 360f, (x, y) -> {
|
Angles.randLenVectors(e.id, 8, e.finpow() * 17f, e.rotation, 360f, (x, y) -> {
|
||||||
@@ -276,14 +274,14 @@ public class Fx implements ContentList{
|
|||||||
});
|
});
|
||||||
|
|
||||||
hitLaser = new Effect(8, e -> {
|
hitLaser = new Effect(8, e -> {
|
||||||
Draw.color(Color.WHITE, Pal.heal, e.fin());
|
Draw.color(Color.white, Pal.heal, e.fin());
|
||||||
Lines.stroke(0.5f + e.fout());
|
Lines.stroke(0.5f + e.fout());
|
||||||
Lines.circle(e.x, e.y, e.fin() * 5f);
|
Lines.circle(e.x, e.y, e.fin() * 5f);
|
||||||
Draw.reset();
|
Draw.reset();
|
||||||
});
|
});
|
||||||
|
|
||||||
despawn = new Effect(12, e -> {
|
despawn = new Effect(12, e -> {
|
||||||
Draw.color(Pal.lighterOrange, Color.GRAY, e.fin());
|
Draw.color(Pal.lighterOrange, Color.gray, e.fin());
|
||||||
Lines.stroke(e.fout());
|
Lines.stroke(e.fout());
|
||||||
|
|
||||||
Angles.randLenVectors(e.id, 7, e.fin() * 7f, e.rotation, 40f, (x, y) -> {
|
Angles.randLenVectors(e.id, 7, e.fin() * 7f, e.rotation, 40f, (x, y) -> {
|
||||||
@@ -302,7 +300,7 @@ public class Fx implements ContentList{
|
|||||||
Lines.circle(e.x, e.y, 3f + i.fin() * 10f);
|
Lines.circle(e.x, e.y, 3f + i.fin() * 10f);
|
||||||
});
|
});
|
||||||
|
|
||||||
Draw.color(Color.GRAY);
|
Draw.color(Color.gray);
|
||||||
|
|
||||||
Angles.randLenVectors(e.id, 5, 2f + 23f * e.finpow(), (x, y) -> {
|
Angles.randLenVectors(e.id, 5, 2f + 23f * e.finpow(), (x, y) -> {
|
||||||
Fill.circle(e.x + x, e.y + y, e.fout() * 3f + 0.5f);
|
Fill.circle(e.x + x, e.y + y, e.fout() * 3f + 0.5f);
|
||||||
@@ -326,7 +324,7 @@ public class Fx implements ContentList{
|
|||||||
Lines.circle(e.x, e.y, 3f + i.fin() * 24f);
|
Lines.circle(e.x, e.y, 3f + i.fin() * 24f);
|
||||||
});
|
});
|
||||||
|
|
||||||
Draw.color(Color.GRAY);
|
Draw.color(Color.gray);
|
||||||
|
|
||||||
Angles.randLenVectors(e.id, 7, 2f + 28f * e.finpow(), (x, y) -> {
|
Angles.randLenVectors(e.id, 7, 2f + 28f * e.finpow(), (x, y) -> {
|
||||||
Fill.circle(e.x + x, e.y + y, e.fout() * 4f + 0.5f);
|
Fill.circle(e.x + x, e.y + y, e.fout() * 4f + 0.5f);
|
||||||
@@ -350,7 +348,7 @@ public class Fx implements ContentList{
|
|||||||
Lines.circle(e.x, e.y, 3f + i.fin() * 34f);
|
Lines.circle(e.x, e.y, 3f + i.fin() * 34f);
|
||||||
});
|
});
|
||||||
|
|
||||||
Draw.color(Color.GRAY);
|
Draw.color(Color.gray);
|
||||||
|
|
||||||
Angles.randLenVectors(e.id, 7, 2f + 30f * e.finpow(), (x, y) -> {
|
Angles.randLenVectors(e.id, 7, 2f + 30f * e.finpow(), (x, y) -> {
|
||||||
Fill.circle(e.x + x, e.y + y, e.fout() * 4f + 0.5f);
|
Fill.circle(e.x + x, e.y + y, e.fout() * 4f + 0.5f);
|
||||||
@@ -374,7 +372,7 @@ public class Fx implements ContentList{
|
|||||||
Lines.circle(e.x, e.y, 3f + i.fin() * 15f);
|
Lines.circle(e.x, e.y, 3f + i.fin() * 15f);
|
||||||
});
|
});
|
||||||
|
|
||||||
Draw.color(Color.GRAY);
|
Draw.color(Color.gray);
|
||||||
|
|
||||||
Angles.randLenVectors(e.id, 5, 2f + 23f * e.finpow(), (x, y) -> {
|
Angles.randLenVectors(e.id, 5, 2f + 23f * e.finpow(), (x, y) -> {
|
||||||
Fill.circle(e.x + x, e.y + y, e.fout() * 4f + 0.5f);
|
Fill.circle(e.x + x, e.y + y, e.fout() * 4f + 0.5f);
|
||||||
@@ -423,7 +421,7 @@ public class Fx implements ContentList{
|
|||||||
Lines.circle(e.x, e.y, 3f + i.fin() * 25f);
|
Lines.circle(e.x, e.y, 3f + i.fin() * 25f);
|
||||||
});
|
});
|
||||||
|
|
||||||
Draw.color(Color.GRAY);
|
Draw.color(Color.gray);
|
||||||
|
|
||||||
Angles.randLenVectors(e.id, 6, 2f + 23f * e.finpow(), (x, y) -> {
|
Angles.randLenVectors(e.id, 6, 2f + 23f * e.finpow(), (x, y) -> {
|
||||||
Fill.circle(e.x + x, e.y + y, e.fout() * 4f + 0.5f);
|
Fill.circle(e.x + x, e.y + y, e.fout() * 4f + 0.5f);
|
||||||
@@ -461,7 +459,7 @@ public class Fx implements ContentList{
|
|||||||
});
|
});
|
||||||
|
|
||||||
fireSmoke = new Effect(35f, e -> {
|
fireSmoke = new Effect(35f, e -> {
|
||||||
Draw.color(Color.GRAY);
|
Draw.color(Color.gray);
|
||||||
|
|
||||||
Angles.randLenVectors(e.id, 1, 2f + e.fin() * 7f, (x, y) -> {
|
Angles.randLenVectors(e.id, 1, 2f + e.fin() * 7f, (x, y) -> {
|
||||||
Fill.circle(e.x + x, e.y + y, 0.2f + e.fslope() * 1.5f);
|
Fill.circle(e.x + x, e.y + y, 0.2f + e.fslope() * 1.5f);
|
||||||
@@ -471,7 +469,7 @@ public class Fx implements ContentList{
|
|||||||
});
|
});
|
||||||
|
|
||||||
steam = new Effect(35f, e -> {
|
steam = new Effect(35f, e -> {
|
||||||
Draw.color(Color.LIGHT_GRAY);
|
Draw.color(Color.lightGray);
|
||||||
|
|
||||||
Angles.randLenVectors(e.id, 2, 2f + e.fin() * 7f, (x, y) -> {
|
Angles.randLenVectors(e.id, 2, 2f + e.fin() * 7f, (x, y) -> {
|
||||||
Fill.circle(e.x + x, e.y + y, 0.2f + e.fslope() * 1.5f);
|
Fill.circle(e.x + x, e.y + y, 0.2f + e.fslope() * 1.5f);
|
||||||
@@ -481,7 +479,7 @@ public class Fx implements ContentList{
|
|||||||
});
|
});
|
||||||
|
|
||||||
fireballsmoke = new Effect(25f, e -> {
|
fireballsmoke = new Effect(25f, e -> {
|
||||||
Draw.color(Color.GRAY);
|
Draw.color(Color.gray);
|
||||||
|
|
||||||
Angles.randLenVectors(e.id, 1, 2f + e.fin() * 7f, (x, y) -> {
|
Angles.randLenVectors(e.id, 1, 2f + e.fin() * 7f, (x, y) -> {
|
||||||
Fill.circle(e.x + x, e.y + y, 0.2f + e.fout() * 1.5f);
|
Fill.circle(e.x + x, e.y + y, 0.2f + e.fout() * 1.5f);
|
||||||
@@ -511,7 +509,7 @@ public class Fx implements ContentList{
|
|||||||
});
|
});
|
||||||
|
|
||||||
melting = new Effect(40f, e -> {
|
melting = new Effect(40f, e -> {
|
||||||
Draw.color(Liquids.slag.color, Color.WHITE, e.fout() / 5f + Mathf.randomSeedRange(e.id, 0.12f));
|
Draw.color(Liquids.slag.color, Color.white, e.fout() / 5f + Mathf.randomSeedRange(e.id, 0.12f));
|
||||||
|
|
||||||
Angles.randLenVectors(e.id, 2, 1f + e.fin() * 3f, (x, y) -> {
|
Angles.randLenVectors(e.id, 2, 1f + e.fin() * 3f, (x, y) -> {
|
||||||
Fill.circle(e.x + x, e.y + y, .2f + e.fout() * 1.2f);
|
Fill.circle(e.x + x, e.y + y, .2f + e.fout() * 1.2f);
|
||||||
@@ -559,35 +557,35 @@ public class Fx implements ContentList{
|
|||||||
|
|
||||||
|
|
||||||
shockwave = new Effect(10f, 80f, e -> {
|
shockwave = new Effect(10f, 80f, e -> {
|
||||||
Draw.color(Color.WHITE, Color.LIGHT_GRAY, e.fin());
|
Draw.color(Color.white, Color.lightGray, e.fin());
|
||||||
Lines.stroke(e.fout() * 2f + 0.2f);
|
Lines.stroke(e.fout() * 2f + 0.2f);
|
||||||
Lines.circle(e.x, e.y, e.fin() * 28f);
|
Lines.circle(e.x, e.y, e.fin() * 28f);
|
||||||
Draw.reset();
|
Draw.reset();
|
||||||
});
|
});
|
||||||
|
|
||||||
bigShockwave = new Effect(10f, 80f, e -> {
|
bigShockwave = new Effect(10f, 80f, e -> {
|
||||||
Draw.color(Color.WHITE, Color.LIGHT_GRAY, e.fin());
|
Draw.color(Color.white, Color.lightGray, e.fin());
|
||||||
Lines.stroke(e.fout() * 3f);
|
Lines.stroke(e.fout() * 3f);
|
||||||
Lines.circle(e.x, e.y, e.fin() * 50f);
|
Lines.circle(e.x, e.y, e.fin() * 50f);
|
||||||
Draw.reset();
|
Draw.reset();
|
||||||
});
|
});
|
||||||
|
|
||||||
nuclearShockwave = new Effect(10f, 200f, e -> {
|
nuclearShockwave = new Effect(10f, 200f, e -> {
|
||||||
Draw.color(Color.WHITE, Color.LIGHT_GRAY, e.fin());
|
Draw.color(Color.white, Color.lightGray, e.fin());
|
||||||
Lines.stroke(e.fout() * 3f + 0.2f);
|
Lines.stroke(e.fout() * 3f + 0.2f);
|
||||||
Lines.circle(e.x, e.y, e.fin() * 140f);
|
Lines.circle(e.x, e.y, e.fin() * 140f);
|
||||||
Draw.reset();
|
Draw.reset();
|
||||||
});
|
});
|
||||||
|
|
||||||
impactShockwave = new Effect(13f, 300f, e -> {
|
impactShockwave = new Effect(13f, 300f, e -> {
|
||||||
Draw.color(Pal.lighterOrange, Color.LIGHT_GRAY, e.fin());
|
Draw.color(Pal.lighterOrange, Color.lightGray, e.fin());
|
||||||
Lines.stroke(e.fout() * 4f + 0.2f);
|
Lines.stroke(e.fout() * 4f + 0.2f);
|
||||||
Lines.circle(e.x, e.y, e.fin() * 200f);
|
Lines.circle(e.x, e.y, e.fin() * 200f);
|
||||||
Draw.reset();
|
Draw.reset();
|
||||||
});
|
});
|
||||||
|
|
||||||
spawnShockwave = new Effect(20f, 400f, e -> {
|
spawnShockwave = new Effect(20f, 400f, e -> {
|
||||||
Draw.color(Color.WHITE, Color.LIGHT_GRAY, e.fin());
|
Draw.color(Color.white, Color.lightGray, e.fin());
|
||||||
Lines.stroke(e.fout() * 3f + 0.5f);
|
Lines.stroke(e.fout() * 3f + 0.5f);
|
||||||
Lines.circle(e.x, e.y, e.fin() * (e.rotation + 50f));
|
Lines.circle(e.x, e.y, e.fin() * (e.rotation + 50f));
|
||||||
Draw.reset();
|
Draw.reset();
|
||||||
@@ -599,14 +597,14 @@ public class Fx implements ContentList{
|
|||||||
Lines.circle(e.x, e.y, 3f + i.fin() * 10f);
|
Lines.circle(e.x, e.y, 3f + i.fin() * 10f);
|
||||||
});
|
});
|
||||||
|
|
||||||
Draw.color(Color.GRAY);
|
Draw.color(Color.gray);
|
||||||
|
|
||||||
Angles.randLenVectors(e.id, 6, 2f + 19f * e.finpow(), (x, y) -> {
|
Angles.randLenVectors(e.id, 6, 2f + 19f * e.finpow(), (x, y) -> {
|
||||||
Fill.circle(e.x + x, e.y + y, e.fout() * 3f + 0.5f);
|
Fill.circle(e.x + x, e.y + y, e.fout() * 3f + 0.5f);
|
||||||
Fill.circle(e.x + x / 2f, e.y + y / 2f, e.fout() * 1f);
|
Fill.circle(e.x + x / 2f, e.y + y / 2f, e.fout() * 1f);
|
||||||
});
|
});
|
||||||
|
|
||||||
Draw.color(Pal.lighterOrange, Pal.lightOrange, Color.GRAY, e.fin());
|
Draw.color(Pal.lighterOrange, Pal.lightOrange, Color.gray, e.fin());
|
||||||
Lines.stroke(1.5f * e.fout());
|
Lines.stroke(1.5f * e.fout());
|
||||||
|
|
||||||
Angles.randLenVectors(e.id + 1, 8, 1f + 23f * e.finpow(), (x, y) -> {
|
Angles.randLenVectors(e.id + 1, 8, 1f + 23f * e.finpow(), (x, y) -> {
|
||||||
@@ -624,14 +622,14 @@ public class Fx implements ContentList{
|
|||||||
Lines.circle(e.x, e.y, (3f + i.fin() * 14f) * intensity);
|
Lines.circle(e.x, e.y, (3f + i.fin() * 14f) * intensity);
|
||||||
});
|
});
|
||||||
|
|
||||||
Draw.color(Color.GRAY);
|
Draw.color(Color.gray);
|
||||||
|
|
||||||
Angles.randLenVectors(e.id, e.finpow(), (int)(6 * intensity), 21f * intensity, (x, y, in, out) -> {
|
Angles.randLenVectors(e.id, e.finpow(), (int)(6 * intensity), 21f * intensity, (x, y, in, out) -> {
|
||||||
Fill.circle(e.x + x, e.y + y, out * (2f + intensity) * 3 + 0.5f);
|
Fill.circle(e.x + x, e.y + y, out * (2f + intensity) * 3 + 0.5f);
|
||||||
Fill.circle(e.x + x / 2f, e.y + y / 2f, out * (intensity) * 3);
|
Fill.circle(e.x + x / 2f, e.y + y / 2f, out * (intensity) * 3);
|
||||||
});
|
});
|
||||||
|
|
||||||
Draw.color(Pal.lighterOrange, Pal.lightOrange, Color.GRAY, e.fin());
|
Draw.color(Pal.lighterOrange, Pal.lightOrange, Color.gray, e.fin());
|
||||||
Lines.stroke((1.7f * e.fout()) * (1f + (intensity - 1f) / 2f));
|
Lines.stroke((1.7f * e.fout()) * (1f + (intensity - 1f) / 2f));
|
||||||
|
|
||||||
Angles.randLenVectors(e.id + 1, e.finpow(), (int)(9 * intensity), 40f * intensity, (x, y, in, out) -> {
|
Angles.randLenVectors(e.id + 1, e.finpow(), (int)(9 * intensity), 40f * intensity, (x, y, in, out) -> {
|
||||||
@@ -647,14 +645,14 @@ public class Fx implements ContentList{
|
|||||||
Lines.circle(e.x, e.y, 3f + i.fin() * 14f);
|
Lines.circle(e.x, e.y, 3f + i.fin() * 14f);
|
||||||
});
|
});
|
||||||
|
|
||||||
Draw.color(Color.GRAY);
|
Draw.color(Color.gray);
|
||||||
|
|
||||||
Angles.randLenVectors(e.id, 6, 2f + 19f * e.finpow(), (x, y) -> {
|
Angles.randLenVectors(e.id, 6, 2f + 19f * e.finpow(), (x, y) -> {
|
||||||
Fill.circle(e.x + x, e.y + y, e.fout() * 3f + 0.5f);
|
Fill.circle(e.x + x, e.y + y, e.fout() * 3f + 0.5f);
|
||||||
Fill.circle(e.x + x / 2f, e.y + y / 2f, e.fout() * 1f);
|
Fill.circle(e.x + x / 2f, e.y + y / 2f, e.fout() * 1f);
|
||||||
});
|
});
|
||||||
|
|
||||||
Draw.color(Pal.lighterOrange, Pal.lightOrange, Color.GRAY, e.fin());
|
Draw.color(Pal.lighterOrange, Pal.lightOrange, Color.gray, e.fin());
|
||||||
Lines.stroke(1.7f * e.fout());
|
Lines.stroke(1.7f * e.fout());
|
||||||
|
|
||||||
Angles.randLenVectors(e.id + 1, 9, 1f + 23f * e.finpow(), (x, y) -> {
|
Angles.randLenVectors(e.id + 1, 9, 1f + 23f * e.finpow(), (x, y) -> {
|
||||||
@@ -665,7 +663,7 @@ public class Fx implements ContentList{
|
|||||||
});
|
});
|
||||||
|
|
||||||
blockExplosionSmoke = new Effect(30, e -> {
|
blockExplosionSmoke = new Effect(30, e -> {
|
||||||
Draw.color(Color.GRAY);
|
Draw.color(Color.gray);
|
||||||
|
|
||||||
Angles.randLenVectors(e.id, 6, 4f + 30f * e.finpow(), (x, y) -> {
|
Angles.randLenVectors(e.id, 6, 4f + 30f * e.finpow(), (x, y) -> {
|
||||||
Fill.circle(e.x + x, e.y + y, e.fout() * 3f);
|
Fill.circle(e.x + x, e.y + y, e.fout() * 3f);
|
||||||
@@ -693,7 +691,7 @@ public class Fx implements ContentList{
|
|||||||
});
|
});
|
||||||
|
|
||||||
shootSmallSmoke = new Effect(20f, e -> {
|
shootSmallSmoke = new Effect(20f, e -> {
|
||||||
Draw.color(Pal.lighterOrange, Color.LIGHT_GRAY, Color.GRAY, e.fin());
|
Draw.color(Pal.lighterOrange, Color.lightGray, Color.gray, e.fin());
|
||||||
|
|
||||||
Angles.randLenVectors(e.id, 5, e.finpow() * 6f, e.rotation, 20f, (x, y) -> {
|
Angles.randLenVectors(e.id, 5, e.finpow() * 6f, e.rotation, 20f, (x, y) -> {
|
||||||
Fill.circle(e.x + x, e.y + y, e.fout() * 1.5f);
|
Fill.circle(e.x + x, e.y + y, e.fout() * 1.5f);
|
||||||
@@ -711,7 +709,7 @@ public class Fx implements ContentList{
|
|||||||
});
|
});
|
||||||
|
|
||||||
shootBig2 = new Effect(10, e -> {
|
shootBig2 = new Effect(10, e -> {
|
||||||
Draw.color(Pal.lightOrange, Color.GRAY, e.fin());
|
Draw.color(Pal.lightOrange, Color.gray, e.fin());
|
||||||
float w = 1.2f + 8 * e.fout();
|
float w = 1.2f + 8 * e.fout();
|
||||||
Drawf.tri(e.x, e.y, w, 29f * e.fout(), e.rotation);
|
Drawf.tri(e.x, e.y, w, 29f * e.fout(), e.rotation);
|
||||||
Drawf.tri(e.x, e.y, w, 5f * e.fout(), e.rotation + 180f);
|
Drawf.tri(e.x, e.y, w, 5f * e.fout(), e.rotation + 180f);
|
||||||
@@ -719,7 +717,7 @@ public class Fx implements ContentList{
|
|||||||
});
|
});
|
||||||
|
|
||||||
shootBigSmoke = new Effect(17f, e -> {
|
shootBigSmoke = new Effect(17f, e -> {
|
||||||
Draw.color(Pal.lighterOrange, Color.LIGHT_GRAY, Color.GRAY, e.fin());
|
Draw.color(Pal.lighterOrange, Color.lightGray, Color.gray, e.fin());
|
||||||
|
|
||||||
Angles.randLenVectors(e.id, 8, e.finpow() * 19f, e.rotation, 10f, (x, y) -> {
|
Angles.randLenVectors(e.id, 8, e.finpow() * 19f, e.rotation, 10f, (x, y) -> {
|
||||||
Fill.circle(e.x + x, e.y + y, e.fout() * 2f + 0.2f);
|
Fill.circle(e.x + x, e.y + y, e.fout() * 2f + 0.2f);
|
||||||
@@ -729,7 +727,7 @@ public class Fx implements ContentList{
|
|||||||
});
|
});
|
||||||
|
|
||||||
shootBigSmoke2 = new Effect(18f, e -> {
|
shootBigSmoke2 = new Effect(18f, e -> {
|
||||||
Draw.color(Pal.lightOrange, Color.LIGHT_GRAY, Color.GRAY, e.fin());
|
Draw.color(Pal.lightOrange, Color.lightGray, Color.gray, e.fin());
|
||||||
|
|
||||||
Angles.randLenVectors(e.id, 9, e.finpow() * 23f, e.rotation, 20f, (x, y) -> {
|
Angles.randLenVectors(e.id, 9, e.finpow() * 23f, e.rotation, 20f, (x, y) -> {
|
||||||
Fill.circle(e.x + x, e.y + y, e.fout() * 2.4f + 0.2f);
|
Fill.circle(e.x + x, e.y + y, e.fout() * 2.4f + 0.2f);
|
||||||
@@ -739,7 +737,7 @@ public class Fx implements ContentList{
|
|||||||
});
|
});
|
||||||
|
|
||||||
shootSmallFlame = new Effect(32f, e -> {
|
shootSmallFlame = new Effect(32f, e -> {
|
||||||
Draw.color(Pal.lightFlame, Pal.darkFlame, Color.GRAY, e.fin());
|
Draw.color(Pal.lightFlame, Pal.darkFlame, Color.gray, e.fin());
|
||||||
|
|
||||||
Angles.randLenVectors(e.id, 8, e.finpow() * 60f, e.rotation, 10f, (x, y) -> {
|
Angles.randLenVectors(e.id, 8, e.finpow() * 60f, e.rotation, 10f, (x, y) -> {
|
||||||
Fill.circle(e.x + x, e.y + y, 0.65f + e.fout() * 1.5f);
|
Fill.circle(e.x + x, e.y + y, 0.65f + e.fout() * 1.5f);
|
||||||
@@ -749,7 +747,7 @@ public class Fx implements ContentList{
|
|||||||
});
|
});
|
||||||
|
|
||||||
shootPyraFlame = new Effect(33f, e -> {
|
shootPyraFlame = new Effect(33f, e -> {
|
||||||
Draw.color(Pal.lightPyraFlame, Pal.darkPyraFlame, Color.GRAY, e.fin());
|
Draw.color(Pal.lightPyraFlame, Pal.darkPyraFlame, Color.gray, e.fin());
|
||||||
|
|
||||||
Angles.randLenVectors(e.id, 10, e.finpow() * 70f, e.rotation, 10f, (x, y) -> {
|
Angles.randLenVectors(e.id, 10, e.finpow() * 70f, e.rotation, 10f, (x, y) -> {
|
||||||
Fill.circle(e.x + x, e.y + y, 0.65f + e.fout() * 1.6f);
|
Fill.circle(e.x + x, e.y + y, 0.65f + e.fout() * 1.6f);
|
||||||
@@ -759,7 +757,7 @@ public class Fx implements ContentList{
|
|||||||
});
|
});
|
||||||
|
|
||||||
shootLiquid = new Effect(40f, e -> {
|
shootLiquid = new Effect(40f, e -> {
|
||||||
Draw.color(e.color, Color.WHITE, e.fout() / 6f + Mathf.randomSeedRange(e.id, 0.1f));
|
Draw.color(e.color, Color.white, e.fout() / 6f + Mathf.randomSeedRange(e.id, 0.1f));
|
||||||
|
|
||||||
Angles.randLenVectors(e.id, 6, e.finpow() * 60f, e.rotation, 11f, (x, y) -> {
|
Angles.randLenVectors(e.id, 6, e.finpow() * 60f, e.rotation, 11f, (x, y) -> {
|
||||||
Fill.circle(e.x + x, e.y + y, 0.5f + e.fout() * 2.5f);
|
Fill.circle(e.x + x, e.y + y, 0.5f + e.fout() * 2.5f);
|
||||||
@@ -769,7 +767,7 @@ public class Fx implements ContentList{
|
|||||||
});
|
});
|
||||||
|
|
||||||
shellEjectSmall = new GroundEffect(30f, 400f, e -> {
|
shellEjectSmall = new GroundEffect(30f, 400f, e -> {
|
||||||
Draw.color(Pal.lightOrange, Color.LIGHT_GRAY, Pal.lightishGray, e.fin());
|
Draw.color(Pal.lightOrange, Color.lightGray, Pal.lightishGray, e.fin());
|
||||||
float rot = Math.abs(e.rotation) + 90f;
|
float rot = Math.abs(e.rotation) + 90f;
|
||||||
|
|
||||||
int i = Mathf.sign(e.rotation);
|
int i = Mathf.sign(e.rotation);
|
||||||
@@ -784,7 +782,7 @@ public class Fx implements ContentList{
|
|||||||
});
|
});
|
||||||
|
|
||||||
shellEjectMedium = new GroundEffect(34f, 400f, e -> {
|
shellEjectMedium = new GroundEffect(34f, 400f, e -> {
|
||||||
Draw.color(Pal.lightOrange, Color.LIGHT_GRAY, Pal.lightishGray, e.fin());
|
Draw.color(Pal.lightOrange, Color.lightGray, Pal.lightishGray, e.fin());
|
||||||
float rot = e.rotation + 90f;
|
float rot = e.rotation + 90f;
|
||||||
for(int i : Mathf.signs){
|
for(int i : Mathf.signs){
|
||||||
float len = (2f + e.finpow() * 10f) * i;
|
float len = (2f + e.finpow() * 10f) * i;
|
||||||
@@ -795,7 +793,7 @@ public class Fx implements ContentList{
|
|||||||
2f, 3f, rot);
|
2f, 3f, rot);
|
||||||
}
|
}
|
||||||
|
|
||||||
Draw.color(Color.LIGHT_GRAY, Color.GRAY, e.fin());
|
Draw.color(Color.lightGray, Color.gray, e.fin());
|
||||||
|
|
||||||
for(int i : Mathf.signs){
|
for(int i : Mathf.signs){
|
||||||
float ex = e.x, ey = e.y, fout = e.fout();
|
float ex = e.x, ey = e.y, fout = e.fout();
|
||||||
@@ -808,7 +806,7 @@ public class Fx implements ContentList{
|
|||||||
});
|
});
|
||||||
|
|
||||||
shellEjectBig = new GroundEffect(22f, 400f, e -> {
|
shellEjectBig = new GroundEffect(22f, 400f, e -> {
|
||||||
Draw.color(Pal.lightOrange, Color.LIGHT_GRAY, Pal.lightishGray, e.fin());
|
Draw.color(Pal.lightOrange, Color.lightGray, Pal.lightishGray, e.fin());
|
||||||
float rot = e.rotation + 90f;
|
float rot = e.rotation + 90f;
|
||||||
for(int i : Mathf.signs){
|
for(int i : Mathf.signs){
|
||||||
float len = (4f + e.finpow() * 8f) * i;
|
float len = (4f + e.finpow() * 8f) * i;
|
||||||
@@ -820,7 +818,7 @@ public class Fx implements ContentList{
|
|||||||
rot + e.fin() * 30f * i + Mathf.randomSeedRange(e.id + i + 9, 40f * e.fin()));
|
rot + e.fin() * 30f * i + Mathf.randomSeedRange(e.id + i + 9, 40f * e.fin()));
|
||||||
}
|
}
|
||||||
|
|
||||||
Draw.color(Color.LIGHT_GRAY);
|
Draw.color(Color.lightGray);
|
||||||
|
|
||||||
for(int i : Mathf.signs){
|
for(int i : Mathf.signs){
|
||||||
float ex = e.x, ey = e.y, fout = e.fout();
|
float ex = e.x, ey = e.y, fout = e.fout();
|
||||||
@@ -881,7 +879,7 @@ public class Fx implements ContentList{
|
|||||||
});
|
});
|
||||||
|
|
||||||
lightningShoot = new Effect(12f, e -> {
|
lightningShoot = new Effect(12f, e -> {
|
||||||
Draw.color(Color.WHITE, Pal.lancerLaser, e.fin());
|
Draw.color(Color.white, Pal.lancerLaser, e.fin());
|
||||||
Lines.stroke(e.fout() * 1.2f + 0.5f);
|
Lines.stroke(e.fout() * 1.2f + 0.5f);
|
||||||
|
|
||||||
Angles.randLenVectors(e.id, 7, 25f * e.finpow(), e.rotation, 50f, (x, y) -> {
|
Angles.randLenVectors(e.id, 7, 25f * e.finpow(), e.rotation, 50f, (x, y) -> {
|
||||||
@@ -895,7 +893,7 @@ public class Fx implements ContentList{
|
|||||||
reactorsmoke = new Effect(17, e -> {
|
reactorsmoke = new Effect(17, e -> {
|
||||||
Angles.randLenVectors(e.id, 4, e.fin() * 8f, (x, y) -> {
|
Angles.randLenVectors(e.id, 4, e.fin() * 8f, (x, y) -> {
|
||||||
float size = 1f + e.fout() * 5f;
|
float size = 1f + e.fout() * 5f;
|
||||||
Draw.color(Color.LIGHT_GRAY, Color.GRAY, e.fin());
|
Draw.color(Color.lightGray, Color.gray, e.fin());
|
||||||
Draw.rect("circle", e.x + x, e.y + y, size, size);
|
Draw.rect("circle", e.x + x, e.y + y, size, size);
|
||||||
Draw.reset();
|
Draw.reset();
|
||||||
});
|
});
|
||||||
@@ -903,7 +901,7 @@ public class Fx implements ContentList{
|
|||||||
nuclearsmoke = new Effect(40, e -> {
|
nuclearsmoke = new Effect(40, e -> {
|
||||||
Angles.randLenVectors(e.id, 4, e.fin() * 13f, (x, y) -> {
|
Angles.randLenVectors(e.id, 4, e.fin() * 13f, (x, y) -> {
|
||||||
float size = e.fslope() * 4f;
|
float size = e.fslope() * 4f;
|
||||||
Draw.color(Color.LIGHT_GRAY, Color.GRAY, e.fin());
|
Draw.color(Color.lightGray, Color.gray, e.fin());
|
||||||
Draw.rect("circle", e.x + x, e.y + y, size, size);
|
Draw.rect("circle", e.x + x, e.y + y, size, size);
|
||||||
Draw.reset();
|
Draw.reset();
|
||||||
});
|
});
|
||||||
@@ -911,7 +909,7 @@ public class Fx implements ContentList{
|
|||||||
nuclearcloud = new Effect(90, 200f, e -> {
|
nuclearcloud = new Effect(90, 200f, e -> {
|
||||||
Angles.randLenVectors(e.id, 10, e.finpow() * 90f, (x, y) -> {
|
Angles.randLenVectors(e.id, 10, e.finpow() * 90f, (x, y) -> {
|
||||||
float size = e.fout() * 14f;
|
float size = e.fout() * 14f;
|
||||||
Draw.color(Color.LIME, Color.GRAY, e.fin());
|
Draw.color(Color.lime, Color.gray, e.fin());
|
||||||
Draw.rect("circle", e.x + x, e.y + y, size, size);
|
Draw.rect("circle", e.x + x, e.y + y, size, size);
|
||||||
Draw.reset();
|
Draw.reset();
|
||||||
});
|
});
|
||||||
@@ -919,7 +917,7 @@ public class Fx implements ContentList{
|
|||||||
impactsmoke = new Effect(60, e -> {
|
impactsmoke = new Effect(60, e -> {
|
||||||
Angles.randLenVectors(e.id, 7, e.fin() * 20f, (x, y) -> {
|
Angles.randLenVectors(e.id, 7, e.fin() * 20f, (x, y) -> {
|
||||||
float size = e.fslope() * 4f;
|
float size = e.fslope() * 4f;
|
||||||
Draw.color(Color.LIGHT_GRAY, Color.GRAY, e.fin());
|
Draw.color(Color.lightGray, Color.gray, e.fin());
|
||||||
Draw.rect("circle", e.x + x, e.y + y, size, size);
|
Draw.rect("circle", e.x + x, e.y + y, size, size);
|
||||||
Draw.reset();
|
Draw.reset();
|
||||||
});
|
});
|
||||||
@@ -927,7 +925,7 @@ public class Fx implements ContentList{
|
|||||||
impactcloud = new Effect(140, 400f, e -> {
|
impactcloud = new Effect(140, 400f, e -> {
|
||||||
Angles.randLenVectors(e.id, 20, e.finpow() * 160f, (x, y) -> {
|
Angles.randLenVectors(e.id, 20, e.finpow() * 160f, (x, y) -> {
|
||||||
float size = e.fout() * 15f;
|
float size = e.fout() * 15f;
|
||||||
Draw.color(Pal.lighterOrange, Color.LIGHT_GRAY, e.fin());
|
Draw.color(Pal.lighterOrange, Color.lightGray, e.fin());
|
||||||
Draw.rect("circle", e.x + x, e.y + y, size, size);
|
Draw.rect("circle", e.x + x, e.y + y, size, size);
|
||||||
Draw.reset();
|
Draw.reset();
|
||||||
});
|
});
|
||||||
@@ -935,7 +933,7 @@ public class Fx implements ContentList{
|
|||||||
redgeneratespark = new Effect(18, e -> {
|
redgeneratespark = new Effect(18, e -> {
|
||||||
Angles.randLenVectors(e.id, 5, e.fin() * 8f, (x, y) -> {
|
Angles.randLenVectors(e.id, 5, e.fin() * 8f, (x, y) -> {
|
||||||
float len = e.fout() * 4f;
|
float len = e.fout() * 4f;
|
||||||
Draw.color(Pal.redSpark, Color.GRAY, e.fin());
|
Draw.color(Pal.redSpark, Color.gray, e.fin());
|
||||||
Draw.rect("circle", e.x + x, e.y + y, len, len);
|
Draw.rect("circle", e.x + x, e.y + y, len, len);
|
||||||
Draw.reset();
|
Draw.reset();
|
||||||
});
|
});
|
||||||
@@ -943,7 +941,7 @@ public class Fx implements ContentList{
|
|||||||
generatespark = new Effect(18, e -> {
|
generatespark = new Effect(18, e -> {
|
||||||
Angles.randLenVectors(e.id, 5, e.fin() * 8f, (x, y) -> {
|
Angles.randLenVectors(e.id, 5, e.fin() * 8f, (x, y) -> {
|
||||||
float len = e.fout() * 4f;
|
float len = e.fout() * 4f;
|
||||||
Draw.color(Pal.orangeSpark, Color.GRAY, e.fin());
|
Draw.color(Pal.orangeSpark, Color.gray, e.fin());
|
||||||
Draw.rect("circle", e.x + x, e.y + y, len, len);
|
Draw.rect("circle", e.x + x, e.y + y, len, len);
|
||||||
Draw.reset();
|
Draw.reset();
|
||||||
});
|
});
|
||||||
@@ -951,14 +949,14 @@ public class Fx implements ContentList{
|
|||||||
fuelburn = new Effect(23, e -> {
|
fuelburn = new Effect(23, e -> {
|
||||||
Angles.randLenVectors(e.id, 5, e.fin() * 9f, (x, y) -> {
|
Angles.randLenVectors(e.id, 5, e.fin() * 9f, (x, y) -> {
|
||||||
float len = e.fout() * 4f;
|
float len = e.fout() * 4f;
|
||||||
Draw.color(Color.LIGHT_GRAY, Color.GRAY, e.fin());
|
Draw.color(Color.lightGray, Color.gray, e.fin());
|
||||||
Draw.rect("circle", e.x + x, e.y + y, len, len);
|
Draw.rect("circle", e.x + x, e.y + y, len, len);
|
||||||
Draw.reset();
|
Draw.reset();
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
plasticburn = new Effect(40, e -> {
|
plasticburn = new Effect(40, e -> {
|
||||||
Angles.randLenVectors(e.id, 5, 3f + e.fin() * 5f, (x, y) -> {
|
Angles.randLenVectors(e.id, 5, 3f + e.fin() * 5f, (x, y) -> {
|
||||||
Draw.color(Color.valueOf("e9ead3"), Color.GRAY, e.fin());
|
Draw.color(Color.valueOf("e9ead3"), Color.gray, e.fin());
|
||||||
Fill.circle(e.x + x, e.y + y, e.fout() * 1f);
|
Fill.circle(e.x + x, e.y + y, e.fout() * 1f);
|
||||||
Draw.reset();
|
Draw.reset();
|
||||||
});
|
});
|
||||||
@@ -1000,21 +998,21 @@ public class Fx implements ContentList{
|
|||||||
});
|
});
|
||||||
producesmoke = new Effect(12, e -> {
|
producesmoke = new Effect(12, e -> {
|
||||||
Angles.randLenVectors(e.id, 8, 4f + e.fin() * 18f, (x, y) -> {
|
Angles.randLenVectors(e.id, 8, 4f + e.fin() * 18f, (x, y) -> {
|
||||||
Draw.color(Color.WHITE, Pal.accent, e.fin());
|
Draw.color(Color.white, Pal.accent, e.fin());
|
||||||
Fill.square(e.x + x, e.y + y, 1f + e.fout() * 3f, 45);
|
Fill.square(e.x + x, e.y + y, 1f + e.fout() * 3f, 45);
|
||||||
Draw.reset();
|
Draw.reset();
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
smeltsmoke = new Effect(15, e -> {
|
smeltsmoke = new Effect(15, e -> {
|
||||||
Angles.randLenVectors(e.id, 6, 4f + e.fin() * 5f, (x, y) -> {
|
Angles.randLenVectors(e.id, 6, 4f + e.fin() * 5f, (x, y) -> {
|
||||||
Draw.color(Color.WHITE, e.color, e.fin());
|
Draw.color(Color.white, e.color, e.fin());
|
||||||
Fill.square(e.x + x, e.y + y, 0.5f + e.fout() * 2f, 45);
|
Fill.square(e.x + x, e.y + y, 0.5f + e.fout() * 2f, 45);
|
||||||
Draw.reset();
|
Draw.reset();
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
formsmoke = new Effect(40, e -> {
|
formsmoke = new Effect(40, e -> {
|
||||||
Angles.randLenVectors(e.id, 6, 5f + e.fin() * 8f, (x, y) -> {
|
Angles.randLenVectors(e.id, 6, 5f + e.fin() * 8f, (x, y) -> {
|
||||||
Draw.color(Pal.plasticSmoke, Color.LIGHT_GRAY, e.fin());
|
Draw.color(Pal.plasticSmoke, Color.lightGray, e.fin());
|
||||||
Fill.square(e.x + x, e.y + y, 0.2f + e.fout() * 2f, 45);
|
Fill.square(e.x + x, e.y + y, 0.2f + e.fout() * 2f, 45);
|
||||||
Draw.reset();
|
Draw.reset();
|
||||||
});
|
});
|
||||||
@@ -1022,7 +1020,7 @@ public class Fx implements ContentList{
|
|||||||
blastsmoke = new Effect(26, e -> {
|
blastsmoke = new Effect(26, e -> {
|
||||||
Angles.randLenVectors(e.id, 12, 1f + e.fin() * 23f, (x, y) -> {
|
Angles.randLenVectors(e.id, 12, 1f + e.fin() * 23f, (x, y) -> {
|
||||||
float size = 2f + e.fout() * 6f;
|
float size = 2f + e.fout() * 6f;
|
||||||
Draw.color(Color.LIGHT_GRAY, Color.DARK_GRAY, e.fin());
|
Draw.color(Color.lightGray, Color.darkGray, e.fin());
|
||||||
Draw.rect("circle", e.x + x, e.y + y, size, size);
|
Draw.rect("circle", e.x + x, e.y + y, size, size);
|
||||||
Draw.reset();
|
Draw.reset();
|
||||||
});
|
});
|
||||||
@@ -1030,7 +1028,7 @@ public class Fx implements ContentList{
|
|||||||
lava = new Effect(18, e -> {
|
lava = new Effect(18, e -> {
|
||||||
Angles.randLenVectors(e.id, 3, 1f + e.fin() * 10f, (x, y) -> {
|
Angles.randLenVectors(e.id, 3, 1f + e.fin() * 10f, (x, y) -> {
|
||||||
float size = e.fslope() * 4f;
|
float size = e.fslope() * 4f;
|
||||||
Draw.color(Color.ORANGE, Color.GRAY, e.fin());
|
Draw.color(Color.orange, Color.gray, e.fin());
|
||||||
Draw.rect("circle", e.x + x, e.y + y, size, size);
|
Draw.rect("circle", e.x + x, e.y + y, size, size);
|
||||||
Draw.reset();
|
Draw.reset();
|
||||||
});
|
});
|
||||||
@@ -1056,53 +1054,53 @@ public class Fx implements ContentList{
|
|||||||
Draw.reset();
|
Draw.reset();
|
||||||
});
|
});
|
||||||
purify = new Effect(10, e -> {
|
purify = new Effect(10, e -> {
|
||||||
Draw.color(Color.ROYAL, Color.GRAY, e.fin());
|
Draw.color(Color.royal, Color.gray, e.fin());
|
||||||
Lines.stroke(2f);
|
Lines.stroke(2f);
|
||||||
Lines.spikes(e.x, e.y, e.fin() * 4f, 2, 6);
|
Lines.spikes(e.x, e.y, e.fin() * 4f, 2, 6);
|
||||||
Draw.reset();
|
Draw.reset();
|
||||||
});
|
});
|
||||||
purifyoil = new Effect(10, e -> {
|
purifyoil = new Effect(10, e -> {
|
||||||
Draw.color(Color.BLACK, Color.GRAY, e.fin());
|
Draw.color(Color.black, Color.gray, e.fin());
|
||||||
Lines.stroke(2f);
|
Lines.stroke(2f);
|
||||||
Lines.spikes(e.x, e.y, e.fin() * 4f, 2, 6);
|
Lines.spikes(e.x, e.y, e.fin() * 4f, 2, 6);
|
||||||
Draw.reset();
|
Draw.reset();
|
||||||
});
|
});
|
||||||
purifystone = new Effect(10, e -> {
|
purifystone = new Effect(10, e -> {
|
||||||
Draw.color(Color.ORANGE, Color.GRAY, e.fin());
|
Draw.color(Color.orange, Color.gray, e.fin());
|
||||||
Lines.stroke(2f);
|
Lines.stroke(2f);
|
||||||
Lines.spikes(e.x, e.y, e.fin() * 4f, 2, 6);
|
Lines.spikes(e.x, e.y, e.fin() * 4f, 2, 6);
|
||||||
Draw.reset();
|
Draw.reset();
|
||||||
});
|
});
|
||||||
generate = new Effect(11, e -> {
|
generate = new Effect(11, e -> {
|
||||||
Draw.color(Color.ORANGE, Color.YELLOW, e.fin());
|
Draw.color(Color.orange, Color.yellow, e.fin());
|
||||||
Lines.stroke(1f);
|
Lines.stroke(1f);
|
||||||
Lines.spikes(e.x, e.y, e.fin() * 5f, 2, 8);
|
Lines.spikes(e.x, e.y, e.fin() * 5f, 2, 8);
|
||||||
Draw.reset();
|
Draw.reset();
|
||||||
});
|
});
|
||||||
mine = new Effect(20, e -> {
|
mine = new Effect(20, e -> {
|
||||||
Angles.randLenVectors(e.id, 6, 3f + e.fin() * 6f, (x, y) -> {
|
Angles.randLenVectors(e.id, 6, 3f + e.fin() * 6f, (x, y) -> {
|
||||||
Draw.color(e.color, Color.LIGHT_GRAY, e.fin());
|
Draw.color(e.color, Color.lightGray, e.fin());
|
||||||
Fill.square(e.x + x, e.y + y, e.fout() * 2f, 45);
|
Fill.square(e.x + x, e.y + y, e.fout() * 2f, 45);
|
||||||
Draw.reset();
|
Draw.reset();
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
mineBig = new Effect(30, e -> {
|
mineBig = new Effect(30, e -> {
|
||||||
Angles.randLenVectors(e.id, 6, 4f + e.fin() * 8f, (x, y) -> {
|
Angles.randLenVectors(e.id, 6, 4f + e.fin() * 8f, (x, y) -> {
|
||||||
Draw.color(e.color, Color.LIGHT_GRAY, e.fin());
|
Draw.color(e.color, Color.lightGray, e.fin());
|
||||||
Fill.square(e.x + x, e.y + y, e.fout() * 2f + 0.2f, 45);
|
Fill.square(e.x + x, e.y + y, e.fout() * 2f + 0.2f, 45);
|
||||||
Draw.reset();
|
Draw.reset();
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
mineHuge = new Effect(40, e -> {
|
mineHuge = new Effect(40, e -> {
|
||||||
Angles.randLenVectors(e.id, 8, 5f + e.fin() * 10f, (x, y) -> {
|
Angles.randLenVectors(e.id, 8, 5f + e.fin() * 10f, (x, y) -> {
|
||||||
Draw.color(e.color, Color.LIGHT_GRAY, e.fin());
|
Draw.color(e.color, Color.lightGray, e.fin());
|
||||||
Fill.square(e.x + x, e.y + y, e.fout() * 2f + 0.5f, 45);
|
Fill.square(e.x + x, e.y + y, e.fout() * 2f + 0.5f, 45);
|
||||||
Draw.reset();
|
Draw.reset();
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
smelt = new Effect(20, e -> {
|
smelt = new Effect(20, e -> {
|
||||||
Angles.randLenVectors(e.id, 6, 2f + e.fin() * 5f, (x, y) -> {
|
Angles.randLenVectors(e.id, 6, 2f + e.fin() * 5f, (x, y) -> {
|
||||||
Draw.color(Color.WHITE, e.color, e.fin());
|
Draw.color(Color.white, e.color, e.fin());
|
||||||
Fill.square(e.x + x, e.y + y, 0.5f + e.fout() * 2f, 45);
|
Fill.square(e.x + x, e.y + y, 0.5f + e.fout() * 2f, 45);
|
||||||
Draw.reset();
|
Draw.reset();
|
||||||
});
|
});
|
||||||
@@ -1209,5 +1207,8 @@ public class Fx implements ContentList{
|
|||||||
Lines.poly(e.x, e.y, 6, e.rotation + e.fin(), 90);
|
Lines.poly(e.x, e.y, 6, e.rotation + e.fin(), 90);
|
||||||
Draw.reset();
|
Draw.reset();
|
||||||
});
|
});
|
||||||
|
|
||||||
|
coreLand = new Effect(120f, e -> {
|
||||||
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -39,7 +39,7 @@ public class Items implements ContentList{
|
|||||||
}};
|
}};
|
||||||
|
|
||||||
coal = new Item("coal", Color.valueOf("272727")){{
|
coal = new Item("coal", Color.valueOf("272727")){{
|
||||||
explosiveness = 0.4f;
|
explosiveness = 0.2f;
|
||||||
flammability = 1f;
|
flammability = 1f;
|
||||||
hardness = 2;
|
hardness = 2;
|
||||||
}};
|
}};
|
||||||
|
|||||||
@@ -5,6 +5,7 @@ import io.anuke.arc.graphics.*;
|
|||||||
import io.anuke.arc.graphics.g2d.*;
|
import io.anuke.arc.graphics.g2d.*;
|
||||||
import io.anuke.arc.math.*;
|
import io.anuke.arc.math.*;
|
||||||
import io.anuke.arc.util.*;
|
import io.anuke.arc.util.*;
|
||||||
|
import io.anuke.mindustry.*;
|
||||||
import io.anuke.mindustry.entities.*;
|
import io.anuke.mindustry.entities.*;
|
||||||
import io.anuke.mindustry.entities.bullet.*;
|
import io.anuke.mindustry.entities.bullet.*;
|
||||||
import io.anuke.mindustry.entities.effect.*;
|
import io.anuke.mindustry.entities.effect.*;
|
||||||
@@ -85,7 +86,7 @@ public class Mechs implements ContentList{
|
|||||||
Effects.shake(1f, 1f, player);
|
Effects.shake(1f, 1f, player);
|
||||||
Effects.effect(Fx.landShock, player);
|
Effects.effect(Fx.landShock, player);
|
||||||
for(int i = 0; i < 8; i++){
|
for(int i = 0; i < 8; i++){
|
||||||
Time.run(Mathf.random(8f), () -> Lightning.create(player.getTeam(), Pal.lancerLaser, 17f, player.x, player.y, Mathf.random(360f), 14));
|
Time.run(Mathf.random(8f), () -> Lightning.create(player.getTeam(), Pal.lancerLaser, 17f * Vars.state.rules.playerDamageMultiplier, player.x, player.y, Mathf.random(360f), 14));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -286,7 +287,7 @@ public class Mechs implements ContentList{
|
|||||||
float scl = scld(player);
|
float scl = scld(player);
|
||||||
if(Mathf.chance(Time.delta() * (0.15 * scl))){
|
if(Mathf.chance(Time.delta() * (0.15 * scl))){
|
||||||
Effects.effect(Fx.hitLancer, Pal.lancerLaser, player.x, player.y);
|
Effects.effect(Fx.hitLancer, Pal.lancerLaser, player.x, player.y);
|
||||||
Lightning.create(player.getTeam(), Pal.lancerLaser, 10f,
|
Lightning.create(player.getTeam(), Pal.lancerLaser, 10f * Vars.state.rules.playerDamageMultiplier,
|
||||||
player.x + player.velocity().x, player.y + player.velocity().y, player.rotation, 14);
|
player.x + player.velocity().x, player.y + player.velocity().y, player.rotation, 14);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,10 +1,14 @@
|
|||||||
package io.anuke.mindustry.content;
|
package io.anuke.mindustry.content;
|
||||||
|
|
||||||
|
import io.anuke.arc.*;
|
||||||
import io.anuke.arc.math.Mathf;
|
import io.anuke.arc.math.Mathf;
|
||||||
import io.anuke.mindustry.entities.Effects;
|
import io.anuke.mindustry.entities.Effects;
|
||||||
import io.anuke.mindustry.game.ContentList;
|
import io.anuke.mindustry.game.ContentList;
|
||||||
|
import io.anuke.mindustry.game.EventType.*;
|
||||||
import io.anuke.mindustry.type.StatusEffect;
|
import io.anuke.mindustry.type.StatusEffect;
|
||||||
|
|
||||||
|
import static io.anuke.mindustry.Vars.waveTeam;
|
||||||
|
|
||||||
public class StatusEffects implements ContentList{
|
public class StatusEffects implements ContentList{
|
||||||
public static StatusEffect none, burning, freezing, wet, melting, tarred, overdrive, shielded, shocked, corroded, boss;
|
public static StatusEffect none, burning, freezing, wet, melting, tarred, overdrive, shielded, shocked, corroded, boss;
|
||||||
|
|
||||||
@@ -37,8 +41,14 @@ public class StatusEffects implements ContentList{
|
|||||||
speedMultiplier = 0.9f;
|
speedMultiplier = 0.9f;
|
||||||
effect = Fx.wet;
|
effect = Fx.wet;
|
||||||
|
|
||||||
trans(() -> shocked, ((unit, time, newTime, result) -> unit.damage(15f)));
|
trans(() -> shocked, ((unit, time, newTime, result) -> {
|
||||||
opposite(() -> burning, () -> shocked);
|
unit.damage(20f);
|
||||||
|
if(unit.getTeam() == waveTeam){
|
||||||
|
Events.fire(Trigger.shock);
|
||||||
|
}
|
||||||
|
result.set(this, time);
|
||||||
|
}));
|
||||||
|
opposite(() -> burning);
|
||||||
}};
|
}};
|
||||||
|
|
||||||
melting = new StatusEffect(){{
|
melting = new StatusEffect(){{
|
||||||
|
|||||||
@@ -8,10 +8,13 @@ import io.anuke.mindustry.world.Block;
|
|||||||
import static io.anuke.mindustry.content.Blocks.*;
|
import static io.anuke.mindustry.content.Blocks.*;
|
||||||
|
|
||||||
public class TechTree implements ContentList{
|
public class TechTree implements ContentList{
|
||||||
|
public static Array<TechNode> all;
|
||||||
public static TechNode root;
|
public static TechNode root;
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void load(){
|
public void load(){
|
||||||
|
all = new Array<>();
|
||||||
|
|
||||||
root = node(coreShard, () -> {
|
root = node(coreShard, () -> {
|
||||||
|
|
||||||
node(conveyor, () -> {
|
node(conveyor, () -> {
|
||||||
@@ -326,6 +329,7 @@ public class TechTree implements ContentList{
|
|||||||
context = this;
|
context = this;
|
||||||
children.run();
|
children.run();
|
||||||
context = last;
|
context = last;
|
||||||
|
all.add(this);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -3,6 +3,7 @@ package io.anuke.mindustry.content;
|
|||||||
import io.anuke.arc.collection.*;
|
import io.anuke.arc.collection.*;
|
||||||
import io.anuke.mindustry.entities.bullet.*;
|
import io.anuke.mindustry.entities.bullet.*;
|
||||||
import io.anuke.mindustry.entities.type.*;
|
import io.anuke.mindustry.entities.type.*;
|
||||||
|
import io.anuke.mindustry.entities.type.Bullet;
|
||||||
import io.anuke.mindustry.entities.type.base.*;
|
import io.anuke.mindustry.entities.type.base.*;
|
||||||
import io.anuke.mindustry.game.*;
|
import io.anuke.mindustry.game.*;
|
||||||
import io.anuke.mindustry.gen.*;
|
import io.anuke.mindustry.gen.*;
|
||||||
|
|||||||
@@ -1,16 +1,14 @@
|
|||||||
package io.anuke.mindustry.core;
|
package io.anuke.mindustry.core;
|
||||||
|
|
||||||
import io.anuke.arc.collection.*;
|
import io.anuke.arc.collection.*;
|
||||||
import io.anuke.arc.function.Consumer;
|
import io.anuke.arc.function.*;
|
||||||
import io.anuke.arc.graphics.Color;
|
import io.anuke.arc.graphics.*;
|
||||||
import io.anuke.arc.graphics.Pixmap;
|
import io.anuke.arc.util.*;
|
||||||
import io.anuke.arc.util.Log;
|
|
||||||
import io.anuke.mindustry.content.*;
|
import io.anuke.mindustry.content.*;
|
||||||
import io.anuke.mindustry.entities.bullet.BulletType;
|
import io.anuke.mindustry.entities.bullet.*;
|
||||||
import io.anuke.mindustry.game.*;
|
import io.anuke.mindustry.game.*;
|
||||||
import io.anuke.mindustry.type.*;
|
import io.anuke.mindustry.type.*;
|
||||||
import io.anuke.mindustry.world.Block;
|
import io.anuke.mindustry.world.*;
|
||||||
import io.anuke.mindustry.world.LegacyColorMapper;
|
|
||||||
|
|
||||||
import static io.anuke.arc.Core.files;
|
import static io.anuke.arc.Core.files;
|
||||||
|
|
||||||
@@ -21,8 +19,6 @@ import static io.anuke.arc.Core.files;
|
|||||||
@SuppressWarnings("unchecked")
|
@SuppressWarnings("unchecked")
|
||||||
public class ContentLoader{
|
public class ContentLoader{
|
||||||
private boolean loaded = false;
|
private boolean loaded = false;
|
||||||
private boolean verbose = false;
|
|
||||||
|
|
||||||
private ObjectMap<String, MappableContent>[] contentNameMap = new ObjectMap[ContentType.values().length];
|
private ObjectMap<String, MappableContent>[] contentNameMap = new ObjectMap[ContentType.values().length];
|
||||||
private Array<Content>[] contentMap = new Array[ContentType.values().length];
|
private Array<Content>[] contentMap = new Array[ContentType.values().length];
|
||||||
private MappableContent[][] temporaryMapper;
|
private MappableContent[][] temporaryMapper;
|
||||||
@@ -45,12 +41,8 @@ public class ContentLoader{
|
|||||||
new LegacyColorMapper(),
|
new LegacyColorMapper(),
|
||||||
};
|
};
|
||||||
|
|
||||||
public void setVerbose(){
|
|
||||||
verbose = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
/** Creates all content types. */
|
/** Creates all content types. */
|
||||||
public void load(){
|
public void createContent(){
|
||||||
if(loaded){
|
if(loaded){
|
||||||
Log.info("Content already loaded, skipping.");
|
Log.info("Content already loaded, skipping.");
|
||||||
return;
|
return;
|
||||||
@@ -65,8 +57,6 @@ public class ContentLoader{
|
|||||||
list.load();
|
list.load();
|
||||||
}
|
}
|
||||||
|
|
||||||
int total = 0;
|
|
||||||
|
|
||||||
for(ContentType type : ContentType.values()){
|
for(ContentType type : ContentType.values()){
|
||||||
|
|
||||||
for(Content c : contentMap[type.ordinal()]){
|
for(Content c : contentMap[type.ordinal()]){
|
||||||
@@ -77,7 +67,6 @@ public class ContentLoader{
|
|||||||
}
|
}
|
||||||
contentNameMap[type.ordinal()].put(name, (MappableContent)c);
|
contentNameMap[type.ordinal()].put(name, (MappableContent)c);
|
||||||
}
|
}
|
||||||
total++;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -91,25 +80,32 @@ public class ContentLoader{
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if(verbose){
|
loaded = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
/** Logs content statistics.*/
|
||||||
|
public void logContent(){
|
||||||
Log.info("--- CONTENT INFO ---");
|
Log.info("--- CONTENT INFO ---");
|
||||||
for(int k = 0; k < contentMap.length; k++){
|
for(int k = 0; k < contentMap.length; k++){
|
||||||
Log.info("[{0}]: loaded {1}", ContentType.values()[k].name(), contentMap[k].size);
|
Log.info("[{0}]: loaded {1}", ContentType.values()[k].name(), contentMap[k].size);
|
||||||
}
|
}
|
||||||
Log.info("Total content loaded: {0}", total);
|
Log.info("Total content loaded: {0}", Array.with(ContentType.values()).mapInt(c -> contentMap[c.ordinal()].size).sum());
|
||||||
Log.info("-------------------");
|
Log.info("-------------------");
|
||||||
}
|
}
|
||||||
|
|
||||||
loaded = true;
|
/** Calls Content#init() on everything. Use only after all modules have been created.*/
|
||||||
|
public void init(){
|
||||||
|
initialize(Content::init);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void initialize(Consumer<Content> callable){
|
/** Calls Content#load() on everything. Use only after all modules have been created on the client.*/
|
||||||
initialize(callable, false);
|
public void load(){
|
||||||
|
initialize(Content::load);
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Initializes all content with the specified function. */
|
/** Initializes all content with the specified function. */
|
||||||
public void initialize(Consumer<Content> callable, boolean override){
|
private void initialize(Consumer<Content> callable){
|
||||||
if(initialization.contains(callable) && !override) return;
|
if(initialization.contains(callable)) return;
|
||||||
|
|
||||||
for(ContentType type : ContentType.values()){
|
for(ContentType type : ContentType.values()){
|
||||||
for(Content content : contentMap[type.ordinal()]){
|
for(Content content : contentMap[type.ordinal()]){
|
||||||
@@ -136,12 +132,8 @@ public class ContentLoader{
|
|||||||
pixmap.dispose();
|
pixmap.dispose();
|
||||||
}
|
}
|
||||||
|
|
||||||
public void verbose(boolean verbose){
|
|
||||||
this.verbose = verbose;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void dispose(){
|
public void dispose(){
|
||||||
//clear all content, currently not needed
|
//clear all content, currently not used
|
||||||
}
|
}
|
||||||
|
|
||||||
public void handleContent(Content content){
|
public void handleContent(Content content){
|
||||||
@@ -171,7 +163,7 @@ public class ContentLoader{
|
|||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
if(temporaryMapper[type.ordinal()].length <= id || temporaryMapper[type.ordinal()][id] == null){
|
if(temporaryMapper[type.ordinal()].length <= id || temporaryMapper[type.ordinal()][id] == null){
|
||||||
return getByID(type, 0); //default value is always ID 0
|
return (T)contentMap[type.ordinal()].get(0); //default value is always ID 0
|
||||||
}
|
}
|
||||||
return (T)temporaryMapper[type.ordinal()][id];
|
return (T)temporaryMapper[type.ordinal()][id];
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,33 +1,34 @@
|
|||||||
package io.anuke.mindustry.core;
|
package io.anuke.mindustry.core;
|
||||||
|
|
||||||
import io.anuke.arc.*;
|
import io.anuke.arc.*;
|
||||||
import io.anuke.arc.files.*;
|
import io.anuke.arc.assets.*;
|
||||||
import io.anuke.arc.graphics.*;
|
import io.anuke.arc.graphics.*;
|
||||||
import io.anuke.arc.graphics.g2d.*;
|
import io.anuke.arc.graphics.g2d.*;
|
||||||
import io.anuke.arc.input.*;
|
import io.anuke.arc.input.*;
|
||||||
import io.anuke.arc.math.geom.*;
|
import io.anuke.arc.math.geom.*;
|
||||||
import io.anuke.arc.scene.ui.*;
|
import io.anuke.arc.scene.ui.*;
|
||||||
import io.anuke.arc.scene.ui.layout.*;
|
|
||||||
import io.anuke.arc.util.*;
|
import io.anuke.arc.util.*;
|
||||||
import io.anuke.mindustry.content.*;
|
import io.anuke.mindustry.content.*;
|
||||||
import io.anuke.mindustry.core.GameState.*;
|
import io.anuke.mindustry.core.GameState.*;
|
||||||
import io.anuke.mindustry.entities.*;
|
import io.anuke.mindustry.entities.*;
|
||||||
import io.anuke.mindustry.entities.type.*;
|
import io.anuke.mindustry.entities.type.*;
|
||||||
import io.anuke.mindustry.game.*;
|
|
||||||
import io.anuke.mindustry.game.EventType.*;
|
import io.anuke.mindustry.game.EventType.*;
|
||||||
|
import io.anuke.mindustry.game.*;
|
||||||
import io.anuke.mindustry.gen.*;
|
import io.anuke.mindustry.gen.*;
|
||||||
import io.anuke.mindustry.input.*;
|
import io.anuke.mindustry.input.*;
|
||||||
import io.anuke.mindustry.maps.*;
|
import io.anuke.mindustry.maps.Map;
|
||||||
import io.anuke.mindustry.net.Net;
|
|
||||||
import io.anuke.mindustry.type.*;
|
import io.anuke.mindustry.type.*;
|
||||||
import io.anuke.mindustry.ui.dialogs.*;
|
import io.anuke.mindustry.ui.dialogs.*;
|
||||||
import io.anuke.mindustry.world.*;
|
import io.anuke.mindustry.world.*;
|
||||||
import io.anuke.mindustry.world.blocks.storage.*;
|
import io.anuke.mindustry.world.blocks.storage.*;
|
||||||
|
|
||||||
import java.io.*;
|
import java.io.*;
|
||||||
|
import java.text.*;
|
||||||
|
import java.util.*;
|
||||||
|
|
||||||
import static io.anuke.arc.Core.*;
|
import static io.anuke.arc.Core.*;
|
||||||
import static io.anuke.mindustry.Vars.*;
|
import static io.anuke.mindustry.Vars.*;
|
||||||
|
import static io.anuke.mindustry.Vars.net;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Control module.
|
* Control module.
|
||||||
@@ -35,10 +36,10 @@ import static io.anuke.mindustry.Vars.*;
|
|||||||
* Should <i>not</i> handle any logic-critical state.
|
* Should <i>not</i> handle any logic-critical state.
|
||||||
* This class is not created in the headless server.
|
* This class is not created in the headless server.
|
||||||
*/
|
*/
|
||||||
public class Control implements ApplicationListener{
|
public class Control implements ApplicationListener, Loadable{
|
||||||
public final Saves saves;
|
public Saves saves;
|
||||||
public final MusicControl music;
|
public MusicControl music;
|
||||||
public final Tutorial tutorial;
|
public Tutorial tutorial;
|
||||||
public InputHandler input;
|
public InputHandler input;
|
||||||
|
|
||||||
private Interval timer = new Interval(2);
|
private Interval timer = new Interval(2);
|
||||||
@@ -46,40 +47,13 @@ public class Control implements ApplicationListener{
|
|||||||
private boolean wasPaused = false;
|
private boolean wasPaused = false;
|
||||||
|
|
||||||
public Control(){
|
public Control(){
|
||||||
batch = new SpriteBatch();
|
|
||||||
saves = new Saves();
|
saves = new Saves();
|
||||||
tutorial = new Tutorial();
|
tutorial = new Tutorial();
|
||||||
music = new MusicControl();
|
music = new MusicControl();
|
||||||
|
|
||||||
UnitScl.dp.setProduct(settings.getInt("uiscale", 100) / 100f);
|
|
||||||
|
|
||||||
Core.input.setCatch(KeyCode.BACK, true);
|
|
||||||
|
|
||||||
content.initialize(Content::init);
|
|
||||||
Core.atlas = new TextureAtlas("sprites/sprites.atlas");
|
|
||||||
Draw.scl = 1f / Core.atlas.find("scale_marker").getWidth();
|
|
||||||
content.initialize(Content::load, true);
|
|
||||||
|
|
||||||
data.load();
|
|
||||||
|
|
||||||
Core.settings.setAppName(appName);
|
|
||||||
Core.settings.defaults(
|
|
||||||
"ip", "localhost",
|
|
||||||
"color-0", Color.rgba8888(playerColors[8]),
|
|
||||||
"color-1", Color.rgba8888(playerColors[11]),
|
|
||||||
"color-2", Color.rgba8888(playerColors[13]),
|
|
||||||
"color-3", Color.rgba8888(playerColors[9]),
|
|
||||||
"name", "",
|
|
||||||
"lastBuild", 0
|
|
||||||
);
|
|
||||||
|
|
||||||
createPlayer();
|
|
||||||
|
|
||||||
saves.load();
|
|
||||||
|
|
||||||
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.instance::updateRPC);
|
Time.runTask(5f, platform::updateRPC);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
@@ -93,9 +67,9 @@ public class Control implements ApplicationListener{
|
|||||||
|
|
||||||
Events.on(WorldLoadEvent.class, event -> {
|
Events.on(WorldLoadEvent.class, event -> {
|
||||||
Core.app.post(() -> Core.app.post(() -> {
|
Core.app.post(() -> Core.app.post(() -> {
|
||||||
if(Net.active() && player.getClosestCore() != null){
|
if(net.active() && player.getClosestCore() != null){
|
||||||
//set to closest core since that's where the player will probably respawn; prevents camera jumps
|
//set to closest core since that's where the player will probably respawn; prevents camera jumps
|
||||||
Core.camera.position.set(player.getClosestCore());
|
Core.camera.position.set(player.isDead() ? player.getClosestCore() : player);
|
||||||
}else{
|
}else{
|
||||||
//locally, set to player position since respawning occurs immediately
|
//locally, set to player position since respawning occurs immediately
|
||||||
Core.camera.position.set(player);
|
Core.camera.position.set(player);
|
||||||
@@ -125,7 +99,7 @@ public class Control implements ApplicationListener{
|
|||||||
Effects.shake(5, 6, Core.camera.position.x, Core.camera.position.y);
|
Effects.shake(5, 6, Core.camera.position.x, Core.camera.position.y);
|
||||||
//the restart dialog can show info for any number of scenarios
|
//the restart dialog can show info for any number of scenarios
|
||||||
Call.onGameOver(event.winner);
|
Call.onGameOver(event.winner);
|
||||||
if(state.rules.zone != null && !Net.client()){
|
if(state.rules.zone != null && !net.client()){
|
||||||
//remove zone save on game over
|
//remove zone save on game over
|
||||||
if(saves.getZoneSlot() != null && !state.rules.tutorial){
|
if(saves.getZoneSlot() != null && !state.rules.tutorial){
|
||||||
saves.getZoneSlot().delete();
|
saves.getZoneSlot().delete();
|
||||||
@@ -135,12 +109,12 @@ public class Control implements ApplicationListener{
|
|||||||
|
|
||||||
//autohost for pvp maps
|
//autohost for pvp maps
|
||||||
Events.on(WorldLoadEvent.class, event -> {
|
Events.on(WorldLoadEvent.class, event -> {
|
||||||
if(state.rules.pvp && !Net.active()){
|
if(state.rules.pvp && !net.active()){
|
||||||
try{
|
try{
|
||||||
Net.host(port);
|
net.host(port);
|
||||||
player.isAdmin = true;
|
player.isAdmin = true;
|
||||||
}catch(IOException e){
|
}catch(IOException e){
|
||||||
ui.showError(Core.bundle.format("server.error", Strings.parseException(e, true)));
|
ui.showException("$server.error", e);
|
||||||
Core.app.post(() -> state.set(State.menu));
|
Core.app.post(() -> state.set(State.menu));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -178,40 +152,39 @@ public class Control implements ApplicationListener{
|
|||||||
ui.hudfrag.showToast(Core.bundle.format("zone.config.complete", e.zone.configureWave));
|
ui.hudfrag.showToast(Core.bundle.format("zone.config.complete", e.zone.configureWave));
|
||||||
});
|
});
|
||||||
|
|
||||||
if(android){
|
Events.on(Trigger.newGame, () -> {
|
||||||
Sounds.empty.loop(0f, 1f, 0f);
|
TileEntity core = player.getClosestCore();
|
||||||
|
|
||||||
checkClassicData();
|
if(core == null) return;
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
//checks for existing 3.5 app data, android only
|
app.post(() -> ui.hudfrag.showLand());
|
||||||
public void checkClassicData(){
|
renderer.zoomIn(Fx.coreLand.lifetime);
|
||||||
try{
|
app.post(() -> Effects.effect(Fx.coreLand, core.x, core.y, 0, core.block));
|
||||||
if(files.local("mindustry-maps").exists() || files.local("mindustry-saves").exists()){
|
Time.run(Fx.coreLand.lifetime, () -> {
|
||||||
settings.getBoolOnce("classic-backup-check", () -> {
|
Effects.effect(Fx.launch, core);
|
||||||
app.post(() -> app.post(() -> ui.showConfirm("$classic.export", "$classic.export.text", () -> {
|
Effects.shake(5f, 5f, core);
|
||||||
try{
|
|
||||||
Platform.instance.requestExternalPerms(() -> {
|
|
||||||
FileHandle external = files.external("MindustryClassic");
|
|
||||||
if(files.local("mindustry-maps").exists()){
|
|
||||||
files.local("mindustry-maps").copyTo(external);
|
|
||||||
}
|
|
||||||
|
|
||||||
if(files.local("mindustry-saves").exists()){
|
|
||||||
files.local("mindustry-saves").copyTo(external);
|
|
||||||
}
|
|
||||||
});
|
});
|
||||||
}catch(Exception e){
|
|
||||||
e.printStackTrace();
|
|
||||||
ui.showError(Strings.parseException(e, true));
|
|
||||||
}
|
|
||||||
})));
|
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
}catch(Throwable t){
|
|
||||||
t.printStackTrace();
|
@Override
|
||||||
}
|
public void loadAsync(){
|
||||||
|
Draw.scl = 1f / Core.atlas.find("scale_marker").getWidth();
|
||||||
|
|
||||||
|
Core.input.setCatch(KeyCode.BACK, true);
|
||||||
|
|
||||||
|
data.load();
|
||||||
|
|
||||||
|
Core.settings.defaults(
|
||||||
|
"ip", "localhost",
|
||||||
|
"color-0", Color.rgba8888(playerColors[8]),
|
||||||
|
"name", "",
|
||||||
|
"lastBuild", 0
|
||||||
|
);
|
||||||
|
|
||||||
|
createPlayer();
|
||||||
|
|
||||||
|
saves.load();
|
||||||
}
|
}
|
||||||
|
|
||||||
void createPlayer(){
|
void createPlayer(){
|
||||||
@@ -231,7 +204,9 @@ public class Control implements ApplicationListener{
|
|||||||
player.add();
|
player.add();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Events.on(ClientLoadEvent.class, e -> {
|
||||||
Core.input.addProcessor(input);
|
Core.input.addProcessor(input);
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
public void playMap(Map map, Rules rules){
|
public void playMap(Map map, Rules rules){
|
||||||
@@ -240,13 +215,17 @@ public class Control implements ApplicationListener{
|
|||||||
world.loadMap(map, rules);
|
world.loadMap(map, rules);
|
||||||
state.rules = rules;
|
state.rules = rules;
|
||||||
logic.play();
|
logic.play();
|
||||||
|
if(settings.getBool("savecreate") && !world.isInvalidMap()){
|
||||||
|
control.saves.addSave(map.name() + " " + new SimpleDateFormat("MMM dd h:mm", Locale.getDefault()).format(new Date()));
|
||||||
|
}
|
||||||
|
Events.fire(Trigger.newGame);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
public void playZone(Zone zone){
|
public void playZone(Zone zone){
|
||||||
ui.loadAnd(() -> {
|
ui.loadAnd(() -> {
|
||||||
logic.reset();
|
logic.reset();
|
||||||
Net.reset();
|
net.reset();
|
||||||
world.loadGenerator(zone.generator);
|
world.loadGenerator(zone.generator);
|
||||||
zone.rules.accept(state.rules);
|
zone.rules.accept(state.rules);
|
||||||
state.rules.zone = zone;
|
state.rules.zone = zone;
|
||||||
@@ -258,6 +237,7 @@ public class Control implements ApplicationListener{
|
|||||||
state.set(State.playing);
|
state.set(State.playing);
|
||||||
control.saves.zoneSave();
|
control.saves.zoneSave();
|
||||||
logic.play();
|
logic.play();
|
||||||
|
Events.fire(Trigger.newGame);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -265,7 +245,7 @@ public class Control implements ApplicationListener{
|
|||||||
Zone zone = Zones.groundZero;
|
Zone zone = Zones.groundZero;
|
||||||
ui.loadAnd(() -> {
|
ui.loadAnd(() -> {
|
||||||
logic.reset();
|
logic.reset();
|
||||||
Net.reset();
|
net.reset();
|
||||||
|
|
||||||
world.beginMapLoad();
|
world.beginMapLoad();
|
||||||
|
|
||||||
@@ -310,6 +290,7 @@ public class Control implements ApplicationListener{
|
|||||||
state.rules.waveSpacing = 60f * 30;
|
state.rules.waveSpacing = 60f * 30;
|
||||||
state.rules.buildCostMultiplier = 0.3f;
|
state.rules.buildCostMultiplier = 0.3f;
|
||||||
state.rules.tutorial = true;
|
state.rules.tutorial = true;
|
||||||
|
Events.fire(Trigger.newGame);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -320,7 +301,7 @@ public class Control implements ApplicationListener{
|
|||||||
@Override
|
@Override
|
||||||
public void dispose(){
|
public void dispose(){
|
||||||
content.dispose();
|
content.dispose();
|
||||||
Net.dispose();
|
net.dispose();
|
||||||
Musics.dispose();
|
Musics.dispose();
|
||||||
Sounds.dispose();
|
Sounds.dispose();
|
||||||
ui.editor.dispose();
|
ui.editor.dispose();
|
||||||
@@ -341,7 +322,7 @@ public class Control implements ApplicationListener{
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void init(){
|
public void init(){
|
||||||
Platform.instance.updateRPC();
|
platform.updateRPC();
|
||||||
|
|
||||||
//play tutorial on stop
|
//play tutorial on stop
|
||||||
if(!settings.getBool("playedtutorial", false)){
|
if(!settings.getBool("playedtutorial", false)){
|
||||||
@@ -382,12 +363,22 @@ public class Control implements ApplicationListener{
|
|||||||
dialog.show();
|
dialog.show();
|
||||||
}));
|
}));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if(android){
|
||||||
|
Sounds.empty.loop(0f, 1f, 0f);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void update(){
|
public void update(){
|
||||||
|
//TODO find out why this happens on Android
|
||||||
|
if(assets == null) return;
|
||||||
|
|
||||||
saves.update();
|
saves.update();
|
||||||
|
|
||||||
|
//update and load any requested assets
|
||||||
|
assets.update();
|
||||||
|
|
||||||
input.updateController();
|
input.updateController();
|
||||||
|
|
||||||
//autosave global data if it's modified
|
//autosave global data if it's modified
|
||||||
@@ -413,7 +404,7 @@ public class Control implements ApplicationListener{
|
|||||||
if(world.isZone()){
|
if(world.isZone()){
|
||||||
for(Tile tile : state.teams.get(player.getTeam()).cores){
|
for(Tile tile : state.teams.get(player.getTeam()).cores){
|
||||||
for(Item item : content.items()){
|
for(Item item : content.items()){
|
||||||
if(tile.entity.items.has(item)){
|
if(tile.entity != null && tile.entity.items.has(item)){
|
||||||
data.unlockContent(item);
|
data.unlockContent(item);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -426,7 +417,7 @@ public class Control implements ApplicationListener{
|
|||||||
|
|
||||||
//auto-update rpc every 5 seconds
|
//auto-update rpc every 5 seconds
|
||||||
if(timer.get(0, 60 * 5)){
|
if(timer.get(0, 60 * 5)){
|
||||||
Platform.instance.updateRPC();
|
platform.updateRPC();
|
||||||
}
|
}
|
||||||
|
|
||||||
if(Core.input.keyTap(Binding.pause) && !scene.hasDialog() && !ui.restart.isShown() && (state.is(State.paused) || state.is(State.playing))){
|
if(Core.input.keyTap(Binding.pause) && !scene.hasDialog() && !ui.restart.isShown() && (state.is(State.paused) || state.is(State.playing))){
|
||||||
@@ -452,7 +443,7 @@ public class Control implements ApplicationListener{
|
|||||||
}
|
}
|
||||||
|
|
||||||
if(!scene.hasDialog() && !scene.root.getChildren().isEmpty() && !(scene.root.getChildren().peek() instanceof Dialog) && Core.input.keyTap(KeyCode.BACK)){
|
if(!scene.hasDialog() && !scene.root.getChildren().isEmpty() && !(scene.root.getChildren().peek() instanceof Dialog) && Core.input.keyTap(KeyCode.BACK)){
|
||||||
Platform.instance.hide();
|
platform.hide();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,14 +1,12 @@
|
|||||||
package io.anuke.mindustry.core;
|
package io.anuke.mindustry.core;
|
||||||
|
|
||||||
import io.anuke.arc.Events;
|
import io.anuke.arc.*;
|
||||||
import io.anuke.mindustry.entities.type.BaseUnit;
|
import io.anuke.mindustry.entities.type.*;
|
||||||
import io.anuke.mindustry.entities.type.base.BaseDrone;
|
import io.anuke.mindustry.entities.type.base.*;
|
||||||
import io.anuke.mindustry.game.EventType.StateChangeEvent;
|
import io.anuke.mindustry.game.EventType.*;
|
||||||
import io.anuke.mindustry.game.*;
|
import io.anuke.mindustry.game.*;
|
||||||
import io.anuke.mindustry.net.Net;
|
|
||||||
|
|
||||||
import static io.anuke.mindustry.Vars.unitGroups;
|
import static io.anuke.mindustry.Vars.*;
|
||||||
import static io.anuke.mindustry.Vars.waveTeam;
|
|
||||||
|
|
||||||
public class GameState{
|
public class GameState{
|
||||||
/** Current wave number, can be anything in non-wave modes. */
|
/** Current wave number, can be anything in non-wave modes. */
|
||||||
@@ -29,7 +27,7 @@ public class GameState{
|
|||||||
private State state = State.menu;
|
private State state = State.menu;
|
||||||
|
|
||||||
public int enemies(){
|
public int enemies(){
|
||||||
return Net.client() ? enemies : unitGroups[waveTeam.ordinal()].count(b -> !(b instanceof BaseDrone));
|
return net.client() ? enemies : unitGroups[waveTeam.ordinal()].count(b -> !(b instanceof BaseDrone));
|
||||||
}
|
}
|
||||||
|
|
||||||
public BaseUnit boss(){
|
public BaseUnit boss(){
|
||||||
@@ -46,7 +44,7 @@ public class GameState{
|
|||||||
}
|
}
|
||||||
|
|
||||||
public boolean isPaused(){
|
public boolean isPaused(){
|
||||||
return (is(State.paused) && !Net.active()) || (gameOver && !Net.active());
|
return (is(State.paused) && !net.active()) || (gameOver && !net.active());
|
||||||
}
|
}
|
||||||
|
|
||||||
public boolean is(State astate){
|
public boolean is(State astate){
|
||||||
|
|||||||
@@ -1,28 +1,21 @@
|
|||||||
package io.anuke.mindustry.core;
|
package io.anuke.mindustry.core;
|
||||||
|
|
||||||
import io.anuke.annotations.Annotations.Loc;
|
import io.anuke.annotations.Annotations.*;
|
||||||
import io.anuke.annotations.Annotations.Remote;
|
import io.anuke.arc.*;
|
||||||
import io.anuke.arc.ApplicationListener;
|
import io.anuke.arc.collection.ObjectSet.*;
|
||||||
import io.anuke.arc.Events;
|
|
||||||
import io.anuke.arc.collection.ObjectSet.ObjectSetIterator;
|
|
||||||
import io.anuke.arc.util.*;
|
import io.anuke.arc.util.*;
|
||||||
import io.anuke.mindustry.content.*;
|
import io.anuke.mindustry.content.*;
|
||||||
import io.anuke.mindustry.core.GameState.State;
|
import io.anuke.mindustry.core.GameState.*;
|
||||||
import io.anuke.mindustry.entities.*;
|
import io.anuke.mindustry.entities.*;
|
||||||
import io.anuke.mindustry.entities.type.Player;
|
import io.anuke.mindustry.entities.type.*;
|
||||||
import io.anuke.mindustry.entities.type.TileEntity;
|
|
||||||
import io.anuke.mindustry.game.EventType.*;
|
import io.anuke.mindustry.game.EventType.*;
|
||||||
import io.anuke.mindustry.game.*;
|
import io.anuke.mindustry.game.*;
|
||||||
import io.anuke.mindustry.game.Teams.TeamData;
|
import io.anuke.mindustry.game.Teams.*;
|
||||||
import io.anuke.mindustry.gen.BrokenBlock;
|
import io.anuke.mindustry.gen.*;
|
||||||
import io.anuke.mindustry.gen.Call;
|
import io.anuke.mindustry.type.*;
|
||||||
import io.anuke.mindustry.net.Net;
|
import io.anuke.mindustry.world.*;
|
||||||
import io.anuke.mindustry.type.Item;
|
import io.anuke.mindustry.world.blocks.*;
|
||||||
import io.anuke.mindustry.type.ItemStack;
|
import io.anuke.mindustry.world.blocks.BuildBlock.*;
|
||||||
import io.anuke.mindustry.world.Block;
|
|
||||||
import io.anuke.mindustry.world.Tile;
|
|
||||||
import io.anuke.mindustry.world.blocks.BuildBlock;
|
|
||||||
import io.anuke.mindustry.world.blocks.BuildBlock.BuildEntity;
|
|
||||||
|
|
||||||
import static io.anuke.mindustry.Vars.*;
|
import static io.anuke.mindustry.Vars.*;
|
||||||
|
|
||||||
@@ -101,15 +94,15 @@ public class Logic implements ApplicationListener{
|
|||||||
state.rules = new Rules();
|
state.rules = new Rules();
|
||||||
state.stats = new Stats();
|
state.stats = new Stats();
|
||||||
|
|
||||||
|
entities.clear();
|
||||||
Time.clear();
|
Time.clear();
|
||||||
Entities.clear();
|
|
||||||
TileEntity.sleepingEntities = 0;
|
TileEntity.sleepingEntities = 0;
|
||||||
|
|
||||||
Events.fire(new ResetEvent());
|
Events.fire(new ResetEvent());
|
||||||
}
|
}
|
||||||
|
|
||||||
public void runWave(){
|
public void runWave(){
|
||||||
world.spawner.spawnEnemies();
|
spawner.spawnEnemies();
|
||||||
state.wave++;
|
state.wave++;
|
||||||
state.wavetime = world.isZone() && world.getZone().isBossWave(state.wave) ? state.rules.waveSpacing * state.rules.bossWaveMultiplier :
|
state.wavetime = world.isZone() && world.getZone().isBossWave(state.wave) ? state.rules.waveSpacing * state.rules.bossWaveMultiplier :
|
||||||
world.isZone() && world.getZone().isLaunchWave(state.wave) ? state.rules.waveSpacing * state.rules.launchWaveMultiplier : state.rules.waveSpacing;
|
world.isZone() && world.getZone().isLaunchWave(state.wave) ? state.rules.waveSpacing * state.rules.launchWaveMultiplier : state.rules.waveSpacing;
|
||||||
@@ -164,6 +157,7 @@ public class Logic implements ApplicationListener{
|
|||||||
}
|
}
|
||||||
state.launched = true;
|
state.launched = true;
|
||||||
state.gameOver = true;
|
state.gameOver = true;
|
||||||
|
Events.fire(new LaunchEvent());
|
||||||
//manually fire game over event now
|
//manually fire game over event now
|
||||||
Events.fire(new GameOverEvent(defaultTeam));
|
Events.fire(new GameOverEvent(defaultTeam));
|
||||||
});
|
});
|
||||||
@@ -190,25 +184,25 @@ public class Logic implements ApplicationListener{
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if(!Net.client() && state.wavetime <= 0 && state.rules.waves){
|
if(!net.client() && state.wavetime <= 0 && state.rules.waves){
|
||||||
runWave();
|
runWave();
|
||||||
}
|
}
|
||||||
|
|
||||||
if(!headless){
|
if(!headless){
|
||||||
Entities.update(effectGroup);
|
effectGroup.update();
|
||||||
Entities.update(groundEffectGroup);
|
groundEffectGroup.update();
|
||||||
}
|
}
|
||||||
|
|
||||||
if(!state.isEditor()){
|
if(!state.isEditor()){
|
||||||
for(EntityGroup group : unitGroups){
|
for(EntityGroup group : unitGroups){
|
||||||
Entities.update(group);
|
group.update();
|
||||||
}
|
}
|
||||||
|
|
||||||
Entities.update(puddleGroup);
|
puddleGroup.update();
|
||||||
Entities.update(shieldGroup);
|
shieldGroup.update();
|
||||||
Entities.update(bulletGroup);
|
bulletGroup.update();
|
||||||
Entities.update(tileGroup);
|
tileGroup.update();
|
||||||
Entities.update(fireGroup);
|
fireGroup.update();
|
||||||
}else{
|
}else{
|
||||||
for(EntityGroup<?> group : unitGroups){
|
for(EntityGroup<?> group : unitGroups){
|
||||||
group.updateEvents();
|
group.updateEvents();
|
||||||
@@ -217,11 +211,11 @@ public class Logic implements ApplicationListener{
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
Entities.update(playerGroup);
|
playerGroup.update();
|
||||||
|
|
||||||
//effect group only contains item transfers in the headless version, update it!
|
//effect group only contains item transfers in the headless version, update it!
|
||||||
if(headless){
|
if(headless){
|
||||||
Entities.update(effectGroup);
|
effectGroup.update();
|
||||||
}
|
}
|
||||||
|
|
||||||
if(!state.isEditor()){
|
if(!state.isEditor()){
|
||||||
@@ -234,10 +228,10 @@ public class Logic implements ApplicationListener{
|
|||||||
collisions.collideGroups(bulletGroup, playerGroup);
|
collisions.collideGroups(bulletGroup, playerGroup);
|
||||||
}
|
}
|
||||||
|
|
||||||
world.pathfinder.update();
|
pathfinder.update();
|
||||||
}
|
}
|
||||||
|
|
||||||
if(!Net.client() && !world.isInvalidMap() && !state.isEditor()){
|
if(!net.client() && !world.isInvalidMap() && !state.isEditor()){
|
||||||
checkGameOver();
|
checkGameOver();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,37 +1,33 @@
|
|||||||
package io.anuke.mindustry.core;
|
package io.anuke.mindustry.core;
|
||||||
|
|
||||||
import io.anuke.annotations.Annotations.*;
|
import io.anuke.annotations.Annotations.*;
|
||||||
import io.anuke.arc.ApplicationListener;
|
import io.anuke.arc.*;
|
||||||
import io.anuke.arc.Core;
|
import io.anuke.arc.collection.*;
|
||||||
import io.anuke.arc.collection.IntSet;
|
import io.anuke.arc.graphics.*;
|
||||||
import io.anuke.arc.graphics.Color;
|
import io.anuke.arc.math.*;
|
||||||
import io.anuke.arc.math.RandomXS128;
|
import io.anuke.arc.util.CommandHandler.*;
|
||||||
import io.anuke.arc.util.*;
|
import io.anuke.arc.util.*;
|
||||||
import io.anuke.arc.util.io.ReusableByteInStream;
|
import io.anuke.arc.util.io.*;
|
||||||
import io.anuke.arc.util.serialization.Base64Coder;
|
import io.anuke.arc.util.serialization.*;
|
||||||
import io.anuke.mindustry.Vars;
|
import io.anuke.mindustry.*;
|
||||||
import io.anuke.mindustry.core.GameState.State;
|
import io.anuke.mindustry.core.GameState.*;
|
||||||
import io.anuke.mindustry.entities.Entities;
|
import io.anuke.mindustry.entities.*;
|
||||||
import io.anuke.mindustry.entities.EntityGroup;
|
import io.anuke.mindustry.entities.traits.BuilderTrait.*;
|
||||||
import io.anuke.mindustry.entities.traits.BuilderTrait.BuildRequest;
|
import io.anuke.mindustry.entities.traits.*;
|
||||||
import io.anuke.mindustry.entities.traits.SyncTrait;
|
import io.anuke.mindustry.entities.type.*;
|
||||||
import io.anuke.mindustry.entities.type.Player;
|
import io.anuke.mindustry.game.EventType.*;
|
||||||
import io.anuke.mindustry.entities.type.Unit;
|
import io.anuke.mindustry.game.*;
|
||||||
import io.anuke.mindustry.game.TypeID;
|
import io.anuke.mindustry.gen.*;
|
||||||
import io.anuke.mindustry.game.Version;
|
import io.anuke.mindustry.net.Administration.*;
|
||||||
import io.anuke.mindustry.gen.Call;
|
import io.anuke.mindustry.net.Net.*;
|
||||||
import io.anuke.mindustry.gen.RemoteReadClient;
|
|
||||||
import io.anuke.mindustry.net.Administration.TraceInfo;
|
|
||||||
import io.anuke.mindustry.net.*;
|
import io.anuke.mindustry.net.*;
|
||||||
import io.anuke.mindustry.net.Net.SendMode;
|
|
||||||
import io.anuke.mindustry.net.Packets.*;
|
import io.anuke.mindustry.net.Packets.*;
|
||||||
import io.anuke.mindustry.type.ContentType;
|
import io.anuke.mindustry.type.*;
|
||||||
import io.anuke.mindustry.world.Tile;
|
import io.anuke.mindustry.world.*;
|
||||||
import io.anuke.mindustry.world.modules.ItemModule;
|
import io.anuke.mindustry.world.modules.*;
|
||||||
|
|
||||||
import java.io.DataInputStream;
|
import java.io.*;
|
||||||
import java.io.IOException;
|
import java.util.zip.*;
|
||||||
import java.util.zip.InflaterInputStream;
|
|
||||||
|
|
||||||
import static io.anuke.mindustry.Vars.*;
|
import static io.anuke.mindustry.Vars.*;
|
||||||
|
|
||||||
@@ -40,6 +36,7 @@ public class NetClient implements ApplicationListener{
|
|||||||
private final static float playerSyncTime = 2;
|
private final static float playerSyncTime = 2;
|
||||||
public final static float viewScale = 2f;
|
public final static float viewScale = 2f;
|
||||||
|
|
||||||
|
private long ping;
|
||||||
private Interval timer = new Interval(5);
|
private Interval timer = new Interval(5);
|
||||||
/** Whether the client is currently connecting. */
|
/** Whether the client is currently connecting. */
|
||||||
private boolean connecting = false;
|
private boolean connecting = false;
|
||||||
@@ -60,7 +57,7 @@ public class NetClient implements ApplicationListener{
|
|||||||
|
|
||||||
public NetClient(){
|
public NetClient(){
|
||||||
|
|
||||||
Net.handleClient(Connect.class, packet -> {
|
net.handleClient(Connect.class, packet -> {
|
||||||
Log.info("Connecting to server: {0}", packet.addressTCP);
|
Log.info("Connecting to server: {0}", packet.addressTCP);
|
||||||
|
|
||||||
player.isAdmin = false;
|
player.isAdmin = false;
|
||||||
@@ -74,7 +71,7 @@ public class NetClient implements ApplicationListener{
|
|||||||
ui.loadfrag.hide();
|
ui.loadfrag.hide();
|
||||||
connecting = false;
|
connecting = false;
|
||||||
quiet = true;
|
quiet = true;
|
||||||
Net.disconnect();
|
net.disconnect();
|
||||||
});
|
});
|
||||||
|
|
||||||
ConnectPacket c = new ConnectPacket();
|
ConnectPacket c = new ConnectPacket();
|
||||||
@@ -83,41 +80,51 @@ public class NetClient implements ApplicationListener{
|
|||||||
c.versionType = Version.type;
|
c.versionType = Version.type;
|
||||||
c.color = Color.rgba8888(player.color);
|
c.color = Color.rgba8888(player.color);
|
||||||
c.usid = getUsid(packet.addressTCP);
|
c.usid = getUsid(packet.addressTCP);
|
||||||
c.uuid = Platform.instance.getUUID();
|
c.uuid = platform.getUUID();
|
||||||
|
|
||||||
if(c.uuid == null){
|
if(c.uuid == null){
|
||||||
ui.showError("$invalidid");
|
ui.showErrorMessage("$invalidid");
|
||||||
ui.loadfrag.hide();
|
ui.loadfrag.hide();
|
||||||
disconnectQuietly();
|
disconnectQuietly();
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
Net.send(c, SendMode.tcp);
|
net.send(c, SendMode.tcp);
|
||||||
});
|
});
|
||||||
|
|
||||||
Net.handleClient(Disconnect.class, packet -> {
|
net.handleClient(Disconnect.class, packet -> {
|
||||||
if(quietReset) return;
|
if(quietReset) return;
|
||||||
|
|
||||||
connecting = false;
|
connecting = false;
|
||||||
state.set(State.menu);
|
state.set(State.menu);
|
||||||
logic.reset();
|
logic.reset();
|
||||||
Platform.instance.updateRPC();
|
platform.updateRPC();
|
||||||
|
|
||||||
if(quiet) return;
|
if(quiet) return;
|
||||||
|
|
||||||
Time.runTask(3f, ui.loadfrag::hide);
|
Time.runTask(3f, ui.loadfrag::hide);
|
||||||
|
|
||||||
ui.showError("$disconnect");
|
if(packet.reason != null){
|
||||||
|
if(packet.reason.equals("closed")){
|
||||||
|
ui.showSmall("$disconnect", "$disconnect.closed");
|
||||||
|
}else if(packet.reason.equals("timeout")){
|
||||||
|
ui.showSmall("$disconnect", "$disconnect.timeout");
|
||||||
|
}else if(packet.reason.equals("error")){
|
||||||
|
ui.showSmall("$disconnect", "$disconnect.error");
|
||||||
|
}
|
||||||
|
}else{
|
||||||
|
ui.showErrorMessage("$disconnect");
|
||||||
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
Net.handleClient(WorldStream.class, data -> {
|
net.handleClient(WorldStream.class, data -> {
|
||||||
Log.info("Recieved world data: {0} bytes.", data.stream.available());
|
Log.info("Recieved world data: {0} bytes.", data.stream.available());
|
||||||
NetworkIO.loadWorld(new InflaterInputStream(data.stream));
|
NetworkIO.loadWorld(new InflaterInputStream(data.stream));
|
||||||
|
|
||||||
finishConnecting();
|
finishConnecting();
|
||||||
});
|
});
|
||||||
|
|
||||||
Net.handleClient(InvokePacket.class, packet -> {
|
net.handleClient(InvokePacket.class, packet -> {
|
||||||
packet.writeBuffer.position(0);
|
packet.writeBuffer.position(0);
|
||||||
RemoteReadClient.readPacket(packet.writeBuffer, packet.type);
|
RemoteReadClient.readPacket(packet.writeBuffer, packet.type);
|
||||||
});
|
});
|
||||||
@@ -151,20 +158,55 @@ public class NetClient implements ApplicationListener{
|
|||||||
throw new ValidateException(player, "Player has sent a message above the text limit.");
|
throw new ValidateException(player, "Player has sent a message above the text limit.");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//check if it's a command
|
||||||
|
CommandResponse response = netServer.clientCommands.handleMessage(message, player);
|
||||||
|
if(response.type == ResponseType.noCommand){ //no command to handle
|
||||||
//server console logging
|
//server console logging
|
||||||
Log.info("&y{0}: &lb{1}", player.name, message);
|
Log.info("&y{0}: &lb{1}", player.name, message);
|
||||||
|
|
||||||
//invoke event for all clients but also locally
|
//invoke event for all clients but also locally
|
||||||
//this is required so other clients get the correct name even if they don't know who's sending it yet
|
//this is required so other clients get the correct name even if they don't know who's sending it yet
|
||||||
Call.sendMessage(message, colorizeName(player.id, player.name), player);
|
Call.sendMessage(message, colorizeName(player.id, player.name), player);
|
||||||
|
}else{
|
||||||
|
//log command to console but with brackets
|
||||||
|
Log.info("<&y{0}: &lm{1}&lg>", player.name, message);
|
||||||
|
|
||||||
|
//a command was sent, now get the output
|
||||||
|
if(response.type != ResponseType.valid){
|
||||||
|
String text;
|
||||||
|
|
||||||
|
//send usage
|
||||||
|
if(response.type == ResponseType.manyArguments){
|
||||||
|
text = "[scarlet]Too many arguments. Usage:[lightgray] " + response.command.text + "[gray] " + response.command.paramText;
|
||||||
|
}else if(response.type == ResponseType.fewArguments){
|
||||||
|
text = "[scarlet]Too few arguments. Usage:[lightgray] " + response.command.text + "[gray] " + response.command.paramText;
|
||||||
|
}else{ //unknown command
|
||||||
|
text = "[scarlet]Unknown command. Check [lightgray]/help[scarlet].";
|
||||||
}
|
}
|
||||||
|
|
||||||
private static String colorizeName(int id, String name){
|
player.sendMessage(text);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Events.fire(new PlayerChatEvent(player, message));
|
||||||
|
}
|
||||||
|
|
||||||
|
public static String colorizeName(int id, String name){
|
||||||
Player player = playerGroup.getByID(id);
|
Player player = playerGroup.getByID(id);
|
||||||
if(name == null || player == null) return null;
|
if(name == null || player == null) return null;
|
||||||
return "[#" + player.color.toString().toUpperCase() + "]" + name;
|
return "[#" + player.color.toString().toUpperCase() + "]" + name;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Remote(targets = Loc.client)
|
||||||
|
public static void onPing(Player player, long time){
|
||||||
|
Call.onPingResponse(player.con, time);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Remote(variants = Variant.one)
|
||||||
|
public static void onPingResponse(long time){
|
||||||
|
netClient.ping = Time.timeSinceMillis(time);
|
||||||
|
}
|
||||||
|
|
||||||
@Remote(variants = Variant.one)
|
@Remote(variants = Variant.one)
|
||||||
public static void onTraceInfo(Player player, TraceInfo info){
|
public static void onTraceInfo(Player player, TraceInfo info){
|
||||||
if(player != null){
|
if(player != null){
|
||||||
@@ -195,12 +237,12 @@ public class NetClient implements ApplicationListener{
|
|||||||
|
|
||||||
@Remote(variants = Variant.both)
|
@Remote(variants = Variant.both)
|
||||||
public static void onWorldDataBegin(){
|
public static void onWorldDataBegin(){
|
||||||
Entities.clear();
|
entities.clear();
|
||||||
netClient.removed.clear();
|
netClient.removed.clear();
|
||||||
logic.reset();
|
logic.reset();
|
||||||
|
|
||||||
ui.chatfrag.clearMessages();
|
ui.chatfrag.clearMessages();
|
||||||
Net.setClientLoaded(false);
|
net.setClientLoaded(false);
|
||||||
|
|
||||||
ui.loadfrag.show("$connecting.data");
|
ui.loadfrag.show("$connecting.data");
|
||||||
|
|
||||||
@@ -208,7 +250,7 @@ public class NetClient implements ApplicationListener{
|
|||||||
ui.loadfrag.hide();
|
ui.loadfrag.hide();
|
||||||
netClient.connecting = false;
|
netClient.connecting = false;
|
||||||
netClient.quiet = true;
|
netClient.quiet = true;
|
||||||
Net.disconnect();
|
net.disconnect();
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -226,10 +268,10 @@ public class NetClient implements ApplicationListener{
|
|||||||
@Remote(variants = Variant.one, priority = PacketPriority.low, unreliable = true)
|
@Remote(variants = Variant.one, priority = PacketPriority.low, unreliable = true)
|
||||||
public static void onEntitySnapshot(byte groupID, short amount, short dataLen, byte[] data){
|
public static void onEntitySnapshot(byte groupID, short amount, short dataLen, byte[] data){
|
||||||
try{
|
try{
|
||||||
netClient.byteStream.setBytes(Net.decompressSnapshot(data, dataLen));
|
netClient.byteStream.setBytes(net.decompressSnapshot(data, dataLen));
|
||||||
DataInputStream input = netClient.dataStream;
|
DataInputStream input = netClient.dataStream;
|
||||||
|
|
||||||
EntityGroup group = Entities.getGroup(groupID);
|
EntityGroup group = entities.get(groupID);
|
||||||
|
|
||||||
//go through each entity
|
//go through each entity
|
||||||
for(int j = 0; j < amount; j++){
|
for(int j = 0; j < amount; j++){
|
||||||
@@ -282,7 +324,7 @@ public class NetClient implements ApplicationListener{
|
|||||||
state.wave = wave;
|
state.wave = wave;
|
||||||
state.enemies = enemies;
|
state.enemies = enemies;
|
||||||
|
|
||||||
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();
|
byte cores = input.readByte();
|
||||||
@@ -304,20 +346,20 @@ public class NetClient implements ApplicationListener{
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void update(){
|
public void update(){
|
||||||
if(!Net.client()) return;
|
if(!net.client()) return;
|
||||||
|
|
||||||
if(!state.is(State.menu)){
|
if(!state.is(State.menu)){
|
||||||
if(!connecting) sync();
|
if(!connecting) sync();
|
||||||
}else if(!connecting){
|
}else if(!connecting){
|
||||||
Net.disconnect();
|
net.disconnect();
|
||||||
}else{ //...must be connecting
|
}else{ //...must be connecting
|
||||||
timeoutTime += Time.delta();
|
timeoutTime += Time.delta();
|
||||||
if(timeoutTime > dataTimeout){
|
if(timeoutTime > dataTimeout){
|
||||||
Log.err("Failed to load data!");
|
Log.err("Failed to load data!");
|
||||||
ui.loadfrag.hide();
|
ui.loadfrag.hide();
|
||||||
quiet = true;
|
quiet = true;
|
||||||
ui.showError("$disconnect.data");
|
ui.showErrorMessage("$disconnect.data");
|
||||||
Net.disconnect();
|
net.disconnect();
|
||||||
timeoutTime = 0f;
|
timeoutTime = 0f;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -327,18 +369,22 @@ public class NetClient implements ApplicationListener{
|
|||||||
return connecting;
|
return connecting;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public int getPing(){
|
||||||
|
return (int)ping;
|
||||||
|
}
|
||||||
|
|
||||||
private void finishConnecting(){
|
private void finishConnecting(){
|
||||||
state.set(State.playing);
|
state.set(State.playing);
|
||||||
connecting = false;
|
connecting = false;
|
||||||
ui.join.hide();
|
ui.join.hide();
|
||||||
Net.setClientLoaded(true);
|
net.setClientLoaded(true);
|
||||||
Core.app.post(Call::connectConfirm);
|
Core.app.post(Call::connectConfirm);
|
||||||
Time.runTask(40f, Platform.instance::updateRPC);
|
Time.runTask(40f, platform::updateRPC);
|
||||||
Core.app.post(() -> ui.loadfrag.hide());
|
Core.app.post(() -> ui.loadfrag.hide());
|
||||||
}
|
}
|
||||||
|
|
||||||
private void reset(){
|
private void reset(){
|
||||||
Net.setClientLoaded(false);
|
net.setClientLoaded(false);
|
||||||
removed.clear();
|
removed.clear();
|
||||||
timeoutTime = 0f;
|
timeoutTime = 0f;
|
||||||
connecting = true;
|
connecting = true;
|
||||||
@@ -346,7 +392,7 @@ public class NetClient implements ApplicationListener{
|
|||||||
quiet = false;
|
quiet = false;
|
||||||
lastSent = 0;
|
lastSent = 0;
|
||||||
|
|
||||||
Entities.clear();
|
entities.clear();
|
||||||
ui.chatfrag.clearMessages();
|
ui.chatfrag.clearMessages();
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -357,13 +403,13 @@ public class NetClient implements ApplicationListener{
|
|||||||
/** Disconnects, resetting state to the menu. */
|
/** Disconnects, resetting state to the menu. */
|
||||||
public void disconnectQuietly(){
|
public void disconnectQuietly(){
|
||||||
quiet = true;
|
quiet = true;
|
||||||
Net.disconnect();
|
net.disconnect();
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Disconnects, causing no further changes or reset.*/
|
/** Disconnects, causing no further changes or reset.*/
|
||||||
public void disconnectNoReset(){
|
public void disconnectNoReset(){
|
||||||
quiet = quietReset = true;
|
quiet = quietReset = true;
|
||||||
Net.disconnect();
|
net.disconnect();
|
||||||
}
|
}
|
||||||
|
|
||||||
/** When set, any disconnects will be ignored and no dialogs will be shown. */
|
/** When set, any disconnects will be ignored and no dialogs will be shown. */
|
||||||
@@ -402,7 +448,7 @@ public class NetClient implements ApplicationListener{
|
|||||||
}
|
}
|
||||||
|
|
||||||
if(timer.get(1, 60)){
|
if(timer.get(1, 60)){
|
||||||
Net.updatePing();
|
Call.onPing(Time.millis());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -1,40 +1,31 @@
|
|||||||
package io.anuke.mindustry.core;
|
package io.anuke.mindustry.core;
|
||||||
|
|
||||||
import io.anuke.annotations.Annotations.Loc;
|
import io.anuke.annotations.Annotations.*;
|
||||||
import io.anuke.annotations.Annotations.Remote;
|
import io.anuke.arc.*;
|
||||||
import io.anuke.arc.ApplicationListener;
|
import io.anuke.arc.collection.*;
|
||||||
import io.anuke.arc.Events;
|
import io.anuke.arc.graphics.*;
|
||||||
import io.anuke.arc.collection.IntMap;
|
import io.anuke.arc.math.*;
|
||||||
import io.anuke.arc.collection.ObjectSet;
|
import io.anuke.arc.math.geom.*;
|
||||||
import io.anuke.arc.graphics.Color;
|
|
||||||
import io.anuke.arc.graphics.Colors;
|
|
||||||
import io.anuke.arc.math.Mathf;
|
|
||||||
import io.anuke.arc.math.geom.Rectangle;
|
|
||||||
import io.anuke.arc.math.geom.Vector2;
|
|
||||||
import io.anuke.arc.util.*;
|
import io.anuke.arc.util.*;
|
||||||
|
import io.anuke.arc.util.CommandHandler.*;
|
||||||
import io.anuke.arc.util.io.*;
|
import io.anuke.arc.util.io.*;
|
||||||
import io.anuke.mindustry.content.Blocks;
|
import io.anuke.mindustry.content.*;
|
||||||
import io.anuke.mindustry.core.GameState.State;
|
import io.anuke.mindustry.core.GameState.*;
|
||||||
import io.anuke.mindustry.entities.Entities;
|
import io.anuke.mindustry.entities.*;
|
||||||
import io.anuke.mindustry.entities.EntityGroup;
|
import io.anuke.mindustry.entities.traits.BuilderTrait.*;
|
||||||
import io.anuke.mindustry.entities.traits.BuilderTrait.BuildRequest;
|
import io.anuke.mindustry.entities.traits.*;
|
||||||
import io.anuke.mindustry.entities.traits.Entity;
|
import io.anuke.mindustry.entities.type.*;
|
||||||
import io.anuke.mindustry.entities.traits.SyncTrait;
|
import io.anuke.mindustry.game.EventType.*;
|
||||||
import io.anuke.mindustry.entities.type.Player;
|
import io.anuke.mindustry.game.*;
|
||||||
import io.anuke.mindustry.game.EventType.WorldLoadEvent;
|
import io.anuke.mindustry.gen.*;
|
||||||
import io.anuke.mindustry.game.Team;
|
|
||||||
import io.anuke.mindustry.game.Version;
|
|
||||||
import io.anuke.mindustry.gen.Call;
|
|
||||||
import io.anuke.mindustry.gen.RemoteReadServer;
|
|
||||||
import io.anuke.mindustry.net.*;
|
import io.anuke.mindustry.net.*;
|
||||||
import io.anuke.mindustry.net.Administration.PlayerInfo;
|
import io.anuke.mindustry.net.Administration.*;
|
||||||
import io.anuke.mindustry.net.Administration.TraceInfo;
|
|
||||||
import io.anuke.mindustry.net.Packets.*;
|
import io.anuke.mindustry.net.Packets.*;
|
||||||
import io.anuke.mindustry.world.Tile;
|
import io.anuke.mindustry.world.*;
|
||||||
|
|
||||||
import java.io.*;
|
import java.io.*;
|
||||||
import java.nio.ByteBuffer;
|
import java.nio.*;
|
||||||
import java.util.zip.DeflaterOutputStream;
|
import java.util.zip.*;
|
||||||
|
|
||||||
import static io.anuke.mindustry.Vars.*;
|
import static io.anuke.mindustry.Vars.*;
|
||||||
|
|
||||||
@@ -47,9 +38,8 @@ public class NetServer implements ApplicationListener{
|
|||||||
private final static float correctDist = 16f;
|
private final static float correctDist = 16f;
|
||||||
|
|
||||||
public final Administration admins = new Administration();
|
public final Administration admins = new Administration();
|
||||||
|
public final CommandHandler clientCommands = new CommandHandler("/");
|
||||||
|
|
||||||
/** Maps connection IDs to players. */
|
|
||||||
private IntMap<Player> connections = new IntMap<>();
|
|
||||||
private boolean closing = false;
|
private boolean closing = false;
|
||||||
|
|
||||||
private ByteBuffer writeBuffer = ByteBuffer.allocate(127);
|
private ByteBuffer writeBuffer = ByteBuffer.allocate(127);
|
||||||
@@ -61,57 +51,67 @@ public class NetServer implements ApplicationListener{
|
|||||||
private DataOutputStream dataStream = new DataOutputStream(syncStream);
|
private DataOutputStream dataStream = new DataOutputStream(syncStream);
|
||||||
|
|
||||||
public NetServer(){
|
public NetServer(){
|
||||||
Events.on(WorldLoadEvent.class, event -> {
|
|
||||||
if(!headless){
|
|
||||||
connections.clear();
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
Net.handleServer(Connect.class, (id, connect) -> {
|
net.handleServer(Connect.class, (con, connect) -> {
|
||||||
if(admins.isIPBanned(connect.addressTCP)){
|
if(admins.isIPBanned(connect.addressTCP)){
|
||||||
kick(id, KickReason.banned);
|
con.kick(KickReason.banned);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
Net.handleServer(Disconnect.class, (id, packet) -> {
|
net.handleServer(Disconnect.class, (con, packet) -> {
|
||||||
Player player = connections.get(id);
|
if(con.player != null){
|
||||||
if(player != null){
|
onDisconnect(con.player, packet.reason);
|
||||||
onDisconnect(player);
|
|
||||||
}
|
}
|
||||||
connections.remove(id);
|
|
||||||
});
|
});
|
||||||
|
|
||||||
Net.handleServer(ConnectPacket.class, (id, packet) -> {
|
net.handleServer(ConnectPacket.class, (con, packet) -> {
|
||||||
String uuid = packet.uuid;
|
String uuid = packet.uuid;
|
||||||
|
|
||||||
NetConnection connection = Net.getConnection(id);
|
if(admins.isIPBanned(con.address)) return;
|
||||||
|
|
||||||
if(connection == null ||
|
if(con.hasBegunConnecting){
|
||||||
admins.isIPBanned(connection.address)) return;
|
con.kick(KickReason.idInUse);
|
||||||
|
|
||||||
if(connection.hasBegunConnecting){
|
|
||||||
kick(id, KickReason.idInUse);
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
connection.hasBegunConnecting = true;
|
|
||||||
|
|
||||||
PlayerInfo info = admins.getInfo(uuid);
|
PlayerInfo info = admins.getInfo(uuid);
|
||||||
|
|
||||||
connection.mobile = packet.mobile;
|
con.hasBegunConnecting = true;
|
||||||
|
con.mobile = packet.mobile;
|
||||||
|
|
||||||
if(admins.isIDBanned(uuid)){
|
if(admins.isIDBanned(uuid)){
|
||||||
kick(id, KickReason.banned);
|
con.kick(KickReason.banned);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if(Time.millis() - info.lastKicked < kickDuration){
|
if(Time.millis() - info.lastKicked < kickDuration){
|
||||||
kick(id, KickReason.recentKick);
|
con.kick(KickReason.recentKick);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if(admins.isIDBanned(uuid)){
|
||||||
|
con.kick(KickReason.banned);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if(admins.getPlayerLimit() > 0 && playerGroup.size() >= admins.getPlayerLimit()){
|
||||||
|
con.kick(KickReason.playerLimit);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if(!admins.isWhitelisted(packet.uuid, packet.usid)){
|
||||||
|
info.adminUsid = packet.usid;
|
||||||
|
info.lastName = packet.name;
|
||||||
|
info.id = packet.uuid;
|
||||||
|
admins.save();
|
||||||
|
Call.onInfoMessage(con, "You are not whitelisted here.");
|
||||||
|
Log.info("&lcDo &lywhitelist-add {0}&lc to whitelist the player &lb'{1}'", packet.uuid, packet.name);
|
||||||
|
con.kick(KickReason.whitelist);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if(packet.versionType == null || ((packet.version == -1 || !packet.versionType.equals(Version.type)) && Version.build != -1 && !admins.allowsCustomClients())){
|
if(packet.versionType == null || ((packet.version == -1 || !packet.versionType.equals(Version.type)) && Version.build != -1 && !admins.allowsCustomClients())){
|
||||||
kick(id, KickReason.customClient);
|
con.kick(!Version.type.equals(packet.versionType) ? KickReason.typeMismatch : KickReason.customClient);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -120,12 +120,12 @@ public class NetServer implements ApplicationListener{
|
|||||||
if(preventDuplicates){
|
if(preventDuplicates){
|
||||||
for(Player player : playerGroup.all()){
|
for(Player player : playerGroup.all()){
|
||||||
if(player.name.trim().equalsIgnoreCase(packet.name.trim())){
|
if(player.name.trim().equalsIgnoreCase(packet.name.trim())){
|
||||||
kick(id, KickReason.nameInUse);
|
con.kick(KickReason.nameInUse);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if(player.uuid.equals(packet.uuid) || player.usid.equals(packet.usid)){
|
if(player.uuid.equals(packet.uuid) || player.usid.equals(packet.usid)){
|
||||||
kick(id, KickReason.idInUse);
|
con.kick(KickReason.idInUse);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -134,28 +134,26 @@ public class NetServer implements ApplicationListener{
|
|||||||
packet.name = fixName(packet.name);
|
packet.name = fixName(packet.name);
|
||||||
|
|
||||||
if(packet.name.trim().length() <= 0){
|
if(packet.name.trim().length() <= 0){
|
||||||
kick(id, KickReason.nameEmpty);
|
con.kick(KickReason.nameEmpty);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
Log.debug("Recieved connect packet for player '{0}' / UUID {1} / IP {2}", packet.name, uuid, connection.address);
|
String ip = con.address;
|
||||||
|
|
||||||
String ip = Net.getConnection(id).address;
|
|
||||||
|
|
||||||
admins.updatePlayerJoined(uuid, ip, packet.name);
|
admins.updatePlayerJoined(uuid, ip, packet.name);
|
||||||
|
|
||||||
if(packet.version != Version.build && Version.build != -1 && packet.version != -1){
|
if(packet.version != Version.build && Version.build != -1 && packet.version != -1){
|
||||||
kick(id, packet.version > Version.build ? KickReason.serverOutdated : KickReason.clientOutdated);
|
con.kick(packet.version > Version.build ? KickReason.serverOutdated : KickReason.clientOutdated);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if(packet.version == -1){
|
if(packet.version == -1){
|
||||||
connection.modclient = true;
|
con.modclient = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
Player player = new Player();
|
Player player = new Player();
|
||||||
player.isAdmin = admins.isAdmin(uuid, packet.usid);
|
player.isAdmin = admins.isAdmin(uuid, packet.usid);
|
||||||
player.con = Net.getConnection(id);
|
player.con = con;
|
||||||
player.usid = packet.usid;
|
player.usid = packet.usid;
|
||||||
player.name = packet.name;
|
player.name = packet.name;
|
||||||
player.uuid = uuid;
|
player.uuid = uuid;
|
||||||
@@ -170,28 +168,202 @@ public class NetServer implements ApplicationListener{
|
|||||||
player.write(outputBuffer);
|
player.write(outputBuffer);
|
||||||
}catch(Throwable t){
|
}catch(Throwable t){
|
||||||
t.printStackTrace();
|
t.printStackTrace();
|
||||||
kick(id, KickReason.nameEmpty);
|
con.kick(KickReason.nameEmpty);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
con.player = player;
|
||||||
|
|
||||||
//playing in pvp mode automatically assigns players to teams
|
//playing in pvp mode automatically assigns players to teams
|
||||||
if(state.rules.pvp){
|
if(state.rules.pvp){
|
||||||
player.setTeam(assignTeam(player, playerGroup.all()));
|
player.setTeam(assignTeam(player, playerGroup.all()));
|
||||||
Log.info("Auto-assigned player {0} to team {1}.", player.name, player.getTeam());
|
Log.info("Auto-assigned player {0} to team {1}.", player.name, player.getTeam());
|
||||||
}
|
}
|
||||||
|
|
||||||
connections.put(id, player);
|
sendWorldData(player);
|
||||||
|
|
||||||
sendWorldData(player, id);
|
platform.updateRPC();
|
||||||
|
|
||||||
Platform.instance.updateRPC();
|
Events.fire(new PlayerConnect(player));
|
||||||
});
|
});
|
||||||
|
|
||||||
Net.handleServer(InvokePacket.class, (id, packet) -> {
|
net.handleServer(InvokePacket.class, (con, packet) -> {
|
||||||
Player player = connections.get(id);
|
if(con.player == null) return;
|
||||||
if(player == null) return;
|
RemoteReadServer.readPacket(packet.writeBuffer, packet.type, con.player);
|
||||||
RemoteReadServer.readPacket(packet.writeBuffer, packet.type, player);
|
|
||||||
});
|
});
|
||||||
|
|
||||||
|
registerCommands();
|
||||||
|
}
|
||||||
|
|
||||||
|
private void registerCommands(){
|
||||||
|
clientCommands.<Player>register("help", "[page]", "Lists all commands.", (args, player) -> {
|
||||||
|
if(args.length > 0 && !Strings.canParseInt(args[0])){
|
||||||
|
player.sendMessage("[scarlet]'page' must be a number.");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
int commandsPerPage = 6;
|
||||||
|
int page = args.length > 0 ? Strings.parseInt(args[0]) : 1;
|
||||||
|
int pages = Mathf.ceil((float)clientCommands.getCommandList().size / commandsPerPage);
|
||||||
|
|
||||||
|
page --;
|
||||||
|
|
||||||
|
if(page > pages || page < 0){
|
||||||
|
player.sendMessage("[scarlet]'page' must be a number between[orange] 1[] and[orange] " + pages + "[scarlet].");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
StringBuilder result = new StringBuilder();
|
||||||
|
result.append(Strings.format("[orange]-- Commands Page[lightgray] {0}[gray]/[lightgray]{1}[orange] --\n\n", (page+1), pages));
|
||||||
|
|
||||||
|
for(int i = commandsPerPage * page; i < Math.min(commandsPerPage * (page + 1), clientCommands.getCommandList().size); i++){
|
||||||
|
Command command = clientCommands.getCommandList().get(i);
|
||||||
|
result.append("[orange] /").append(command.text).append("[white] ").append(command.paramText).append("[lightgray] - ").append(command.description).append("\n");
|
||||||
|
}
|
||||||
|
player.sendMessage(result.toString());
|
||||||
|
});
|
||||||
|
|
||||||
|
clientCommands.<Player>register("t", "<message...>", "Send a message only to your teammates.", (args, player) -> {
|
||||||
|
playerGroup.all().each(p -> p.getTeam() == player.getTeam(), o -> o.sendMessage(args[0], player, "[#" + player.getTeam().color.toString() + "]<T>" + NetClient.colorizeName(player.id, player.name)));
|
||||||
|
});
|
||||||
|
|
||||||
|
//duration of a a kick in seconds
|
||||||
|
int kickDuration = 15 * 60;
|
||||||
|
|
||||||
|
class VoteSession{
|
||||||
|
Player target;
|
||||||
|
ObjectSet<String> voted = new ObjectSet<>();
|
||||||
|
VoteSession[] map;
|
||||||
|
Timer.Task task;
|
||||||
|
int votes;
|
||||||
|
|
||||||
|
public VoteSession(VoteSession[] map, Player target){
|
||||||
|
this.target = target;
|
||||||
|
this.map = map;
|
||||||
|
this.task = Timer.schedule(() -> {
|
||||||
|
if(!checkPass()){
|
||||||
|
Call.sendMessage(Strings.format("[lightgray]Vote failed. Not enough votes to kick[orange] {0}[lightgray].", target.name));
|
||||||
|
map[0] = null;
|
||||||
|
task.cancel();
|
||||||
|
}
|
||||||
|
}, 60 * 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
void vote(Player player, int d){
|
||||||
|
votes += d;
|
||||||
|
voted.addAll(player.uuid, admins.getInfo(player.uuid).lastIP);
|
||||||
|
|
||||||
|
Call.sendMessage(Strings.format("[orange]{0}[lightgray] has voted to kick[orange] {1}[].[accent] ({2}/{3})\n[lightgray]Type[orange] /vote <y/n>[] to agree.",
|
||||||
|
player.name, target.name, votes, votesRequired()));
|
||||||
|
//checkPass();
|
||||||
|
}
|
||||||
|
|
||||||
|
boolean checkPass(){
|
||||||
|
if(votes >= votesRequired() && target.isAdded() && target.con.isConnected()){
|
||||||
|
Call.sendMessage(Strings.format("[orange]Vote passed.[scarlet] {0}[orange] will be kicked from the server.", target.name));
|
||||||
|
admins.getInfo(target.uuid).lastKicked = Time.millis() + kickDuration*1000;
|
||||||
|
target.con.kick(KickReason.vote);
|
||||||
|
map[0] = null;
|
||||||
|
task.cancel();
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//cooldown between votes
|
||||||
|
int voteTime = 60 * 5;
|
||||||
|
Timekeeper vtime = new Timekeeper(voteTime);
|
||||||
|
//current kick sessions
|
||||||
|
VoteSession[] currentlyKicking = {null};
|
||||||
|
|
||||||
|
clientCommands.<Player>register("votekick", "[player...]", "Vote to kick a player, with a cooldown.", (args, player) -> {
|
||||||
|
if(playerGroup.size() < 3){
|
||||||
|
player.sendMessage("[scarlet]At least 3 players are needed to start a votekick.");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if(player.isLocal){
|
||||||
|
player.sendMessage("[scarlet]Just kick them yourself if you're the host.");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if(args.length == 0){
|
||||||
|
StringBuilder builder = new StringBuilder();
|
||||||
|
builder.append("[orange]Players to kick: \n");
|
||||||
|
for(Player p : playerGroup.all()){
|
||||||
|
if(p.isAdmin || p.con == null || p == player) continue;
|
||||||
|
|
||||||
|
builder.append("[lightgray] ").append(p.name).append("[accent] (#").append(p.id).append(")\n");
|
||||||
|
}
|
||||||
|
player.sendMessage(builder.toString());
|
||||||
|
}else{
|
||||||
|
Player found;
|
||||||
|
if(args[0].length() > 1 && args[0].startsWith("#") && Strings.canParseInt(args[0].substring(1))){
|
||||||
|
int id = Strings.parseInt(args[0].substring(1));
|
||||||
|
found = playerGroup.find(p -> p.id == id);
|
||||||
|
}else{
|
||||||
|
found = playerGroup.find(p -> p.name.equalsIgnoreCase(args[0]));
|
||||||
|
}
|
||||||
|
|
||||||
|
if(found != null){
|
||||||
|
if(found.isAdmin){
|
||||||
|
player.sendMessage("[scarlet]Did you really expect to be able to kick an admin?");
|
||||||
|
}else if(found.isLocal){
|
||||||
|
player.sendMessage("[scarlet]Local players cannot be kicked.");
|
||||||
|
}else{
|
||||||
|
if(!vtime.get()){
|
||||||
|
player.sendMessage("[scarlet]You must wait " + voteTime/60 + " minutes between votekicks.");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
VoteSession session = new VoteSession(currentlyKicking, found);
|
||||||
|
session.vote(player, 1);
|
||||||
|
vtime.reset();
|
||||||
|
currentlyKicking[0] = session;
|
||||||
|
}
|
||||||
|
}else{
|
||||||
|
player.sendMessage("[scarlet]No player[orange]'" + args[0] + "'[scarlet] found.");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
clientCommands.<Player>register("vote", "<y/n>", "Vote to kick the current player.", (arg, player) -> {
|
||||||
|
if(currentlyKicking[0] == null){
|
||||||
|
player.sendMessage("[scarlet]Nobody is being voted on.");
|
||||||
|
}else{
|
||||||
|
if(currentlyKicking[0].voted.contains(player.uuid) || currentlyKicking[0].voted.contains(admins.getInfo(player.uuid).lastIP)){
|
||||||
|
player.sendMessage("[scarlet]You've already voted. Sit down.");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if(currentlyKicking[0].target == player){
|
||||||
|
player.sendMessage("[scarlet]You can't vote on your own trial.");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if(!arg[0].toLowerCase().equals("y") && !arg[0].toLowerCase().equals("n")){
|
||||||
|
player.sendMessage("[scarlet]Vote either 'y' (yes) or 'n' (no).");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
int sign = arg[0].toLowerCase().equals("y") ? 1 : -1;
|
||||||
|
currentlyKicking[0].vote(player, sign);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
|
||||||
|
clientCommands.<Player>register("sync", "Re-synchronize world state.", (args, player) -> {
|
||||||
|
if(player.isLocal){
|
||||||
|
player.sendMessage("[scarlet]Re-synchronizing as the host is pointless.");
|
||||||
|
}else{
|
||||||
|
Call.onWorldDataBegin(player.con);
|
||||||
|
netServer.sendWorldData(player);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
public int votesRequired(){
|
||||||
|
return 2 + (playerGroup.size() > 4 ? 1 : 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
public Team assignTeam(Player current, Iterable<Player> players){
|
public Team assignTeam(Player current, Iterable<Player> players){
|
||||||
@@ -210,18 +382,18 @@ public class NetServer implements ApplicationListener{
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
public void sendWorldData(Player player, int clientID){
|
public void sendWorldData(Player player){
|
||||||
ByteArrayOutputStream stream = new ByteArrayOutputStream();
|
ByteArrayOutputStream stream = new ByteArrayOutputStream();
|
||||||
DeflaterOutputStream def = new FastDeflaterOutputStream(stream);
|
DeflaterOutputStream def = new FastDeflaterOutputStream(stream);
|
||||||
NetworkIO.writeWorld(player, def);
|
NetworkIO.writeWorld(player, def);
|
||||||
WorldStream data = new WorldStream();
|
WorldStream data = new WorldStream();
|
||||||
data.stream = new ByteArrayInputStream(stream.toByteArray());
|
data.stream = new ByteArrayInputStream(stream.toByteArray());
|
||||||
Net.sendStream(clientID, data);
|
player.con.sendStream(data);
|
||||||
|
|
||||||
Log.debug("Packed {0} compressed bytes of world data.", stream.size());
|
Log.debug("Packed {0} compressed bytes of world data.", stream.size());
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void onDisconnect(Player player){
|
public static void onDisconnect(Player player, String reason){
|
||||||
//singleplayer multiplayer wierdness
|
//singleplayer multiplayer wierdness
|
||||||
if(player.con == null){
|
if(player.con == null){
|
||||||
player.remove();
|
player.remove();
|
||||||
@@ -229,12 +401,12 @@ public class NetServer implements ApplicationListener{
|
|||||||
}
|
}
|
||||||
|
|
||||||
if(player.con.hasConnected){
|
if(player.con.hasConnected){
|
||||||
|
Events.fire(new PlayerLeave(player));
|
||||||
Call.sendMessage("[accent]" + player.name + "[accent] has disconnected.");
|
Call.sendMessage("[accent]" + player.name + "[accent] has disconnected.");
|
||||||
Call.onPlayerDisconnect(player.id);
|
Call.onPlayerDisconnect(player.id);
|
||||||
}
|
}
|
||||||
player.remove();
|
player.remove();
|
||||||
netServer.connections.remove(player.con.id);
|
Log.info("&lm[{1}] &lc{0} has disconnected. &lg&fi({2})", player.name, player.uuid, reason);
|
||||||
Log.info("&lm[{1}] &lc{0} has disconnected.", player.name, player.uuid);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private static float compound(float speed, float drag){
|
private static float compound(float speed, float drag){
|
||||||
@@ -315,7 +487,7 @@ public class NetServer implements ApplicationListener{
|
|||||||
newx = x;
|
newx = x;
|
||||||
newy = y;
|
newy = y;
|
||||||
}else if(Mathf.dst(x, y, newx, newy) > correctDist){
|
}else if(Mathf.dst(x, y, newx, newy) > correctDist){
|
||||||
Call.onPositionSet(player.con.id, newx, newy); //teleport and correct position when necessary
|
Call.onPositionSet(player.con, newx, newy); //teleport and correct position when necessary
|
||||||
}
|
}
|
||||||
|
|
||||||
//reset player to previous synced position so it gets interpolated
|
//reset player to previous synced position so it gets interpolated
|
||||||
@@ -350,15 +522,15 @@ public class NetServer implements ApplicationListener{
|
|||||||
state.wavetime = 0f;
|
state.wavetime = 0f;
|
||||||
}else if(action == AdminAction.ban){
|
}else if(action == AdminAction.ban){
|
||||||
netServer.admins.banPlayerIP(other.con.address);
|
netServer.admins.banPlayerIP(other.con.address);
|
||||||
netServer.kick(other.con.id, KickReason.banned);
|
other.con.kick(KickReason.banned);
|
||||||
Log.info("&lc{0} has banned {1}.", player.name, other.name);
|
Log.info("&lc{0} has banned {1}.", player.name, other.name);
|
||||||
}else if(action == AdminAction.kick){
|
}else if(action == AdminAction.kick){
|
||||||
netServer.kick(other.con.id, KickReason.kick);
|
other.con.kick(KickReason.kick);
|
||||||
Log.info("&lc{0} has kicked {1}.", player.name, other.name);
|
Log.info("&lc{0} has kicked {1}.", player.name, other.name);
|
||||||
}else if(action == AdminAction.trace){
|
}else if(action == AdminAction.trace){
|
||||||
TraceInfo info = new TraceInfo(other.con.address, other.uuid, other.con.modclient, other.con.mobile);
|
TraceInfo info = new TraceInfo(other.con.address, other.uuid, other.con.modclient, other.con.mobile);
|
||||||
if(player.con != null){
|
if(player.con != null){
|
||||||
Call.onTraceInfo(player.con.id, other, info);
|
Call.onTraceInfo(player.con, other, info);
|
||||||
}else{
|
}else{
|
||||||
NetClient.onTraceInfo(other, info);
|
NetClient.onTraceInfo(other, info);
|
||||||
}
|
}
|
||||||
@@ -374,6 +546,8 @@ public class NetServer implements ApplicationListener{
|
|||||||
player.con.hasConnected = true;
|
player.con.hasConnected = true;
|
||||||
Call.sendMessage("[accent]" + player.name + "[accent] has connected.");
|
Call.sendMessage("[accent]" + player.name + "[accent] has connected.");
|
||||||
Log.info("&lm[{1}] &y{0} has connected. ", player.name, player.uuid);
|
Log.info("&lm[{1}] &y{0} has connected. ", player.name, player.uuid);
|
||||||
|
|
||||||
|
Events.fire(new PlayerJoin(player));
|
||||||
}
|
}
|
||||||
|
|
||||||
public boolean isWaitingForPlayers(){
|
public boolean isWaitingForPlayers(){
|
||||||
@@ -391,51 +565,27 @@ public class NetServer implements ApplicationListener{
|
|||||||
|
|
||||||
public void update(){
|
public void update(){
|
||||||
|
|
||||||
if(!headless && !closing && Net.server() && state.is(State.menu)){
|
if(!headless && !closing && net.server() && state.is(State.menu)){
|
||||||
closing = true;
|
closing = true;
|
||||||
ui.loadfrag.show("$server.closing");
|
ui.loadfrag.show("$server.closing");
|
||||||
Time.runTask(5f, () -> {
|
Time.runTask(5f, () -> {
|
||||||
Net.closeServer();
|
net.closeServer();
|
||||||
ui.loadfrag.hide();
|
ui.loadfrag.hide();
|
||||||
closing = false;
|
closing = false;
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
if(!state.is(State.menu) && Net.server()){
|
if(!state.is(State.menu) && net.server()){
|
||||||
sync();
|
sync();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public void kickAll(KickReason reason){
|
public void kickAll(KickReason reason){
|
||||||
for(NetConnection con : Net.getConnections()){
|
for(NetConnection con : net.getConnections()){
|
||||||
kick(con.id, reason);
|
con.kick(reason);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public void kick(int connection, KickReason reason){
|
|
||||||
NetConnection con = Net.getConnection(connection);
|
|
||||||
if(con == null){
|
|
||||||
Log.err("Cannot kick unknown player!");
|
|
||||||
return;
|
|
||||||
}else{
|
|
||||||
Log.info("Kicking connection #{0} / IP: {1}. Reason: {2}", connection, con.address, reason.name());
|
|
||||||
}
|
|
||||||
|
|
||||||
Player player = connections.get(con.id);
|
|
||||||
|
|
||||||
if(player != null && (reason == KickReason.kick || reason == KickReason.banned) && player.uuid != null){
|
|
||||||
PlayerInfo info = admins.getInfo(player.uuid);
|
|
||||||
info.timesKicked++;
|
|
||||||
info.lastKicked = Time.millis();
|
|
||||||
}
|
|
||||||
|
|
||||||
Call.onKick(connection, reason);
|
|
||||||
|
|
||||||
Time.runTask(2f, con::close);
|
|
||||||
|
|
||||||
admins.save();
|
|
||||||
}
|
|
||||||
|
|
||||||
public void writeSnapshot(Player player) throws IOException{
|
public void writeSnapshot(Player player) throws IOException{
|
||||||
syncStream.reset();
|
syncStream.reset();
|
||||||
ObjectSet<Tile> cores = state.teams.get(player.getTeam()).cores;
|
ObjectSet<Tile> cores = state.teams.get(player.getTeam()).cores;
|
||||||
@@ -451,12 +601,12 @@ public class NetServer implements ApplicationListener{
|
|||||||
byte[] stateBytes = syncStream.toByteArray();
|
byte[] stateBytes = syncStream.toByteArray();
|
||||||
|
|
||||||
//write basic state data.
|
//write basic state data.
|
||||||
Call.onStateSnapshot(player.con.id, state.wavetime, state.wave, state.enemies(), (short)stateBytes.length, Net.compressSnapshot(stateBytes));
|
Call.onStateSnapshot(player.con, state.wavetime, state.wave, state.enemies(), (short)stateBytes.length, net.compressSnapshot(stateBytes));
|
||||||
|
|
||||||
viewport.setSize(player.con.viewWidth, player.con.viewHeight).setCenter(player.con.viewX, player.con.viewY);
|
viewport.setSize(player.con.viewWidth, player.con.viewHeight).setCenter(player.con.viewX, player.con.viewY);
|
||||||
|
|
||||||
//check for syncable groups
|
//check for syncable groups
|
||||||
for(EntityGroup<?> group : Entities.getAllGroups()){
|
for(EntityGroup<?> group : entities.all()){
|
||||||
if(group.isEmpty() || !(group.all().get(0) instanceof SyncTrait)) continue;
|
if(group.isEmpty() || !(group.all().get(0) instanceof SyncTrait)) continue;
|
||||||
|
|
||||||
//make sure mapping is enabled for this group
|
//make sure mapping is enabled for this group
|
||||||
@@ -482,7 +632,7 @@ public class NetServer implements ApplicationListener{
|
|||||||
if(syncStream.size() > maxSnapshotSize){
|
if(syncStream.size() > maxSnapshotSize){
|
||||||
dataStream.close();
|
dataStream.close();
|
||||||
byte[] syncBytes = syncStream.toByteArray();
|
byte[] syncBytes = syncStream.toByteArray();
|
||||||
Call.onEntitySnapshot(player.con.id, (byte)group.getID(), (short)sent, (short)syncBytes.length, Net.compressSnapshot(syncBytes));
|
Call.onEntitySnapshot(player.con, (byte)group.getID(), (short)sent, (short)syncBytes.length, net.compressSnapshot(syncBytes));
|
||||||
sent = 0;
|
sent = 0;
|
||||||
syncStream.reset();
|
syncStream.reset();
|
||||||
}
|
}
|
||||||
@@ -492,7 +642,7 @@ public class NetServer implements ApplicationListener{
|
|||||||
dataStream.close();
|
dataStream.close();
|
||||||
|
|
||||||
byte[] syncBytes = syncStream.toByteArray();
|
byte[] syncBytes = syncStream.toByteArray();
|
||||||
Call.onEntitySnapshot(player.con.id, (byte)group.getID(), (short)sent, (short)syncBytes.length, Net.compressSnapshot(syncBytes));
|
Call.onEntitySnapshot(player.con, (byte)group.getID(), (short)sent, (short)syncBytes.length, net.compressSnapshot(syncBytes));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -558,9 +708,9 @@ public class NetServer implements ApplicationListener{
|
|||||||
|
|
||||||
NetConnection connection = player.con;
|
NetConnection connection = player.con;
|
||||||
|
|
||||||
if(connection == null || !connection.isConnected() || !connections.containsKey(connection.id)){
|
if(connection == null || !connection.isConnected()){
|
||||||
//player disconnected, call d/c event
|
//player disconnected, call d/c event
|
||||||
onDisconnect(player);
|
onDisconnect(player, "disappeared");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -1,28 +1,51 @@
|
|||||||
package io.anuke.mindustry.core;
|
package io.anuke.mindustry.core;
|
||||||
|
|
||||||
import io.anuke.arc.Core;
|
import io.anuke.arc.*;
|
||||||
import io.anuke.arc.Input.TextInput;
|
import io.anuke.arc.Input.*;
|
||||||
import io.anuke.arc.files.FileHandle;
|
import io.anuke.arc.collection.*;
|
||||||
import io.anuke.arc.function.Consumer;
|
import io.anuke.arc.files.*;
|
||||||
import io.anuke.arc.function.Predicate;
|
import io.anuke.arc.function.*;
|
||||||
import io.anuke.arc.math.RandomXS128;
|
import io.anuke.arc.math.*;
|
||||||
import io.anuke.arc.scene.ui.TextField;
|
import io.anuke.arc.scene.ui.*;
|
||||||
import io.anuke.arc.util.serialization.Base64Coder;
|
import io.anuke.arc.util.serialization.*;
|
||||||
|
import io.anuke.mindustry.maps.*;
|
||||||
|
import io.anuke.mindustry.net.*;
|
||||||
|
import io.anuke.mindustry.net.Net.*;
|
||||||
|
import io.anuke.mindustry.ui.dialogs.*;
|
||||||
|
|
||||||
import static io.anuke.mindustry.Vars.mobile;
|
import static io.anuke.mindustry.Vars.mobile;
|
||||||
|
|
||||||
public abstract class Platform{
|
public interface Platform{
|
||||||
/** Each separate game platform should set this instance to their own implementation. */
|
|
||||||
public static Platform instance = new Platform(){
|
/** Steam: Update lobby visibility.*/
|
||||||
};
|
default void updateLobby(){}
|
||||||
|
|
||||||
|
/** Steam: Show multiplayer friend invite dialog.*/
|
||||||
|
default void inviteFriends(){}
|
||||||
|
|
||||||
|
/** Steam: Share a map on the workshop.*/
|
||||||
|
default void publishMap(Map map){}
|
||||||
|
|
||||||
|
/** Steam: Return external workshop maps to be loaded.*/
|
||||||
|
default Array<FileHandle> getExternalMaps(){
|
||||||
|
return Array.with();
|
||||||
|
}
|
||||||
|
|
||||||
|
/** Steam: Open workshop for maps.*/
|
||||||
|
default void openWorkshop(){}
|
||||||
|
|
||||||
|
/** Get the networking implementation.*/
|
||||||
|
default NetProvider getNet(){
|
||||||
|
return new ArcNetImpl();
|
||||||
|
}
|
||||||
|
|
||||||
/** Add a text input dialog that should show up after the field is tapped. */
|
/** Add a text input dialog that should show up after the field is tapped. */
|
||||||
public void addDialog(TextField field){
|
default void addDialog(TextField field){
|
||||||
addDialog(field, 16);
|
addDialog(field, 16);
|
||||||
}
|
}
|
||||||
|
|
||||||
/** See addDialog(). */
|
/** See addDialog(). */
|
||||||
public void addDialog(TextField field, int maxLength){
|
default void addDialog(TextField field, int maxLength){
|
||||||
if(!mobile) return; //this is mobile only, desktop doesn't need dialogs
|
if(!mobile) return; //this is mobile only, desktop doesn't need dialogs
|
||||||
|
|
||||||
field.tapped(() -> {
|
field.tapped(() -> {
|
||||||
@@ -39,22 +62,17 @@ public abstract class Platform{
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Request external read/write perms. Run callback when complete.*/
|
|
||||||
public void requestExternalPerms(Runnable callback){
|
|
||||||
callback.run();
|
|
||||||
}
|
|
||||||
|
|
||||||
/** Update discord RPC. */
|
/** Update discord RPC. */
|
||||||
public void updateRPC(){
|
default void updateRPC(){
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Whether donating is supported. */
|
/** Whether donating is supported. */
|
||||||
public boolean canDonate(){
|
default boolean canDonate(){
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Must be a base64 string 8 bytes in length. */
|
/** Must be a base64 string 8 bytes in length. */
|
||||||
public String getUUID(){
|
default String getUUID(){
|
||||||
String uuid = Core.settings.getString("uuid", "");
|
String uuid = Core.settings.getString("uuid", "");
|
||||||
if(uuid.isEmpty()){
|
if(uuid.isEmpty()){
|
||||||
byte[] result = new byte[8];
|
byte[] result = new byte[8];
|
||||||
@@ -68,29 +86,34 @@ public abstract class Platform{
|
|||||||
}
|
}
|
||||||
|
|
||||||
/** Only used for iOS or android: open the share menu for a map or save. */
|
/** Only used for iOS or android: open the share menu for a map or save. */
|
||||||
public void shareFile(FileHandle file){
|
default void shareFile(FileHandle file){
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Show a file chooser.
|
* Show a file chooser.
|
||||||
* @param text File chooser title text
|
|
||||||
* @param content Description of the type of files to be loaded
|
|
||||||
* @param cons Selection listener
|
* @param cons Selection listener
|
||||||
* @param open Whether to open or save files
|
* @param open Whether to open or save files
|
||||||
* @param filetype File extension to filter
|
* @param extension File extension to filter
|
||||||
*/
|
*/
|
||||||
public void showFileChooser(String text, String content, Consumer<FileHandle> cons, boolean open, Predicate<String> filetype){
|
default void showFileChooser(boolean open, String extension, Consumer<FileHandle> cons){
|
||||||
|
new FileChooser(open ? "$open" : "$save", file -> file.extension().toLowerCase().equals(extension), open, file -> {
|
||||||
|
if(!open){
|
||||||
|
cons.accept(file.parent().child(file.nameWithoutExtension() + "." + extension));
|
||||||
|
}else{
|
||||||
|
cons.accept(file);
|
||||||
|
}
|
||||||
|
}).show();
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Hide the app. Android only. */
|
/** Hide the app. Android only. */
|
||||||
public void hide(){
|
default void hide(){
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Forces the app into landscape mode. Currently Android only. */
|
/** Forces the app into landscape mode.*/
|
||||||
public void beginForceLandscape(){
|
default void beginForceLandscape(){
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Stops forcing the app into landscape orientation. Currently Android only. */
|
/** Stops forcing the app into landscape orientation.*/
|
||||||
public void endForceLandscape(){
|
default void endForceLandscape(){
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -16,12 +16,13 @@ import io.anuke.mindustry.core.GameState.*;
|
|||||||
import io.anuke.mindustry.entities.*;
|
import io.anuke.mindustry.entities.*;
|
||||||
import io.anuke.mindustry.entities.effect.*;
|
import io.anuke.mindustry.entities.effect.*;
|
||||||
import io.anuke.mindustry.entities.effect.GroundEffectEntity.*;
|
import io.anuke.mindustry.entities.effect.GroundEffectEntity.*;
|
||||||
import io.anuke.mindustry.entities.impl.*;
|
|
||||||
import io.anuke.mindustry.entities.traits.*;
|
import io.anuke.mindustry.entities.traits.*;
|
||||||
import io.anuke.mindustry.entities.type.*;
|
import io.anuke.mindustry.entities.type.*;
|
||||||
|
import io.anuke.mindustry.entities.type.EffectEntity;
|
||||||
import io.anuke.mindustry.game.EventType.*;
|
import io.anuke.mindustry.game.EventType.*;
|
||||||
import io.anuke.mindustry.game.*;
|
import io.anuke.mindustry.game.*;
|
||||||
import io.anuke.mindustry.graphics.*;
|
import io.anuke.mindustry.graphics.*;
|
||||||
|
import io.anuke.mindustry.world.*;
|
||||||
import io.anuke.mindustry.world.blocks.defense.ForceProjector.*;
|
import io.anuke.mindustry.world.blocks.defense.ForceProjector.*;
|
||||||
|
|
||||||
import static io.anuke.arc.Core.*;
|
import static io.anuke.arc.Core.*;
|
||||||
@@ -36,16 +37,15 @@ public class Renderer implements ApplicationListener{
|
|||||||
public FrameBuffer shieldBuffer = new FrameBuffer(2, 2);
|
public FrameBuffer shieldBuffer = new FrameBuffer(2, 2);
|
||||||
private Bloom bloom;
|
private Bloom bloom;
|
||||||
private Color clearColor;
|
private Color clearColor;
|
||||||
private float targetscale = UnitScl.dp.scl(4);
|
private float targetscale = Scl.scl(4);
|
||||||
private float camerascale = targetscale;
|
private float camerascale = targetscale;
|
||||||
|
private float landscale = 0f, landTime;
|
||||||
|
private float minZoomScl = Scl.scl(0.01f);
|
||||||
private Rectangle rect = new Rectangle(), rect2 = new Rectangle();
|
private Rectangle rect = new Rectangle(), rect2 = new Rectangle();
|
||||||
private float shakeIntensity, shaketime;
|
private float shakeIntensity, shaketime;
|
||||||
|
|
||||||
public Renderer(){
|
public Renderer(){
|
||||||
camera = new Camera();
|
camera = new Camera();
|
||||||
if(settings.getBool("bloom")){
|
|
||||||
setupBloom();
|
|
||||||
}
|
|
||||||
Shaders.init();
|
Shaders.init();
|
||||||
|
|
||||||
Effects.setScreenShakeProvider((intensity, duration) -> {
|
Effects.setScreenShakeProvider((intensity, duration) -> {
|
||||||
@@ -93,17 +93,31 @@ public class Renderer implements ApplicationListener{
|
|||||||
clearColor = new Color(0f, 0f, 0f, 1f);
|
clearColor = new Color(0f, 0f, 0f, 1f);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void init(){
|
||||||
|
if(settings.getBool("bloom")){
|
||||||
|
setupBloom();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void update(){
|
public void update(){
|
||||||
//TODO hack, find source of this bug
|
Color.white.set(1f, 1f, 1f, 1f);
|
||||||
Color.WHITE.set(1f, 1f, 1f, 1f);
|
|
||||||
|
|
||||||
camerascale = Mathf.lerpDelta(camerascale, targetscale, 0.1f);
|
camerascale = Mathf.lerpDelta(camerascale, targetscale, 0.1f);
|
||||||
|
|
||||||
|
if(landTime > 0){
|
||||||
|
landTime -= Time.delta();
|
||||||
|
landscale = Interpolation.pow5In.apply(minZoomScl, Scl.scl(4f), 1f - landTime / Fx.coreLand.lifetime);
|
||||||
|
camerascale = landscale;
|
||||||
|
}
|
||||||
|
|
||||||
camera.width = graphics.getWidth() / camerascale;
|
camera.width = graphics.getWidth() / camerascale;
|
||||||
camera.height = graphics.getHeight() / camerascale;
|
camera.height = graphics.getHeight() / camerascale;
|
||||||
|
|
||||||
if(state.is(State.menu)){
|
if(state.is(State.menu)){
|
||||||
graphics.clear(Color.BLACK);
|
landTime = 0f;
|
||||||
|
graphics.clear(Color.black);
|
||||||
}else{
|
}else{
|
||||||
Vector2 position = Tmp.v3.set(player);
|
Vector2 position = Tmp.v3.set(player);
|
||||||
|
|
||||||
@@ -127,6 +141,10 @@ public class Renderer implements ApplicationListener{
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public float landScale(){
|
||||||
|
return landTime > 0 ? landscale : 1f;
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void dispose(){
|
public void dispose(){
|
||||||
minimap.dispose();
|
minimap.dispose();
|
||||||
@@ -158,7 +176,7 @@ public class Renderer implements ApplicationListener{
|
|||||||
e.printStackTrace();
|
e.printStackTrace();
|
||||||
settings.put("bloom", false);
|
settings.put("bloom", false);
|
||||||
settings.save();
|
settings.save();
|
||||||
ui.showError("$error.bloom");
|
ui.showErrorMessage("$error.bloom");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -205,9 +223,9 @@ public class Renderer implements ApplicationListener{
|
|||||||
|
|
||||||
blocks.floor.drawFloor();
|
blocks.floor.drawFloor();
|
||||||
|
|
||||||
draw(groundEffectGroup, e -> e instanceof BelowLiquidTrait);
|
groundEffectGroup.draw(e -> e instanceof BelowLiquidTrait);
|
||||||
draw(puddleGroup);
|
puddleGroup.draw();
|
||||||
draw(groundEffectGroup, e -> !(e instanceof BelowLiquidTrait));
|
groundEffectGroup.draw(e -> !(e instanceof BelowLiquidTrait));
|
||||||
|
|
||||||
blocks.processBlocks();
|
blocks.processBlocks();
|
||||||
|
|
||||||
@@ -244,8 +262,8 @@ public class Renderer implements ApplicationListener{
|
|||||||
bloom.capture();
|
bloom.capture();
|
||||||
}
|
}
|
||||||
|
|
||||||
draw(bulletGroup);
|
bulletGroup.draw();
|
||||||
draw(effectGroup);
|
effectGroup.draw();
|
||||||
|
|
||||||
Draw.flush();
|
Draw.flush();
|
||||||
if(bloom != null && !pixelator.enabled()){
|
if(bloom != null && !pixelator.enabled()){
|
||||||
@@ -253,15 +271,15 @@ public class Renderer implements ApplicationListener{
|
|||||||
}
|
}
|
||||||
|
|
||||||
overlays.drawBottom();
|
overlays.drawBottom();
|
||||||
draw(playerGroup, p -> true, Player::drawBuildRequests);
|
playerGroup.draw(p -> p.isLocal, Player::drawBuildRequests);
|
||||||
|
|
||||||
if(Entities.countInBounds(shieldGroup) > 0){
|
if(shieldGroup.countInBounds() > 0){
|
||||||
if(settings.getBool("animatedshields") && Shaders.shield != null){
|
if(settings.getBool("animatedshields") && Shaders.shield != null){
|
||||||
Draw.flush();
|
Draw.flush();
|
||||||
shieldBuffer.begin();
|
shieldBuffer.begin();
|
||||||
graphics.clear(Color.CLEAR);
|
graphics.clear(Color.clear);
|
||||||
Entities.draw(shieldGroup);
|
shieldGroup.draw();
|
||||||
Entities.draw(shieldGroup, shield -> true, shield -> ((ShieldEntity)shield).drawOver());
|
shieldGroup.draw(shield -> true, ShieldEntity::drawOver);
|
||||||
Draw.flush();
|
Draw.flush();
|
||||||
shieldBuffer.end();
|
shieldBuffer.end();
|
||||||
Draw.shader(Shaders.shield);
|
Draw.shader(Shaders.shield);
|
||||||
@@ -270,18 +288,45 @@ public class Renderer implements ApplicationListener{
|
|||||||
Draw.color();
|
Draw.color();
|
||||||
Draw.shader();
|
Draw.shader();
|
||||||
}else{
|
}else{
|
||||||
Entities.draw(shieldGroup, shield -> true, shield -> ((ShieldEntity)shield).drawSimple());
|
shieldGroup.draw(shield -> true, ShieldEntity::drawSimple);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
overlays.drawTop();
|
overlays.drawTop();
|
||||||
|
|
||||||
draw(playerGroup, p -> !p.isDead() && !p.isLocal, Player::drawName);
|
playerGroup.draw(p -> !p.isDead() && !p.isLocal, Player::drawName);
|
||||||
|
|
||||||
|
drawLanding();
|
||||||
|
|
||||||
Draw.color();
|
Draw.color();
|
||||||
Draw.flush();
|
Draw.flush();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void drawLanding(){
|
||||||
|
if(landTime > 0 && player.getClosestCore() != null){
|
||||||
|
float fract = landTime / Fx.coreLand.lifetime;
|
||||||
|
TileEntity entity = player.getClosestCore();
|
||||||
|
|
||||||
|
TextureRegion reg = entity.block.icon(Block.Icon.full);
|
||||||
|
float scl = Scl.scl(4f) / camerascale;
|
||||||
|
float s = reg.getWidth() * Draw.scl * scl * 4f * fract;
|
||||||
|
|
||||||
|
Draw.color(Pal.lightTrail);
|
||||||
|
Draw.rect("circle-shadow", entity.x, entity.y, s, s);
|
||||||
|
|
||||||
|
Angles.randLenVectors(1, (1f- fract), 100, 1000f * scl * (1f-fract), (x, y, fin, fout) -> {
|
||||||
|
Lines.stroke(scl * fin);
|
||||||
|
Lines.lineAngle(entity.x + x, entity.y + y, Mathf.angle(x, y), (fin * 20 + 1f) * scl);
|
||||||
|
});
|
||||||
|
|
||||||
|
Draw.color();
|
||||||
|
Draw.mixcol(Color.white, fract);
|
||||||
|
Draw.rect(reg, entity.x, entity.y, reg.getWidth() * Draw.scl * scl, reg.getHeight() * Draw.scl * scl, fract * 135f);
|
||||||
|
|
||||||
|
Draw.reset();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
private void drawGroundShadows(){
|
private void drawGroundShadows(){
|
||||||
Draw.color(0, 0, 0, 0.4f);
|
Draw.color(0, 0, 0, 0.4f);
|
||||||
float rad = 1.6f;
|
float rad = 1.6f;
|
||||||
@@ -293,12 +338,12 @@ public class Renderer implements ApplicationListener{
|
|||||||
|
|
||||||
for(EntityGroup<? extends BaseUnit> group : unitGroups){
|
for(EntityGroup<? extends BaseUnit> group : unitGroups){
|
||||||
if(!group.isEmpty()){
|
if(!group.isEmpty()){
|
||||||
draw(group, unit -> !unit.isDead(), draw::accept);
|
group.draw(unit -> !unit.isDead(), draw::accept);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if(!playerGroup.isEmpty()){
|
if(!playerGroup.isEmpty()){
|
||||||
draw(playerGroup, unit -> !unit.isDead(), draw::accept);
|
playerGroup.draw(unit -> !unit.isDead(), draw::accept);
|
||||||
}
|
}
|
||||||
|
|
||||||
Draw.color();
|
Draw.color();
|
||||||
@@ -310,12 +355,12 @@ public class Renderer implements ApplicationListener{
|
|||||||
|
|
||||||
for(EntityGroup<? extends BaseUnit> group : unitGroups){
|
for(EntityGroup<? extends BaseUnit> group : unitGroups){
|
||||||
if(!group.isEmpty()){
|
if(!group.isEmpty()){
|
||||||
draw(group, unit -> unit.isFlying() && !unit.isDead(), baseUnit -> baseUnit.drawShadow(trnsX, trnsY));
|
group.draw(unit -> unit.isFlying() && !unit.isDead(), baseUnit -> baseUnit.drawShadow(trnsX, trnsY));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if(!playerGroup.isEmpty()){
|
if(!playerGroup.isEmpty()){
|
||||||
draw(playerGroup, unit -> unit.isFlying() && !unit.isDead(), player -> player.drawShadow(trnsX, trnsY));
|
playerGroup.draw(unit -> unit.isFlying() && !unit.isDead(), player -> player.drawShadow(trnsX, trnsY));
|
||||||
}
|
}
|
||||||
|
|
||||||
Draw.color();
|
Draw.color();
|
||||||
@@ -327,36 +372,24 @@ public class Renderer implements ApplicationListener{
|
|||||||
|
|
||||||
if(group.count(p -> p.isFlying() == flying) + playerGroup.count(p -> p.isFlying() == flying && p.getTeam() == team) == 0 && flying) continue;
|
if(group.count(p -> p.isFlying() == flying) + playerGroup.count(p -> p.isFlying() == flying && p.getTeam() == team) == 0 && flying) continue;
|
||||||
|
|
||||||
draw(unitGroups[team.ordinal()], u -> u.isFlying() == flying && !u.isDead(), Unit::drawUnder);
|
unitGroups[team.ordinal()].draw(u -> u.isFlying() == flying && !u.isDead(), Unit::drawUnder);
|
||||||
draw(playerGroup, p -> p.isFlying() == flying && p.getTeam() == team && !p.isDead(), Unit::drawUnder);
|
playerGroup.draw(p -> p.isFlying() == flying && p.getTeam() == team && !p.isDead(), Unit::drawUnder);
|
||||||
|
|
||||||
draw(unitGroups[team.ordinal()], u -> u.isFlying() == flying && !u.isDead(), Unit::drawAll);
|
unitGroups[team.ordinal()].draw(u -> u.isFlying() == flying && !u.isDead(), Unit::drawAll);
|
||||||
draw(playerGroup, p -> p.isFlying() == flying && p.getTeam() == team, Unit::drawAll);
|
playerGroup.draw(p -> p.isFlying() == flying && p.getTeam() == team, Unit::drawAll);
|
||||||
|
|
||||||
draw(unitGroups[team.ordinal()], u -> u.isFlying() == flying && !u.isDead(), Unit::drawOver);
|
unitGroups[team.ordinal()].draw(u -> u.isFlying() == flying && !u.isDead(), Unit::drawOver);
|
||||||
draw(playerGroup, p -> p.isFlying() == flying && p.getTeam() == team, Unit::drawOver);
|
playerGroup.draw(p -> p.isFlying() == flying && p.getTeam() == team, Unit::drawOver);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public <T extends DrawTrait> void draw(EntityGroup<T> group){
|
|
||||||
draw(group, t -> true, DrawTrait::draw);
|
|
||||||
}
|
|
||||||
|
|
||||||
public <T extends DrawTrait> void draw(EntityGroup<T> group, Predicate<T> toDraw){
|
|
||||||
draw(group, toDraw, DrawTrait::draw);
|
|
||||||
}
|
|
||||||
|
|
||||||
public <T extends DrawTrait> void draw(EntityGroup<T> group, Predicate<T> toDraw, Consumer<T> drawer){
|
|
||||||
Entities.draw(group, toDraw, drawer);
|
|
||||||
}
|
|
||||||
|
|
||||||
public void scaleCamera(float amount){
|
public void scaleCamera(float amount){
|
||||||
targetscale += amount;
|
targetscale += amount;
|
||||||
clampScale();
|
clampScale();
|
||||||
}
|
}
|
||||||
|
|
||||||
public void clampScale(){
|
public void clampScale(){
|
||||||
float s = UnitScl.dp.scl(1f);
|
float s = Scl.scl(1f);
|
||||||
targetscale = Mathf.clamp(targetscale, s * 1.5f, Math.round(s * 6));
|
targetscale = Mathf.clamp(targetscale, s * 1.5f, Math.round(s * 6));
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -369,6 +402,11 @@ public class Renderer implements ApplicationListener{
|
|||||||
clampScale();
|
clampScale();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void zoomIn(float duration){
|
||||||
|
landscale = minZoomScl;
|
||||||
|
landTime = duration;
|
||||||
|
}
|
||||||
|
|
||||||
public void takeMapScreenshot(){
|
public void takeMapScreenshot(){
|
||||||
drawGroundShadows();
|
drawGroundShadows();
|
||||||
|
|
||||||
|
|||||||
@@ -3,18 +3,24 @@ package io.anuke.mindustry.core;
|
|||||||
import io.anuke.arc.*;
|
import io.anuke.arc.*;
|
||||||
import io.anuke.arc.Graphics.*;
|
import io.anuke.arc.Graphics.*;
|
||||||
import io.anuke.arc.Graphics.Cursor.*;
|
import io.anuke.arc.Graphics.Cursor.*;
|
||||||
|
import io.anuke.arc.Input.*;
|
||||||
|
import io.anuke.arc.assets.*;
|
||||||
|
import io.anuke.arc.assets.loaders.*;
|
||||||
|
import io.anuke.arc.assets.loaders.resolvers.*;
|
||||||
|
import io.anuke.arc.collection.*;
|
||||||
|
import io.anuke.arc.files.*;
|
||||||
import io.anuke.arc.freetype.*;
|
import io.anuke.arc.freetype.*;
|
||||||
import io.anuke.arc.freetype.FreeTypeFontGenerator.*;
|
import io.anuke.arc.freetype.FreeTypeFontGenerator.*;
|
||||||
|
import io.anuke.arc.freetype.FreetypeFontLoader.*;
|
||||||
import io.anuke.arc.function.*;
|
import io.anuke.arc.function.*;
|
||||||
import io.anuke.arc.graphics.*;
|
import io.anuke.arc.graphics.*;
|
||||||
|
import io.anuke.arc.graphics.Texture.*;
|
||||||
import io.anuke.arc.graphics.g2d.*;
|
import io.anuke.arc.graphics.g2d.*;
|
||||||
import io.anuke.arc.graphics.g2d.TextureAtlas.*;
|
|
||||||
import io.anuke.arc.input.*;
|
import io.anuke.arc.input.*;
|
||||||
import io.anuke.arc.math.*;
|
import io.anuke.arc.math.*;
|
||||||
import io.anuke.arc.scene.*;
|
import io.anuke.arc.scene.*;
|
||||||
import io.anuke.arc.scene.actions.*;
|
import io.anuke.arc.scene.actions.*;
|
||||||
import io.anuke.arc.scene.event.*;
|
import io.anuke.arc.scene.event.*;
|
||||||
import io.anuke.arc.scene.style.*;
|
|
||||||
import io.anuke.arc.scene.ui.*;
|
import io.anuke.arc.scene.ui.*;
|
||||||
import io.anuke.arc.scene.ui.TextField.*;
|
import io.anuke.arc.scene.ui.TextField.*;
|
||||||
import io.anuke.arc.scene.ui.Tooltip.*;
|
import io.anuke.arc.scene.ui.Tooltip.*;
|
||||||
@@ -25,15 +31,14 @@ import io.anuke.mindustry.editor.*;
|
|||||||
import io.anuke.mindustry.game.EventType.*;
|
import io.anuke.mindustry.game.EventType.*;
|
||||||
import io.anuke.mindustry.gen.*;
|
import io.anuke.mindustry.gen.*;
|
||||||
import io.anuke.mindustry.graphics.*;
|
import io.anuke.mindustry.graphics.*;
|
||||||
|
import io.anuke.mindustry.ui.*;
|
||||||
import io.anuke.mindustry.ui.dialogs.*;
|
import io.anuke.mindustry.ui.dialogs.*;
|
||||||
import io.anuke.mindustry.ui.fragments.*;
|
import io.anuke.mindustry.ui.fragments.*;
|
||||||
|
|
||||||
import static io.anuke.arc.scene.actions.Actions.*;
|
import static io.anuke.arc.scene.actions.Actions.*;
|
||||||
import static io.anuke.mindustry.Vars.*;
|
import static io.anuke.mindustry.Vars.*;
|
||||||
|
|
||||||
public class UI implements ApplicationListener{
|
public class UI implements ApplicationListener, Loadable{
|
||||||
private FreeTypeFontGenerator generator;
|
|
||||||
|
|
||||||
public MenuFragment menufrag;
|
public MenuFragment menufrag;
|
||||||
public HudFragment hudfrag;
|
public HudFragment hudfrag;
|
||||||
public ChatFragment chatfrag;
|
public ChatFragment chatfrag;
|
||||||
@@ -67,18 +72,29 @@ public class UI implements ApplicationListener{
|
|||||||
public Cursor drillCursor, unloadCursor;
|
public Cursor drillCursor, unloadCursor;
|
||||||
|
|
||||||
public UI(){
|
public UI(){
|
||||||
Skin skin = new Skin(Core.atlas);
|
setupFonts();
|
||||||
generateFonts(skin);
|
|
||||||
loadExtraStyle(skin);
|
|
||||||
skin.load(Core.files.internal("sprites/uiskin.json"));
|
|
||||||
|
|
||||||
for(BitmapFont font : skin.getAll(BitmapFont.class).values()){
|
|
||||||
font.setUseIntegerPositions(true);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
Core.scene = new Scene(skin);
|
@Override
|
||||||
|
public void loadAsync(){
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void loadSync(){
|
||||||
|
Fonts.outline.getData().markupEnabled = true;
|
||||||
|
Fonts.def.getData().markupEnabled = true;
|
||||||
|
Fonts.def.setOwnsTexture(false);
|
||||||
|
|
||||||
|
Core.assets.getAll(BitmapFont.class, new Array<>()).each(font -> font.setUseIntegerPositions(true));
|
||||||
|
Core.scene = new Scene();
|
||||||
Core.input.addProcessor(Core.scene);
|
Core.input.addProcessor(Core.scene);
|
||||||
|
|
||||||
|
Tex.load();
|
||||||
|
Icon.load();
|
||||||
|
Styles.load();
|
||||||
|
Tex.loadStyles();
|
||||||
|
|
||||||
Dialog.setShowAction(() -> sequence(alpha(0f), fadeIn(0.1f)));
|
Dialog.setShowAction(() -> sequence(alpha(0f), fadeIn(0.1f)));
|
||||||
Dialog.setHideAction(() -> sequence(fadeOut(0.1f)));
|
Dialog.setHideAction(() -> sequence(fadeOut(0.1f)));
|
||||||
|
|
||||||
@@ -86,17 +102,22 @@ public class UI implements ApplicationListener{
|
|||||||
|
|
||||||
Core.settings.setErrorHandler(e -> {
|
Core.settings.setErrorHandler(e -> {
|
||||||
e.printStackTrace();
|
e.printStackTrace();
|
||||||
Core.app.post(() -> showError("Failed to access local storage.\nSettings will not be saved."));
|
Core.app.post(() -> showErrorMessage("Failed to access local storage.\nSettings will not be saved."));
|
||||||
});
|
});
|
||||||
|
|
||||||
ClickListener.clicked = () -> Sounds.press.play();
|
ClickListener.clicked = () -> Sounds.press.play();
|
||||||
|
|
||||||
Colors.put("accent", Pal.accent);
|
Colors.put("accent", Pal.accent);
|
||||||
Colors.put("highlight", Pal.accent.cpy().lerp(Color.WHITE, 0.3f));
|
Colors.put("highlight", Pal.accent.cpy().lerp(Color.white, 0.3f));
|
||||||
Colors.put("stat", Pal.stat);
|
Colors.put("stat", Pal.stat);
|
||||||
loadExtraCursors();
|
loadExtraCursors();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Array<AssetDescriptor> getDependencies(){
|
||||||
|
return Array.with(new AssetDescriptor<>(Control.class), new AssetDescriptor<>("outline", BitmapFont.class), new AssetDescriptor<>("default", BitmapFont.class), new AssetDescriptor<>("chat", BitmapFont.class));
|
||||||
|
}
|
||||||
|
|
||||||
/** Called from a static context to make the cursor appear immediately upon startup.*/
|
/** Called from a static context to make the cursor appear immediately upon startup.*/
|
||||||
public static void loadSystemCursors(){
|
public static void loadSystemCursors(){
|
||||||
SystemCursor.arrow.set(Core.graphics.newCursor("cursor"));
|
SystemCursor.arrow.set(Core.graphics.newCursor("cursor"));
|
||||||
@@ -106,23 +127,30 @@ public class UI implements ApplicationListener{
|
|||||||
Core.graphics.restoreCursor();
|
Core.graphics.restoreCursor();
|
||||||
}
|
}
|
||||||
|
|
||||||
void loadExtraStyle(Skin skin){
|
/** Called from a static context for use in the loading screen.*/
|
||||||
AtlasRegion region = Core.atlas.find("flat-down-base");
|
public static void loadDefaultFont(){
|
||||||
int[] splits = region.splits;
|
FileHandleResolver resolver = new InternalFileHandleResolver();
|
||||||
|
Core.assets.setLoader(FreeTypeFontGenerator.class, new FreeTypeFontGeneratorLoader(resolver));
|
||||||
|
Core.assets.setLoader(BitmapFont.class, null, new FreetypeFontLoader(resolver){
|
||||||
|
@Override
|
||||||
|
public BitmapFont loadSync(AssetManager manager, String fileName, FileHandle file, FreeTypeFontLoaderParameter parameter){
|
||||||
|
if(fileName.equals("outline")){
|
||||||
|
parameter.fontParameters.borderWidth = Scl.scl(2f);
|
||||||
|
parameter.fontParameters.spaceX -= parameter.fontParameters.borderWidth;
|
||||||
|
}
|
||||||
|
parameter.fontParameters.magFilter = TextureFilter.Linear;
|
||||||
|
parameter.fontParameters.minFilter = TextureFilter.Linear;
|
||||||
|
parameter.fontParameters.size = fontParameter().size;
|
||||||
|
return super.loadSync(manager, fileName, file, parameter);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
ScaledNinePatchDrawable copy = new ScaledNinePatchDrawable(new NinePatch(region, splits[0], splits[1], splits[2], splits[3])){
|
FreeTypeFontParameter param = new FreeTypeFontParameter(){{
|
||||||
public float getLeftWidth(){ return 0; }
|
borderColor = Color.darkGray;
|
||||||
public float getRightWidth(){ return 0; }
|
incremental = true;
|
||||||
public float getTopHeight(){ return 0; }
|
}};
|
||||||
public float getBottomHeight(){ return 0; }
|
|
||||||
};
|
Core.assets.load("outline", BitmapFont.class, new FreeTypeFontLoaderParameter("fonts/font.ttf", param)).loaded = t -> Fonts.outline = (BitmapFont)t;
|
||||||
copy.setMinWidth(0);
|
|
||||||
copy.setMinHeight(0);
|
|
||||||
copy.setTopHeight(0);
|
|
||||||
copy.setRightWidth(0);
|
|
||||||
copy.setBottomHeight(0);
|
|
||||||
copy.setLeftWidth(0);
|
|
||||||
skin.add("flat-down", copy, Drawable.class);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void loadExtraCursors(){
|
void loadExtraCursors(){
|
||||||
@@ -130,29 +158,22 @@ public class UI implements ApplicationListener{
|
|||||||
unloadCursor = Core.graphics.newCursor("unload");
|
unloadCursor = Core.graphics.newCursor("unload");
|
||||||
}
|
}
|
||||||
|
|
||||||
void generateFonts(Skin skin){
|
public void setupFonts(){
|
||||||
generator = new FreeTypeFontGenerator(Core.files.internal("fonts/font.ttf"));
|
String fontName = "fonts/font.ttf";
|
||||||
|
|
||||||
FreeTypeFontParameter param = new FreeTypeFontParameter(){{
|
FreeTypeFontParameter param = fontParameter();
|
||||||
size = (int)(UnitScl.dp.scl(18f));
|
|
||||||
shadowColor = Color.DARK_GRAY;
|
Core.assets.load("default", BitmapFont.class, new FreeTypeFontLoaderParameter(fontName, param)).loaded = f -> Fonts.def = (BitmapFont)f;
|
||||||
|
Core.assets.load("chat", BitmapFont.class, new FreeTypeFontLoaderParameter(fontName, param)).loaded = f -> Fonts.chat = (BitmapFont)f;
|
||||||
|
}
|
||||||
|
|
||||||
|
static FreeTypeFontParameter fontParameter(){
|
||||||
|
return new FreeTypeFontParameter(){{
|
||||||
|
size = (int)(Scl.scl(18f));
|
||||||
|
shadowColor = Color.darkGray;
|
||||||
shadowOffsetY = 2;
|
shadowOffsetY = 2;
|
||||||
incremental = true;
|
incremental = true;
|
||||||
}};
|
}};
|
||||||
|
|
||||||
FreeTypeFontParameter outlined = new FreeTypeFontParameter(){{
|
|
||||||
size = param.size;
|
|
||||||
borderColor = Color.DARK_GRAY;
|
|
||||||
borderWidth = UnitScl.dp.scl(2f);
|
|
||||||
spaceX -= borderWidth;
|
|
||||||
incremental = true;
|
|
||||||
}};
|
|
||||||
|
|
||||||
skin.add("outline", generator.generateFont(outlined));
|
|
||||||
skin.add("default", generator.generateFont(param));
|
|
||||||
skin.add("chat", generator.generateFont(param));
|
|
||||||
skin.getFont("default").getData().markupEnabled = true;
|
|
||||||
skin.getFont("default").setOwnsTexture(false);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -232,7 +253,7 @@ public class UI implements ApplicationListener{
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void dispose(){
|
public void dispose(){
|
||||||
generator.dispose();
|
//generator.dispose();
|
||||||
}
|
}
|
||||||
|
|
||||||
public void loadAnd(Runnable call){
|
public void loadAnd(Runnable call){
|
||||||
@@ -247,13 +268,21 @@ public class UI implements ApplicationListener{
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
public void showTextInput(String titleText, String text, int textLength, String def, TextFieldFilter filter, Consumer<String> confirmed){
|
public void showTextInput(String titleText, String dtext, int textLength, String def, boolean inumeric, Consumer<String> confirmed){
|
||||||
new Dialog(titleText, "dialog"){{
|
if(mobile){
|
||||||
cont.margin(30).add(text).padRight(6f);
|
Core.input.getTextInput(new TextInput(){{
|
||||||
TextField field = cont.addField(def, t -> {
|
this.title = (titleText.startsWith("$") ? Core.bundle.get(titleText.substring(1)) : titleText);
|
||||||
}).size(170f, 50f).get();
|
this.text = def;
|
||||||
|
this.numeric = inumeric;
|
||||||
|
this.maxLength = textLength;
|
||||||
|
this.accepted = confirmed;
|
||||||
|
}});
|
||||||
|
}else{
|
||||||
|
new Dialog(titleText){{
|
||||||
|
cont.margin(30).add(dtext).padRight(6f);
|
||||||
|
TextFieldFilter filter = inumeric ? TextFieldFilter.digitsOnly : (f, c) -> true;
|
||||||
|
TextField field = cont.addField(def, t -> {}).size(170f, 50f).get();
|
||||||
field.setFilter((f, c) -> field.getText().length() < textLength && filter.acceptChar(f, c));
|
field.setFilter((f, c) -> field.getText().length() < textLength && filter.acceptChar(f, c));
|
||||||
Platform.instance.addDialog(field);
|
|
||||||
buttons.defaults().size(120, 54).pad(4);
|
buttons.defaults().size(120, 54).pad(4);
|
||||||
buttons.addButton("$ok", () -> {
|
buttons.addButton("$ok", () -> {
|
||||||
confirmed.accept(field.getText());
|
confirmed.accept(field.getText());
|
||||||
@@ -262,13 +291,14 @@ public class UI implements ApplicationListener{
|
|||||||
buttons.addButton("$cancel", this::hide);
|
buttons.addButton("$cancel", this::hide);
|
||||||
}}.show();
|
}}.show();
|
||||||
}
|
}
|
||||||
|
|
||||||
public void showTextInput(String title, String text, String def, Consumer<String> confirmed){
|
|
||||||
showTextInput(title, text, 12, def, (field, c) -> true, confirmed);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public void showTextInput(String title, String text, int textLength, String def, Consumer<String> confirmed){
|
public void showTextInput(String title, String text, String def, Consumer<String> confirmed){
|
||||||
showTextInput(title, text, textLength < 0 ? 12 : textLength, def, (field, c) -> true, confirmed);
|
showTextInput(title, text, 24, def, confirmed);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void showTextInput(String titleText, String text, int textLength, String def, Consumer<String> confirmed){
|
||||||
|
showTextInput(titleText, text, textLength, def, false, confirmed);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void showInfoFade(String info){
|
public void showInfoFade(String info){
|
||||||
@@ -280,43 +310,76 @@ public class UI implements ApplicationListener{
|
|||||||
}
|
}
|
||||||
|
|
||||||
public void showInfo(String info){
|
public void showInfo(String info){
|
||||||
new Dialog("", "dialog"){{
|
new Dialog(""){{
|
||||||
getCell(cont).growX();
|
getCell(cont).growX();
|
||||||
cont.margin(15).add(info).width(400f).wrap().get().setAlignment(Align.center, Align.center);
|
cont.margin(15).add(info).width(400f).wrap().get().setAlignment(Align.center, Align.center);
|
||||||
buttons.addButton("$ok", this::hide).size(90, 50).pad(4);
|
buttons.addButton("$ok", this::hide).size(90, 50).pad(4);
|
||||||
}}.show();
|
}}.show();
|
||||||
}
|
}
|
||||||
|
|
||||||
public void showError(String text){
|
public void showErrorMessage(String text){
|
||||||
new Dialog("", "dialog"){{
|
new Dialog(""){{
|
||||||
setFillParent(true);
|
setFillParent(true);
|
||||||
|
cont.margin(15f);
|
||||||
cont.add("$error.title");
|
cont.add("$error.title");
|
||||||
cont.row();
|
cont.row();
|
||||||
cont.margin(15).pane(t -> {
|
cont.addImage().width(300f).pad(2).height(4f).color(Color.scarlet);
|
||||||
Label l = t.add(text).pad(14f).get();
|
cont.row();
|
||||||
l.setAlignment(Align.center, Align.left);
|
cont.add(text).pad(2f).growX().wrap().get().setAlignment(Align.center);
|
||||||
if(mobile){
|
cont.row();
|
||||||
t.getCell(l).wrap().width(400f);
|
cont.addButton("$ok", this::hide).size(120, 50).pad(4);
|
||||||
|
}}.show();
|
||||||
}
|
}
|
||||||
});
|
|
||||||
buttons.addButton("$ok", this::hide).size(90, 50).pad(4);
|
public void showException(Throwable t){
|
||||||
|
showException("", t);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void showException(String text, Throwable exc){
|
||||||
|
new Dialog(""){{
|
||||||
|
String message = Strings.getFinalMesage(exc);
|
||||||
|
|
||||||
|
setFillParent(true);
|
||||||
|
cont.margin(15);
|
||||||
|
cont.add("$error.title").colspan(2);
|
||||||
|
cont.row();
|
||||||
|
cont.addImage().width(300f).pad(2).colspan(2).height(4f).color(Color.scarlet);
|
||||||
|
cont.row();
|
||||||
|
cont.add((text.startsWith("$") ? Core.bundle.get(text.substring(1)) : text) + (message == null ? "" : "\n[lightgray](" + message + ")")).colspan(2).wrap().growX().center().get().setAlignment(Align.center);
|
||||||
|
cont.row();
|
||||||
|
|
||||||
|
Collapser col = new Collapser(base -> base.pane(t -> t.margin(14f).add(Strings.parseException(exc, true)).color(Color.lightGray).left()), true);
|
||||||
|
|
||||||
|
cont.addButton("$details", Styles.togglet, col::toggle).size(180f, 50f).checked(b -> !col.isCollapsed()).fillX().right();
|
||||||
|
cont.addButton("$ok", this::hide).size(100, 50).fillX().left();
|
||||||
|
cont.row();
|
||||||
|
cont.add(col).colspan(2).pad(2);
|
||||||
}}.show();
|
}}.show();
|
||||||
}
|
}
|
||||||
|
|
||||||
public void showText(String titleText, String text){
|
public void showText(String titleText, String text){
|
||||||
new Dialog(titleText, "dialog"){{
|
new Dialog(titleText){{
|
||||||
cont.margin(15).add(text).width(400f).wrap().get().setAlignment(Align.center, Align.center);
|
cont.margin(15).add(text).width(400f).wrap().get().setAlignment(Align.center, Align.center);
|
||||||
buttons.addButton("$ok", this::hide).size(90, 50).pad(4);
|
buttons.addButton("$ok", this::hide).size(90, 50).pad(4);
|
||||||
}}.show();
|
}}.show();
|
||||||
}
|
}
|
||||||
|
|
||||||
public void showInfoText(String titleText, String text){
|
public void showInfoText(String titleText, String text){
|
||||||
new Dialog(titleText, "dialog"){{
|
new Dialog(titleText){{
|
||||||
cont.margin(15).add(text).width(400f).wrap().left().get().setAlignment(Align.left, Align.left);
|
cont.margin(15).add(text).width(400f).wrap().left().get().setAlignment(Align.left, Align.left);
|
||||||
buttons.addButton("$ok", this::hide).size(90, 50).pad(4);
|
buttons.addButton("$ok", this::hide).size(90, 50).pad(4);
|
||||||
}}.show();
|
}}.show();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void showSmall(String titleText, String text){
|
||||||
|
new Dialog(titleText){{
|
||||||
|
cont.margin(10).add(text);
|
||||||
|
titleTable.row();
|
||||||
|
titleTable.addImage().color(Pal.accent).height(3f).growX().pad(2f);
|
||||||
|
buttons.addButton("$ok", this::hide).size(90, 50).pad(4);
|
||||||
|
}}.show();
|
||||||
|
}
|
||||||
|
|
||||||
public void showConfirm(String title, String text, Runnable confirmed){
|
public void showConfirm(String title, String text, Runnable confirmed){
|
||||||
showConfirm(title, text, null, confirmed);
|
showConfirm(title, text, null, confirmed);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -6,10 +6,8 @@ import io.anuke.arc.collection.*;
|
|||||||
import io.anuke.arc.math.*;
|
import io.anuke.arc.math.*;
|
||||||
import io.anuke.arc.math.geom.*;
|
import io.anuke.arc.math.geom.*;
|
||||||
import io.anuke.arc.util.*;
|
import io.anuke.arc.util.*;
|
||||||
import io.anuke.mindustry.ai.*;
|
|
||||||
import io.anuke.mindustry.content.*;
|
import io.anuke.mindustry.content.*;
|
||||||
import io.anuke.mindustry.core.GameState.*;
|
import io.anuke.mindustry.core.GameState.*;
|
||||||
import io.anuke.mindustry.entities.*;
|
|
||||||
import io.anuke.mindustry.game.EventType.*;
|
import io.anuke.mindustry.game.EventType.*;
|
||||||
import io.anuke.mindustry.game.*;
|
import io.anuke.mindustry.game.*;
|
||||||
import io.anuke.mindustry.io.*;
|
import io.anuke.mindustry.io.*;
|
||||||
@@ -23,11 +21,7 @@ import io.anuke.mindustry.world.blocks.*;
|
|||||||
|
|
||||||
import static io.anuke.mindustry.Vars.*;
|
import static io.anuke.mindustry.Vars.*;
|
||||||
|
|
||||||
public class World implements ApplicationListener{
|
public class World{
|
||||||
public final Maps maps = new Maps();
|
|
||||||
public final BlockIndexer indexer = new BlockIndexer();
|
|
||||||
public final WaveSpawner spawner = new WaveSpawner();
|
|
||||||
public final Pathfinder pathfinder = new Pathfinder();
|
|
||||||
public final Context context = new Context();
|
public final Context context = new Context();
|
||||||
|
|
||||||
private Map currentMap;
|
private Map currentMap;
|
||||||
@@ -36,17 +30,7 @@ public class World implements ApplicationListener{
|
|||||||
private boolean generating, invalidMap;
|
private boolean generating, invalidMap;
|
||||||
|
|
||||||
public World(){
|
public World(){
|
||||||
maps.load();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void init(){
|
|
||||||
maps.loadLegacyMaps();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void dispose(){
|
|
||||||
maps.dispose();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public boolean isInvalidMap(){
|
public boolean isInvalidMap(){
|
||||||
@@ -194,7 +178,7 @@ public class World implements ApplicationListener{
|
|||||||
addDarkness(tiles);
|
addDarkness(tiles);
|
||||||
}
|
}
|
||||||
|
|
||||||
Entities.getAllGroups().each(group -> group.resize(-finalWorldBounds, -finalWorldBounds, tiles.length * tilesize + finalWorldBounds * 2, tiles[0].length * tilesize + finalWorldBounds * 2));
|
entities.all().each(group -> group.resize(-finalWorldBounds, -finalWorldBounds, tiles.length * tilesize + finalWorldBounds * 2, tiles[0].length * tilesize + finalWorldBounds * 2));
|
||||||
|
|
||||||
generating = false;
|
generating = false;
|
||||||
Events.fire(new WorldLoadEvent());
|
Events.fire(new WorldLoadEvent());
|
||||||
@@ -231,7 +215,7 @@ public class World implements ApplicationListener{
|
|||||||
}catch(Exception e){
|
}catch(Exception e){
|
||||||
Log.err(e);
|
Log.err(e);
|
||||||
if(!headless){
|
if(!headless){
|
||||||
ui.showError("$map.invalid");
|
ui.showErrorMessage("$map.invalid");
|
||||||
Core.app.post(() -> state.set(State.menu));
|
Core.app.post(() -> state.set(State.menu));
|
||||||
invalidMap = true;
|
invalidMap = true;
|
||||||
}
|
}
|
||||||
@@ -245,7 +229,7 @@ public class World implements ApplicationListener{
|
|||||||
|
|
||||||
if(!headless){
|
if(!headless){
|
||||||
if(state.teams.get(defaultTeam).cores.size == 0 && !checkRules.pvp){
|
if(state.teams.get(defaultTeam).cores.size == 0 && !checkRules.pvp){
|
||||||
ui.showError("$map.nospawn");
|
ui.showErrorMessage("$map.nospawn");
|
||||||
invalidMap = true;
|
invalidMap = true;
|
||||||
}else if(checkRules.pvp){ //pvp maps need two cores to be valid
|
}else if(checkRules.pvp){ //pvp maps need two cores to be valid
|
||||||
int teams = 0;
|
int teams = 0;
|
||||||
@@ -256,12 +240,12 @@ public class World implements ApplicationListener{
|
|||||||
}
|
}
|
||||||
if(teams < 2){
|
if(teams < 2){
|
||||||
invalidMap = true;
|
invalidMap = true;
|
||||||
ui.showError("$map.nospawn.pvp");
|
ui.showErrorMessage("$map.nospawn.pvp");
|
||||||
}
|
}
|
||||||
}else if(checkRules.attackMode){ //attack maps need two cores to be valid
|
}else if(checkRules.attackMode){ //attack maps need two cores to be valid
|
||||||
invalidMap = state.teams.get(waveTeam).cores.isEmpty();
|
invalidMap = state.teams.get(waveTeam).cores.isEmpty();
|
||||||
if(invalidMap){
|
if(invalidMap){
|
||||||
ui.showError("$map.nospawn.attack");
|
ui.showErrorMessage("$map.nospawn.attack");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}else{
|
}else{
|
||||||
|
|||||||
@@ -13,20 +13,19 @@ import io.anuke.arc.scene.actions.*;
|
|||||||
import io.anuke.arc.scene.event.*;
|
import io.anuke.arc.scene.event.*;
|
||||||
import io.anuke.arc.scene.style.*;
|
import io.anuke.arc.scene.style.*;
|
||||||
import io.anuke.arc.scene.ui.*;
|
import io.anuke.arc.scene.ui.*;
|
||||||
import io.anuke.arc.scene.ui.TextButton.*;
|
|
||||||
import io.anuke.arc.scene.ui.layout.*;
|
import io.anuke.arc.scene.ui.layout.*;
|
||||||
import io.anuke.arc.util.*;
|
import io.anuke.arc.util.*;
|
||||||
import io.anuke.mindustry.*;
|
import io.anuke.mindustry.*;
|
||||||
import io.anuke.mindustry.content.*;
|
import io.anuke.mindustry.content.*;
|
||||||
import io.anuke.mindustry.core.GameState.*;
|
import io.anuke.mindustry.core.GameState.*;
|
||||||
import io.anuke.mindustry.core.*;
|
|
||||||
import io.anuke.mindustry.game.*;
|
import io.anuke.mindustry.game.*;
|
||||||
|
import io.anuke.mindustry.gen.*;
|
||||||
import io.anuke.mindustry.graphics.*;
|
import io.anuke.mindustry.graphics.*;
|
||||||
import io.anuke.mindustry.io.*;
|
import io.anuke.mindustry.io.*;
|
||||||
import io.anuke.mindustry.maps.*;
|
import io.anuke.mindustry.maps.*;
|
||||||
|
import io.anuke.mindustry.ui.Styles;
|
||||||
import io.anuke.mindustry.ui.dialogs.*;
|
import io.anuke.mindustry.ui.dialogs.*;
|
||||||
import io.anuke.mindustry.world.*;
|
import io.anuke.mindustry.world.*;
|
||||||
import io.anuke.mindustry.world.Block.*;
|
|
||||||
import io.anuke.mindustry.world.blocks.*;
|
import io.anuke.mindustry.world.blocks.*;
|
||||||
import io.anuke.mindustry.world.blocks.storage.*;
|
import io.anuke.mindustry.world.blocks.storage.*;
|
||||||
|
|
||||||
@@ -48,9 +47,9 @@ public class MapEditorDialog extends Dialog implements Disposable{
|
|||||||
private Array<Block> blocksOut = new Array<>();
|
private Array<Block> blocksOut = new Array<>();
|
||||||
|
|
||||||
public MapEditorDialog(){
|
public MapEditorDialog(){
|
||||||
super("", "dialog");
|
super("");
|
||||||
|
|
||||||
background("dark");
|
background(Styles.black);
|
||||||
|
|
||||||
editor = new MapEditor();
|
editor = new MapEditor();
|
||||||
view = new MapView(editor);
|
view = new MapView(editor);
|
||||||
@@ -60,27 +59,26 @@ public class MapEditorDialog extends Dialog implements Disposable{
|
|||||||
menu = new FloatingDialog("$menu");
|
menu = new FloatingDialog("$menu");
|
||||||
menu.addCloseButton();
|
menu.addCloseButton();
|
||||||
|
|
||||||
float isize = iconsize;
|
|
||||||
float swidth = 180f;
|
float swidth = 180f;
|
||||||
|
|
||||||
menu.cont.table(t -> {
|
menu.cont.table(t -> {
|
||||||
t.defaults().size(swidth, 60f).padBottom(5).padRight(5).padLeft(5);
|
t.defaults().size(swidth, 60f).padBottom(5).padRight(5).padLeft(5);
|
||||||
|
|
||||||
t.addImageTextButton("$editor.savemap", "icon-floppy-16", isize, this::save);
|
t.addImageTextButton("$editor.savemap", Icon.floppy16Small, this::save);
|
||||||
|
|
||||||
t.addImageTextButton("$editor.mapinfo", "icon-pencil", isize, () -> {
|
t.addImageTextButton("$editor.mapinfo", Icon.pencilSmall, () -> {
|
||||||
infoDialog.show();
|
infoDialog.show();
|
||||||
menu.hide();
|
menu.hide();
|
||||||
});
|
});
|
||||||
|
|
||||||
t.row();
|
t.row();
|
||||||
|
|
||||||
t.addImageTextButton("$editor.generate", "icon-editor", isize, () -> {
|
t.addImageTextButton("$editor.generate", Icon.editorSmall, () -> {
|
||||||
generateDialog.show(generateDialog::applyToEditor);
|
generateDialog.show(generateDialog::applyToEditor);
|
||||||
menu.hide();
|
menu.hide();
|
||||||
});
|
});
|
||||||
|
|
||||||
t.addImageTextButton("$editor.resize", "icon-resize", isize, () -> {
|
t.addImageTextButton("$editor.resize", Icon.resizeSmall, () -> {
|
||||||
resizeDialog.show();
|
resizeDialog.show();
|
||||||
menu.hide();
|
menu.hide();
|
||||||
});
|
});
|
||||||
@@ -88,62 +86,58 @@ public class MapEditorDialog extends Dialog implements Disposable{
|
|||||||
t.row();
|
t.row();
|
||||||
|
|
||||||
if(!ios){
|
if(!ios){
|
||||||
t.addImageTextButton("$editor.import", "icon-load-map", isize, () ->
|
t.addImageTextButton("$editor.import", Icon.loadMapSmall, () ->
|
||||||
createDialog("$editor.import",
|
createDialog("$editor.import",
|
||||||
"$editor.importmap", "$editor.importmap.description", "icon-load-map", (Runnable)loadDialog::show,
|
"$editor.importmap", "$editor.importmap.description", Icon.loadMap, (Runnable)loadDialog::show,
|
||||||
"$editor.importfile", "$editor.importfile.description", "icon-file", (Runnable)() ->
|
"$editor.importfile", "$editor.importfile.description", Icon.file, (Runnable)() ->
|
||||||
Platform.instance.showFileChooser("$editor.loadmap", "Map Files", file -> ui.loadAnd(() -> {
|
platform.showFileChooser(true, mapExtension, file -> ui.loadAnd(() -> {
|
||||||
world.maps.tryCatchMapError(() -> {
|
maps.tryCatchMapError(() -> {
|
||||||
if(MapIO.isImage(file)){
|
if(MapIO.isImage(file)){
|
||||||
ui.showInfo("$editor.errorimage");
|
ui.showInfo("$editor.errorimage");
|
||||||
}else if(file.extension().equalsIgnoreCase(oldMapExtension)){
|
|
||||||
editor.beginEdit(world.maps.makeLegacyMap(file));
|
|
||||||
}else{
|
}else{
|
||||||
editor.beginEdit(MapIO.createMap(file, true));
|
editor.beginEdit(MapIO.createMap(file, true));
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}), true, FileChooser.anyMapFiles),
|
})),
|
||||||
|
|
||||||
"$editor.importimage", "$editor.importimage.description", "icon-file-image", (Runnable)() ->
|
"$editor.importimage", "$editor.importimage.description", Icon.fileImage, (Runnable)() ->
|
||||||
Platform.instance.showFileChooser("$loadimage", "Image Files", file ->
|
platform.showFileChooser(true, "png", file ->
|
||||||
ui.loadAnd(() -> {
|
ui.loadAnd(() -> {
|
||||||
try{
|
try{
|
||||||
Pixmap pixmap = new Pixmap(file);
|
Pixmap pixmap = new Pixmap(file);
|
||||||
editor.beginEdit(pixmap);
|
editor.beginEdit(pixmap);
|
||||||
pixmap.dispose();
|
pixmap.dispose();
|
||||||
}catch(Exception e){
|
}catch(Exception e){
|
||||||
ui.showError(Core.bundle.format("editor.errorload", Strings.parseException(e, true)));
|
ui.showException("$editor.errorload", e);
|
||||||
Log.err(e);
|
Log.err(e);
|
||||||
}
|
}
|
||||||
}), true, FileChooser.pngFiles))
|
})))
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
Cell cell = t.addImageTextButton("$editor.export", "icon-save-map", isize, () -> {
|
Cell cell = t.addImageTextButton("$editor.export", Icon.saveMapSmall, () -> {
|
||||||
if(!ios){
|
if(!ios){
|
||||||
Platform.instance.showFileChooser("$editor.savemap", "Map Files", file -> {
|
platform.showFileChooser(false, mapExtension, file -> {
|
||||||
file = file.parent().child(file.nameWithoutExtension() + "." + mapExtension);
|
|
||||||
FileHandle result = file;
|
|
||||||
ui.loadAnd(() -> {
|
ui.loadAnd(() -> {
|
||||||
try{
|
try{
|
||||||
if(!editor.getTags().containsKey("name")){
|
if(!editor.getTags().containsKey("name")){
|
||||||
editor.getTags().put("name", result.nameWithoutExtension());
|
editor.getTags().put("name", file.nameWithoutExtension());
|
||||||
}
|
}
|
||||||
MapIO.writeMap(result, editor.createMap(result));
|
MapIO.writeMap(file, editor.createMap(file));
|
||||||
}catch(Exception e){
|
}catch(Exception e){
|
||||||
ui.showError(Core.bundle.format("editor.errorsave", Strings.parseException(e, true)));
|
ui.showException("$editor.errorsave", e);
|
||||||
Log.err(e);
|
Log.err(e);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}, false, FileChooser.mapFiles);
|
});
|
||||||
}else{
|
}else{
|
||||||
ui.loadAnd(() -> {
|
ui.loadAnd(() -> {
|
||||||
try{
|
try{
|
||||||
FileHandle result = Core.files.local(editor.getTags().get("name", "unknown") + "." + mapExtension);
|
FileHandle result = Core.files.local(editor.getTags().get("name", "unknown") + "." + mapExtension);
|
||||||
MapIO.writeMap(result, editor.createMap(result));
|
MapIO.writeMap(result, editor.createMap(result));
|
||||||
Platform.instance.shareFile(result);
|
platform.shareFile(result);
|
||||||
}catch(Exception e){
|
}catch(Exception e){
|
||||||
ui.showError(Core.bundle.format("editor.errorsave", Strings.parseException(e, true)));
|
ui.showException("$editor.errorsave", e);
|
||||||
Log.err(e);
|
Log.err(e);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
@@ -157,11 +151,22 @@ public class MapEditorDialog extends Dialog implements Disposable{
|
|||||||
|
|
||||||
menu.cont.row();
|
menu.cont.row();
|
||||||
|
|
||||||
menu.cont.addImageTextButton("$editor.ingame", "icon-arrow", isize, this::playtest).padTop(-5).size(swidth * 2f + 10, 60f);
|
if(steam){
|
||||||
|
menu.cont.addImageTextButton("$editor.publish.workshop", Icon.linkSmall, () -> {
|
||||||
|
Map map = save();
|
||||||
|
if(map != null){
|
||||||
|
platform.publishMap(map);
|
||||||
|
}
|
||||||
|
}).padTop(-3).size(swidth * 2f + 10, 60f);
|
||||||
|
|
||||||
|
menu.cont.row();
|
||||||
|
}
|
||||||
|
|
||||||
|
menu.cont.addImageTextButton("$editor.ingame", Icon.arrowSmall, this::playtest).padTop(!steam ? -3 : 1).size(swidth * 2f + 10, 60f);
|
||||||
|
|
||||||
menu.cont.row();
|
menu.cont.row();
|
||||||
|
|
||||||
menu.cont.addImageTextButton("$quit", "icon-back", isize, () -> {
|
menu.cont.addImageTextButton("$quit", Icon.backSmall, () -> {
|
||||||
tryExit();
|
tryExit();
|
||||||
menu.hide();
|
menu.hide();
|
||||||
}).size(swidth * 2f + 10, 60f);
|
}).size(swidth * 2f + 10, 60f);
|
||||||
@@ -178,7 +183,7 @@ public class MapEditorDialog extends Dialog implements Disposable{
|
|||||||
try{
|
try{
|
||||||
editor.beginEdit(map);
|
editor.beginEdit(map);
|
||||||
}catch(Exception e){
|
}catch(Exception e){
|
||||||
ui.showError(Core.bundle.format("editor.errorload", Strings.parseException(e, true)));
|
ui.showException("$editor.errorload", e);
|
||||||
Log.err(e);
|
Log.err(e);
|
||||||
}
|
}
|
||||||
}));
|
}));
|
||||||
@@ -187,7 +192,6 @@ public class MapEditorDialog extends Dialog implements Disposable{
|
|||||||
|
|
||||||
clearChildren();
|
clearChildren();
|
||||||
margin(0);
|
margin(0);
|
||||||
shown(this::build);
|
|
||||||
|
|
||||||
update(() -> {
|
update(() -> {
|
||||||
if(Core.scene.getKeyboardFocus() instanceof Dialog && Core.scene.getKeyboardFocus() != this){
|
if(Core.scene.getKeyboardFocus() instanceof Dialog && Core.scene.getKeyboardFocus() != this){
|
||||||
@@ -210,7 +214,7 @@ public class MapEditorDialog extends Dialog implements Disposable{
|
|||||||
shown(() -> {
|
shown(() -> {
|
||||||
|
|
||||||
saved = true;
|
saved = true;
|
||||||
if(!Core.settings.getBool("landscape")) Platform.instance.beginForceLandscape();
|
if(!Core.settings.getBool("landscape")) platform.beginForceLandscape();
|
||||||
editor.clearOp();
|
editor.clearOp();
|
||||||
Core.scene.setScrollFocus(view);
|
Core.scene.setScrollFocus(view);
|
||||||
if(!shownWithMap){
|
if(!shownWithMap){
|
||||||
@@ -221,19 +225,16 @@ public class MapEditorDialog extends Dialog implements Disposable{
|
|||||||
}
|
}
|
||||||
shownWithMap = false;
|
shownWithMap = false;
|
||||||
|
|
||||||
Time.runTask(10f, Platform.instance::updateRPC);
|
Time.runTask(10f, platform::updateRPC);
|
||||||
});
|
});
|
||||||
|
|
||||||
hidden(() -> {
|
hidden(() -> {
|
||||||
editor.clearOp();
|
editor.clearOp();
|
||||||
Platform.instance.updateRPC();
|
platform.updateRPC();
|
||||||
if(!Core.settings.getBool("landscape")) Platform.instance.endForceLandscape();
|
if(!Core.settings.getBool("landscape")) platform.endForceLandscape();
|
||||||
});
|
});
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
shown(this::build);
|
||||||
protected void drawBackground(float x, float y){
|
|
||||||
drawDefaultBackground(x, y);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public void resumeEditing(){
|
public void resumeEditing(){
|
||||||
@@ -275,33 +276,36 @@ public class MapEditorDialog extends Dialog implements Disposable{
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
private void save(){
|
private Map save(){
|
||||||
String name = editor.getTags().get("name", "").trim();
|
String name = editor.getTags().get("name", "").trim();
|
||||||
editor.getTags().put("rules", JsonIO.write(state.rules));
|
editor.getTags().put("rules", JsonIO.write(state.rules));
|
||||||
editor.getTags().remove("width");
|
editor.getTags().remove("width");
|
||||||
editor.getTags().remove("height");
|
editor.getTags().remove("height");
|
||||||
player.dead = true;
|
player.dead = true;
|
||||||
|
|
||||||
|
Map returned = null;
|
||||||
|
|
||||||
if(name.isEmpty()){
|
if(name.isEmpty()){
|
||||||
infoDialog.show();
|
infoDialog.show();
|
||||||
Core.app.post(() -> ui.showError("$editor.save.noname"));
|
Core.app.post(() -> ui.showErrorMessage("$editor.save.noname"));
|
||||||
}else{
|
}else{
|
||||||
Map map = world.maps.all().find(m -> m.name().equals(name));
|
Map map = maps.all().find(m -> m.name().equals(name));
|
||||||
if(map != null && !map.custom){
|
if(map != null && !map.custom){
|
||||||
handleSaveBuiltin(map);
|
handleSaveBuiltin(map);
|
||||||
}else{
|
}else{
|
||||||
world.maps.saveMap(editor.getTags());
|
returned = maps.saveMap(editor.getTags());
|
||||||
ui.showInfoFade("$editor.saved");
|
ui.showInfoFade("$editor.saved");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
menu.hide();
|
menu.hide();
|
||||||
saved = true;
|
saved = true;
|
||||||
|
return returned;
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Called when a built-in map save is attempted.*/
|
/** Called when a built-in map save is attempted.*/
|
||||||
protected void handleSaveBuiltin(Map map){
|
protected void handleSaveBuiltin(Map map){
|
||||||
ui.showError("$editor.save.overwrite");
|
ui.showErrorMessage("$editor.save.overwrite");
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -321,7 +325,7 @@ public class MapEditorDialog extends Dialog implements Disposable{
|
|||||||
for(int i = 0; i < arguments.length; i += 4){
|
for(int i = 0; i < arguments.length; i += 4){
|
||||||
String name = (String)arguments[i];
|
String name = (String)arguments[i];
|
||||||
String description = (String)arguments[i + 1];
|
String description = (String)arguments[i + 1];
|
||||||
String iconname = (String)arguments[i + 2];
|
Drawable iconname = (Drawable)arguments[i + 2];
|
||||||
Runnable listenable = (Runnable)arguments[i + 3];
|
Runnable listenable = (Runnable)arguments[i + 3];
|
||||||
|
|
||||||
TextButton button = dialog.cont.addButton(name, () -> {
|
TextButton button = dialog.cont.addButton(name, () -> {
|
||||||
@@ -331,11 +335,11 @@ public class MapEditorDialog extends Dialog implements Disposable{
|
|||||||
}).left().margin(0).get();
|
}).left().margin(0).get();
|
||||||
|
|
||||||
button.clearChildren();
|
button.clearChildren();
|
||||||
button.addImage(iconname).size(iconsize).padLeft(10);
|
button.addImage(iconname).padLeft(10);
|
||||||
button.table(t -> {
|
button.table(t -> {
|
||||||
t.add(name).growX().wrap();
|
t.add(name).growX().wrap();
|
||||||
t.row();
|
t.row();
|
||||||
t.add(description).color(Color.GRAY).growX().wrap();
|
t.add(description).color(Color.gray).growX().wrap();
|
||||||
}).growX().pad(10f).padLeft(5);
|
}).growX().pad(10f).padLeft(5);
|
||||||
|
|
||||||
button.row();
|
button.row();
|
||||||
@@ -370,7 +374,7 @@ public class MapEditorDialog extends Dialog implements Disposable{
|
|||||||
show();
|
show();
|
||||||
}catch(Exception e){
|
}catch(Exception e){
|
||||||
Log.err(e);
|
Log.err(e);
|
||||||
ui.showError(Core.bundle.format("editor.errorload", Strings.parseException(e, true)));
|
ui.showException("$editor.errorload", e);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
@@ -408,14 +412,13 @@ public class MapEditorDialog extends Dialog implements Disposable{
|
|||||||
|
|
||||||
Consumer<EditorTool> addTool = tool -> {
|
Consumer<EditorTool> addTool = tool -> {
|
||||||
|
|
||||||
ImageButton button = new ImageButton("icon-" + tool.name() + "-small", "clear-toggle");
|
ImageButton button = new ImageButton(Core.atlas.drawable("icon-" + tool.name() + "-small"), Styles.clearTogglei);
|
||||||
button.clicked(() -> {
|
button.clicked(() -> {
|
||||||
view.setTool(tool);
|
view.setTool(tool);
|
||||||
if(lastTable[0] != null){
|
if(lastTable[0] != null){
|
||||||
lastTable[0].remove();
|
lastTable[0].remove();
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
button.resizeImage(iconsizesmall);
|
|
||||||
button.update(() -> button.setChecked(view.getTool() == tool));
|
button.update(() -> button.setChecked(view.getTool() == tool));
|
||||||
group.add(button);
|
group.add(button);
|
||||||
|
|
||||||
@@ -435,7 +438,7 @@ public class MapEditorDialog extends Dialog implements Disposable{
|
|||||||
lastTable[0].remove();
|
lastTable[0].remove();
|
||||||
}
|
}
|
||||||
|
|
||||||
Table table = new Table("dialogDim");
|
Table table = new Table(Styles.black9);
|
||||||
table.defaults().size(300f, 70f);
|
table.defaults().size(300f, 70f);
|
||||||
|
|
||||||
for(int i = 0; i < tool.altModes.length; i++){
|
for(int i = 0; i < tool.altModes.length; i++){
|
||||||
@@ -445,10 +448,10 @@ public class MapEditorDialog extends Dialog implements Disposable{
|
|||||||
table.addButton(b -> {
|
table.addButton(b -> {
|
||||||
b.left();
|
b.left();
|
||||||
b.marginLeft(6);
|
b.marginLeft(6);
|
||||||
b.setStyle(Core.scene.skin.get("clear-toggle", TextButtonStyle.class));
|
b.setStyle(Styles.clearTogglet);
|
||||||
b.add(Core.bundle.get("toolmode." + name)).left();
|
b.add(Core.bundle.get("toolmode." + name)).left();
|
||||||
b.row();
|
b.row();
|
||||||
b.add(Core.bundle.get("toolmode." + name + ".description")).color(Color.LIGHT_GRAY).left();
|
b.add(Core.bundle.get("toolmode." + name + ".description")).color(Color.lightGray).left();
|
||||||
}, () -> {
|
}, () -> {
|
||||||
tool.mode = (tool.mode == mode ? -1 : mode);
|
tool.mode = (tool.mode == mode ? -1 : mode);
|
||||||
table.remove();
|
table.remove();
|
||||||
@@ -485,16 +488,16 @@ public class MapEditorDialog extends Dialog implements Disposable{
|
|||||||
|
|
||||||
tools.defaults().size(size, size);
|
tools.defaults().size(size, size);
|
||||||
|
|
||||||
tools.addImageButton("icon-menu-large-small", "clear", iconsizesmall, menu::show);
|
tools.addImageButton(Icon.menuLargeSmall, Styles.cleari, menu::show);
|
||||||
|
|
||||||
ImageButton grid = tools.addImageButton("icon-grid-small", "clear-toggle", iconsizesmall, () -> view.setGrid(!view.isGrid())).get();
|
ImageButton grid = tools.addImageButton(Icon.gridSmall, Styles.clearTogglei, () -> view.setGrid(!view.isGrid())).get();
|
||||||
|
|
||||||
addTool.accept(EditorTool.zoom);
|
addTool.accept(EditorTool.zoom);
|
||||||
|
|
||||||
tools.row();
|
tools.row();
|
||||||
|
|
||||||
ImageButton undo = tools.addImageButton("icon-undo-small", "clear", iconsizesmall, editor::undo).get();
|
ImageButton undo = tools.addImageButton(Icon.undoSmall, Styles.cleari, editor::undo).get();
|
||||||
ImageButton redo = tools.addImageButton("icon-redo-small", "clear", iconsizesmall, editor::redo).get();
|
ImageButton redo = tools.addImageButton(Icon.redoSmall, Styles.cleari, editor::redo).get();
|
||||||
|
|
||||||
addTool.accept(EditorTool.pick);
|
addTool.accept(EditorTool.pick);
|
||||||
|
|
||||||
@@ -503,8 +506,8 @@ public class MapEditorDialog extends Dialog implements Disposable{
|
|||||||
undo.setDisabled(() -> !editor.canUndo());
|
undo.setDisabled(() -> !editor.canUndo());
|
||||||
redo.setDisabled(() -> !editor.canRedo());
|
redo.setDisabled(() -> !editor.canRedo());
|
||||||
|
|
||||||
undo.update(() -> undo.getImage().setColor(undo.isDisabled() ? Color.GRAY : Color.WHITE));
|
undo.update(() -> undo.getImage().setColor(undo.isDisabled() ? Color.gray : Color.white));
|
||||||
redo.update(() -> redo.getImage().setColor(redo.isDisabled() ? Color.GRAY : Color.WHITE));
|
redo.update(() -> redo.getImage().setColor(redo.isDisabled() ? Color.gray : Color.white));
|
||||||
grid.update(() -> grid.setChecked(view.isGrid()));
|
grid.update(() -> grid.setChecked(view.isGrid()));
|
||||||
|
|
||||||
addTool.accept(EditorTool.line);
|
addTool.accept(EditorTool.line);
|
||||||
@@ -516,7 +519,7 @@ public class MapEditorDialog extends Dialog implements Disposable{
|
|||||||
addTool.accept(EditorTool.fill);
|
addTool.accept(EditorTool.fill);
|
||||||
addTool.accept(EditorTool.spray);
|
addTool.accept(EditorTool.spray);
|
||||||
|
|
||||||
ImageButton rotate = tools.addImageButton("icon-arrow-16-small", "clear", iconsizesmall, () -> editor.rotation = (editor.rotation + 1) % 4).get();
|
ImageButton rotate = tools.addImageButton(Icon.arrow16Small, Styles.cleari, () -> editor.rotation = (editor.rotation + 1) % 4).get();
|
||||||
rotate.getImage().update(() -> {
|
rotate.getImage().update(() -> {
|
||||||
rotate.getImage().setRotation(editor.rotation * 90);
|
rotate.getImage().setRotation(editor.rotation * 90);
|
||||||
rotate.getImage().setOrigin(Align.center);
|
rotate.getImage().setOrigin(Align.center);
|
||||||
@@ -524,7 +527,7 @@ public class MapEditorDialog extends Dialog implements Disposable{
|
|||||||
|
|
||||||
tools.row();
|
tools.row();
|
||||||
|
|
||||||
tools.table("underline", t -> t.add("$editor.teams"))
|
tools.table(Tex.underline, t -> t.add("$editor.teams"))
|
||||||
.colspan(3).height(40).width(size * 3f + 3f).padBottom(3);
|
.colspan(3).height(40).width(size * 3f + 3f).padBottom(3);
|
||||||
|
|
||||||
tools.row();
|
tools.row();
|
||||||
@@ -534,7 +537,7 @@ public class MapEditorDialog extends Dialog implements Disposable{
|
|||||||
int i = 0;
|
int i = 0;
|
||||||
|
|
||||||
for(Team team : Team.all){
|
for(Team team : Team.all){
|
||||||
ImageButton button = new ImageButton("whiteui", "clear-toggle-partial");
|
ImageButton button = new ImageButton(Tex.whiteui, Styles.clearTogglePartiali);
|
||||||
button.margin(4f);
|
button.margin(4f);
|
||||||
button.getImageCell().grow();
|
button.getImageCell().grow();
|
||||||
button.getStyle().imageUpColor = team.color;
|
button.getStyle().imageUpColor = team.color;
|
||||||
@@ -550,7 +553,7 @@ public class MapEditorDialog extends Dialog implements Disposable{
|
|||||||
|
|
||||||
mid.row();
|
mid.row();
|
||||||
|
|
||||||
mid.table("underline", t -> {
|
mid.table(Tex.underline, t -> {
|
||||||
Slider slider = new Slider(0, MapEditor.brushSizes.length - 1, 1, false);
|
Slider slider = new Slider(0, MapEditor.brushSizes.length - 1, 1, false);
|
||||||
slider.moved(f -> editor.brushSize = MapEditor.brushSizes[(int)(float)f]);
|
slider.moved(f -> editor.brushSize = MapEditor.brushSizes[(int)(float)f]);
|
||||||
for(int j = 0; j < MapEditor.brushSizes.length; j++){
|
for(int j = 0; j < MapEditor.brushSizes.length; j++){
|
||||||
@@ -579,7 +582,6 @@ public class MapEditorDialog extends Dialog implements Disposable{
|
|||||||
|
|
||||||
if(Core.input.ctrl()){
|
if(Core.input.ctrl()){
|
||||||
//alt mode select
|
//alt mode select
|
||||||
//TODO these keycode are unusable, tweak later
|
|
||||||
for(int i = 0; i < view.getTool().altModes.length + 1; i++){
|
for(int i = 0; i < view.getTool().altModes.length + 1; i++){
|
||||||
if(Core.input.keyTap(KeyCode.valueOf("NUM_" + (i + 1)))){
|
if(Core.input.keyTap(KeyCode.valueOf("NUM_" + (i + 1)))){
|
||||||
view.getTool().mode = i - 1;
|
view.getTool().mode = i - 1;
|
||||||
@@ -682,11 +684,11 @@ public class MapEditorDialog extends Dialog implements Disposable{
|
|||||||
});
|
});
|
||||||
|
|
||||||
for(Block block : blocksOut){
|
for(Block block : blocksOut){
|
||||||
TextureRegion region = block.icon(Icon.medium);
|
TextureRegion region = block.icon(Block.Icon.medium);
|
||||||
|
|
||||||
if(!Core.atlas.isFound(region)) continue;
|
if(!Core.atlas.isFound(region)) continue;
|
||||||
|
|
||||||
ImageButton button = new ImageButton("whiteui", "clear-toggle");
|
ImageButton button = new ImageButton(Tex.whiteui, Styles.clearTogglei);
|
||||||
button.getStyle().imageUp = new TextureRegionDrawable(region);
|
button.getStyle().imageUp = new TextureRegionDrawable(region);
|
||||||
button.clicked(() -> editor.drawBlock = block);
|
button.clicked(() -> editor.drawBlock = block);
|
||||||
button.resizeImage(8 * 4f);
|
button.resizeImage(8 * 4f);
|
||||||
@@ -701,7 +703,7 @@ public class MapEditorDialog extends Dialog implements Disposable{
|
|||||||
|
|
||||||
group.getButtons().get(2).setChecked(true);
|
group.getButtons().get(2).setChecked(true);
|
||||||
|
|
||||||
table.table("underline", extra -> extra.labelWrap(() -> editor.drawBlock.localizedName).width(200f).center()).growX();
|
table.table(Tex.underline, extra -> extra.labelWrap(() -> editor.drawBlock.localizedName).width(200f).center()).growX();
|
||||||
table.row();
|
table.row();
|
||||||
table.add(pane).growY().fillX();
|
table.add(pane).growY().fillX();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -8,10 +8,12 @@ import io.anuke.arc.graphics.Pixmap.*;
|
|||||||
import io.anuke.arc.math.*;
|
import io.anuke.arc.math.*;
|
||||||
import io.anuke.arc.math.geom.*;
|
import io.anuke.arc.math.geom.*;
|
||||||
import io.anuke.arc.scene.ui.*;
|
import io.anuke.arc.scene.ui.*;
|
||||||
|
import io.anuke.arc.scene.ui.ImageButton.*;
|
||||||
import io.anuke.arc.scene.ui.layout.*;
|
import io.anuke.arc.scene.ui.layout.*;
|
||||||
import io.anuke.arc.util.*;
|
import io.anuke.arc.util.*;
|
||||||
import io.anuke.arc.util.async.*;
|
import io.anuke.arc.util.async.*;
|
||||||
import io.anuke.mindustry.game.*;
|
import io.anuke.mindustry.game.*;
|
||||||
|
import io.anuke.mindustry.gen.*;
|
||||||
import io.anuke.mindustry.graphics.*;
|
import io.anuke.mindustry.graphics.*;
|
||||||
import io.anuke.mindustry.io.*;
|
import io.anuke.mindustry.io.*;
|
||||||
import io.anuke.mindustry.maps.filters.*;
|
import io.anuke.mindustry.maps.filters.*;
|
||||||
@@ -72,7 +74,7 @@ public class MapGenerateDialog extends FloatingDialog{
|
|||||||
}).size(160f, 64f);
|
}).size(160f, 64f);
|
||||||
}else{
|
}else{
|
||||||
buttons.addButton("$settings.reset", () -> {
|
buttons.addButton("$settings.reset", () -> {
|
||||||
filters.set(world.maps.readFilters(""));
|
filters.set(maps.readFilters(""));
|
||||||
rebuildFilters();
|
rebuildFilters();
|
||||||
update();
|
update();
|
||||||
}).size(160f, 64f);
|
}).size(160f, 64f);
|
||||||
@@ -84,7 +86,7 @@ public class MapGenerateDialog extends FloatingDialog{
|
|||||||
update();
|
update();
|
||||||
}).size(160f, 64f);
|
}).size(160f, 64f);
|
||||||
|
|
||||||
buttons.addImageTextButton("$add", "icon-add", iconsize, this::showAdd).height(64f).width(140f);
|
buttons.addImageTextButton("$add", Icon.add, this::showAdd).height(64f).width(140f);
|
||||||
|
|
||||||
if(!applied){
|
if(!applied){
|
||||||
hidden(this::apply);
|
hidden(this::apply);
|
||||||
@@ -176,10 +178,8 @@ public class MapGenerateDialog extends FloatingDialog{
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}, new Stack(){{
|
}, new Stack(){{
|
||||||
add(new Image("loadDim"));
|
add(new Image(Styles.black8));
|
||||||
add(new Image("icon-refresh"){{
|
add(new Image(Icon.refresh, Scaling.none));
|
||||||
setScaling(Scaling.none);
|
|
||||||
}});
|
|
||||||
visible(() -> generating && !updateEditorOnChange);
|
visible(() -> generating && !updateEditorOnChange);
|
||||||
}}).grow().padRight(10);
|
}}).grow().padRight(10);
|
||||||
t.pane(p -> filterTable = p.marginRight(6)).update(pane -> {
|
t.pane(p -> filterTable = p.marginRight(6)).update(pane -> {
|
||||||
@@ -216,7 +216,7 @@ public class MapGenerateDialog extends FloatingDialog{
|
|||||||
}
|
}
|
||||||
|
|
||||||
void rebuildFilters(){
|
void rebuildFilters(){
|
||||||
int cols = Math.max((int)(Math.max(filterTable.getParent().getWidth(), Core.graphics.getWidth()/2f * 0.9f) / UnitScl.dp.scl(290f)), 1);
|
int cols = Math.max((int)(Math.max(filterTable.getParent().getWidth(), Core.graphics.getWidth()/2f * 0.9f) / Scl.scl(290f)), 1);
|
||||||
filterTable.clearChildren();
|
filterTable.clearChildren();
|
||||||
filterTable.top().left();
|
filterTable.top().left();
|
||||||
int i = 0;
|
int i = 0;
|
||||||
@@ -224,7 +224,7 @@ public class MapGenerateDialog extends FloatingDialog{
|
|||||||
for(GenerateFilter filter : filters){
|
for(GenerateFilter filter : filters){
|
||||||
|
|
||||||
//main container
|
//main container
|
||||||
filterTable.table("button", c -> {
|
filterTable.table(Tex.button, c -> {
|
||||||
//icons to perform actions
|
//icons to perform actions
|
||||||
c.table(t -> {
|
c.table(t -> {
|
||||||
t.top();
|
t.top();
|
||||||
@@ -233,26 +233,26 @@ public class MapGenerateDialog extends FloatingDialog{
|
|||||||
t.row();
|
t.row();
|
||||||
|
|
||||||
t.table(b -> {
|
t.table(b -> {
|
||||||
String style = "clear";
|
ImageButtonStyle style = Styles.cleari;
|
||||||
b.defaults().size(50f);
|
b.defaults().size(50f);
|
||||||
b.addImageButton("icon-refresh-small", style, iconsizesmall, () -> {
|
b.addImageButton(Icon.refreshSmall, style, () -> {
|
||||||
filter.randomize();
|
filter.randomize();
|
||||||
update();
|
update();
|
||||||
});
|
});
|
||||||
|
|
||||||
b.addImageButton("icon-arrow-up-small", style, iconsizesmall, () -> {
|
b.addImageButton(Icon.arrowUpSmall, style, () -> {
|
||||||
int idx = filters.indexOf(filter);
|
int idx = filters.indexOf(filter);
|
||||||
filters.swap(idx, Math.max(0, idx - 1));
|
filters.swap(idx, Math.max(0, idx - 1));
|
||||||
rebuildFilters();
|
rebuildFilters();
|
||||||
update();
|
update();
|
||||||
});
|
});
|
||||||
b.addImageButton("icon-arrow-down-small",style, iconsizesmall, () -> {
|
b.addImageButton(Icon.arrowDownSmall, style, () -> {
|
||||||
int idx = filters.indexOf(filter);
|
int idx = filters.indexOf(filter);
|
||||||
filters.swap(idx, Math.min(filters.size - 1, idx + 1));
|
filters.swap(idx, Math.min(filters.size - 1, idx + 1));
|
||||||
rebuildFilters();
|
rebuildFilters();
|
||||||
update();
|
update();
|
||||||
});
|
});
|
||||||
b.addImageButton("icon-trash-small", style, iconsizesmall, () -> {
|
b.addImageButton(Icon.trashSmall, style, () -> {
|
||||||
filters.remove(filter);
|
filters.remove(filter);
|
||||||
rebuildFilters();
|
rebuildFilters();
|
||||||
update();
|
update();
|
||||||
@@ -304,7 +304,7 @@ public class MapGenerateDialog extends FloatingDialog{
|
|||||||
}
|
}
|
||||||
|
|
||||||
selection.cont.addButton("$filter.defaultores", () -> {
|
selection.cont.addButton("$filter.defaultores", () -> {
|
||||||
world.maps.addDefaultOres(filters);
|
maps.addDefaultOres(filters);
|
||||||
rebuildFilters();
|
rebuildFilters();
|
||||||
update();
|
update();
|
||||||
selection.hide();
|
selection.hide();
|
||||||
|
|||||||
@@ -4,13 +4,11 @@ import io.anuke.arc.*;
|
|||||||
import io.anuke.arc.collection.*;
|
import io.anuke.arc.collection.*;
|
||||||
import io.anuke.arc.scene.ui.*;
|
import io.anuke.arc.scene.ui.*;
|
||||||
import io.anuke.mindustry.*;
|
import io.anuke.mindustry.*;
|
||||||
import io.anuke.mindustry.core.*;
|
|
||||||
import io.anuke.mindustry.game.*;
|
import io.anuke.mindustry.game.*;
|
||||||
import io.anuke.mindustry.io.*;
|
import io.anuke.mindustry.io.*;
|
||||||
|
import io.anuke.mindustry.ui.*;
|
||||||
import io.anuke.mindustry.ui.dialogs.*;
|
import io.anuke.mindustry.ui.dialogs.*;
|
||||||
|
|
||||||
import static io.anuke.mindustry.Vars.world;
|
|
||||||
|
|
||||||
public class MapInfoDialog extends FloatingDialog{
|
public class MapInfoDialog extends FloatingDialog{
|
||||||
private final MapEditor editor;
|
private final MapEditor editor;
|
||||||
private final WaveInfoDialog waveInfo;
|
private final WaveInfoDialog waveInfo;
|
||||||
@@ -45,7 +43,7 @@ public class MapInfoDialog extends FloatingDialog{
|
|||||||
t.row();
|
t.row();
|
||||||
t.add("$editor.description").padRight(8).left();
|
t.add("$editor.description").padRight(8).left();
|
||||||
|
|
||||||
TextArea description = t.addArea(tags.get("description", ""), "textarea", text -> {
|
TextArea description = t.addArea(tags.get("description", ""), Styles.areaField, text -> {
|
||||||
tags.put("description", text);
|
tags.put("description", text);
|
||||||
}).size(400f, 140f).get();
|
}).size(400f, 140f).get();
|
||||||
|
|
||||||
@@ -70,7 +68,7 @@ public class MapInfoDialog extends FloatingDialog{
|
|||||||
t.row();
|
t.row();
|
||||||
t.add("$editor.generation").padRight(8).left();
|
t.add("$editor.generation").padRight(8).left();
|
||||||
t.addButton("$edit",
|
t.addButton("$edit",
|
||||||
() -> generate.show(world.maps.readFilters(editor.getTags().get("genfilters", "")),
|
() -> generate.show(Vars.maps.readFilters(editor.getTags().get("genfilters", "")),
|
||||||
filters -> editor.getTags().put("genfilters", JsonIO.write(filters)))
|
filters -> editor.getTags().put("genfilters", JsonIO.write(filters)))
|
||||||
).left().width(200f);
|
).left().width(200f);
|
||||||
|
|
||||||
@@ -78,9 +76,9 @@ public class MapInfoDialog extends FloatingDialog{
|
|||||||
description.change();
|
description.change();
|
||||||
author.change();
|
author.change();
|
||||||
|
|
||||||
Platform.instance.addDialog(name, 50);
|
Vars.platform.addDialog(name, 50);
|
||||||
Platform.instance.addDialog(author, 50);
|
Vars.platform.addDialog(author, 50);
|
||||||
Platform.instance.addDialog(description, 1000);
|
Vars.platform.addDialog(description, 1000);
|
||||||
t.margin(16f);
|
t.margin(16f);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,14 +1,14 @@
|
|||||||
package io.anuke.mindustry.editor;
|
package io.anuke.mindustry.editor;
|
||||||
|
|
||||||
import io.anuke.arc.function.Consumer;
|
import io.anuke.arc.function.*;
|
||||||
import io.anuke.arc.scene.ui.*;
|
import io.anuke.arc.scene.ui.*;
|
||||||
import io.anuke.arc.scene.ui.layout.Table;
|
import io.anuke.arc.scene.ui.layout.*;
|
||||||
import io.anuke.arc.util.Scaling;
|
import io.anuke.arc.util.*;
|
||||||
import io.anuke.mindustry.maps.Map;
|
import io.anuke.mindustry.maps.*;
|
||||||
import io.anuke.mindustry.ui.BorderImage;
|
import io.anuke.mindustry.ui.*;
|
||||||
import io.anuke.mindustry.ui.dialogs.FloatingDialog;
|
import io.anuke.mindustry.ui.dialogs.*;
|
||||||
|
|
||||||
import static io.anuke.mindustry.Vars.world;
|
import static io.anuke.mindustry.Vars.maps;
|
||||||
|
|
||||||
public class MapLoadDialog extends FloatingDialog{
|
public class MapLoadDialog extends FloatingDialog{
|
||||||
private Map selected = null;
|
private Map selected = null;
|
||||||
@@ -17,7 +17,6 @@ public class MapLoadDialog extends FloatingDialog{
|
|||||||
super("$editor.loadmap");
|
super("$editor.loadmap");
|
||||||
|
|
||||||
shown(this::rebuild);
|
shown(this::rebuild);
|
||||||
rebuild();
|
|
||||||
|
|
||||||
TextButton button = new TextButton("$load");
|
TextButton button = new TextButton("$load");
|
||||||
button.setDisabled(() -> selected == null);
|
button.setDisabled(() -> selected == null);
|
||||||
@@ -35,8 +34,8 @@ public class MapLoadDialog extends FloatingDialog{
|
|||||||
|
|
||||||
public void rebuild(){
|
public void rebuild(){
|
||||||
cont.clear();
|
cont.clear();
|
||||||
if(world.maps.all().size > 0){
|
if(maps.all().size > 0){
|
||||||
selected = world.maps.all().first();
|
selected = maps.all().first();
|
||||||
}
|
}
|
||||||
|
|
||||||
ButtonGroup<TextButton> group = new ButtonGroup<>();
|
ButtonGroup<TextButton> group = new ButtonGroup<>();
|
||||||
@@ -49,12 +48,12 @@ public class MapLoadDialog extends FloatingDialog{
|
|||||||
table.defaults().size(200f, 90f).pad(4f);
|
table.defaults().size(200f, 90f).pad(4f);
|
||||||
table.margin(10f);
|
table.margin(10f);
|
||||||
|
|
||||||
ScrollPane pane = new ScrollPane(table, "horizontal");
|
ScrollPane pane = new ScrollPane(table, Styles.horizontalPane);
|
||||||
pane.setFadeScrollBars(false);
|
pane.setFadeScrollBars(false);
|
||||||
|
|
||||||
for(Map map : world.maps.all()){
|
for(Map map : maps.all()){
|
||||||
|
|
||||||
TextButton button = new TextButton(map.name(), "toggle");
|
TextButton button = new TextButton(map.name(), Styles.togglet);
|
||||||
button.add(new BorderImage(map.texture, 2f).setScaling(Scaling.fit)).size(16 * 4f);
|
button.add(new BorderImage(map.texture, 2f).setScaling(Scaling.fit)).size(16 * 4f);
|
||||||
button.getCells().reverse();
|
button.getCells().reverse();
|
||||||
button.clicked(() -> selected = map);
|
button.clicked(() -> selected = map);
|
||||||
@@ -64,7 +63,7 @@ public class MapLoadDialog extends FloatingDialog{
|
|||||||
if(++i % maxcol == 0) table.row();
|
if(++i % maxcol == 0) table.row();
|
||||||
}
|
}
|
||||||
|
|
||||||
if(world.maps.all().size == 0){
|
if(maps.all().size == 0){
|
||||||
table.add("$maps.none").center();
|
table.add("$maps.none").center();
|
||||||
}else{
|
}else{
|
||||||
cont.add("$editor.loadmap");
|
cont.add("$editor.loadmap");
|
||||||
|
|||||||
@@ -8,7 +8,7 @@ import io.anuke.arc.graphics.Texture;
|
|||||||
import io.anuke.arc.graphics.g2d.Draw;
|
import io.anuke.arc.graphics.g2d.Draw;
|
||||||
import io.anuke.arc.graphics.g2d.TextureRegion;
|
import io.anuke.arc.graphics.g2d.TextureRegion;
|
||||||
import io.anuke.arc.math.Mathf;
|
import io.anuke.arc.math.Mathf;
|
||||||
import io.anuke.arc.util.Disposable;
|
import io.anuke.arc.util.*;
|
||||||
import io.anuke.mindustry.content.Blocks;
|
import io.anuke.mindustry.content.Blocks;
|
||||||
import io.anuke.mindustry.game.Team;
|
import io.anuke.mindustry.game.Team;
|
||||||
import io.anuke.mindustry.graphics.IndexedRenderer;
|
import io.anuke.mindustry.graphics.IndexedRenderer;
|
||||||
@@ -155,7 +155,7 @@ public class MapRenderer implements Disposable{
|
|||||||
}
|
}
|
||||||
|
|
||||||
mesh.draw(idxDecal, region, wx * tilesize + offsetX, wy * tilesize + offsetY, width, height);
|
mesh.draw(idxDecal, region, wx * tilesize + offsetX, wy * tilesize + offsetY, width, height);
|
||||||
mesh.setColor(Color.WHITE);
|
mesh.setColor(Color.white);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|||||||
@@ -1,9 +1,10 @@
|
|||||||
package io.anuke.mindustry.editor;
|
package io.anuke.mindustry.editor;
|
||||||
|
|
||||||
import io.anuke.arc.function.IntPositionConsumer;
|
import io.anuke.arc.function.*;
|
||||||
import io.anuke.arc.math.Mathf;
|
import io.anuke.arc.math.*;
|
||||||
import io.anuke.arc.scene.ui.layout.Table;
|
import io.anuke.arc.scene.ui.layout.*;
|
||||||
import io.anuke.mindustry.ui.dialogs.FloatingDialog;
|
import io.anuke.mindustry.gen.*;
|
||||||
|
import io.anuke.mindustry.ui.dialogs.*;
|
||||||
|
|
||||||
public class MapResizeDialog extends FloatingDialog{
|
public class MapResizeDialog extends FloatingDialog{
|
||||||
private static final int minSize = 50, maxSize = 500, increment = 50;
|
private static final int minSize = 50, maxSize = 500, increment = 50;
|
||||||
@@ -28,7 +29,7 @@ public class MapResizeDialog extends FloatingDialog{
|
|||||||
height = move(height, -1);
|
height = move(height, -1);
|
||||||
}).size(60f);
|
}).size(60f);
|
||||||
|
|
||||||
table.table("button", t -> t.label(() -> (w ? width : height) + "")).width(200);
|
table.table(Tex.button, t -> t.label(() -> (w ? width : height) + "")).width(200);
|
||||||
|
|
||||||
table.addButton(">", () -> {
|
table.addButton(">", () -> {
|
||||||
if(w)
|
if(w)
|
||||||
|
|||||||
@@ -1,14 +1,12 @@
|
|||||||
package io.anuke.mindustry.editor;
|
package io.anuke.mindustry.editor;
|
||||||
|
|
||||||
import io.anuke.arc.function.Consumer;
|
import io.anuke.arc.function.*;
|
||||||
import io.anuke.arc.scene.ui.TextButton;
|
import io.anuke.arc.scene.ui.*;
|
||||||
import io.anuke.arc.scene.ui.TextField;
|
import io.anuke.mindustry.*;
|
||||||
import io.anuke.mindustry.core.Platform;
|
import io.anuke.mindustry.maps.*;
|
||||||
import io.anuke.mindustry.maps.Map;
|
import io.anuke.mindustry.ui.dialogs.*;
|
||||||
import io.anuke.mindustry.ui.dialogs.FloatingDialog;
|
|
||||||
|
|
||||||
import static io.anuke.mindustry.Vars.ui;
|
import static io.anuke.mindustry.Vars.ui;
|
||||||
import static io.anuke.mindustry.Vars.world;
|
|
||||||
|
|
||||||
public class MapSaveDialog extends FloatingDialog{
|
public class MapSaveDialog extends FloatingDialog{
|
||||||
private TextField field;
|
private TextField field;
|
||||||
@@ -19,12 +17,12 @@ public class MapSaveDialog extends FloatingDialog{
|
|||||||
field = new TextField();
|
field = new TextField();
|
||||||
listener = cons;
|
listener = cons;
|
||||||
|
|
||||||
Platform.instance.addDialog(field);
|
Vars.platform.addDialog(field);
|
||||||
|
|
||||||
shown(() -> {
|
shown(() -> {
|
||||||
cont.clear();
|
cont.clear();
|
||||||
cont.label(() -> {
|
cont.label(() -> {
|
||||||
Map map = world.maps.byName(field.getText());
|
Map map = Vars.maps.byName(field.getText());
|
||||||
if(map != null){
|
if(map != null){
|
||||||
if(map.custom){
|
if(map.custom){
|
||||||
return "$editor.overwrite";
|
return "$editor.overwrite";
|
||||||
@@ -57,7 +55,7 @@ public class MapSaveDialog extends FloatingDialog{
|
|||||||
if(!invalid()){
|
if(!invalid()){
|
||||||
listener.accept(field.getText());
|
listener.accept(field.getText());
|
||||||
}else{
|
}else{
|
||||||
ui.showError("$editor.failoverwrite");
|
ui.showErrorMessage("$editor.failoverwrite");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -69,7 +67,7 @@ public class MapSaveDialog extends FloatingDialog{
|
|||||||
if(field.getText().isEmpty()){
|
if(field.getText().isEmpty()){
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
Map map = world.maps.byName(field.getText());
|
Map map = Vars.maps.byName(field.getText());
|
||||||
return map != null && !map.custom;
|
return map != null && !map.custom;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||