Compare commits
475 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
5aa574bc71 | ||
|
|
99c0291b0e | ||
|
|
89c195d96b | ||
|
|
86f3fffa91 | ||
|
|
e191362c4f | ||
|
|
8c0cff0c65 | ||
|
|
db31238b00 | ||
|
|
c18b730d7c | ||
|
|
7ad85f6ffb | ||
|
|
45a79624b1 | ||
|
|
65dde8bc97 | ||
|
|
83dce4d8d2 | ||
|
|
6680326392 | ||
|
|
cc222034cb | ||
|
|
5b0250ee74 | ||
|
|
eb52f3b902 | ||
|
|
9add64ae8d | ||
|
|
20c5aadefe | ||
|
|
34896a805e | ||
|
|
722b488795 | ||
|
|
ecd73dcc2c | ||
|
|
b6e97c4261 | ||
|
|
a2750c8aff | ||
|
|
2c0372f680 | ||
|
|
2dceb8927c | ||
|
|
e5cf2161d4 | ||
|
|
b2bae64215 | ||
|
|
552dc254da | ||
|
|
dc51afdc60 | ||
|
|
3f293190cf | ||
|
|
7f299869c5 | ||
|
|
c45805e703 | ||
|
|
d062d8081a | ||
|
|
5955ecefd3 | ||
|
|
0d25d83651 | ||
|
|
1957b6aa12 | ||
|
|
4fa173f0f5 | ||
|
|
fed3bcd79d | ||
|
|
dda1f18f67 | ||
|
|
025386af53 | ||
|
|
bd1ea41c0d | ||
|
|
5d729c1e8d | ||
|
|
1fac4c59a3 | ||
|
|
0e9296913c | ||
|
|
50d379d94d | ||
|
|
d6a4149175 | ||
|
|
5a0669d437 | ||
|
|
0d29d94800 | ||
|
|
1e667946b3 | ||
|
|
c6a4bf69ee | ||
|
|
5d0cfc3599 | ||
|
|
2424afa1fb | ||
|
|
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 | ||
|
|
209f0902c9 | ||
|
|
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 | ||
|
|
0a471441cc | ||
|
|
73149123b4 | ||
|
|
5c6f2171f4 | ||
|
|
fd973038bb | ||
|
|
b7dff91d01 | ||
|
|
e314d199f0 | ||
|
|
3938c199f6 | ||
|
|
962eef4a1d | ||
|
|
97443a86cb | ||
|
|
7137616224 | ||
|
|
444825a5c1 | ||
|
|
986deaa6c7 | ||
|
|
7b27903de2 | ||
|
|
bbadf6795e | ||
|
|
8b9be6eafe | ||
|
|
da336ea412 | ||
|
|
f1cf95d412 | ||
|
|
6642a3e9ad | ||
|
|
49db7773e8 | ||
|
|
9372819fb8 | ||
|
|
9d07d81551 | ||
|
|
3c9bcf05e2 | ||
|
|
3338da2a91 | ||
|
|
b31858a64f | ||
|
|
8f2a8dc9ba | ||
|
|
44e54cd4df | ||
|
|
36c41557ea | ||
|
|
d0d72101ab | ||
|
|
7b41d65fa6 | ||
|
|
5f9000db92 | ||
|
|
de031b1ddb | ||
|
|
58f46bb75f | ||
|
|
d1e07ec0a2 | ||
|
|
0d4716f3b4 | ||
|
|
9ddfd650dd | ||
|
|
cf9cda4936 | ||
|
|
1880c32f90 | ||
|
|
6d72c08d63 | ||
|
|
95ac1b2c21 | ||
|
|
a33fd45136 | ||
|
|
4e43d2a96b | ||
|
|
d68c8fe72c | ||
|
|
c9d0619289 | ||
|
|
8ea33946c4 | ||
|
|
bef7394004 | ||
|
|
4042bf042e | ||
|
|
643b698c30 | ||
|
|
aba3e3985a | ||
|
|
91f679f762 | ||
|
|
3eeed507cc | ||
|
|
988e1d6e30 | ||
|
|
04b4aabcf6 | ||
|
|
d97fe47206 | ||
|
|
0d8748a6ce | ||
|
|
b360a39fcf | ||
|
|
70b071fa26 | ||
|
|
64badb2cb7 | ||
|
|
3da6634242 | ||
|
|
4b8d072854 | ||
|
|
a1ea393f35 | ||
|
|
32abd991e7 | ||
|
|
3294f800be | ||
|
|
74e3dc2d7d | ||
|
|
a7a49a823b | ||
|
|
14c943adfe | ||
|
|
fb84b4b7c1 | ||
|
|
4089ee424c | ||
|
|
9bf010e222 | ||
|
|
0553fb6b79 | ||
|
|
4bb6a25055 | ||
|
|
66ff7b1592 | ||
|
|
be32810608 | ||
|
|
88f48599a0 | ||
|
|
014e2ac8b8 | ||
|
|
bae88ec416 | ||
|
|
46230ad307 | ||
|
|
963a207194 | ||
|
|
59419e13d9 | ||
|
|
82f43a362f | ||
|
|
b370e04035 | ||
|
|
dfd6e7a07b | ||
|
|
a873560d4e | ||
|
|
f7eea51066 | ||
|
|
c6777bd219 | ||
|
|
8eb4d25638 | ||
|
|
98c35c5291 | ||
|
|
191c6e9016 | ||
|
|
33c1579e9c | ||
|
|
52af0b1db9 | ||
|
|
492cb49805 | ||
|
|
e482c2c318 | ||
|
|
5b387e7e17 | ||
|
|
b2e70a44be | ||
|
|
452a8aaa0c | ||
|
|
c3f392a01c | ||
|
|
7d9b6a41fc | ||
|
|
f4f4cf3947 | ||
|
|
28e930eb4b | ||
|
|
301387fb32 | ||
|
|
5955387bdd | ||
|
|
150491ff2c | ||
|
|
c7d735bf56 | ||
|
|
1f4dbd0024 | ||
|
|
ddef78c7d8 | ||
|
|
dc435d88f4 | ||
|
|
84aff0112d | ||
|
|
a13f8ed05f | ||
|
|
0429abbb28 | ||
|
|
562d3e6528 | ||
|
|
ac27b484fa | ||
|
|
3c57c3e492 | ||
|
|
83f9f5d34a | ||
|
|
c659e4f0aa | ||
|
|
723ee3c647 | ||
|
|
32baa279e2 | ||
|
|
17b17979ab | ||
|
|
c94ab5b05a | ||
|
|
625a0125cb | ||
|
|
9f8c1b3d20 | ||
|
|
cc6ed88878 | ||
|
|
73523a96fa | ||
|
|
62e3bc86eb | ||
|
|
a12af852ab | ||
|
|
6f2fc00045 | ||
|
|
9e0de644c4 | ||
|
|
393bdfccaf | ||
|
|
56c39799c8 | ||
|
|
7f2a1374e4 | ||
|
|
6fa0ac56ac | ||
|
|
89ee04c942 | ||
|
|
c058163ab4 | ||
|
|
2832dc69ef | ||
|
|
cb2e2ab9b2 | ||
|
|
f342c38c62 | ||
|
|
811e456f8f | ||
|
|
000503d674 | ||
|
|
d0bd29cfa0 | ||
|
|
d56565990e | ||
|
|
b68734d679 | ||
|
|
bf21c94bd7 | ||
|
|
b6b9685d57 | ||
|
|
f8adbda9c5 | ||
|
|
c9178c3f2f | ||
|
|
84786c12d8 | ||
|
|
335b6ae0cc | ||
|
|
9bde68a86f | ||
|
|
c3201178ae | ||
|
|
366636ef7d | ||
|
|
47112e233e | ||
|
|
88f005be0c | ||
|
|
f454cd3291 | ||
|
|
23038dc6f7 | ||
|
|
58b4f64125 | ||
|
|
974ab59fd2 | ||
|
|
f2f6dc89a2 | ||
|
|
bff9d89232 | ||
|
|
a818da5eb7 | ||
|
|
a1269c05c5 | ||
|
|
d0ff0307f5 | ||
|
|
c4aa0b2863 | ||
|
|
85fd2ad804 | ||
|
|
0770574f17 | ||
|
|
6314bf51df | ||
|
|
4c08c98f8c | ||
|
|
2341da995e | ||
|
|
4ef60af4a8 | ||
|
|
16f6b51857 | ||
|
|
59e53eb672 | ||
|
|
c7724e9122 | ||
|
|
2c4379acd1 | ||
|
|
69e7b442e2 | ||
|
|
70a4c2f3ed | ||
|
|
83c86b3883 | ||
|
|
9924796ad9 | ||
|
|
b587b6bb4d | ||
|
|
4811578c95 | ||
|
|
0a07c62b63 | ||
|
|
c1ff370923 | ||
|
|
e55575f093 | ||
|
|
703f034054 | ||
|
|
2d504521b1 | ||
|
|
8359789d4f | ||
|
|
8162e13f04 | ||
|
|
282aab5939 | ||
|
|
5c6bcbf9cd | ||
|
|
8ef1d54a16 | ||
|
|
1cb01af77b | ||
|
|
a65592d511 | ||
|
|
4ee6f60531 | ||
|
|
5573031d07 |
12
.github/ISSUE_TEMPLATE/bug_report.md
vendored
Normal file
@@ -0,0 +1,12 @@
|
|||||||
|
---
|
||||||
|
name: Bug report
|
||||||
|
about: Create a report to help fix an issue.
|
||||||
|
---
|
||||||
|
|
||||||
|
[Platform]: # (Android/iOS/Mac/Windows/Linux/Web)
|
||||||
|
|
||||||
|
[Build]: # (The build number under the title in the main menu. Required.)
|
||||||
|
|
||||||
|
[Issue]: # (Explain your issue in detail, possibly including the steps to reproduce it.)
|
||||||
|
|
||||||
|
[Notes]: # (Other notes.)
|
||||||
7
.github/ISSUE_TEMPLATE/feature_request.md
vendored
Normal file
@@ -0,0 +1,7 @@
|
|||||||
|
---
|
||||||
|
name: Feature request
|
||||||
|
about: Suggest an idea for this project
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
Do not make a new issue for feature requests. Instead, post it in #545.
|
||||||
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
|
||||||
11
.gitignore
vendored
@@ -4,12 +4,14 @@ logs/
|
|||||||
/core/assets/bundles/output/
|
/core/assets/bundles/output/
|
||||||
/core/assets/.gifimages/
|
/core/assets/.gifimages/
|
||||||
/deploy/
|
/deploy/
|
||||||
|
/out/
|
||||||
/desktop/packr-out/
|
/desktop/packr-out/
|
||||||
/desktop/packr-export/
|
/desktop/packr-export/
|
||||||
/desktop/mindustry-saves/
|
/desktop/mindustry-saves/
|
||||||
/desktop/mindustry-maps/
|
/desktop/mindustry-maps/
|
||||||
/desktop/gifexport/
|
/desktop/gifexport/
|
||||||
/core/lib/
|
/core/lib/
|
||||||
|
/ios/assets/
|
||||||
/core/assets-raw/sprites/generated/
|
/core/assets-raw/sprites/generated/
|
||||||
/core/assets-raw/sprites_out/
|
/core/assets-raw/sprites_out/
|
||||||
/annotations/build/
|
/annotations/build/
|
||||||
@@ -18,10 +20,13 @@ logs/
|
|||||||
/tools/build/
|
/tools/build/
|
||||||
/tests/build/
|
/tests/build/
|
||||||
/server/build/
|
/server/build/
|
||||||
|
changelog
|
||||||
|
saves/
|
||||||
|
core/assets/saves/
|
||||||
|
/core/assets/saves/
|
||||||
|
steam_appid.txt
|
||||||
/test_files/
|
/test_files/
|
||||||
/annotations/build/
|
/annotations/build/
|
||||||
/desktop-sdl/build/
|
|
||||||
desktop-sdl/build/
|
|
||||||
/android/assets/mindustry-maps/
|
/android/assets/mindustry-maps/
|
||||||
/android/assets/mindustry-saves/
|
/android/assets/mindustry-saves/
|
||||||
/core/assets/gifexport/
|
/core/assets/gifexport/
|
||||||
@@ -32,7 +37,9 @@ desktop-sdl/build/
|
|||||||
ios/robovm.properties
|
ios/robovm.properties
|
||||||
packr-out/
|
packr-out/
|
||||||
config/
|
config/
|
||||||
|
changelog
|
||||||
*.gif
|
*.gif
|
||||||
|
/core/assets/saves/
|
||||||
|
|
||||||
version.properties
|
version.properties
|
||||||
|
|
||||||
|
|||||||
25
.travis.yml
@@ -1,28 +1,43 @@
|
|||||||
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
|
||||||
draft: false
|
draft: false
|
||||||
api_key:
|
api_key:
|
||||||
secure: Cv5wFtWt62/A24EvSEQvMow7gKPbZ3oATEFPuSghhB2TQz1dA40Zee3Qvk4LFlpLrhYo4K0ZSczCZRGpR+hCd8+Dpww52bheYEvWuh3ZQfvu/fXtEx2j5PwP1qMpmIgSxETV/gkD7l9FImdh0VzktYiAvQfmi0bEocG9/D4QwjFpNat7iwBdcMiw1MvAygpdIWRsjiw0RKlB2mWarmoHhQ7Gu7qlU3j50uaEvcrtmU0pBUPggNQwQRv32i9NPvNFxrqqlUjDLIS8JFea99zCkp8BwYqbEvBIMzd+Qip1/stLJJA3+cDUClbsDtg8rAVetzpOrdLEEBmqShFe5MDl2yEHcsgpN9CFsyTaUfvB3P3rVjizvycMm42IsUkXQiarm5xTQ/TIA8Rd8AHiSKuweNCg1Fd5SFaRtKy8JVLXuxyfUccmyje6hhz2L4lS2Wfj3mAG7sqZUCXhWP79EKdGkiPOjKv4CwXEKmuH3BMVqPlNUZJr9Eg3sV1FG0h2l+MVOOnR635qdUbb49sYojYxVruMLX0BH1c4ZCu230m8CUoWA1Em1QNI75ya7+9Y5T6AsgWDVpBvdUo9fWNbdp+VQ0GskFQsJD5wtnxbcbHeFiERAgGBm7z6qt9u9LrQpBH+dsW52ADvYsu3L4nQEa+sdMHwTTwmGY+iUvsxu0DqxGg=
|
secure: Cv5wFtWt62/A24EvSEQvMow7gKPbZ3oATEFPuSghhB2TQz1dA40Zee3Qvk4LFlpLrhYo4K0ZSczCZRGpR+hCd8+Dpww52bheYEvWuh3ZQfvu/fXtEx2j5PwP1qMpmIgSxETV/gkD7l9FImdh0VzktYiAvQfmi0bEocG9/D4QwjFpNat7iwBdcMiw1MvAygpdIWRsjiw0RKlB2mWarmoHhQ7Gu7qlU3j50uaEvcrtmU0pBUPggNQwQRv32i9NPvNFxrqqlUjDLIS8JFea99zCkp8BwYqbEvBIMzd+Qip1/stLJJA3+cDUClbsDtg8rAVetzpOrdLEEBmqShFe5MDl2yEHcsgpN9CFsyTaUfvB3P3rVjizvycMm42IsUkXQiarm5xTQ/TIA8Rd8AHiSKuweNCg1Fd5SFaRtKy8JVLXuxyfUccmyje6hhz2L4lS2Wfj3mAG7sqZUCXhWP79EKdGkiPOjKv4CwXEKmuH3BMVqPlNUZJr9Eg3sV1FG0h2l+MVOOnR635qdUbb49sYojYxVruMLX0BH1c4ZCu230m8CUoWA1Em1QNI75ya7+9Y5T6AsgWDVpBvdUo9fWNbdp+VQ0GskFQsJD5wtnxbcbHeFiERAgGBm7z6qt9u9LrQpBH+dsW52ADvYsu3L4nQEa+sdMHwTTwmGY+iUvsxu0DqxGg=
|
||||||
file:
|
file:
|
||||||
- desktop/build/libs/desktop-release.jar
|
- desktop/build/libs/Mindustry.jar
|
||||||
- server/build/libs/server-release.jar
|
- server/build/libs/server-release.jar
|
||||||
on:
|
on:
|
||||||
repo: Anuken/Mindustry
|
repo: Anuken/Mindustry
|
||||||
tags: true
|
tags: true
|
||||||
- provider: script
|
- provider: script
|
||||||
script: bash update_wiki.sh
|
script: bash update_wiki.sh
|
||||||
on:
|
on:
|
||||||
repo: Anuken/Mindustry
|
repo: Anuken/Mindustry
|
||||||
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=
|
||||||
|
|||||||
21
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.*
|
||||||
@@ -36,10 +43,18 @@ If the terminal returns `Permission denied` or `Command not found` on Mac/Linux,
|
|||||||
---
|
---
|
||||||
|
|
||||||
Gradle may take up to several minutes to download files. Be patient. <br>
|
Gradle may take up to several minutes to download files. Be patient. <br>
|
||||||
After building, the output .JAR file should be in `/desktop/build/libs/desktop-release.jar` for desktop builds, and in `/server/build/libs/server-release.jar` for server builds.
|
After building, the output .JAR file should be in `/desktop/build/libs/Mindustry.jar` for desktop builds, and in `/server/build/libs/server-release.jar` for server builds.
|
||||||
|
|
||||||
### 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/)
|
||||||
|
|||||||
@@ -1,8 +1,5 @@
|
|||||||
## Translating for Mindustry
|
## Translating for Mindustry
|
||||||
|
|
||||||
**DISCLAIMER:** *Currently, 4.0 is far from done, which means that things such as block names, descriptions, and core text will be changing often. If you begin translating now, you might have to re-do large chunks of the bundle before final release.*
|
|
||||||
|
|
||||||
|
|
||||||
To begin, log in to your GitHub account, or if you don't have one yet, create it [here](https://github.com/).
|
To begin, log in to your GitHub account, or if you don't have one yet, create it [here](https://github.com/).
|
||||||
|
|
||||||
Consult [this list](https://www.science.co.il/language/Locale-codes.php) to find the locale code for your language. Once you've found it,
|
Consult [this list](https://www.science.co.il/language/Locale-codes.php) to find the locale code for your language. Once you've found it,
|
||||||
@@ -34,6 +31,10 @@ There are two ways to test the translation bundle:
|
|||||||
1) Assuming you have the PC version downloaded, download your bundle file, name it `bundle.properties`, then place it in the same folder as the Mindustry desktop executable and run it. *You should get a popup message in-game confirming that you have loaded an external translation.*
|
1) Assuming you have the PC version downloaded, download your bundle file, name it `bundle.properties`, then place it in the same folder as the Mindustry desktop executable and run it. *You should get a popup message in-game confirming that you have loaded an external translation.*
|
||||||
2) For advanced users: simply download your fork of mindustry and compile/run the game.
|
2) For advanced users: simply download your fork of mindustry and compile/run the game.
|
||||||
|
|
||||||
|
#### Translating for stores (Steam, Google Play)
|
||||||
|
|
||||||
|
If you would like to translate the descriptions for Google Play or Steam, see the [Fastlane Metadata folder](https://github.com/Anuken/Mindustry/tree/master/fastlane/metadata) and submit a pull request for files there. On Google Play, you would create or edit the folder with the correct local code; for Steam, I have to update the translations manually, so just name the folder with the language name, and include the same files as the English folder does.
|
||||||
|
|
||||||
**And that's it.**
|
**And that's it.**
|
||||||
|
|
||||||
*(...of course, that's never really it. Bother me on Discord when something inevitably goes wrong.)*
|
*(...of course, that's never really it. Bother me on Discord when something inevitably goes wrong.)*
|
||||||
|
|||||||
@@ -32,32 +32,9 @@
|
|||||||
<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"/>
|
||||||
<category android:name="android.intent.category.BROWSABLE"/>
|
<category android:name="android.intent.category.BROWSABLE"/>
|
||||||
<data android:mimeType="application/octet-stream"/>
|
<data android:mimeType="application/octet-stream" />
|
||||||
<data android:scheme="file" android:host="*" android:pathPattern=".*\\.mmap"/>
|
|
||||||
</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=".*\\.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"
|
||||||
@@ -46,12 +45,12 @@ task deploy(type: Copy){
|
|||||||
|
|
||||||
from "build/outputs/apk/release/android-release.apk"
|
from "build/outputs/apk/release/android-release.apk"
|
||||||
into "../deploy/"
|
into "../deploy/"
|
||||||
rename("android-release.apk", appName + "-android-" + getVersionString() + ".apk")
|
rename("android-release.apk", "${generateDeployName('android')}.apk")
|
||||||
}
|
}
|
||||||
|
|
||||||
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,21 @@ 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
|
||||||
|
|
||||||
|
if(project.hasProperty("release")){
|
||||||
|
props['androidBuildCode'] = (vcode + 1).toString()
|
||||||
|
}
|
||||||
|
props.store(file('../core/assets/version.properties').newWriter(), null)
|
||||||
}
|
}
|
||||||
|
|
||||||
compileOptions{
|
compileOptions{
|
||||||
|
|||||||
|
Before Width: | Height: | Size: 76 KiB After Width: | Height: | Size: 87 KiB |
|
Before Width: | Height: | Size: 21 KiB After Width: | Height: | Size: 45 KiB |
|
Before Width: | Height: | Size: 23 KiB After Width: | Height: | Size: 28 KiB |
|
Before Width: | Height: | Size: 6.5 KiB After Width: | Height: | Size: 6.1 KiB |
|
Before Width: | Height: | Size: 7.1 KiB After Width: | Height: | Size: 5.0 KiB |
|
Before Width: | Height: | Size: 8.4 KiB After Width: | Height: | Size: 8.3 KiB |
|
Before Width: | Height: | Size: 7.6 KiB After Width: | Height: | Size: 7.6 KiB |
|
Before Width: | Height: | Size: 4.1 KiB After Width: | Height: | Size: 4.1 KiB |
|
Before Width: | Height: | Size: 4.1 KiB After Width: | Height: | Size: 2.8 KiB |
|
Before Width: | Height: | Size: 5.2 KiB After Width: | Height: | Size: 5.1 KiB |
|
Before Width: | Height: | Size: 4.3 KiB After Width: | Height: | Size: 4.3 KiB |
|
Before Width: | Height: | Size: 9.8 KiB After Width: | Height: | Size: 9.5 KiB |
|
Before Width: | Height: | Size: 9.8 KiB After Width: | Height: | Size: 7.4 KiB |
|
Before Width: | Height: | Size: 12 KiB After Width: | Height: | Size: 12 KiB |
|
Before Width: | Height: | Size: 11 KiB After Width: | Height: | Size: 11 KiB |
|
Before Width: | Height: | Size: 16 KiB After Width: | Height: | Size: 17 KiB |
|
Before Width: | Height: | Size: 18 KiB After Width: | Height: | Size: 16 KiB |
|
Before Width: | Height: | Size: 20 KiB After Width: | Height: | Size: 21 KiB |
|
Before Width: | Height: | Size: 19 KiB After Width: | Height: | Size: 20 KiB |
|
Before Width: | Height: | Size: 23 KiB After Width: | Height: | Size: 23 KiB |
|
Before Width: | Height: | Size: 27 KiB After Width: | Height: | Size: 24 KiB |
|
Before Width: | Height: | Size: 28 KiB After Width: | Height: | Size: 30 KiB |
|
Before Width: | Height: | Size: 28 KiB After Width: | Height: | Size: 29 KiB |
@@ -1,32 +1,28 @@
|
|||||||
package io.anuke.mindustry;
|
package io.anuke.mindustry;
|
||||||
|
|
||||||
import android.Manifest;
|
import android.*;
|
||||||
import android.content.Context;
|
import android.app.*;
|
||||||
import android.content.Intent;
|
import android.content.*;
|
||||||
import android.content.pm.ActivityInfo;
|
import android.content.pm.*;
|
||||||
import android.content.pm.PackageManager;
|
import android.net.*;
|
||||||
import android.net.Uri;
|
import android.os.Build.*;
|
||||||
import android.os.Build;
|
import android.os.*;
|
||||||
import android.os.Bundle;
|
import android.provider.Settings.*;
|
||||||
import android.provider.Settings.Secure;
|
import android.telephony.*;
|
||||||
import android.telephony.TelephonyManager;
|
import io.anuke.arc.*;
|
||||||
import io.anuke.arc.Core;
|
import io.anuke.arc.backends.android.surfaceview.*;
|
||||||
import io.anuke.arc.backends.android.surfaceview.AndroidApplication;
|
import io.anuke.arc.files.*;
|
||||||
import io.anuke.arc.backends.android.surfaceview.AndroidApplicationConfiguration;
|
import io.anuke.arc.function.*;
|
||||||
import io.anuke.arc.files.FileHandle;
|
import io.anuke.arc.scene.ui.layout.*;
|
||||||
import io.anuke.arc.function.Consumer;
|
import io.anuke.arc.util.*;
|
||||||
import io.anuke.arc.function.Predicate;
|
import io.anuke.arc.util.serialization.*;
|
||||||
import io.anuke.arc.scene.ui.layout.Unit;
|
import io.anuke.mindustry.game.Saves.*;
|
||||||
import io.anuke.arc.util.Strings;
|
import io.anuke.mindustry.io.*;
|
||||||
import io.anuke.arc.util.serialization.Base64Coder;
|
import io.anuke.mindustry.ui.dialogs.*;
|
||||||
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 java.util.*;
|
||||||
|
|
||||||
import static io.anuke.mindustry.Vars.*;
|
import static io.anuke.mindustry.Vars.*;
|
||||||
|
|
||||||
@@ -34,14 +30,16 @@ public class AndroidLauncher extends AndroidApplication{
|
|||||||
public static final int PERMISSION_REQUEST_CODE = 1;
|
public static final int PERMISSION_REQUEST_CODE = 1;
|
||||||
boolean doubleScaleTablets = true;
|
boolean doubleScaleTablets = true;
|
||||||
FileChooser chooser;
|
FileChooser chooser;
|
||||||
|
Runnable permCallback;
|
||||||
|
|
||||||
@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(){
|
||||||
@@ -71,13 +69,48 @@ public class AndroidLauncher extends AndroidApplication{
|
|||||||
}
|
}
|
||||||
|
|
||||||
@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 >= VERSION_CODES.Q){
|
||||||
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);
|
||||||
|
intent.addCategory(Intent.CATEGORY_OPENABLE);
|
||||||
|
intent.setType(extension.equals("zip") ? "application/zip" : "*/*");
|
||||||
|
addResultListener(i -> startActivityForResult(intent, i), (code, in) -> {
|
||||||
|
if(code == Activity.RESULT_OK && in != null && in.getData() != null){
|
||||||
|
Uri uri = in.getData();
|
||||||
|
|
||||||
|
if(uri.getPath().contains("(invalid)")) return;
|
||||||
|
|
||||||
|
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 if(VERSION.SDK_INT >= VERSION_CODES.M && !(checkSelfPermission(Manifest.permission.WRITE_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED &&
|
||||||
checkSelfPermission(Manifest.permission.READ_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED)){
|
checkSelfPermission(Manifest.permission.READ_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED)){
|
||||||
chooser.show();
|
chooser = new FileChooser(open ? "$open" : "$save", file -> file.extension().equalsIgnoreCase(extension), open, file -> {
|
||||||
chooser = null;
|
if(!open){
|
||||||
|
cons.accept(file.parent().child(file.nameWithoutExtension() + "." + extension));
|
||||||
}else{
|
}else{
|
||||||
|
cons.accept(file);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
ArrayList<String> perms = new ArrayList<>();
|
ArrayList<String> perms = new ArrayList<>();
|
||||||
if(checkSelfPermission(Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED){
|
if(checkSelfPermission(Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED){
|
||||||
perms.add(Manifest.permission.WRITE_EXTERNAL_STORAGE);
|
perms.add(Manifest.permission.WRITE_EXTERNAL_STORAGE);
|
||||||
@@ -86,6 +119,8 @@ public class AndroidLauncher extends AndroidApplication{
|
|||||||
perms.add(Manifest.permission.READ_EXTERNAL_STORAGE);
|
perms.add(Manifest.permission.READ_EXTERNAL_STORAGE);
|
||||||
}
|
}
|
||||||
requestPermissions(perms.toArray(new String[0]), PERMISSION_REQUEST_CODE);
|
requestPermissions(perms.toArray(new String[0]), PERMISSION_REQUEST_CODE);
|
||||||
|
}else{
|
||||||
|
super.showFileChooser(open, extension, cons);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -103,16 +138,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;
|
||||||
Unit.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());
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -123,7 +153,11 @@ public class AndroidLauncher extends AndroidApplication{
|
|||||||
if(i != PackageManager.PERMISSION_GRANTED) return;
|
if(i != PackageManager.PERMISSION_GRANTED) return;
|
||||||
}
|
}
|
||||||
if(chooser != null){
|
if(chooser != null){
|
||||||
chooser.show();
|
Core.app.post(chooser::show);
|
||||||
|
}
|
||||||
|
if(permCallback != null){
|
||||||
|
Core.app.post(permCallback);
|
||||||
|
permCallback = null;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -156,10 +190,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)
|
||||||
@@ -25,7 +30,7 @@ public class Annotations{
|
|||||||
}
|
}
|
||||||
|
|
||||||
/** Indicates that a method return or field cannot be null.*/
|
/** Indicates that a method return or field cannot be null.*/
|
||||||
@Target({ElementType.METHOD, ElementType.FIELD})
|
@Target({ElementType.METHOD, ElementType.FIELD, ElementType.PARAMETER, ElementType.LOCAL_VARIABLE})
|
||||||
@Retention(RetentionPolicy.SOURCE)
|
@Retention(RetentionPolicy.SOURCE)
|
||||||
public @interface NonNull{
|
public @interface NonNull{
|
||||||
|
|
||||||
|
|||||||
@@ -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("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,16 +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){
|
||||||
TypeSpec.Builder type = TypeSpec.classBuilder(classname).addModifiers(Modifier.PUBLIC);
|
suffix = suffix.isEmpty() ? "" : "-" + suffix;
|
||||||
MethodSpec.Builder load = MethodSpec.methodBuilder("load").addModifiers(Modifier.PUBLIC, Modifier.STATIC);
|
|
||||||
MethodSpec.Builder dispose = MethodSpec.methodBuilder("dispose").addModifiers(Modifier.PUBLIC, Modifier.STATIC);
|
|
||||||
|
|
||||||
|
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);
|
||||||
|
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 -> {
|
||||||
@@ -80,15 +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($S))", path.substring(path.lastIndexOf("/") + 1) + "/" + fname);
|
String filepath = path.substring(path.lastIndexOf("/") + 1) + "/" + fname;
|
||||||
|
|
||||||
|
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);
|
|
||||||
});
|
});
|
||||||
|
|
||||||
type.addMethod(load.build());
|
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.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";
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
100
build.gradle
@@ -8,7 +8,7 @@ buildscript{
|
|||||||
}
|
}
|
||||||
|
|
||||||
dependencies{
|
dependencies{
|
||||||
classpath 'com.mobidevelop.robovm:robovm-gradle-plugin:2.3.6'
|
classpath 'com.mobidevelop.robovm:robovm-gradle-plugin:2.3.7'
|
||||||
classpath "com.badlogicgames.gdx:gdx-tools:1.9.10"
|
classpath "com.badlogicgames.gdx:gdx-tools:1.9.10"
|
||||||
classpath "com.badlogicgames.packr:packr:2.1-SNAPSHOT"
|
classpath "com.badlogicgames.packr:packr:2.1-SNAPSHOT"
|
||||||
}
|
}
|
||||||
@@ -16,35 +16,29 @@ buildscript{
|
|||||||
|
|
||||||
allprojects{
|
allprojects{
|
||||||
version = 'release'
|
version = 'release'
|
||||||
|
apply plugin: 'maven'
|
||||||
|
group = 'com.github.Anuken'
|
||||||
|
|
||||||
ext{
|
ext{
|
||||||
versionNumber = '4'
|
versionNumber = '4'
|
||||||
versionModifier = 'beta'
|
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.6'
|
roboVMVersion = '2.3.7'
|
||||||
|
steamworksVersion = '1.8.0'
|
||||||
arcHash = null
|
arcHash = null
|
||||||
|
|
||||||
debugged = {
|
debugged = {
|
||||||
return new File(projectDir.parent, '../debug').exists() && !project.hasProperty("release") && project.hasProperty("args")
|
return new File(projectDir.parent, '../Mindustry-Debug').exists() && !project.hasProperty("release") && project.hasProperty("args")
|
||||||
}
|
}
|
||||||
|
|
||||||
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(file('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 ->
|
||||||
@@ -57,11 +51,36 @@ allprojects{
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
generateDeployName = { String platform ->
|
||||||
|
if(platform == "windows"){
|
||||||
|
platform += "64"
|
||||||
|
}
|
||||||
|
platform = platform.capitalize()
|
||||||
|
|
||||||
|
if(platform.endsWith("64") || platform.endsWith("32")){
|
||||||
|
platform = "${platform.substring(0, platform.length() - 2)}-${platform.substring(platform.length() - 2)}bit"
|
||||||
|
}
|
||||||
|
|
||||||
|
return "[${platform}]${getModifierString()}[${getNeatVersionString()}]${appName}"
|
||||||
|
}
|
||||||
|
|
||||||
getVersionString = {
|
getVersionString = {
|
||||||
String buildVersion = getBuildVersion()
|
String buildVersion = getBuildVersion()
|
||||||
return "$versionNumber-$versionModifier-$buildVersion"
|
return "$versionNumber-$versionModifier-$buildVersion"
|
||||||
}
|
}
|
||||||
|
|
||||||
|
getNeatVersionString = {
|
||||||
|
String buildVersion = getBuildVersion()
|
||||||
|
return "v$buildVersion"
|
||||||
|
}
|
||||||
|
|
||||||
|
getModifierString = {
|
||||||
|
if(versionModifier != "release"){
|
||||||
|
return "[${versionModifier.toUpperCase()}]"
|
||||||
|
}
|
||||||
|
return ""
|
||||||
|
}
|
||||||
|
|
||||||
getBuildVersion = {
|
getBuildVersion = {
|
||||||
if(!project.hasProperty("buildversion")) return "custom build"
|
if(!project.hasProperty("buildversion")) return "custom build"
|
||||||
return project.getProperties()["buildversion"]
|
return project.getProperties()["buildversion"]
|
||||||
@@ -94,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
|
||||||
@@ -122,29 +142,14 @@ 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 arcModule("backends:backend-lwjgl3")
|
compile "com.code-disaster.steamworks4j:steamworks4j:$steamworksVersion"
|
||||||
compile 'com.github.MinnDevelopment:java-discord-rpc:v2.0.2'
|
compile "com.code-disaster.steamworks4j:steamworks4j-server:$steamworksVersion"
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
project(":desktop-sdl"){
|
|
||||||
apply plugin: "java"
|
|
||||||
|
|
||||||
dependencies{
|
|
||||||
compile project(":core")
|
|
||||||
compile project(":net")
|
|
||||||
|
|
||||||
if(debugged()) compile project(":debug")
|
|
||||||
|
|
||||||
compile "com.badlogicgames.gdx:gdx-platform:$gdxVersion:natives-desktop"
|
|
||||||
compile "com.badlogicgames.gdx:gdx-freetype-platform:$gdxVersion:natives-desktop"
|
|
||||||
|
|
||||||
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'
|
||||||
@@ -164,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'
|
||||||
@@ -174,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")
|
||||||
@@ -190,7 +194,9 @@ project(":core"){
|
|||||||
apply plugin: "java"
|
apply plugin: "java"
|
||||||
|
|
||||||
task preGen{
|
task preGen{
|
||||||
|
outputs.upToDateWhen{ false }
|
||||||
generateLocales()
|
generateLocales()
|
||||||
|
writeVersion()
|
||||||
}
|
}
|
||||||
|
|
||||||
dependencies{
|
dependencies{
|
||||||
@@ -221,6 +227,7 @@ project(":core"){
|
|||||||
|
|
||||||
compileJava.dependsOn(preGen)
|
compileJava.dependsOn(preGen)
|
||||||
|
|
||||||
|
compile "org.lz4:lz4-java:1.4.1"
|
||||||
compile arcModule("arc-core")
|
compile arcModule("arc-core")
|
||||||
compile arcModule("extensions:freetype")
|
compile arcModule("extensions:freetype")
|
||||||
compile arcModule("extensions:arcnet")
|
compile arcModule("extensions:arcnet")
|
||||||
@@ -236,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")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -264,7 +270,6 @@ project(":tools"){
|
|||||||
dependencies{
|
dependencies{
|
||||||
compile project(":core")
|
compile project(":core")
|
||||||
|
|
||||||
//for render tests
|
|
||||||
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"
|
||||||
|
|
||||||
@@ -281,12 +286,23 @@ project(":annotations"){
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
project(":net"){
|
task deployAll{
|
||||||
apply plugin: "java"
|
task cleanDeployOutput{
|
||||||
|
doFirst{
|
||||||
|
if("${getBuildVersion()}" == "custom build" || "${getBuildVersion()}" == "") throw new IllegalArgumentException("----\n\nSET A BUILD NUMBER FIRST!\n\n----")
|
||||||
|
if(!project.hasProperty("release")) throw new IllegalArgumentException("----\n\nSET THE RELEASE PROJECT PROPERTY FIRST!\n\n----")
|
||||||
|
|
||||||
dependencies{
|
delete{
|
||||||
compile project(":core")
|
delete "deploy/"
|
||||||
compile "org.lz4:lz4-java:1.4.1"
|
|
||||||
compile 'com.github.Anuken:WaifUPnP:05eb46bc577fd7674596946ba288c96c0cedd893'
|
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
dependsOn cleanDeployOutput
|
||||||
|
dependsOn "desktop:packrLinux64"
|
||||||
|
dependsOn "desktop:packrWindows64"
|
||||||
|
dependsOn "desktop:packrWindows32"
|
||||||
|
dependsOn "desktop:packrMacOS"
|
||||||
|
dependsOn "server:deploy"
|
||||||
|
dependsOn "android:deploy"
|
||||||
}
|
}
|
||||||
|
|||||||
|
After Width: | Height: | Size: 2.3 KiB |
|
After Width: | Height: | Size: 2.3 KiB |
|
After Width: | Height: | Size: 2.3 KiB |
|
After Width: | Height: | Size: 2.4 KiB |
|
After Width: | Height: | Size: 2.4 KiB |
|
After Width: | Height: | Size: 2.5 KiB |
|
After Width: | Height: | Size: 2.5 KiB |
|
After Width: | Height: | Size: 2.5 KiB |
|
After Width: | Height: | Size: 2.2 KiB |
|
After Width: | Height: | Size: 2.1 KiB |
|
After Width: | Height: | Size: 2.1 KiB |
|
After Width: | Height: | Size: 2.2 KiB |
|
After Width: | Height: | Size: 2.0 KiB |
|
After Width: | Height: | Size: 2.0 KiB |
|
After Width: | Height: | Size: 2.0 KiB |
|
After Width: | Height: | Size: 2.0 KiB |
|
After Width: | Height: | Size: 2.2 KiB |
|
After Width: | Height: | Size: 2.2 KiB |
|
After Width: | Height: | Size: 2.1 KiB |
|
After Width: | Height: | Size: 2.2 KiB |
|
Before Width: | Height: | Size: 2.0 KiB After Width: | Height: | Size: 2.0 KiB |
|
Before Width: | Height: | Size: 2.7 KiB After Width: | Height: | Size: 2.7 KiB |
|
Before Width: | Height: | Size: 1.8 KiB After Width: | Height: | Size: 1.8 KiB |
|
Before Width: | Height: | Size: 1.7 KiB After Width: | Height: | Size: 2.1 KiB |
|
Before Width: | Height: | Size: 1.9 KiB After Width: | Height: | Size: 1.9 KiB |
|
Before Width: | Height: | Size: 1.7 KiB After Width: | Height: | Size: 1.7 KiB |
|
Before Width: | Height: | Size: 1.7 KiB After Width: | Height: | Size: 1.7 KiB |
|
Before Width: | Height: | Size: 1.7 KiB After Width: | Height: | Size: 1.8 KiB |
|
Before Width: | Height: | Size: 2.8 KiB After Width: | Height: | Size: 2.9 KiB |
|
Before Width: | Height: | Size: 2.8 KiB After Width: | Height: | Size: 2.7 KiB |
BIN
core/assets-raw/sprites/blocks/extra/message.png
Normal file
|
After Width: | Height: | Size: 2.3 KiB |
|
Before Width: | Height: | Size: 2.3 KiB After Width: | Height: | Size: 2.7 KiB |
BIN
core/assets-raw/sprites/blocks/units/command-center.png
Normal file
|
After Width: | Height: | Size: 4.8 KiB |
BIN
core/assets-raw/sprites/blocks/units/rally-point.png
Normal file
|
After Width: | Height: | Size: 6.3 KiB |
BIN
core/assets-raw/sprites/ui/button-trans.9.png
Normal file
|
After Width: | Height: | Size: 3.1 KiB |
|
Before Width: | Height: | Size: 4.9 KiB After Width: | Height: | Size: 5.5 KiB |
|
Before Width: | Height: | Size: 91 B After Width: | Height: | Size: 91 B |
BIN
core/assets-raw/sprites/ui/icons/icon-command-attack.png
Normal file
|
After Width: | Height: | Size: 109 B |
BIN
core/assets-raw/sprites/ui/icons/icon-command-patrol.png
Normal file
|
After Width: | Height: | Size: 104 B |
BIN
core/assets-raw/sprites/ui/icons/icon-command-rally.png
Normal file
|
After Width: | Height: | Size: 95 B |
BIN
core/assets-raw/sprites/ui/icons/icon-command-retreat.png
Normal file
|
After Width: | Height: | Size: 94 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 |
|
Before Width: | Height: | Size: 165 B After Width: | Height: | Size: 2.7 KiB |
|
Before Width: | Height: | Size: 297 B After Width: | Height: | Size: 2.7 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}
|
||||||
@@ -25,9 +31,6 @@ 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.\n\n[scarlet]DO 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.\n\n[scarlet]DO IT.
|
|
||||||
|
|
||||||
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}
|
||||||
@@ -46,10 +49,21 @@ newgame = New Game
|
|||||||
none = <none>
|
none = <none>
|
||||||
minimap = Minimap
|
minimap = Minimap
|
||||||
close = Close
|
close = Close
|
||||||
|
website = Website
|
||||||
quit = Quit
|
quit = Quit
|
||||||
|
save.quit = Save & 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.
|
||||||
@@ -60,28 +74,35 @@ 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.
|
||||||
server.kicked.idInUse = You are already on this server! Connecting with two accounts is not permitted.
|
server.kicked.idInUse = You are already on this server! Connecting with two accounts is not permitted.
|
||||||
server.kicked.customClient = This server does not support custom builds. Download an official version.
|
server.kicked.customClient = This server does not support custom builds. Download an official version.
|
||||||
server.kicked.gameover = Game over!
|
server.kicked.gameover = Game over!
|
||||||
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.
|
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.
|
||||||
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 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.
|
||||||
@@ -102,28 +123,33 @@ 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?
|
||||||
|
confirmvotekick = Are you sure you want to vote-kick this player?
|
||||||
confirmunban = Are you sure you want to unban this player?
|
confirmunban = Are you sure you want to unban this player?
|
||||||
confirmadmin = Are you sure you want to make this player an admin?
|
confirmadmin = Are you sure you want to make this player an admin?
|
||||||
confirmunadmin = Are you sure you want to remove admin status from this player?
|
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?
|
||||||
overwrite = Overwrite
|
overwrite = Overwrite
|
||||||
save.none = No saves found!
|
save.none = No saves found!
|
||||||
saveload = [accent]Saving...
|
saveload = Saving...
|
||||||
savefail = Failed to save game!
|
savefail = Failed to save game!
|
||||||
save.delete.confirm = Are you sure you want to delete this save?
|
save.delete.confirm = Are you sure you want to delete this save?
|
||||||
save.delete = Delete
|
save.delete = Delete
|
||||||
@@ -137,6 +163,7 @@ save.rename = Rename
|
|||||||
save.rename.text = New name:
|
save.rename.text = New name:
|
||||||
selectslot = Select a save.
|
selectslot = Select a save.
|
||||||
slot = [accent]Slot {0}
|
slot = [accent]Slot {0}
|
||||||
|
editmessage = Edit Message
|
||||||
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]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.
|
||||||
empty = <empty>
|
empty = <empty>
|
||||||
on = On
|
on = On
|
||||||
@@ -144,12 +171,13 @@ 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.
|
||||||
confirm = Confirm
|
confirm = Confirm
|
||||||
delete = Delete
|
delete = Delete
|
||||||
|
view.workshop = View In Workshop
|
||||||
ok = OK
|
ok = OK
|
||||||
open = Open
|
open = Open
|
||||||
customize = Customize Rules
|
customize = Customize Rules
|
||||||
@@ -157,7 +185,15 @@ 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.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?
|
||||||
|
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.[]
|
||||||
loading = [accent]Loading...
|
loading = [accent]Loading...
|
||||||
saving = [accent]Saving...
|
saving = [accent]Saving...
|
||||||
wave = [accent]Wave {0}
|
wave = [accent]Wave {0}
|
||||||
@@ -174,10 +210,15 @@ custom = Custom
|
|||||||
builtin = Built-In
|
builtin = Built-In
|
||||||
map.delete.confirm = Are you sure you want to delete this map? This action cannot be undone!
|
map.delete.confirm = Are you sure you want to delete this map? This action cannot be undone!
|
||||||
map.random = [accent]Random Map
|
map.random = [accent]Random Map
|
||||||
map.nospawn = This map does not have any cores for the player to spawn in! Add a[ROYAL] blue[] core to this map in the editor.
|
map.nospawn = This map does not have any cores for the player to spawn in! Add a[accent] orange[] core 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-blue[] 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
|
||||||
@@ -185,11 +226,14 @@ editor.oregen.info = Ore Generation:
|
|||||||
editor.mapinfo = Map Info
|
editor.mapinfo = Map Info
|
||||||
editor.author = Author:
|
editor.author = Author:
|
||||||
editor.description = Description:
|
editor.description = Description:
|
||||||
|
editor.nodescription = A map must have a description of at least 4 characters before being published.
|
||||||
editor.waves = Waves:
|
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>
|
||||||
@@ -206,15 +250,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
|
||||||
@@ -233,7 +279,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
|
||||||
@@ -247,6 +293,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
|
||||||
@@ -309,6 +356,7 @@ ping = Ping: {0}ms
|
|||||||
language.restart = Please restart your game for the language settings to take effect.
|
language.restart = Please restart your game for the language settings to take effect.
|
||||||
settings = Settings
|
settings = Settings
|
||||||
tutorial = Tutorial
|
tutorial = Tutorial
|
||||||
|
tutorial.retake = Re-Take Tutorial
|
||||||
editor = Editor
|
editor = Editor
|
||||||
mapeditor = Map Editor
|
mapeditor = Map Editor
|
||||||
donate = Donate
|
donate = Donate
|
||||||
@@ -325,9 +373,11 @@ launch.title = Launch Successful
|
|||||||
launch.next = [lightgray]next opportunity at wave {0}
|
launch.next = [lightgray]next opportunity at wave {0}
|
||||||
launch.unable2 = [scarlet]Unable to LAUNCH.[]
|
launch.unable2 = [scarlet]Unable to LAUNCH.[]
|
||||||
launch.confirm = This will launch all resources in your core.\nYou will not be able to return to this base.
|
launch.confirm = This will launch all resources in your core.\nYou will not be able to return to this base.
|
||||||
|
launch.skip.confirm = If you skip now, you will not be able to launch until later waves.
|
||||||
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.
|
||||||
@@ -365,7 +415,7 @@ 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 fridgid 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.
|
||||||
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 = 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.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 = 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.
|
||||||
@@ -380,6 +430,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
|
||||||
@@ -427,18 +478,21 @@ 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
|
||||||
blocks.ammo = Ammo
|
blocks.ammo = Ammo
|
||||||
|
|
||||||
|
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}%
|
||||||
bar.powerbalance = Power: {0}/s
|
bar.powerbalance = Power: {0}/s
|
||||||
|
bar.powerstored = Stored: {0}/{1}
|
||||||
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
|
||||||
@@ -485,6 +539,7 @@ setting.antialias.name = Antialias[lightgray] (requires restart)[]
|
|||||||
setting.indicators.name = Enemy/Ally Indicators
|
setting.indicators.name = Enemy/Ally Indicators
|
||||||
setting.autotarget.name = Auto-Target
|
setting.autotarget.name = Auto-Target
|
||||||
setting.keyboard.name = Mouse+Keyboard Controls
|
setting.keyboard.name = Mouse+Keyboard Controls
|
||||||
|
setting.touchscreen.name = Touchscreen Controls
|
||||||
setting.fpscap.name = Max FPS
|
setting.fpscap.name = Max FPS
|
||||||
setting.fpscap.none = None
|
setting.fpscap.none = None
|
||||||
setting.fpscap.text = {0} FPS
|
setting.fpscap.text = {0} FPS
|
||||||
@@ -509,13 +564,16 @@ setting.lasers.name = Show Power Lasers
|
|||||||
setting.pixelate.name = Pixelate[lightgray] (disables animations)
|
setting.pixelate.name = Pixelate[lightgray] (disables animations)
|
||||||
setting.minimap.name = Show Minimap
|
setting.minimap.name = Show Minimap
|
||||||
setting.musicvol.name = Music Volume
|
setting.musicvol.name = Music Volume
|
||||||
|
setting.ambientvol.name = Ambient Volume
|
||||||
setting.mutemusic.name = Mute Music
|
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}[] settings...
|
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
|
||||||
keybind.title = Rebind Keys
|
keybind.title = Rebind Keys
|
||||||
@@ -524,8 +582,8 @@ category.general.name = General
|
|||||||
category.view.name = View
|
category.view.name = View
|
||||||
category.multiplayer.name = Multiplayer
|
category.multiplayer.name = Multiplayer
|
||||||
command.attack = Attack
|
command.attack = Attack
|
||||||
|
command.rally = Rally
|
||||||
command.retreat = Retreat
|
command.retreat = Retreat
|
||||||
command.patrol = Patrol
|
|
||||||
keybind.gridMode.name = Block Select
|
keybind.gridMode.name = Block Select
|
||||||
keybind.gridModeShift.name = Category Select
|
keybind.gridModeShift.name = Category Select
|
||||||
keybind.press = Press a key...
|
keybind.press = Press a key...
|
||||||
@@ -533,6 +591,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
|
||||||
@@ -743,10 +802,13 @@ block.hail.name = Hail
|
|||||||
block.lancer.name = Lancer
|
block.lancer.name = Lancer
|
||||||
block.conveyor.name = Conveyor
|
block.conveyor.name = Conveyor
|
||||||
block.titanium-conveyor.name = Titanium Conveyor
|
block.titanium-conveyor.name = Titanium Conveyor
|
||||||
|
block.armored-conveyor.name = Armored Conveyor
|
||||||
|
block.armored-conveyor.description = Moves items at the same speed as titanium conveyors, but possesses more armor. Does not accept inputs from the sides from anything but other conveyors.
|
||||||
block.junction.name = Junction
|
block.junction.name = Junction
|
||||||
block.router.name = Router
|
block.router.name = Router
|
||||||
block.distributor.name = Distributor
|
block.distributor.name = Distributor
|
||||||
block.sorter.name = Sorter
|
block.sorter.name = Sorter
|
||||||
|
block.message.name = Message
|
||||||
block.overflow-gate.name = Overflow Gate
|
block.overflow-gate.name = Overflow Gate
|
||||||
block.silicon-smelter.name = Silicon Smelter
|
block.silicon-smelter.name = Silicon Smelter
|
||||||
block.phase-weaver.name = Phase Weaver
|
block.phase-weaver.name = Phase Weaver
|
||||||
@@ -799,6 +861,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
|
||||||
@@ -861,27 +924,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.begin = Your mission here is to eradicate the[lightgray] enemy[].\n\nBegin by[accent] mining copper[]. Tap a copper ore vein near your core to do this.
|
tutorial.next = [lightgray]<Tap to continue>
|
||||||
tutorial.drill = Mining manually is inefficient.\n[accent]Drills []can mine automatically.\nPlace one on a copper vein.
|
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.conveyor = [accent]Conveyors[] are used to transport items to the core.\nMake a line of conveyors from the drill to the core.
|
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.morecopper = More copper is required.\n\nEither mine it manually, or place more drills.
|
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.turret = Defensive structures must be built to repel the[lightgray] enemy[].\nBuild a duo turret near your base.
|
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.drillturret = Duo turrets require[accent] copper ammo []to shoot.\nPlace a drill next to the turret to supply it with mined copper.
|
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.waves = The[lightgray] enemy[] approaches.\n\nDefend your core for 2 waves. Build more turrets.
|
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.lead = More ores are available. Explore and mine[accent] lead[].\n\nDrag from your unit to the core to transfer resources.
|
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.smelter = Copper and lead are weak metals.\nSuperior[accent] Dense Alloy[] can be created in a smelter.\n\nBuild one.
|
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.densealloy = The smelter will now produce alloy.\nGet some.\nImprove the production if necessary.
|
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.siliconsmelter = The core will now create a[accent] spirit drone[] for mining and repairing blocks.\n\nFactories for other units can be created with [accent] silicon.\nMake a silicon smelter.
|
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.silicondrill = Silicon requires[accent] coal[] and[accent] sand[].\nStart by making drills.
|
tutorial.unpause = Now press space again to unpause.
|
||||||
tutorial.generator = This technology requires power.\nCreate a[accent] combustion generator[] for it.
|
tutorial.unpause.mobile = Now press it again to unpause.
|
||||||
tutorial.generatordrill = Combustion generators need fuel.\nFuel it with coal from a drill.
|
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.node = Power requires transport.\nCreate a[accent] power node[] next to your combustion generator to transfer its power.
|
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.nodelink = Power can be transferred through contacting power blocks and generators, or by linked power nodes.\n\nLink power by tapping the node and selecting the generator and silicon smelter.
|
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.silicon = Silicon is being produced. Get some.\n\nImproving the production system is advised.
|
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.daggerfactory = Construct a[accent] dagger mech factory.[]\n\nThis will be used to create attack mechs.
|
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.router = Factories need resources to function.\nCreate a router to split conveyor resources.
|
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.dagger = Link power nodes to the factory.\nOnce requirements are met, a mech will be created.\n\nCreate more drills, generators and conveyors as necessary.
|
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.battle = The[lightgray] enemy[] has revealed their core.\nDestroy it with your unit and dagger mechs.
|
|
||||||
|
|
||||||
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.
|
||||||
@@ -919,13 +981,10 @@ unit.crawler.description = A ground unit consisting of a stripped-down frame wit
|
|||||||
unit.titan.description = An advanced, armored ground unit. Attacks both ground and air targets. Equipped with two miniature Scorch-class flamethrowers.
|
unit.titan.description = An advanced, armored ground unit. Attacks both ground and air targets. Equipped with two miniature Scorch-class flamethrowers.
|
||||||
unit.fortress.description = A heavy artillery mech. Equipped with two modified Hail-type cannons for long-range assault on enemy structures and units.
|
unit.fortress.description = A heavy artillery mech. Equipped with two modified Hail-type cannons for long-range assault on enemy structures and units.
|
||||||
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 = A heavy mech designed to take down structures. Fires a stream of slag at enemy fortifications, melting them and setting volatiles on fire.
|
||||||
unit.chaos-array.description =
|
|
||||||
unit.eradicator.description =
|
|
||||||
unit.wraith.description = A fast, hit-and-run interceptor unit. Targets power generators.
|
unit.wraith.description = A fast, hit-and-run interceptor unit. Targets power generators.
|
||||||
unit.ghoul.description = A heavy carpet bomber. Rips through enemy structures, targeting critital infrastructure.
|
unit.ghoul.description = A heavy carpet bomber. Rips through enemy structures, targeting critical infrastructure.
|
||||||
unit.revenant.description = A heavy, hovering missile array.
|
unit.revenant.description = A heavy, hovering missile array.
|
||||||
unit.lich.description =
|
block.message.description = Stores a message. Used for communication between allies.
|
||||||
unit.reaper.description =
|
|
||||||
block.graphite-press.description = Compresses chunks of coal into pure sheets of graphite.
|
block.graphite-press.description = Compresses chunks of coal into pure sheets of graphite.
|
||||||
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 = An upgraded version of the graphite press. Employs water and power to process coal quickly and efficiently.
|
||||||
block.silicon-smelter.description = Reduces sand with pure coal. Produces silicon.
|
block.silicon-smelter.description = Reduces sand with pure coal. Produces silicon.
|
||||||
@@ -970,7 +1029,7 @@ block.junction.description = Acts as a bridge for two crossing conveyor belts. U
|
|||||||
block.bridge-conveyor.description = Advanced item transport block. Allows transporting items over up to 3 tiles of any terrain or building.
|
block.bridge-conveyor.description = Advanced item transport block. Allows transporting items over up to 3 tiles of any terrain or building.
|
||||||
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 = Advanced item transport block. Uses power to teleport items to a connected phase conveyor over several tiles.
|
||||||
block.sorter.description = Sorts items. If an item matches the selection, it is allowed to pass. Otherwise, the item is outputted to the left and right.
|
block.sorter.description = Sorts items. If an item matches the selection, it is allowed to pass. Otherwise, the item is outputted to the left and right.
|
||||||
block.router.description = Accepts items, then outputs them to up to 3 other directions equally. Useful for splitting the materials from one source to multiple targets.
|
block.router.description = Accepts items, then outputs them to up to 3 other directions equally. Useful for splitting the materials from one source to multiple targets.\n\n[scarlet]Never use next to production inputs, as they will get clogged by output.[]
|
||||||
block.distributor.description = An advanced router. Splits items to up to 7 other directions equally.
|
block.distributor.description = An advanced router. Splits items to up to 7 other directions equally.
|
||||||
block.overflow-gate.description = A combination splitter and router. Only outputs to the left and right if the front path is blocked.
|
block.overflow-gate.description = A combination splitter and router. Only outputs to the left and right if the front path is blocked.
|
||||||
block.mass-driver.description = The ultimate item transport block. Collects several items and then shoots them to another mass driver over a long range. Requires power to operate.
|
block.mass-driver.description = The ultimate item transport block. Collects several items and then shoots them to another mass driver over a long range. Requires power to operate.
|
||||||
@@ -984,7 +1043,7 @@ block.liquid-tank.description = Stores a large amount of liquids. Use for creati
|
|||||||
block.liquid-junction.description = Acts as a bridge for two crossing conduits. Useful in situations with two different conduits carrying different liquids to different locations.
|
block.liquid-junction.description = Acts as a bridge for two crossing conduits. Useful in situations with two different conduits carrying different liquids to different locations.
|
||||||
block.bridge-conduit.description = Advanced liquid transport block. Allows transporting liquids over up to 3 tiles of any terrain or building.
|
block.bridge-conduit.description = Advanced liquid transport block. Allows transporting liquids over up to 3 tiles of any terrain or building.
|
||||||
block.phase-conduit.description = Advanced liquid transport block. Uses power to teleport liquids to a connected phase conduit over several tiles.
|
block.phase-conduit.description = Advanced liquid transport block. Uses power to teleport liquids to a connected phase conduit over several tiles.
|
||||||
block.power-node.description = Transmits power to connected nodes. Up to four power sources, sinks or nodes can be connected. The node will receive power from or supply power to any adjacent blocks.
|
block.power-node.description = Transmits power to connected nodes. The node will receive power from or supply power to any adjacent blocks.
|
||||||
block.power-node-large.description = An advanced power node with greater range and more connections.
|
block.power-node-large.description = An advanced power node with greater range and more connections.
|
||||||
block.surge-tower.description = An extremely long-range power node with fewer available connections.
|
block.surge-tower.description = An extremely long-range power node with fewer available connections.
|
||||||
block.battery.description = Stores power as a buffer in times of surplus energy. Outputs power in times of deficit.
|
block.battery.description = Stores power as a buffer in times of surplus energy. Outputs power in times of deficit.
|
||||||
@@ -998,7 +1057,7 @@ block.solar-panel.description = Provides a small amount of power from the sun.
|
|||||||
block.solar-panel-large.description = A significantly more efficient version of the standard solar panel.
|
block.solar-panel-large.description = A significantly more efficient version of the standard solar panel.
|
||||||
block.thorium-reactor.description = Generates significant amounts of power from 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 = Generates significant amounts of power from 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.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 = An advanced generator, capable of creating massive amounts of power at peak efficiency. Requires a significant power input to kickstart the process.
|
||||||
block.mechanical-drill.description = A cheap drill. When placed on appropriate tiles, outputs items at a slow pace indefinitely. Only capable of mining copper, lead and coal.
|
block.mechanical-drill.description = A cheap drill. When placed on appropriate tiles, outputs items at a slow pace indefinitely. Only capable of mining basic resources.
|
||||||
block.pneumatic-drill.description = An improved drill, capable of mining titanium. Mines at a faster pace than a mechanical drill.
|
block.pneumatic-drill.description = An improved drill, capable of mining titanium. Mines at a faster pace than a mechanical drill.
|
||||||
block.laser-drill.description = Allows drilling even faster through laser technology, but requires power. Capable of mining thorium.
|
block.laser-drill.description = Allows drilling even faster through laser technology, but requires power. Capable of mining thorium.
|
||||||
block.blast-drill.description = The ultimate drill. Requires large amounts of power.
|
block.blast-drill.description = The ultimate drill. Requires large amounts of power.
|
||||||
@@ -1023,10 +1082,11 @@ block.arc.description = A small close-range electric turret. Fires arcs of elect
|
|||||||
block.swarmer.description = A medium-sized missile turret. Attacks both air and ground enemies. Fires homing missiles.
|
block.swarmer.description = A medium-sized missile turret. Attacks both air and ground enemies. Fires homing missiles.
|
||||||
block.salvo.description = A larger, more advanced version of the Duo turret. Fires quick salvos of bullets at the enemy.
|
block.salvo.description = A larger, more advanced version of the Duo turret. Fires quick salvos of bullets at the enemy.
|
||||||
block.fuse.description = A large, close-range energy turret. Fires three piercing beams at nearby enemies.
|
block.fuse.description = A large, close-range energy turret. Fires three piercing beams at nearby enemies.
|
||||||
block.ripple.description = An extremely poweful artillery turret. Shoots clusters of shells at enemies over long distances.
|
block.ripple.description = An extremely powerful artillery turret. Shoots clusters of shells at enemies over long distances.
|
||||||
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.
|
||||||
|
|||||||