Compare commits
183 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
69944a2b63 | ||
|
|
0ceb58a105 | ||
|
|
5e8da856e7 | ||
|
|
ee412e1994 | ||
|
|
02736524bd | ||
|
|
c357b97b3b | ||
|
|
dbe7251c6b | ||
|
|
7ae90f655c | ||
|
|
669ce6dfbb | ||
|
|
4dc55e5594 | ||
|
|
4b824f7a4c | ||
|
|
3435132e87 | ||
|
|
d49b15b2a0 | ||
|
|
0c59553b3d | ||
|
|
4a50192937 | ||
|
|
f65ab00250 | ||
|
|
f71c3af2e1 | ||
|
|
77fb9e3d3e | ||
|
|
c1d6674797 | ||
|
|
659aaba0b9 | ||
|
|
a3816f6355 | ||
|
|
4829f040c2 | ||
|
|
59826f5189 | ||
|
|
a6fac9e56a | ||
|
|
68f0ef1bd2 | ||
|
|
d53882a086 | ||
|
|
7c7306d37b | ||
|
|
d5a9938354 | ||
|
|
3fad378b69 | ||
|
|
afb47344c6 | ||
|
|
5ba7e1d08b | ||
|
|
681347e933 | ||
|
|
f1bf8a0f1a | ||
|
|
874b41cb46 | ||
|
|
d3876b6376 | ||
|
|
f72f2bdf5d | ||
|
|
af91e17b13 | ||
|
|
69bfd8f54d | ||
|
|
369c3b569c | ||
|
|
8480e656b9 | ||
|
|
fb29324905 | ||
|
|
ed88633712 | ||
|
|
cd456f80a4 | ||
|
|
6d61515e28 | ||
|
|
38af936e3f | ||
|
|
d59f5ddc59 | ||
|
|
6c07c5006a | ||
|
|
d4d060a500 | ||
|
|
55e43761e9 | ||
|
|
b1edaa1408 | ||
|
|
d8d9762998 | ||
|
|
dd93284062 | ||
|
|
19c76fc741 | ||
|
|
1013455b0f | ||
|
|
066e4380e1 | ||
|
|
55da9df2a1 | ||
|
|
4b26c57a20 | ||
|
|
d0491dd68a | ||
|
|
cd8cc34c31 | ||
|
|
0249ebf718 | ||
|
|
7fb4eeb998 | ||
|
|
0cd7313523 | ||
|
|
5c3fc2a6ba | ||
|
|
19f888061f | ||
|
|
4e8a02be7d | ||
|
|
2231062c19 | ||
|
|
fb4faa15bb | ||
|
|
e6d05926dd | ||
|
|
ca9f18325c | ||
|
|
bd96ae5a48 | ||
|
|
cf1cc2ca49 | ||
|
|
bbaaa91575 | ||
|
|
41b21c81a0 | ||
|
|
44842d3221 | ||
|
|
d9c7665aca | ||
|
|
565b79d1b2 | ||
|
|
f30dc7dcd9 | ||
|
|
e4cdf515c9 | ||
|
|
ad3463cbc4 | ||
|
|
db733bced6 | ||
|
|
7aa71a7201 | ||
|
|
6fe55661ed | ||
|
|
af89efcfc4 | ||
|
|
82493c596d | ||
|
|
5a3fbf33df | ||
|
|
5bed0f3bcc | ||
|
|
87f6ff7be6 | ||
|
|
fa56996e10 | ||
|
|
b867cdb8b9 | ||
|
|
3bac32e04a | ||
|
|
c4c0f45228 | ||
|
|
d981bb95b9 | ||
|
|
c9f0a59339 | ||
|
|
ec58e868fd | ||
|
|
aa5152ac70 | ||
|
|
2cc627e7d0 | ||
|
|
8653e7bbb1 | ||
|
|
4fb7430fb7 | ||
|
|
e90c8c4d3e | ||
|
|
06e6deae42 | ||
|
|
38fe99f10e | ||
|
|
05ab62f038 | ||
|
|
168011586b | ||
|
|
b5f1e566b2 | ||
|
|
9b6fb2f382 | ||
|
|
24bb2428e7 | ||
|
|
75ba33abc0 | ||
|
|
ff54629550 | ||
|
|
b492c7ae27 | ||
|
|
5d04f93a88 | ||
|
|
5651d1b023 | ||
|
|
6822e3f5b8 | ||
|
|
3cbb02f9fb | ||
|
|
0f79298c28 | ||
|
|
8f4bd09635 | ||
|
|
0a9cad2ea6 | ||
|
|
dc21adfda5 | ||
|
|
a7bfe18f4a | ||
|
|
9cc76a148b | ||
|
|
1d95a255bc | ||
|
|
3f8d412d1c | ||
|
|
b2c35d45c3 | ||
|
|
35ab90e445 | ||
|
|
9bfb5216f9 | ||
|
|
b10656294e | ||
|
|
316f4d471f | ||
|
|
ef0b56eb22 | ||
|
|
e640042e5d | ||
|
|
2c0d2c5e22 | ||
|
|
9eed39c2ae | ||
|
|
e8d89b6c43 | ||
|
|
494c3ffbc4 | ||
|
|
40d27c787c | ||
|
|
2fe5b44698 | ||
|
|
5cc32b9001 | ||
|
|
d481af43c7 | ||
|
|
1cd43f938f | ||
|
|
528f5295c2 | ||
|
|
aaedeea870 | ||
|
|
c684c32abe | ||
|
|
34df9cca2c | ||
|
|
c678b53d3f | ||
|
|
ea30cc7d19 | ||
|
|
a2772d09f3 | ||
|
|
7f2c7685b4 | ||
|
|
7e80a60e65 | ||
|
|
44544020ec | ||
|
|
4e2d2ee378 | ||
|
|
7aafa8b150 | ||
|
|
bbadf6795e | ||
|
|
9ddfd650dd | ||
|
|
cf9cda4936 | ||
|
|
4e43d2a96b | ||
|
|
d68c8fe72c | ||
|
|
c9d0619289 | ||
|
|
8ea33946c4 | ||
|
|
bef7394004 | ||
|
|
4042bf042e | ||
|
|
643b698c30 | ||
|
|
aba3e3985a | ||
|
|
91f679f762 | ||
|
|
3eeed507cc | ||
|
|
988e1d6e30 | ||
|
|
04b4aabcf6 | ||
|
|
d97fe47206 | ||
|
|
0d8748a6ce | ||
|
|
b360a39fcf | ||
|
|
70b071fa26 | ||
|
|
64badb2cb7 | ||
|
|
3da6634242 | ||
|
|
4b8d072854 | ||
|
|
32abd991e7 | ||
|
|
3294f800be | ||
|
|
74e3dc2d7d | ||
|
|
a7a49a823b | ||
|
|
82f43a362f | ||
|
|
f7eea51066 | ||
|
|
98c35c5291 | ||
|
|
33c1579e9c | ||
|
|
e482c2c318 | ||
|
|
5b387e7e17 | ||
|
|
c7d735bf56 | ||
|
|
1f4dbd0024 |
4
.gitignore
vendored
@@ -20,6 +20,10 @@ logs/
|
|||||||
/tests/build/
|
/tests/build/
|
||||||
/server/build/
|
/server/build/
|
||||||
changelog
|
changelog
|
||||||
|
saves/
|
||||||
|
core/assets/saves/
|
||||||
|
/core/assets/saves/
|
||||||
|
steam_appid.txt
|
||||||
/test_files/
|
/test_files/
|
||||||
/annotations/build/
|
/annotations/build/
|
||||||
/android/assets/mindustry-maps/
|
/android/assets/mindustry-maps/
|
||||||
|
|||||||
@@ -9,14 +9,14 @@ android:
|
|||||||
script:
|
script:
|
||||||
- git clone --depth=1 --branch=master https://github.com/Anuken/MindustryBuilds ../MindustryBuilds
|
- git clone --depth=1 --branch=master https://github.com/Anuken/MindustryBuilds ../MindustryBuilds
|
||||||
- cd ../MindustryBuilds
|
- cd ../MindustryBuilds
|
||||||
- echo ${TRAVIS_BUILD_NUMBER} > version.txt
|
- echo ${TRAVIS_TAG}
|
||||||
- git add .
|
- 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 commit -m "Updating to build ${TRAVIS_BUILD_NUMBER}"
|
|
||||||
- git tag ${TRAVIS_BUILD_NUMBER}
|
- git tag ${TRAVIS_BUILD_NUMBER}
|
||||||
- git config --global user.name "Build Uploader"
|
- 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}; fi
|
- 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
|
- 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}"
|
||||||
|
|||||||
@@ -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.*
|
||||||
|
|||||||
@@ -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"
|
||||||
@@ -70,7 +69,8 @@ android{
|
|||||||
}
|
}
|
||||||
|
|
||||||
defaultConfig{
|
defaultConfig{
|
||||||
Integer vcode = new Properties().with{p -> p.load(new FileInputStream(file('../core/assets/version.properties'))); return p }['androidBuildCode']?.toInteger() ?: 1
|
Properties props = new Properties().with{p -> p.load(file('../core/assets/version.properties').newReader()); return p }
|
||||||
|
Integer vcode = props['androidBuildCode']?.toInteger() ?: 1
|
||||||
def versionNameResult = "$versionNumber-$versionType-${getBuildVersion().replace(" ", "-")}"
|
def versionNameResult = "$versionNumber-$versionType-${getBuildVersion().replace(" ", "-")}"
|
||||||
|
|
||||||
applicationId "io.anuke.mindustry"
|
applicationId "io.anuke.mindustry"
|
||||||
@@ -79,6 +79,9 @@ android{
|
|||||||
|
|
||||||
versionName versionNameResult
|
versionName versionNameResult
|
||||||
versionCode vcode
|
versionCode vcode
|
||||||
|
|
||||||
|
props['androidBuildCode'] = (vcode + 1).toString()
|
||||||
|
props.store(file('../core/assets/version.properties').newWriter(), null)
|
||||||
}
|
}
|
||||||
|
|
||||||
compileOptions{
|
compileOptions{
|
||||||
|
|||||||
@@ -1,9 +1,10 @@
|
|||||||
package io.anuke.mindustry;
|
package io.anuke.mindustry;
|
||||||
|
|
||||||
import android.*;
|
import android.app.*;
|
||||||
import android.content.*;
|
import android.content.*;
|
||||||
import android.content.pm.*;
|
import android.content.pm.*;
|
||||||
import android.net.*;
|
import android.net.*;
|
||||||
|
import android.os.Build.*;
|
||||||
import android.os.*;
|
import android.os.*;
|
||||||
import android.provider.Settings.*;
|
import android.provider.Settings.*;
|
||||||
import android.telephony.*;
|
import android.telephony.*;
|
||||||
@@ -16,13 +17,10 @@ import io.anuke.arc.util.*;
|
|||||||
import io.anuke.arc.util.serialization.*;
|
import io.anuke.arc.util.serialization.*;
|
||||||
import io.anuke.mindustry.game.Saves.*;
|
import io.anuke.mindustry.game.Saves.*;
|
||||||
import io.anuke.mindustry.io.*;
|
import io.anuke.mindustry.io.*;
|
||||||
import io.anuke.mindustry.net.Net;
|
|
||||||
import io.anuke.mindustry.net.*;
|
|
||||||
import io.anuke.mindustry.ui.dialogs.*;
|
import io.anuke.mindustry.ui.dialogs.*;
|
||||||
|
|
||||||
import java.io.*;
|
import java.io.*;
|
||||||
import java.lang.System;
|
import java.lang.System;
|
||||||
import java.util.*;
|
|
||||||
|
|
||||||
import static io.anuke.mindustry.Vars.*;
|
import static io.anuke.mindustry.Vars.*;
|
||||||
|
|
||||||
@@ -35,16 +33,10 @@ public class AndroidLauncher extends AndroidApplication{
|
|||||||
@Override
|
@Override
|
||||||
protected void onCreate(Bundle savedInstanceState){
|
protected void onCreate(Bundle savedInstanceState){
|
||||||
super.onCreate(savedInstanceState);
|
super.onCreate(savedInstanceState);
|
||||||
AndroidApplicationConfiguration config = new AndroidApplicationConfiguration();
|
|
||||||
config.useImmersiveMode = true;
|
|
||||||
config.depth = 0;
|
|
||||||
if(doubleScaleTablets && isTablet(this.getContext())){
|
if(doubleScaleTablets && isTablet(this.getContext())){
|
||||||
UnitScl.dp.addition = 0.5f;
|
Scl.setAddition(0.5f);
|
||||||
}
|
}
|
||||||
|
|
||||||
config.hideStatusBar = true;
|
|
||||||
Net.setClientProvider(new ArcNetClient());
|
|
||||||
Net.setServerProvider(new ArcNetServer());
|
|
||||||
initialize(new ClientLauncher(){
|
initialize(new ClientLauncher(){
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -70,44 +62,43 @@ public class AndroidLauncher extends AndroidApplication{
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
|
||||||
public void requestExternalPerms(Runnable callback){
|
|
||||||
if(Build.VERSION.SDK_INT < Build.VERSION_CODES.M || (checkSelfPermission(Manifest.permission.WRITE_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED &&
|
|
||||||
checkSelfPermission(Manifest.permission.READ_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED)){
|
|
||||||
callback.run();
|
|
||||||
}else{
|
|
||||||
permCallback = callback;
|
|
||||||
ArrayList<String> perms = new ArrayList<>();
|
|
||||||
if(checkSelfPermission(Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED){
|
|
||||||
perms.add(Manifest.permission.WRITE_EXTERNAL_STORAGE);
|
|
||||||
}
|
|
||||||
if(checkSelfPermission(Manifest.permission.READ_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED){
|
|
||||||
perms.add(Manifest.permission.READ_EXTERNAL_STORAGE);
|
|
||||||
}
|
|
||||||
requestPermissions(perms.toArray(new String[0]), PERMISSION_REQUEST_CODE);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void shareFile(FileHandle file){
|
public void shareFile(FileHandle file){
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void showFileChooser(String text, String content, Consumer<FileHandle> cons, boolean open, Predicate<String> filetype){
|
public void showFileChooser(boolean open, String extension, Consumer<FileHandle> cons){
|
||||||
chooser = new FileChooser(text, file -> filetype.test(file.extension().toLowerCase()), open, cons);
|
if(VERSION.SDK_INT >= 19){
|
||||||
if(Build.VERSION.SDK_INT < Build.VERSION_CODES.M || (checkSelfPermission(Manifest.permission.WRITE_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED &&
|
Intent intent = new Intent(open ? Intent.ACTION_OPEN_DOCUMENT : Intent.ACTION_CREATE_DOCUMENT);
|
||||||
checkSelfPermission(Manifest.permission.READ_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED)){
|
intent.addCategory(Intent.CATEGORY_OPENABLE);
|
||||||
chooser.show();
|
intent.setType("*/*");
|
||||||
chooser = null;
|
addResultListener(i -> startActivityForResult(intent, i), (code, in) -> {
|
||||||
|
if(code == Activity.RESULT_OK && in != null && in.getData() != null){
|
||||||
|
Uri uri = in.getData();
|
||||||
|
|
||||||
|
Core.app.post(() -> Core.app.post(() -> cons.accept(new FileHandle(uri.getPath()){
|
||||||
|
@Override
|
||||||
|
public InputStream read(){
|
||||||
|
try{
|
||||||
|
return getContentResolver().openInputStream(uri);
|
||||||
|
}catch(IOException e){
|
||||||
|
throw new ArcRuntimeException(e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public OutputStream write(boolean append){
|
||||||
|
try{
|
||||||
|
return getContentResolver().openOutputStream(uri);
|
||||||
|
}catch(IOException e){
|
||||||
|
throw new ArcRuntimeException(e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
})));
|
||||||
|
}
|
||||||
|
});
|
||||||
}else{
|
}else{
|
||||||
ArrayList<String> perms = new ArrayList<>();
|
super.showFileChooser(open, extension, cons);
|
||||||
if(checkSelfPermission(Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED){
|
|
||||||
perms.add(Manifest.permission.WRITE_EXTERNAL_STORAGE);
|
|
||||||
}
|
|
||||||
if(checkSelfPermission(Manifest.permission.READ_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED){
|
|
||||||
perms.add(Manifest.permission.READ_EXTERNAL_STORAGE);
|
|
||||||
}
|
|
||||||
requestPermissions(perms.toArray(new String[0]), PERMISSION_REQUEST_CODE);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -125,7 +116,11 @@ public class AndroidLauncher extends AndroidApplication{
|
|||||||
public boolean canDonate(){
|
public boolean canDonate(){
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
}, config);
|
}, new AndroidApplicationConfiguration(){{
|
||||||
|
useImmersiveMode = true;
|
||||||
|
depth = 0;
|
||||||
|
hideStatusBar = true;
|
||||||
|
}});
|
||||||
checkFiles(getIntent());
|
checkFiles(getIntent());
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -173,10 +168,10 @@ public class AndroidLauncher extends AndroidApplication{
|
|||||||
SaveSlot slot = control.saves.importSave(file);
|
SaveSlot slot = control.saves.importSave(file);
|
||||||
ui.load.runLoadSave(slot);
|
ui.load.runLoadSave(slot);
|
||||||
}catch(IOException e){
|
}catch(IOException e){
|
||||||
ui.showError(Core.bundle.format("save.import.fail", Strings.parseException(e, true)));
|
ui.showException("$save.import.fail", e);
|
||||||
}
|
}
|
||||||
}else{
|
}else{
|
||||||
ui.showError("$save.import.invalid");
|
ui.showErrorMessage("$save.import.invalid");
|
||||||
}
|
}
|
||||||
}else if(map){ //open map
|
}else if(map){ //open map
|
||||||
FileHandle file = Core.files.local("temp-map." + mapExtension);
|
FileHandle file = Core.files.local("temp-map." + mapExtension);
|
||||||
|
|||||||
@@ -4,6 +4,11 @@ import java.lang.annotation.*;
|
|||||||
|
|
||||||
public class Annotations{
|
public class Annotations{
|
||||||
|
|
||||||
|
@Target(ElementType.TYPE)
|
||||||
|
@Retention(RetentionPolicy.SOURCE)
|
||||||
|
public @interface StyleDefaults {
|
||||||
|
}
|
||||||
|
|
||||||
/** Indicates that a method should always call its super version. */
|
/** Indicates that a method should always call its super version. */
|
||||||
@Target(ElementType.METHOD)
|
@Target(ElementType.METHOD)
|
||||||
@Retention(RetentionPolicy.SOURCE)
|
@Retention(RetentionPolicy.SOURCE)
|
||||||
|
|||||||
@@ -1,26 +1,22 @@
|
|||||||
package io.anuke.annotations;
|
package io.anuke.annotations;
|
||||||
|
|
||||||
import com.squareup.javapoet.*;
|
import com.squareup.javapoet.*;
|
||||||
|
import io.anuke.annotations.Annotations.*;
|
||||||
|
|
||||||
import javax.annotation.processing.AbstractProcessor;
|
import javax.annotation.processing.*;
|
||||||
import javax.annotation.processing.ProcessingEnvironment;
|
import javax.lang.model.*;
|
||||||
import javax.annotation.processing.RoundEnvironment;
|
import javax.lang.model.element.*;
|
||||||
import javax.annotation.processing.SupportedSourceVersion;
|
import javax.tools.Diagnostic.*;
|
||||||
import javax.lang.model.SourceVersion;
|
import javax.tools.*;
|
||||||
import javax.lang.model.element.Modifier;
|
import java.nio.file.*;
|
||||||
import javax.lang.model.element.TypeElement;
|
import java.util.*;
|
||||||
import javax.tools.Diagnostic.Kind;
|
|
||||||
import javax.tools.StandardLocation;
|
|
||||||
import java.nio.file.Files;
|
|
||||||
import java.nio.file.Paths;
|
|
||||||
import java.util.Collections;
|
|
||||||
import java.util.HashSet;
|
|
||||||
import java.util.Set;
|
|
||||||
|
|
||||||
@SupportedSourceVersion(SourceVersion.RELEASE_8)
|
@SupportedSourceVersion(SourceVersion.RELEASE_8)
|
||||||
|
@SupportedAnnotationTypes("io.anuke.annotations.Annotations.StyleDefaults")
|
||||||
public class AssetsAnnotationProcessor extends AbstractProcessor{
|
public class AssetsAnnotationProcessor extends AbstractProcessor{
|
||||||
/** Name of the base package to put all the generated classes. */
|
/** Name of the base package to put all the generated classes. */
|
||||||
private static final String packageName = "io.anuke.mindustry.gen";
|
private static final String packageName = "io.anuke.mindustry.gen";
|
||||||
|
private String path;
|
||||||
private int round;
|
private int round;
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -38,13 +34,13 @@ public class AssetsAnnotationProcessor extends AbstractProcessor{
|
|||||||
if(round++ != 0) return false; //only process 1 round
|
if(round++ != 0) return false; //only process 1 round
|
||||||
|
|
||||||
try{
|
try{
|
||||||
|
path = Paths.get(Utils.filer.createResource(StandardLocation.CLASS_OUTPUT, "no", "no")
|
||||||
String path = Paths.get(Utils.filer.createResource(StandardLocation.CLASS_OUTPUT, "no", "no")
|
|
||||||
.toUri().toURL().toString().substring(System.getProperty("os.name").contains("Windows") ? 6 : "file:".length()))
|
.toUri().toURL().toString().substring(System.getProperty("os.name").contains("Windows") ? 6 : "file:".length()))
|
||||||
.getParent().getParent().getParent().getParent().getParent().getParent().toString();
|
.getParent().getParent().getParent().getParent().getParent().getParent().toString();
|
||||||
|
|
||||||
process("Sounds", path + "/assets/sounds", "io.anuke.arc.audio.Sound", "newSound");
|
processSounds("Sounds", path + "/assets/sounds", "io.anuke.arc.audio.Sound");
|
||||||
process("Musics", path + "/assets/music", "io.anuke.arc.audio.Music", "newMusic");
|
processSounds("Musics", path + "/assets/music", "io.anuke.arc.audio.Music");
|
||||||
|
processUI(roundEnv.getElementsAnnotatedWith(StyleDefaults.class));
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}catch(Exception e){
|
}catch(Exception e){
|
||||||
@@ -53,19 +49,74 @@ 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));
|
||||||
|
}
|
||||||
|
|
||||||
|
for(String suffix : names){
|
||||||
|
suffix = suffix.isEmpty() ? "" : "-" + suffix;
|
||||||
|
|
||||||
|
String sfilen = filename + suffix;
|
||||||
|
String dtype = p.getFileName().toString().endsWith(".9.png") ? "io.anuke.arc.scene.style.NinePatchDrawable" : "io.anuke.arc.scene.style.TextureRegionDrawable";
|
||||||
|
|
||||||
|
String varname = capitalize(sfilen);
|
||||||
|
TypeSpec.Builder ttype = type;
|
||||||
|
MethodSpec.Builder tload = load;
|
||||||
|
if(varname.startsWith("icon")){
|
||||||
|
varname = varname.substring("icon".length());
|
||||||
|
varname = Character.toLowerCase(varname.charAt(0)) + varname.substring(1);
|
||||||
|
ttype = ictype;
|
||||||
|
tload = icload;
|
||||||
|
if(SourceVersion.isKeyword(varname)) varname += "i";
|
||||||
|
}
|
||||||
|
|
||||||
|
if(SourceVersion.isKeyword(varname)) varname += "s";
|
||||||
|
|
||||||
|
ttype.addField(ClassName.bestGuess(dtype), varname, Modifier.STATIC, Modifier.PUBLIC);
|
||||||
|
tload.addStatement(varname + " = ("+dtype+")io.anuke.arc.Core.atlas.drawable($S)", sfilen);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
for(Element elem : elements){
|
||||||
|
TypeElement t = (TypeElement)elem;
|
||||||
|
t.getEnclosedElements().stream().filter(e -> e.getKind() == ElementKind.FIELD).forEach(field -> {
|
||||||
|
String fname = field.getSimpleName().toString();
|
||||||
|
if(fname.startsWith("default")){
|
||||||
|
loadStyles.addStatement("io.anuke.arc.Core.scene.addStyle(" + field.asType().toString() + ".class, io.anuke.mindustry.ui.Styles." + fname + ")");
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
ictype.addMethod(icload.build());
|
||||||
|
JavaFile.builder(packageName, ictype.build()).build().writeTo(Utils.filer);
|
||||||
|
|
||||||
|
type.addMethod(load.build());
|
||||||
|
type.addMethod(loadStyles.build());
|
||||||
|
JavaFile.builder(packageName, type.build()).build().writeTo(Utils.filer);
|
||||||
}
|
}
|
||||||
|
|
||||||
void process(String classname, String path, String rtype, String loadMethod) throws Exception{
|
void processSounds(String classname, String path, String rtype) throws Exception{
|
||||||
TypeSpec.Builder type = TypeSpec.classBuilder(classname).addModifiers(Modifier.PUBLIC);
|
TypeSpec.Builder type = TypeSpec.classBuilder(classname).addModifiers(Modifier.PUBLIC);
|
||||||
//MethodSpec.Builder load = MethodSpec.methodBuilder("load").addModifiers(Modifier.PUBLIC, Modifier.STATIC);
|
|
||||||
MethodSpec.Builder dispose = MethodSpec.methodBuilder("dispose").addModifiers(Modifier.PUBLIC, Modifier.STATIC);
|
MethodSpec.Builder dispose = MethodSpec.methodBuilder("dispose").addModifiers(Modifier.PUBLIC, Modifier.STATIC);
|
||||||
|
|
||||||
MethodSpec.Builder loadBegin = MethodSpec.methodBuilder("load").addModifiers(Modifier.PUBLIC, Modifier.STATIC);
|
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 -> {
|
||||||
String fname = p.getFileName().toString();
|
String fname = p.getFileName().toString();
|
||||||
@@ -84,27 +135,38 @@ public class AssetsAnnotationProcessor extends AbstractProcessor{
|
|||||||
|
|
||||||
String filepath = path.substring(path.lastIndexOf("/") + 1) + "/" + fname;
|
String filepath = path.substring(path.lastIndexOf("/") + 1) + "/" + fname;
|
||||||
|
|
||||||
//load.addStatement(name + " = io.anuke.arc.Core.audio."+loadMethod+"(io.anuke.arc.Core.files.internal(io.anuke.arc.Core.app.getType() != io.anuke.arc.Application.ApplicationType.iOS ? $S : $S))",
|
String filename = "io.anuke.arc.Core.app.getType() != io.anuke.arc.Application.ApplicationType.iOS ? \"" + filepath + "\" : \"" + filepath.replace(".ogg", ".mp3")+"\"";
|
||||||
//filepath, filepath.replace(".ogg", ".mp3"));
|
|
||||||
|
|
||||||
loadBegin.addStatement("io.anuke.arc.Core.assets.load(io.anuke.arc.Core.app.getType() != io.anuke.arc.Application.ApplicationType.iOS ? $S : $S, "+rtype+".class, " +
|
|
||||||
"new io.anuke.arc.assets.loaders."+classname.substring(0, classname.length()-1)+"Loader."+classname.substring(0, classname.length()-1)+"Parameter((m, name, type) -> " + name + " = m.get(\"" + filepath + "\")))",
|
|
||||||
filepath, filepath.replace(".ogg", ".mp3"));
|
|
||||||
|
|
||||||
|
loadBegin.addStatement("io.anuke.arc.Core.assets.load("+filename +", "+rtype+".class).loaded = a -> " + name + " = ("+rtype+")a", filepath, filepath.replace(".ogg", ".mp3"));
|
||||||
|
|
||||||
dispose.addStatement(name + ".dispose()");
|
dispose.addStatement(name + ".dispose()");
|
||||||
dispose.addStatement(name + " = null");
|
dispose.addStatement(name + " = null");
|
||||||
type.addField(FieldSpec.builder(ClassName.bestGuess(rtype), name, Modifier.STATIC, Modifier.PUBLIC).initializer("new io.anuke.arc.audio.mock.Mock" + rtype.substring(rtype.lastIndexOf(".") + 1)+ "()").build());
|
type.addField(FieldSpec.builder(ClassName.bestGuess(rtype), name, Modifier.STATIC, Modifier.PUBLIC).initializer("new io.anuke.arc.audio.mock.Mock" + rtype.substring(rtype.lastIndexOf(".") + 1)+ "()").build());
|
||||||
//cons.consume(type, fname, name);
|
|
||||||
});
|
});
|
||||||
|
|
||||||
if(classname.equals("Sounds")){
|
if(classname.equals("Sounds")){
|
||||||
type.addField(FieldSpec.builder(ClassName.bestGuess(rtype), "none", Modifier.STATIC, Modifier.PUBLIC).initializer("new io.anuke.arc.audio.mock.Mock" + rtype.substring(rtype.lastIndexOf(".") + 1)+ "()").build());
|
type.addField(FieldSpec.builder(ClassName.bestGuess(rtype), "none", Modifier.STATIC, Modifier.PUBLIC).initializer("new io.anuke.arc.audio.mock.Mock" + rtype.substring(rtype.lastIndexOf(".") + 1)+ "()").build());
|
||||||
}
|
}
|
||||||
|
|
||||||
//type.addMethod(load.build());
|
|
||||||
type.addMethod(loadBegin.build());
|
type.addMethod(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";
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
33
build.gradle
@@ -21,11 +21,12 @@ allprojects{
|
|||||||
|
|
||||||
ext{
|
ext{
|
||||||
versionNumber = '4'
|
versionNumber = '4'
|
||||||
versionModifier = 'release'
|
if(!project.hasProperty("versionModifier")) versionModifier = 'release'
|
||||||
if(!project.hasProperty("versionType")) versionType = 'official'
|
if(!project.hasProperty("versionType")) versionType = 'official'
|
||||||
appName = 'Mindustry'
|
appName = 'Mindustry'
|
||||||
gdxVersion = '1.9.10'
|
gdxVersion = '1.9.10'
|
||||||
roboVMVersion = '2.3.7'
|
roboVMVersion = '2.3.7'
|
||||||
|
steamworksVersion = '1.8.0'
|
||||||
arcHash = null
|
arcHash = null
|
||||||
|
|
||||||
debugged = {
|
debugged = {
|
||||||
@@ -33,20 +34,11 @@ allprojects{
|
|||||||
}
|
}
|
||||||
|
|
||||||
localArc = {
|
localArc = {
|
||||||
return (!project.hasProperty("release")) && new File(projectDir.parent, '../Arc').exists()
|
return !project.hasProperty("release") && new File(projectDir.parent, '../Arc').exists()
|
||||||
}
|
}
|
||||||
|
|
||||||
getArcHash = {
|
getArcHash = {
|
||||||
//get latest commit hash from github since JITPack's '-snapshot' version doesn't work correctly
|
return new Properties().with{ p -> p.load(new File((File)projectDir, 'gradle.properties').newReader()); return p }["archash"]
|
||||||
if(arcHash == null){
|
|
||||||
try{
|
|
||||||
arcHash = 'git ls-remote https://github.com/Anuken/Arc.git'.execute().text.split("\t")[0]
|
|
||||||
}catch(e){
|
|
||||||
e.printStackTrace()
|
|
||||||
arcHash = "-SNAPSHOT"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return arcHash
|
|
||||||
}
|
}
|
||||||
|
|
||||||
arcModule = { String name ->
|
arcModule = { String name ->
|
||||||
@@ -150,13 +142,15 @@ project(":desktop"){
|
|||||||
|
|
||||||
dependencies{
|
dependencies{
|
||||||
compile project(":core")
|
compile project(":core")
|
||||||
compile project(":net")
|
|
||||||
|
|
||||||
if(debugged()) compile project(":debug")
|
if(debugged()) compile project(":debug")
|
||||||
|
|
||||||
compile "com.badlogicgames.gdx:gdx-platform:$gdxVersion:natives-desktop"
|
compile "com.badlogicgames.gdx:gdx-platform:$gdxVersion:natives-desktop"
|
||||||
compile "com.badlogicgames.gdx:gdx-freetype-platform:$gdxVersion:natives-desktop"
|
compile "com.badlogicgames.gdx:gdx-freetype-platform:$gdxVersion:natives-desktop"
|
||||||
|
|
||||||
|
compile "com.code-disaster.steamworks4j:steamworks4j:$steamworksVersion"
|
||||||
|
compile "com.code-disaster.steamworks4j:steamworks4j-server:$steamworksVersion"
|
||||||
|
|
||||||
compile arcModule("backends:backend-sdl")
|
compile arcModule("backends:backend-sdl")
|
||||||
compile 'com.github.MinnDevelopment:java-discord-rpc:v2.0.2'
|
compile 'com.github.MinnDevelopment:java-discord-rpc:v2.0.2'
|
||||||
}
|
}
|
||||||
@@ -175,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'
|
||||||
@@ -185,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")
|
||||||
@@ -201,6 +194,7 @@ project(":core"){
|
|||||||
apply plugin: "java"
|
apply plugin: "java"
|
||||||
|
|
||||||
task preGen{
|
task preGen{
|
||||||
|
outputs.upToDateWhen{ false }
|
||||||
generateLocales()
|
generateLocales()
|
||||||
writeVersion()
|
writeVersion()
|
||||||
}
|
}
|
||||||
@@ -249,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")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -294,14 +287,6 @@ project(":annotations"){
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
project(":net"){
|
|
||||||
apply plugin: "java"
|
|
||||||
|
|
||||||
dependencies{
|
|
||||||
compile project(":core")
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
task deployAll{
|
task deployAll{
|
||||||
task cleanDeployOutput{
|
task cleanDeployOutput{
|
||||||
doFirst{
|
doFirst{
|
||||||
|
|||||||
|
Before Width: | Height: | Size: 91 B After Width: | Height: | Size: 91 B |
BIN
core/assets-raw/sprites/ui/icons/icon-fdroid.png
Normal file
|
After Width: | Height: | Size: 1.7 KiB |
BIN
core/assets-raw/sprites/ui/icons/icon-workshop.png
Normal file
|
After Width: | Height: | Size: 3.9 KiB |
|
Before Width: | Height: | Size: 168 B After Width: | Height: | Size: 2.3 KiB |
|
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 |
@@ -52,8 +52,17 @@ close = Close
|
|||||||
website = Website
|
website = Website
|
||||||
quit = Quit
|
quit = Quit
|
||||||
maps = Maps
|
maps = Maps
|
||||||
|
maps.browse = Browse Maps
|
||||||
continue = Continue
|
continue = Continue
|
||||||
maps.none = [lightgray]No maps found!
|
maps.none = [lightgray]No maps found!
|
||||||
|
invalid = Invalid
|
||||||
|
preparingconfig = Preparing Config
|
||||||
|
preparingcontent = Preparing Content
|
||||||
|
uploadingcontent = Uploading Content
|
||||||
|
uploadingpreviewfile = Uploading Preview File
|
||||||
|
committingchanges = Comitting Changes
|
||||||
|
done = Done
|
||||||
|
|
||||||
about.button = About
|
about.button = About
|
||||||
name = Name:
|
name = Name:
|
||||||
noname = Pick a[accent] player name[] first.
|
noname = Pick a[accent] player name[] first.
|
||||||
@@ -64,16 +73,18 @@ techtree = Tech Tree
|
|||||||
research.list = [lightgray]Research:
|
research.list = [lightgray]Research:
|
||||||
research = Research
|
research = Research
|
||||||
researched = [lightgray]{0} researched.
|
researched = [lightgray]{0} researched.
|
||||||
players = {0} players online
|
players = {0} players
|
||||||
players.single = {0} player online
|
players.single = {0} player
|
||||||
server.closing = [accent]Closing server...
|
server.closing = [accent]Closing server...
|
||||||
server.kicked.kick = You have been kicked from the server!
|
server.kicked.kick = You have been kicked from the server!
|
||||||
|
server.kicked.whitelist = You are not whitelisted here.
|
||||||
server.kicked.serverClose = Server closed.
|
server.kicked.serverClose = Server closed.
|
||||||
server.kicked.vote = You have been vote-kicked. Goodbye.
|
server.kicked.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.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.
|
||||||
@@ -84,11 +95,13 @@ server.versions = Your version:[accent] {0}[]\nServer version:[accent] {1}[]
|
|||||||
host.info = The [accent]host[] button hosts a server on port [scarlet]6567[]. \nAnybody on the same [lightgray]wifi or local network[] should be able to see your server in their server list.\n\nIf you want people to be able to connect from anywhere by IP, [accent]port forwarding[] is required.\n\n[lightgray]Note: If someone is experiencing trouble connecting to your LAN game, make sure you have allowed Mindustry access to your local network in your firewall settings. Note that public networks sometimes do not allow server discovery.
|
host.info = The [accent]host[] button hosts a server on port [scarlet]6567[]. \nAnybody on the same [lightgray]wifi or local network[] should be able to see your server in their server list.\n\nIf you want people to be able to connect from anywhere by IP, [accent]port forwarding[] is required.\n\n[lightgray]Note: If someone is experiencing trouble connecting to your LAN game, make sure you have allowed Mindustry access to your local network in your firewall settings. Note that public networks sometimes do not allow server discovery.
|
||||||
join.info = Here, you can enter a [accent]server IP[] to connect to, or discover [accent]local network[] servers to connect to.\nBoth LAN and WAN multiplayer is supported.\n\n[lightgray]Note: There is no automatic global server list; if you want to connect to someone by IP, you would need to ask the host for their IP.
|
join.info = Here, you can enter a [accent]server IP[] to connect to, or discover [accent]local network[] servers to connect to.\nBoth LAN and WAN multiplayer is supported.\n\n[lightgray]Note: There is no automatic global server list; if you want to connect to someone by IP, you would need to ask the host for their IP.
|
||||||
hostserver = Host Multiplayer Game
|
hostserver = Host Multiplayer Game
|
||||||
|
invitefriends = Invite Friends
|
||||||
hostserver.mobile = Host\nGame
|
hostserver.mobile = Host\nGame
|
||||||
host = Host
|
host = Host
|
||||||
hosting = [accent]Opening server...
|
hosting = [accent]Opening server...
|
||||||
hosts.refresh = Refresh
|
hosts.refresh = Refresh
|
||||||
hosts.discovering = Discovering LAN games
|
hosts.discovering = Discovering LAN games
|
||||||
|
hosts.discovering.any = Discovering games
|
||||||
server.refreshing = Refreshing server
|
server.refreshing = Refreshing server
|
||||||
hosts.none = [lightgray]No local games found!
|
hosts.none = [lightgray]No local games found!
|
||||||
host.invalid = [scarlet]Can't connect to host.
|
host.invalid = [scarlet]Can't connect to host.
|
||||||
@@ -109,7 +122,7 @@ server.edit = Edit Server
|
|||||||
server.outdated = [crimson]Outdated Server![]
|
server.outdated = [crimson]Outdated Server![]
|
||||||
server.outdated.client = [crimson]Outdated Client![]
|
server.outdated.client = [crimson]Outdated Client![]
|
||||||
server.version = [gray]v{0} {1}
|
server.version = [gray]v{0} {1}
|
||||||
server.custombuild = [yellow]Custom Build
|
server.custombuild = [accent]Custom Build
|
||||||
confirmban = Are you sure you want to ban this player?
|
confirmban = Are you sure you want to ban this player?
|
||||||
confirmkick = Are you sure you want to kick this player?
|
confirmkick = Are you sure you want to kick this player?
|
||||||
confirmunban = Are you sure you want to unban this player?
|
confirmunban = Are you sure you want to unban this player?
|
||||||
@@ -118,13 +131,17 @@ confirmunadmin = Are you sure you want to remove admin status from this player?
|
|||||||
joingame.title = Join Game
|
joingame.title = Join Game
|
||||||
joingame.ip = Address:
|
joingame.ip = Address:
|
||||||
disconnect = Disconnected.
|
disconnect = Disconnected.
|
||||||
|
disconnect.error = Connection error.
|
||||||
|
disconnect.closed = Connection closed.
|
||||||
|
disconnect.timeout = Timed out.
|
||||||
disconnect.data = Failed to load world data!
|
disconnect.data = Failed to load world data!
|
||||||
|
cantconnect = Unable to join game ([accent]{0}[]).
|
||||||
connecting = [accent]Connecting...
|
connecting = [accent]Connecting...
|
||||||
connecting.data = [accent]Loading world data...
|
connecting.data = [accent]Loading world data...
|
||||||
server.port = Port:
|
server.port = Port:
|
||||||
server.addressinuse = Address already in use!
|
server.addressinuse = Address already in use!
|
||||||
server.invalidport = Invalid port number!
|
server.invalidport = Invalid port number!
|
||||||
server.error = [crimson]Error hosting server: [accent]{0}
|
server.error = [crimson]Error hosting server.
|
||||||
save.old = This save is for an older version of the game, and can no longer be used.\n\n[lightgray]Save backwards compatibility will be implemented in the full 4.0 release.
|
save.old = This save is for an older version of the game, and can no longer be used.\n\n[lightgray]Save backwards compatibility will be implemented in the full 4.0 release.
|
||||||
save.new = New Save
|
save.new = New Save
|
||||||
save.overwrite = Are you sure you want to overwrite\nthis save slot?
|
save.overwrite = Are you sure you want to overwrite\nthis save slot?
|
||||||
@@ -151,7 +168,7 @@ off = Off
|
|||||||
save.autosave = Autosave: {0}
|
save.autosave = Autosave: {0}
|
||||||
save.map = Map: {0}
|
save.map = Map: {0}
|
||||||
save.wave = Wave {0}
|
save.wave = Wave {0}
|
||||||
save.difficulty = Difficulty: {0}
|
save.mode = Gamemode: {0}
|
||||||
save.date = Last Saved: {0}
|
save.date = Last Saved: {0}
|
||||||
save.playtime = Playtime: {0}
|
save.playtime = Playtime: {0}
|
||||||
warning = Warning.
|
warning = Warning.
|
||||||
@@ -193,6 +210,11 @@ map.nospawn = This map does not have any cores for the player to spawn in! Add a
|
|||||||
map.nospawn.pvp = This map does not have any enemy cores for player to spawn into! Add[SCARLET] non-orange[] cores to this map in the editor.
|
map.nospawn.pvp = This map does not have any enemy cores for player to spawn into! Add[SCARLET] non-orange[] cores to this map in the editor.
|
||||||
map.nospawn.attack = This map does not have any enemy cores for player to attack! Add[SCARLET] red[] cores to this map in the editor.
|
map.nospawn.attack = This map does not have any enemy cores for player to attack! Add[SCARLET] red[] cores to this map in the editor.
|
||||||
map.invalid = Error loading map: corrupted or invalid map file.
|
map.invalid = Error loading map: corrupted or invalid map file.
|
||||||
|
map.publish.error = Error publishing map: {0}
|
||||||
|
map.publish.confirm = Are you sure you want to publish this map?\n\n[lightgray]Make sure you agree to the Workshop EULA first, or your maps will not show up!
|
||||||
|
eula = Steam EULA
|
||||||
|
map.publish = Map published.
|
||||||
|
map.publishing = [accent]Publishing map...
|
||||||
editor.brush = Brush
|
editor.brush = Brush
|
||||||
editor.openin = Open In Editor
|
editor.openin = Open In Editor
|
||||||
editor.oregen = Ore Generation
|
editor.oregen = Ore Generation
|
||||||
@@ -204,7 +226,9 @@ editor.waves = Waves:
|
|||||||
editor.rules = Rules:
|
editor.rules = Rules:
|
||||||
editor.generation = Generation:
|
editor.generation = Generation:
|
||||||
editor.ingame = Edit In-Game
|
editor.ingame = Edit In-Game
|
||||||
|
editor.publish.workshop = Publish On Workshop
|
||||||
editor.newmap = New Map
|
editor.newmap = New Map
|
||||||
|
workshop = Workshop
|
||||||
waves.title = Waves
|
waves.title = Waves
|
||||||
waves.remove = Remove
|
waves.remove = Remove
|
||||||
waves.never = <never>
|
waves.never = <never>
|
||||||
@@ -221,15 +245,17 @@ waves.invalid = Invalid waves in clipboard.
|
|||||||
waves.copied = Waves copied.
|
waves.copied = Waves copied.
|
||||||
waves.none = No enemies defined.\nNote that empty wave layouts will automatically be replaced with the default layout.
|
waves.none = No enemies defined.\nNote that empty wave layouts will automatically be replaced with the default layout.
|
||||||
editor.default = [lightgray]<Default>
|
editor.default = [lightgray]<Default>
|
||||||
|
details = Details...
|
||||||
edit = Edit...
|
edit = Edit...
|
||||||
editor.name = Name:
|
editor.name = Name:
|
||||||
editor.spawn = Spawn Unit
|
editor.spawn = Spawn Unit
|
||||||
editor.removeunit = Remove Unit
|
editor.removeunit = Remove Unit
|
||||||
editor.teams = Teams
|
editor.teams = Teams
|
||||||
editor.errorload = Error loading file:\n[accent]{0}
|
editor.errorload = Error loading file.
|
||||||
editor.errorsave = Error saving file:\n[accent]{0}
|
editor.errorsave = Error saving file.
|
||||||
editor.errorimage = That's an image, not a map. Don't go around changing extensions expecting it to work.\n\nIf you want to import a legacy map, use the 'import legacy map' button in the editor.
|
editor.errorimage = That's an image, not a map.\n\nIf you want to import a 3.5/build 40 map, use the 'Import Legacy Map' button in the editor.
|
||||||
editor.errorlegacy = This map is too old, and uses a legacy map format that is no longer supported.
|
editor.errorlegacy = This map is too old, and uses a legacy map format that is no longer supported.
|
||||||
|
editor.errornot = This is not a map file.
|
||||||
editor.errorheader = This map file is either not valid or corrupt.
|
editor.errorheader = This map file is either not valid or corrupt.
|
||||||
editor.errorname = Map has no name defined. Are you trying to load a save file?
|
editor.errorname = Map has no name defined. Are you trying to load a save file?
|
||||||
editor.update = Update
|
editor.update = Update
|
||||||
@@ -248,7 +274,7 @@ editor.importmap = Import Map
|
|||||||
editor.importmap.description = Import an already existing map
|
editor.importmap.description = Import an already existing map
|
||||||
editor.importfile = Import File
|
editor.importfile = Import File
|
||||||
editor.importfile.description = Import an external map file
|
editor.importfile.description = Import an external map file
|
||||||
editor.importimage = Import Legacy Image
|
editor.importimage = Import Legacy Map
|
||||||
editor.importimage.description = Import an external map image file
|
editor.importimage.description = Import an external map image file
|
||||||
editor.export = Export...
|
editor.export = Export...
|
||||||
editor.exportfile = Export File
|
editor.exportfile = Export File
|
||||||
@@ -262,6 +288,7 @@ editor.resizemap = Resize Map
|
|||||||
editor.mapname = Map Name:
|
editor.mapname = Map Name:
|
||||||
editor.overwrite = [accent]Warning!\nThis overwrites an existing map.
|
editor.overwrite = [accent]Warning!\nThis overwrites an existing map.
|
||||||
editor.overwrite.confirm = [scarlet]Warning![] A map with this name already exists. Are you sure you want to overwrite it?
|
editor.overwrite.confirm = [scarlet]Warning![] A map with this name already exists. Are you sure you want to overwrite it?
|
||||||
|
editor.exists = A map with this name already exists.
|
||||||
editor.selectmap = Select a map to load:
|
editor.selectmap = Select a map to load:
|
||||||
|
|
||||||
toolmode.replace = Replace
|
toolmode.replace = Replace
|
||||||
@@ -345,6 +372,7 @@ launch.skip.confirm = If you skip now, you will not be able to launch until late
|
|||||||
uncover = Uncover
|
uncover = Uncover
|
||||||
configure = Configure Loadout
|
configure = Configure Loadout
|
||||||
configure.locked = [lightgray]Unlock configuring loadout: Wave {0}.
|
configure.locked = [lightgray]Unlock configuring loadout: Wave {0}.
|
||||||
|
configure.invalid = Amount must be a number between 0 and {0}.
|
||||||
zone.unlocked = [lightgray]{0} unlocked.
|
zone.unlocked = [lightgray]{0} unlocked.
|
||||||
zone.requirement.complete = Wave {0} reached:\n{1} zone requirements met.
|
zone.requirement.complete = Wave {0} reached:\n{1} zone requirements met.
|
||||||
zone.config.complete = Wave {0} reached:\nLoadout config unlocked.
|
zone.config.complete = Wave {0} reached:\nLoadout config unlocked.
|
||||||
@@ -445,6 +473,7 @@ blocks.boosteffect = Boost Effect
|
|||||||
blocks.maxunits = Max Active Units
|
blocks.maxunits = Max Active Units
|
||||||
blocks.health = Health
|
blocks.health = Health
|
||||||
blocks.buildtime = Build Time
|
blocks.buildtime = Build Time
|
||||||
|
blocks.buildcost = Build Cost
|
||||||
blocks.inaccuracy = Inaccuracy
|
blocks.inaccuracy = Inaccuracy
|
||||||
blocks.shots = Shots
|
blocks.shots = Shots
|
||||||
blocks.reload = Shots/Second
|
blocks.reload = Shots/Second
|
||||||
@@ -457,6 +486,7 @@ bar.powerbalance = Power: {0}/s
|
|||||||
bar.poweramount = Power: {0}
|
bar.poweramount = Power: {0}
|
||||||
bar.poweroutput = Power Output: {0}
|
bar.poweroutput = Power Output: {0}
|
||||||
bar.items = Items: {0}
|
bar.items = Items: {0}
|
||||||
|
bar.capacity = Capacity: {0}
|
||||||
bar.liquid = Liquid
|
bar.liquid = Liquid
|
||||||
bar.heat = Heat
|
bar.heat = Heat
|
||||||
bar.power = Power
|
bar.power = Power
|
||||||
@@ -533,8 +563,9 @@ 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.savecreate.name = Auto-Create Saves
|
||||||
|
setting.publichost.name = Public Game Visibility
|
||||||
setting.chatopacity.name = Chat Opacity
|
setting.chatopacity.name = Chat Opacity
|
||||||
setting.playerchat.name = Display In-Game Chat
|
setting.playerchat.name = Display Player Bubble Chat
|
||||||
uiscale.reset = UI scale has been changed.\nPress "OK" to confirm this scale.\n[scarlet]Reverting and exiting in[accent] {0}[] seconds...
|
uiscale.reset = UI scale has been changed.\nPress "OK" to confirm this scale.\n[scarlet]Reverting and exiting in[accent] {0}[] seconds...
|
||||||
uiscale.cancel = Cancel & Exit
|
uiscale.cancel = Cancel & Exit
|
||||||
setting.bloom.name = Bloom
|
setting.bloom.name = Bloom
|
||||||
@@ -885,11 +916,11 @@ unit.lich.name = Lich
|
|||||||
unit.reaper.name = Reaper
|
unit.reaper.name = Reaper
|
||||||
tutorial.next = [lightgray]<Tap to continue>
|
tutorial.next = [lightgray]<Tap to continue>
|
||||||
tutorial.intro = You have entered the[scarlet] Mindustry Tutorial.[]\nBegin by[accent] mining copper[]. Tap a copper ore vein near your core to do this.\n\n[accent]{0}/{1} copper
|
tutorial.intro = You have entered the[scarlet] Mindustry Tutorial.[]\nBegin by[accent] mining copper[]. Tap a copper ore vein near your core to do this.\n\n[accent]{0}/{1} copper
|
||||||
tutorial.drill = Mining manually is inefficient.\n[accent]Drills []can mine automatically.\nClick the drill tab in the bottom right.\nSelect the[accent] mechanical drill[]. Place it on a copper vein by clicking.\n[accent]Right-click[] to stop building.
|
tutorial.drill = Mining manually is inefficient.\n[accent]Drills []can mine automatically.\nClick the drill tab in the bottom right.\nSelect the[accent] mechanical drill[]. Place it on a copper vein by clicking.\n[accent]Right-click[] to stop building, and[accent] Hold Ctrl while scrolling[] to zoom in and out.
|
||||||
tutorial.drill.mobile = Mining manually is inefficient.\n[accent]Drills []can mine automatically.\nTap the drill tab in the bottom right.\nSelect the[accent] mechanical drill[].\nPlace it on a copper vein by tapping, then press the[accent] checkmark[] below to confirm your selection.\nPress the[accent] X button[] to cancel placement.
|
tutorial.drill.mobile = Mining manually is inefficient.\n[accent]Drills []can mine automatically.\nTap the drill tab in the bottom right.\nSelect the[accent] mechanical drill[].\nPlace it on a copper vein by tapping, then press the[accent] checkmark[] below to confirm your selection.\nPress the[accent] X button[] to cancel placement.
|
||||||
tutorial.blockinfo = Each block has different stats. Each drill can only mine certain ores.\nTo check a block's info and stats,[accent] tap the "?" button while selecting it in the build menu.[]\n\n[accent]Access the Mechanical Drill's stats now.[]
|
tutorial.blockinfo = Each block has different stats. Each drill can only mine certain ores.\nTo check a block's info and stats,[accent] tap the "?" button while selecting it in the build menu.[]\n\n[accent]Access the Mechanical Drill's stats now.[]
|
||||||
tutorial.conveyor = [accent]Conveyors[] are used to transport items to the core.\nMake a line of conveyors from the drill to the core.\n[accent]Hold down the mouse to place in a line.[]\nHold[accent] CTRL[] while selecting a line to place diagonally.\n\n[accent]{0}/{1} conveyors placed in line\n[accent]0/1 items delivered
|
tutorial.conveyor = [accent]Conveyors[] are used to transport items to the core.\nMake a line of conveyors from the drill to the core.\n[accent]Hold down the mouse to place in a line.[]\nHold[accent] CTRL[] while selecting a line to place diagonally.\n\n[accent]Place 2 conveyors with the line tool, then deliver an item into the core.
|
||||||
tutorial.conveyor.mobile = [accent]Conveyors[] are used to transport items to the core.\nMake a line of conveyors from the drill to the core.\n[accent] Place in a line by holding down your finger for a few seconds[] and dragging in a direction.\n\n[accent]{0}/{1} conveyors placed in line\n[accent]0/1 items delivered
|
tutorial.conveyor.mobile = [accent]Conveyors[] are used to transport items to the core.\nMake a line of conveyors from the drill to the core.\n[accent] Place in a line by holding down your finger for a few seconds[] and dragging in a direction.\n\n[accent]Place 2 conveyors with the line tool, then deliver an item into the core.
|
||||||
tutorial.turret = Once an item enters your core, it can be used for building.\nKeep in mind that not all items can be used for building.\nItems that are not used for building, such as[accent] coal[] or[accent] scrap[], cannot be put into the core.\nDefensive structures must be built to repel the[lightgray] enemy[].\nBuild a[accent] duo turret[] near your base.
|
tutorial.turret = Once an item enters your core, it can be used for building.\nKeep in mind that not all items can be used for building.\nItems that are not used for building, such as[accent] coal[] or[accent] scrap[], cannot be put into the core.\nDefensive structures must be built to repel the[lightgray] enemy[].\nBuild a[accent] duo turret[] near your base.
|
||||||
tutorial.drillturret = Duo turrets require[accent] copper ammo []to shoot.\nPlace a drill near the turret.\nLead conveyors into the turret to supply it with copper.\n\n[accent]Ammo delivered: 0/1
|
tutorial.drillturret = Duo turrets require[accent] copper ammo []to shoot.\nPlace a drill near the turret.\nLead conveyors into the turret to supply it with copper.\n\n[accent]Ammo delivered: 0/1
|
||||||
tutorial.pause = During battle, you are able to[accent] pause the game.[]\nYou may queue buildings while paused.\n\n[accent]Press space to pause.
|
tutorial.pause = During battle, you are able to[accent] pause the game.[]\nYou may queue buildings while paused.\n\n[accent]Press space to pause.
|
||||||
@@ -904,7 +935,6 @@ tutorial.waves = The[lightgray] enemy[] approaches.\n\nDefend the core for 2 wav
|
|||||||
tutorial.waves.mobile = The[lightgray] enemy[] approaches.\n\nDefend the core for 2 waves. Your ship will automatically fire at enemies.\nBuild more turrets and drills. Mine more copper.
|
tutorial.waves.mobile = The[lightgray] enemy[] approaches.\n\nDefend the core for 2 waves. Your ship will automatically fire at enemies.\nBuild more turrets and drills. Mine more copper.
|
||||||
tutorial.launch = Once you reach a specific wave, you are able to[accent] launch the core[], leaving your defenses behind and[accent] obtaining all the resources in your core.[]\nThese resources can then be used to research new technology.\n\n[accent]Press the launch button.
|
tutorial.launch = Once you reach a specific wave, you are able to[accent] launch the core[], leaving your defenses behind and[accent] obtaining all the resources in your core.[]\nThese resources can then be used to research new technology.\n\n[accent]Press the launch button.
|
||||||
|
|
||||||
|
|
||||||
item.copper.description = The most basic structural material. Used extensively in all types of blocks.
|
item.copper.description = The most basic structural material. Used extensively in all types of blocks.
|
||||||
item.lead.description = A basic starter material. Used extensively in electronics and liquid transportation blocks.
|
item.lead.description = A basic starter material. Used extensively in electronics and liquid transportation blocks.
|
||||||
item.metaglass.description = A super-tough glass compound. Extensively used for liquid distribution and storage.
|
item.metaglass.description = A super-tough glass compound. Extensively used for liquid distribution and storage.
|
||||||
|
|||||||
@@ -1007,8 +1007,8 @@ block.oil-extractor.description = Verwendet große Mengen an Strom, um Öl aus S
|
|||||||
block.core-shard.description = Die erste Version der Kernkapsel. Einmal zerstört, ist jeglicher Kontakt zur Region verloren. Lass das nicht zu.
|
block.core-shard.description = Die erste Version der Kernkapsel. Einmal zerstört, ist jeglicher Kontakt zur Region verloren. Lass das nicht zu.
|
||||||
block.core-foundation.description = Die zweite Version des Kerns. Besser gepanzert. Speichert mehr Ressourcen.
|
block.core-foundation.description = Die zweite Version des Kerns. Besser gepanzert. Speichert mehr Ressourcen.
|
||||||
block.core-nucleus.description = Die dritte und letzte Version der Kernkapsel. Sehr gut gepanzert. Speichert enorme Mengen an Ressourcen.
|
block.core-nucleus.description = Die dritte und letzte Version der Kernkapsel. Sehr gut gepanzert. Speichert enorme Mengen an Ressourcen.
|
||||||
block.vault.description = Speichert eine große Menge an Materialien pro Typ. Benachbarte Container, Tresore und Basen werden zu einem Behälter zusammengefasst. Ein[LIGHT_GRAY] Entlader[] kann verwendet werden, um Materialien auszuladen.
|
block.vault.description = Speichert eine große Menge an Materialien pro Typ. Ein[LIGHT_GRAY] Entlader[] kann verwendet werden, um Materialien auszuladen.
|
||||||
block.container.description = Speichert eine kleine Menge an Materialien pro Typ. Benachbarte Container, Tresore und Basen werden zu einem Behälter zusammengefasst. Ein[LIGHT_GRAY] Entlader[] kann verwendet werden, um Materialien auszuladen.
|
block.container.description = Speichert eine kleine Menge an Materialien pro Typ. Ein[LIGHT_GRAY] Entlader[] kann verwendet werden, um Materialien auszuladen.
|
||||||
block.unloader.description = Entlädt Materialien aus einem Container, Tresor oder einer Basis auf ein Förderband oder direkt in einen benachbarten Block. Der Typ des auszuladenden Materials kann durch darauf tippen verändert werden.
|
block.unloader.description = Entlädt Materialien aus einem Container, Tresor oder einer Basis auf ein Förderband oder direkt in einen benachbarten Block. Der Typ des auszuladenden Materials kann durch darauf tippen verändert werden.
|
||||||
block.launch-pad.description = Startet Stapel von Items, ohne dass ein Kernstart erforderlich ist. Unvollendet.
|
block.launch-pad.description = Startet Stapel von Items, ohne dass ein Kernstart erforderlich ist. Unvollendet.
|
||||||
block.launch-pad-large.description = Eine verbesserte Version des Launchpads. Speichert weitere Items. Wird häufiger gestartet.
|
block.launch-pad-large.description = Eine verbesserte Version des Launchpads. Speichert weitere Items. Wird häufiger gestartet.
|
||||||
|
|||||||
1069
core/assets/bundles/bundle_eu.properties
Normal file
@@ -15,12 +15,14 @@ screenshot = Capture d'écran sauvegardée à {0}
|
|||||||
screenshot.invalid = La carte est trop large, il n'y a potentiellement pas assez de mémoire pour la capture d'écran.
|
screenshot.invalid = La carte est trop large, il n'y a potentiellement pas assez de mémoire pour la capture d'écran.
|
||||||
gameover = Game over
|
gameover = Game over
|
||||||
gameover.pvp = L'équipe [accent] {0}[] a gagnée !
|
gameover.pvp = L'équipe [accent] {0}[] a gagnée !
|
||||||
highscore = [YELLOW]Nouveau meilleur score!
|
highscore = [accent]Nouveau meilleur score!
|
||||||
load.sound = Sonds
|
|
||||||
|
load.sound = Sons
|
||||||
load.map = Cartes
|
load.map = Cartes
|
||||||
load.image = Images
|
load.image = Images
|
||||||
load.content = Contenus
|
load.content = Contenus
|
||||||
load.system = Système
|
load.system = Système
|
||||||
|
|
||||||
stat.wave = Vagues vaincues:[accent] {0}
|
stat.wave = Vagues vaincues:[accent] {0}
|
||||||
stat.enemiesDestroyed = Ennemis détruits:[accent] {0}
|
stat.enemiesDestroyed = Ennemis détruits:[accent] {0}
|
||||||
stat.built = Bâtiments construits:[accent] {0}
|
stat.built = Bâtiments construits:[accent] {0}
|
||||||
@@ -28,13 +30,14 @@ stat.destroyed = Bâtiments détruits:[accent] {0}
|
|||||||
stat.deconstructed = Bâtiments déconstruits:[accent] {0}
|
stat.deconstructed = Bâtiments déconstruits:[accent] {0}
|
||||||
stat.delivered = Ressources transférées:
|
stat.delivered = Ressources transférées:
|
||||||
stat.rank = Rang Final: [accent]{0}
|
stat.rank = Rang Final: [accent]{0}
|
||||||
|
|
||||||
launcheditems = [accent]Ressources transférées
|
launcheditems = [accent]Ressources transférées
|
||||||
map.delete = Êtes-vous sûr de supprimer cette carte "[accent]{0}[]"?
|
map.delete = Êtes-vous sûr de vouloir supprimer cette carte "[accent]{0}[]"?
|
||||||
level.highscore = Meilleur score: [accent]{0}
|
level.highscore = Meilleur score: [accent]{0}
|
||||||
level.select = Sélection de niveau
|
level.select = Sélection de niveau
|
||||||
level.mode = Mode de jeu:
|
level.mode = Mode de jeu:
|
||||||
showagain = Ne pas montrer la prochaine fois
|
showagain = Ne pas montrer la prochaine fois
|
||||||
coreattack = [scarlet]<La base est en train d'être attaquée>
|
coreattack = [scarlet]<La base est attaquée>
|
||||||
nearpoint = [ [scarlet]QUITTEZ LE POINT D'APPARITION ENNEMI IMMÉDIATEMENT[] ]\nannihilation imminente
|
nearpoint = [ [scarlet]QUITTEZ LE POINT D'APPARITION ENNEMI IMMÉDIATEMENT[] ]\nannihilation imminente
|
||||||
database = Base de données
|
database = Base de données
|
||||||
savegame = Sauvegarder la partie
|
savegame = Sauvegarder la partie
|
||||||
@@ -49,8 +52,17 @@ close = Fermer
|
|||||||
website = Site Web
|
website = Site Web
|
||||||
quit = Quitter
|
quit = Quitter
|
||||||
maps = Cartes
|
maps = Cartes
|
||||||
|
maps.browse = Parcourir les Cartes
|
||||||
continue = Continuer
|
continue = Continuer
|
||||||
maps.none = [LIGHT_GRAY]Aucune carte trouvée!
|
maps.none = [lightgray]Aucune carte trouvée!
|
||||||
|
invalid = Invalide
|
||||||
|
preparingconfig = Préparation de la Configuration
|
||||||
|
preparingcontent = Préparation du Contenu
|
||||||
|
uploadingcontent = Publication du Contenu
|
||||||
|
uploadingpreviewfile = Publication du Fichier d'Aperçu
|
||||||
|
committingchanges = Validation des Modifications
|
||||||
|
done = Fait
|
||||||
|
|
||||||
about.button = À propos
|
about.button = À propos
|
||||||
name = Nom:
|
name = Nom:
|
||||||
noname = Commencer par choisir un[accent] nom de joueur[].
|
noname = Commencer par choisir un[accent] nom de joueur[].
|
||||||
@@ -58,34 +70,37 @@ filename = Nom du fichier:
|
|||||||
unlocked = Nouveau bloc débloqué!
|
unlocked = Nouveau bloc débloqué!
|
||||||
completed = [accent]Complété
|
completed = [accent]Complété
|
||||||
techtree = Arbre technologique
|
techtree = Arbre technologique
|
||||||
research.list = [LIGHT_GRAY]Recherche:
|
research.list = [lightgray]Recherche:
|
||||||
research = Rechercher
|
research = Rechercher
|
||||||
researched = [LIGHT_GRAY]{0} recherché(e).
|
researched = [lightgray]{0} recherché(e).
|
||||||
players = {0} joueurs en ligne
|
players = {0} joueurs en ligne
|
||||||
players.single = {0} joueurs en ligne
|
players.single = {0} joueur en ligne
|
||||||
server.closing = [accent]Fermeture du serveur...
|
server.closing = [accent]Fermeture du serveur...
|
||||||
server.kicked.kick = Vous avez été expulsé du serveur!
|
server.kicked.kick = Vous avez été expulsé du serveur!
|
||||||
|
server.kicked.whitelist = You are not whitelisted here.
|
||||||
server.kicked.serverClose = Serveur fermé.
|
server.kicked.serverClose = Serveur fermé.
|
||||||
server.kicked.vote = Vous avez été expulsé à cause d'un vote. Au revoir!
|
server.kicked.vote = Vous avez été expulsé suite à un vote. Au revoir.
|
||||||
server.kicked.clientOutdated = Client dépassé! Mettez à votre jeu à jour!
|
server.kicked.clientOutdated = Client obsolète! Mettez à votre jeu à jour!
|
||||||
server.kicked.serverOutdated = Serveur dépassé! Demandez à l'hôte de le mettre à jour!
|
server.kicked.serverOutdated = Serveur obsolète! Demandez à l'hôte de le mettre à jour!
|
||||||
server.kicked.banned = Vous avez été banni sur ce serveur.
|
server.kicked.banned = Vous avez été banni sur ce serveur.
|
||||||
server.kicked.typeMismatch = Ce serveur n'est pas compatible avec votre type de version.
|
server.kicked.typeMismatch = Ce serveur n'est pas compatible avec votre version du jeu.
|
||||||
|
server.kicked.playerLimit = Ce serveur est plein. Veuillez attendre qu'une place se libére.
|
||||||
server.kicked.recentKick = Vous avez été expulsé récemment.\nAttendez avant de vous connecter à nouveau.
|
server.kicked.recentKick = Vous avez été expulsé récemment.\nAttendez avant de vous connecter à nouveau.
|
||||||
server.kicked.nameInUse = Il y a déjà quelqu'un avec\n ce nom sur ce serveur.
|
server.kicked.nameInUse = Il y a déjà quelqu'un avec\nce nom sur ce serveur.
|
||||||
server.kicked.nameEmpty = Votre nom est invalide.
|
server.kicked.nameEmpty = Votre nom est invalide.
|
||||||
server.kicked.idInUse = Vous êtes déjà sur ce serveur! Se connecter avec deux comptes n'est pas permis!
|
server.kicked.idInUse = Vous êtes déjà sur ce serveur! Se connecter avec deux comptes n'est pas permis.
|
||||||
server.kicked.customClient = Ce serveur ne supporte pas les versions personnalisées (Custom builds). Téléchargez une version officielle.
|
server.kicked.customClient = Ce serveur ne supporte pas les versions personnalisées (Custom builds). Téléchargez une version officielle.
|
||||||
server.kicked.gameover = Game over!
|
server.kicked.gameover = Game over!
|
||||||
server.versions = Votre version:[accent] {0}[]\nLa version du serveur:[accent] {1}[]
|
server.versions = Votre version:[accent] {0}[]\nLa version du serveur:[accent] {1}[]
|
||||||
host.info = Le bouton [accent]Héberger[] héberge un serveur sur le port [scarlet]6567[]. \nN'importe qui sur le même [LIGHT_GRAY]wifi ou réseau local []devrait voir votre serveur sur leur liste des serveurs.\n\nSi vous voulez que les gens puissent s'y connecter de partout à l'aide de votre IP, [accent]le transfert de port (port forwarding)[] est requis.\n\n[LIGHT_GRAY]Note: Si quelqu'un a des problèmes de connexion à votre partie LAN, vérifiez que vous avez autorisé l'accès à Mindustry sur votre réseau local dans les paramètres de votre pare-feu.
|
host.info = Le bouton [accent]Héberger[] héberge un serveur sur le port [scarlet]6567[]. \nN'importe qui sur le même [lightgray]wifi ou réseau local []devrait voir votre serveur sur leur liste des serveurs.\n\nSi vous voulez que les gens puissent s'y connecter de partout à l'aide de votre IP, [accent]le transfert de port (port forwarding)[] est requis.\n\n[lightgray]Note: Si quelqu'un a des problèmes de connexion à votre partie LAN, vérifiez que vous avez autorisé l'accès à Mindustry sur votre réseau local dans les paramètres de votre pare-feu.
|
||||||
join.info = Ici vous pouvez entrez [accent]l'adresse IP d'un serveur []pour s'y connecter, ou découvrir un serveur en [accent]réseau local[].\nLe multijoueur en LAN ainsi qu'en WAN est supporté.\n\n[LIGHT_GRAY]Note: Il n'y a pas de liste de serveurs globaux automatiques; Si vous voulez vous connectez à quelqu'un par IP, il faudra d'abord demander à l'hébergeur leur IP.
|
join.info = Ici vous pouvez entrez [accent]l'adresse IP d'un serveur []pour s'y connecter, ou découvrir un serveur en [accent]réseau local[].\nLe multijoueur en LAN ainsi qu'en WAN est supporté.\n\n[lightgray]Note: Il n'y a pas de liste de serveurs globaux automatiques; Si vous voulez vous connectez à quelqu'un par IP, il faudra d'abord demander à l'hébergeur leur IP.
|
||||||
hostserver = Héberger une partie
|
hostserver = Héberger une partie
|
||||||
hostserver.mobile = Héberger\nune partie
|
hostserver.mobile = Héberger\nune partie
|
||||||
host = Héberger
|
host = Héberger
|
||||||
hosting = [accent]Préparation du serveur...
|
hosting = [accent]Préparation du serveur...
|
||||||
hosts.refresh = Actualiser
|
hosts.refresh = Actualiser
|
||||||
hosts.discovering = Découverte de jeux en LAN
|
hosts.discovering = Recherche des jeux en LAN
|
||||||
|
hosts.discovering.any = Recherche de parties
|
||||||
server.refreshing = Actualisation du serveur
|
server.refreshing = Actualisation du serveur
|
||||||
hosts.none = [lightgray]Aucun jeu en LAN trouvé!
|
hosts.none = [lightgray]Aucun jeu en LAN trouvé!
|
||||||
host.invalid = [scarlet]Impossible de se connecter à l'hôte.
|
host.invalid = [scarlet]Impossible de se connecter à l'hôte.
|
||||||
@@ -101,28 +116,31 @@ server.bans.none = Aucun joueur banni trouvé!
|
|||||||
server.admins = Administrateurs
|
server.admins = Administrateurs
|
||||||
server.admins.none = Pas d'administrateurs trouvés!
|
server.admins.none = Pas d'administrateurs trouvés!
|
||||||
server.add = Ajouter un serveur
|
server.add = Ajouter un serveur
|
||||||
server.delete = Êtes-vous sûr de supprimer ce serveur ?
|
server.delete = Êtes-vous sûr de vouloir supprimer ce serveur ?
|
||||||
server.edit = Modifier le serveur
|
server.edit = Modifier le serveur
|
||||||
server.outdated = [crimson]Serveur obsolète![]
|
server.outdated = [crimson]Serveur obsolète![]
|
||||||
server.outdated.client = [crimson]Client obsolète![]
|
server.outdated.client = [crimson]Client obsolète![]
|
||||||
server.version = [lightgray]Version: {0} {1}
|
server.version = [lightgray]Version: {0} {1}
|
||||||
server.custombuild = [yellow]Version personnalisée
|
server.custombuild = [yellow]Version personnalisée
|
||||||
confirmban = Êtes-vous sûr de bannir ce joueur?
|
confirmban = Souhaitez vous vraiment bannir ce joueur?
|
||||||
confirmkick = Êtes-vous sûr d'expulser ce joueur?
|
confirmkick = Souhaitez vous vraiment expulser ce joueur?
|
||||||
confirmunban = Êtes-vous sûr de réintégrer ce joueur ?
|
confirmunban = Souhaitez vous vraiment réintégrer ce joueur ?
|
||||||
confirmadmin = Êtes-vous sûr de faire de ce joueur un administrateur?
|
confirmadmin = Souhaitez vous vraiment rendre ce joueur administrateur?
|
||||||
confirmunadmin = Êtes-vous sûr d'enlever le statut d'administrateur à ce joueur?
|
confirmunadmin = Souhaitez vous vraiment enlever le statut d'administrateur à ce joueur?
|
||||||
joingame.title = Rejoindre une partie
|
joingame.title = Rejoindre une partie
|
||||||
joingame.ip = IP:
|
joingame.ip = IP:
|
||||||
disconnect = Déconnecté.
|
disconnect = Déconnecté.
|
||||||
|
disconnect.error = Erreur de connexion.
|
||||||
|
disconnect.closed = Connexion fermée.
|
||||||
|
disconnect.timeout = Délai de connexion expiré.
|
||||||
disconnect.data = Les données du monde n'ont pas pu être chargées!
|
disconnect.data = Les données du monde n'ont pas pu être chargées!
|
||||||
connecting = [accent]Connexion...
|
connecting = [accent]Connexion...
|
||||||
connecting.data = [accent]Chargement des données du monde...
|
connecting.data = [accent]Chargement de la partie...
|
||||||
server.port = Port:
|
server.port = Port:
|
||||||
server.addressinuse = Adresse déjà utilisée!
|
server.addressinuse = Adresse déjà utilisée!
|
||||||
server.invalidport = numéro de port invalide!
|
server.invalidport = numéro de port invalide!
|
||||||
server.error = [crimson]Erreur d'hébergement: [accent]{0}
|
server.error = [crimson]Erreur d'hébergement: [accent]{0}
|
||||||
save.old = Cette sauvegarde provient d'une ancienne version du jeu, et ne peut plus être utilisée.\n\n[LIGHT_GRAY]la compatibilité des anciennes sauvegardes sera bientôt ajoutée dans la version 4.0 stable.
|
save.old = Cette sauvegarde provient d'une ancienne version du jeu, et ne peut plus être utilisée.\n\n[lightgray]la compatibilité des anciennes sauvegardes sera bientôt ajoutée dans la version 4.0 stable.
|
||||||
save.new = Nouvelle sauvegarde
|
save.new = Nouvelle sauvegarde
|
||||||
save.overwrite = Êtes-vous sûr de vouloir\n écraser cette sauvegarde ?
|
save.overwrite = Êtes-vous sûr de vouloir\n écraser cette sauvegarde ?
|
||||||
overwrite = Écraser
|
overwrite = Écraser
|
||||||
@@ -133,25 +151,25 @@ save.delete.confirm = Êtes-vous sûr de vouloir supprimer cette sauvegarde?
|
|||||||
save.delete = Supprimer
|
save.delete = Supprimer
|
||||||
save.export = Exporter une\nsauvegarde
|
save.export = Exporter une\nsauvegarde
|
||||||
save.import.invalid = [accent]Cette sauvegarde est invalide!
|
save.import.invalid = [accent]Cette sauvegarde est invalide!
|
||||||
save.import.fail = [crimson]L'importation de la sauvegarde\na échoué: [accent]{0}
|
save.import.fail = [crimson]Échec d'importation: [accent]{0}
|
||||||
save.export.fail = [crimson]L'exportation de la sauvegarde\na échoué [accent]{0}
|
save.export.fail = [crimson]Échec d'exportation: [accent]{0}
|
||||||
save.import = Importer une sauvegarde
|
save.import = Importer une sauvegarde
|
||||||
save.newslot = Nom de la sauvegarde:
|
save.newslot = Nom de la sauvegarde:
|
||||||
save.rename = Renommer
|
save.rename = Renommer
|
||||||
save.rename.text = Nouveau nom:
|
save.rename.text = Nouveau nom:
|
||||||
selectslot = Sélectionner une sauvegarde.
|
selectslot = Choisissez une sauvegarde.
|
||||||
slot = [accent]Emplacement {0}
|
slot = [accent]Emplacement {0}
|
||||||
save.corrupted = [accent]Fichier de sauvegarde corrompu ou invalide!\nSi vous venez de mettre à jour votre jeu, c'est probablement dû à un changement du format de sauvegarde et [scarlet]pas[] à un bug.
|
save.corrupted = [accent]Sauvegarde corrompue ou invalide!\nSi vous venez de mettre à jour votre jeu, c'est probablement dû à un changement du format de sauvegarde et [scarlet]pas[] à un bug.
|
||||||
empty = <vide>
|
empty = <vide>
|
||||||
on = Activé
|
on = Activé
|
||||||
off = Désactivé
|
off = Désactivé
|
||||||
save.autosave = Sauvegarde automatique: {0}
|
save.autosave = Sauvegarde automatique: {0}
|
||||||
save.map = Carte: {0}
|
save.map = Carte: {0}
|
||||||
save.wave = Vague {0}
|
save.wave = Vague {0}
|
||||||
save.difficulty = Difficulté: {0}
|
save.mode = Mode de jeu: {0}
|
||||||
save.date = Dernière sauvegarde: {0}
|
save.date = Dernière sauvegarde: {0}
|
||||||
save.playtime = Temps de jeu: {0}
|
save.playtime = Temps de jeu: {0}
|
||||||
warning = Avertissement
|
warning = Avertissement.
|
||||||
confirm = Confirmer
|
confirm = Confirmer
|
||||||
delete = Supprimer
|
delete = Supprimer
|
||||||
ok = OK
|
ok = OK
|
||||||
@@ -167,41 +185,46 @@ data.exported = Données Exportées.
|
|||||||
data.invalid = Ce ne sont pas des données de jeu valides.
|
data.invalid = Ce ne sont pas des données de jeu valides.
|
||||||
data.import.confirm = L'importation des données externes va effacer[scarlet] toutes[] vos actuelles données de jeu.\n[accent]Ceci ne pourra pas être annulé![]\n\nUne fois les données importées, le jeu quittera immédiatement.
|
data.import.confirm = L'importation des données externes va effacer[scarlet] toutes[] vos actuelles données de jeu.\n[accent]Ceci ne pourra pas être annulé![]\n\nUne fois les données importées, le jeu quittera immédiatement.
|
||||||
classic.export = Exporter les données Classic
|
classic.export = Exporter les données Classic
|
||||||
classic.export.text = [accent]Mindustry[] vient juste d'avoir eu une mise à jour majeur.\nDes données de sauvegarde et/ou de cartes provenant de la version Classic (v3.5 build 40) ont été détectées. Souhaitez-vous exporter ces sauvegardes dans le dossier accueil de votre télephone, pour les utiliser dans Mindustry Classic ?
|
classic.export.text = [accent]Mindustry[] vient d'avoir une mise à jour majeure.\nDes sauvegardes et/ou des cartes de la version Classic (v3.5 build 40) ont été détectées. Souhaitez-vous exporter ces sauvegardes dans le dossier accueil de votre télephone, pour les utiliser dans Mindustry Classic ?
|
||||||
quit.confirm = Êtes-vous sûr de quitter?
|
quit.confirm = Êtes-vous sûr de vouloir quitter?
|
||||||
quit.confirm.tutorial = Êtes-vous sur de ce que vous faites ?\n Le tutoriel peut être repris dans [accent]Paramètres->Jeu->Reprendre le turoriel.[]
|
quit.confirm.tutorial = Êtes-vous sur de ce que vous faites?\nLe tutoriel peut être repris dans [accent]Paramètres->Jeu->Reprendre le tutoriel.[]
|
||||||
loading = [accent]Chargement...
|
loading = [accent]Chargement...
|
||||||
saving = [accent]Sauvegarde...
|
saving = [accent]Sauvegarde...
|
||||||
wave = [accent]Vague {0}
|
wave = [accent]Vague {0}
|
||||||
wave.waiting = [LIGHT_GRAY]Vague dans {0}
|
wave.waiting = [lightgray]Vague dans {0}
|
||||||
wave.waveInProgress = [LIGHT_GRAY]Wave en cours
|
wave.waveInProgress = [lightgray]Wave en cours
|
||||||
waiting = [LIGHT_GRAY]En attente...
|
waiting = [lightgray]En attente...
|
||||||
waiting.players = En attente de joueurs...
|
waiting.players = En attente de joueurs...
|
||||||
wave.enemies = [LIGHT_GRAY]{0} Ennemis restants
|
wave.enemies = [lightgray]{0} Ennemis restants
|
||||||
wave.enemy = [LIGHT_GRAY]{0} Ennemi restant
|
wave.enemy = [lightgray]{0} Ennemi restant
|
||||||
loadimage = Charger l'image
|
loadimage = Charger l'image
|
||||||
saveimage = Sauvegarder l'image
|
saveimage = Sauvegarder l'image
|
||||||
unknown = Inconnu
|
unknown = Inconnu
|
||||||
custom = Personnalisé
|
custom = Personnalisé
|
||||||
builtin = Intégré
|
builtin = Intégré
|
||||||
map.delete.confirm = Êtes-vous sûr de supprimer cette carte? Cette action ne peut pas être défaite!
|
map.delete.confirm = Voulez vous vraiment supprimer cette carte? Cette action ne peut pas être annulée!
|
||||||
map.random = [accent]Carte aléatoire
|
map.random = [accent]Carte aléatoire
|
||||||
map.nospawn = Cette carte n'a pas de base pour qu'un joueur puisse y apparaisse! Veiller ajouter une [ROYAL]base bleue[] sur cette carte dans l'éditeur.
|
map.nospawn = Cette carte n'a pas de base pour qu'un joueur puisse y apparaisse! Ajoutez une base[accent] orange[] sur cette carte dans l'éditeur.
|
||||||
map.nospawn.pvp = Cette carte n'a pas de base ennemies pour qu'un joueur ennemi y apparaisse! Ajouter au moins une [SCARLET]base rouge[] sur cette carte dans l'éditeur.
|
map.nospawn.pvp = Cette carte n'a pas de base ennemies pour qu'un joueur ennemi y apparaisse! Ajouter au moins une base [SCARLET] non-orange[] dans l'éditeur.
|
||||||
map.nospawn.attack = Cette carte n'a aucune base ennemie à attaquer! Veuillez ajouter une [SCARLET]base rouge[] sur cette carte dans l'éditeur.
|
map.nospawn.attack = Cette carte n'a aucune base ennemie à attaquer! Veuillez ajouter une base[SCARLET] rouge[] sur cette carte dans l'éditeur.
|
||||||
map.invalid = Erreur lors du chargement de la carte: carte corrompue ou invalide.
|
map.invalid = Erreur lors du chargement de la carte: carte corrompue ou invalide.
|
||||||
|
map.publish.error = Erreur de Publication de la Carte: {0}
|
||||||
|
map.publish = Carte publiée.
|
||||||
|
map.publishing = [accent]Publication de la carte...
|
||||||
editor.brush = Pinceau
|
editor.brush = Pinceau
|
||||||
editor.openin = Ouvrir dans l'éditeur
|
editor.openin = Ouvrir dans l'éditeur
|
||||||
editor.oregen = Génération de minerais
|
editor.oregen = Génération de minerais
|
||||||
editor.oregen.info = Génération de minerais:
|
editor.oregen.info = Génération de minerais:
|
||||||
editor.mapinfo = Infos sur la carte
|
editor.mapinfo = Infos Carte
|
||||||
editor.author = Auteur:
|
editor.author = Auteur:
|
||||||
editor.description = Description:
|
editor.description = Description:
|
||||||
editor.waves = Vagues:
|
editor.waves = Vagues:
|
||||||
editor.rules = Règles:
|
editor.rules = Règles:
|
||||||
editor.generation = Génération:
|
editor.generation = Génération:
|
||||||
editor.ingame = Éditer dans le jeu
|
editor.ingame = Éditer dans le jeu
|
||||||
|
editor.publish.workshop = Publier sur le Workshop
|
||||||
editor.newmap = Nouvelle carte
|
editor.newmap = Nouvelle carte
|
||||||
|
workshop = Workshop
|
||||||
waves.title = Vagues
|
waves.title = Vagues
|
||||||
waves.remove = Supprimer
|
waves.remove = Supprimer
|
||||||
waves.never = <jamais>
|
waves.never = <jamais>
|
||||||
@@ -216,37 +239,39 @@ waves.copy = Copier dans le Presse-papiers
|
|||||||
waves.load = Coller depuis le Presse-papiers
|
waves.load = Coller depuis le Presse-papiers
|
||||||
waves.invalid = Vagues invalides dans le Presse-papiers.
|
waves.invalid = Vagues invalides dans le Presse-papiers.
|
||||||
waves.copied = Vagues copiées
|
waves.copied = Vagues copiées
|
||||||
waves.none = Aucun enemies définis.\nNotez que les dispositions de vagues vides seront automatiquement remplacées par les dispositions par défauts.
|
waves.none = Aucun enemies définis.\nNotez que les vagues vides seront automatiquement remplacées par une vague générée par défaut.
|
||||||
editor.default = [LIGHT_GRAY]<par défaut>
|
editor.default = [lightgray]<par défaut>
|
||||||
|
details = Détails...
|
||||||
edit = Modifier...
|
edit = Modifier...
|
||||||
editor.name = Nom:
|
editor.name = Nom:
|
||||||
editor.spawn = Faire apparaitre l'unité
|
editor.spawn = Créer l'unité
|
||||||
editor.removeunit = Enlever l'unité
|
editor.removeunit = Enlever l'unité
|
||||||
editor.teams = Équipe
|
editor.teams = Équipe
|
||||||
editor.errorload = Erreur lors du chargement du fichier:\n[accent]{0}
|
editor.errorload = Erreur lors du chargement du fichier:\n[accent]{0}
|
||||||
editor.errorsave = Erreur lors de la sauvegarde du fichier:\n[accent]{0}
|
editor.errorsave = Erreur lors de la sauvegarde du fichier:\n[accent]{0}
|
||||||
editor.errorimage = Ceci est une image, et non une carte. Changer l'extension du fichier ne marchera pas.\n\nSi vous voulez importer une carte d'une ancienne version, utilisez le bouton 'importer une ancienne carte' dans l'éditeur.
|
editor.errorimage = Ceci est une image, et non une carte. \n\nSi vous voulez importer une carte provenant de la version 3.5 (build 40), utilisez le bouton 'importer une carte obsolète (image)' dans l'éditeur.
|
||||||
editor.errorlegacy = Cette carte est trop ancienne, et utilise un format de carte qui n'est plus supporté.
|
editor.errorlegacy = Cette carte est trop ancienne, et utilise un format de carte qui n'est plus supporté.
|
||||||
editor.errorheader = Le fichier de carte est soit invalide ou corrompu.
|
editor.errornot = Ceci n'est pas un fichier de carte.
|
||||||
editor.errorname = La carte n'a pas de nom!
|
editor.errorheader = Le fichier de carte est invalide ou corrompu.
|
||||||
|
editor.errorname = La carte n'a pas de nom, essayez vous de charger une sauvegarde?
|
||||||
editor.update = Mettre à jour
|
editor.update = Mettre à jour
|
||||||
editor.randomize = Aléatoiriser
|
editor.randomize = Rendre aléatoire
|
||||||
editor.apply = Appliquer
|
editor.apply = Appliquer
|
||||||
editor.generate = Générer
|
editor.generate = Générer
|
||||||
editor.resize = Redimensionner
|
editor.resize = Redimensionner
|
||||||
editor.loadmap = Charger une carte
|
editor.loadmap = Charger la carte
|
||||||
editor.savemap = Sauvegarder une carte
|
editor.savemap = Sauvegarder la carte
|
||||||
editor.saved = Sauvegardé!
|
editor.saved = Sauvegardé!
|
||||||
editor.save.noname = Votre carte n'a pas de nom ! Définissez-en un sur le menu 'info de la carte'.
|
editor.save.noname = Votre carte n'a pas de nom! Ajoutez un nom dans le menu 'info de la carte'.
|
||||||
editor.save.overwrite = Votre carte réécrit une carte intégrée! Choisissez un nom différent dans le menu 'info de la carte' .
|
editor.save.overwrite = Votre carte écrase une carte du jeu de base! Choisissez un nom différent dans le menu 'info de la carte' .
|
||||||
editor.import.exists = [scarlet]Importation impossible :[] Une carte intégrée nommé '{0}' existe déjà!
|
editor.import.exists = [scarlet]Importation impossible :[] '{0}' est le nom d'une carte du jeu de base!
|
||||||
editor.import = Importation...
|
editor.import = Importation...
|
||||||
editor.importmap = Importer une carte
|
editor.importmap = Importer une carte
|
||||||
editor.importmap.description = Importer une carte existante
|
editor.importmap.description = Importer une carte existante
|
||||||
editor.importfile = Importer un fichier
|
editor.importfile = Importer un fichier
|
||||||
editor.importfile.description = Importer un fichier de carte extérieur
|
editor.importfile.description = Importer une carte externe
|
||||||
editor.importimage = Importer l'image du terrain
|
editor.importimage = Importer une carte obsolète
|
||||||
editor.importimage.description = Importer une image de la carte extérieure
|
editor.importimage.description = Importer une carte externe (image)
|
||||||
editor.export = Exporter...
|
editor.export = Exporter...
|
||||||
editor.exportfile = Exporter un fichier
|
editor.exportfile = Exporter un fichier
|
||||||
editor.exportfile.description = Exporter un fichier de carte
|
editor.exportfile.description = Exporter un fichier de carte
|
||||||
@@ -254,12 +279,13 @@ editor.exportimage = Exporter l'image du terrain
|
|||||||
editor.exportimage.description = Exporter une image de la carte
|
editor.exportimage.description = Exporter une image de la carte
|
||||||
editor.loadimage = Importer le terrain
|
editor.loadimage = Importer le terrain
|
||||||
editor.saveimage = Exporter le terrain
|
editor.saveimage = Exporter le terrain
|
||||||
editor.unsaved = [scarlet]Vous avez des modifications non sauvegardés ![]Voulez-vous vraiment quitter ?
|
editor.unsaved = [scarlet]Vous n'avez pas sauvegardé vos modifications![]Voulez-vous vraiment quitter ?
|
||||||
editor.resizemap = Redimensionner\nla carte
|
editor.resizemap = Redimensionner\nla carte
|
||||||
editor.mapname = Nom de la carte:
|
editor.mapname = Nom de la carte:
|
||||||
editor.overwrite = [accent]Attention !\nCeci réécrit une carte existante.
|
editor.overwrite = [accent]Attention!\nCeci écrase une carte existante.
|
||||||
editor.overwrite.confirm = [scarlet]Attention ![] Une carte avec ce nom existe déjà. Êtes-vous sûr de vouloir la réécrire?
|
editor.overwrite.confirm = [scarlet]Attention![] Une carte avec ce nom existe déjà. Êtes-vous sûr de vouloir l'écraser?
|
||||||
editor.selectmap = Sélectionnez une carte:
|
editor.selectmap = Sélectionnez une carte:
|
||||||
|
|
||||||
toolmode.replace = Remplacer
|
toolmode.replace = Remplacer
|
||||||
toolmode.replace.description = Dessiner seulement sur les blocs solides.
|
toolmode.replace.description = Dessiner seulement sur les blocs solides.
|
||||||
toolmode.replaceall = Tout remplacer
|
toolmode.replaceall = Tout remplacer
|
||||||
@@ -271,10 +297,11 @@ toolmode.square.description = Pinceau carré.
|
|||||||
toolmode.eraseores = Effacer les minéraux
|
toolmode.eraseores = Effacer les minéraux
|
||||||
toolmode.eraseores.description = Efface seulement les minéraux.
|
toolmode.eraseores.description = Efface seulement les minéraux.
|
||||||
toolmode.fillteams = Remplire les équipes
|
toolmode.fillteams = Remplire les équipes
|
||||||
toolmode.fillteams.description = Rempli les équipes au lieu de blocs.
|
toolmode.fillteams.description = Rempli les équipes au lieu des blocs.
|
||||||
toolmode.drawteams = Dessiner les équipes
|
toolmode.drawteams = Dessiner les équipes
|
||||||
toolmode.drawteams.description = Dessine les équipes au lieu de blocs.
|
toolmode.drawteams.description = Dessine les équipes au lieu de blocs.
|
||||||
filters.empty = [LIGHT_GRAY]Aucun filtre! Ajoutez-en un avec les boutons ci-dessous.
|
|
||||||
|
filters.empty = [lightgray]Aucun filtre! Ajoutez-en un avec les boutons ci-dessous.
|
||||||
filter.distort = Déformation
|
filter.distort = Déformation
|
||||||
filter.noise = Bruit
|
filter.noise = Bruit
|
||||||
filter.median = Median
|
filter.median = Median
|
||||||
@@ -305,6 +332,7 @@ filter.option.floor2 = Sol secondaire
|
|||||||
filter.option.threshold2 = Seuil secondaire
|
filter.option.threshold2 = Seuil secondaire
|
||||||
filter.option.radius = Rayon
|
filter.option.radius = Rayon
|
||||||
filter.option.percentile = Centile
|
filter.option.percentile = Centile
|
||||||
|
|
||||||
width = Largeur:
|
width = Largeur:
|
||||||
height = Hauteur:
|
height = Hauteur:
|
||||||
menu = Menu
|
menu = Menu
|
||||||
@@ -322,83 +350,89 @@ tutorial.retake = Re-Take Tutorial
|
|||||||
editor = Éditeur
|
editor = Éditeur
|
||||||
mapeditor = Éditeur de carte
|
mapeditor = Éditeur de carte
|
||||||
donate = Faire un\ndon
|
donate = Faire un\ndon
|
||||||
abandon = Abandon
|
|
||||||
|
abandon = Abandonner
|
||||||
abandon.text = Cette zone et toutes ses ressources vont être perdues.
|
abandon.text = Cette zone et toutes ses ressources vont être perdues.
|
||||||
locked = Verrouillé
|
locked = Verrouillé
|
||||||
complete = [LIGHT_GRAY]Compléter:
|
complete = [lightgray]Compléter:
|
||||||
zone.requirement = Vague {0} dans la zone {1}
|
zone.requirement = Vague {0} dans la zone {1}
|
||||||
resume = Reprendre la partie en cours:\n[LIGHT_GRAY]{0}
|
resume = Reprendre la partie:\n[lightgray]{0}
|
||||||
bestwave = [LIGHT_GRAY]Meilleur: {0}
|
bestwave = [lightgray]Meilleur: {0}
|
||||||
launch = Lancement
|
launch = < Lancement >
|
||||||
launch.title = Lancement réussi
|
launch.title = Lancement réussi
|
||||||
launch.next = [LIGHT_GRAY] Prochaine opportunité à la vague {0}
|
launch.next = [lightgray]Prochaine opportunité à la vague {0}
|
||||||
launch.unable2 = [scarlet]Lancement impossible.[]
|
launch.unable2 = [scarlet]Lancement impossible.[]
|
||||||
launch.confirm = Cela va transférer toutes les ressources dans votre noyau.\nVous ne pourrez plus retourner à cette base.
|
launch.confirm = Cela va transférer toutes les ressources de votre noyau.\nVous ne pourrez plus retourner à cette base.
|
||||||
launch.skip.confirm = Si vous sautez maintenant, vous ne pourriez pas effectuer le lancement avant les prochaines vagues.
|
launch.skip.confirm = Si vous passez à la vague suivante, vous ne pourrez pas effectuer le lancement avant les prochaines vagues.
|
||||||
uncover = Découvrir
|
uncover = Découvrir
|
||||||
configure = Configurer le transfert des ressources.
|
configure = Modifier les ressources emportées.
|
||||||
configure.locked = [LIGHT_GRAY]Atteignez la vague {0}\npour configurer le transfert des ressources
|
configure.locked = [lightgray]Atteignez la vague {0}\npour configurer les ressources emportées.
|
||||||
zone.unlocked = [LIGHT_GRAY]{0} Débloquée.
|
configure.invalid = Le montant doit être un nombre compris entre 0 et {0}.
|
||||||
|
zone.unlocked = [lightgray]{0} Débloquée.
|
||||||
zone.requirement.complete = Vague {0} atteinte:\n{1} Exigences de la zone complétées
|
zone.requirement.complete = Vague {0} atteinte:\n{1} Exigences de la zone complétées
|
||||||
zone.config.complete = Vague {0} atteinte:\nConfiguration du transfert débloquée.
|
zone.config.complete = Vague {0} atteinte:\nConfiguration des ressources emportées possible.
|
||||||
zone.resources = Ressources détectées:
|
zone.resources = [lightgray]Ressources détectées:
|
||||||
zone.objective = [lightgray]Objective: [accent]{0}
|
zone.objective = [lightgray]Objective: [accent]{0}
|
||||||
zone.objective.survival = Survive
|
zone.objective.survival = Survivre
|
||||||
zone.objective.attack = Détruire le noyau ennemi
|
zone.objective.attack = Détruire le noyau ennemi
|
||||||
add = Ajouter...
|
add = Ajouter...
|
||||||
boss.health = Vie du Boss
|
boss.health = Santé du Boss
|
||||||
connectfail = [crimson]Échec de la connexion au serveur : [accent]{0}
|
|
||||||
error.unreachable = Serveur injoignable.
|
connectfail = [crimson]Échec de la connexion au serveur :\n\n[accent]{0}
|
||||||
|
error.unreachable = Serveur injoignable.\nL'adresse IP est correcte?
|
||||||
error.invalidaddress = Adresse invalide.
|
error.invalidaddress = Adresse invalide.
|
||||||
error.timedout = Délai de connexion dépassé!\nAssurez-vous que l'hôte a autorisé l'accès au port, et que l'adresse soit correcte!
|
error.timedout = Délai de connexion dépassé!\nAssurez-vous que l'hôte a autorisé l'accès au port (port forwarding), et que l'adresse soit correcte!
|
||||||
error.mismatch = Erreur de paquet:\nPossible différence de verison entre le client et le serveur .\nVérifiez que vous et l'hôte avez la version de Mindustry la plus recente!
|
error.mismatch = Erreur de paquet:\nPossible différence de verison entre le client et le serveur .\nVérifiez que vous et l'hôte avez la version de Mindustry la plus recente!
|
||||||
error.alreadyconnected = Déjà connecté.
|
error.alreadyconnected = Déjà connecté.
|
||||||
error.mapnotfound = Fichier de la carte introuvable!
|
error.mapnotfound = Carte introuvable!
|
||||||
error.io = Erreur de Réseau (I/O)
|
error.io = Erreur de Réseau (I/O)
|
||||||
error.any = Erreur réseau inconnue
|
error.any = Erreur réseau inconnue
|
||||||
error.bloom = Echec de l'initialisation du flou lumineux.\nVotre appareil peux ne pas le supporter.
|
error.bloom = Echec de l'initialisation du flou lumineux.\nVotre appareil peux ne pas le supporter.
|
||||||
|
|
||||||
zone.groundZero.name = Première Bataille
|
zone.groundZero.name = Première Bataille
|
||||||
zone.desertWastes.name = Décharge Désertique
|
zone.desertWastes.name = Désert Sauvage
|
||||||
zone.craters.name = Les Cratères
|
zone.craters.name = Les Cratères
|
||||||
zone.frozenForest.name = Forêt Glaciale
|
zone.frozenForest.name = Forêt Glaciale
|
||||||
zone.ruinousShores.name = Rives en Ruine
|
zone.ruinousShores.name = Rives en Ruine
|
||||||
zone.stainedMountains.name = Montagnes Tâchetées
|
zone.stainedMountains.name = Montagnes Tâchetées
|
||||||
zone.desolateRift.name = Fissure abandonnée
|
zone.desolateRift.name = Ravin Abandonné
|
||||||
zone.nuclearComplex.name = Complexe nucléaire
|
zone.nuclearComplex.name = Complexe Nucléaire
|
||||||
zone.overgrowth.name = Surcroissance
|
zone.overgrowth.name = Surcroissance Végétale
|
||||||
zone.tarFields.name = Champs de Pétrole
|
zone.tarFields.name = Champs de Pétrole
|
||||||
zone.saltFlats.name = Marais Salants
|
zone.saltFlats.name = Marais Salants
|
||||||
zone.impact0078.name = Impact 0078
|
zone.impact0078.name = Impact 0078
|
||||||
zone.crags.name = Rochers
|
zone.crags.name = Rochers
|
||||||
zone.fungalPass.name = Fungal Pass
|
zone.fungalPass.name = Passe Fongique
|
||||||
zone.groundZero.description = L'emplacement optimal pour commencer. Faible menace ennemie. Peu de ressources. \nRecueillez autant de plomb et de cuivre que possible.\nBougez-vous.
|
|
||||||
zone.frozenForest.description = Même ici, plus près des montagnes, les spores se sont propagées. Les températures glaciales ne pourront pas les contenir pour toujours.\n\nFamiliarisez vous avec l'Énergie. Construisez des generateurs a combustion. Aprenez a utiliser les réparateurs.
|
zone.groundZero.description = L'emplacement optimal pour débuter. Faible menace ennemie. Peu de ressources. \nRecueillez autant de plomb et de cuivre que possible.\nRien d'autre à signaler.
|
||||||
zone.desertWastes.description = Ces déchets sont vastes, imprévisibles et se croisent avec des structures sectorielles abandonnées.\nLe charbon est présent dans la région. Brulew-le pour génerer de l'Énergie ou synthétisez-le en graphite.\n\n[lightgray]Ce lieu d'atterisage est imprévisible.
|
zone.frozenForest.description = Même ici, plus près des montagnes, les spores se sont propagées. Les températures glaciales ne pourront pas les contenir pour toujours.\n\nFamiliarisez vous avec l'Énergie. Construisez des générateurs a combustion. Aprenez a utiliser les réparateurs.
|
||||||
zone.saltFlats.description = Aux abords du désert se trouvent les Marais Salants. Peu de ressources peuvent être trouvées à cet endroit.\n\nL'ennemi y a érigé un complexe de stockage de ressources. Éradiquez leur présence.
|
zone.desertWastes.description = Cette étendue désertique est immense, imprévisibles. On y croise des structures abandonnées.\nLe charbon est présent dans la région. Brulez-le pour générer de l'Énergie ou synthétisez-le en graphite.\n\n[lightgray]Ce lieu d'atterisage est imprévisible.
|
||||||
zone.craters.description = L'eau s'est accumulée dans ce cratère, vestige des guerres anciennes. Récupérez la zone. Recueilliez du sable pour le transformer en méta-verre. Pompez de l'eau pour refroidir les tourelles et les perceuses.
|
zone.saltFlats.description = Aux abords du désert se trouvent les Marais Salants. Peu de ressources peuvent être trouvées à cet endroit.\n\nL'ennemi y a érigé un stockage de ressources. Éradiquez leur présence.
|
||||||
zone.ruinousShores.description = Passé les déchets, c'est le rivage. Auparavent, cet endroit a abrité un réseau de défense côtière. Il n'en reste pas beaucoup. Seules les structures de défense les plus élémentaires sont restées indemnes, tout le reste étant réduit à néant. Continuez l'expansion en avant. Redécouvrez la technologie.
|
zone.craters.description = L'eau s'est accumulée dans ce cratère, vestige des guerres anciennes. Récupérez la zone. Recueilliez du sable pour le transformer en verre trempé. Pompez de l'eau pour refroidir les tourelles et les perceuses.
|
||||||
zone.stainedMountains.description = Plus à l'intérieur des terres se trouvent les montagnes, non polluées encore par les spores. Extrayez le titane qui abonde dans cette région. Apprenez à vous en servir. L'ennemi est plus présent ici. Ne leur donnez pas le temps d'envoyer leurs unités les plus fortes.
|
zone.ruinousShores.description = Passé les contrées désertiques, c'est le rivage. Auparavent, cet endroit a abrité un réseau de défense côtière. Il n'en reste pas beaucoup. Seules les structures de défense les plus élémentaires sont restées indemnes, tout le reste étant réduit à néant.\nÉtendez vous. Redécouvrez la technologie.
|
||||||
zone.overgrowth.description = Cette zone est envahie par la végétation, étant plus proche de la source des spores.\nL’ennemi a établi une base ici. Construisez des unitées Poignards pour le détruire. Reprends ce qui a été perdu.
|
zone.stainedMountains.description = A l'intérieur des terres se trouvent des montagnes, épargnées par les spores. Extrayez le titane qui abonde dans cette région. Apprenez à vous en servir. La menace ennemi se fait plus présente ici. Ne leur donnez pas le temps de rallier leurs puissantes unités.
|
||||||
zone.tarFields.description = La périphérie d'une zone de production de pétrole, entre les montagnes et le désert. Une des rares zones disposant de réserves de Pétrole utilisables. Bien qu'abandonnée, cette zone compte des forces ennemies dangereuses à proximité. Ne les sous-estimez pas.\n\n[lightgray]Si possible, recherchez les technologie de traitement d'huile.
|
zone.overgrowth.description = Cette zone est étouffée par la végétation, et proche de la source des spores.\nL’ennemi a établi une base ici. Construisez des unitées Titan pour le détruire. Reprennez ce qui a été perdu.
|
||||||
zone.desolateRift.description = Une zone extrêmement dangereuse. Ressources abondantes, mais peu d'espace. Risque élevé de destruction. Partez le plus vite possible. Ne vous laissez pas berner par le long espacement entre les attaques ennemies.
|
zone.tarFields.description = La périphérie d'une zone de puits pétroliers, entre montagnes et désert. Une des rares zones disposant de réserves de Pétrole utilisables. Bien qu'abandonnée, cette zone compte des forces ennemies dangereuses à proximité. Ne les sous-estimez pas.\n\n[lightgray]Si possible, recherchez les technologie de traitement d'huile.
|
||||||
zone.nuclearComplex.description = Une ancienne installation de production et de traitement de thorium, réduite en ruines.\n[lightgray]Faites des recherches sur le thorium et ses nombreuses utilisations.\n\nL'ennemi est présent ici en grand nombre, guettant constamment les assaillants.
|
zone.desolateRift.description = Une zone extrêmement dangereuse. Ressources abondantes, mais peu d'espace. Fort risque de destruction. Repartez le plus vite possible. Ne vous laissez pas berner par une longue attente entre deux vagues ennemies.
|
||||||
zone.fungalPass.description = A transition area between high mountains and lower, spore-ridden lands. A small enemy reconnaissance base is located here.\nDestroy it.\nUse Dagger and Crawler units. Take out the two cores.
|
zone.nuclearComplex.description = Une ancienne installation de production et traitement de thorium réduite en ruines.\n[lightgray]Faites des recherches sur le thorium et ses nombreuses utilisations.\n\nL'ennemi est présent ici en grand nombre, à l'affut constant.
|
||||||
|
zone.fungalPass.description = Une zone de transition entre les hautes montagnes et les basses régions infestées de spores. Une petite base de reconnaissance ennemie s'y trouve.\nDétruisez la.\nUtilisez les unités Poignard et Rampeurs. Détruisez les deux noyaux.
|
||||||
zone.impact0078.description = <insérer une description ici>
|
zone.impact0078.description = <insérer une description ici>
|
||||||
zone.crags.description = <insérer une description ici>
|
zone.crags.description = <insérer une description ici>
|
||||||
|
|
||||||
settings.language = Langue
|
settings.language = Langue
|
||||||
settings.data = Données du Jeu
|
settings.data = Données du Jeu
|
||||||
settings.reset = Valeurs par défaut.
|
settings.reset = Valeurs par Défaut.
|
||||||
settings.rebind = Réattribuer
|
settings.rebind = Réattribuer
|
||||||
settings.controls = Contrôles
|
settings.controls = Contrôles
|
||||||
settings.game = Jeu
|
settings.game = Jeu
|
||||||
settings.sound = Son
|
settings.sound = Son
|
||||||
settings.graphics = Graphismes
|
settings.graphics = Graphismes
|
||||||
settings.cleardata = Effacer les données du jeu...
|
settings.cleardata = Effacer les données du jeu...
|
||||||
settings.clear.confirm = Êtes-vous sûr d'effacer ces données ?\nCe qui est fait ne peut pas être défait!
|
settings.clear.confirm = Êtes-vous sûr d'effacer ces données ?\nAucun retour en arrière n'est possible!
|
||||||
settings.clearall.confirm = [scarlet]ATTENTION![]\nCet action effacera toutes les données, y conpris les sauvegarges, les cartes, les déblocages et la configuration des touches.\nUne fois que vous aurez pressé 'ok' le jeu effacera TOUTES les données et se fermera.
|
settings.clearall.confirm = [scarlet]ATTENTION![]\nCet action effacera toutes les données, y conpris les sauvegarges, les cartes, la progression et la configuration des touches.\nUne fois que vous aurez pressé 'ok' le jeu effacera TOUTES les données et se fermera.
|
||||||
settings.clearunlocks = Effacer les déblocages
|
settings.clearunlocks = Effacer la progression
|
||||||
settings.clearall = Tout effacer
|
settings.clearall = Tout effacer
|
||||||
paused = En pause
|
paused = [accent]< Pause >
|
||||||
yes = Oui
|
yes = Oui
|
||||||
no = Non
|
no = Non
|
||||||
info.title = Info
|
info.title = Info
|
||||||
@@ -408,71 +442,75 @@ attackpvponly = [scarlet]Seulement disponible dans les modes Attaque et PvP
|
|||||||
blocks.input = Input
|
blocks.input = Input
|
||||||
blocks.output = Output
|
blocks.output = Output
|
||||||
blocks.booster = Booster
|
blocks.booster = Booster
|
||||||
block.unknown = [LIGHT_GRAY]???
|
block.unknown = [lightgray]???
|
||||||
blocks.powercapacity = Capacité d'énergie
|
blocks.powercapacity = Capacité d'énergie
|
||||||
blocks.powershot = Énergie/Tir
|
blocks.powershot = Énergie/Tir
|
||||||
blocks.damage = Dégâts
|
blocks.damage = Dégâts
|
||||||
blocks.targetsair = Cible les unités aériennes
|
blocks.targetsair = Cibles Aériennes
|
||||||
blocks.targetsground = Cible les unités terrestres
|
blocks.targetsground = Cibles Terrestres
|
||||||
blocks.itemsmoved = Vitesse de Déplacement
|
blocks.itemsmoved = Vitesse de Déplacement
|
||||||
blocks.launchtime = Temps entre chaque lancement
|
blocks.launchtime = Temps entre chaque lancement
|
||||||
blocks.shootrange = Portée
|
blocks.shootrange = Portée
|
||||||
blocks.size = Taille
|
blocks.size = Taille
|
||||||
blocks.liquidcapacity = Capacité en liquide
|
blocks.liquidcapacity = Capacité liquide
|
||||||
blocks.powerrange = Distance de transmission
|
blocks.powerrange = Portée électrique
|
||||||
blocks.poweruse = Énergie utilisée
|
blocks.poweruse = Énergie utilisée
|
||||||
blocks.powerdamage = Énergie/Dégâts
|
blocks.powerdamage = Énergie/Dégâts
|
||||||
blocks.itemcapacity = Stockage
|
blocks.itemcapacity = Stockage
|
||||||
blocks.basepowergeneration = Génération d'énergie minimale
|
blocks.basepowergeneration = Taux d'énergie normale
|
||||||
blocks.productiontime = Temps de production
|
blocks.productiontime = Durée de production
|
||||||
blocks.repairtime = Temps pour la Réparation Totale du Bloc
|
blocks.repairtime = Durée de Réparation Complète du Bloc
|
||||||
blocks.speedincrease = Accéleration
|
blocks.speedincrease = Accéleration
|
||||||
blocks.range = Portée
|
blocks.range = Portée
|
||||||
blocks.drilltier = Forable
|
blocks.drilltier = Forable
|
||||||
blocks.drillspeed = Vitesse de forage de base
|
blocks.drillspeed = Vitesse de forage de base
|
||||||
blocks.boosteffect = Boost Effect
|
blocks.boosteffect = Boost Effect
|
||||||
blocks.maxunits = Nombre d'unités actives maximal
|
blocks.maxunits = Unités actives max
|
||||||
blocks.health = Santé
|
blocks.health = Santé
|
||||||
blocks.buildtime = Temps de construction
|
blocks.buildtime = Durée de construction
|
||||||
blocks.inaccuracy = Précision
|
blocks.buildcost = Coût de Construction
|
||||||
blocks.shots = Tir
|
blocks.inaccuracy = Imprécision
|
||||||
|
blocks.shots = Tirs
|
||||||
blocks.reload = Tirs/Seconde
|
blocks.reload = Tirs/Seconde
|
||||||
blocks.ammo = Munitions
|
blocks.ammo = Munitions
|
||||||
bar.drilltierreq = Meilleure Foreuse Requise
|
|
||||||
|
bar.drilltierreq = Foreuse Ameliorée Requise
|
||||||
bar.drillspeed = Vitesse de forage: {0}/s
|
bar.drillspeed = Vitesse de forage: {0}/s
|
||||||
bar.efficiency = Efficacité: {0}%
|
bar.efficiency = Efficacité: {0}%
|
||||||
bar.powerbalance = Énergie: {0}/s
|
bar.powerbalance = Énergie: {0}/s
|
||||||
bar.poweramount = Énergie: {0}
|
bar.poweramount = Énergie: {0}
|
||||||
bar.poweroutput = Énergie en sortie: {0}
|
bar.poweroutput = Énergie Produite: {0}
|
||||||
bar.items = Objets: {0}
|
bar.items = Objets: {0}
|
||||||
bar.liquid = Liquide
|
bar.liquid = Liquide
|
||||||
bar.heat = Chaleur
|
bar.heat = Chaleur
|
||||||
bar.power = Énergie
|
bar.power = Énergie
|
||||||
bar.progress = Progression de la construction
|
bar.progress = Progression de la construction
|
||||||
bar.spawned = Unités: {0}/{1}
|
bar.spawned = Unités: {0}/{1}
|
||||||
bullet.damage = [stat]{0}[lightgray] dgt
|
|
||||||
bullet.splashdamage = [stat]{0}[lightgray] dgt de zone ~[stat] {1}[lightgray] tuiles
|
bullet.damage = [stat]{0}[lightgray] dégâts
|
||||||
|
bullet.splashdamage = [stat]{0}[lightgray] dégâts de zone ~[stat] {1}[lightgray] blocs
|
||||||
bullet.incendiary = [stat]incendiaire
|
bullet.incendiary = [stat]incendiaire
|
||||||
bullet.homing = [stat]autoguidage
|
bullet.homing = [stat]autoguidé
|
||||||
bullet.shock = [stat]choc
|
bullet.shock = [stat]choc
|
||||||
bullet.frag = [stat]fragmentation
|
bullet.frag = [stat]explose
|
||||||
bullet.knockback = [stat]{0}[lightgray] recul
|
bullet.knockback = [stat]{0}[lightgray] recul
|
||||||
bullet.freezing = [stat]gel
|
bullet.freezing = [stat]gel
|
||||||
bullet.tarred = [stat]Pétrolené
|
bullet.tarred = [stat]goudronné
|
||||||
bullet.multiplier = [stat]{0}[lightgray]x multiplicateur de munitions
|
bullet.multiplier = [stat]{0}[lightgray]x multiplicateur de munitions
|
||||||
bullet.reload = [stat]{0}[lightgray]x rechargement
|
bullet.reload = [stat]{0}[lightgray]x vitesse de tir
|
||||||
|
|
||||||
unit.blocks = blocs
|
unit.blocks = blocs
|
||||||
unit.powersecond = Énergie/seconde
|
unit.powersecond = énergie/seconde
|
||||||
unit.liquidsecond = Liquides/seconde
|
unit.liquidsecond = unité de liquide/seconde
|
||||||
unit.itemssecond = Objets/seconde
|
unit.itemssecond = objets/seconde
|
||||||
unit.liquidunits = Unité de liquide
|
unit.liquidunits = unité de liquide
|
||||||
unit.powerunits = Unité d'énergie
|
unit.powerunits = unité d'énergie
|
||||||
unit.degrees = degrés
|
unit.degrees = degrés
|
||||||
unit.seconds = secondes
|
unit.seconds = secondes
|
||||||
unit.persecond = /sec
|
unit.persecond = /sec
|
||||||
unit.timesspeed = x speed
|
unit.timesspeed = x vitesse
|
||||||
unit.percent = %
|
unit.percent = %
|
||||||
unit.items = Objets
|
unit.items = objets
|
||||||
category.general = Général
|
category.general = Général
|
||||||
category.power = Énergie
|
category.power = Énergie
|
||||||
category.liquids = Liquides
|
category.liquids = Liquides
|
||||||
@@ -480,20 +518,20 @@ category.items = Objets
|
|||||||
category.crafting = Fabrication
|
category.crafting = Fabrication
|
||||||
category.shooting = Défense
|
category.shooting = Défense
|
||||||
category.optional = Améliorations optionnelles
|
category.optional = Améliorations optionnelles
|
||||||
setting.landscape.name = Verrouiller la rotation en mode paysage
|
setting.landscape.name = Verrouiller en rotation paysage
|
||||||
setting.shadows.name = Ombres
|
setting.shadows.name = Ombres
|
||||||
setting.linear.name = Filtrage Linéaire
|
setting.linear.name = Filtrage Linéaire
|
||||||
setting.animatedwater.name = Eau animée
|
setting.animatedwater.name = Eau animée
|
||||||
setting.animatedshields.name = Boucliers Animés
|
setting.animatedshields.name = Boucliers Animés
|
||||||
setting.antialias.name = Antialias[LIGHT_GRAY] (requiert le redémarrage du jeu)[]
|
setting.antialias.name = Antialias[lightgray] (redémarrage du jeu nécéssaire)[]
|
||||||
setting.indicators.name = Indicateurs pour les alliés
|
setting.indicators.name = Indicateurs Alliés/Ennemis
|
||||||
setting.autotarget.name = Visée automatique
|
setting.autotarget.name = Visée automatique
|
||||||
setting.keyboard.name = Controles sourie+clavier
|
setting.keyboard.name = Controles Sourie+Clavier
|
||||||
setting.fpscap.name = FPS Max
|
setting.fpscap.name = FPS Max
|
||||||
setting.fpscap.none = Aucun
|
setting.fpscap.none = Aucun
|
||||||
setting.fpscap.text = {0} FPS
|
setting.fpscap.text = {0} FPS
|
||||||
setting.uiscale.name = Échelle de l'UI[lightgray] (requiert le redémarrage du jeu)[]
|
setting.uiscale.name = Échelle de l'interface[lightgray] (redémarrage du jeu nécéssaire)[]
|
||||||
setting.swapdiagonal.name = Autoriser le placement des blocs en diagonal
|
setting.swapdiagonal.name = Autoriser le placement en diagonale
|
||||||
setting.difficulty.training = Entraînement
|
setting.difficulty.training = Entraînement
|
||||||
setting.difficulty.easy = Facile
|
setting.difficulty.easy = Facile
|
||||||
setting.difficulty.normal = Normal
|
setting.difficulty.normal = Normal
|
||||||
@@ -501,31 +539,32 @@ setting.difficulty.hard = Difficile
|
|||||||
setting.difficulty.insane = Extrême
|
setting.difficulty.insane = Extrême
|
||||||
setting.difficulty.name = Difficulté:
|
setting.difficulty.name = Difficulté:
|
||||||
setting.screenshake.name = Tremblement de l'écran
|
setting.screenshake.name = Tremblement de l'écran
|
||||||
setting.effects.name = Montrer les effets
|
setting.effects.name = Afficher les effets
|
||||||
setting.sensitivity.name = Sensibilité de la manette
|
setting.sensitivity.name = Sensibilité de la manette
|
||||||
setting.saveinterval.name = Intervalle des sauvegardes auto
|
setting.saveinterval.name = Intervalle des sauvegardes auto
|
||||||
setting.seconds = {0} secondes
|
setting.seconds = {0} secondes
|
||||||
setting.fullscreen.name = Plein écran
|
setting.fullscreen.name = Plein Écran
|
||||||
setting.borderlesswindow.name = Ecran sans bords[LIGHT_GRAY] (peut requérir le redémarrage du jeu)
|
setting.borderlesswindow.name = Fenêtre sans bords (Borderless)[lightgray] (peut requérir le redémarrage du jeu)
|
||||||
setting.fps.name = Afficher FPS
|
setting.fps.name = Afficher FPS
|
||||||
setting.vsync.name = VSync
|
setting.vsync.name = VSync
|
||||||
setting.lasers.name = Afficher les rayons des lasers
|
setting.lasers.name = Afficher les connections Électriques
|
||||||
setting.pixelate.name = Pixeliser[LIGHT_GRAY] (désactive les animations)
|
setting.pixelate.name = Pixeliser[lightgray] (désactive les animations)
|
||||||
setting.minimap.name = Montrer la minimap
|
setting.minimap.name = Montrer la Minimap
|
||||||
setting.musicvol.name = Volume de la musique
|
setting.musicvol.name = Volume Musique
|
||||||
setting.ambientvol.name = Ambient Volume
|
setting.ambientvol.name = Volume Ambiant
|
||||||
setting.mutemusic.name = Couper la musique
|
setting.mutemusic.name = Couper la Musique
|
||||||
setting.sfxvol.name = Volume des SFX
|
setting.sfxvol.name = Volume des Effets Spéciaux
|
||||||
setting.mutesound.name = Couper les SFX
|
setting.mutesound.name = Couper les Effets Spéciaux Sonores
|
||||||
setting.crashreport.name = Envoyer un rapport de crash anonyme
|
setting.crashreport.name = Envoyer un Rapport de Crash Anonyme
|
||||||
setting.savecreate.name = Créer des Sauvegardes Automatiquement
|
setting.savecreate.name = Sauvegardes Auto
|
||||||
setting.chatopacity.name = Opacité du chat
|
setting.publichost.name = Visibilité de la Partie Publique
|
||||||
setting.playerchat.name = Montrer le chat
|
setting.chatopacity.name = Opacité du Chat
|
||||||
uiscale.reset = L'échelle de l'UI a été modifiée.\nAppuyez sur "OK" pour confirmer.\n[scarlet]Rétablissement aux parametres d'avant et fermeture dans [accent] {0}[]...
|
setting.playerchat.name = Montrer le Chat
|
||||||
|
uiscale.reset = L'échelle de l'interface a été modifiée.\nAppuyez sur "OK" pour confirmer.\n[scarlet]Rétablissement aux parametres d'avant et fermeture dans [accent] {0}[]...
|
||||||
uiscale.cancel = Annuler & Quitter
|
uiscale.cancel = Annuler & Quitter
|
||||||
setting.bloom.name = Flou lumineux
|
setting.bloom.name = Flou lumineux
|
||||||
keybind.title = Paramétrer les racourcis claviers
|
keybind.title = Racourcis Clavier
|
||||||
keybinds.mobile = [scarlet]La plupart des racourcis claviers ne sont pas fonctionnels sur mobile. Seulement les mouvements de base sont supportés.
|
keybinds.mobile = [scarlet]La plupart des racourcis claviers ne sont pas fonctionnels sur mobile. Seuls les mouvements basiques sont supportés.
|
||||||
category.general.name = Général
|
category.general.name = Général
|
||||||
category.view.name = Voir
|
category.view.name = Voir
|
||||||
category.multiplayer.name = Multijoueur
|
category.multiplayer.name = Multijoueur
|
||||||
@@ -540,7 +579,7 @@ keybind.screenshot.name = Capture d'écran
|
|||||||
keybind.move_x.name = Mouvement x
|
keybind.move_x.name = Mouvement x
|
||||||
keybind.move_y.name = Mouvement y
|
keybind.move_y.name = Mouvement y
|
||||||
keybind.fullscreen.name = Basculer en Plein Écran
|
keybind.fullscreen.name = Basculer en Plein Écran
|
||||||
keybind.select.name = Sélectionner
|
keybind.select.name = Sélectionner/Tirer
|
||||||
keybind.diagonal_placement.name = Placement en diagonale
|
keybind.diagonal_placement.name = Placement en diagonale
|
||||||
keybind.pick.name = Choisir un bloc
|
keybind.pick.name = Choisir un bloc
|
||||||
keybind.break_block.name = Suppprimer un bloc
|
keybind.break_block.name = Suppprimer un bloc
|
||||||
@@ -551,8 +590,8 @@ keybind.zoom.name = Zoom
|
|||||||
keybind.menu.name = Menu
|
keybind.menu.name = Menu
|
||||||
keybind.pause.name = Pause
|
keybind.pause.name = Pause
|
||||||
keybind.minimap.name = Minimap
|
keybind.minimap.name = Minimap
|
||||||
keybind.dash.name = Courir
|
keybind.dash.name = Sprint
|
||||||
keybind.chat.name = chat
|
keybind.chat.name = Chat
|
||||||
keybind.player_list.name = Liste des joueurs
|
keybind.player_list.name = Liste des joueurs
|
||||||
keybind.console.name = Console
|
keybind.console.name = Console
|
||||||
keybind.rotate.name = Tourner
|
keybind.rotate.name = Tourner
|
||||||
@@ -560,11 +599,11 @@ keybind.toggle_menus.name = Cacher/afficher les menus
|
|||||||
keybind.chat_history_prev.name = Remonter l'historique du chat
|
keybind.chat_history_prev.name = Remonter l'historique du chat
|
||||||
keybind.chat_history_next.name = Descendre l'historique du chat
|
keybind.chat_history_next.name = Descendre l'historique du chat
|
||||||
keybind.chat_scroll.name = Défilement du chat
|
keybind.chat_scroll.name = Défilement du chat
|
||||||
keybind.drop_unit.name = Larger les unitées
|
keybind.drop_unit.name = Larguer l'unité
|
||||||
keybind.zoom_minimap.name = Zoom minimap
|
keybind.zoom_minimap.name = Zoom minimap
|
||||||
mode.help.title = Description des modes de jeu
|
mode.help.title = Description des modes de jeu
|
||||||
mode.survival.name = Survie
|
mode.survival.name = Survie
|
||||||
mode.survival.description = Le mode normal. Ressources limitées et vagues automatiques.
|
mode.survival.description = Le mode normal. Ressources limitées et vagues automatiques.\n[gray]Nécéssite un point d'apparition pour les ennemis.
|
||||||
mode.sandbox.name = Bac à sable
|
mode.sandbox.name = Bac à sable
|
||||||
mode.sandbox.description = Ressources infinies et pas de minuterie pour les vagues.
|
mode.sandbox.description = Ressources infinies et pas de minuterie pour les vagues.
|
||||||
mode.pvp.name = PvP
|
mode.pvp.name = PvP
|
||||||
@@ -572,32 +611,34 @@ mode.pvp.description = Battez-vous contre d'autres joueurs en local.\n[gray]Requ
|
|||||||
mode.attack.name = Attaque
|
mode.attack.name = Attaque
|
||||||
mode.attack.description = Pas de vagues, le but étant de détruire la base ennemie.\n[gray]Requiert un noyaux rouge dans la map pour y jouer.
|
mode.attack.description = Pas de vagues, le but étant de détruire la base ennemie.\n[gray]Requiert un noyaux rouge dans la map pour y jouer.
|
||||||
mode.custom = Règles personnalisées
|
mode.custom = Règles personnalisées
|
||||||
|
|
||||||
rules.infiniteresources = Ressources infinies
|
rules.infiniteresources = Ressources infinies
|
||||||
rules.wavetimer = Minuterie pour les vagues
|
rules.wavetimer = Minuterie pour les vagues
|
||||||
rules.waves = Vagues
|
rules.waves = Vagues
|
||||||
rules.attack = Attack Mode
|
rules.attack = Mode d'Attaque
|
||||||
rules.enemyCheat = Ressources infinies pour l'IA
|
rules.enemyCheat = Ressources infinies pour l'IA
|
||||||
rules.unitdrops = Drops des unités
|
rules.unitdrops = Drops des unités
|
||||||
rules.unitbuildspeedmultiplier = Multiplicateur de la vitesse de création d'unitées
|
rules.unitbuildspeedmultiplier = Multiplicateur de Vitesse de Construction d'Unités
|
||||||
rules.unithealthmultiplier = Multiplicateur de la vie des unitées
|
rules.unithealthmultiplier = Multiplicateur de Santé des Unités
|
||||||
rules.playerhealthmultiplier = Multiplicateur de la vie des joueurs
|
rules.playerhealthmultiplier = Multiplicateur de Santé des Joueurs
|
||||||
rules.playerdamagemultiplier = Multiplicateur des dégats causés par les joueurs
|
rules.playerdamagemultiplier = Multiplicateur des Dégâts Joueurs
|
||||||
rules.unitdamagemultiplier = Multiplicateur des dégats causés par les unité
|
rules.unitdamagemultiplier = Multiplicateur des Dégats Unité
|
||||||
rules.enemycorebuildradius = Rayon de non-construction autour du noyau ennemi:[LIGHT_GRAY] (tuiles)
|
rules.enemycorebuildradius = Périmètre de non-construction du noyau ennemi:[lightgray] (blocs)
|
||||||
rules.respawntime = Temps de réaparition:[LIGHT_GRAY] (sec)
|
rules.respawntime = Durée de réaparition:[lightgray] (sec)
|
||||||
rules.wavespacing = Temps entre les vagues:[LIGHT_GRAY] (sec)
|
rules.wavespacing = Espacement des vagues:[lightgray] (sec)
|
||||||
rules.buildcostmultiplier = Multiplicateur du prix de construction
|
rules.buildcostmultiplier = Multiplicateur du prix de construction
|
||||||
rules.buildspeedmultiplier = Multiplicateur du temps de construction
|
rules.buildspeedmultiplier = Multiplicateur du temps de construction
|
||||||
rules.waitForWaveToEnd = Les vagues attendent la mort des ennemis
|
rules.waitForWaveToEnd = Les vagues attendent la mort des ennemis
|
||||||
rules.dropzoneradius = Rayon d'apparition des ennemis:[LIGHT_GRAY] (tuiles)
|
rules.dropzoneradius = Rayon d'apparition des ennemis:[lightgray] (tuiles)
|
||||||
rules.respawns = Réapparitions max par vagues
|
rules.respawns = Réapparitions max par vagues
|
||||||
rules.limitedRespawns = Limite de réapparition
|
rules.limitedRespawns = Limiter les réapparition
|
||||||
rules.title.waves = Vagues
|
rules.title.waves = Vagues
|
||||||
rules.title.respawns = Réapparitions
|
rules.title.respawns = Réapparitions
|
||||||
rules.title.resourcesbuilding = Ressources & Constructions
|
rules.title.resourcesbuilding = Ressources & Construction
|
||||||
rules.title.player = Joueurs
|
rules.title.player = Joueurs
|
||||||
rules.title.enemy = Ennemis
|
rules.title.enemy = Ennemis
|
||||||
rules.title.unit = Unités
|
rules.title.unit = Unités
|
||||||
|
|
||||||
content.item.name = Objets
|
content.item.name = Objets
|
||||||
content.liquid.name = Liquides
|
content.liquid.name = Liquides
|
||||||
content.unit.name = Unités
|
content.unit.name = Unités
|
||||||
@@ -609,83 +650,84 @@ item.coal.name = Charbon
|
|||||||
item.graphite.name = Graphite
|
item.graphite.name = Graphite
|
||||||
item.titanium.name = Titane
|
item.titanium.name = Titane
|
||||||
item.thorium.name = Thorium
|
item.thorium.name = Thorium
|
||||||
item.silicon.name = Silicone
|
item.silicon.name = Silice
|
||||||
item.plastanium.name = Plastanium
|
item.plastanium.name = Plastanium
|
||||||
item.phase-fabric.name = Tissu phasé
|
item.phase-fabric.name = Tissu Phasé
|
||||||
item.surge-alloy.name = Alliage superchargé
|
item.surge-alloy.name = Alliage Superchargé
|
||||||
item.spore-pod.name = Spore Pod
|
item.spore-pod.name = Glande de Spore
|
||||||
item.sand.name = Sable
|
item.sand.name = Sable
|
||||||
item.blast-compound.name = Mélange explosif
|
item.blast-compound.name = Mélange Explosif
|
||||||
item.pyratite.name = Pyratite
|
item.pyratite.name = Pyratite
|
||||||
item.metaglass.name = Méta-Verre
|
item.metaglass.name = Verre Trempé
|
||||||
item.scrap.name = Ferraille
|
item.scrap.name = Ferraille
|
||||||
liquid.water.name = Eau
|
liquid.water.name = Eau
|
||||||
liquid.slag.name = Scories
|
liquid.slag.name = Scories
|
||||||
liquid.oil.name = Pétrole
|
liquid.oil.name = Pétrole
|
||||||
liquid.cryofluid.name = Liquide cryogénique
|
liquid.cryofluid.name = Liquide Cryogénique
|
||||||
mech.alpha-mech.name = Alpha
|
mech.alpha-mech.name = Alpha
|
||||||
mech.alpha-mech.weapon = Fusil automatique
|
mech.alpha-mech.weapon = Mitraille Lourde
|
||||||
mech.alpha-mech.ability = Essaim de drone
|
mech.alpha-mech.ability = Régénération
|
||||||
mech.delta-mech.name = Delta
|
mech.delta-mech.name = Delta
|
||||||
mech.delta-mech.weapon = Arc électrique
|
mech.delta-mech.weapon = Arc Électrique
|
||||||
mech.delta-mech.ability = Décharge
|
mech.delta-mech.ability = Décharge
|
||||||
mech.tau-mech.name = Tau
|
mech.tau-mech.name = Tau
|
||||||
mech.tau-mech.weapon = Laser restructurant
|
mech.tau-mech.weapon = Laser Restructurant
|
||||||
mech.tau-mech.ability = Explosion réparante
|
mech.tau-mech.ability = Éclat Réparateur
|
||||||
mech.omega-mech.name = Omega
|
mech.omega-mech.name = Omega
|
||||||
mech.omega-mech.weapon = Essaim de missiles auto-guidés
|
mech.omega-mech.weapon = Missiles Essaim
|
||||||
mech.omega-mech.ability = Armure
|
mech.omega-mech.ability = Armure
|
||||||
mech.dart-ship.name = Dard
|
mech.dart-ship.name = Dard
|
||||||
mech.dart-ship.weapon = Pistolet automatique
|
mech.dart-ship.weapon = Mitraillette
|
||||||
mech.javelin-ship.name = Javelin
|
mech.javelin-ship.name = Javelin
|
||||||
mech.javelin-ship.weapon = Missiles explosifs autoguidés
|
mech.javelin-ship.weapon = Missiles Rafale
|
||||||
mech.javelin-ship.ability = Décharge de propulseur
|
mech.javelin-ship.ability = Décharge de Propulseur
|
||||||
mech.trident-ship.name = Trident
|
mech.trident-ship.name = Trident
|
||||||
mech.trident-ship.weapon = Largage de bombes
|
mech.trident-ship.weapon = Bombes
|
||||||
mech.glaive-ship.name = Glaive
|
mech.glaive-ship.name = Glaive
|
||||||
mech.glaive-ship.weapon = Fusil automatique incendiaire
|
mech.glaive-ship.weapon = Mitraille incendiaire
|
||||||
item.explosiveness = [LIGHT_GRAY]Explosivité: {0}
|
item.explosiveness = [LIGHT_GRAY]Explosivité: {0}
|
||||||
item.flammability = [LIGHT_GRAY]Inflammabilité: {0}
|
item.flammability = [LIGHT_GRAY]Inflammabilité: {0}
|
||||||
item.radioactivity = [LIGHT_GRAY]Radioactivité: {0}
|
item.radioactivity = [LIGHT_GRAY]Radioactivité: {0}
|
||||||
unit.health = [LIGHT_GRAY]Santé: {0}
|
unit.health = [LIGHT_GRAY]Santé: {0}
|
||||||
unit.speed = [LIGHT_GRAY]Rapidité: {0}
|
unit.speed = [LIGHT_GRAY]Rapidité: {0}
|
||||||
mech.weapon = [LIGHT_GRAY]Arme: {0}
|
mech.weapon = [LIGHT_GRAY]Arme: {0}
|
||||||
mech.health = [LIGHT_GRAY]Health: {0}
|
mech.health = [LIGHT_GRAY]Santé: {0}
|
||||||
mech.itemcapacity = [LIGHT_GRAY]Capacité de stockage: {0}
|
mech.itemcapacity = [LIGHT_GRAY]Capacité: {0}
|
||||||
mech.minespeed = [LIGHT_GRAY]Vitesse de minage: {0}
|
mech.minespeed = [LIGHT_GRAY]Vitesse d'extraction: {0}
|
||||||
mech.minepower = [LIGHT_GRAY]Puissance du minage: {0}
|
mech.minepower = [LIGHT_GRAY]Puissance d'extraction: {0}
|
||||||
mech.ability = [LIGHT_GRAY]Compétence: {0}
|
mech.ability = [LIGHT_GRAY]Compétence: {0}
|
||||||
mech.buildspeed = [LIGHT_GRAY]Vitesse de construction: {0}%
|
mech.buildspeed = [LIGHT_GRAY]Vitesse de Construction: {0}%
|
||||||
liquid.heatcapacity = [LIGHT_GRAY]Capacité Thermique: {0}
|
liquid.heatcapacity = [LIGHT_GRAY]Capacité Thermique: {0}
|
||||||
liquid.viscosity = [LIGHT_GRAY]Viscosité: {0}
|
liquid.viscosity = [LIGHT_GRAY]Viscosité: {0}
|
||||||
liquid.temperature = [LIGHT_GRAY]Température: {0}
|
liquid.temperature = [LIGHT_GRAY]Température: {0}
|
||||||
block.sand-boulder.name = Bloc de sable
|
|
||||||
|
block.sand-boulder.name = Bloc de Sable
|
||||||
block.grass.name = Herbe
|
block.grass.name = Herbe
|
||||||
block.salt.name = Sel
|
block.salt.name = Sel
|
||||||
block.saltrocks.name = Roches de sel
|
block.saltrocks.name = Roches de sel
|
||||||
block.pebbles.name = Cailloux
|
block.pebbles.name = Cailloux
|
||||||
block.tendrils.name = Vrilles
|
block.tendrils.name = Vrilles
|
||||||
block.sandrocks.name = Roches de sable
|
block.sandrocks.name = Roches de sable
|
||||||
block.spore-pine.name = Spore Piquants
|
block.spore-pine.name = Pin Sporifié
|
||||||
block.sporerocks.name = Spore Rocheux
|
block.sporerocks.name = Roche Sporeuse
|
||||||
block.rock.name = Roche
|
block.rock.name = Roche
|
||||||
block.snowrock.name = Roches enneigés
|
block.snowrock.name = Roches enneigés
|
||||||
block.snow-pine.name = Pin enneigé
|
block.snow-pine.name = Pin enneigé
|
||||||
block.shale.name = Schiste Argileux
|
block.shale.name = Schiste
|
||||||
block.shale-boulder.name = Blocs de Schiste Argileux
|
block.shale-boulder.name = Blocs de Schiste
|
||||||
block.moss.name = Mousse
|
block.moss.name = Mousse
|
||||||
block.shrubs.name = Arbustes
|
block.shrubs.name = Arbustes
|
||||||
block.spore-moss.name = Mousse Sporeuse
|
block.spore-moss.name = Mousse Sporeuse
|
||||||
block.shalerocks.name = Rochets de de Schiste Argileux
|
block.shalerocks.name = Rochets de de Schiste Argileux
|
||||||
block.scrap-wall.name = Murs de Ferraille
|
block.scrap-wall.name = Mur de Ferraille
|
||||||
block.scrap-wall-large.name = Grand Murs de Ferraille
|
block.scrap-wall-large.name = Mur de Ferraille Large
|
||||||
block.scrap-wall-huge.name = Murs de Ferraille Énorme
|
block.scrap-wall-huge.name = Mur de Ferraille Énorme
|
||||||
block.scrap-wall-gigantic.name = Murs de Ferraille Gigantesque
|
block.scrap-wall-gigantic.name = Mur de Ferraille Gigantesque
|
||||||
block.thruster.name = Propulseur
|
block.thruster.name = Propulseur
|
||||||
block.kiln.name = Four
|
block.kiln.name = Four
|
||||||
block.graphite-press.name = Presse à Graphite
|
block.graphite-press.name = Presse à Graphite
|
||||||
block.multi-press.name = Multi-Presse
|
block.multi-press.name = Multi-Presse
|
||||||
block.constructing = {0}\n[LIGHT_GRAY](En Construction)
|
block.constructing = {0}\n[lightgray](En Construction)
|
||||||
block.spawn.name = Point d'Apparition Ennemi
|
block.spawn.name = Point d'Apparition Ennemi
|
||||||
block.core-shard.name = Noyau: Tesson
|
block.core-shard.name = Noyau: Tesson
|
||||||
block.core-foundation.name = Noyau: Fondation
|
block.core-foundation.name = Noyau: Fondation
|
||||||
@@ -704,21 +746,21 @@ block.craters.name = Cratères
|
|||||||
block.sand-water.name = Sable Mouillé
|
block.sand-water.name = Sable Mouillé
|
||||||
block.darksand-water.name = Sable Mouillé Sombre
|
block.darksand-water.name = Sable Mouillé Sombre
|
||||||
block.char.name = Cendre
|
block.char.name = Cendre
|
||||||
block.holostone.name = Pierre Claire
|
block.holostone.name = Pierre Holographique
|
||||||
block.ice-snow.name = Neige Gelée
|
block.ice-snow.name = Neige Gelée
|
||||||
block.rocks.name = Roches
|
block.rocks.name = Roches
|
||||||
block.icerocks.name = Roches de Glace
|
block.icerocks.name = Roches de Glace
|
||||||
block.snowrocks.name = Roches de Neige
|
block.snowrocks.name = Roches des Neiges
|
||||||
block.dunerocks.name = Roches de Dunes
|
block.dunerocks.name = Roches des Dunes
|
||||||
block.pine.name = Pin
|
block.pine.name = Pin
|
||||||
block.white-tree-dead.name = Arbre Blanc Mort
|
block.white-tree-dead.name = Arbre Blanc Mort
|
||||||
block.white-tree.name = Arbre Blanc
|
block.white-tree.name = Arbre Blanc
|
||||||
block.spore-cluster.name = Spores Groupés
|
block.spore-cluster.name = Grappe de Spores
|
||||||
block.metal-floor.name = Plancher de Métal
|
block.metal-floor.name = Plancher Métallique 1
|
||||||
block.metal-floor-2.name = Plancher de Métal 2
|
block.metal-floor-2.name = Plancher Métallique 2
|
||||||
block.metal-floor-3.name = Plancher de Métal 3
|
block.metal-floor-3.name = Plancher Métallique 3
|
||||||
block.metal-floor-5.name = Plancher de Métal 5
|
block.metal-floor-5.name = Plancher Métallique 5
|
||||||
block.metal-floor-damaged.name = Plancher de Métal Endommagé
|
block.metal-floor-damaged.name = Plancher Métallique Endommagé
|
||||||
block.dark-panel-1.name = Panneau Sombre 1
|
block.dark-panel-1.name = Panneau Sombre 1
|
||||||
block.dark-panel-2.name = Panneau Sombre 2
|
block.dark-panel-2.name = Panneau Sombre 2
|
||||||
block.dark-panel-3.name = Panneau Sombre 3
|
block.dark-panel-3.name = Panneau Sombre 3
|
||||||
@@ -785,25 +827,25 @@ block.tau-mech-pad.name = Reconstructeur de Mécha Tau
|
|||||||
block.conduit.name = Conduit
|
block.conduit.name = Conduit
|
||||||
block.mechanical-pump.name = Pompe Mécanique
|
block.mechanical-pump.name = Pompe Mécanique
|
||||||
block.item-source.name = Source de Ressources
|
block.item-source.name = Source de Ressources
|
||||||
block.item-void.name = Destructeur de Ressource
|
block.item-void.name = Destructeur de Ressources
|
||||||
block.liquid-source.name = Source de Liquide
|
block.liquid-source.name = Source de Liquide
|
||||||
block.power-void.name = Absorbeur Énergétique
|
block.power-void.name = Absorbeur Énergétique
|
||||||
block.power-source.name = Énergie Infinie
|
block.power-source.name = Énergie Infinie
|
||||||
block.unloader.name = Déchargeur
|
block.unloader.name = Déchargeur
|
||||||
block.vault.name = Coffre-Fort
|
block.vault.name = Coffre-Fort
|
||||||
block.wave.name = Vague
|
block.wave.name = Vague
|
||||||
block.swarmer.name = Essaimeur
|
block.swarmer.name = Subjugueur
|
||||||
block.salvo.name = Salve
|
block.salvo.name = Salve
|
||||||
block.ripple.name = Onduleur
|
block.ripple.name = Percussion
|
||||||
block.phase-conveyor.name = Convoyeur Phasé
|
block.phase-conveyor.name = Convoyeur Phasé
|
||||||
block.bridge-conveyor.name = Pont
|
block.bridge-conveyor.name = Pont
|
||||||
block.plastanium-compressor.name = Compresseur de Plastanium
|
block.plastanium-compressor.name = Compresseur de Plastanium
|
||||||
block.pyratite-mixer.name = Mixeur à Pyratite
|
block.pyratite-mixer.name = Mixeur de Pyratite
|
||||||
block.blast-mixer.name = Mixeur à Explosion
|
block.blast-mixer.name = Mixeur à Explosion
|
||||||
block.solar-panel.name = Panneau Solaire
|
block.solar-panel.name = Panneau Solaire
|
||||||
block.solar-panel-large.name = Grand Panneau Solaire
|
block.solar-panel-large.name = Grand Panneau Solaire
|
||||||
block.oil-extractor.name = Extracteur d'Huile
|
block.oil-extractor.name = Extracteur de Pétrole
|
||||||
block.command-center.name = Command Center
|
block.command-center.name = Centre de Commandement
|
||||||
block.draug-factory.name = Usine de Drones Draug Mineurs
|
block.draug-factory.name = Usine de Drones Draug Mineurs
|
||||||
block.spirit-factory.name = Usine de Drones Spirituels Réparateurs
|
block.spirit-factory.name = Usine de Drones Spirituels Réparateurs
|
||||||
block.phantom-factory.name = Usine de Drones Fantômes Constructeurs
|
block.phantom-factory.name = Usine de Drones Fantômes Constructeurs
|
||||||
@@ -820,7 +862,7 @@ block.phase-conduit.name = Conduit Phasé
|
|||||||
block.liquid-router.name = Routeur de Liquide
|
block.liquid-router.name = Routeur de Liquide
|
||||||
block.liquid-tank.name = Réservoir à Liquide
|
block.liquid-tank.name = Réservoir à Liquide
|
||||||
block.liquid-junction.name = Jonction à Liquide
|
block.liquid-junction.name = Jonction à Liquide
|
||||||
block.bridge-conduit.name = Pont à Liquide
|
block.bridge-conduit.name = Conduit Surélevé
|
||||||
block.rotary-pump.name = Pompe Rotative
|
block.rotary-pump.name = Pompe Rotative
|
||||||
block.thorium-reactor.name = Réacteur à Thorium
|
block.thorium-reactor.name = Réacteur à Thorium
|
||||||
block.mass-driver.name = Transporteur de Masses
|
block.mass-driver.name = Transporteur de Masses
|
||||||
@@ -830,13 +872,13 @@ block.thermal-generator.name = Générateur Thermique
|
|||||||
block.alloy-smelter.name = Fonderie d'Alliage Superchargé
|
block.alloy-smelter.name = Fonderie d'Alliage Superchargé
|
||||||
block.mender.name = Réparateur
|
block.mender.name = Réparateur
|
||||||
block.mend-projector.name = Projecteur Soignant
|
block.mend-projector.name = Projecteur Soignant
|
||||||
block.surge-wall.name = Mur superchargé
|
block.surge-wall.name = Mur Superchargé
|
||||||
block.surge-wall-large.name = Grand mur superchargé
|
block.surge-wall-large.name = Grand mur Superchargé
|
||||||
block.cyclone.name = Cyclone
|
block.cyclone.name = Cyclone
|
||||||
block.fuse.name = Fusible
|
block.fuse.name = Fusible
|
||||||
block.shock-mine.name = Mines à Chocs
|
block.shock-mine.name = Mine Terreur
|
||||||
block.overdrive-projector.name = Projecteur Surmultiplicateur
|
block.overdrive-projector.name = Projecteur Surmultiplicateur
|
||||||
block.force-projector.name = Projecteur de Champ de Force
|
block.force-projector.name = Champ de Force
|
||||||
block.arc.name = Arc
|
block.arc.name = Arc
|
||||||
block.rtg-generator.name = Générateur G.T.R.
|
block.rtg-generator.name = Générateur G.T.R.
|
||||||
block.spectre.name = Spectre
|
block.spectre.name = Spectre
|
||||||
@@ -844,13 +886,13 @@ block.meltdown.name = Fusion
|
|||||||
block.container.name = Conteneur
|
block.container.name = Conteneur
|
||||||
block.launch-pad.name = Plateforme de Lancement
|
block.launch-pad.name = Plateforme de Lancement
|
||||||
block.launch-pad-large.name = Grande Plateforme de Lancement
|
block.launch-pad-large.name = Grande Plateforme de Lancement
|
||||||
team.blue.name = Bleu
|
team.blue.name = bleu
|
||||||
team.crux.name = red
|
team.crux.name = red
|
||||||
team.sharded.name = orange
|
team.sharded.name = orange
|
||||||
team.orange.name = Orange
|
team.orange.name = orange
|
||||||
team.derelict.name = derelict
|
team.derelict.name = derelict
|
||||||
team.green.name = Vert
|
team.green.name = vert
|
||||||
team.purple.name = Violet
|
team.purple.name = violet
|
||||||
unit.spirit.name = Drone Spirituel Réparateur
|
unit.spirit.name = Drone Spirituel Réparateur
|
||||||
unit.draug.name = Drone Draug Mineur
|
unit.draug.name = Drone Draug Mineur
|
||||||
unit.phantom.name = Drone Fantôme Constructeur
|
unit.phantom.name = Drone Fantôme Constructeur
|
||||||
@@ -858,7 +900,7 @@ unit.dagger.name = Poignard
|
|||||||
unit.crawler.name = Rampeur
|
unit.crawler.name = Rampeur
|
||||||
unit.titan.name = Titan
|
unit.titan.name = Titan
|
||||||
unit.ghoul.name = Goule
|
unit.ghoul.name = Goule
|
||||||
unit.wraith.name = Spectral
|
unit.wraith.name = Spectre
|
||||||
unit.fortress.name = Forteresse
|
unit.fortress.name = Forteresse
|
||||||
unit.revenant.name = Revenant
|
unit.revenant.name = Revenant
|
||||||
unit.eruptor.name = Érupteur
|
unit.eruptor.name = Érupteur
|
||||||
@@ -886,6 +928,8 @@ tutorial.deposit = Déposez des ressources dans des blocs en les faisant glisser
|
|||||||
tutorial.waves = L'[lightgray] ennemi[] approche.\n\nDefend le noyau pendant 2 vagues.[accent] Clique[] pour tirer.\nConstruisez plus de tourelles et de foreuses. Minez plus de cuivre.
|
tutorial.waves = L'[lightgray] ennemi[] approche.\n\nDefend le noyau pendant 2 vagues.[accent] Clique[] pour tirer.\nConstruisez plus de tourelles et de foreuses. Minez plus de cuivre.
|
||||||
tutorial.waves.mobile = L'[lightgray] ennemi[] approche.\n\nDefend le noyau pendant 2 vagues. Votre vaisseau tirera automatiquement sur les ennemis.\nConstruisez plus de tourelles et de foreuses. Minez plus de cuivre.
|
tutorial.waves.mobile = L'[lightgray] ennemi[] approche.\n\nDefend le noyau pendant 2 vagues. Votre vaisseau tirera automatiquement sur les ennemis.\nConstruisez plus de tourelles et de foreuses. Minez plus de cuivre.
|
||||||
tutorial.launch = Une fois que vous aurez atteind une vague spécifique, vous aurez la possibilité de[accent] faire décoler le noyau[], abandonant vos défenses mais en [accent]sécurisant toutes les ressources de votre noyau.[]\nCes ressources peuvent ensuite être utilisées pour rechercher de nouvelles technologies.\n\n[accent]Appuyez sur le bouton de lancement.
|
tutorial.launch = Une fois que vous aurez atteind une vague spécifique, vous aurez la possibilité de[accent] faire décoler le noyau[], abandonant vos défenses mais en [accent]sécurisant toutes les ressources de votre noyau.[]\nCes ressources peuvent ensuite être utilisées pour rechercher de nouvelles technologies.\n\n[accent]Appuyez sur le bouton de lancement.
|
||||||
|
|
||||||
|
|
||||||
item.copper.description = Le matériau structurel de base. Utilisé intensivement dans tout les blocs.
|
item.copper.description = Le matériau structurel de base. Utilisé intensivement dans tout les blocs.
|
||||||
item.lead.description = Un matériau de départ. Utilisé intensivement en électronique et dans les blocs de trasports de liquides.
|
item.lead.description = Un matériau de départ. Utilisé intensivement en électronique et dans les blocs de trasports de liquides.
|
||||||
item.metaglass.description = Un composé de vitre super-résistant. Utilisé largement pour le transport et le stockage de liquides.
|
item.metaglass.description = Un composé de vitre super-résistant. Utilisé largement pour le transport et le stockage de liquides.
|
||||||
@@ -928,7 +972,7 @@ unit.revenant.description = Un arsenal de missiles lourd et planant.
|
|||||||
block.graphite-press.description = Compresse des morceaux de charbon en feuilles de graphite pur.
|
block.graphite-press.description = Compresse des morceaux de charbon en feuilles de graphite pur.
|
||||||
block.multi-press.description = Une version améliorée de la presse à graphite. Utilise de l'eau et de l'électricité pour traiter le charbon rapidement et efficacement.
|
block.multi-press.description = Une version améliorée de la presse à graphite. Utilise de l'eau et de l'électricité pour traiter le charbon rapidement et efficacement.
|
||||||
block.silicon-smelter.description = Réduit le sable avec du charbon pur. Produit du silicone.
|
block.silicon-smelter.description = Réduit le sable avec du charbon pur. Produit du silicone.
|
||||||
block.kiln.description = Fait fondre le sable et le plomb en méta-verre. Nécessite de petites quantités d'énergie.
|
block.kiln.description = Fait fondre le sable et le plomb en verre trempé. Nécessite de petites quantités d'énergie.
|
||||||
block.plastanium-compressor.description = Produit du plastanium à partir d'huile et de titane.
|
block.plastanium-compressor.description = Produit du plastanium à partir d'huile et de titane.
|
||||||
block.phase-weaver.description = Produit du tissu phasé à partir de thorium et de grandes quantités de sable. Nécessite des quantités massives d'énergie pour fonctionner.
|
block.phase-weaver.description = Produit du tissu phasé à partir de thorium et de grandes quantités de sable. Nécessite des quantités massives d'énergie pour fonctionner.
|
||||||
block.alloy-smelter.description = Produit un alliage superchargé à l'aide de titane, de plomb, de silicone et de cuivre.
|
block.alloy-smelter.description = Produit un alliage superchargé à l'aide de titane, de plomb, de silicone et de cuivre.
|
||||||
@@ -941,7 +985,7 @@ block.spore-press.description = Compresses spore pods into oil.
|
|||||||
block.pulverizer.description = Écrase la pierre pour en faire du sable. Utile quand il y a un manque de sable naturel.
|
block.pulverizer.description = Écrase la pierre pour en faire du sable. Utile quand il y a un manque de sable naturel.
|
||||||
block.coal-centrifuge.description = Solidifes oil into chunks of coal.
|
block.coal-centrifuge.description = Solidifes oil into chunks of coal.
|
||||||
block.incinerator.description = Permet de se débarasser de n'importe quel objet ou liquide en exces .
|
block.incinerator.description = Permet de se débarasser de n'importe quel objet ou liquide en exces .
|
||||||
block.power-void.description = Supprime toute l'énergie allant à l'intérieur.Bac à sable uniquement
|
block.power-void.description = Supprime toute l'énergie allant à l'intérieur. Bac à sable uniquement
|
||||||
block.power-source.description = Produit de l'énergie à l'infini. Bac à sable uniquement.
|
block.power-source.description = Produit de l'énergie à l'infini. Bac à sable uniquement.
|
||||||
block.item-source.description = Produit des objets à l'infini. Bac à sable uniquement .
|
block.item-source.description = Produit des objets à l'infini. Bac à sable uniquement .
|
||||||
block.item-void.description = Désintègre n'importe quel objet qui va à l'intérieur sans utiliser d'énergie. Bac à sable uniquement.
|
block.item-void.description = Désintègre n'importe quel objet qui va à l'intérieur sans utiliser d'énergie. Bac à sable uniquement.
|
||||||
@@ -1007,8 +1051,8 @@ block.oil-extractor.description = Utilise une grande quantité d'énergie afin d
|
|||||||
block.core-shard.description = The first iteration of the core capsule. Once destroyed, all contact to the region is lost. Do not let this happen.
|
block.core-shard.description = The first iteration of the core capsule. Once destroyed, all contact to the region is lost. Do not let this happen.
|
||||||
block.core-foundation.description = La deuxième version du noyau. Meilleur blindage. Stocke plus de ressources.
|
block.core-foundation.description = La deuxième version du noyau. Meilleur blindage. Stocke plus de ressources.
|
||||||
block.core-nucleus.description = La troisième et dernière iteraction de la capsule centrale. Extrêmement bien blindée. Stocke des quantités massive de ressources.
|
block.core-nucleus.description = La troisième et dernière iteraction de la capsule centrale. Extrêmement bien blindée. Stocke des quantités massive de ressources.
|
||||||
block.vault.description = Stocke un grand nombre d'objets. Utile pour réguler le flux d'objet quand la demande de matériaux est inconstante.un [LIGHT_GRAY] déchargeur[] peut être utilisé pour récupérer des objets depuis le coffre-fort.
|
block.vault.description = Stocke un grand nombre d'objets. Utile pour réguler le flux d'objet quand la demande de matériaux est inconstante.un [lightgray] déchargeur[] peut être utilisé pour récupérer des objets depuis le coffre-fort.
|
||||||
block.container.description = Stocke un petit nombre d'objet . Utile pour réguler le flux d'objet quand la demande de matériaux est inconstante.un [LIGHT_GRAY] déchargeur[] peut être utilisé pour récupérer des objets depuis le conteneur.
|
block.container.description = Stocke un petit nombre d'objet . Utile pour réguler le flux d'objet quand la demande de matériaux est inconstante.un [lightgray] déchargeur[] peut être utilisé pour récupérer des objets depuis le conteneur.
|
||||||
block.unloader.description = Décharge des objets depuis des conteneurs, coffres-forts ou de la base sur un convoyeur ou directement dans un bloc adjacent . Le type d'objet peut être changé en appuyant sur le déchargeur.
|
block.unloader.description = Décharge des objets depuis des conteneurs, coffres-forts ou de la base sur un convoyeur ou directement dans un bloc adjacent . Le type d'objet peut être changé en appuyant sur le déchargeur.
|
||||||
block.launch-pad.description = Launches batches of items without any need for a core launch. Unfinished.
|
block.launch-pad.description = Launches batches of items without any need for a core launch. Unfinished.
|
||||||
block.launch-pad-large.description = An improved version of the launch pad. Stores more items. Launches more frequently.
|
block.launch-pad-large.description = An improved version of the launch pad. Stores more items. Launches more frequently.
|
||||||
|
|||||||
@@ -4,10 +4,10 @@ contributors = Traducteurs et contributeurs
|
|||||||
discord = Rejoignez le discord de Mindustry !
|
discord = Rejoignez le discord de Mindustry !
|
||||||
link.discord.description = Le discord officiel de Mindustry
|
link.discord.description = Le discord officiel de Mindustry
|
||||||
link.github.description = Code source du jeu
|
link.github.description = Code source du jeu
|
||||||
link.changelog.description = Liste des modifications de mise à jour
|
link.changelog.description = Liste des mises à jour
|
||||||
link.dev-builds.description = Versions instables de développement
|
link.dev-builds.description = Versions instables de développement
|
||||||
link.trello.description = Planning Trello officiel pour les fonctionnalités planifiées.
|
link.trello.description =Trello officiel pour les fonctionnalités planifiées.
|
||||||
link.itch.io.description = Page web itch.io avec les versions ordinateurs téléchargeables et la version web
|
link.itch.io.description = Site itch.io avec les versions téléchargeables pour ordinateur.
|
||||||
link.google-play.description = Page Google Play du jeu
|
link.google-play.description = Page Google Play du jeu
|
||||||
link.wiki.description = Wiki officiel de Mindustry
|
link.wiki.description = Wiki officiel de Mindustry
|
||||||
linkfail = L'ouverture du lien a échoué!\nL'URL a été copiée dans votre presse-papier.
|
linkfail = L'ouverture du lien a échoué!\nL'URL a été copiée dans votre presse-papier.
|
||||||
@@ -16,18 +16,18 @@ screenshot.invalid = Carte trop grande, potentiellement pas assez de mémoire po
|
|||||||
gameover = Le base a été détruite.
|
gameover = Le base a été détruite.
|
||||||
gameover.pvp = L'équipe[accent] {0}[] a gagnée !
|
gameover.pvp = L'équipe[accent] {0}[] a gagnée !
|
||||||
highscore = [accent]Nouveau meilleur score !
|
highscore = [accent]Nouveau meilleur score !
|
||||||
load.sound = Sounds
|
load.sound = Son
|
||||||
load.map = Maps
|
load.map = Maps
|
||||||
load.image = Images
|
load.image = Images
|
||||||
load.content = Content
|
load.content = Contenu
|
||||||
load.system = System
|
load.system = Système
|
||||||
stat.wave = Vagues vaincues:[accent] {0}
|
stat.wave = Vagues vaincues:[accent] {0}
|
||||||
stat.enemiesDestroyed = Ennemies détruits:[accent] {0}
|
stat.enemiesDestroyed = Ennemies détruits:[accent] {0}
|
||||||
stat.built = Bâtiments construits:[accent] {0}
|
stat.built = Bâtiments construits:[accent] {0}
|
||||||
stat.destroyed = Bâtiments détruits:[accent] {0}
|
stat.destroyed = Bâtiments détruits:[accent] {0}
|
||||||
stat.deconstructed = Bâtiments déconstruits:[accent] {0}
|
stat.deconstructed = Bâtiments déconstruits:[accent] {0}
|
||||||
stat.delivered = Ressources transférées:
|
stat.delivered = Ressources transférées:
|
||||||
stat.rank = FRang Final: [accent]{0}
|
stat.rank = Rang Final: [accent]{0}
|
||||||
launcheditems = [accent]Ressources transférées
|
launcheditems = [accent]Ressources transférées
|
||||||
map.delete = Êtes-vous sûr de vouloir supprimer cette carte ?"[accent]{0}[]"?
|
map.delete = Êtes-vous sûr de vouloir supprimer cette carte ?"[accent]{0}[]"?
|
||||||
level.highscore = Meilleur score: [accent]{0}
|
level.highscore = Meilleur score: [accent]{0}
|
||||||
@@ -61,8 +61,8 @@ techtree = Arbre technologique
|
|||||||
research.list = [LIGHT_GRAY]Recherche:
|
research.list = [LIGHT_GRAY]Recherche:
|
||||||
research = Recherche
|
research = Recherche
|
||||||
researched = [LIGHT_GRAY]{0} recherchée.
|
researched = [LIGHT_GRAY]{0} recherchée.
|
||||||
players = {0} joueurs en ligne
|
players = {0} joueurs
|
||||||
players.single = {0} joueur en ligne
|
players.single = {0} joueur
|
||||||
server.closing = [accent]Fermeture du serveur ...
|
server.closing = [accent]Fermeture du serveur ...
|
||||||
server.kicked.kick = Vous avez été expulsé du serveur !
|
server.kicked.kick = Vous avez été expulsé du serveur !
|
||||||
server.kicked.serverClose = Serveur fermé.
|
server.kicked.serverClose = Serveur fermé.
|
||||||
@@ -77,6 +77,7 @@ server.kicked.nameEmpty = Votre nom doit contenir au moins une lettre ou un chif
|
|||||||
server.kicked.idInUse = Vous êtes déjà sur ce serveur ! Se connecter avec deux comptes n'est pas permis !
|
server.kicked.idInUse = Vous êtes déjà sur ce serveur ! Se connecter avec deux comptes n'est pas permis !
|
||||||
server.kicked.customClient = Ce serveur ne supporte pas les versions personnalisées (Custom builds). Télécharger une version officielle.
|
server.kicked.customClient = Ce serveur ne supporte pas les versions personnalisées (Custom builds). Télécharger une version officielle.
|
||||||
server.kicked.gameover = Vous avez perdu !
|
server.kicked.gameover = Vous avez perdu !
|
||||||
|
server.kicked.playerLimit = Ce serveur est complet. Attendez qu'une place ce libére.
|
||||||
server.versions = Votre version:[accent] {0}[]\nVersion du serveur:[accent] {1}[]
|
server.versions = Votre version:[accent] {0}[]\nVersion du serveur:[accent] {1}[]
|
||||||
host.info = Le bouton [accent]héberger[] héberge un serveur sur les ports [scarlet]6567[] et [scarlet]6568.[]\nN'importe qui sur le même [LIGHT_GRAY]réseau wifi ou local[] devrait pouvoir voir votre serveur dans sa liste de serveurs.\n\nSi vous voulez que les gens puissent se connecter de n'importe où grâce à l'IP, [accent]rediriger les ports[] est requis.\n\n[LIGHT_GRAY]Note:Si quelqu'un éprouve des difficultés à se connecter à votre partie LAN, assurez-vous que vous avez autorisé Mindustry à accéder à votre réseau local dans les paramètres de votre pare-feu.
|
host.info = Le bouton [accent]héberger[] héberge un serveur sur les ports [scarlet]6567[] et [scarlet]6568.[]\nN'importe qui sur le même [LIGHT_GRAY]réseau wifi ou local[] devrait pouvoir voir votre serveur dans sa liste de serveurs.\n\nSi vous voulez que les gens puissent se connecter de n'importe où grâce à l'IP, [accent]rediriger les ports[] est requis.\n\n[LIGHT_GRAY]Note:Si quelqu'un éprouve des difficultés à se connecter à votre partie LAN, assurez-vous que vous avez autorisé Mindustry à accéder à votre réseau local dans les paramètres de votre pare-feu.
|
||||||
join.info = Ici, vous pouvez entrer l' [accent]IP d'un serveur[] pour s'y connecter, ou découvrir les serveurs[accent]sur votre réseau local[] pour s'y connecter.\nLes parties multijoueur LAN et WAN sont toutes deux supportées.\n\n[LIGHT_GRAY]Note: Aucune liste globale des serveurs n'est génerée automatiquement: si vous voulez vous connecter à un serveur par IP, vous devrez demander l'IP à l'hébergeur.
|
join.info = Ici, vous pouvez entrer l' [accent]IP d'un serveur[] pour s'y connecter, ou découvrir les serveurs[accent]sur votre réseau local[] pour s'y connecter.\nLes parties multijoueur LAN et WAN sont toutes deux supportées.\n\n[LIGHT_GRAY]Note: Aucune liste globale des serveurs n'est génerée automatiquement: si vous voulez vous connecter à un serveur par IP, vous devrez demander l'IP à l'hébergeur.
|
||||||
@@ -106,7 +107,7 @@ server.edit = Modifier le serveur
|
|||||||
server.outdated = [crimson]Serveur obsolète ![]
|
server.outdated = [crimson]Serveur obsolète ![]
|
||||||
server.outdated.client = [crimson]Client obsolète ![]
|
server.outdated.client = [crimson]Client obsolète ![]
|
||||||
server.version = [lightgray]Version: {0} {1}
|
server.version = [lightgray]Version: {0} {1}
|
||||||
server.custombuild = [yellow]Version personnalisée
|
server.custombuild = [accent]Version personnalisée
|
||||||
confirmban = Êtes-vous sûr de vouloir bannir ce joueur ?
|
confirmban = Êtes-vous sûr de vouloir bannir ce joueur ?
|
||||||
confirmkick = Êtes-vous sûr de vouloir expulser ce joueur?
|
confirmkick = Êtes-vous sûr de vouloir expulser ce joueur?
|
||||||
confirmunban = Êtes-vous sûr de vouloir annuler le ban de ce joueur ?
|
confirmunban = Êtes-vous sûr de vouloir annuler le ban de ce joueur ?
|
||||||
@@ -148,7 +149,7 @@ off = Éteint
|
|||||||
save.autosave = Sauvegarde automatique {0}
|
save.autosave = Sauvegarde automatique {0}
|
||||||
save.map = Carte: {0}
|
save.map = Carte: {0}
|
||||||
save.wave = Vague {0}
|
save.wave = Vague {0}
|
||||||
save.difficulty = Difficulté: {0}
|
save.mode = Mode de jeu {0}
|
||||||
save.date = Dernière sauvegarde: {0}
|
save.date = Dernière sauvegarde: {0}
|
||||||
save.playtime = Temps de jeu: {0}
|
save.playtime = Temps de jeu: {0}
|
||||||
warning = Avertissement.
|
warning = Avertissement.
|
||||||
@@ -225,16 +226,17 @@ editor.removeunit = Retirer l'unité
|
|||||||
editor.teams = Équipes
|
editor.teams = Équipes
|
||||||
editor.errorload = Erreur lors du chargement du fichier:\n[accent]{0}
|
editor.errorload = Erreur lors du chargement du fichier:\n[accent]{0}
|
||||||
editor.errorsave = Erreur lors de la sauvegarde du fichier:\n[accent]{0}
|
editor.errorsave = Erreur lors de la sauvegarde du fichier:\n[accent]{0}
|
||||||
editor.errorimage = C'est une image, pas une carte. Ne changez pas les extensions en espérant que cela fonctionne.\n\nSi vous souhaitez importer une carte, utilisez le bouton "importer une carte" dans l'éditeur.
|
editor.errorimage = C’est une image, pas une carte.\n\nSi vous souhaitez importer une carte 3.5/build 40, utilisez le bouton "Importer une carte héritée" dans l’éditeur.
|
||||||
editor.errorlegacy = Cette carte est trop ancienne et utilise un format de carte qui n'est plus pris en charge.
|
editor.errorlegacy = Cette carte est trop ancienne et utilise un format de carte qui n'est plus pris en charge.
|
||||||
editor.errorheader = Ce fichier de carte n'est pas valide ou corrompu.
|
editor.errorheader = Ce fichier de carte n'est pas valide ou corrompu.
|
||||||
editor.errorname = La carte n'a pas de nom!
|
editor.errorname = La carte n'a pas de nom !
|
||||||
editor.update = Mettre à jour
|
editor.update = Mettre à jour
|
||||||
editor.randomize = Randomiser
|
editor.randomize = Randomiser
|
||||||
editor.apply = Appliquer
|
editor.apply = Appliquer
|
||||||
editor.generate = Générer
|
editor.generate = Générer
|
||||||
editor.resize = Redimensionner
|
editor.resize = Redimensionner
|
||||||
editor.loadmap = Charger une carte
|
editor.loadmap = Charger une carte
|
||||||
|
editor.errornot = Ce n'est pas un fichier de carte.
|
||||||
editor.savemap = Sauvegarder une carte
|
editor.savemap = Sauvegarder une carte
|
||||||
editor.saved = Sauvegardé !
|
editor.saved = Sauvegardé !
|
||||||
editor.save.noname = Votre carte ne possède pas de nom ! Ajouter en un dans le menu 'Infos sur la carte'.
|
editor.save.noname = Votre carte ne possède pas de nom ! Ajouter en un dans le menu 'Infos sur la carte'.
|
||||||
@@ -245,7 +247,7 @@ editor.importmap = Importer une carte
|
|||||||
editor.importmap.description = Importer une carte déjà existante
|
editor.importmap.description = Importer une carte déjà existante
|
||||||
editor.importfile = Importer un fichier
|
editor.importfile = Importer un fichier
|
||||||
editor.importfile.description = Importer une carte à partir d'un fichier externe
|
editor.importfile.description = Importer une carte à partir d'un fichier externe
|
||||||
editor.importimage = Importer l'image du terrain
|
editor.importimage = Importer la carte existante
|
||||||
editor.importimage.description = Importer une image de terrain à partir d'un fichier externe
|
editor.importimage.description = Importer une image de terrain à partir d'un fichier externe
|
||||||
editor.export = Exportation en cours...
|
editor.export = Exportation en cours...
|
||||||
editor.exportfile = Exporter un fichier
|
editor.exportfile = Exporter un fichier
|
||||||
@@ -434,6 +436,7 @@ blocks.boosteffect = Effet boostant
|
|||||||
blocks.maxunits = Maximum d'unitée active
|
blocks.maxunits = Maximum d'unitée active
|
||||||
blocks.health = Santé
|
blocks.health = Santé
|
||||||
blocks.buildtime = Temps de construction
|
blocks.buildtime = Temps de construction
|
||||||
|
blocks.buildcost = Coût de construction
|
||||||
blocks.inaccuracy = Précision
|
blocks.inaccuracy = Précision
|
||||||
blocks.shots = Tirs
|
blocks.shots = Tirs
|
||||||
blocks.reload = Tirs/Seconde
|
blocks.reload = Tirs/Seconde
|
||||||
@@ -871,8 +874,8 @@ tutorial.intro = Vous êtes entré dans le[scarlet] Tutoriel de Mindustry.[]\nCo
|
|||||||
tutorial.drill = Le minage manuel est inefficace.\n[accent]Des foreuses[]peuvent miner automatiquement.\nPlacez-en une sur un filon de cuivre.
|
tutorial.drill = Le minage manuel est inefficace.\n[accent]Des foreuses[]peuvent miner automatiquement.\nPlacez-en une sur un filon de cuivre.
|
||||||
tutorial.drill.mobile = Le minage manuel est inefficace.\n[accent]Des foreuses[]peuvent miner automatiquement.\nAppuyez sur l'onglet de forage en bas à droite.\nSélectionnez la[accent] perceuse mécanique[].\nPlacez-la sur une veine de cuivre, puis appuyez sur la[accent] coche(V)[] ci-dessous pour confirmer votre sélection.\nAppuyez sur le [accent] bouton X[]pour annuler le placement.
|
tutorial.drill.mobile = Le minage manuel est inefficace.\n[accent]Des foreuses[]peuvent miner automatiquement.\nAppuyez sur l'onglet de forage en bas à droite.\nSélectionnez la[accent] perceuse mécanique[].\nPlacez-la sur une veine de cuivre, puis appuyez sur la[accent] coche(V)[] ci-dessous pour confirmer votre sélection.\nAppuyez sur le [accent] bouton X[]pour annuler le placement.
|
||||||
tutorial.blockinfo = Chaque bloc a des statistiques différentes. Chaque foreuse ne peut extraire que certains minerais.\nPour vérifier les informations et les statistiques d'un bloc,[accent] tapez sur le "?" tout en le sélectionnant dans le menu de compilation.[]\n\n[accent]Accédez aux statistiques de la foreuse mécanique maintenant.[]
|
tutorial.blockinfo = Chaque bloc a des statistiques différentes. Chaque foreuse ne peut extraire que certains minerais.\nPour vérifier les informations et les statistiques d'un bloc,[accent] tapez sur le "?" tout en le sélectionnant dans le menu de compilation.[]\n\n[accent]Accédez aux statistiques de la foreuse mécanique maintenant.[]
|
||||||
tutorial.conveyor = [accent]Les tapis roulants[] sont utilisés pour transporter des objets jusqu'à la base.\nFaites une ligne de tapis roulants de la foreuse à la base.
|
tutorial.conveyor = [accent]Convoyeurs[] sont utilisés pour transporter des articles à la base.\nFaire une ligne de convoyeurs de la foreusse à la base.\n[accent]Maintenez le clique droit de la souris pour placer dans une ligne.[]\nMaintenir[accent] CTRL[] en sélectionnant une ligne à placer en diagonale.\n\n[accent]Placez 2 convoyeurs avec l'outil ligne, puis livrez un article dans la base.
|
||||||
tutorial.conveyor.mobile = [accent]Les tapis roulants[] sont utilisés pour transporter des objets jusqu'à la base.\nFaites une ligne de tapis roulants de la foreuse à la base.\n[accent]Placez en ligne en maintenant votre doigt enfoncé pendant quelques secondes[] et glisser dans une direction.\n\n[accent]{0}/{1} convoyeurs placés en ligne\n[accent]0/1 articles livrés
|
tutorial.conveyor.mobile = [accent]Convoyeurs[] sont utilisés pour transporter des articles à la base.\nFaire une ligne de convoyeurs de la foreusse à la base.\n[accent] Placez dans une ligne en maintenant votre doigt appuyé pendant quelques secondes[] et en le faisant glisser dans une direction.\n\n[accent]Placez 2 convoyeurs avec l'outil ligne, puis livrez un article dans la base.
|
||||||
tutorial.turret = Des constructions défensives doivent être construites pour repousser [LIGHT_GRAY]les ennemis[].Construisez une tourelle "duo" près de votre base.
|
tutorial.turret = Des constructions défensives doivent être construites pour repousser [LIGHT_GRAY]les ennemis[].Construisez une tourelle "duo" près de votre base.
|
||||||
tutorial.drillturret = Les tourelles "Duo" ont besoin de [accent]munitions en cuivre[] pour tirer.\nPlacez une foreuse à côté de la tourelle pour l'approvisionner avec du cuivre.
|
tutorial.drillturret = Les tourelles "Duo" ont besoin de [accent]munitions en cuivre[] pour tirer.\nPlacez une foreuse à côté de la tourelle pour l'approvisionner avec du cuivre.
|
||||||
tutorial.pause = Pendant le combat, vous pouvez[accent] mettre le jeu en pause.[]\nVous pouvez construire des bâtiments pendant que le jeu est en pause.\n\n[accent]Appuyez sur espace pour mettre le jeu en pause.
|
tutorial.pause = Pendant le combat, vous pouvez[accent] mettre le jeu en pause.[]\nVous pouvez construire des bâtiments pendant que le jeu est en pause.\n\n[accent]Appuyez sur espace pour mettre le jeu en pause.
|
||||||
|
|||||||
@@ -16,11 +16,13 @@ screenshot.invalid = 맵이 너무 커서 스크린샷을 찍을 메모리가
|
|||||||
gameover = 게임 오버
|
gameover = 게임 오버
|
||||||
gameover.pvp = [accent]{0}[] 팀이 승리했습니다!
|
gameover.pvp = [accent]{0}[] 팀이 승리했습니다!
|
||||||
highscore = [accent]최고점수 달성!
|
highscore = [accent]최고점수 달성!
|
||||||
|
|
||||||
load.sound = 소리
|
load.sound = 소리
|
||||||
load.map = 맵
|
load.map = 맵
|
||||||
load.image = 사진
|
load.image = 사진
|
||||||
load.content = Content
|
load.content = 컨텐츠
|
||||||
load.system = 시스템
|
load.system = 시스템
|
||||||
|
|
||||||
stat.wave = 웨이브 성공:[accent]{0}
|
stat.wave = 웨이브 성공:[accent]{0}
|
||||||
stat.enemiesDestroyed = 파괴한 적 수:[accent]{0}
|
stat.enemiesDestroyed = 파괴한 적 수:[accent]{0}
|
||||||
stat.built = 건설한 건물 수:[accent]{0}
|
stat.built = 건설한 건물 수:[accent]{0}
|
||||||
@@ -28,6 +30,7 @@ stat.destroyed = 파괴된 건물 수:[accent]{0}
|
|||||||
stat.deconstructed = 파괴한 건물 수:[accent]{0}
|
stat.deconstructed = 파괴한 건물 수:[accent]{0}
|
||||||
stat.delivered = 획득한 자원:
|
stat.delivered = 획득한 자원:
|
||||||
stat.rank = 최종 기록: [accent]{0}
|
stat.rank = 최종 기록: [accent]{0}
|
||||||
|
|
||||||
launcheditems = [accent]창고
|
launcheditems = [accent]창고
|
||||||
map.delete = 정말로 "[accent]{0}[]" 맵을 삭제하시겠습니까?
|
map.delete = 정말로 "[accent]{0}[]" 맵을 삭제하시겠습니까?
|
||||||
level.highscore = 최고 점수: [accent]{0}
|
level.highscore = 최고 점수: [accent]{0}
|
||||||
@@ -49,8 +52,17 @@ close = 닫기
|
|||||||
website = 웹사이트
|
website = 웹사이트
|
||||||
quit = 나가기
|
quit = 나가기
|
||||||
maps = 맵
|
maps = 맵
|
||||||
|
maps.browse = 맵 검색
|
||||||
continue = 계속하기
|
continue = 계속하기
|
||||||
maps.none = [LIGHT_GRAY]맵을 찾을 수 없습니다!
|
maps.none = [LIGHT_GRAY]맵을 찾을 수 없습니다!
|
||||||
|
invalid = 오류
|
||||||
|
preparingconfig = 설정 사전준비
|
||||||
|
preparingcontent = 컨텐츠 사전준비
|
||||||
|
uploadingcontent = 컨텐츠 업로드
|
||||||
|
uploadingpreviewfile = 미리보기 파일 업로드
|
||||||
|
committingchanges = 바뀐 점 적용
|
||||||
|
done = 완료
|
||||||
|
|
||||||
about.button = 정보
|
about.button = 정보
|
||||||
name = 이름 :
|
name = 이름 :
|
||||||
noname = 먼저 [accent] 유저 이름[] 을 설정하세요.
|
noname = 먼저 [accent] 유저 이름[] 을 설정하세요.
|
||||||
@@ -65,12 +77,14 @@ players = 현재 {0}명 접속중
|
|||||||
players.single = 현재 {0}명만 있음.
|
players.single = 현재 {0}명만 있음.
|
||||||
server.closing = [accent]서버 닫는중...
|
server.closing = [accent]서버 닫는중...
|
||||||
server.kicked.kick = 서버에서 추방되었습니다!
|
server.kicked.kick = 서버에서 추방되었습니다!
|
||||||
|
server.kicked.whitelist = 당신은 여기의 화이트리스트가 아닙니다.
|
||||||
server.kicked.serverClose = 서버 종료됨.
|
server.kicked.serverClose = 서버 종료됨.
|
||||||
server.kicked.vote = 당신은 투표로 추방되었습니다. 그러니 좀 적당히 하지 그랬어요?
|
server.kicked.vote = 당신은 투표로 추방되었습니다. 그러니 좀 적당히 하지 그랬어요?
|
||||||
server.kicked.clientOutdated = 오래된 버전의 게임입니다! 게임을 업데이트 하세요!
|
server.kicked.clientOutdated = 오래된 버전의 게임입니다! 게임을 업데이트 하세요!
|
||||||
server.kicked.serverOutdated = 오래된 버전의 서버입니다! 서버 호스트 관리자에게 문의하세요!
|
server.kicked.serverOutdated = 오래된 버전의 서버입니다! 서버 호스트 관리자에게 문의하세요!
|
||||||
server.kicked.banned = 서버 규칙 위반으로 인해, 이제 당신은 영원히 이 서버를 플레이 하실 수 없습니다.
|
server.kicked.banned = 서버 규칙 위반으로 인해, 이제 당신은 영원히 이 서버를 플레이 하실 수 없습니다.
|
||||||
server.kicked.typeMismatch = This server is not compatible with your build type.
|
server.kicked.typeMismatch = 클라이언트와 호환되지 않는 서버입니다. 디스코드에서 #mods에 들러보는 건 어떨까요?
|
||||||
|
server.kicked.playerLimit = 서버가 꽉 찼습니다. 빈 공간이 생길 때까지 기다려주세요.
|
||||||
server.kicked.recentKick = 방금 추방처리 되었습니다.\n잠시 기다린 후에 접속 해 주세요.
|
server.kicked.recentKick = 방금 추방처리 되었습니다.\n잠시 기다린 후에 접속 해 주세요.
|
||||||
server.kicked.nameInUse = 이 닉네임이 이미 서버에서 사용중입니다.
|
server.kicked.nameInUse = 이 닉네임이 이미 서버에서 사용중입니다.
|
||||||
server.kicked.nameEmpty = 당신의 닉네임이 비어있습니다.
|
server.kicked.nameEmpty = 당신의 닉네임이 비어있습니다.
|
||||||
@@ -86,6 +100,7 @@ host = 서버 열기
|
|||||||
hosting = [accent]서버 여는중...
|
hosting = [accent]서버 여는중...
|
||||||
hosts.refresh = 새로고침
|
hosts.refresh = 새로고침
|
||||||
hosts.discovering = LAN 게임 찾기
|
hosts.discovering = LAN 게임 찾기
|
||||||
|
hosts.discovering.any = 서버 찾기
|
||||||
server.refreshing = 서버 목록 새로고치는중...
|
server.refreshing = 서버 목록 새로고치는중...
|
||||||
hosts.none = [lightgray]LAN 게임을 찾을 수 없습니다!
|
hosts.none = [lightgray]LAN 게임을 찾을 수 없습니다!
|
||||||
host.invalid = [scarlet]서버에 연결할 수 없습니다!
|
host.invalid = [scarlet]서버에 연결할 수 없습니다!
|
||||||
@@ -115,12 +130,16 @@ confirmunadmin = 이 플레이어를 일반 유저로 만들겠습니까?
|
|||||||
joingame.title = 게임 참가
|
joingame.title = 게임 참가
|
||||||
joingame.ip = 주소:
|
joingame.ip = 주소:
|
||||||
disconnect = 서버와 연결이 해제되었습니다.
|
disconnect = 서버와 연결이 해제되었습니다.
|
||||||
disconnect.data = 맵 데이터를 받아오는데 실패했습니다!
|
disconnect.data = 맵 데이터를 받아오는데 실패했습니다..
|
||||||
|
disconnect.closed = 연결이 끊어졌습니다..
|
||||||
|
disconnect.timeout = 연결 시간 한계 도달..
|
||||||
|
disconnect.data = 월드 데이터 로딩 실패..
|
||||||
|
|
||||||
connecting = [accent]연결중...
|
connecting = [accent]연결중...
|
||||||
connecting.data = [accent]맵 데이터 다운로드중...
|
connecting.data = [accent]월드 데이터 로딩중...
|
||||||
server.port = 포트:
|
server.port = 포트:
|
||||||
server.addressinuse = 이 주소는 이미 사용중입니다!
|
server.addressinuse = 주소가 이미 사용중입니다!
|
||||||
server.invalidport = 포트 번호가 잘못되었습니다.
|
server.invalidport = 포트가 올바르지 않습니다!
|
||||||
server.error = [accent]{0}[crimson]서버를 여는데 오류가 발생했습니다.
|
server.error = [accent]{0}[crimson]서버를 여는데 오류가 발생했습니다.
|
||||||
save.old = 이 저장파일은 이전 버전의 게임용이며, 지금은 사용할 수 없습니다. \n\n[LIGHT_GRAY]4.0 정식때 이전 게임버전에서 만든 저장파일과 호환됩니다.
|
save.old = 이 저장파일은 이전 버전의 게임용이며, 지금은 사용할 수 없습니다. \n\n[LIGHT_GRAY]4.0 정식때 이전 게임버전에서 만든 저장파일과 호환됩니다.
|
||||||
save.new = 새로 저장
|
save.new = 새로 저장
|
||||||
@@ -148,7 +167,7 @@ off = 끄기
|
|||||||
save.autosave = 자동저장: {0}
|
save.autosave = 자동저장: {0}
|
||||||
save.map = 맵: {0}
|
save.map = 맵: {0}
|
||||||
save.wave = 웨이브 {0}
|
save.wave = 웨이브 {0}
|
||||||
save.difficulty = 난이도: {0}
|
save.mode = 게임모드 : {0}
|
||||||
save.date = 마지막 저장날짜: {0}
|
save.date = 마지막 저장날짜: {0}
|
||||||
save.playtime = 플레이시간: {0}
|
save.playtime = 플레이시간: {0}
|
||||||
warning = 경고.
|
warning = 경고.
|
||||||
@@ -190,6 +209,9 @@ map.nospawn = 이 맵에 플레이어가 생성될 코어가 없습니다! 맵
|
|||||||
map.nospawn.pvp = 이 맵에는 적팀 코어가 없습니다! 에디터에서 [ROYAL]노랑색 팀이 아닌[] 코어를 추가하세요.
|
map.nospawn.pvp = 이 맵에는 적팀 코어가 없습니다! 에디터에서 [ROYAL]노랑색 팀이 아닌[] 코어를 추가하세요.
|
||||||
map.nospawn.attack = 이 맵에는 플레이어가 공격할 수 있는 적의 코어가 없습니다! 에디터에서 [ROYAL] 빨강색 팀[] 코어를 맵에 추가하세요.
|
map.nospawn.attack = 이 맵에는 플레이어가 공격할 수 있는 적의 코어가 없습니다! 에디터에서 [ROYAL] 빨강색 팀[] 코어를 맵에 추가하세요.
|
||||||
map.invalid = 파일이 잘못되었거나 손상되어 맵을 열 수 없습니다.
|
map.invalid = 파일이 잘못되었거나 손상되어 맵을 열 수 없습니다.
|
||||||
|
map.publish.error = 맵 업로드 오류 : {0}
|
||||||
|
map.publish = 맵 업로드 완료!
|
||||||
|
map.publishing = [accent]맵 업로드 중...
|
||||||
editor.brush = 브러쉬
|
editor.brush = 브러쉬
|
||||||
editor.openin = 편집기 열기
|
editor.openin = 편집기 열기
|
||||||
editor.oregen = 광물 무작위 생성
|
editor.oregen = 광물 무작위 생성
|
||||||
@@ -201,7 +223,9 @@ editor.waves = 웨이브:
|
|||||||
editor.rules = 규칙:
|
editor.rules = 규칙:
|
||||||
editor.generation = 맵 생성 설정:
|
editor.generation = 맵 생성 설정:
|
||||||
editor.ingame = 인게임 편집
|
editor.ingame = 인게임 편집
|
||||||
|
editor.publish.workshop = 워크샵 업로드
|
||||||
editor.newmap = 신규 맵
|
editor.newmap = 신규 맵
|
||||||
|
workshop = 워크샵
|
||||||
waves.title = 웨이브
|
waves.title = 웨이브
|
||||||
waves.remove = 삭제
|
waves.remove = 삭제
|
||||||
waves.never = 여기까지 유닛생성
|
waves.never = 여기까지 유닛생성
|
||||||
@@ -218,6 +242,7 @@ waves.invalid = 클립보드의 잘못된 웨이브 데이터
|
|||||||
waves.copied = 웨이브 복사됨
|
waves.copied = 웨이브 복사됨
|
||||||
waves.none = 적 웨이브가 설정되지 않았습니다.\n비어있을 시 자동으로 기본 적 웨이브로 설정됩니다.
|
waves.none = 적 웨이브가 설정되지 않았습니다.\n비어있을 시 자동으로 기본 적 웨이브로 설정됩니다.
|
||||||
editor.default = [LIGHT_GRAY]<기본값>
|
editor.default = [LIGHT_GRAY]<기본값>
|
||||||
|
details = 설명
|
||||||
edit = 편집
|
edit = 편집
|
||||||
editor.name = 이름:
|
editor.name = 이름:
|
||||||
editor.spawn = 유닛 생성
|
editor.spawn = 유닛 생성
|
||||||
@@ -227,6 +252,7 @@ editor.errorload = [accent]{0} 파일을 불러오는데 실패했습니다.
|
|||||||
editor.errorsave = [accent]{0} 파일을 저장하는데 실패했습니다.
|
editor.errorsave = [accent]{0} 파일을 저장하는데 실패했습니다.
|
||||||
editor.errorimage = 이것은 맵이 아니라 사진입니다.\n\n예전 맵을 가져올려면 편집기의 '예전 맵 가져오기' 버튼을 사용하세요.
|
editor.errorimage = 이것은 맵이 아니라 사진입니다.\n\n예전 맵을 가져올려면 편집기의 '예전 맵 가져오기' 버튼을 사용하세요.
|
||||||
editor.errorlegacy = 이 맵은 너무 오래되어, 더이상 지원하지 않는 맵 형식을 사용합니다.
|
editor.errorlegacy = 이 맵은 너무 오래되어, 더이상 지원하지 않는 맵 형식을 사용합니다.
|
||||||
|
editor.errornot = 선택한 대상이 맵 파일이 아닙니다.
|
||||||
editor.errorheader = 이 맵 파일은 유효하지 않거나 손상되었습니다.
|
editor.errorheader = 이 맵 파일은 유효하지 않거나 손상되었습니다.
|
||||||
editor.errorname = 맵에 이름이 지정되어 있지 않습니다.
|
editor.errorname = 맵에 이름이 지정되어 있지 않습니다.
|
||||||
editor.update = 업데이트
|
editor.update = 업데이트
|
||||||
@@ -260,6 +286,7 @@ editor.mapname = 맵 이름:
|
|||||||
editor.overwrite = [accept]경고!이 명령은 기존 맵을 덮어씌우게 됩니다.
|
editor.overwrite = [accept]경고!이 명령은 기존 맵을 덮어씌우게 됩니다.
|
||||||
editor.overwrite.confirm = [scarlet]경고![] 이 이름을 가진 맵이 이미 있습니다. 덮어 쓰시겠습니까?
|
editor.overwrite.confirm = [scarlet]경고![] 이 이름을 가진 맵이 이미 있습니다. 덮어 쓰시겠습니까?
|
||||||
editor.selectmap = 불러올 맵 선택:
|
editor.selectmap = 불러올 맵 선택:
|
||||||
|
|
||||||
toolmode.replace = 재배치
|
toolmode.replace = 재배치
|
||||||
toolmode.replace.description = 블록을 배치합니다.
|
toolmode.replace.description = 블록을 배치합니다.
|
||||||
toolmode.replaceall = 모두 재배치
|
toolmode.replaceall = 모두 재배치
|
||||||
@@ -274,6 +301,7 @@ toolmode.fillteams = 팀 채우기
|
|||||||
toolmode.fillteams.description = 블록 대신 팀 건물로 채웁니다.
|
toolmode.fillteams.description = 블록 대신 팀 건물로 채웁니다.
|
||||||
toolmode.drawteams = 팀 그리기
|
toolmode.drawteams = 팀 그리기
|
||||||
toolmode.drawteams.description = 블록 대신 팀 건물을 배치합니다.
|
toolmode.drawteams.description = 블록 대신 팀 건물을 배치합니다.
|
||||||
|
|
||||||
filters.empty = [LIGHT_GRAY]필터가 없습니다!! 아래 버튼을 눌러 추가하세요.
|
filters.empty = [LIGHT_GRAY]필터가 없습니다!! 아래 버튼을 눌러 추가하세요.
|
||||||
filter.distort = 왜곡
|
filter.distort = 왜곡
|
||||||
filter.noise = 맵 전체에 타일 혹은 블럭 뿌리기
|
filter.noise = 맵 전체에 타일 혹은 블럭 뿌리기
|
||||||
@@ -305,6 +333,7 @@ filter.option.floor2 = 2번째 바닥
|
|||||||
filter.option.threshold2 = 2번째 한계점
|
filter.option.threshold2 = 2번째 한계점
|
||||||
filter.option.radius = 반경
|
filter.option.radius = 반경
|
||||||
filter.option.percentile = 백분위수
|
filter.option.percentile = 백분위수
|
||||||
|
|
||||||
width = 넓이:
|
width = 넓이:
|
||||||
height = 높이:
|
height = 높이:
|
||||||
menu = 메뉴
|
menu = 메뉴
|
||||||
@@ -322,6 +351,7 @@ tutorial.retake = 튜토리얼
|
|||||||
editor = 편집기
|
editor = 편집기
|
||||||
mapeditor = 맵 편집기
|
mapeditor = 맵 편집기
|
||||||
donate = 기부
|
donate = 기부
|
||||||
|
|
||||||
abandon = 포기
|
abandon = 포기
|
||||||
abandon.text = 이 구역의 모든 자원이 적에게 빼앗길 것입니다.
|
abandon.text = 이 구역의 모든 자원이 적에게 빼앗길 것입니다.
|
||||||
locked = 잠김
|
locked = 잠김
|
||||||
@@ -338,6 +368,7 @@ launch.skip.confirm = 만약 지금 출격하시지 않고 스킵하신다면,
|
|||||||
uncover = 구역 개방
|
uncover = 구역 개방
|
||||||
configure = 코어 시작자원 설정
|
configure = 코어 시작자원 설정
|
||||||
configure.locked = {0} 단계에서 시작자원 설정 잠금이 해제됩니다.
|
configure.locked = {0} 단계에서 시작자원 설정 잠금이 해제됩니다.
|
||||||
|
configure.invalid = 해당 가격은 0 과 {0} 사이여야 합니다.
|
||||||
zone.unlocked = [LIGHT_GRAY] 잠금 해제되었습니다!
|
zone.unlocked = [LIGHT_GRAY] 잠금 해제되었습니다!
|
||||||
zone.requirement.complete = 웨이브 {0} 달성:\n{1} 지역 요구사항이 충족되었습니다!
|
zone.requirement.complete = 웨이브 {0} 달성:\n{1} 지역 요구사항이 충족되었습니다!
|
||||||
zone.config.complete = 웨이브 {0} 달성:\n시작자원 설정 기능이 해금되었습니다!
|
zone.config.complete = 웨이브 {0} 달성:\n시작자원 설정 기능이 해금되었습니다!
|
||||||
@@ -347,6 +378,7 @@ zone.objective.survival = 생존
|
|||||||
zone.objective.attack = 적 코어 파괴
|
zone.objective.attack = 적 코어 파괴
|
||||||
add = 추가...
|
add = 추가...
|
||||||
boss.health = 보스 체력
|
boss.health = 보스 체력
|
||||||
|
|
||||||
connectfail = [crimson]{0}[accent] 서버에 연결하지 못했습니다.[]
|
connectfail = [crimson]{0}[accent] 서버에 연결하지 못했습니다.[]
|
||||||
error.unreachable = 서버에 연결하지 못했습니다.\n서버 주소가 정확히 입력되었나요?
|
error.unreachable = 서버에 연결하지 못했습니다.\n서버 주소가 정확히 입력되었나요?
|
||||||
error.invalidaddress = 잘못된 주소입니다.
|
error.invalidaddress = 잘못된 주소입니다.
|
||||||
@@ -357,6 +389,7 @@ error.mapnotfound = 맵 파일을 찾을 수 없습니다!
|
|||||||
error.io = 네트워크 I/O 오류.
|
error.io = 네트워크 I/O 오류.
|
||||||
error.any = 알 수 없는 네트워크 오류.
|
error.any = 알 수 없는 네트워크 오류.
|
||||||
error.bloom = 블룸 그래픽 효과를 적용하지 못했습니다.\n당신의 기기가 이 기능을 지원하지 않는 것일 수도 있습니다.
|
error.bloom = 블룸 그래픽 효과를 적용하지 못했습니다.\n당신의 기기가 이 기능을 지원하지 않는 것일 수도 있습니다.
|
||||||
|
|
||||||
zone.groundZero.name = 전초기지
|
zone.groundZero.name = 전초기지
|
||||||
zone.desertWastes.name = 쓰레기 사막
|
zone.desertWastes.name = 쓰레기 사막
|
||||||
zone.craters.name = 크레이터
|
zone.craters.name = 크레이터
|
||||||
@@ -371,6 +404,7 @@ zone.saltFlats.name = 소금 사막
|
|||||||
zone.impact0078.name = Impact 0078
|
zone.impact0078.name = Impact 0078
|
||||||
zone.crags.name = 협곡
|
zone.crags.name = 협곡
|
||||||
zone.fungalPass.name = 포자 지대
|
zone.fungalPass.name = 포자 지대
|
||||||
|
|
||||||
zone.groundZero.description = 이 장소는 다시 시작하기에 최적의 환경을 지닌 장소입니다. 적은 수준의 위협이 있으며 자원의 양은 적습니다.\n가능한 한 많은 양의 구리와 납을 수집하십시오.\n출격합시다!
|
zone.groundZero.description = 이 장소는 다시 시작하기에 최적의 환경을 지닌 장소입니다. 적은 수준의 위협이 있으며 자원의 양은 적습니다.\n가능한 한 많은 양의 구리와 납을 수집하십시오.\n출격합시다!
|
||||||
zone.frozenForest.description = 이 지역도 산과 가까운 지역입니다 포자들이 흩뿌려져 있으며 극한의 추위도 포자룰 막을 수 있을거 같지 않습니다.\n전력을 통해서 모험을 시작하십시오 화력 발전소를 짓고 수리드론을 사용하는 법을 배우십시오.
|
zone.frozenForest.description = 이 지역도 산과 가까운 지역입니다 포자들이 흩뿌려져 있으며 극한의 추위도 포자룰 막을 수 있을거 같지 않습니다.\n전력을 통해서 모험을 시작하십시오 화력 발전소를 짓고 수리드론을 사용하는 법을 배우십시오.
|
||||||
zone.desertWastes.description = 이 황무지는 끝을 알수 없을 정도로 광활합니다 그리고 십자가 형태의 버려진 구조물이 존재합니다.\n석탄이 존재하며 이를 화력발전에 쓰거나 흑연정제에 쓰십시오.\n\n[lightgray]이 지역에서의 착륙장소는 확실하지 않습니다.
|
zone.desertWastes.description = 이 황무지는 끝을 알수 없을 정도로 광활합니다 그리고 십자가 형태의 버려진 구조물이 존재합니다.\n석탄이 존재하며 이를 화력발전에 쓰거나 흑연정제에 쓰십시오.\n\n[lightgray]이 지역에서의 착륙장소는 확실하지 않습니다.
|
||||||
@@ -385,6 +419,7 @@ zone.nuclearComplex.description = 과거 토륨의 생산, 연구와 처리를
|
|||||||
zone.fungalPass.description = 고산지대과 포자지대 사이의 지역입니다. 소규모의 적 정찰기지가 있으니 디거와 크롤러를 이용해 적의 코어를 파괴하십시오.
|
zone.fungalPass.description = 고산지대과 포자지대 사이의 지역입니다. 소규모의 적 정찰기지가 있으니 디거와 크롤러를 이용해 적의 코어를 파괴하십시오.
|
||||||
zone.impact0078.description = [ROYAL]죄송합니다. 아직 설명이 준비되지 않았습니다.
|
zone.impact0078.description = [ROYAL]죄송합니다. 아직 설명이 준비되지 않았습니다.
|
||||||
zone.crags.description = [ROYAL]죄송합니다. 아직 설명이 준비되지 않았습니다.
|
zone.crags.description = [ROYAL]죄송합니다. 아직 설명이 준비되지 않았습니다.
|
||||||
|
|
||||||
settings.language = 언어
|
settings.language = 언어
|
||||||
settings.data = 게임 데이터
|
settings.data = 게임 데이터
|
||||||
settings.reset = 설정 초기화
|
settings.reset = 설정 초기화
|
||||||
@@ -411,7 +446,7 @@ blocks.booster = 가속
|
|||||||
block.unknown = [LIGHT_GRAY]???
|
block.unknown = [LIGHT_GRAY]???
|
||||||
blocks.powercapacity = 전력 용량
|
blocks.powercapacity = 전력 용량
|
||||||
blocks.powershot = 1발당 전력 소모량
|
blocks.powershot = 1발당 전력 소모량
|
||||||
blocks.damage = Damage
|
blocks.damage = 공격력
|
||||||
blocks.targetsair = 공중공격 가능
|
blocks.targetsair = 공중공격 가능
|
||||||
blocks.targetsground = 지상공격 가능
|
blocks.targetsground = 지상공격 가능
|
||||||
blocks.itemsmoved = 이동 속도
|
blocks.itemsmoved = 이동 속도
|
||||||
@@ -434,10 +469,12 @@ blocks.boosteffect = 가속 효과
|
|||||||
blocks.maxunits = 최대 활성유닛
|
blocks.maxunits = 최대 활성유닛
|
||||||
blocks.health = 체력
|
blocks.health = 체력
|
||||||
blocks.buildtime = 건설 시간
|
blocks.buildtime = 건설 시간
|
||||||
|
blocks.buildcost = 건설 재료
|
||||||
blocks.inaccuracy = 오차각
|
blocks.inaccuracy = 오차각
|
||||||
blocks.shots = 발포 횟수
|
blocks.shots = 발포 횟수
|
||||||
blocks.reload = 재장전
|
blocks.reload = 재장전
|
||||||
blocks.ammo = 탄약
|
blocks.ammo = 탄약
|
||||||
|
|
||||||
bar.drilltierreq = 드릴이 요구됨
|
bar.drilltierreq = 드릴이 요구됨
|
||||||
bar.drillspeed = 채광 속도 : {0}/s
|
bar.drillspeed = 채광 속도 : {0}/s
|
||||||
bar.efficiency = 효율성 : {0}%
|
bar.efficiency = 효율성 : {0}%
|
||||||
@@ -450,6 +487,7 @@ bar.heat = 발열
|
|||||||
bar.power = 전력
|
bar.power = 전력
|
||||||
bar.progress = 건설 진행
|
bar.progress = 건설 진행
|
||||||
bar.spawned = 유닛: {0}/{1}
|
bar.spawned = 유닛: {0}/{1}
|
||||||
|
|
||||||
bullet.damage = [stat]{0}[lightgray] 데미지
|
bullet.damage = [stat]{0}[lightgray] 데미지
|
||||||
bullet.splashdamage = [stat]{0}[lightgray] 범위 데미지 ~[stat] {1}[lightgray] 타일
|
bullet.splashdamage = [stat]{0}[lightgray] 범위 데미지 ~[stat] {1}[lightgray] 타일
|
||||||
bullet.incendiary = [stat]방화
|
bullet.incendiary = [stat]방화
|
||||||
@@ -461,6 +499,7 @@ bullet.freezing = [stat]동결
|
|||||||
bullet.tarred = [stat]타르
|
bullet.tarred = [stat]타르
|
||||||
bullet.multiplier = [stat]{0}[lightgray]x 탄약 소모율
|
bullet.multiplier = [stat]{0}[lightgray]x 탄약 소모율
|
||||||
bullet.reload = [stat]{0}[lightgray]x 사격 속도
|
bullet.reload = [stat]{0}[lightgray]x 사격 속도
|
||||||
|
|
||||||
unit.blocks = 블록
|
unit.blocks = 블록
|
||||||
unit.powersecond = 전력/초
|
unit.powersecond = 전력/초
|
||||||
unit.liquidsecond = 액체/초
|
unit.liquidsecond = 액체/초
|
||||||
@@ -519,6 +558,7 @@ setting.sfxvol.name = 효과음 크기
|
|||||||
setting.mutesound.name = 소리 끄기
|
setting.mutesound.name = 소리 끄기
|
||||||
setting.crashreport.name = 오류 보고서 보내기
|
setting.crashreport.name = 오류 보고서 보내기
|
||||||
setting.savecreate.name = 자동 저장 활성화
|
setting.savecreate.name = 자동 저장 활성화
|
||||||
|
setting.publichost.name = 공용 서버 보이기
|
||||||
setting.chatopacity.name = 채팅 투명도
|
setting.chatopacity.name = 채팅 투명도
|
||||||
setting.playerchat.name = 인게임 채팅 표시
|
setting.playerchat.name = 인게임 채팅 표시
|
||||||
uiscale.reset = UI 스케일이 변경되었습니다.\n"확인"버튼을 눌러 스케일을 확인하세요.\n[scarlet]Reverting and exiting in[accent] {0}[] settings...
|
uiscale.reset = UI 스케일이 변경되었습니다.\n"확인"버튼을 눌러 스케일을 확인하세요.\n[scarlet]Reverting and exiting in[accent] {0}[] settings...
|
||||||
@@ -572,6 +612,7 @@ mode.pvp.description = 실제 플레이어와 PvP를 합니다. 맵에 적어도
|
|||||||
mode.attack.name = 공격
|
mode.attack.name = 공격
|
||||||
mode.attack.description = 적 기지를 파괴하세요. 맵에 빨간팀 코어가 있어야 플레이 가능합니다.
|
mode.attack.description = 적 기지를 파괴하세요. 맵에 빨간팀 코어가 있어야 플레이 가능합니다.
|
||||||
mode.custom = 사용자 정의 규칙
|
mode.custom = 사용자 정의 규칙
|
||||||
|
|
||||||
rules.infiniteresources = 무한 자원
|
rules.infiniteresources = 무한 자원
|
||||||
rules.wavetimer = 웨이브 타이머
|
rules.wavetimer = 웨이브 타이머
|
||||||
rules.waves = 웨이브
|
rules.waves = 웨이브
|
||||||
@@ -598,6 +639,7 @@ rules.title.resourcesbuilding = 자원 & 건축
|
|||||||
rules.title.player = 플레이어들
|
rules.title.player = 플레이어들
|
||||||
rules.title.enemy = 적
|
rules.title.enemy = 적
|
||||||
rules.title.unit = 유닛
|
rules.title.unit = 유닛
|
||||||
|
|
||||||
content.item.name = 아이템
|
content.item.name = 아이템
|
||||||
content.liquid.name = 액체
|
content.liquid.name = 액체
|
||||||
content.unit.name = 유닛
|
content.unit.name = 유닛
|
||||||
@@ -659,6 +701,7 @@ mech.buildspeed = [LIGHT_GRAY]건설 속도: {0}%
|
|||||||
liquid.heatcapacity = [LIGHT_GRAY]발열 용량: {0}
|
liquid.heatcapacity = [LIGHT_GRAY]발열 용량: {0}
|
||||||
liquid.viscosity = [LIGHT_GRAY]점도: {0}
|
liquid.viscosity = [LIGHT_GRAY]점도: {0}
|
||||||
liquid.temperature = [LIGHT_GRAY]온도: {0}
|
liquid.temperature = [LIGHT_GRAY]온도: {0}
|
||||||
|
|
||||||
block.sand-boulder.name = 사암
|
block.sand-boulder.name = 사암
|
||||||
block.grass.name = 잔디
|
block.grass.name = 잔디
|
||||||
block.salt.name = 소금
|
block.salt.name = 소금
|
||||||
@@ -886,6 +929,8 @@ tutorial.deposit = 자원을 다시 블록에 넣을수도 있습니다.\n\n[acc
|
|||||||
tutorial.waves = [LIGHT_GRAY]적[]이 접근합니다.\n당신의 기체는 적을 향해 클릭하여 공격할 수 있습니다. 또한, 구리를 더 캐내고 포탑을 더 지어서 방어를 강화하세요.\n\n[accent]2단계 동안 코어를 보호하세요.[]
|
tutorial.waves = [LIGHT_GRAY]적[]이 접근합니다.\n당신의 기체는 적을 향해 클릭하여 공격할 수 있습니다. 또한, 구리를 더 캐내고 포탑을 더 지어서 방어를 강화하세요.\n\n[accent]2단계 동안 코어를 보호하세요.[]
|
||||||
tutorial.waves.mobile = [LIGHT_GRAY]적[]이 접근합니다.\n당신의 기체는 적을 자동조준하지만, 원하는 적을 클릭하여 공격하고 싶은 대상을 바꿀 수 있습니다.\n구리를 더 캐내고 포탑을 더 지어서 방어를 강화하세요.\n\n[accent]2단계동안 코어를 방어하세요.[]
|
tutorial.waves.mobile = [LIGHT_GRAY]적[]이 접근합니다.\n당신의 기체는 적을 자동조준하지만, 원하는 적을 클릭하여 공격하고 싶은 대상을 바꿀 수 있습니다.\n구리를 더 캐내고 포탑을 더 지어서 방어를 강화하세요.\n\n[accent]2단계동안 코어를 방어하세요.[]
|
||||||
tutorial.launch = 특정 단계에 도달하면 [accent]출격[]이 가능합니다.\n[accent]출격[]을 하게되면 해당 지역의 코어에 들어있는 자원들을 캠페인의 자원 창고로 보내지만, 해당 지역의 [accent]모든 것들[]은 날라가게 되니 주의하세요.
|
tutorial.launch = 특정 단계에 도달하면 [accent]출격[]이 가능합니다.\n[accent]출격[]을 하게되면 해당 지역의 코어에 들어있는 자원들을 캠페인의 자원 창고로 보내지만, 해당 지역의 [accent]모든 것들[]은 날라가게 되니 주의하세요.
|
||||||
|
|
||||||
|
|
||||||
item.copper.description = 모든 종류의 블록에서 광범위하게 사용되는 자원입니다.
|
item.copper.description = 모든 종류의 블록에서 광범위하게 사용되는 자원입니다.
|
||||||
item.lead.description = 쉽게 구할 수 있으며, 전자 및 액체 수송 블록에서 광범위하게 사용되는 자원입니다.
|
item.lead.description = 쉽게 구할 수 있으며, 전자 및 액체 수송 블록에서 광범위하게 사용되는 자원입니다.
|
||||||
item.metaglass.description = 초강력 유리 화합물. 액체 분배 및 저장에 광범위하게 사용됩니다.\n\n[royal]빨리 생산할수록 게임이 편해집니다.
|
item.metaglass.description = 초강력 유리 화합물. 액체 분배 및 저장에 광범위하게 사용됩니다.\n\n[royal]빨리 생산할수록 게임이 편해집니다.
|
||||||
|
|||||||
@@ -4,7 +4,7 @@ contributors = Tłumacze i pomocnicy
|
|||||||
discord = Odwiedź nasz serwer Discord!
|
discord = Odwiedź nasz serwer Discord!
|
||||||
link.discord.description = Oficjalny serwer Discord Mindustry
|
link.discord.description = Oficjalny serwer Discord Mindustry
|
||||||
link.github.description = Kod Gry
|
link.github.description = Kod Gry
|
||||||
link.changelog.description = List of update changes
|
link.changelog.description = Informacje o aktualizacjach
|
||||||
link.dev-builds.description = Niestabilne wersje gry
|
link.dev-builds.description = Niestabilne wersje gry
|
||||||
link.trello.description = Oficjalna tablica Trello z planowanym funkcjami
|
link.trello.description = Oficjalna tablica Trello z planowanym funkcjami
|
||||||
link.itch.io.description = Strona itch.io z oficjanymi wersjami do pobrania
|
link.itch.io.description = Strona itch.io z oficjanymi wersjami do pobrania
|
||||||
@@ -16,11 +16,13 @@ screenshot.invalid = Zrzut ekranu jest zbyt duży. Najprawdopodobniej brakuje mi
|
|||||||
gameover = Rdzeń został zniszczony.
|
gameover = Rdzeń został zniszczony.
|
||||||
gameover.pvp = Zwyciężyła drużyna [accent]{0}[]!
|
gameover.pvp = Zwyciężyła drużyna [accent]{0}[]!
|
||||||
highscore = [YELLOW] Nowy rekord!
|
highscore = [YELLOW] Nowy rekord!
|
||||||
load.sound = Sounds
|
|
||||||
load.map = Maps
|
load.sound = Dźwięki
|
||||||
load.image = Images
|
load.map = Mapy
|
||||||
load.content = Content
|
load.image = Obrazy
|
||||||
|
load.content = Treść
|
||||||
load.system = System
|
load.system = System
|
||||||
|
|
||||||
stat.wave = Fale powstrzymane:[accent] {0}
|
stat.wave = Fale powstrzymane:[accent] {0}
|
||||||
stat.enemiesDestroyed = Przeciwnicy zniszczeni:[accent] {0}
|
stat.enemiesDestroyed = Przeciwnicy zniszczeni:[accent] {0}
|
||||||
stat.built = Budynki zbudowane:[accent] {0}
|
stat.built = Budynki zbudowane:[accent] {0}
|
||||||
@@ -28,6 +30,7 @@ stat.destroyed = Budynki zniszczone:[accent] {0}
|
|||||||
stat.deconstructed = Budynki zrekonstruowane:[accent] {0}
|
stat.deconstructed = Budynki zrekonstruowane:[accent] {0}
|
||||||
stat.delivered = Surowce wystrzelone:
|
stat.delivered = Surowce wystrzelone:
|
||||||
stat.rank = Ocena: [accent]{0}
|
stat.rank = Ocena: [accent]{0}
|
||||||
|
|
||||||
launcheditems = [accent]Wystrzelone przedmioty
|
launcheditems = [accent]Wystrzelone przedmioty
|
||||||
map.delete = Jesteś pewny, że chcesz usunąć "[accent]{0}[]"?
|
map.delete = Jesteś pewny, że chcesz usunąć "[accent]{0}[]"?
|
||||||
level.highscore = Rekord: [accent]{0}
|
level.highscore = Rekord: [accent]{0}
|
||||||
@@ -46,11 +49,18 @@ newgame = Nowa Gra
|
|||||||
none = <none>
|
none = <none>
|
||||||
minimap = Minimapa
|
minimap = Minimapa
|
||||||
close = Zamknij
|
close = Zamknij
|
||||||
website = Website
|
website = Strona Gry
|
||||||
quit = Wyjdź
|
quit = Wyjdź
|
||||||
maps = Mapy
|
maps = Mapy
|
||||||
continue = Kontynuuj
|
continue = Kontynuuj
|
||||||
maps.none = [LIGHT_GRAY]Nie znaleziono żadnych map!
|
maps.none = [LIGHT_GRAY]Nie znaleziono żadnych map!
|
||||||
|
invalid = Invalid
|
||||||
|
preparingconfig = Preparing Config
|
||||||
|
preparingcontent = Preparing Content
|
||||||
|
uploadingcontent = Uploading Content
|
||||||
|
uploadingpreviewfile = Uploading Preview File
|
||||||
|
committingchanges = Comitting Changes
|
||||||
|
done = Done
|
||||||
about.button = O grze
|
about.button = O grze
|
||||||
name = Nazwa:
|
name = Nazwa:
|
||||||
noname = Najpierw wybierz [accent]nazwę gracza[]
|
noname = Najpierw wybierz [accent]nazwę gracza[]
|
||||||
@@ -65,19 +75,21 @@ players = {0} graczy online
|
|||||||
players.single = {0} gracz online
|
players.single = {0} gracz online
|
||||||
server.closing = [accent] Zamykanie serwera...
|
server.closing = [accent] Zamykanie serwera...
|
||||||
server.kicked.kick = Zostałeś wyrzucony z serwera!
|
server.kicked.kick = Zostałeś wyrzucony z serwera!
|
||||||
|
server.kicked.whitelist = You are not whitelisted here.
|
||||||
server.kicked.serverClose = Serwer został zamknięty.
|
server.kicked.serverClose = Serwer został zamknięty.
|
||||||
server.kicked.vote = You have been vote-kicked. Goodbye.
|
server.kicked.vote = Zostałeś wyrzucony z gry. Żegnaj.
|
||||||
server.kicked.clientOutdated = Nieaktualna gra! Zaktualizują ją!
|
server.kicked.clientOutdated = Nieaktualna gra! Zaktualizują ją!
|
||||||
server.kicked.serverOutdated = Nieaktualny serwer! Poproś hosta o jego aktualizację.
|
server.kicked.serverOutdated = Nieaktualny serwer! Poproś hosta o jego aktualizację.
|
||||||
server.kicked.banned = Zostałeś zbanowany na tym serwerze.
|
server.kicked.banned = Zostałeś zbanowany na tym serwerze.
|
||||||
server.kicked.typeMismatch = This server is not compatible with your build type.
|
server.kicked.typeMismatch = Ten serwer jest niekompatybilny z twoją wersją gry.
|
||||||
|
server.kicked.playerLimit = Serwer pełny. Poczekaj na wolny slot.
|
||||||
server.kicked.recentKick = Zostałeś niedawno wyrzucony.\nPoczekaj chwilę przed ponownym połączniem.
|
server.kicked.recentKick = Zostałeś niedawno wyrzucony.\nPoczekaj chwilę przed ponownym połączniem.
|
||||||
server.kicked.nameInUse = Ta nazwa jest już zajęta na tym serwerze.
|
server.kicked.nameInUse = Ta nazwa jest już zajęta na tym serwerze.
|
||||||
server.kicked.nameEmpty = Wybrana przez Ciebie nazwa jest nieprawidłowa.
|
server.kicked.nameEmpty = Wybrana przez Ciebie nazwa jest nieprawidłowa.
|
||||||
server.kicked.idInUse = Jesteś już na serwerze! Używanie tego samego konta na 2 urządzeniach jest zabronione.
|
server.kicked.idInUse = Jesteś już na serwerze! Używanie tego samego konta na 2 urządzeniach jest zabronione.
|
||||||
server.kicked.customClient = Ten serwer nie wspomaga wersji deweloperskich. Pobierz oficjalną wersję.
|
server.kicked.customClient = Ten serwer nie wspomaga wersji deweloperskich. Pobierz oficjalną wersję.
|
||||||
server.kicked.gameover = Koniec gry!
|
server.kicked.gameover = Koniec gry!
|
||||||
server.versions = Your version:[accent] {0}[]\nServer version:[accent] {1}[]
|
server.versions = Twoja wersja gry:[accent] {0}[]\nWersja gry serwera:[accent] {1}[]
|
||||||
host.info = Przycisk [accent]host[] hostuje serwer na porcie [scarlet]6567[] i [scarlet]6568.[]\nKtokolwiek z tym samym [LIGHT_GRAY]wifi lub hotspotem[] powinien zobaczyć twój serwer.\n\nJeśli chcesz, aby każdy z twoim IP mógł dołączyć, [accent]przekierowywanie portów[] jest potrzebne.\n\n[LIGHT_GRAY]Notka:Jeśli ktokolwiek ma problem z dołączeniem do gry, upewnij się, że udostępniłeś Mindustry dostęp do sieci.
|
host.info = Przycisk [accent]host[] hostuje serwer na porcie [scarlet]6567[] i [scarlet]6568.[]\nKtokolwiek z tym samym [LIGHT_GRAY]wifi lub hotspotem[] powinien zobaczyć twój serwer.\n\nJeśli chcesz, aby każdy z twoim IP mógł dołączyć, [accent]przekierowywanie portów[] jest potrzebne.\n\n[LIGHT_GRAY]Notka:Jeśli ktokolwiek ma problem z dołączeniem do gry, upewnij się, że udostępniłeś Mindustry dostęp do sieci.
|
||||||
join.info = Tutaj możesz wpisać [accent]IP serwera[], aby dołączyć lub wyszukaj [accent]serwery w lokalnej sieci[], do których chcesz dołączyć .\nGra wieloosobowa na LAN i WAN jest wspomagana.\n\n[LIGHT_GRAY]Notka: Nie ma automatycznej listy wszystkich serwerów; jeśli chcesz dołączyć przez IP, musisz zapytać się hosta o IP.
|
join.info = Tutaj możesz wpisać [accent]IP serwera[], aby dołączyć lub wyszukaj [accent]serwery w lokalnej sieci[], do których chcesz dołączyć .\nGra wieloosobowa na LAN i WAN jest wspomagana.\n\n[LIGHT_GRAY]Notka: Nie ma automatycznej listy wszystkich serwerów; jeśli chcesz dołączyć przez IP, musisz zapytać się hosta o IP.
|
||||||
hostserver = Stwórz Serwer
|
hostserver = Stwórz Serwer
|
||||||
@@ -86,6 +98,7 @@ host = Hostuj
|
|||||||
hosting = [accent] Otwieranie serwera...
|
hosting = [accent] Otwieranie serwera...
|
||||||
hosts.refresh = Odśwież
|
hosts.refresh = Odśwież
|
||||||
hosts.discovering = Wyszukiwanie gier w sieci LAN
|
hosts.discovering = Wyszukiwanie gier w sieci LAN
|
||||||
|
hosts.discovering.any = Discovering games
|
||||||
server.refreshing = Odświeżanie serwera
|
server.refreshing = Odświeżanie serwera
|
||||||
hosts.none = [lightgray] Brak serwerów w sieci LAN!
|
hosts.none = [lightgray] Brak serwerów w sieci LAN!
|
||||||
host.invalid = [scarlet] Nie można połączyć się z hostem.
|
host.invalid = [scarlet] Nie można połączyć się z hostem.
|
||||||
@@ -93,7 +106,7 @@ trace = Zlokalizuj gracza
|
|||||||
trace.playername = Nazwa gracza: [accent]{0}
|
trace.playername = Nazwa gracza: [accent]{0}
|
||||||
trace.ip = IP: [accent]{0}
|
trace.ip = IP: [accent]{0}
|
||||||
trace.id = Wyjątkowe ID: [accent]{0}
|
trace.id = Wyjątkowe ID: [accent]{0}
|
||||||
trace.mobile = Mobile Client: [accent]{0}
|
trace.mobile = Klient Mobilny: [accent]{0}
|
||||||
trace.modclient = Zmodowany klient: [accent]{0}
|
trace.modclient = Zmodowany klient: [accent]{0}
|
||||||
invalidid = Złe ID klienta! Udostępnij raport błędu.
|
invalidid = Złe ID klienta! Udostępnij raport błędu.
|
||||||
server.bans = Bany
|
server.bans = Bany
|
||||||
@@ -115,6 +128,9 @@ confirmunadmin = Jesteś pewny, że chcesz zabrać rangę admina temu graczowi?
|
|||||||
joingame.title = Dołącz do gry
|
joingame.title = Dołącz do gry
|
||||||
joingame.ip = IP:
|
joingame.ip = IP:
|
||||||
disconnect = Rozłączono.
|
disconnect = Rozłączono.
|
||||||
|
disconnect.error = Błąd połączenia.
|
||||||
|
disconnect.closed = Połączenie zostało zamknięte.
|
||||||
|
disconnect.timeout = Przekroczono limit czasu.
|
||||||
disconnect.data = Nie udało się załadować mapy!
|
disconnect.data = Nie udało się załadować mapy!
|
||||||
connecting = [accent]Łączenie...
|
connecting = [accent]Łączenie...
|
||||||
connecting.data = [accent]Ładowanie danych świata...
|
connecting.data = [accent]Ładowanie danych świata...
|
||||||
@@ -141,7 +157,7 @@ save.rename = Zmień nazwę
|
|||||||
save.rename.text = Nowa nazwa:
|
save.rename.text = Nowa nazwa:
|
||||||
selectslot = Wybierz zapis.
|
selectslot = Wybierz zapis.
|
||||||
slot = [accent]Slot {0}
|
slot = [accent]Slot {0}
|
||||||
save.corrupted = [accent]Zapis gry jest uszkodzony lub nieprawidłowy! Jeżeli aktualizowałeś grę, najprawdopodobniej zmiana w formacie zapisu i [scarlet]nie jest[] to błąd.
|
save.corrupted = [accent]Zapis gry jest uszkodzony lub nieprawidłowy! Jeżeli aktualizowałeś grę, najprawdopodobniej jest to zmiana w formacie zapisu i [scarlet]nie jest[] to błąd.
|
||||||
empty = <pusto>
|
empty = <pusto>
|
||||||
on = Włączone
|
on = Włączone
|
||||||
off = Wyłączone
|
off = Wyłączone
|
||||||
@@ -156,25 +172,25 @@ confirm = Potwierdź
|
|||||||
delete = Usuń
|
delete = Usuń
|
||||||
ok = Ok
|
ok = Ok
|
||||||
open = Otwórz
|
open = Otwórz
|
||||||
customize = Customize
|
customize = Dostosuj
|
||||||
cancel = Anuluj
|
cancel = Anuluj
|
||||||
openlink = Otwórz link
|
openlink = Otwórz link
|
||||||
copylink = Kopiuj link
|
copylink = Kopiuj link
|
||||||
back = Wróć
|
back = Wróć
|
||||||
data.export = Export Data
|
data.export = Eksportuj Dane
|
||||||
data.import = Import Data
|
data.import = Importuj Dane
|
||||||
data.exported = Data exported.
|
data.exported = Dane wyeksportowane.
|
||||||
data.invalid = This isn't valid game data.
|
data.invalid = Nieprawidłowe dane gry.
|
||||||
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.
|
data.import.confirm = Zaimportowanie zewnętrznych danych usunie[scarlet] wszystkie[] obecne dane gry.\n[accent]Nie można tego cofnąć![]\n\nGdy dane zostaną zimportowane, gra automatycznie się wyłączy.
|
||||||
classic.export = Export Classic Data
|
classic.export = Eksportuj dane wersji klasycznej
|
||||||
classic.export.text = [accent]Mindustry[] has just had a major update.\nClassic (v3.5 build 40) save or map data has been detected. Would you like to export these saves to your phone's home folder, for use in the Mindustry Classic app?
|
classic.export.text = [accent]Mindustry[] otrzymało ostatnio ważną aktualizację.\nClassic (v3.5 build 40) zapis albo mapa zostały wykryte. Czy chciałbyś eksportować te zapisy do katalogu domowego swojego telefonu, do użycia w aplikacji Mindustry Classic?
|
||||||
quit.confirm = Czy na pewno chcesz wyjść?
|
quit.confirm = Czy na pewno chcesz wyjść?
|
||||||
quit.confirm.tutorial = Are you sure you know what you're doing?\nThe tutorial can be re-taken in[accent] Settings->Game->Re-Take Tutorial.[]
|
quit.confirm.tutorial = Czy jesteś pewien tego co robisz?\nSamouczek może zostać powtórzony w[accent] Opcje->Gra->Powtórz samouczek.[]
|
||||||
loading = [accent]Ładowanie...
|
loading = [accent]Ładowanie...
|
||||||
saving = [accent]Zapisywanie...
|
saving = [accent]Zapisywanie...
|
||||||
wave = [accent]Fala {0}
|
wave = [accent]Fala {0}
|
||||||
wave.waiting = Fala za {0}
|
wave.waiting = Fala za {0}
|
||||||
wave.waveInProgress = [LIGHT_GRAY]Wave in progress
|
wave.waveInProgress = [LIGHT_GRAY]Fala w trakcie
|
||||||
waiting = [LIGHT_GRAY]Oczekiwanie...
|
waiting = [LIGHT_GRAY]Oczekiwanie...
|
||||||
waiting.players = Oczekiwanie na graczy...
|
waiting.players = Oczekiwanie na graczy...
|
||||||
wave.enemies = Pozostało [LIGHT_GRAY]{0} wrogów
|
wave.enemies = Pozostało [LIGHT_GRAY]{0} wrogów
|
||||||
@@ -190,6 +206,9 @@ map.nospawn = Ta mapa nie zawiera żadnego rdzenia! Dodaj [ROYAL]niebieski[] rdz
|
|||||||
map.nospawn.pvp = Ta mapa nie ma żadnego rdzenia przeciwnika, aby mogli się zrespić przeciwnicy! Dodaj[SCARLET] inny niż niebieski[] rdzeń do mapy w edytorze.
|
map.nospawn.pvp = Ta mapa nie ma żadnego rdzenia przeciwnika, aby mogli się zrespić przeciwnicy! Dodaj[SCARLET] inny niż niebieski[] rdzeń do mapy w edytorze.
|
||||||
map.nospawn.attack = Ta mapa nie ma żadnego rdzenia przeciwnika, aby można było go zaatakować! Dodaj[SCARLET] czerwony[] rdzeń do mapy w edytorze.
|
map.nospawn.attack = Ta mapa nie ma żadnego rdzenia przeciwnika, aby można było go zaatakować! Dodaj[SCARLET] czerwony[] rdzeń do mapy w edytorze.
|
||||||
map.invalid = Błąd podczas ładowania mapy: uszkodzony lub niepoprawny plik mapy.
|
map.invalid = Błąd podczas ładowania mapy: uszkodzony lub niepoprawny plik mapy.
|
||||||
|
map.publish.error = Błąd podczas publikowania mapy: {0}
|
||||||
|
map.publish = Opublikowano mapę.
|
||||||
|
map.publishing = [accent]Publikowanie mapy...
|
||||||
editor.brush = Pędzel
|
editor.brush = Pędzel
|
||||||
editor.openin = Otwórz w edytorze
|
editor.openin = Otwórz w edytorze
|
||||||
editor.oregen = Generacja złóż
|
editor.oregen = Generacja złóż
|
||||||
@@ -198,19 +217,21 @@ editor.mapinfo = Informacje o mapie
|
|||||||
editor.author = Autor:
|
editor.author = Autor:
|
||||||
editor.description = Opis:
|
editor.description = Opis:
|
||||||
editor.waves = Fale:
|
editor.waves = Fale:
|
||||||
editor.rules = Rules:
|
editor.rules = Zasady:
|
||||||
editor.generation = Generation:
|
editor.generation = Generacja:
|
||||||
editor.ingame = Edytuj w grze
|
editor.ingame = Edytuj w grze
|
||||||
editor.newmap = New Map
|
editor.publish.workshop = Opublikuj w Workshop
|
||||||
|
editor.newmap = Nowa Mapa
|
||||||
|
workshop = Workshop
|
||||||
waves.title = Fale
|
waves.title = Fale
|
||||||
waves.remove = Usuń
|
waves.remove = Usuń
|
||||||
waves.never = <nigdy>
|
waves.never = <nigdy>
|
||||||
waves.every = co
|
waves.every = co
|
||||||
waves.waves = wave(s)
|
waves.waves = fal(e)
|
||||||
waves.perspawn = per spawn
|
waves.perspawn = co pojawienie
|
||||||
waves.to = do
|
waves.to = do
|
||||||
waves.boss = Boss
|
waves.boss = Boss
|
||||||
waves.preview = Preview
|
waves.preview = Podgląd
|
||||||
waves.edit = Edytuj...
|
waves.edit = Edytuj...
|
||||||
waves.copy = Kopiuj do schowka
|
waves.copy = Kopiuj do schowka
|
||||||
waves.load = Załaduj ze schowka
|
waves.load = Załaduj ze schowka
|
||||||
@@ -218,15 +239,17 @@ waves.invalid = Nieprawidłowe fale w schowku.
|
|||||||
waves.copied = Fale zostały skopiowane.
|
waves.copied = Fale zostały skopiowane.
|
||||||
waves.none = Brak zdefiniowanych wrogów.\nPamiętaj, że puste układy fal zostaną automatycznie zastąpione układem domyślnym.
|
waves.none = Brak zdefiniowanych wrogów.\nPamiętaj, że puste układy fal zostaną automatycznie zastąpione układem domyślnym.
|
||||||
editor.default = [LIGHT_GRAY]<Domyślne>
|
editor.default = [LIGHT_GRAY]<Domyślne>
|
||||||
|
details = Detale...
|
||||||
edit = Edytuj...
|
edit = Edytuj...
|
||||||
editor.name = Nazwa:
|
editor.name = Nazwa:
|
||||||
editor.spawn = Spawn Unit
|
editor.spawn = Stwórz jednostkę
|
||||||
editor.removeunit = Remove Unit
|
editor.removeunit = Usuń jednostkę
|
||||||
editor.teams = Drużyny
|
editor.teams = Drużyny
|
||||||
editor.errorload = Błąd podczas ładowania pliku:\n[accent]{0}
|
editor.errorload = Błąd podczas ładowania pliku:\n[accent]{0}
|
||||||
editor.errorsave = Błąd podczas zapisywania pliku:\n[accent]{0}
|
editor.errorsave = Błąd podczas zapisywania pliku:\n[accent]{0}
|
||||||
editor.errorimage = To obraz, nie mapa. Nie zmieniaj rozszeżenia spodziewając sie że to coś zmieni.\n\nJeśli chcesz zaimportować starszą mapę, użyj przycisku „importuj starszą mapę” w edytorze.
|
editor.errorimage = To obraz, nie mapa. Nie zmieniaj rozszeżenia spodziewając sie że to coś zmieni.\n\nJeśli chcesz zaimportować starszą mapę, użyj przycisku „importuj starszą mapę” w edytorze.
|
||||||
editor.errorlegacy = Ta mapa jest zbyt stara i używa starszego formatu mapy, który nie jest już obsługiwany.
|
editor.errorlegacy = Ta mapa jest zbyt stara i używa starszego formatu mapy, który nie jest już obsługiwany.
|
||||||
|
editor.errornot = To nie jest plik mapy.
|
||||||
editor.errorheader = Ten plik mapy jest nieprawidłowy lub uszkodzony.
|
editor.errorheader = Ten plik mapy jest nieprawidłowy lub uszkodzony.
|
||||||
editor.errorname = Mapa nie zawiera nazwy.
|
editor.errorname = Mapa nie zawiera nazwy.
|
||||||
editor.update = Aktualizuj
|
editor.update = Aktualizuj
|
||||||
@@ -260,6 +283,7 @@ editor.mapname = Nazwa mapy:
|
|||||||
editor.overwrite = [accent]Uwaga!\nSpowoduje to nadpisanie istniejącej mapy.
|
editor.overwrite = [accent]Uwaga!\nSpowoduje to nadpisanie istniejącej mapy.
|
||||||
editor.overwrite.confirm = [scarlet]Uwaga![] Mapa pod tą nazwą już istnieje. Jesteś pewny, że chcesz ją nadpisać?
|
editor.overwrite.confirm = [scarlet]Uwaga![] Mapa pod tą nazwą już istnieje. Jesteś pewny, że chcesz ją nadpisać?
|
||||||
editor.selectmap = Wybierz mapę do załadowania:
|
editor.selectmap = Wybierz mapę do załadowania:
|
||||||
|
|
||||||
toolmode.replace = Zastąp
|
toolmode.replace = Zastąp
|
||||||
toolmode.replace.description = Rysuje tylko na stałych blokach.
|
toolmode.replace.description = Rysuje tylko na stałych blokach.
|
||||||
toolmode.replaceall = Zastąp wszystko
|
toolmode.replaceall = Zastąp wszystko
|
||||||
@@ -267,30 +291,31 @@ toolmode.replaceall.description = Zastąp wszystkie bloki na mapie.
|
|||||||
toolmode.orthogonal = Prostokątny
|
toolmode.orthogonal = Prostokątny
|
||||||
toolmode.orthogonal.description = Rysuje tylko prostopadłe linie.
|
toolmode.orthogonal.description = Rysuje tylko prostopadłe linie.
|
||||||
toolmode.square = Kwadrat
|
toolmode.square = Kwadrat
|
||||||
toolmode.square.description = Square brush.
|
toolmode.square.description = Kwadratowy pędzel.
|
||||||
toolmode.eraseores = Wymaż Rudy
|
toolmode.eraseores = Wymaż Rudy
|
||||||
toolmode.eraseores.description = Usuń tylko rudy.
|
toolmode.eraseores.description = Usuń tylko rudy.
|
||||||
toolmode.fillteams = Wypełń Drużyny
|
toolmode.fillteams = Wypełń Drużyny
|
||||||
toolmode.fillteams.description = Wypełniaj drużyny zamiast bloków.
|
toolmode.fillteams.description = Wypełniaj drużyny zamiast bloków.
|
||||||
toolmode.drawteams = Rysuj Drużyny
|
toolmode.drawteams = Rysuj Drużyny
|
||||||
toolmode.drawteams.description = Rysuj drużyny zamiast bloków.
|
toolmode.drawteams.description = Rysuj drużyny zamiast bloków.
|
||||||
|
|
||||||
filters.empty = [LIGHT_GRAY]Brak filtrów! Dodaj jeden za pomocą przycisku poniżej.
|
filters.empty = [LIGHT_GRAY]Brak filtrów! Dodaj jeden za pomocą przycisku poniżej.
|
||||||
filter.distort = Zniekształcanie
|
filter.distort = Zniekształcanie
|
||||||
filter.noise = Szum
|
filter.noise = Szum
|
||||||
filter.median = Median
|
filter.median = Mediana
|
||||||
filter.oremedian = Ore Median
|
filter.oremedian = Mediana rud
|
||||||
filter.blend = Blend
|
filter.blend = Wtopienie
|
||||||
filter.defaultores = Domyślne rudy
|
filter.defaultores = Domyślne rudy
|
||||||
filter.ore = Ruda
|
filter.ore = Ruda
|
||||||
filter.rivernoise = Szum rzeki
|
filter.rivernoise = Szum rzeki
|
||||||
filter.mirror = Lustro
|
filter.mirror = Lustro
|
||||||
filter.clear = Oczyść
|
filter.clear = Oczyść
|
||||||
filter.option.ignore = Ignore
|
filter.option.ignore = Ignoruj
|
||||||
filter.scatter = Zozprosz
|
filter.scatter = Rozprosz
|
||||||
filter.terrain = Teren
|
filter.terrain = Teren
|
||||||
filter.option.scale = Skala
|
filter.option.scale = Skala
|
||||||
filter.option.chance = Szansa
|
filter.option.chance = Szansa
|
||||||
filter.option.mag = Magnituda
|
filter.option.mag = Wielkość
|
||||||
filter.option.threshold = Próg
|
filter.option.threshold = Próg
|
||||||
filter.option.circle-scale = Skala koła
|
filter.option.circle-scale = Skala koła
|
||||||
filter.option.octaves = Oktawy
|
filter.option.octaves = Oktawy
|
||||||
@@ -302,14 +327,15 @@ filter.option.flooronto = Podłoga Docelowa
|
|||||||
filter.option.wall = Ściana
|
filter.option.wall = Ściana
|
||||||
filter.option.ore = Ruda
|
filter.option.ore = Ruda
|
||||||
filter.option.floor2 = Druga podłoga
|
filter.option.floor2 = Druga podłoga
|
||||||
filter.option.threshold2 = Secondary Threshold
|
filter.option.threshold2 = Drugi próg
|
||||||
filter.option.radius = Zasięg
|
filter.option.radius = Zasięg
|
||||||
filter.option.percentile = Percentyl
|
filter.option.percentile = Percentyl
|
||||||
|
|
||||||
width = Szerokość:
|
width = Szerokość:
|
||||||
height = Wysokość:
|
height = Wysokość:
|
||||||
menu = Menu
|
menu = Menu
|
||||||
play = Graj
|
play = Graj
|
||||||
campaign = Campaign
|
campaign = Kampania
|
||||||
load = Wczytaj
|
load = Wczytaj
|
||||||
save = Zapisz
|
save = Zapisz
|
||||||
fps = FPS: {0}
|
fps = FPS: {0}
|
||||||
@@ -318,10 +344,11 @@ ping = Ping: {0}ms
|
|||||||
language.restart = Uruchom grę ponownie, aby ustawiony język zaczął funkcjonować.
|
language.restart = Uruchom grę ponownie, aby ustawiony język zaczął funkcjonować.
|
||||||
settings = Ustawienia
|
settings = Ustawienia
|
||||||
tutorial = Poradnik
|
tutorial = Poradnik
|
||||||
tutorial.retake = Re-Take Tutorial
|
tutorial.retake = Ponów Samouczek
|
||||||
editor = Edytor
|
editor = Edytor
|
||||||
mapeditor = Edytor map
|
mapeditor = Edytor map
|
||||||
donate = Wspomóż nas
|
donate = Wspomóż nas
|
||||||
|
|
||||||
abandon = Opuść
|
abandon = Opuść
|
||||||
abandon.text = Ta strefa i wszystkie jej surowce będą przejęte przez przeciwników.
|
abandon.text = Ta strefa i wszystkie jej surowce będą przejęte przez przeciwników.
|
||||||
locked = Zablokowane
|
locked = Zablokowane
|
||||||
@@ -332,21 +359,23 @@ bestwave = [LIGHT_GRAY]Najwyższa fala: {0}
|
|||||||
launch = < WYSTRZEL >
|
launch = < WYSTRZEL >
|
||||||
launch.title = Wystrzelenie Udane
|
launch.title = Wystrzelenie Udane
|
||||||
launch.next = [LIGHT_GRAY]Następna okazja przy fali {0}
|
launch.next = [LIGHT_GRAY]Następna okazja przy fali {0}
|
||||||
launch.unable2 = [scarlet]Unable to LAUNCH.[]
|
launch.unable2 = [scarlet]WYSTZRZELENIE niedostępne.[]
|
||||||
launch.confirm = Spowoduje to wystrzelenie wszystkich surowców w rdzeniu.\nNie będziesz mógł wrócić do tej bazy.
|
launch.confirm = Spowoduje to wystrzelenie wszystkich surowców w rdzeniu.\nNie będziesz mógł wrócić do tej bazy.
|
||||||
launch.skip.confirm = If you skip now, you will not be able to launch until later waves.
|
launch.skip.confirm = Jeśli teraz przejdziesz do kolejnej fali, Nie biędziesz miał możliwości wystrzelenia do czasu pokonania dalszych fal.
|
||||||
uncover = Odkryj
|
uncover = Odkryj
|
||||||
configure = Skonfiguruj ładunek
|
configure = Skonfiguruj ładunek
|
||||||
configure.locked = [LIGHT_GRAY]Dotrzyj do fali {0}\nAby skonfigurować ładunek.
|
configure.locked = [LIGHT_GRAY]Dotrzyj do fali {0}\nAby skonfigurować ładunek.
|
||||||
|
configure.invalid = Ilość musi być liczbą pomiędzy 0 a {0}.
|
||||||
zone.unlocked = [LIGHT_GRAY]Strefa {0} odblokowana.
|
zone.unlocked = [LIGHT_GRAY]Strefa {0} odblokowana.
|
||||||
zone.requirement.complete = Fala {0} osiągnięta:\n{1} Wymagania strefy zostały spełnione.
|
zone.requirement.complete = Fala {0} osiągnięta:\n{1} Wymagania strefy zostały spełnione.
|
||||||
zone.config.complete = Fala {0} osiągnięta:\nKonfiguracja ładunku odblokowana.
|
zone.config.complete = Fala {0} osiągnięta:\nKonfiguracja ładunku odblokowana.
|
||||||
zone.resources = Wykryte Zasoby:
|
zone.resources = Wykryte Zasoby:
|
||||||
zone.objective = [lightgray]Objective: [accent]{0}
|
zone.objective = [lightgray]Cel: [accent]{0}
|
||||||
zone.objective.survival = Przeżyj
|
zone.objective.survival = Przeżyj
|
||||||
zone.objective.attack = Zniszcz Rdzeń Wroga
|
zone.objective.attack = Zniszcz Rdzeń Wroga
|
||||||
add = Dodaj...
|
add = Dodaj...
|
||||||
boss.health = Boss Health
|
boss.health = Zdrowie Bossa
|
||||||
|
|
||||||
connectfail = [crimson]Nie można połączyć się z serwerem:\n\n[accent]{0}
|
connectfail = [crimson]Nie można połączyć się z serwerem:\n\n[accent]{0}
|
||||||
error.unreachable = Serwer niedostępny.\nCzy adres jest wpisany poprawnie?
|
error.unreachable = Serwer niedostępny.\nCzy adres jest wpisany poprawnie?
|
||||||
error.invalidaddress = Niepoprawny adres.
|
error.invalidaddress = Niepoprawny adres.
|
||||||
@@ -356,37 +385,39 @@ error.alreadyconnected = Jesteś już połączony.
|
|||||||
error.mapnotfound = Plik mapy nie został znaleziony!
|
error.mapnotfound = Plik mapy nie został znaleziony!
|
||||||
error.io = Błąd siecowy I/O.
|
error.io = Błąd siecowy I/O.
|
||||||
error.any = Nieznany błąd sieci.
|
error.any = Nieznany błąd sieci.
|
||||||
error.bloom = Failed to initialize bloom.\nYour device may not support it.
|
error.bloom = Nie udało się załadować bloom.\nTwoje urządzenie może nie wspierać tej funkcji.
|
||||||
|
|
||||||
zone.groundZero.name = Wybuch Lądowy
|
zone.groundZero.name = Wybuch Lądowy
|
||||||
zone.desertWastes.name = Pustynne Pustkowia
|
zone.desertWastes.name = Pustynne Pustkowia
|
||||||
zone.craters.name = Kratery
|
zone.craters.name = Kratery
|
||||||
zone.frozenForest.name = Zamrożony Las
|
zone.frozenForest.name = Zamrożony Las
|
||||||
zone.ruinousShores.name = Zniszczone Przybrzerza
|
zone.ruinousShores.name = Zniszczone Przybrzeża
|
||||||
zone.stainedMountains.name = Zabarwione Góry
|
zone.stainedMountains.name = Zabarwione Góry
|
||||||
zone.desolateRift.name = Ponura Szczelina
|
zone.desolateRift.name = Ponura Szczelina
|
||||||
zone.nuclearComplex.name = Centrum Wyrobu Jądrowego
|
zone.nuclearComplex.name = Centrum Wyrobu Jądrowego
|
||||||
zone.overgrowth.name = Przerośnięty Las
|
zone.overgrowth.name = Przerośnięty Las
|
||||||
zone.tarFields.name = Pola Smołowe
|
zone.tarFields.name = Pola Smołowe
|
||||||
zone.saltFlats.name = Salt Flats
|
zone.saltFlats.name = Solne Równiny
|
||||||
zone.impact0078.name = Uderzenie 0078
|
zone.impact0078.name = Uderzenie 0078
|
||||||
zone.crags.name = Urwisko
|
zone.crags.name = Urwisko
|
||||||
zone.fungalPass.name = Fungal Pass
|
zone.fungalPass.name = Grzybowa Przełęcz
|
||||||
zone.groundZero.description = Optymalna lokalizacja, aby rozpocząć jeszcze raz. Niskie zagrożenie. Niewiele zasobów.\nZbierz jak najwięcej miedzi i ołowiu, tyle ile jest możliwe.\nPrzejdź do następnej strefy jak najszybciej.
|
zone.groundZero.description = Optymalna lokalizacja, aby rozpocząć jeszcze raz. Niskie zagrożenie. Niewiele zasobów.\nZbierz jak najwięcej miedzi i ołowiu, tyle ile jest możliwe.\nPrzejdź do następnej strefy jak najszybciej.
|
||||||
zone.frozenForest.description = Nawet tutaj, bliżej gór, zarodniki rozprzestrzeniły się. Niskie temperatury nie mogą ich zatrzymać na zawsze.\n\nRozpocznij przedsięwzięcie od władzy. Buduj generatory spalinowe. Naucz się korzystać z naprawiaczy.
|
zone.frozenForest.description = Nawet tutaj, bliżej gór, zarodniki rozprzestrzeniły się. Niskie temperatury nie mogą ich zatrzymać na zawsze.\n\nRozpocznij przedsięwzięcie od władzy. Buduj generatory spalinowe. Naucz się korzystać z naprawiaczy.
|
||||||
zone.desertWastes.description = These wastes are vast, unpredictable, and criss-crossed with derelict sector structures.\nCoal is present in the region. Burn it for power, or synthesize graphite.\n\n[lightgray]This landing location cannot be guaranteed.
|
zone.desertWastes.description = Te pustkowia są rozległe, nieprzewidywalne, i znajdują się na nich opuszczone struktury.\nWęgiel jest obecny w tym regionie. Użyj go do produkcji energii, lub do stworzenia grafitu.\n\n[lightgray]Miejsce lądowania nie jest pewne.
|
||||||
zone.saltFlats.description = On the outskirts of the desert lie the Salt Flats. Few resources can be found in this location.\n\nThe enemy has erected a resource storage complex here. Eradicate their core. Leave nothing standing.
|
zone.saltFlats.description = Na obrzeżach pustyni spoczywają Solne Równiny. Można tu znaleźć niewiele surowców.\n\nWrogowie zbudowali tu bazę składującą surowce. Zniszcz ich rdżeń. Zniszcz wszystko co stanie ci na drodze.
|
||||||
zone.craters.description = Water has accumulated in this crater, relic of the old wars. Reclaim the area. Collect sand. Smelt metaglass. Pump water to cool turrets and drills.
|
zone.craters.description = W tym kraterze zebrała się woda. Pozostałość dawnych wojen. Odzyskaj ten teren. Wykop piasek. Wytop metaszkło. Pompuj wodę do działek obronnych i wierteł by je schłodzić
|
||||||
zone.ruinousShores.description = Past the wastes, is the shoreline. Once, this location housed a coastal defense array. Not much of it remains. Only the most basic defense structures have remained unscathed, everything else reduced to scrap.\nContinue the expansion outwards. Rediscover the technology.
|
zone.ruinousShores.description = Za pustkowiami ciągnie się linia brzegowa. Kiedyś znajdowała się tu przybrzeżna linia obronna. Niewiele z niej zostało. Ostały się tylko podstawowe struktury obronne, z reszty został tylko złom.\nKontynuuj eksploracje. Odkryj pozostawioną tu technologię.
|
||||||
zone.stainedMountains.description = W głębi lądu leżą góry, jeszcze nieskażone przez zarodniki.\nWydobądź obfity tytan w tym obszarze. Dowiedz się, jak z niego korzystać.\n\nObecność wroga jest tutaj większa. Nie daj im czasu na wysłanie swoich najsilniejszych jednostek.
|
zone.stainedMountains.description = W głębi lądu leżą góry, jeszcze nieskażone przez zarodniki.\nWydobądź obfity tytan w tym obszarze. Dowiedz się, jak z niego korzystać.\n\nObecność wroga jest tutaj większa. Nie daj im czasu na wysłanie swoich najsilniejszych jednostek.
|
||||||
zone.overgrowth.description = Obszar ten jest zarośnięty, bliżej źródła zarodników.\nWróg założył tu placówkę. Zbuduj jednostki Nóż. Zniszcz to. Odzyskaj to, co nam odebrano.
|
zone.overgrowth.description = Obszar ten jest zarośnięty, bliżej źródła zarodników.\nWróg założył tu placówkę. Zbuduj jednostki Nóż. Zniszcz to. Odzyskaj to, co nam odebrano.
|
||||||
zone.tarFields.description = Obrzeża strefy produkcji ropy, między górami a pustynią. Jeden z niewielu obszarów z rezerwami użytecznej smoły.\nMimo że ta strefa jest opuszczona, w pobliżu znajdują się niebezpieczne siły wroga. Nie lekceważ ich.\n\n[lightgray]Jeśli to możliwe, zbadaj technologię przetwarzania oleju.
|
zone.tarFields.description = Obrzeża strefy produkcji ropy, między górami a pustynią. Jeden z niewielu obszarów z rezerwami użytecznej smoły.\nMimo że ta strefa jest opuszczona, w pobliżu znajdują się niebezpieczne siły wroga. Nie lekceważ ich.\n\n[lightgray]Jeśli to możliwe, zbadaj technologię przetwarzania oleju.
|
||||||
zone.desolateRift.description = Strefa wyjątkowo niebezpieczna. Opfita w zasoby ale mało miejsca. Wysokie ryzyko zniszczenia. Opuść tę strefe jak najszybciej. Nie daj się zwieść długiemu odstępowi między atakami wroga.
|
zone.desolateRift.description = Strefa wyjątkowo niebezpieczna. Obfita w zasoby ale mało miejsca. Wysokie ryzyko zniszczenia. Opuść tę strefe jak najszybciej. Nie daj się zwieść długiemu odstępowi między atakami wroga.
|
||||||
zone.nuclearComplex.description = Dawny zakład produkcji i przetwarzania toru, zredukowny do ruin.\n[lightgray]Zbadaj tor i jego zastosowania.\n\nWróg jest tutaj obecny w dużej ilości, nieustannie poszukuje napastników.
|
zone.nuclearComplex.description = Dawny zakład produkcji i przetwarzania toru, zredukowny do ruin.\n[lightgray]Zbadaj tor i jego zastosowania.\n\nWróg jest tutaj obecny w dużej ilości, nieustannie poszukuje napastników.
|
||||||
zone.fungalPass.description = A transition area between high mountains and lower, spore-ridden lands. A small enemy reconnaissance base is located here.\nDestroy it.\nUse Dagger and Crawler units. Take out the two cores.
|
zone.fungalPass.description = Przejściowy obszar pomiędzy wysokimi górami a nisko znajdującymi się, ogarniętymi przez zarodniki równinami. Znajduje się tu mała postawiona przez wrogów baza zwiadowcza.\nZniszcz ją.\nUżyj jednostek Nóż i Pełzak. Zniszcz oba rdżenie.
|
||||||
zone.impact0078.description = <insert description here>
|
zone.impact0078.description = <insert description here>
|
||||||
zone.crags.description = <insert description here>
|
zone.crags.description = <insert description here>
|
||||||
|
|
||||||
settings.language = Język
|
settings.language = Język
|
||||||
settings.data = Game Data
|
settings.data = Dane Gry
|
||||||
settings.reset = Przywróć domyślne
|
settings.reset = Przywróć domyślne
|
||||||
settings.rebind = Zmień
|
settings.rebind = Zmień
|
||||||
settings.controls = Sterowanie
|
settings.controls = Sterowanie
|
||||||
@@ -404,14 +435,14 @@ no = Nie ma mowy!
|
|||||||
info.title = Informacje
|
info.title = Informacje
|
||||||
error.title = [crimson]Wystąpił błąd
|
error.title = [crimson]Wystąpił błąd
|
||||||
error.crashtitle = Wystąpił błąd
|
error.crashtitle = Wystąpił błąd
|
||||||
attackpvponly = [scarlet]Only available in Attack/PvP modes
|
attackpvponly = [scarlet]Dostępne tylko w trybach Atak/PvP
|
||||||
blocks.input = Wejście
|
blocks.input = Wejście
|
||||||
blocks.output = Wyjście
|
blocks.output = Wyjście
|
||||||
blocks.booster = Wzmacniacz
|
blocks.booster = Wzmacniacz
|
||||||
block.unknown = [LIGHT_GRAY]???
|
block.unknown = [LIGHT_GRAY]???
|
||||||
blocks.powercapacity = Pojemność mocy
|
blocks.powercapacity = Pojemność mocy
|
||||||
blocks.powershot = moc/strzał
|
blocks.powershot = moc/strzał
|
||||||
blocks.damage = Damage
|
blocks.damage = Obrażenia
|
||||||
blocks.targetsair = Namierzanie wrogów powietrznych
|
blocks.targetsair = Namierzanie wrogów powietrznych
|
||||||
blocks.targetsground = Namierzanie wrogów lądowych
|
blocks.targetsground = Namierzanie wrogów lądowych
|
||||||
blocks.itemsmoved = Prędkość poruszania się
|
blocks.itemsmoved = Prędkość poruszania się
|
||||||
@@ -434,22 +465,26 @@ blocks.boosteffect = Efekt wzmocnienia
|
|||||||
blocks.maxunits = Maksymalna ilość jednostek
|
blocks.maxunits = Maksymalna ilość jednostek
|
||||||
blocks.health = Zdrowie
|
blocks.health = Zdrowie
|
||||||
blocks.buildtime = Czas budowy
|
blocks.buildtime = Czas budowy
|
||||||
|
blocks.buildcost = Koszt budowy
|
||||||
blocks.inaccuracy = Niedokładność
|
blocks.inaccuracy = Niedokładność
|
||||||
blocks.shots = Strzały
|
blocks.shots = Strzały
|
||||||
blocks.reload = Strzałów/sekundę
|
blocks.reload = Strzałów/sekundę
|
||||||
blocks.ammo = Amunicja
|
blocks.ammo = Amunicja
|
||||||
bar.drilltierreq = Better Drill Required
|
|
||||||
|
bar.drilltierreq = Wymagane Lepsze Wiertło
|
||||||
bar.drillspeed = Prędkość wiertła: {0}/s
|
bar.drillspeed = Prędkość wiertła: {0}/s
|
||||||
bar.efficiency = Efektywność: {0}%
|
bar.efficiency = Efektywność: {0}%
|
||||||
bar.powerbalance = Moc: {0}
|
bar.powerbalance = Moc: {0}
|
||||||
bar.poweramount = Moc: {0}
|
bar.poweramount = Moc: {0}
|
||||||
bar.poweroutput = Wyjście mocy: {0}
|
bar.poweroutput = Wyjście mocy: {0}
|
||||||
bar.items = Przedmiotów: {0}
|
bar.items = Przedmiotów: {0}
|
||||||
|
bar.capacity = Pojemność: {0}
|
||||||
bar.liquid = Płyn
|
bar.liquid = Płyn
|
||||||
bar.heat = Ciepło
|
bar.heat = Ciepło
|
||||||
bar.power = Prąd
|
bar.power = Prąd
|
||||||
bar.progress = Postęp Budowy
|
bar.progress = Postęp Budowy
|
||||||
bar.spawned = Jednostki: {0}/{1}
|
bar.spawned = Jednostki: {0}/{1}
|
||||||
|
|
||||||
bullet.damage = [stat]{0}[lightgray] Obrażenia
|
bullet.damage = [stat]{0}[lightgray] Obrażenia
|
||||||
bullet.splashdamage = [stat]{0}[lightgray] Obrażenia obszarowe ~[stat] {1}[lightgray] kratki
|
bullet.splashdamage = [stat]{0}[lightgray] Obrażenia obszarowe ~[stat] {1}[lightgray] kratki
|
||||||
bullet.incendiary = [stat]zapalający
|
bullet.incendiary = [stat]zapalający
|
||||||
@@ -461,6 +496,7 @@ bullet.freezing = [stat]zamrażający
|
|||||||
bullet.tarred = [stat]smolny
|
bullet.tarred = [stat]smolny
|
||||||
bullet.multiplier = [stat]{0}[lightgray]x mnożnik amunicji
|
bullet.multiplier = [stat]{0}[lightgray]x mnożnik amunicji
|
||||||
bullet.reload = [stat]{0}[lightgray]x szybkość ataku
|
bullet.reload = [stat]{0}[lightgray]x szybkość ataku
|
||||||
|
|
||||||
unit.blocks = Klocki
|
unit.blocks = Klocki
|
||||||
unit.powersecond = jednostek prądu na sekundę
|
unit.powersecond = jednostek prądu na sekundę
|
||||||
unit.liquidsecond = jednostek płynów na sekundę
|
unit.liquidsecond = jednostek płynów na sekundę
|
||||||
@@ -482,17 +518,17 @@ category.shooting = Strzelanie
|
|||||||
category.optional = Dodatkowe ulepszenia
|
category.optional = Dodatkowe ulepszenia
|
||||||
setting.landscape.name = Zablokuj tryb panoramiczny
|
setting.landscape.name = Zablokuj tryb panoramiczny
|
||||||
setting.shadows.name = Cienie
|
setting.shadows.name = Cienie
|
||||||
setting.linear.name = Linear Filtering
|
setting.linear.name = Filtrowanie Liniowe
|
||||||
setting.animatedwater.name = Animowana woda
|
setting.animatedwater.name = Animowana woda
|
||||||
setting.animatedshields.name = Animowana Tarcza
|
setting.animatedshields.name = Animowana Tarcza
|
||||||
setting.antialias.name = Antialias[LIGHT_GRAY] (wymaga restartu)[]
|
setting.antialias.name = Antialias[LIGHT_GRAY] (wymaga restartu)[]
|
||||||
setting.indicators.name = Wskaźniki Przyjaciół
|
setting.indicators.name = Wskaźniki Przyjaciół
|
||||||
setting.autotarget.name = Automatyczne Celowanie
|
setting.autotarget.name = Automatyczne Celowanie
|
||||||
setting.keyboard.name = Mouse+Keyboard Controls
|
setting.keyboard.name = Sterowanie Myszka+Klawiatura
|
||||||
setting.fpscap.name = Maksymalny FPS
|
setting.fpscap.name = Maksymalny FPS
|
||||||
setting.fpscap.none = Nieograniczone
|
setting.fpscap.none = Nieograniczone
|
||||||
setting.fpscap.text = {0} FPS
|
setting.fpscap.text = {0} FPS
|
||||||
setting.uiscale.name = UI Scaling[lightgray] (require restart)[]
|
setting.uiscale.name = Skalowanie Interfejsu[lightgray] (wymaga restartu)[]
|
||||||
setting.swapdiagonal.name = Pozwala na ukośne stawianie
|
setting.swapdiagonal.name = Pozwala na ukośne stawianie
|
||||||
setting.difficulty.training = trening
|
setting.difficulty.training = trening
|
||||||
setting.difficulty.easy = Łatwy
|
setting.difficulty.easy = Łatwy
|
||||||
@@ -513,19 +549,21 @@ setting.lasers.name = Pokaż lasery zasilające
|
|||||||
setting.pixelate.name = Pikselacja [LIGHT_GRAY](wyłącza animacje)
|
setting.pixelate.name = Pikselacja [LIGHT_GRAY](wyłącza animacje)
|
||||||
setting.minimap.name = Pokaż Minimapę
|
setting.minimap.name = Pokaż Minimapę
|
||||||
setting.musicvol.name = Głośność muzyki
|
setting.musicvol.name = Głośność muzyki
|
||||||
setting.ambientvol.name = Ambient Volume
|
setting.ambientvol.name = Głośność otoczenia
|
||||||
setting.mutemusic.name = Wycisz muzykę
|
setting.mutemusic.name = Wycisz muzykę
|
||||||
setting.sfxvol.name = Głośność dźwięków
|
setting.sfxvol.name = Głośność dźwięków
|
||||||
setting.mutesound.name = Wycisz dźwięki
|
setting.mutesound.name = Wycisz dźwięki
|
||||||
setting.crashreport.name = Wysyłaj anonimowo dane o crashu gry
|
setting.crashreport.name = Wysyłaj anonimowo dane o crashu gry
|
||||||
setting.savecreate.name = Auto-Create Saves
|
setting.savecreate.name = Automatyczne tworzenie zapisu
|
||||||
|
setting.publichost.name = Widoczność gry publicznej
|
||||||
|
|
||||||
setting.chatopacity.name = Przezroczystość czatu
|
setting.chatopacity.name = Przezroczystość czatu
|
||||||
setting.playerchat.name = Wyświetlaj czat w grze
|
setting.playerchat.name = Wyświetlaj czat w grze
|
||||||
uiscale.reset = UI scale has been changed.\nPress "OK" to confirm this scale.\n[scarlet]Reverting and exiting in[accent] {0}[] settings...
|
uiscale.reset = Skala interfejsu uległa zmianie.\nNaciśnij "OK" by potwierdzić zmiany.\n[scarlet]Cofanie zmian i wyjście z gry za[accent] {0}[]
|
||||||
uiscale.cancel = Cancel & Exit
|
uiscale.cancel = Anuluj i wyjdź
|
||||||
setting.bloom.name = Bloom
|
setting.bloom.name = Bloom
|
||||||
keybind.title = Zmień
|
keybind.title = Zmień
|
||||||
keybinds.mobile = [scarlet]Most keybinds here are not functional on mobile. Only basic movement is supported.
|
keybinds.mobile = [scarlet]Większość skrótów klawiszowych nie funkcjonuje w wersji mobilnej. Tylko podstawowe poruszanie się jest wspierane.
|
||||||
category.general.name = Ogólne
|
category.general.name = Ogólne
|
||||||
category.view.name = Wyświetl
|
category.view.name = Wyświetl
|
||||||
category.multiplayer.name = Multiplayer
|
category.multiplayer.name = Multiplayer
|
||||||
@@ -541,7 +579,7 @@ keybind.move_x.name = Poruszanie w poziomie
|
|||||||
keybind.move_y.name = Poruszanie w pionie
|
keybind.move_y.name = Poruszanie w pionie
|
||||||
keybind.fullscreen.name = Toggle Fullscreen
|
keybind.fullscreen.name = Toggle Fullscreen
|
||||||
keybind.select.name = Zaznacz
|
keybind.select.name = Zaznacz
|
||||||
keybind.diagonal_placement.name = Diagonal Placement
|
keybind.diagonal_placement.name = Budowa po skosie
|
||||||
keybind.pick.name = Wybierz Blok
|
keybind.pick.name = Wybierz Blok
|
||||||
keybind.break_block.name = Zniszcz Blok
|
keybind.break_block.name = Zniszcz Blok
|
||||||
keybind.deselect.name = Odznacz
|
keybind.deselect.name = Odznacz
|
||||||
@@ -550,7 +588,7 @@ keybind.zoom_hold.name = Inicjator przybliżania
|
|||||||
keybind.zoom.name = Przybliżanie
|
keybind.zoom.name = Przybliżanie
|
||||||
keybind.menu.name = Menu
|
keybind.menu.name = Menu
|
||||||
keybind.pause.name = Pauza
|
keybind.pause.name = Pauza
|
||||||
keybind.minimap.name = Minimap
|
keybind.minimap.name = Minimapa
|
||||||
keybind.dash.name = Przyspieszenie
|
keybind.dash.name = Przyspieszenie
|
||||||
keybind.chat.name = Czat
|
keybind.chat.name = Czat
|
||||||
keybind.player_list.name = Lista graczy
|
keybind.player_list.name = Lista graczy
|
||||||
@@ -572,24 +610,25 @@ mode.pvp.description = Walcz przeciwko innym graczom.
|
|||||||
mode.attack.name = Atak
|
mode.attack.name = Atak
|
||||||
mode.attack.description = Brak fal, celem jest zniszczenie bazy przeciwnika.
|
mode.attack.description = Brak fal, celem jest zniszczenie bazy przeciwnika.
|
||||||
mode.custom = Własny tryb
|
mode.custom = Własny tryb
|
||||||
|
|
||||||
rules.infiniteresources = Nieskończone zasoby
|
rules.infiniteresources = Nieskończone zasoby
|
||||||
rules.wavetimer = Zegar fal
|
rules.wavetimer = Zegar fal
|
||||||
rules.waves = Fale
|
rules.waves = Fale
|
||||||
rules.attack = Attack Mode
|
rules.attack = Tryb Ataku
|
||||||
rules.enemyCheat = Nieskończone zasoby komputera-przeciwnika (czerwonego zespołu)
|
rules.enemyCheat = Nieskończone zasoby komputera-przeciwnika (czerwonego zespołu)
|
||||||
rules.unitdrops = Unit Drops
|
rules.unitdrops = Surowce z zniszczonych jednostek
|
||||||
rules.unitbuildspeedmultiplier = Mnożnik Prędkości Tworzenia Jednostek
|
rules.unitbuildspeedmultiplier = Mnożnik Prędkości Tworzenia Jednostek
|
||||||
rules.unithealthmultiplier = Mnożnik Życia Jednostek
|
rules.unithealthmultiplier = Mnożnik Życia Jednostek
|
||||||
rules.playerhealthmultiplier = Mnożnik Życia Gracza
|
rules.playerhealthmultiplier = Mnożnik Życia Gracza
|
||||||
rules.playerdamagemultiplier = Mnożnik Obrażeń Gracza
|
rules.playerdamagemultiplier = Mnożnik Obrażeń Gracza
|
||||||
rules.unitdamagemultiplier = Mnożnik Obrażeń Jednostek
|
rules.unitdamagemultiplier = Mnożnik Obrażeń Jednostek
|
||||||
rules.enemycorebuildradius = Enemy Core No-Build Radius:[LIGHT_GRAY] (tiles)
|
rules.enemycorebuildradius = Zasięg blokady budowy przy rdżeniu wroga:[LIGHT_GRAY] (kratki)
|
||||||
rules.respawntime = Respawn Time:[LIGHT_GRAY] (sec)
|
rules.respawntime = Czas Odrodzenia:[LIGHT_GRAY] (sek)
|
||||||
rules.wavespacing = Odstępy między falami:[LIGHT_GRAY] (sek)
|
rules.wavespacing = Odstępy między falami:[LIGHT_GRAY] (sek)
|
||||||
rules.buildcostmultiplier = Mnożnik Kosztów Budowania
|
rules.buildcostmultiplier = Mnożnik Kosztów Budowania
|
||||||
rules.buildspeedmultiplier = Mnożnik Prędkości Budowania
|
rules.buildspeedmultiplier = Mnożnik Prędkości Budowania
|
||||||
rules.waitForWaveToEnd = Fale czekają na przeciwników
|
rules.waitForWaveToEnd = Fale czekają na przeciwników
|
||||||
rules.dropzoneradius = Drop Zone Radius:[LIGHT_GRAY] (tiles)
|
rules.dropzoneradius = Zasięg strefy zrzutu:[LIGHT_GRAY] (kratki)
|
||||||
rules.respawns = Maksymalna ilośc odrodzeń na falę
|
rules.respawns = Maksymalna ilośc odrodzeń na falę
|
||||||
rules.limitedRespawns = Ogranicz Odrodzenia
|
rules.limitedRespawns = Ogranicz Odrodzenia
|
||||||
rules.title.waves = Fale
|
rules.title.waves = Fale
|
||||||
@@ -598,11 +637,12 @@ rules.title.resourcesbuilding = Zasoby i Budowanie
|
|||||||
rules.title.player = Gracze
|
rules.title.player = Gracze
|
||||||
rules.title.enemy = Przeciwnicy
|
rules.title.enemy = Przeciwnicy
|
||||||
rules.title.unit = Jednostki
|
rules.title.unit = Jednostki
|
||||||
|
|
||||||
content.item.name = Przedmioty
|
content.item.name = Przedmioty
|
||||||
content.liquid.name = Płyny
|
content.liquid.name = Płyny
|
||||||
content.unit.name = Jednostki
|
content.unit.name = Jednostki
|
||||||
content.block.name = Klocki
|
content.block.name = Klocki
|
||||||
content.mech.name = Mechs
|
content.mech.name = Mechy
|
||||||
item.copper.name = Miedź
|
item.copper.name = Miedź
|
||||||
item.lead.name = Ołów
|
item.lead.name = Ołów
|
||||||
item.coal.name = Węgiel
|
item.coal.name = Węgiel
|
||||||
@@ -637,7 +677,7 @@ mech.omega-mech.weapon = Rakiety Chmarowe
|
|||||||
mech.omega-mech.ability = Układ Obronny
|
mech.omega-mech.ability = Układ Obronny
|
||||||
mech.dart-ship.name = Strzałka
|
mech.dart-ship.name = Strzałka
|
||||||
mech.dart-ship.weapon = Karabin
|
mech.dart-ship.weapon = Karabin
|
||||||
mech.javelin-ship.name = Javelin
|
mech.javelin-ship.name = Oszczep
|
||||||
mech.javelin-ship.weapon = Seria Rakiet
|
mech.javelin-ship.weapon = Seria Rakiet
|
||||||
mech.javelin-ship.ability = Wyładowania Dopalacza
|
mech.javelin-ship.ability = Wyładowania Dopalacza
|
||||||
mech.trident-ship.name = Trójząb
|
mech.trident-ship.name = Trójząb
|
||||||
@@ -655,11 +695,12 @@ mech.itemcapacity = [LIGHT_GRAY]Pojemność przedmiotów: {0}
|
|||||||
mech.minespeed = [LIGHT_GRAY]Prędkość kopania: {0}
|
mech.minespeed = [LIGHT_GRAY]Prędkość kopania: {0}
|
||||||
mech.minepower = [LIGHT_GRAY]Moc kopania: {0}
|
mech.minepower = [LIGHT_GRAY]Moc kopania: {0}
|
||||||
mech.ability = [LIGHT_GRAY]Umiejętność: {0}
|
mech.ability = [LIGHT_GRAY]Umiejętność: {0}
|
||||||
mech.buildspeed = [LIGHT_GRAY]Building Speed: {0}%
|
mech.buildspeed = [LIGHT_GRAY]Szybkość Budowy: {0}%
|
||||||
liquid.heatcapacity = [LIGHT_GRAY]Wytrzymałość na przegrzewanie: {0}
|
liquid.heatcapacity = [LIGHT_GRAY]Wytrzymałość na przegrzewanie: {0}
|
||||||
liquid.viscosity = [LIGHT_GRAY]Lepkość: {0}
|
liquid.viscosity = [LIGHT_GRAY]Lepkość: {0}
|
||||||
liquid.temperature = [LIGHT_GRAY]Temperatura: {0}
|
liquid.temperature = [LIGHT_GRAY]Temperatura: {0}
|
||||||
block.sand-boulder.name = Sand Boulder
|
|
||||||
|
block.sand-boulder.name = Piaskowy Głaz
|
||||||
block.grass.name = Trawa
|
block.grass.name = Trawa
|
||||||
block.salt.name = Sól
|
block.salt.name = Sól
|
||||||
block.saltrocks.name = Skały Solne
|
block.saltrocks.name = Skały Solne
|
||||||
@@ -670,7 +711,7 @@ block.spore-pine.name = Sosna Zarodkowa
|
|||||||
block.sporerocks.name = Skała z Zarodkami
|
block.sporerocks.name = Skała z Zarodkami
|
||||||
block.rock.name = Skały
|
block.rock.name = Skały
|
||||||
block.snowrock.name = Skały śnieżne
|
block.snowrock.name = Skały śnieżne
|
||||||
block.snow-pine.name = Snow Pine
|
block.snow-pine.name = Sosna śniegowa
|
||||||
block.shale.name = Łupek
|
block.shale.name = Łupek
|
||||||
block.shale-boulder.name = Głaz Łupkowy
|
block.shale-boulder.name = Głaz Łupkowy
|
||||||
block.moss.name = Mech
|
block.moss.name = Mech
|
||||||
@@ -703,13 +744,13 @@ block.snow.name = Śnieg
|
|||||||
block.craters.name = Kratery
|
block.craters.name = Kratery
|
||||||
block.sand-water.name = Woda z Piaskiem
|
block.sand-water.name = Woda z Piaskiem
|
||||||
block.darksand-water.name = Woda z Ciemnym Piaskiem
|
block.darksand-water.name = Woda z Ciemnym Piaskiem
|
||||||
block.char.name = Char
|
block.char.name = Popiół
|
||||||
block.holostone.name = Holo stone
|
block.holostone.name = Błyszczący kamień
|
||||||
block.ice-snow.name = Lodowy Śnieg
|
block.ice-snow.name = Lodowy Śnieg
|
||||||
block.rocks.name = Skały
|
block.rocks.name = Skały
|
||||||
block.icerocks.name = Lodowe skały
|
block.icerocks.name = Lodowe skały
|
||||||
block.snowrocks.name = Śnieżne Skały
|
block.snowrocks.name = Śnieżne Skały
|
||||||
block.dunerocks.name = Dune Rocks
|
block.dunerocks.name = Skały wydmowe
|
||||||
block.pine.name = Sosna
|
block.pine.name = Sosna
|
||||||
block.white-tree-dead.name = Białe Drzewo Martwe
|
block.white-tree-dead.name = Białe Drzewo Martwe
|
||||||
block.white-tree.name = Białe Drzewo
|
block.white-tree.name = Białe Drzewo
|
||||||
@@ -728,7 +769,7 @@ block.dark-panel-6.name = Ciemny Panel 6
|
|||||||
block.dark-metal.name = Ciemny Metal
|
block.dark-metal.name = Ciemny Metal
|
||||||
block.ignarock.name = Skała Wulkaniczna
|
block.ignarock.name = Skała Wulkaniczna
|
||||||
block.hotrock.name = Gorący Kamień
|
block.hotrock.name = Gorący Kamień
|
||||||
block.magmarock.name = Magma Rock
|
block.magmarock.name = Skała magmowa
|
||||||
block.cliffs.name = Klify
|
block.cliffs.name = Klify
|
||||||
block.copper-wall.name = Miedziana Ściana
|
block.copper-wall.name = Miedziana Ściana
|
||||||
block.copper-wall-large.name = Duża miedziana ściana
|
block.copper-wall-large.name = Duża miedziana ściana
|
||||||
@@ -743,7 +784,7 @@ block.door-large.name = Duże drzwi
|
|||||||
block.duo.name = Podwójne działko
|
block.duo.name = Podwójne działko
|
||||||
block.scorch.name = Płomień
|
block.scorch.name = Płomień
|
||||||
block.scatter.name = Flak
|
block.scatter.name = Flak
|
||||||
block.hail.name = Hail
|
block.hail.name = Grad
|
||||||
block.lancer.name = Lancer
|
block.lancer.name = Lancer
|
||||||
block.conveyor.name = Przenośnik
|
block.conveyor.name = Przenośnik
|
||||||
block.titanium-conveyor.name = Tytanowy przenośnik
|
block.titanium-conveyor.name = Tytanowy przenośnik
|
||||||
@@ -760,7 +801,7 @@ block.melter.name = Przetapiacz
|
|||||||
block.incinerator.name = Spalacz
|
block.incinerator.name = Spalacz
|
||||||
block.spore-press.name = Prasa Zarodni
|
block.spore-press.name = Prasa Zarodni
|
||||||
block.separator.name = Rozdzielacz
|
block.separator.name = Rozdzielacz
|
||||||
block.coal-centrifuge.name = Coal Centrifuge
|
block.coal-centrifuge.name = Wirówka węglowa
|
||||||
block.power-node.name = Węzeł Prądu
|
block.power-node.name = Węzeł Prądu
|
||||||
block.power-node-large.name = Duży Węzeł Prądu
|
block.power-node-large.name = Duży Węzeł Prądu
|
||||||
block.surge-tower.name = Wieża Energetyczna
|
block.surge-tower.name = Wieża Energetyczna
|
||||||
@@ -791,7 +832,7 @@ block.power-void.name = Próżnia prądu
|
|||||||
block.power-source.name = Nieskończony Prąd
|
block.power-source.name = Nieskończony Prąd
|
||||||
block.unloader.name = Ekstraktor
|
block.unloader.name = Ekstraktor
|
||||||
block.vault.name = Magazyn
|
block.vault.name = Magazyn
|
||||||
block.wave.name = Wave
|
block.wave.name = Strumyk
|
||||||
block.swarmer.name = Działo Rojowe
|
block.swarmer.name = Działo Rojowe
|
||||||
block.salvo.name = Działo Salwowe
|
block.salvo.name = Działo Salwowe
|
||||||
block.ripple.name = Działo falowe
|
block.ripple.name = Działo falowe
|
||||||
@@ -812,7 +853,7 @@ block.ghoul-factory.name = Fabryka Bombowców Upiór
|
|||||||
block.dagger-factory.name = Fabryka Mechów Nóż
|
block.dagger-factory.name = Fabryka Mechów Nóż
|
||||||
block.crawler-factory.name = Fabryka Mechów Pełzacz
|
block.crawler-factory.name = Fabryka Mechów Pełzacz
|
||||||
block.titan-factory.name = Fabryka Mechów Tytan
|
block.titan-factory.name = Fabryka Mechów Tytan
|
||||||
block.fortress-factory.name = Fabryka Mechów Fortreca
|
block.fortress-factory.name = Fabryka Mechów Forteca
|
||||||
block.revenant-factory.name = Fabryka Wojowników Zjawa
|
block.revenant-factory.name = Fabryka Wojowników Zjawa
|
||||||
block.repair-point.name = Punkt Napraw
|
block.repair-point.name = Punkt Napraw
|
||||||
block.pulse-conduit.name = Rura Pulsacyjna
|
block.pulse-conduit.name = Rura Pulsacyjna
|
||||||
@@ -846,8 +887,8 @@ block.launch-pad.name = Wyrzutnia
|
|||||||
block.launch-pad-large.name = Duża Wyrzutnia
|
block.launch-pad-large.name = Duża Wyrzutnia
|
||||||
team.blue.name = niebieski
|
team.blue.name = niebieski
|
||||||
team.crux.name = czerwony
|
team.crux.name = czerwony
|
||||||
team.sharded.name = pomarańczowy
|
team.sharded.name = żółty
|
||||||
team.orange.name = orange
|
team.orange.name = pomarańczowy
|
||||||
team.derelict.name = szary
|
team.derelict.name = szary
|
||||||
team.green.name = zielony
|
team.green.name = zielony
|
||||||
team.purple.name = fioletowy
|
team.purple.name = fioletowy
|
||||||
@@ -868,32 +909,32 @@ unit.lich.name = Obudzony
|
|||||||
unit.reaper.name = Żeniec
|
unit.reaper.name = Żeniec
|
||||||
tutorial.next = [lightgray]<Kliknij, aby kontynuować>
|
tutorial.next = [lightgray]<Kliknij, aby kontynuować>
|
||||||
tutorial.intro = Wszedłeś do[scarlet] Samouczka Mindustry.[]\nZacznij od[accent] wydobycia miedzi[]. Aby to zrobić, dotknij żyły rudy miedzi w pobliżu rdzenia.\n\n[accent]{0}/{1} miedź
|
tutorial.intro = Wszedłeś do[scarlet] Samouczka Mindustry.[]\nZacznij od[accent] wydobycia miedzi[]. Aby to zrobić, dotknij żyły rudy miedzi w pobliżu rdzenia.\n\n[accent]{0}/{1} miedź
|
||||||
tutorial.drill = Wydobywanie ręczne jest nieefektywne.\n[accent]Wiertła []mogą kopać automatycznie.\nKliknij zakładkę wiertła w prawym dolnym rogu.\nWybierz[accent] wiertło mechaniczne[]. Umieść go na złożu miedzi, klikając.\n[accent]Kliknij prawym przyciskiem myszy[], aby przestać budować.
|
tutorial.drill = Wydobywanie ręczne nie jest efektywne.\n[accent]Wiertła []mogą kopać automatycznie.\nKliknij zakładkę wiertła w prawym dolnym rogu.\nWybierz[accent] wiertło mechaniczne[]. Umieść go na złożu miedzi, klikając.\n[accent]Kliknij prawym przyciskiem myszy[], aby przestać budować.
|
||||||
tutorial.drill.mobile = Mining manually is inefficient.\n[accent]Drills []can mine automatically.\nTap the drill tab in the bottom right.\nSelect the[accent] mechanical drill[].\nPlace it on a copper vein by tapping, then press the[accent] checkmark[] below to confirm your selection.\nPress the[accent] X button[] to cancel placement.
|
tutorial.drill.mobile = Wydobywanie ręczne jest nieefektywne.\n[accent]Wiertła []mogą kopać automatycznie.\nDotknij zakładkę wiertła w prawym dolnym rogu.\nWybierz[accent] wiertło mechaniczne[].\nUmieść go na złożu miedzi poprzez Stuknięcie, potem wciśnij[accent] ptaszek[] na dole by potwierdzić wybór.\nNaciśnij przycisk[accent] X[] by anulować budowe.
|
||||||
tutorial.blockinfo = Each block has different stats. Each drill can only mine certain ores.\nTo check a block's info and stats,[accent] tap the "?" button while selecting it in the build menu.[]\n\n[accent]Access the Mechanical Drill's stats now.[]
|
tutorial.blockinfo = Każdy blok ma inne statystyki. Każde wiertło może kopać tylko wybrane rudy.\nBy sprawdzić informacje i statystyki bloku,[accent] kliknij przycisk "?" podczas jego wyboru w menu budowy.[]\n\n[accent]Sprawdź teraz statystyki mechanicznego wiertła.[]
|
||||||
tutorial.conveyor = [accent]Conveyors[] are used to transport items to the core.\nMake a line of conveyors from the drill to the core.\n[accent]Hold down the mouse to place in a line.[]\nHold[accent] CTRL[] while selecting a line to place diagonally.\n\n[accent]{0}/{1} conveyors placed in line\n[accent]0/1 items delivered
|
tutorial.conveyor = [accent]Przenośnik[] jest używany do transportowania przedmiotów do rdzenia.\nStwórz linie przenośników z wierteł do rdzenia.\n[accent]Przytrzymaj przycisk myszy by położyć w linii.[]\nPrzytrzymaj[accent] CTRL[] podczas wybierania linii, by budować po skosie.\n\n[accent]{0}/{1} Przenośniki położone w linii\n[accent]0/1 Przedmioty dostarczone
|
||||||
tutorial.conveyor.mobile = [accent]Conveyors[] are used to transport items to the core.\nMake a line of conveyors from the drill to the core.\n[accent] Place in a line by holding down your finger for a few seconds[] and dragging in a direction.\n\n[accent]{0}/{1} conveyors placed in line\n[accent]0/1 items delivered
|
tutorial.conveyor.mobile = [accent]Przenośnik[] jest używany do transportowania przedmiotów do rdzenia.\nStwórz linie przenośników z wierteł do rdzenia.\n[accent] Zbuduj w linii poprzez przytrzymanie palcem przez moment[] i przesunięcie w którymś kierunku.\n\n[accent]{0}/{1} Przenośniki położone w linii\n[accent]0/1 Przedmioty dostarczone
|
||||||
tutorial.turret = Once an item enters your core, it can be used for building.\nKeep in mind that not all items can be used for building.\nItems that are not used for building, such as[accent] coal[] or[accent] scrap[], cannot be put into the core.\nDefensive structures must be built to repel the[lightgray] enemy[].\nBuild a[accent] duo turret[] near your base.
|
tutorial.turret = Kiedy przedmiot dociera do rdzenia, może zostać użyty do budowy.\nPamiętaj że nie każdy przedmiot może zostać użyty do budowy.\nprzedmioty które nie są używane do budowy, takie jak[accent] Węgiel[] lub[accent] złom[], nie moga zostać wprowadzone do rdzenia.\nStruktury obronne muszą zostać zbudowane by odeprzeć[lightgray] wroga[].\nZbuduj[accent] podwójne działko[] niedaleko swojej bazy.
|
||||||
tutorial.drillturret = Duo turrets require[accent] copper ammo []to shoot.\nPlace a drill near the turret.\nLead conveyors into the turret to supply it with copper.\n\n[accent]Ammo delivered: 0/1
|
tutorial.drillturret = Podwójne działka wymagają[accent] miedzianej amunicji []do strzelania.\nPołóż wiertło obok działka.\nPoprowadź przenośniki do działek by zaopatrzyć je w miedź.\n\n[accent]Amunicja dostarczona: 0/1
|
||||||
tutorial.pause = During battle, you are able to[accent] pause the game.[]\nYou may queue buildings while paused.\n\n[accent]Press space to pause.
|
tutorial.pause = Podczas gry, możesz[accent] zatrzymać grę.[]\nMożesz ustalić kolejkę budowy podczas pauzy.\n\n[accent]Naciśnij spacje by zapauzować.
|
||||||
tutorial.pause.mobile = During battle, you are able to[accent] pause the game.[]\nYou may queue buildings while paused.\n\n[accent]Press this button in the top left to pause.
|
tutorial.pause.mobile = Podczas gry, możesz[accent] zatrzymać grę.[]\nMożesz ustalić kolejkę budowy podczas pauzy.\n\n[accent]Nacniśnij przycisk w lewym górnym rogu by zapauzować.
|
||||||
tutorial.unpause = Now press space again to unpause.
|
tutorial.unpause = Teraz znowu naciśnij spacje by odpauzować.
|
||||||
tutorial.unpause.mobile = Now press it again to unpause.
|
tutorial.unpause.mobile = Naciśnij go znowu by odpauzować.
|
||||||
tutorial.breaking = Blocks frequently need to be destroyed.\n[accent]Hold down right-click[] to destroy all blocks in a selection.[]\n\n[accent]Destroy all the scrap blocks to the left of your core using area selection.
|
tutorial.breaking = Bloki często wymagają rozbiórki.\n[accent]Przytrzymaj prawy przcisk myszy[] by niszczyć wszystkie wybrane bloki.[]\n\n[accent]Zniszcz wszystkie bloki złomu na lewo od twojego rdzenia używając selekcji obszarowej.
|
||||||
tutorial.breaking.mobile = Blocks frequently need to be destroyed.\n[accent]Select deconstruction mode[], then tap a block to begin breaking it.\nDestroy an area by holding down your finger for a few seconds[] and dragging in a direction.\nPress the checkmark button to confirm breaking.\n\n[accent]Destroy all the scrap blocks to the left of your core using area selection.
|
tutorial.breaking.mobile = Bloki często wymagają rozbiórki.\n[accent]Wybierz tryb dekonstrukcji[], a następnie dotknij blok by zacząć go niszczyć.\nZdekonstruuj obszarowo poprzez przytrzymanie palcem przez moment[] i przesunięcie go w jakimś kierunku.\nNaciśnij przycisk ptaszka by potwierdzić rozbiórkę.\n\n[accent]Zniszcz wszystkie bloki złomu na lewo od twojego rdzenia używając selekcji obszarowej.
|
||||||
tutorial.withdraw = In some situations, taking items directly from blocks is necessary.\nTo do this, [accent]tap a block[] with items in it, then [accent]tap the item[] in the inventory.\nMultiple items can be withdrawn by [accent]tapping and holding[].\n\n[accent]Withdraw some copper from the core.[]
|
tutorial.withdraw = Czasami, konieczne jest wyjmowanie przedmiotów prosto z bloków.\nBy tego dokonać, [accent]kliknij blok[] z przedmiotami w nim, potem [accent]kliknij przedmiot[] w inwentarzu.\nMożesz zebrać wiele przedmiotów naraz poprzez [accent]kliknięcie i przytrzymanie[].\n\n[accent]Zabierz trochę miedzi z rdzenia.[]
|
||||||
tutorial.deposit = Deposit items into blocks by dragging from your ship to the destination block.\n\n[accent]Deposit your copper back into the core.[]
|
tutorial.deposit = Włóż przedmioty do bloków poprzez przeciągnięcie z twojego statku do danego bloku.\n\n[accent]Włóż miedź z powrotem do rdzenia .[]
|
||||||
tutorial.waves = The[lightgray] enemy[] approaches.\n\nDefend the core for 2 waves.[accent] Click[] to shoot.\nBuild more turrets and drills. Mine more copper.
|
tutorial.waves = [lightgray] Wrogowie[] nadchodzą.\n\nBroń swój rdżeń przez 2 fale.[accent] Kliknij[] by strzelać.\nZbuduj wiecej działek i wierteł. Wydobądź więcej miedzi.
|
||||||
tutorial.waves.mobile = The[lightgray] enemy[] approaches.\n\nDefend the core for 2 waves. Your ship will automatically fire at enemies.\nBuild more turrets and drills. Mine more copper.
|
tutorial.waves.mobile = [lightgray] Wrogowie[] nadchodzą.\n\nBroń swój rdzeń przez 2 fale. Twój statek będzie automatycznie atakował wrogów.\nZbuduj wiecej działek i wierteł. Wydobądź więcej miedzi.
|
||||||
tutorial.launch = Once you reach a specific wave, you are able to[accent] launch the core[], leaving your defenses behind and[accent] obtaining all the resources in your core.[]\nThese resources can then be used to research new technology.\n\n[accent]Press the launch button.
|
tutorial.launch = Kiedy dotrzesz do określonej fali, masz możliwość[accent] wystrzelenia rdzenia[], pozostawiając struktury obronne za sobą i[accent] otrzymując wszystkie surowce znajdujące się w rdzeniu.[]\nSurowce te mogą potem zostać użyte do odkrywania nowych technologii.\n\n[accent]Naciśnij przycisk Wystrzału.
|
||||||
item.copper.description = Przydatny materiał budowlany. Szeroko używany w prawie każdej konstrukcji.
|
item.copper.description = Przydatny materiał budowlany. Szeroko używany w prawie każdej konstrukcji.
|
||||||
item.lead.description = Podstawowy matriał. Używany w przesyle przemiotów i płynów. Nie jest on przypadkiem szkodliwy?
|
item.lead.description = Podstawowy matriał. Używany w przesyle przemiotów i płynów. Nie jest on przypadkiem szkodliwy?
|
||||||
item.metaglass.description = Niesamowite silne szkło. Szeroko używane w transporcie i przechowywaniu płynów.
|
item.metaglass.description = Wyjątkowo wytrzymały stop szkła. Szeroko używany w transporcie i przechowywaniu płynów.
|
||||||
item.graphite.description = Zmineralizowany węgiel, wykorzystywany do amunicji i izolacji elektrycznej.
|
item.graphite.description = Zmineralizowany węgiel, wykorzystywany do amunicji i izolacji elektrycznej.
|
||||||
item.sand.description = Zwykły materiał używany pospolicie w przepalaniu, stopach i jako topnik. Dostanie piaskiem po oczach nie jest przyjemne.
|
item.sand.description = Zwykły materiał używany pospolicie w przepalaniu, stopach i jako topnik. Dostanie piaskiem po oczach nie jest przyjemne.
|
||||||
item.coal.description = Zwykły i łatwo dostępny materiał energetyczny.
|
item.coal.description = Zwykły i łatwo dostępny materiał energetyczny.
|
||||||
item.titanium.description = Rzadki i bardzo lekki materiał. Używany w bardzo zaawansowanym przewodnictwie, wiertłach i samolotach. Poczuj się jak Tytan!
|
item.titanium.description = Rzadki i bardzo lekki materiał. Używany w bardzo zaawansowanym przewodnictwie, wiertłach i samolotach. Poczuj się jak Tytan!
|
||||||
item.thorium.description = Zwarty i radioaktywny materiał używany w struktucrach i paliwie nuklearnym. Nie trzymaj go w rękach!
|
item.thorium.description = Zwarty i radioaktywny materiał używany w strukturach i paliwie nuklearnym. Nie trzymaj go w rękach!
|
||||||
item.scrap.description = Pozostałości starych budynków i jednostek. Składa się z małej ilości wszystkiego.
|
item.scrap.description = Pozostałości starych budynków i jednostek. Składa się z małej ilości wszystkiego.
|
||||||
item.silicon.description = Niesamowicie przydatny półprzewodnk uźywany w panelach słonecznych i skomplikowanej elektronice. Nie, w Dolinie Krzemowej już nie ma krzemu.
|
item.silicon.description = Niesamowicie przydatny półprzewodnk uźywany w panelach słonecznych i skomplikowanej elektronice. Nie, w Dolinie Krzemowej już nie ma krzemu.
|
||||||
item.plastanium.description = Lekki i plastyczny materiał używany w amunicji odłamkowej i samolotach. Używany też w klockach LEGO (dlatego są niezniszczalne)!
|
item.plastanium.description = Lekki i plastyczny materiał używany w amunicji odłamkowej i samolotach. Używany też w klockach LEGO (dlatego są niezniszczalne)!
|
||||||
@@ -903,12 +944,12 @@ item.spore-pod.description = Używany do wyrobu oleju, materiałów wybuchowych
|
|||||||
item.blast-compound.description = Lotny związek używany w pirotechnice. Może być używany jako materiał energetyczny, ale nie polecam, ale i tak warto spróbować.
|
item.blast-compound.description = Lotny związek używany w pirotechnice. Może być używany jako materiał energetyczny, ale nie polecam, ale i tak warto spróbować.
|
||||||
item.pyratite.description = Niesamowicie palny związek używany w zbrojeniu. Nielegalny w 9 państwach.
|
item.pyratite.description = Niesamowicie palny związek używany w zbrojeniu. Nielegalny w 9 państwach.
|
||||||
liquid.water.description = Powszechnie używana do schładzania budowli i przetwarzania odpadów.
|
liquid.water.description = Powszechnie używana do schładzania budowli i przetwarzania odpadów.
|
||||||
liquid.slag.description = Various different types of molten metal mixed together. Can be separated into its constituent minerals, or sprayed at enemy units as a weapon.
|
liquid.slag.description = Wiele różnych metali stopionych i zmieszanych razem. Może zostać rozdzielony na jego metale składowe, albo wystrzelony w wrogie jednostki i użyty jako broń.
|
||||||
liquid.oil.description = Może się palić, eksplodować lub być używana do schładzania.
|
liquid.oil.description = Używany w do produkcji złożonych materiałów. Może zostać przetworzony na węgiel, lub wystrzelony w wrogów przez wieżyczke.
|
||||||
liquid.cryofluid.description = Najefektywniejsza ciecz do schładzania budowli.
|
liquid.cryofluid.description = Najefektywniejsza ciecz do schładzania budowli.
|
||||||
mech.alpha-mech.description = Standardowy mech. Średnia broń i prędkość, leć potrafi stworzyć trzy małe drony do walki.
|
mech.alpha-mech.description = Standardowy mech. Średnia broń i prędkość, leć potrafi stworzyć trzy małe drony do walki.
|
||||||
mech.delta-mech.description = Szybki i wrażliwy mech stworzony do szybkih ataków i ucieczki. Budynką robi prawie nic, lec jest wstanie szybko rozwalić grupę wrogich jednostek piorunami.
|
mech.delta-mech.description = Szybki i wrażliwy mech stworzony do szybkich ataków i ucieczki. Zadaje niewielkie obrażenia strukturom, lecz może bardzo szybko niszczyć spore grupy jednostek wroga przy pomocy jego działek tesli.
|
||||||
mech.tau-mech.description = Mech pomocny. Naprawia budynki drużyny, strzelając w nie. Potrafi wygasić niedalekie pożary i uleczyć bliskich przyjaciół.
|
mech.tau-mech.description = Mech wsparcia. Naprawia budynki drużyny, strzelając w nie. Potrafi wygasić niedalekie pożary i uleczyć bliskich przyjaciół.
|
||||||
mech.omega-mech.description = Duży i silny mech, zaprojektowany na ataki. Jego zdolność pozwala mu na zablokowanie do 90% obrażeń.
|
mech.omega-mech.description = Duży i silny mech, zaprojektowany na ataki. Jego zdolność pozwala mu na zablokowanie do 90% obrażeń.
|
||||||
mech.dart-ship.description = Standardowy statek. Lekki i szybki, ale jest kiepski jak chodzi o walkę i kopanie.
|
mech.dart-ship.description = Standardowy statek. Lekki i szybki, ale jest kiepski jak chodzi o walkę i kopanie.
|
||||||
mech.javelin-ship.description = Statek do ataku i szybkiej ucieczki. Zaczyna powoli, ale przyspiesza do wielkiej prędkości. Przy tej prędkości, może przelecieć koło wrogiej bazy i atakować piorunami czy rakietami.
|
mech.javelin-ship.description = Statek do ataku i szybkiej ucieczki. Zaczyna powoli, ale przyspiesza do wielkiej prędkości. Przy tej prędkości, może przelecieć koło wrogiej bazy i atakować piorunami czy rakietami.
|
||||||
@@ -921,12 +962,12 @@ unit.dagger.description = Podstawowy mech lądowy. Sam jest słaby, lecz przydat
|
|||||||
unit.crawler.description = Jednostka naziemna składająca się z rozebranej ramy z przypiętymi na górze materiałami wybuchowymi. Niezbyt trwały. Wybucha przy kontakcie z wrogami. Chodzi na czterech nogach jak pies.
|
unit.crawler.description = Jednostka naziemna składająca się z rozebranej ramy z przypiętymi na górze materiałami wybuchowymi. Niezbyt trwały. Wybucha przy kontakcie z wrogami. Chodzi na czterech nogach jak pies.
|
||||||
unit.titan.description = Zaawansowana, opancerzona jednostka naziemna. Atakuje zarówno cele naziemne, jak i powietrzne. Wyposażony w dwa miniaturowe miotacze ognia typu Płomień.
|
unit.titan.description = Zaawansowana, opancerzona jednostka naziemna. Atakuje zarówno cele naziemne, jak i powietrzne. Wyposażony w dwa miniaturowe miotacze ognia typu Płomień.
|
||||||
unit.fortress.description = Ciężki mech artyleryjski. Wyposażony w dwa zmodyfikowane działa typu gradowego do ataku na dalekie odległości na konstrukcje i jednostki wroga.
|
unit.fortress.description = Ciężki mech artyleryjski. Wyposażony w dwa zmodyfikowane działa typu gradowego do ataku na dalekie odległości na konstrukcje i jednostki wroga.
|
||||||
unit.eruptor.description = A heavy mech designed to take down structures. Fires a stream of slag at enemy fortifications, melting them and setting volatiles on fire.
|
unit.eruptor.description = Ciężki mech stworzony do niszczenia struktur. Strzela wiązką żużlu w kierunku fortyfikacji wroga, Topiąc je oraz podpalając łatwopalne przedmioty.
|
||||||
unit.wraith.description = Szybka jednostka, stosuje taktyke uderz-uciekaj Namierza jakiekolwiek źródło prądu.
|
unit.wraith.description = Szybka jednostka, stosuje taktyke uderz-uciekaj Namierza jakiekolwiek źródło prądu.
|
||||||
unit.ghoul.description = Ciężki bombowiec dywanowy. Rozdziera struktury wroga, atakując krytyczną infrastrukturę.
|
unit.ghoul.description = Ciężki bombowiec dywanowy. Rozdziera struktury wroga, atakując krytyczną infrastrukturę.
|
||||||
unit.revenant.description = Ciężka, unosząca sie platforma z rakietami.
|
unit.revenant.description = Ciężka, unosząca sie platforma z rakietami.
|
||||||
block.graphite-press.description = Kompresuje kawałki węgla w czyste blaszki grafitu.
|
block.graphite-press.description = Kompresuje kawałki węgla w czyste blaszki grafitu.
|
||||||
block.multi-press.description = An upgraded version of the graphite press. Employs water and power to process coal quickly and efficiently.
|
block.multi-press.description = Ulepszona wersja prasy grafitowej. Używa wody i prądu do kompresowania węgla szybko i efektywnie.
|
||||||
block.silicon-smelter.description = Redukuje piasek za pomocą wysoce czystego węgla w celu wytworzenia krzemu.
|
block.silicon-smelter.description = Redukuje piasek za pomocą wysoce czystego węgla w celu wytworzenia krzemu.
|
||||||
block.kiln.description = Stapia ołów i piasek na metaszkło. Wymaga małej ilości energii.
|
block.kiln.description = Stapia ołów i piasek na metaszkło. Wymaga małej ilości energii.
|
||||||
block.plastanium-compressor.description = Wytwarza plastan z oleju i tytanu.
|
block.plastanium-compressor.description = Wytwarza plastan z oleju i tytanu.
|
||||||
@@ -934,9 +975,9 @@ block.phase-weaver.description = Produkuje Włókna Fazowe z radioaktywnego toru
|
|||||||
block.alloy-smelter.description = Produkuje stop Elektrum z tytanu, ołowiu, krzemu i miedzi.
|
block.alloy-smelter.description = Produkuje stop Elektrum z tytanu, ołowiu, krzemu i miedzi.
|
||||||
block.cryofluidmixer.description = Łączy wodę i tytan w lodociecz, który jest znacznie bardziej wydajny w chłodzeniu niż woda.
|
block.cryofluidmixer.description = Łączy wodę i tytan w lodociecz, który jest znacznie bardziej wydajny w chłodzeniu niż woda.
|
||||||
block.blast-mixer.description = Kruszy i miesza skupiska zarodników z piratytem, tworząc związek wybuchowy.
|
block.blast-mixer.description = Kruszy i miesza skupiska zarodników z piratytem, tworząc związek wybuchowy.
|
||||||
block.pyratite-mixer.description = Mixes coal, lead and sand into highly flammable pyratite.
|
block.pyratite-mixer.description = Miesza węgiel, ołów i piasek tworząc bardzo łatwopalny piratian.
|
||||||
block.melter.description = Przetapia złom na żużel do dalszego przetwarzania lub użycia w wieżyczkach
|
block.melter.description = Przetapia złom na żużel do dalszego przetwarzania lub użycia w wieżyczkach
|
||||||
block.separator.description = Oddziel użyteczne materiały z mieszaniny jaką jest żużel.
|
block.separator.description = Oddziela użyteczne materiały z mieszaniny jaką jest żużel.
|
||||||
block.spore-press.description = Kompresuje kapsułki zarodników w olej.
|
block.spore-press.description = Kompresuje kapsułki zarodników w olej.
|
||||||
block.pulverizer.description = Mieli złom w drobny piasek. Przydatne, gdy brakuje naturalnego piasku.
|
block.pulverizer.description = Mieli złom w drobny piasek. Przydatne, gdy brakuje naturalnego piasku.
|
||||||
block.coal-centrifuge.description = Zestala olej w kawałki węgla.
|
block.coal-centrifuge.description = Zestala olej w kawałki węgla.
|
||||||
@@ -958,21 +999,21 @@ block.surge-wall.description = Najsilniejszy blok obronny.\nMa niewielką szans
|
|||||||
block.surge-wall-large.description = Najsilniejszy blok obronny.\nMa niewielką szansę na wywołanie błyskawicy w kierunku atakującego.\nObejmuje wiele kratek.
|
block.surge-wall-large.description = Najsilniejszy blok obronny.\nMa niewielką szansę na wywołanie błyskawicy w kierunku atakującego.\nObejmuje wiele kratek.
|
||||||
block.door.description = Małe drzwi, które można otwierać i zamykać, klikając na nie.\nJeśli są otwarte, wrogowie mogą strzelać i się przemieszczać przez nie.
|
block.door.description = Małe drzwi, które można otwierać i zamykać, klikając na nie.\nJeśli są otwarte, wrogowie mogą strzelać i się przemieszczać przez nie.
|
||||||
block.door-large.description = Duże drzwi, które można otwierać i zamykać, klikając na nie.\nJeśli są otwarte, wrogowie mogą strzelać i się przemieszczać przez nie.\nObejmuje wiele kratek.
|
block.door-large.description = Duże drzwi, które można otwierać i zamykać, klikając na nie.\nJeśli są otwarte, wrogowie mogą strzelać i się przemieszczać przez nie.\nObejmuje wiele kratek.
|
||||||
block.mender.description = Periodically repairs blocks in its vicinity. Keeps defenses repaired in-between waves.\nOptionally uses silicon to boost range and efficiency.
|
block.mender.description = Co jakiś czas naprawia bloki w zasięgu. Utrzymuje struktury obronne w dobrym stanie.\nOpcjonalnie używa silikonu do zwiększenia zasięgu i szybkości naprawy.
|
||||||
block.mend-projector.description = Periodically heals blocks in its vicinity.
|
block.mend-projector.description = Co jakiś czas naprawia bloki w zasięgu. Lepsza wersja naprawiacza.
|
||||||
block.overdrive-projector.description = Increases the speed of nearby buildings like drills and conveyors.
|
block.overdrive-projector.description = Zwiększa szybkość budynków w zasięgu takich jak wiertła czy przenośniki.
|
||||||
block.force-projector.description = Creates a hexagonal force field around itself, protecting buildings and units inside from damage through bullets.
|
block.force-projector.description = Wytwarza pole siłowe w kształcie sześciokąta wokół siebie, chroniąc budynki i jednostki wewnątrz od obrażeń zadanych przez pociski.
|
||||||
block.shock-mine.description = Damages enemies stepping on the mine. Nearly invisible to the enemy.
|
block.shock-mine.description = Zadaje obrażenia jednostkom wroga którzy na nią wejdą. Ledwo widoczne dla wrogów.
|
||||||
block.conveyor.description = Basic item transport block. Moves items forward and automatically deposits them into turrets or crafters. Rotatable.
|
block.conveyor.description = Podstawowy blok transportowy dla przedmiotów. Automatycznie przesyła przedmioty naprzód do działek oraz maszyn. Można obrócić.
|
||||||
block.titanium-conveyor.description = Advanced item transport block. Moves items faster than standard conveyors.
|
block.titanium-conveyor.description = Zaawansowany blok transportowy dla przedmiotów. Przesyła przedmioty szybciej od zwykłego przenośnika.
|
||||||
block.junction.description = Acts as a bridge for two crossing conveyor belts. Useful in situations with two different conveyors carrying different materials to different locations.
|
block.junction.description = Używany jako most dla dwóch krzyżujących się przenośników. Przydatne w sytuacjach kiedy dwa różne przenośniki transportują różne surowce do różnych miejsc.
|
||||||
block.bridge-conveyor.description = Zaawansowany blok transportujący. Pozwala na przenoszenie przedmiotów nawet do 3 bloków na każdym terenie, przez każdy budynek.
|
block.bridge-conveyor.description = Zaawansowany blok transportujący. Pozwala na przenoszenie przedmiotów nawet do 3 bloków na każdym terenie, przez każdy budynek.
|
||||||
block.phase-conveyor.description = Advanced item transport block. Uses power to teleport items to a connected phase conveyor over several tiles.
|
block.phase-conveyor.description = Zaawansowany blok transportowy dla przedmiotów. Używa energii przy teleportacji przedmiotów do podłączonego transportera fazowego na spore odległości.
|
||||||
block.sorter.description = Sortuje przedmioty. Jeśli przedmiot pasuje to przechodzi dalej, jeśli nie - to przechodzi na boki.
|
block.sorter.description = Sortuje przedmioty. Jeśli przedmiot pasuje to przechodzi dalej, jeśli nie - to przechodzi na boki.
|
||||||
block.router.description = Akceptuje przedmioty z jednego miejsca i rozdziela je do trzech innych kierunków. Przydatne w rozdzielaniu materiałów z jednego źródła do wielu celów.
|
block.router.description = Akceptuje przedmioty z jednego miejsca i rozdziela je do trzech innych kierunków. Przydatne w rozdzielaniu materiałów z jednego źródła do wielu celów.
|
||||||
block.distributor.description = Zaawansowany rozdzielacz, rozdzielający przedmioty do 7 innych kierunków.
|
block.distributor.description = Zaawansowany rozdzielacz, rozdzielający przedmioty do 7 innych kierunków.
|
||||||
block.overflow-gate.description = Rozdzielacz, który przerzuca przedmioty, kiedy główna droga jest przepełniona
|
block.overflow-gate.description = Rozdzielacz, który przerzuca przedmioty, kiedy główna droga jest przepełniona
|
||||||
block.mass-driver.description = Ultimate item transport block. Collects several items and then shoots them to another mass driver over a long range.
|
block.mass-driver.description = Najlepszy blok do transportu przedmiotów. Zbiera wiele przedmiotów naraz a potem wystrzeliwuje je do kolejnej katapulty masy na bardzo duże odległości.
|
||||||
block.mechanical-pump.description = Tania pompa o niskiej przepustowości. Nie wymaga prądu.
|
block.mechanical-pump.description = Tania pompa o niskiej przepustowości. Nie wymaga prądu.
|
||||||
block.rotary-pump.description = Zaawansowana pompa, dwukrotnie większa przepustowość od mechanicznej pompy. Wymaga prądu.
|
block.rotary-pump.description = Zaawansowana pompa, dwukrotnie większa przepustowość od mechanicznej pompy. Wymaga prądu.
|
||||||
block.thermal-pump.description = Najlepsza pompa. Trzy razy szybsza od mechanicznej pompy i jedyna, która może wypompować lawę.
|
block.thermal-pump.description = Najlepsza pompa. Trzy razy szybsza od mechanicznej pompy i jedyna, która może wypompować lawę.
|
||||||
@@ -984,41 +1025,41 @@ block.liquid-junction.description = Działa jak most dla dwóch krzyżujących s
|
|||||||
block.bridge-conduit.description = Zaawansowany blok przenoszący ciecze. Pozwala na przenoszenie cieczy nawet do 3 bloków na każdym terenie, przez każdy budynek.
|
block.bridge-conduit.description = Zaawansowany blok przenoszący ciecze. Pozwala na przenoszenie cieczy nawet do 3 bloków na każdym terenie, przez każdy budynek.
|
||||||
block.phase-conduit.description = Zaawansowany blok do przenoszenia cieczy. Używa prądu, aby przenieść ciecz do połączonego transportera fazowego przez kilka bloków.
|
block.phase-conduit.description = Zaawansowany blok do przenoszenia cieczy. Używa prądu, aby przenieść ciecz do połączonego transportera fazowego przez kilka bloków.
|
||||||
block.power-node.description = Przesyła moc do połączonych węzłów. Można podłączyć do czterech źródeł zasilania, zlewów lub węzłów. Zasila też bloki które go dotykają.
|
block.power-node.description = Przesyła moc do połączonych węzłów. Można podłączyć do czterech źródeł zasilania, zlewów lub węzłów. Zasila też bloki które go dotykają.
|
||||||
block.power-node-large.description = Has a larger radius than the power node and connects to up to six power sources, sinks or nodes.
|
block.power-node-large.description = Posiada większy zasięg niż zwykły węzeł prądu. Można podłączyć do sześciu źródeł zasilania, zlewów lub węzłów.
|
||||||
block.surge-tower.description = An extremely long-range power node with fewer available connections.
|
block.surge-tower.description = Węzęł prądu z bardzo dużym zasięgiem, posiadający mniej możliwych podłączeń.
|
||||||
block.battery.description = Stores power whenever there is an abundance and provides power whenever there is a shortage, as long as there is capacity left.
|
block.battery.description = Przechowuje energię przy nadwyżce produkcji oraz dostarcza energię kiedy jest jej brak, dopóki jest w niej miejsce.
|
||||||
block.battery-large.description = Stores much more power than a regular battery.
|
block.battery-large.description = Przechowuje o wiele wiecej prądu niż standardowa bateria.
|
||||||
block.combustion-generator.description = Wytwarza energię poprzez spalanie łatwopalnych materiałów.
|
block.combustion-generator.description = Wytwarza energię poprzez spalanie łatwopalnych materiałów.
|
||||||
block.thermal-generator.description = Generates power when placed in hot locations.
|
block.thermal-generator.description = Generuje prąd kiedy jest postawiony na źródłach ciepła.
|
||||||
block.turbine-generator.description = Bardziej wydajny niż generator spalania, ale wymaga dodatkowej wody.
|
block.turbine-generator.description = Bardziej wydajny niż generator spalania, ale wymaga dodatkowej wody.
|
||||||
block.differential-generator.description = Generates large amounts of energy. Utilizes the temperature difference between cryofluid and burning pyratite.
|
block.differential-generator.description = Generuje duże ilości prądu. Wykorzystuje różnice temperatur pomiędzy Lodocieczą a spalanym Piratianem.
|
||||||
block.rtg-generator.description = A radioisotope thermoelectric generator which does not require cooling but provides less power than a thorium reactor.
|
block.rtg-generator.description = Termoelektryczny generator wykorzystujący izotopy promieniotwórcze. Nie wymaga chłodzenia, ale produkuje mniej energii od reaktora torowego.
|
||||||
block.solar-panel.description = Provides a small amount of power from the sun.
|
block.solar-panel.description = Wytwarza małe ilości prądu wykorzystując energię słoneczną.
|
||||||
block.solar-panel-large.description = Provides much better power supply than a standard solar panel, but is also much more expensive to build.
|
block.solar-panel-large.description = Wytwarza o wiele więcej prądu niż zwykły panel słoneczny, ale jest o wiele droższy w budowie.
|
||||||
block.thorium-reactor.description = Generates huge amounts of power from highly radioactive thorium. Requires constant cooling. Will explode violently if insufficient amounts of coolant are supplied. Power output depends on fullness, with base power generated at full capacity.
|
block.thorium-reactor.description = Produkuje bardzo duże ilości prądu z wysoce radioaktywnego toru. Wymaga ciągłego chłodzenia. Silnie eksploduje jeśli nie zostanie dostarczona wystarczająca ilość chłodziwa. Produkcja energii zależy od zapełnienia, produkując bazową ilość energii przy całkowitym zapełnieniu.
|
||||||
block.impact-reactor.description = An advanced generator, capable of creating massive amounts of power at peak efficiency. Requires a significant power input to kickstart the process.
|
block.impact-reactor.description = Zaawansowany generator, zdolny do produkcji ogromnych ilości prądu u szczytu swoich możliwości. Wymaga znacznych ilości energii do rozpoczęcia procesu.
|
||||||
block.mechanical-drill.description = Tanie wiertło. Kiedy położnone na odpowiednich polach, wysyła przedmioty w wolnym tempie.
|
block.mechanical-drill.description = Tanie wiertło. Kiedy położnone na odpowiednich polach, wysyła przedmioty w wolnym tempie.
|
||||||
block.pneumatic-drill.description = An improved drill which is faster and able to process harder materials by making use of air pressure.
|
block.pneumatic-drill.description = Ulepszone wiertło, które jest szybsze i może wykopywać twardsze surowce przy użyciu ciśnienia.
|
||||||
block.laser-drill.description = Allows drilling even faster through laser technology, but requires power. Additionally, radioactive thorium can be retrieved with this drill.
|
block.laser-drill.description = Pozwala kopać jeszcze szybciej poprzez technologię laserową, ale wymaga energii. Dodatkowo, radioaktywny tor może zostać wydobyty przez to wiertło.
|
||||||
block.blast-drill.description = The ultimate drill. Requires large amounts of power.
|
block.blast-drill.description = Najlepsze wiertło. Wymaga dużych ilości energii.
|
||||||
block.water-extractor.description = Wydobywa wodę z ziemi. Użyj go, gdy w pobliżu nie ma jeziora.
|
block.water-extractor.description = Wydobywa wodę z ziemi. Użyj go, gdy w pobliżu nie ma jeziora.
|
||||||
block.cultivator.description = Uprawia małe skupiska zarodników w gotowe do użytku kapsułki.
|
block.cultivator.description = Uprawia małe skupiska zarodników w gotowe do użytku kapsułki.
|
||||||
block.oil-extractor.description = Uses large amounts of power in order to extract oil from sand. Use it when there is no direct source of oil nearby.
|
block.oil-extractor.description = Używa bardzo dużych ilości energii do ekstrakcji ropy z piasku. Używaj go w sytuacji kiedy nie ma bezpośredniego źródła ropy w okolicy.
|
||||||
block.core-shard.description = The first iteration of the core capsule. Once destroyed, all contact to the region is lost. Do not let this happen.
|
block.core-shard.description = Pierwsza wersja rdzenia. Gdy zostaje zniszczony, wszelki kontakt do regionu zostaje utracony. Nie pozwól na to.
|
||||||
block.core-foundation.description = The second version of the core. Better armored. Stores more resources.
|
block.core-foundation.description = Druga wersja rdzenia. Lepiej opancerzony. Przechowuje więcej surowców.
|
||||||
block.core-nucleus.description = The third and final iteration of the core capsule. Extremely well armored. Stores massive amounts of resources.
|
block.core-nucleus.description = Trzecia i ostatnia wersja rdzenia. Bardzo dobrze opanczerzony. Przechowuje ogromne ilości surowców.
|
||||||
block.vault.description = Stores a large amount of items of each type. An[LIGHT_GRAY] unloader[] can be used to retrieve items from the vault.
|
block.vault.description = Przechowuje duże ilości przedmiotów każdego rodzaju. [LIGHT_GRAY] Ekstraktor[] może zostać użyty do rozładowania magazynu.
|
||||||
block.container.description = Stores a small amount of items of each type. An[LIGHT_GRAY] unloader[] can be used to retrieve items from the container.
|
block.container.description = Przechowuje małe ilości przedmiotów każdego rodzaju. [LIGHT_GRAY] ekstraktor[] może zostać użyty do rozładowania kontenera.
|
||||||
block.unloader.description = Unloads items from a container, vault or core onto a conveyor or directly into an adjacent block. The type of item to be unloaded can be changed by tapping on the unloader.
|
block.unloader.description = Wyciąga przedmioty z kontenera, magazynu oraz rdżenia na przenośniki lub bezpośrednio na przyległe bloki. Typ przedmiotu jaki zostanie wyciągniety może zostać zmieniony poprzez kliknięcie.
|
||||||
block.launch-pad.description = Launches batches of items without any need for a core launch. Unfinished.
|
block.launch-pad.description = Wysyła pakiety przedmiotów bez potrzeby wystrzeliwania rdżenia. Niedokończona.
|
||||||
block.launch-pad-large.description = An improved version of the launch pad. Stores more items. Launches more frequently.
|
block.launch-pad-large.description = Ulepszona wersja wyrzutni. Magazynuje więcej przedmiotów. Wysyła częściej.
|
||||||
block.duo.description = Mała, tania wieża. Przydatny przeciwko jednostkom naziemnym.
|
block.duo.description = Mała, tania wieża. Przydatna przeciwko jednostkom naziemnym.
|
||||||
block.scatter.description = Średniej wielkości wieża przeciwlotnicza. Rozsiewa śruty z ołowiu lub strzępy złomu na jednostki wroga.
|
block.scatter.description = Średniej wielkości wieża przeciwlotnicza. Rozsiewa śruty z ołowiu lub strzępy złomu na jednostki wroga.
|
||||||
block.scorch.description = Spala wszystkich wrogów naziemnych w pobliżu. Bardzo skuteczny z bliskiej odległości.
|
block.scorch.description = Spala wszystkich wrogów naziemnych w pobliżu. Bardzo skuteczny z bliskiej odległości.
|
||||||
block.hail.description = Mała wieża artyleryjska, bardzo przydatna, atakuje tylko jednostki naziemne.
|
block.hail.description = Mała wieża artyleryjska, bardzo przydatna, atakuje tylko jednostki naziemne.
|
||||||
block.wave.description = Średniej wielkości szybkostrzelna wieżyczka, która wystrzeliwuje płynne bąbelki. Gasi ogień jeżeli jest w niej woda lub lodociecz
|
block.wave.description = Średniej wielkości szybkostrzelna wieżyczka, która wystrzeliwuje płynne bąbelki. Gasi ogień jeżeli jest w niej woda lub lodociecz
|
||||||
block.lancer.description = Średniej wielkości wieżyczka, która strzela naładowanymi wiązkami elektryczności.
|
block.lancer.description = Średniej wielkości wieżyczka, która strzela naładowanymi wiązkami elektryczności.
|
||||||
block.arc.description = Mała wieża bliskiego zasięgu, która wystrzeliwuje elektryczność losowym łukiem w kierunku wroga.
|
block.arc.description = Mała wieża bliskiego zasięgu, która wystrzeliwuje wiązki tesli losowym łukiem w kierunku wroga.
|
||||||
block.swarmer.description = Średniej wielkości wieżyczka, która strzela rakietami wybuchowymi.
|
block.swarmer.description = Średniej wielkości wieżyczka, która strzela rakietami wybuchowymi.
|
||||||
block.salvo.description = Średniej wielkości wieża strzelająca salwami.
|
block.salvo.description = Średniej wielkości wieża strzelająca salwami.
|
||||||
block.fuse.description = Duża wieża, która strzela potężnymi wiązkami krótkiego zasięgu.
|
block.fuse.description = Duża wieża, która strzela potężnymi wiązkami krótkiego zasięgu.
|
||||||
@@ -1029,19 +1070,19 @@ block.meltdown.description = Duża wieża, która strzela potężnymi wiązkami
|
|||||||
block.command-center.description = Wydaje polecenia ruchu sojuszniczym jednostkom na całej mapie.\nPowoduje patrolowanie jednostek, atakowanie wrogiego rdzenia lub wycofanie się do rdzenia / fabryki. Gdy nie ma rdzenia wroga, jednostki będą domyślnie patrolować pod dowództwem ataku.
|
block.command-center.description = Wydaje polecenia ruchu sojuszniczym jednostkom na całej mapie.\nPowoduje patrolowanie jednostek, atakowanie wrogiego rdzenia lub wycofanie się do rdzenia / fabryki. Gdy nie ma rdzenia wroga, jednostki będą domyślnie patrolować pod dowództwem ataku.
|
||||||
block.draug-factory.description = Produkuje drony wydobywcze Draug.
|
block.draug-factory.description = Produkuje drony wydobywcze Draug.
|
||||||
block.spirit-factory.description = Produkuje lekkie drony, które naprawiają bloki.
|
block.spirit-factory.description = Produkuje lekkie drony, które naprawiają bloki.
|
||||||
block.phantom-factory.description = Produkuje zaawansowane drony które pomgają przy budowie.
|
block.phantom-factory.description = Produkuje zaawansowane drony które pomagają przy budowie.
|
||||||
block.wraith-factory.description = Produces fast, hit-and-run interceptor units.
|
block.wraith-factory.description = Produkuje szybkie jednostki powietrzne typu "uderz-uciekaj".
|
||||||
block.ghoul-factory.description = Produces heavy carpet bombers.
|
block.ghoul-factory.description = Produkuje ciężkie bombowce dywanowe.
|
||||||
block.revenant-factory.description = Produces heavy laser air units.
|
block.revenant-factory.description = Produkuje ciężkie jednostki powietrzne z wyrzutniami rakiet.
|
||||||
block.dagger-factory.description = Produces basic ground units.
|
block.dagger-factory.description = Produkuje podstawowe jednostki lądowe.
|
||||||
block.crawler-factory.description = Produces fast self-destructing swarm units.
|
block.crawler-factory.description = Produkuje szybkie jednostki lądowe typu "kamikaze".
|
||||||
block.titan-factory.description = Produces advanced, armored ground units.
|
block.titan-factory.description = Produkuje zaawansowane, opancerzone jednostki lądowe.
|
||||||
block.fortress-factory.description = Produces heavy artillery ground units.
|
block.fortress-factory.description = Produkuje naziemne jednostki ciężkiej artylerii.
|
||||||
block.repair-point.description = Bez przerw ulecza najbliższą zniszczoną jednostkę w jego zasięgu.
|
block.repair-point.description = Bez przerw ulecza najbliższą zniszczoną jednostkę w jego zasięgu.
|
||||||
block.dart-mech-pad.description = Provides transformation into a basic attack mech.\nUse by tapping while standing on it.
|
block.dart-mech-pad.description = Umożliwia transformacje w podstawowego mecha bojowego.\nUżyj klikając podczas stania na nim.
|
||||||
block.delta-mech-pad.description = Leave your current vessel and change into a fast, lightly-armored mech made for hit-and-run attacks.\nUse the pad by double tapping while standing on it.
|
block.delta-mech-pad.description = Opuść swój obecny statek i zamień go na szybki, lekko opancerzony mech stworzony do ataków typu uderz-uciekaj.\nUżyj, klikając dwukrotnie podczas stania na lądowisku.
|
||||||
block.tau-mech-pad.description = Leave your current vessel and change into a support mech which can heal friendly buildings and units.\nUse the pad by double tapping while standing on it.
|
block.tau-mech-pad.description = Opuść swój obecny statek i zamień go na mech wsparcia który może leczyć sojusznicze struktury i jednostki.\nUżyj, klikając dwukrotnie podczas stania na lądowisku.
|
||||||
block.omega-mech-pad.description = Leave your current vessel and change into a bulky and well-armored mech, made for front-line assaults.\nUse the pad by double tapping while standing on it.
|
block.omega-mech-pad.description = Opuść swój obecny statek i zamień go na masywny, dobrze opancerzony mech, przeznaczony do ataków na froncie.\nUżyj, klikając dwukrotnie podczas stania na lądowisku.
|
||||||
block.javelin-ship-pad.description = Leave your current vessel and change into a strong and fast interceptor with lightning weapons.\nUse the pad by double tapping while standing on it.
|
block.javelin-ship-pad.description = Opuść swój obecny statek i zamień go na silny i szybki statek przechwytujący z bronią błyskawicową.\nUżyj, klikając dwukrotnie podczas stania na lądowisku.
|
||||||
block.trident-ship-pad.description = Leave your current vessel and change into a reasonably well armored heavy bomber.\nUse the pad by double tapping while standing on it.
|
block.trident-ship-pad.description = Opuść swój obecny statek i zamień go na dość dobrze opancerzony ciężki bombowiec.\nUżyj, klikając dwukrotnie podczas stania na lądowisku.
|
||||||
block.glaive-ship-pad.description = Leave your current vessel and change into a large, well-armored gunship.\nUse the pad by double tapping while standing on it.
|
block.glaive-ship-pad.description = Opuść swój obecny statek i zamień go na duży, mocno opancerzony statek bojowy.\nUżyj, klikając dwukrotnie podczas stania na lądowisku.
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
credits.text = Создатель [ROYAL]Anuken[] — [SKY]anukendev@gmail.com[]\n\nЕсть недоработки в переводе или хотите найти союзников для совместной игры?\nПишите в оф. discord-сервер Mindustry в канал #русский.\n\nПереводчики на русский язык:\n[YELLOW]Prosta4ok_ua\n[BLACK]XZimur\n[BLUE]Beryllium\nРедактор:\n[SLATE]Felix Corvus
|
credits.text = Создатель [ROYAL]Anuken[] — [SKY]anukendev@gmail.com[]\n\nЕсть недоработки в переводе или хотите найти союзников для совместной игры?\nПишите в оф. [accent]discord-сервер Mindustry[] в канал [accent]#русский[].\n\nРедакторы и переводчики на русский язык:\n[blue]Prosta4ok_ua[green]#[yellow]6336\n[darkgray]XZ[gray]imur\n[#30FF30]Beryllium\n[tan]Felix [slate]Corvus
|
||||||
credits = Авторы
|
credits = Авторы
|
||||||
contributors = Переводчики и помощники
|
contributors = Переводчики и помощники
|
||||||
discord = Присоединяйтесь к нашему Discord!
|
discord = Присоединяйтесь к нашему Discord!
|
||||||
@@ -16,11 +16,13 @@ screenshot.invalid = Карта слишком большая, возможно,
|
|||||||
gameover = Игра окончена
|
gameover = Игра окончена
|
||||||
gameover.pvp = [accent] {0}[] команда победила!
|
gameover.pvp = [accent] {0}[] команда победила!
|
||||||
highscore = [accent]Новый рекорд!
|
highscore = [accent]Новый рекорд!
|
||||||
|
|
||||||
load.sound = Звуки
|
load.sound = Звуки
|
||||||
load.map = Карт
|
load.map = Карты
|
||||||
load.image = Изображения
|
load.image = Изображения
|
||||||
load.content = Содержание
|
load.content = Содержимое
|
||||||
load.system = Система
|
load.system = Система
|
||||||
|
|
||||||
stat.wave = Волн отражено:[accent] {0}
|
stat.wave = Волн отражено:[accent] {0}
|
||||||
stat.enemiesDestroyed = Врагов уничтожено:[accent] {0}
|
stat.enemiesDestroyed = Врагов уничтожено:[accent] {0}
|
||||||
stat.built = Строений построено:[accent] {0}
|
stat.built = Строений построено:[accent] {0}
|
||||||
@@ -28,7 +30,8 @@ stat.destroyed = Строений уничтожено:[accent] {0}
|
|||||||
stat.deconstructed = Строений деконструировано:[accent] {0}
|
stat.deconstructed = Строений деконструировано:[accent] {0}
|
||||||
stat.delivered = Ресурсов запущено:
|
stat.delivered = Ресурсов запущено:
|
||||||
stat.rank = Финальный счёт: [accent]{0}
|
stat.rank = Финальный счёт: [accent]{0}
|
||||||
launcheditems = [accent]Запущенные Предметы
|
|
||||||
|
launcheditems = [accent]Запущенные предметы
|
||||||
map.delete = Вы действительно хотите удалить карту «[accent]{0}[]»?
|
map.delete = Вы действительно хотите удалить карту «[accent]{0}[]»?
|
||||||
level.highscore = Рекорд: [accent]{0}
|
level.highscore = Рекорд: [accent]{0}
|
||||||
level.select = Выбор карты
|
level.select = Выбор карты
|
||||||
@@ -49,8 +52,17 @@ close = Закрыть
|
|||||||
website = Веб-сайт
|
website = Веб-сайт
|
||||||
quit = Выход
|
quit = Выход
|
||||||
maps = Карты
|
maps = Карты
|
||||||
|
maps.browse = Просмотр карт
|
||||||
continue = Продолжить
|
continue = Продолжить
|
||||||
maps.none = [lightgray]Карты не найдены!
|
maps.none = [lightgray]Карты не найдены!
|
||||||
|
invalid = Недопустимый
|
||||||
|
preparingconfig = Подготовка конфигурации
|
||||||
|
preparingcontent = Подготовка содержимого
|
||||||
|
uploadingcontent = Выгрузка содержимого
|
||||||
|
uploadingpreviewfile = Выгрузка файла предпросмотра
|
||||||
|
committingchanges = Внесение изменений
|
||||||
|
done = Готово
|
||||||
|
|
||||||
about.button = Об игре
|
about.button = Об игре
|
||||||
name = Имя:
|
name = Имя:
|
||||||
noname = Для начала, придумайте[accent] себе имя[].
|
noname = Для начала, придумайте[accent] себе имя[].
|
||||||
@@ -65,27 +77,30 @@ players = Игроков на сервере: {0}
|
|||||||
players.single = {0} игрок на сервере
|
players.single = {0} игрок на сервере
|
||||||
server.closing = [accent]Закрытие сервера…
|
server.closing = [accent]Закрытие сервера…
|
||||||
server.kicked.kick = Вас выгнали с сервера!
|
server.kicked.kick = Вас выгнали с сервера!
|
||||||
|
server.kicked.whitelist = Вы не в белом списке сервера.
|
||||||
server.kicked.serverClose = Сервер закрыт.
|
server.kicked.serverClose = Сервер закрыт.
|
||||||
server.kicked.vote = You have been vote-kicked. Goodbye.
|
server.kicked.vote = Вы были выгнаны с помощью голосования. Прощайте.
|
||||||
server.kicked.clientOutdated = Устаревший клиент! Обновите игру!
|
server.kicked.clientOutdated = Устаревший клиент! Обновите игру!
|
||||||
server.kicked.serverOutdated = Устаревший сервер! Попросите администратора сервера обновить сервер/игру!
|
server.kicked.serverOutdated = Устаревший сервер! Попросите администратора сервера обновить сервер/игру!
|
||||||
server.kicked.banned = Вы заблокированы на этом сервере.
|
server.kicked.banned = Вы заблокированы на этом сервере.
|
||||||
server.kicked.typeMismatch = This server is not compatible with your build type.
|
server.kicked.typeMismatch = Этот сервер не совместим с вашим типом сборки.
|
||||||
server.kicked.recentKick = Вы недавно были кикнуты.\nПодождите немного перед следующим подключением.
|
server.kicked.playerLimit = Этот сервер заполнен. Дождитесь свободного слота.
|
||||||
|
server.kicked.recentKick = Вас недавно выгнали.\nПодождите немного перед следующим подключением.
|
||||||
server.kicked.nameInUse = На этом сервере есть кто-то с этим именем.
|
server.kicked.nameInUse = На этом сервере есть кто-то с этим именем.
|
||||||
server.kicked.nameEmpty = Ваше имя должно содержать хотя бы один символ или цифру.
|
server.kicked.nameEmpty = Ваше имя должно содержать хотя бы один символ или цифру.
|
||||||
server.kicked.idInUse = Вы уже на этом сервере! Соединение с двумя учетными записями не разрешено.
|
server.kicked.idInUse = Вы уже на этом сервере! Соединение с двумя учетными записями не разрешено.
|
||||||
server.kicked.customClient = Этот сервер не поддерживает пользовательские сборки. Загрузите официальную версию.
|
server.kicked.customClient = Этот сервер не поддерживает пользовательские сборки. Загрузите официальную версию.
|
||||||
server.kicked.gameover = Игра окончена!
|
server.kicked.gameover = Игра окончена!
|
||||||
server.versions = Ваша версия:[accent] {0}[]\nВерсия сервера:[accent] {1}[]
|
server.versions = Ваша версия:[accent] {0}[]\nВерсия сервера:[accent] {1}[]
|
||||||
host.info = Кнопка [accent]Сервер[] запускает сервер на порте [accent]6567[]. \nЛюбой пользователь в той же [lightgray]локальной сети или WiFi[] должен увидеть ваш сервер в своём списке серверов.\n\nЕсли Вы хотите, чтобы люди могли подключаться откуда угодно по IP, то требуется [accent]переадресация (проброс) портов[].\n\n[lightgray]Примечание: Если у кого-то возникают проблемы с подключением к вашей игре по локальной сети, убедитесь, что Вы разрешили доступ Mindustry к вашей локальной сети в настройках брандмауэра. Обратите внимание, что публичные сети иногда не позволяют обнаружение сервера.
|
host.info = Кнопка [accent]Сервер[] запускает сервер на порте [accent]6567[]. \nЛюбой пользователь в той же [lightgray]локальной сети или WiFi[] должен увидеть ваш сервер в своём списке серверов.\n\nЕсли Вы хотите, чтобы люди могли подключаться откуда угодно по IP, то требуется [accent]переадресация (проброс) портов[] и наличие [red]ВНЕШНЕГО[] WAN адреса (WAN адрес [red]НЕ должен[] начинаться с [red]10[][lightgray].x.x.x[], [red]100.64[][lightgray].x.x[], [red]172.16[][lightgray].x.x[], [red]192.168[][lightgray].x.x[], [red]127[][lightgray].x.x.x[])!\nКлиентам мобильных операторов нужно уточнять информацию в личном кабинете на сайте вашего оператора!\n\n[lightgray]Примечание: Если у кого-то возникают проблемы с подключением к вашей игре по локальной сети, убедитесь, что Вы разрешили доступ Mindustry к вашей локальной сети в настройках брандмауэра. Обратите внимание, что публичные сети иногда не позволяют обнаружение сервера.
|
||||||
join.info = Здесь Вы можете ввести [accent]IP-адрес сервера[] для подключения или открыть [accent]локальную сеть[] для подключения к другим серверам.\nПоддерживаются оба многопользовательских режима: LAN и WAN.\n\n[lightgray]Примечание: это НЕ автоматический глобальный список серверов; если Вы хотите подключиться к кому-то по IP, вам нужно спросить у хоста его IP-адрес.
|
join.info = Здесь Вы можете ввести [accent]IP-адрес сервера[] для подключения или открыть [accent]локальную сеть[] для подключения к другим серверам.\nПоддерживаются оба многопользовательских режима: LAN и WAN.\n\n[lightgray]Примечание: это НЕ автоматический глобальный список серверов; если Вы хотите подключиться к кому-то по IP, вам нужно спросить у хоста его IP-адрес.
|
||||||
hostserver = Запустить многопользовательский cервер
|
hostserver = Запустить многопользовательский сервер
|
||||||
hostserver.mobile = Запустить\ncервер
|
hostserver.mobile = Запустить\nсервер
|
||||||
host = Сервер
|
host = Сервер
|
||||||
hosting = [accent]Открытие сервера…
|
hosting = [accent]Открытие сервера…
|
||||||
hosts.refresh = Обновить
|
hosts.refresh = Обновить
|
||||||
hosts.discovering = Поиск локальных игр
|
hosts.discovering = Поиск локальных игр
|
||||||
|
hosts.discovering.any = Поиск игр
|
||||||
server.refreshing = Обновление сервера
|
server.refreshing = Обновление сервера
|
||||||
hosts.none = [lightgray]Локальных игр не обнаружено!
|
hosts.none = [lightgray]Локальных игр не обнаружено!
|
||||||
host.invalid = [scarlet]Не удаётся подключиться к хосту.
|
host.invalid = [scarlet]Не удаётся подключиться к хосту.
|
||||||
@@ -115,6 +130,9 @@ confirmunadmin = Вы действительно хотите убрать эт
|
|||||||
joingame.title = Присоединиться к игре
|
joingame.title = Присоединиться к игре
|
||||||
joingame.ip = IP:
|
joingame.ip = IP:
|
||||||
disconnect = Отключено.
|
disconnect = Отключено.
|
||||||
|
disconnect.error = Ошибка соединения.
|
||||||
|
disconnect.closed = Соединение закрыто.
|
||||||
|
disconnect.timeout = Время истекло.
|
||||||
disconnect.data = Ошибка при загрузке данных мира!
|
disconnect.data = Ошибка при загрузке данных мира!
|
||||||
connecting = [accent]Подключение…
|
connecting = [accent]Подключение…
|
||||||
connecting.data = [accent]Загрузка данных мира…
|
connecting.data = [accent]Загрузка данных мира…
|
||||||
@@ -161,11 +179,11 @@ cancel = Отмена
|
|||||||
openlink = Открыть ссылку
|
openlink = Открыть ссылку
|
||||||
copylink = Скопировать ссылку
|
copylink = Скопировать ссылку
|
||||||
back = Назад
|
back = Назад
|
||||||
data.export = Export Data
|
data.export = Экспортировать данные
|
||||||
data.import = Import Data
|
data.import = Импортировать данные
|
||||||
data.exported = Data exported.
|
data.exported = Данные экспортированы.
|
||||||
data.invalid = This isn't valid game data.
|
data.invalid = Эти игровые данные являются недействительными
|
||||||
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.
|
data.import.confirm = Импорт внешних данных сотрёт[scarlet] все[] ваши игровые данные.\n[accent]Это не может быть отменено![]\n\nКак только данные импортированы, ваша игра немедленно закроется.
|
||||||
classic.export = Экспортировать данные с классической версии?
|
classic.export = Экспортировать данные с классической версии?
|
||||||
classic.export.text = [accent]Mindustry[] получил глобальное обновление.\nБыло обнаружено Классическое (версия 3.5 сборка 40) сохранение или карта. Вы хотите экспортировать эти сохранения в домашнюю папку вашего телефона, для использования в приложении Mindustry Classic?
|
classic.export.text = [accent]Mindustry[] получил глобальное обновление.\nБыло обнаружено Классическое (версия 3.5 сборка 40) сохранение или карта. Вы хотите экспортировать эти сохранения в домашнюю папку вашего телефона, для использования в приложении Mindustry Classic?
|
||||||
quit.confirm = Вы уверены, что хотите выйти?
|
quit.confirm = Вы уверены, что хотите выйти?
|
||||||
@@ -190,6 +208,9 @@ map.nospawn = Эта карта не имеет ни одного ядра, в
|
|||||||
map.nospawn.pvp = У этой карты нет вражеских ядер, в которых игрок может появиться! Добавьте[SCARLET] не оранжевое[] ядро на эту карту в редакторе.
|
map.nospawn.pvp = У этой карты нет вражеских ядер, в которых игрок может появиться! Добавьте[SCARLET] не оранжевое[] ядро на эту карту в редакторе.
|
||||||
map.nospawn.attack = У этой карты нет вражеских ядер для атаки игроком! Добавьте[SCARLET] красное[] ядро на эту карту в редакторе.
|
map.nospawn.attack = У этой карты нет вражеских ядер для атаки игроком! Добавьте[SCARLET] красное[] ядро на эту карту в редакторе.
|
||||||
map.invalid = Ошибка загрузки карты: повреждённый или недопустимый файл карты.
|
map.invalid = Ошибка загрузки карты: повреждённый или недопустимый файл карты.
|
||||||
|
map.publish.error = Ошибка при публикации карты: {0}
|
||||||
|
map.publish = Карта опубликована.
|
||||||
|
map.publishing = [accent]Отправка карты…
|
||||||
editor.brush = Кисть
|
editor.brush = Кисть
|
||||||
editor.openin = Открыть в редакторе
|
editor.openin = Открыть в редакторе
|
||||||
editor.oregen = Генерация руд
|
editor.oregen = Генерация руд
|
||||||
@@ -201,7 +222,9 @@ editor.waves = Волны:
|
|||||||
editor.rules = Правила:
|
editor.rules = Правила:
|
||||||
editor.generation = Генерация:
|
editor.generation = Генерация:
|
||||||
editor.ingame = Редактировать в игре
|
editor.ingame = Редактировать в игре
|
||||||
|
editor.publish.workshop = Опубликовать в Steam Workshop
|
||||||
editor.newmap = Новая карта
|
editor.newmap = Новая карта
|
||||||
|
workshop = Workshop
|
||||||
waves.title = Волны
|
waves.title = Волны
|
||||||
waves.remove = Удалить
|
waves.remove = Удалить
|
||||||
waves.never = <никогда>
|
waves.never = <никогда>
|
||||||
@@ -211,13 +234,14 @@ waves.perspawn = за появление
|
|||||||
waves.to = к
|
waves.to = к
|
||||||
waves.boss = Босс
|
waves.boss = Босс
|
||||||
waves.preview = Предварительный просмотр
|
waves.preview = Предварительный просмотр
|
||||||
waves.edit = Редактировать …
|
waves.edit = Редактировать…
|
||||||
waves.copy = Копировать в буфер обмена
|
waves.copy = Копировать в буфер обмена
|
||||||
waves.load = Загрузить из буфера обмена
|
waves.load = Загрузить из буфера обмена
|
||||||
waves.invalid = Неверные волны в буфере обмена.
|
waves.invalid = Неверные волны в буфере обмена.
|
||||||
waves.copied = Волны скопированы.
|
waves.copied = Волны скопированы.
|
||||||
waves.none = Враги не были определены.\nОбратите внимание, что пустые волны будут автоматически заменены обычной волной.
|
waves.none = Враги не были определены.\nОбратите внимание, что пустые волны будут автоматически заменены обычной волной.
|
||||||
editor.default = [lightgray]<По умолчанию>
|
editor.default = [lightgray]<По умолчанию>
|
||||||
|
details = Подробная информация…
|
||||||
edit = Редактировать…
|
edit = Редактировать…
|
||||||
editor.name = Название:
|
editor.name = Название:
|
||||||
editor.spawn = Создать боевую единицу
|
editor.spawn = Создать боевую единицу
|
||||||
@@ -227,6 +251,7 @@ editor.errorload = Ошибка загрузки файла:\n[accent]{0}
|
|||||||
editor.errorsave = Ошибка сохранения файла:\n[accent]{0}
|
editor.errorsave = Ошибка сохранения файла:\n[accent]{0}
|
||||||
editor.errorimage = Это изображение, а не карта. Не нужно менять расширение, ожидая, что это сработает.\n\nЕсли Вы хотите импортировать устаревшую карту, то используйте кнопку «Импортировать устаревшее изображение» в редакторе.
|
editor.errorimage = Это изображение, а не карта. Не нужно менять расширение, ожидая, что это сработает.\n\nЕсли Вы хотите импортировать устаревшую карту, то используйте кнопку «Импортировать устаревшее изображение» в редакторе.
|
||||||
editor.errorlegacy = Эта карта слишком старая и использует устаревший формат карты, который больше не поддерживается.
|
editor.errorlegacy = Эта карта слишком старая и использует устаревший формат карты, который больше не поддерживается.
|
||||||
|
editor.errornot = Это не файл карты.
|
||||||
editor.errorheader = Этот файл карты недействителен или повреждён.
|
editor.errorheader = Этот файл карты недействителен или повреждён.
|
||||||
editor.errorname = Карта не имеет имени. Может быть, Вы пытаетесь загрузить сохранение?
|
editor.errorname = Карта не имеет имени. Может быть, Вы пытаетесь загрузить сохранение?
|
||||||
editor.update = Обновить
|
editor.update = Обновить
|
||||||
@@ -260,6 +285,7 @@ editor.mapname = Название карты:
|
|||||||
editor.overwrite = [accent]Внимание! \nЭто перезапишет уже существующую карту.
|
editor.overwrite = [accent]Внимание! \nЭто перезапишет уже существующую карту.
|
||||||
editor.overwrite.confirm = [scarlet]Осторожно![] Карта с таким названием уже существует. Вы действительно хотите её перезаписать?
|
editor.overwrite.confirm = [scarlet]Осторожно![] Карта с таким названием уже существует. Вы действительно хотите её перезаписать?
|
||||||
editor.selectmap = Выберите карту для загрузки:
|
editor.selectmap = Выберите карту для загрузки:
|
||||||
|
|
||||||
toolmode.replace = Заменить
|
toolmode.replace = Заменить
|
||||||
toolmode.replace.description = Рисует только\nна сплошных блоках.
|
toolmode.replace.description = Рисует только\nна сплошных блоках.
|
||||||
toolmode.replaceall = Заменить всё
|
toolmode.replaceall = Заменить всё
|
||||||
@@ -274,6 +300,7 @@ toolmode.fillteams = Изменить команду блоков
|
|||||||
toolmode.fillteams.description = Изменяет принадлежность\nблоков к команде.
|
toolmode.fillteams.description = Изменяет принадлежность\nблоков к команде.
|
||||||
toolmode.drawteams = Изменить команду блока
|
toolmode.drawteams = Изменить команду блока
|
||||||
toolmode.drawteams.description = Изменяет принадлежность\nблока к команде.
|
toolmode.drawteams.description = Изменяет принадлежность\nблока к команде.
|
||||||
|
|
||||||
filters.empty = [lightgray]Нет фильтров! Добавьте один при помощи кнопки ниже.
|
filters.empty = [lightgray]Нет фильтров! Добавьте один при помощи кнопки ниже.
|
||||||
filter.distort = Искажение
|
filter.distort = Искажение
|
||||||
filter.noise = Шум
|
filter.noise = Шум
|
||||||
@@ -305,6 +332,7 @@ filter.option.floor2 = Вторая поверхность
|
|||||||
filter.option.threshold2 = Вторичный предельный порог
|
filter.option.threshold2 = Вторичный предельный порог
|
||||||
filter.option.radius = Радиус
|
filter.option.radius = Радиус
|
||||||
filter.option.percentile = Процентиль
|
filter.option.percentile = Процентиль
|
||||||
|
|
||||||
width = Ширина:
|
width = Ширина:
|
||||||
height = Высота:
|
height = Высота:
|
||||||
menu = Меню
|
menu = Меню
|
||||||
@@ -322,31 +350,34 @@ tutorial.retake = Перепройти обучение
|
|||||||
editor = Редактор
|
editor = Редактор
|
||||||
mapeditor = Редактор карт
|
mapeditor = Редактор карт
|
||||||
donate = Пожертво\nвать
|
donate = Пожертво\nвать
|
||||||
|
|
||||||
abandon = Покинуть
|
abandon = Покинуть
|
||||||
abandon.text = Эта зона и все её ресурсы будут отданы противнику.
|
abandon.text = Эта зона и все её ресурсы будут отданы противнику.
|
||||||
locked = Заблокировано
|
locked = Заблокировано
|
||||||
complete = [lightgray]Достигнута:
|
complete = [lightgray]Достигнута:
|
||||||
zone.requirement = Волна {0} в зоне {1}
|
zone.requirement = Волна {0} в зоне {1}
|
||||||
resume = Возобновить зону:\n[lightgray]{0}
|
resume = Возобновить зону:\n[lightgray]{0}
|
||||||
bestwave = [lightgray]Наилучшая волна: {0}
|
bestwave = [lightgray]Лучшая волна: {0}
|
||||||
launch = < ЗАПУСК >
|
launch = < ЗАПУСК >
|
||||||
launch.title = Запуск успешен
|
launch.title = Запуск успешен
|
||||||
launch.next = [lightgray]Cледующая возможность на {0}-той волне
|
launch.next = [lightgray]следующая возможность на {0}-той волне
|
||||||
launch.unable2 = [scarlet]ЗАПУСК невозможен.[]
|
launch.unable2 = [scarlet]ЗАПУСК невозможен.[]
|
||||||
launch.confirm = Это [accent]запустит[] все ресурсы в Вашем ядре.\nВы не сможете вернуться на эту базу.
|
launch.confirm = Это [accent]запустит[] все ресурсы в Вашем ядре.\nВы не сможете вернуться на эту базу.
|
||||||
launch.skip.confirm = Если Вы пропустите сейчас, то Вы не сможете произвести [accent]запуск[] до более поздних волн.
|
launch.skip.confirm = Если Вы пропустите сейчас, то Вы не сможете произвести [accent]запуск[] до более поздних волн.
|
||||||
uncover = Раскрыть
|
uncover = Раскрыть
|
||||||
configure = Выгрузить конфигурацию
|
configure = Конфигурация выгрузки
|
||||||
configure.locked = [lightgray]Возможность разблокировки выгрузки ресурсов будет доступна на {0}-ой волне.
|
configure.locked = [lightgray]Возможность разблокировки выгрузки ресурсов будет доступна на {0}-ой волне.
|
||||||
|
configure.invalid = Amount must be a number between 0 and {0}.
|
||||||
zone.unlocked = Зона «[lightgray]{0}» теперь разблокирована.
|
zone.unlocked = Зона «[lightgray]{0}» теперь разблокирована.
|
||||||
zone.requirement.complete = Вы достигли {0}-ой волны,\nУсловия для зоны «{1}» выполнены.
|
zone.requirement.complete = Вы достигли {0}-ой волны,\nУсловия для зоны «{1}» выполнены.
|
||||||
zone.config.complete = Вы достигли {0}-ой волны,Возможность выгрузки ресурсов теперь разблокирована.
|
zone.config.complete = Вы достигли {0}-ой волны,\Возможность выгрузки ресурсов теперь разблокирована.
|
||||||
zone.resources = [lightgray]Обнаруженные ресурсы:
|
zone.resources = [lightgray]Обнаруженные ресурсы:
|
||||||
zone.objective = [lightgray]Цель: [accent]{0}
|
zone.objective = [lightgray]Цель: [accent]{0}
|
||||||
zone.objective.survival = Выжить
|
zone.objective.survival = Выжить
|
||||||
zone.objective.attack = Уничтожить вражеское ядро
|
zone.objective.attack = Уничтожить вражеское ядро
|
||||||
add = Добавить…
|
add = Добавить…
|
||||||
boss.health = Здоровье босса
|
boss.health = Здоровье босса
|
||||||
|
|
||||||
connectfail = [crimson]Ошибка подключения:\n\n[accent]{0}
|
connectfail = [crimson]Ошибка подключения:\n\n[accent]{0}
|
||||||
error.unreachable = Сервер недоступен.\nВы уверены, что адрес введён корректно?
|
error.unreachable = Сервер недоступен.\nВы уверены, что адрес введён корректно?
|
||||||
error.invalidaddress = Некорректный адрес.
|
error.invalidaddress = Некорректный адрес.
|
||||||
@@ -354,9 +385,10 @@ error.timedout = Время ожидания истекло!\nУбедитесь
|
|||||||
error.mismatch = Ошибка пакета:\nвозможное несоответствие версии клиента/сервера.\nУбедитесь, что у Вас и создателя сервера установлена последняя версия Mindustry!
|
error.mismatch = Ошибка пакета:\nвозможное несоответствие версии клиента/сервера.\nУбедитесь, что у Вас и создателя сервера установлена последняя версия Mindustry!
|
||||||
error.alreadyconnected = Вы уже подключены.
|
error.alreadyconnected = Вы уже подключены.
|
||||||
error.mapnotfound = Файл карты не найден!
|
error.mapnotfound = Файл карты не найден!
|
||||||
error.io = Сетевая ошибка ввода-Вывода.
|
error.io = Сетевая ошибка ввода-вывода.
|
||||||
error.any = Неизвестная сетевая ошибка.
|
error.any = Неизвестная сетевая ошибка.
|
||||||
error.bloom = Не удалось инициализировать свечение (Bloom).\nВозможно, ваше устройство не поддерживает его.
|
error.bloom = Не удалось инициализировать свечение (Bloom).\nВозможно, ваше устройство не поддерживает его.
|
||||||
|
|
||||||
zone.groundZero.name = Отправная точка
|
zone.groundZero.name = Отправная точка
|
||||||
zone.desertWastes.name = Покинутые пустоши
|
zone.desertWastes.name = Покинутые пустоши
|
||||||
zone.craters.name = Кратеры
|
zone.craters.name = Кратеры
|
||||||
@@ -366,7 +398,7 @@ zone.stainedMountains.name = Окрашенные горы
|
|||||||
zone.desolateRift.name = Пустынный разлом
|
zone.desolateRift.name = Пустынный разлом
|
||||||
zone.nuclearComplex.name = Ядерный производственный комплекс
|
zone.nuclearComplex.name = Ядерный производственный комплекс
|
||||||
zone.overgrowth.name = Заросли
|
zone.overgrowth.name = Заросли
|
||||||
zone.tarFields.name = Дёгтярные поля
|
zone.tarFields.name = Дегтярные поля
|
||||||
zone.saltFlats.name = Соляные равнины
|
zone.saltFlats.name = Соляные равнины
|
||||||
zone.impact0078.name = Воздействие 0078
|
zone.impact0078.name = Воздействие 0078
|
||||||
zone.crags.name = Скалы
|
zone.crags.name = Скалы
|
||||||
@@ -385,30 +417,31 @@ zone.nuclearComplex.description = Бывший завод по производ
|
|||||||
zone.fungalPass.description = Переходная область между высокими горами и более низкими, покрытыми спорами землями. Здесь расположена небольшая разведывательная база противника.\nУничтожьте ее.\nИспользуйте единицы «Кинжал» и «Камикадзе». Достаньте до обоих ядер.
|
zone.fungalPass.description = Переходная область между высокими горами и более низкими, покрытыми спорами землями. Здесь расположена небольшая разведывательная база противника.\nУничтожьте ее.\nИспользуйте единицы «Кинжал» и «Камикадзе». Достаньте до обоих ядер.
|
||||||
zone.impact0078.description = <вставить описание здесь>
|
zone.impact0078.description = <вставить описание здесь>
|
||||||
zone.crags.description = <вставить описание здесь>
|
zone.crags.description = <вставить описание здесь>
|
||||||
|
|
||||||
settings.language = Язык
|
settings.language = Язык
|
||||||
settings.data = Game Data
|
settings.data = Игровые данные
|
||||||
settings.reset = Сбросить по умолчанию
|
settings.reset = Сбросить по умолчанию
|
||||||
settings.rebind = Смена
|
settings.rebind = Переназначить
|
||||||
settings.controls = Управление
|
settings.controls = Управление
|
||||||
settings.game = Игра
|
settings.game = Игра
|
||||||
settings.sound = Звук
|
settings.sound = Звук
|
||||||
settings.graphics = Графика
|
settings.graphics = Графика
|
||||||
settings.cleardata = Очистить данные…
|
settings.cleardata = Очистить игровые данные…
|
||||||
settings.clear.confirm = Вы действительно хотите очистить свои данные?\nЭто нельзя отменить!
|
settings.clear.confirm = Вы действительно хотите очистить свои данные?\nЭто нельзя отменить!
|
||||||
settings.clearall.confirm = [scarlet]ОСТОРОЖНО![]\nЭто уничтожит все данные, включая сохранения, карты, разблокированное и настройки управления.\nПосле того как Вы нажмете ОК, игра уничтожит все данные и автоматически закроется.
|
settings.clearall.confirm = [scarlet]ОСТОРОЖНО![]\nЭто сотрёт все данные, включая сохранения, карты, прогресс кампании и настройки управления.\nПосле того как Вы нажмете 'ОК', игра уничтожит все данные и автоматически закроется.
|
||||||
settings.clearunlocks = Очистить разблокированное
|
settings.clearunlocks = Очистить прогресс кампании
|
||||||
settings.clearall = Очистить всё
|
settings.clearall = Очистить всё
|
||||||
paused = Пауза
|
paused = [accent]< Пауза >
|
||||||
yes = Да
|
yes = Да
|
||||||
no = Нет
|
no = Нет
|
||||||
info.title = Информация
|
info.title = Информация
|
||||||
error.title = [crimson]Произошла ошибка
|
error.title = [crimson]Произошла ошибка
|
||||||
error.crashtitle = Произошла ошибка
|
error.crashtitle = Произошла ошибка
|
||||||
attackpvponly = [scarlet]Доступно только в атаке/PvP режимах
|
attackpvponly = [scarlet]Доступно только в Атаке/PvP режимах
|
||||||
blocks.input = Вход
|
blocks.input = Вход
|
||||||
blocks.output = Выход
|
blocks.output = Выход
|
||||||
blocks.booster = Ускоритель
|
blocks.booster = Ускоритель
|
||||||
block.unknown = [LIGHT_GRAY]???
|
block.unknown = [lightgray]???
|
||||||
blocks.powercapacity = Вместимость энергии
|
blocks.powercapacity = Вместимость энергии
|
||||||
blocks.powershot = Энергия/Выстрел
|
blocks.powershot = Энергия/Выстрел
|
||||||
blocks.damage = Урон
|
blocks.damage = Урон
|
||||||
@@ -428,39 +461,44 @@ blocks.productiontime = Время производства
|
|||||||
blocks.repairtime = Время полной регенерации
|
blocks.repairtime = Время полной регенерации
|
||||||
blocks.speedincrease = Увеличение скорости
|
blocks.speedincrease = Увеличение скорости
|
||||||
blocks.range = Радиус действия
|
blocks.range = Радиус действия
|
||||||
blocks.drilltier = Добывает
|
blocks.drilltier = Бурит
|
||||||
blocks.drillspeed = Базовая скорость бурения
|
blocks.drillspeed = Базовая скорость бурения
|
||||||
blocks.boosteffect = Ускоряющий эффект
|
blocks.boosteffect = Ускоряющий эффект
|
||||||
blocks.maxunits = Максимальное количество активных единиц
|
blocks.maxunits = Максимальное количество активных единиц
|
||||||
blocks.health = Здоровье
|
blocks.health = Здоровье
|
||||||
blocks.buildtime = Время строительства
|
blocks.buildtime = Время строительства
|
||||||
|
blocks.buildcost = Стоимость строительства
|
||||||
blocks.inaccuracy = Разброс
|
blocks.inaccuracy = Разброс
|
||||||
blocks.shots = Выстрелы
|
blocks.shots = Выстрелы
|
||||||
blocks.reload = Выстрелы/секунду
|
blocks.reload = Выстрелы/секунду
|
||||||
blocks.ammo = Боеприпасы
|
blocks.ammo = Боеприпасы
|
||||||
|
|
||||||
bar.drilltierreq = Требуется лучший бур
|
bar.drilltierreq = Требуется лучший бур
|
||||||
bar.drillspeed = Скорость бурения: {0}/s
|
bar.drillspeed = Скорость бурения: {0}/s
|
||||||
bar.efficiency = Эффективность: {0}%
|
bar.efficiency = Эффективность: {0}%
|
||||||
bar.powerbalance = Энергия: {0}/с
|
bar.powerbalance = Энергия: {0}/с
|
||||||
bar.poweramount = Энергия: {0}
|
bar.poweramount = Энергия: {0}
|
||||||
bar.poweroutput = Выходная энергия: {0}
|
bar.poweroutput = Выход энергии: {0}
|
||||||
bar.items = Предметы: {0}
|
bar.items = Предметы: {0}
|
||||||
|
bar.capacity = Вместимость: {0}
|
||||||
bar.liquid = Жидкости
|
bar.liquid = Жидкости
|
||||||
bar.heat = Нагревание
|
bar.heat = Нагрев
|
||||||
bar.power = Энергия
|
bar.power = Энергия
|
||||||
bar.progress = Прогресс строительства
|
bar.progress = Прогресс строительства
|
||||||
bar.spawned = Боев. ед. : {0}/{1}
|
bar.spawned = Боев. ед.: {0}/{1}
|
||||||
|
|
||||||
bullet.damage = [stat]{0}[lightgray] урона
|
bullet.damage = [stat]{0}[lightgray] урона
|
||||||
bullet.splashdamage = [stat]{0}[lightgray] урона в радиусе ~[stat] {1}[lightgray] БЛОКОВ
|
bullet.splashdamage = [stat]{0}[lightgray] урона в радиусе ~[stat] {1}[lightgray] блоков
|
||||||
bullet.incendiary = [stat]поджигающий
|
bullet.incendiary = [stat]зажигательный
|
||||||
bullet.homing = [stat]самонаводящийся
|
bullet.homing = [stat]самонаводящийся
|
||||||
bullet.shock = [stat]ЭМИ
|
bullet.shock = [stat]ЭМИ
|
||||||
bullet.frag = [stat]взрывоопасный
|
bullet.frag = [stat]разрывной
|
||||||
bullet.knockback = [stat]{0}[lightgray] отдачи
|
bullet.knockback = [stat]{0}[lightgray] отдачи
|
||||||
bullet.freezing = [stat]замораживающий
|
bullet.freezing = [stat]замораживающий
|
||||||
bullet.tarred = [stat]горючий
|
bullet.tarred = [stat]горючий
|
||||||
bullet.multiplier = [stat]{0}[lightgray]x снарядов
|
bullet.multiplier = [stat]{0}[lightgray]x количество боеприпасов
|
||||||
bullet.reload = [stat]{0}[lightgray]x скорость перезарядки
|
bullet.reload = [stat]{0}[lightgray]x скорость стрельбы
|
||||||
|
|
||||||
unit.blocks = блоки
|
unit.blocks = блоки
|
||||||
unit.powersecond = единиц энергии/секунду
|
unit.powersecond = единиц энергии/секунду
|
||||||
unit.liquidsecond = жидкостных единиц/секунду
|
unit.liquidsecond = жидкостных единиц/секунду
|
||||||
@@ -472,7 +510,7 @@ unit.seconds = сек.
|
|||||||
unit.persecond = /сек
|
unit.persecond = /сек
|
||||||
unit.timesspeed = x скорость
|
unit.timesspeed = x скорость
|
||||||
unit.percent = %
|
unit.percent = %
|
||||||
unit.items = единиц
|
unit.items = предметов
|
||||||
category.general = Основные
|
category.general = Основные
|
||||||
category.power = Энергия
|
category.power = Энергия
|
||||||
category.liquids = Жидкости
|
category.liquids = Жидкости
|
||||||
@@ -480,14 +518,14 @@ category.items = Предметы
|
|||||||
category.crafting = Ввод/Вывод
|
category.crafting = Ввод/Вывод
|
||||||
category.shooting = Стрельба
|
category.shooting = Стрельба
|
||||||
category.optional = Дополнительные улучшения
|
category.optional = Дополнительные улучшения
|
||||||
setting.landscape.name = Только альбомный(горизонтальный) режим
|
setting.landscape.name = Только альбомный (горизонтальный) режим
|
||||||
setting.shadows.name = Тени
|
setting.shadows.name = Тени
|
||||||
setting.linear.name = Линейная фильтрация
|
setting.linear.name = Линейная фильтрация
|
||||||
setting.animatedwater.name = Анимированная вода
|
setting.animatedwater.name = Анимированная вода
|
||||||
setting.animatedshields.name = Анимированные щиты
|
setting.animatedshields.name = Анимированные щиты
|
||||||
setting.antialias.name = Сглаживание[LIGHT_GRAY] (требует перезапуска)[]
|
setting.antialias.name = Сглаживание[lightgray] (требует перезапуска)[]
|
||||||
setting.indicators.name = Отображать индикаторы расположения союзников и врагов
|
setting.indicators.name = Отображать индикаторы расположения союзников и врагов
|
||||||
setting.autotarget.name = Авто-стрельба
|
setting.autotarget.name = Автозахват цели
|
||||||
setting.keyboard.name = Мышь+Управление с клавиатуры
|
setting.keyboard.name = Мышь+Управление с клавиатуры
|
||||||
setting.fpscap.name = Максимальный FPS
|
setting.fpscap.name = Максимальный FPS
|
||||||
setting.fpscap.none = Неограниченный
|
setting.fpscap.none = Неограниченный
|
||||||
@@ -498,30 +536,31 @@ setting.difficulty.training = Обучение
|
|||||||
setting.difficulty.easy = Лёгкая
|
setting.difficulty.easy = Лёгкая
|
||||||
setting.difficulty.normal = Нормальная
|
setting.difficulty.normal = Нормальная
|
||||||
setting.difficulty.hard = Сложная
|
setting.difficulty.hard = Сложная
|
||||||
setting.difficulty.insane = Зачистка
|
setting.difficulty.insane = Безумная
|
||||||
setting.difficulty.name = Сложность:
|
setting.difficulty.name = Сложность:
|
||||||
setting.screenshake.name = Тряска экрана
|
setting.screenshake.name = Тряска экрана
|
||||||
setting.effects.name = Эффекты
|
setting.effects.name = Эффекты
|
||||||
setting.sensitivity.name = Чувствительность контроллёра
|
setting.sensitivity.name = Чувствительность контроллёра
|
||||||
setting.saveinterval.name = Интервал сохранения
|
setting.saveinterval.name = Интервал сохранения
|
||||||
setting.seconds = {0} сек.
|
setting.seconds = {0} секунд
|
||||||
setting.fullscreen.name = Полноэкранный режим
|
setting.fullscreen.name = Полноэкранный режим
|
||||||
setting.borderlesswindow.name = Окно без границ [LIGHT_GRAY] (может потребоваться перезапуск)
|
setting.borderlesswindow.name = Безрамочное окно[lightgray] (может потребоваться перезапуск)
|
||||||
setting.fps.name = Показывать FPS
|
setting.fps.name = Показывать FPS
|
||||||
setting.vsync.name = Верт. синхронизация
|
setting.vsync.name = Вертикальная синхронизация
|
||||||
setting.lasers.name = Показывать энергию лазеров
|
setting.lasers.name = Показывать лазеры энергоснабжения
|
||||||
setting.pixelate.name = Пикселизация[LIGHT_GRAY] (отключает анимации)
|
setting.pixelate.name = Пикселизация[lightgray] (отключает анимации)
|
||||||
setting.minimap.name = Показать миникарту
|
setting.minimap.name = Показать миникарту
|
||||||
setting.musicvol.name = Громкость музыки
|
setting.musicvol.name = Громкость музыки
|
||||||
setting.ambientvol.name = Звуки окружающей среды
|
setting.ambientvol.name = Громкость окружения
|
||||||
setting.mutemusic.name = Заглушить музыку
|
setting.mutemusic.name = Заглушить музыку
|
||||||
setting.sfxvol.name = Громкость звукоВых эффектов
|
setting.sfxvol.name = Громкость звуковых эффектов
|
||||||
setting.mutesound.name = Заглушить звук
|
setting.mutesound.name = Заглушить звук
|
||||||
setting.crashreport.name = Отправлять анонимные отчёты о Вылетах
|
setting.crashreport.name = Отправлять анонимные отчёты о вылетах
|
||||||
setting.savecreate.name = Auto-Create Saves
|
setting.savecreate.name = Автоматическое создание сохранений
|
||||||
|
setting.publichost.name = Общедоступность игры
|
||||||
setting.chatopacity.name = Непрозрачность чата
|
setting.chatopacity.name = Непрозрачность чата
|
||||||
setting.playerchat.name = Отображать чат в игре
|
setting.playerchat.name = Отображать чат в игре
|
||||||
uiscale.reset = Масштаб пользовательского интерфейса был изменён.\nНажмите «ОК» для подтверждения этого масштаба.\n[scarlet]Возврат настроек и выход через[accent] {0}[]…
|
uiscale.reset = Масштаб пользовательского интерфейса был изменён.\nНажмите «ОК» для подтверждения этого масштаба.\n[scarlet]Возврат настроек и выход через[accent] {0}[] секунд…
|
||||||
uiscale.cancel = Отменить & Выйти
|
uiscale.cancel = Отменить & Выйти
|
||||||
setting.bloom.name = Свечение
|
setting.bloom.name = Свечение
|
||||||
keybind.title = Настройка управления
|
keybind.title = Настройка управления
|
||||||
@@ -535,7 +574,7 @@ command.patrol = Патрулирование
|
|||||||
keybind.gridMode.name = Выбрать блок
|
keybind.gridMode.name = Выбрать блок
|
||||||
keybind.gridModeShift.name = Выбрать категорию
|
keybind.gridModeShift.name = Выбрать категорию
|
||||||
keybind.press = Нажмите клавишу…
|
keybind.press = Нажмите клавишу…
|
||||||
keybind.press.axis = Нажмите клавишу…
|
keybind.press.axis = Нажмите оси или клавишу…
|
||||||
keybind.screenshot.name = Скриншот карты
|
keybind.screenshot.name = Скриншот карты
|
||||||
keybind.move_x.name = Движение по оси x
|
keybind.move_x.name = Движение по оси x
|
||||||
keybind.move_y.name = Движение по оси y
|
keybind.move_y.name = Движение по оси y
|
||||||
@@ -544,63 +583,65 @@ keybind.select.name = Выбор/Выстрел
|
|||||||
keybind.diagonal_placement.name = Диагональное размещение
|
keybind.diagonal_placement.name = Диагональное размещение
|
||||||
keybind.pick.name = Выбрать блок
|
keybind.pick.name = Выбрать блок
|
||||||
keybind.break_block.name = Разрушить блок
|
keybind.break_block.name = Разрушить блок
|
||||||
keybind.deselect.name = Отмена
|
keybind.deselect.name = Снять выделение
|
||||||
keybind.shoot.name = Выстрел
|
keybind.shoot.name = Выстрел
|
||||||
keybind.zoom_hold.name = Управление масштабом
|
keybind.zoom_hold.name = Управление масштабом
|
||||||
keybind.zoom.name = Приблизить/Отдалить
|
keybind.zoom.name = Приблизить/Отдалить
|
||||||
keybind.menu.name = Меню
|
keybind.menu.name = Меню
|
||||||
keybind.pause.name = Пауза
|
keybind.pause.name = Пауза
|
||||||
keybind.minimap.name = Мини-карта
|
keybind.minimap.name = Мини-карта
|
||||||
keybind.dash.name = Мчаться
|
keybind.dash.name = Полёт/Ускорение
|
||||||
keybind.chat.name = Чат
|
keybind.chat.name = Чат
|
||||||
keybind.player_list.name = Список игроков
|
keybind.player_list.name = Список игроков
|
||||||
keybind.console.name = Консоль
|
keybind.console.name = Консоль
|
||||||
keybind.rotate.name = Вращение
|
keybind.rotate.name = Вращение
|
||||||
keybind.toggle_menus.name = Меню переключения
|
keybind.toggle_menus.name = Переключение меню
|
||||||
keybind.chat_history_prev.name = Пред. история чата
|
keybind.chat_history_prev.name = Пред. история чата
|
||||||
keybind.chat_history_next.name = След. история чата
|
keybind.chat_history_next.name = След. история чата
|
||||||
keybind.chat_scroll.name = Прокрутка чата
|
keybind.chat_scroll.name = Прокрутка чата
|
||||||
keybind.drop_unit.name = Сбросить бой. ед.
|
keybind.drop_unit.name = Сбросить боев. ед.
|
||||||
keybind.zoom_minimap.name = Увеличить миникарту.
|
keybind.zoom_minimap.name = Масштабировать миникарту
|
||||||
mode.help.title = Описание режимов
|
mode.help.title = Описание режимов
|
||||||
mode.survival.name = Выживание
|
mode.survival.name = Выживание
|
||||||
mode.survival.description = Обычный режим. В этом режиме надо самим добывать ресурсы и сами волны идут автоматически. \n[gray]Требуются точки появления врагов для игры.
|
mode.survival.description = Обычный режим. Необходимо добывать ресурсы, а волны наступают автоматически.\n[gray]Требуются точки появления врагов на карте для игры.
|
||||||
mode.sandbox.name = Песочница
|
mode.sandbox.name = Песочница
|
||||||
mode.sandbox.description = Бесконечные ресурсы и нет таймера для волн, но можно самим Вызвать волну.
|
mode.sandbox.description = Бесконечные ресурсы и нет таймера волн. [gray]Можно самим вызвать волну.
|
||||||
mode.pvp.name = PvP
|
mode.pvp.name = PvP
|
||||||
mode.pvp.description = Боритесь против других игроков.\n[gray]Для игры требуется как минимум 2 ядра разного цвета на карте.
|
mode.pvp.description = Боритесь против других игроков.\n[gray]Для игры требуется как минимум 2 ядра разного цвета на карте.
|
||||||
mode.attack.name = Атака
|
mode.attack.name = Атака
|
||||||
mode.attack.description = Уничтожь вражескую базу.\n[gray]Для игры требуется красное ядро на карте.
|
mode.attack.description = Уничтожьте вражескую базу. Никаких волн.\n[gray]Для игры требуется красное ядро на карте.
|
||||||
mode.custom = Настройки правил
|
mode.custom = Пользовательские правила
|
||||||
rules.infiniteresources = Бескон. ресурсы (Игрок)
|
|
||||||
|
rules.infiniteresources = Бесконечные ресурсы (Игрок)
|
||||||
rules.wavetimer = Интервал волн
|
rules.wavetimer = Интервал волн
|
||||||
rules.waves = Волны
|
rules.waves = Волны
|
||||||
rules.attack = Режим атаки
|
rules.attack = Режим атаки
|
||||||
rules.enemyCheat = Бескон. ресурсы (ИИ)
|
rules.enemyCheat = Бесконечные ресурсы ИИ (красная команда)
|
||||||
rules.unitdrops = Ресурсы боеВых единиц
|
rules.unitdrops = Ресурсы за уничтожение боев. ед.
|
||||||
rules.unitbuildspeedmultiplier = Множитель скорости производства боев. ед.
|
rules.unitbuildspeedmultiplier = Множитель скорости производства боев. ед.
|
||||||
rules.unithealthmultiplier = Множитель здоровья боев. ед.
|
rules.unithealthmultiplier = Множитель здоровья боев. ед.
|
||||||
rules.playerhealthmultiplier = Множитель здоровья игрока
|
rules.playerhealthmultiplier = Множитель здоровья игрока
|
||||||
rules.playerdamagemultiplier = Множитель урона игрока
|
rules.playerdamagemultiplier = Множитель урона игрока
|
||||||
rules.unitdamagemultiplier = Множитель урона боев. ед.
|
rules.unitdamagemultiplier = Множитель урона боев. ед.
|
||||||
rules.enemycorebuildradius = Радиус защиты враж. ядер: [LIGHT_GRAY] (блоков)
|
rules.enemycorebuildradius = Радиус защиты враж. ядер:[lightgray] (блок.)
|
||||||
rules.respawntime = Интервал возрождения: [LIGHT_GRAY] (сек)
|
rules.respawntime = Время возрождения:[lightgray] (сек)
|
||||||
rules.wavespacing = Интервал волн: [LIGHT_GRAY] (сек)
|
rules.wavespacing = Интервал волн:[lightgray] (сек)
|
||||||
rules.buildcostmultiplier = Множитель затрат на строительство
|
rules.buildcostmultiplier = Множитель затрат на строительство
|
||||||
rules.buildspeedmultiplier = Множитель скорости строительства
|
rules.buildspeedmultiplier = Множитель скорости строительства
|
||||||
rules.waitForWaveToEnd = Волны ожидают врагов
|
rules.waitForWaveToEnd = Волны ожидают врагов
|
||||||
rules.dropzoneradius = Радиус зоны Высадки врагов:[LIGHT_GRAY] (блоков)
|
rules.dropzoneradius = Радиус зоны высадки врагов:[lightgray] (блоков)
|
||||||
rules.respawns = Макс. кол-во возрождений за волну
|
rules.respawns = Макс. кол-во возрождений за волну
|
||||||
rules.limitedRespawns = Ограничение возрождений
|
rules.limitedRespawns = Ограничение возрождений
|
||||||
rules.title.waves = Волны
|
rules.title.waves = Волны
|
||||||
rules.title.respawns = Возрождения
|
rules.title.respawns = Возрождение
|
||||||
rules.title.resourcesbuilding = Ресурсы & строительство
|
rules.title.resourcesbuilding = Ресурсы & строительство
|
||||||
rules.title.player = Игроки
|
rules.title.player = Игроки
|
||||||
rules.title.enemy = Враги
|
rules.title.enemy = Враги
|
||||||
rules.title.unit = Бой. ед.
|
rules.title.unit = Боев. ед.
|
||||||
|
|
||||||
content.item.name = Предметы
|
content.item.name = Предметы
|
||||||
content.liquid.name = Жидкости
|
content.liquid.name = Жидкости
|
||||||
content.unit.name = БоеВые единицы
|
content.unit.name = Боевые единицы
|
||||||
content.block.name = Блоки
|
content.block.name = Блоки
|
||||||
content.mech.name = Мехи
|
content.mech.name = Мехи
|
||||||
item.copper.name = Медь
|
item.copper.name = Медь
|
||||||
@@ -610,12 +651,12 @@ item.graphite.name = Графит
|
|||||||
item.titanium.name = Титан
|
item.titanium.name = Титан
|
||||||
item.thorium.name = Торий
|
item.thorium.name = Торий
|
||||||
item.silicon.name = Кремний
|
item.silicon.name = Кремний
|
||||||
item.plastanium.name = Пластиний
|
item.plastanium.name = Пластаний
|
||||||
item.phase-fabric.name = Фазовая ткань
|
item.phase-fabric.name = Фазовая ткань
|
||||||
item.surge-alloy.name = Кинетический сплав
|
item.surge-alloy.name = Кинетический сплав
|
||||||
item.spore-pod.name = Споровой стручок
|
item.spore-pod.name = Споровой стручок
|
||||||
item.sand.name = Песок
|
item.sand.name = Песок
|
||||||
item.blast-compound.name = Взрывная смесь
|
item.blast-compound.name = Взрывчатая смесь
|
||||||
item.pyratite.name = Пиротит
|
item.pyratite.name = Пиротит
|
||||||
item.metaglass.name = Метастекло
|
item.metaglass.name = Метастекло
|
||||||
item.scrap.name = Металлолом
|
item.scrap.name = Металлолом
|
||||||
@@ -624,77 +665,78 @@ liquid.slag.name = Шлак
|
|||||||
liquid.oil.name = Нефть
|
liquid.oil.name = Нефть
|
||||||
liquid.cryofluid.name = Криогенная жидкость
|
liquid.cryofluid.name = Криогенная жидкость
|
||||||
mech.alpha-mech.name = Альфа
|
mech.alpha-mech.name = Альфа
|
||||||
mech.alpha-mech.weapon = Тяжёлый пулемёт
|
mech.alpha-mech.weapon = Тяжёлый бластер
|
||||||
mech.alpha-mech.ability = Регенерация
|
mech.alpha-mech.ability = Регенерация
|
||||||
mech.delta-mech.name = Дельта
|
mech.delta-mech.name = Дельта
|
||||||
mech.delta-mech.weapon = Дуговой генератор
|
mech.delta-mech.weapon = Дуговой генератор
|
||||||
mech.delta-mech.ability = Разряд
|
mech.delta-mech.ability = Разряд
|
||||||
mech.tau-mech.name = Тау
|
mech.tau-mech.name = Тау
|
||||||
mech.tau-mech.weapon = Восстановительный лазер
|
mech.tau-mech.weapon = Восстановительный лазер
|
||||||
mech.tau-mech.ability = Регенирирующая вспышка
|
mech.tau-mech.ability = Регенирирующий всплеск
|
||||||
mech.omega-mech.name = Омега
|
mech.omega-mech.name = Омега
|
||||||
mech.omega-mech.weapon = Ракетомётный пулемёт
|
mech.omega-mech.weapon = Залповые ракетницы
|
||||||
mech.omega-mech.ability = Поглощение урона
|
mech.omega-mech.ability = Укреплённое бронирование
|
||||||
mech.dart-ship.name = Дротик
|
mech.dart-ship.name = Дротик
|
||||||
mech.dart-ship.weapon = Ретранслятор
|
mech.dart-ship.weapon = Бластер
|
||||||
mech.javelin-ship.name = Джавелин
|
mech.javelin-ship.name = Джавелин
|
||||||
mech.javelin-ship.weapon = Взрывные ракеты
|
mech.javelin-ship.weapon = Разрывные ракеты
|
||||||
mech.javelin-ship.ability = Дуговой генератор
|
mech.javelin-ship.ability = Разрядный ускоритель
|
||||||
mech.trident-ship.name = Трезубец
|
mech.trident-ship.name = Трезубец
|
||||||
mech.trident-ship.weapon = Бомбы
|
mech.trident-ship.weapon = Бомбовый отсек
|
||||||
mech.glaive-ship.name = Копьё
|
mech.glaive-ship.name = Копьё
|
||||||
mech.glaive-ship.weapon = Огненный пулемёт
|
mech.glaive-ship.weapon = Огненный бластер
|
||||||
item.explosiveness = [LIGHT_GRAY]Взрывоопасность: {0}%
|
item.explosiveness = [lightgray]Взрывоопасность: {0}%
|
||||||
item.flammability = [LIGHT_GRAY]Воспламеняемость: {0}%
|
item.flammability = [lightgray]Воспламеняемость: {0}%
|
||||||
item.radioactivity = [LIGHT_GRAY]Радиоактивность: {0}%
|
item.radioactivity = [lightgray]Радиоактивность: {0}%
|
||||||
unit.health = [LIGHT_GRAY]Здоровье: {0}
|
unit.health = [lightgray]Здоровье: {0}
|
||||||
unit.speed = [LIGHT_GRAY]Скорость: {0}
|
unit.speed = [lightgray]Скорость: {0}
|
||||||
mech.weapon = [LIGHT_GRAY]Оружие: {0}
|
mech.weapon = [lightgray]Орудие: {0}
|
||||||
mech.health = [LIGHT_GRAY]Здоровье: {0}
|
mech.health = [lightgray]Целостность: {0}
|
||||||
mech.itemcapacity = [LIGHT_GRAY]Вместимость предметов: {0}
|
mech.itemcapacity = [lightgray]Вместимость предметов: {0}
|
||||||
mech.minespeed = [LIGHT_GRAY]Скорость добычи: {0}%
|
mech.minespeed = [lightgray]Скорость добычи: {0}%
|
||||||
mech.minepower = [LIGHT_GRAY]Мощность добычи: {0}
|
mech.minepower = [lightgray]Мощность добычи: {0}
|
||||||
mech.ability = [LIGHT_GRAY]Способность: {0}
|
mech.ability = [lightgray]Способность: {0}
|
||||||
mech.buildspeed = [LIGHT_GRAY]Скорость строительства: {0}%
|
mech.buildspeed = [lightgray]Скорость строительства: {0}%
|
||||||
liquid.heatcapacity = [LIGHT_GRAY]Теплоёмкость: {0}
|
liquid.heatcapacity = [lightgray]Теплоёмкость: {0}
|
||||||
liquid.viscosity = [LIGHT_GRAY]Вязкость: {0}
|
liquid.viscosity = [lightgray]Вязкость: {0}
|
||||||
liquid.temperature = [LIGHT_GRAY]Температура: {0}
|
liquid.temperature = [lightgray]Температура: {0}
|
||||||
block.sand-boulder.name = Песочный валун
|
|
||||||
|
block.sand-boulder.name = Песчаный валун
|
||||||
block.grass.name = Трава
|
block.grass.name = Трава
|
||||||
block.salt.name = Соль
|
block.salt.name = Соль
|
||||||
block.saltrocks.name = Соляные Камни
|
block.saltrocks.name = Соляные камни
|
||||||
block.pebbles.name = Галька
|
block.pebbles.name = Галька
|
||||||
block.tendrils.name = Щупальца
|
block.tendrils.name = Споровые усики
|
||||||
block.sandrocks.name = Песчаные Скалы
|
block.sandrocks.name = Песчаные камни
|
||||||
block.spore-pine.name = Споровая сосна
|
block.spore-pine.name = Споровая сосна
|
||||||
block.sporerocks.name = СпороВые камни
|
block.sporerocks.name = Споровые камни
|
||||||
block.rock.name = Камень
|
block.rock.name = Каменный валун
|
||||||
block.snowrock.name = Снежный камень
|
block.snowrock.name = Заснеженный валун
|
||||||
block.snow-pine.name = Снежные сосны
|
block.snow-pine.name = Заснеженная сосна
|
||||||
block.shale.name = Сланец
|
block.shale.name = Сланец
|
||||||
block.shale-boulder.name = СланцеВый валун
|
block.shale-boulder.name = Сланцевый валун
|
||||||
block.moss.name = Мох
|
block.moss.name = Мох
|
||||||
block.shrubs.name = Кусты
|
block.shrubs.name = Кусты
|
||||||
block.spore-moss.name = СпороВый Мох
|
block.spore-moss.name = Споровый мох
|
||||||
block.shalerocks.name = СланцеВые Породы
|
block.shalerocks.name = Сланцевые камни
|
||||||
block.scrap-wall.name = Стена из металлолома
|
block.scrap-wall.name = Стена из металлолома
|
||||||
block.scrap-wall-large.name = Великая стена из металлолома
|
block.scrap-wall-large.name = Большая стена из металлолома
|
||||||
block.scrap-wall-huge.name = Огромная стена из металлолома
|
block.scrap-wall-huge.name = Огромная стена из металлолома
|
||||||
block.scrap-wall-gigantic.name = Гигантская стена из металлолома
|
block.scrap-wall-gigantic.name = Гигантская стена из металлолома
|
||||||
block.thruster.name = Толкатель
|
block.thruster.name = Маневровый двигатель
|
||||||
block.kiln.name = Печь
|
block.kiln.name = Печь
|
||||||
block.graphite-press.name = Графитный пресс
|
block.graphite-press.name = Графитный пресс
|
||||||
block.multi-press.name = Мульти-пресс
|
block.multi-press.name = Мульти-пресс
|
||||||
block.constructing = {0}\n[LIGHT_GRAY](Строится)
|
block.constructing = {0} [lightgray](Строится)
|
||||||
block.spawn.name = Точка появления врагов
|
block.spawn.name = Точка появления врагов
|
||||||
block.core-shard.name = Ядро «Осколок»
|
block.core-shard.name = Ядро: «Осколок»
|
||||||
block.core-foundation.name = Ядро «Штаб»
|
block.core-foundation.name = Ядро: «Штаб»
|
||||||
block.core-nucleus.name = Ядро «Атом»
|
block.core-nucleus.name = Ядро: «Атом»
|
||||||
block.deepwater.name = Глубоководье
|
block.deepwater.name = Глубоководье
|
||||||
block.water.name = Вода
|
block.water.name = Вода
|
||||||
block.tainted-water.name = Загрязнённая вода
|
block.tainted-water.name = Загрязнённая вода
|
||||||
block.darksand-tainted-water.name = Тёмный песок с загрязнённой водой
|
block.darksand-tainted-water.name = Тёмный песок с загрязнённой водой
|
||||||
block.tar.name = Дёготь
|
block.tar.name = Нефть
|
||||||
block.stone.name = Камень
|
block.stone.name = Камень
|
||||||
block.sand.name = Песок
|
block.sand.name = Песок
|
||||||
block.darksand.name = Тёмный песок
|
block.darksand.name = Тёмный песок
|
||||||
@@ -705,20 +747,20 @@ block.sand-water.name = Песок с водой
|
|||||||
block.darksand-water.name = Тёмный песок с водой
|
block.darksand-water.name = Тёмный песок с водой
|
||||||
block.char.name = Выжженная земля
|
block.char.name = Выжженная земля
|
||||||
block.holostone.name = Голографический камень
|
block.holostone.name = Голографический камень
|
||||||
block.ice-snow.name = Ледяной снег
|
block.ice-snow.name = Заснеженный лёд
|
||||||
block.rocks.name = Камни
|
block.rocks.name = Камни
|
||||||
block.icerocks.name = Ледяные камни
|
block.icerocks.name = Ледяные камни
|
||||||
block.snowrocks.name = Снежные камни
|
block.snowrocks.name = Снежные камни
|
||||||
block.dunerocks.name = Песчаные Камни
|
block.dunerocks.name = Тёмные песчаные камни
|
||||||
block.pine.name = Сосна
|
block.pine.name = Сосна
|
||||||
block.white-tree-dead.name = Мёртвое белое дерево
|
block.white-tree-dead.name = Мёртвое белое дерево
|
||||||
block.white-tree.name = Белое дерево
|
block.white-tree.name = Белое дерево
|
||||||
block.spore-cluster.name = Скопление спор
|
block.spore-cluster.name = Скопление спор
|
||||||
block.metal-floor.name = Металлический пол
|
block.metal-floor.name = Металлический пол 1
|
||||||
block.metal-floor-2.name = Металлический пол 2
|
block.metal-floor-2.name = Металлический пол 2
|
||||||
block.metal-floor-3.name = Металлический пол 3
|
block.metal-floor-3.name = Металлический пол 3
|
||||||
block.metal-floor-5.name = Металлический пол 5
|
block.metal-floor-5.name = Металлический пол 5
|
||||||
block.metal-floor-damaged.name = Повреждённый Металлический Пол
|
block.metal-floor-damaged.name = Повреждённый металлический пол
|
||||||
block.dark-panel-1.name = Тёмная панель 1
|
block.dark-panel-1.name = Тёмная панель 1
|
||||||
block.dark-panel-2.name = Тёмная панель 2
|
block.dark-panel-2.name = Тёмная панель 2
|
||||||
block.dark-panel-3.name = Тёмная панель 3
|
block.dark-panel-3.name = Тёмная панель 3
|
||||||
@@ -726,9 +768,9 @@ block.dark-panel-4.name = Тёмная панель 4
|
|||||||
block.dark-panel-5.name = Тёмная панель 5
|
block.dark-panel-5.name = Тёмная панель 5
|
||||||
block.dark-panel-6.name = Тёмная панель 6
|
block.dark-panel-6.name = Тёмная панель 6
|
||||||
block.dark-metal.name = Тёмный металл
|
block.dark-metal.name = Тёмный металл
|
||||||
block.ignarock.name = Магматические горные породы
|
block.ignarock.name = Обожжёный камень
|
||||||
block.hotrock.name = Горячий камень
|
block.hotrock.name = Горячий камень
|
||||||
block.magmarock.name = МагмоВый камень
|
block.magmarock.name = Магмовый камень
|
||||||
block.cliffs.name = Скалы
|
block.cliffs.name = Скалы
|
||||||
block.copper-wall.name = Медная стена
|
block.copper-wall.name = Медная стена
|
||||||
block.copper-wall-large.name = Большая медная стена
|
block.copper-wall-large.name = Большая медная стена
|
||||||
@@ -746,24 +788,24 @@ block.scatter.name = Рассеиватель
|
|||||||
block.hail.name = Град
|
block.hail.name = Град
|
||||||
block.lancer.name = Копейщик
|
block.lancer.name = Копейщик
|
||||||
block.conveyor.name = Конвейер
|
block.conveyor.name = Конвейер
|
||||||
block.titanium-conveyor.name = ТитаноВый конвейер
|
block.titanium-conveyor.name = Титановый конвейер
|
||||||
block.junction.name = Перекрёсток
|
block.junction.name = Перекрёсток
|
||||||
block.router.name = Маршрутизатор
|
block.router.name = Маршрутизатор
|
||||||
block.distributor.name = Разветвитель
|
block.distributor.name = Распределитель
|
||||||
block.sorter.name = Сортировщик
|
block.sorter.name = Сортировщик
|
||||||
block.overflow-gate.name = Избыточный затвор
|
block.overflow-gate.name = Избыточный затвор
|
||||||
block.silicon-smelter.name = КремниеВый плавильный завод
|
block.silicon-smelter.name = Кремниевый плавильный завод
|
||||||
block.phase-weaver.name = ФазоВый ткач
|
block.phase-weaver.name = Фазовый ткач
|
||||||
block.pulverizer.name = Измельчитель
|
block.pulverizer.name = Измельчитель
|
||||||
block.cryofluidmixer.name = Мешалка криогенной жидкости
|
block.cryofluidmixer.name = Мешалка криогенной жидкости
|
||||||
block.melter.name = Плавильня
|
block.melter.name = Плавильня
|
||||||
block.incinerator.name = Мусоросжигатель
|
block.incinerator.name = Мусоросжигатель
|
||||||
block.spore-press.name = Споровой Пресс
|
block.spore-press.name = Споровой пресс
|
||||||
block.separator.name = Отделитель
|
block.separator.name = Отделитель
|
||||||
block.coal-centrifuge.name = Угольная центрифуга
|
block.coal-centrifuge.name = Угольная центрифуга
|
||||||
block.power-node.name = Силовой узел
|
block.power-node.name = Силовой узел
|
||||||
block.power-node-large.name = Большой силовой узел
|
block.power-node-large.name = Большой силовой узел
|
||||||
block.surge-tower.name = Кинетическая башня
|
block.surge-tower.name = Кинетическая вышка
|
||||||
block.battery.name = Аккумулятор
|
block.battery.name = Аккумулятор
|
||||||
block.battery-large.name = Большой аккумулятор
|
block.battery-large.name = Большой аккумулятор
|
||||||
block.combustion-generator.name = Генератор внутреннего сгорания
|
block.combustion-generator.name = Генератор внутреннего сгорания
|
||||||
@@ -775,13 +817,13 @@ block.pneumatic-drill.name = Пневматический бур
|
|||||||
block.laser-drill.name = Лазерный бур
|
block.laser-drill.name = Лазерный бур
|
||||||
block.water-extractor.name = Гидроконденсатор
|
block.water-extractor.name = Гидроконденсатор
|
||||||
block.cultivator.name = Культиватор
|
block.cultivator.name = Культиватор
|
||||||
block.dart-mech-pad.name = Реконструктор «Альфа»
|
block.dart-mech-pad.name = Реконструктор меха «Альфа»
|
||||||
block.delta-mech-pad.name = Реконструктор «Дельта»
|
block.delta-mech-pad.name = Реконструктор меха «Дельта»
|
||||||
block.javelin-ship-pad.name = Реконструктор «Джавелин»
|
block.javelin-ship-pad.name = Реконструктор корабля «Джавелин»
|
||||||
block.trident-ship-pad.name = Реконструктор «Трезубец»
|
block.trident-ship-pad.name = Реконструктор корабля «Трезубец»
|
||||||
block.glaive-ship-pad.name = Реконструктор «Копьё»
|
block.glaive-ship-pad.name = Реконструктор корабля «Копьё»
|
||||||
block.omega-mech-pad.name = Реконструктор «Омега»
|
block.omega-mech-pad.name = Реконструктор меха «Омега»
|
||||||
block.tau-mech-pad.name = Реконструктор «Тау»
|
block.tau-mech-pad.name = Реконструктор меха «Тау»
|
||||||
block.conduit.name = Трубопровод
|
block.conduit.name = Трубопровод
|
||||||
block.mechanical-pump.name = Механическая помпа
|
block.mechanical-pump.name = Механическая помпа
|
||||||
block.item-source.name = Источник предметов
|
block.item-source.name = Источник предметов
|
||||||
@@ -795,41 +837,41 @@ block.wave.name = Волна
|
|||||||
block.swarmer.name = Роевик
|
block.swarmer.name = Роевик
|
||||||
block.salvo.name = Залп
|
block.salvo.name = Залп
|
||||||
block.ripple.name = Рябь
|
block.ripple.name = Рябь
|
||||||
block.phase-conveyor.name = ФазоВый конвейер
|
block.phase-conveyor.name = Фазовый конвейер
|
||||||
block.bridge-conveyor.name = Мостовой конвейер
|
block.bridge-conveyor.name = Мостовой конвейер
|
||||||
block.plastanium-compressor.name = ПластиниеВый компрессор
|
block.plastanium-compressor.name = Пластаниевый компрессор
|
||||||
block.pyratite-mixer.name = Мешалка пиротита
|
block.pyratite-mixer.name = Мешалка пиротита
|
||||||
block.blast-mixer.name = Мешалка взрывоопасного соединения
|
block.blast-mixer.name = Мешалка взрывчатой смеси
|
||||||
block.solar-panel.name = Солнечная панель
|
block.solar-panel.name = Солнечная панель
|
||||||
block.solar-panel-large.name = Большая солнечная панель
|
block.solar-panel-large.name = Большая солнечная панель
|
||||||
block.oil-extractor.name = Нефтяная вышка
|
block.oil-extractor.name = Нефтяная вышка
|
||||||
block.command-center.name = Командный центр
|
block.command-center.name = Командный центр
|
||||||
block.draug-factory.name = Завод дронов «Драугр»
|
block.draug-factory.name = Завод добывающих дронов «Драуг»
|
||||||
block.spirit-factory.name = Завод ремонтных дронов «Призрак»
|
block.spirit-factory.name = Завод ремонтных дронов «Дух»
|
||||||
block.phantom-factory.name = Завод строительных дронов «Фантом»
|
block.phantom-factory.name = Завод строительных дронов «Фантом»
|
||||||
block.wraith-factory.name = Завод призрачных истребителей
|
block.wraith-factory.name = Завод истребителей «Призрак»
|
||||||
block.ghoul-factory.name = Завод бомбардировщиков «Гуль»
|
block.ghoul-factory.name = Завод бомбардировщиков «Гуль»
|
||||||
block.dagger-factory.name = Завод мехов «Кинжал»
|
block.dagger-factory.name = Завод мехов «Кинжал»
|
||||||
block.crawler-factory.name = Завод мехов «Камикадзе»
|
block.crawler-factory.name = Завод гусеничных ботов «Камикадзе»
|
||||||
block.titan-factory.name = Завод мехов «Титан»
|
block.titan-factory.name = Завод мехов «Титан»
|
||||||
block.fortress-factory.name = Завод мехов «Крепость»
|
block.fortress-factory.name = Завод мехов «Крепость»
|
||||||
block.revenant-factory.name = Завод бомбардировщиков «Потусторонний убийца»
|
block.revenant-factory.name = Завод крейсеров «Мститель»
|
||||||
block.repair-point.name = Ремонтный пункт
|
block.repair-point.name = Ремонтный пункт
|
||||||
block.pulse-conduit.name = Импульсный трубопровод
|
block.pulse-conduit.name = Импульсный трубопровод
|
||||||
block.phase-conduit.name = ФазоВый трубопровод
|
block.phase-conduit.name = Фазовый трубопровод
|
||||||
block.liquid-router.name = Жидкостный маршрутизатор
|
block.liquid-router.name = Жидкостный маршрутизатор
|
||||||
block.liquid-tank.name = Жидкостный резервуар
|
block.liquid-tank.name = Жидкостный бак
|
||||||
block.liquid-junction.name = Жидкостный перекрёсток
|
block.liquid-junction.name = Жидкостный перекрёсток
|
||||||
block.bridge-conduit.name = Мостовой трубопровод
|
block.bridge-conduit.name = Мостовой трубопровод
|
||||||
block.rotary-pump.name = Роторный насос
|
block.rotary-pump.name = Роторный насос
|
||||||
block.thorium-reactor.name = ТориеВый реактор
|
block.thorium-reactor.name = Ториевый реактор
|
||||||
block.mass-driver.name = Электромагнитная катапульта
|
block.mass-driver.name = Электромагнитная катапульта
|
||||||
block.blast-drill.name = Воздушная буровая установка
|
block.blast-drill.name = Воздушная буровая установка
|
||||||
block.thermal-pump.name = Термальный насос
|
block.thermal-pump.name = Термальный насос
|
||||||
block.thermal-generator.name = Термальный генератор
|
block.thermal-generator.name = Термальный генератор
|
||||||
block.alloy-smelter.name = Плавильня кинетического сплава
|
block.alloy-smelter.name = Плавильня кинетического сплава
|
||||||
block.mender.name = Регенератор
|
block.mender.name = Регенератор
|
||||||
block.mend-projector.name = Ремонтирующий гранатомёт
|
block.mend-projector.name = Ремонтирующий проектор
|
||||||
block.surge-wall.name = Стена из кинетического сплава
|
block.surge-wall.name = Стена из кинетического сплава
|
||||||
block.surge-wall-large.name = Большая стена из кинетического сплава
|
block.surge-wall-large.name = Большая стена из кинетического сплава
|
||||||
block.cyclone.name = Циклон
|
block.cyclone.name = Циклон
|
||||||
@@ -839,28 +881,28 @@ block.overdrive-projector.name = Сверхприводный проектор
|
|||||||
block.force-projector.name = Силовой проектор
|
block.force-projector.name = Силовой проектор
|
||||||
block.arc.name = Дуга
|
block.arc.name = Дуга
|
||||||
block.rtg-generator.name = Радиоизотопный термоэлектрический генератор
|
block.rtg-generator.name = Радиоизотопный термоэлектрический генератор
|
||||||
block.spectre.name = Призрак
|
block.spectre.name = Спектр
|
||||||
block.meltdown.name = Плазмотрон
|
block.meltdown.name = Испепелитель
|
||||||
block.container.name = Склад
|
block.container.name = Склад
|
||||||
block.launch-pad.name = Стартовая площадка
|
block.launch-pad.name = Стартовая площадка
|
||||||
block.launch-pad-large.name = Большая стартовая площадка
|
block.launch-pad-large.name = Большая стартовая площадка
|
||||||
team.blue.name = Синяя
|
team.blue.name = Синяя
|
||||||
team.crux.name = Красная
|
team.crux.name = Красная
|
||||||
team.sharded.name = Оранжевая
|
team.sharded.name = Разрозненная
|
||||||
team.orange.name = Оранжевая
|
team.orange.name = Оранжевая
|
||||||
team.derelict.name = Покинутая
|
team.derelict.name = Покинутая
|
||||||
team.green.name = Зелёная
|
team.green.name = Зелёная
|
||||||
team.purple.name = Фиолетовая
|
team.purple.name = Фиолетовая
|
||||||
unit.spirit.name = Ремонтирующий дрон «Привидение»
|
unit.spirit.name = Ремонтный дрон «Дух»
|
||||||
unit.draug.name = Добывающий дрон «Драугр»
|
unit.draug.name = Добывающий дрон «Драуг»
|
||||||
unit.phantom.name = Строительный дрон «Фантом»
|
unit.phantom.name = Строительный дрон «Фантом»
|
||||||
unit.dagger.name = Кинжал
|
unit.dagger.name = Кинжал
|
||||||
unit.crawler.name = Камикадзе
|
unit.crawler.name = Камикадзе
|
||||||
unit.titan.name = Титан
|
unit.titan.name = Титан
|
||||||
unit.ghoul.name = Гуль
|
unit.ghoul.name = Гуль
|
||||||
unit.wraith.name = Призрачный истребитель
|
unit.wraith.name = Призрак
|
||||||
unit.fortress.name = Крепость
|
unit.fortress.name = Крепость
|
||||||
unit.revenant.name = Потусторонний убийца
|
unit.revenant.name = Мститель
|
||||||
unit.eruptor.name = Извергатель
|
unit.eruptor.name = Извергатель
|
||||||
unit.chaos-array.name = Массив хаоса
|
unit.chaos-array.name = Массив хаоса
|
||||||
unit.eradicator.name = Искоренитель
|
unit.eradicator.name = Искоренитель
|
||||||
@@ -869,47 +911,47 @@ unit.reaper.name = Жнец
|
|||||||
tutorial.next = [lightgray]<Нажмите для продолжения>
|
tutorial.next = [lightgray]<Нажмите для продолжения>
|
||||||
tutorial.intro = Вы начали[scarlet] обучение по Mindustry.[]\nНачните с [accent]добычи меди[]. Нажмите на медную жилу возле вашего ядра, чтобы сделать это.\n\n[accent]{0}/{1} меди
|
tutorial.intro = Вы начали[scarlet] обучение по Mindustry.[]\nНачните с [accent]добычи меди[]. Нажмите на медную жилу возле вашего ядра, чтобы сделать это.\n\n[accent]{0}/{1} меди
|
||||||
tutorial.drill = Ручная добыча не является эффективной.\n[accent]Буры []могут добывать автоматически.\nНажмите на вкладку с изображением сверла снизу справа.\nВыберите[accent] механический бур[]. Разместите его на медной жиле нажатием.\n[accent]Нажатие по правой кнопке[] прервёт строительство.
|
tutorial.drill = Ручная добыча не является эффективной.\n[accent]Буры []могут добывать автоматически.\nНажмите на вкладку с изображением сверла снизу справа.\nВыберите[accent] механический бур[]. Разместите его на медной жиле нажатием.\n[accent]Нажатие по правой кнопке[] прервёт строительство.
|
||||||
tutorial.drill.mobile = Ручная добыча не является эффективной.\n[accent]Буры []могут добывать автоматически.\nНажмите на вкладку с изображением сверла снизу справа.\nВыберите[accent] механический бур[]. \nРазместите его на медной жиле нажатием, затемм нажмите [accent] белую галку[] ниже, чтобы подтвердить построение Выделенного.\nНажмите [accent] кнопку X[], чтобы отменить размещение.
|
tutorial.drill.mobile = Ручная добыча не является эффективной.\n[accent]Буры []могут добывать автоматически.\nНажмите на вкладку с изображением сверла снизу справа.\nВыберите[accent] механический бур[]. \nРазместите его на медной жиле нажатием, затемм нажмите [accent] белую галку[] ниже, чтобы подтвердить построение выделенного.\nНажмите [accent] кнопку X[], чтобы отменить размещение.
|
||||||
tutorial.blockinfo = Каждый блок имеет разные характеристики.\nЧтобы узнать информацию о блоке и о его характеристиках,[accent] нажмите на «?», когда он Выбран в меню строительства.[]\n\n[accent]Сейчас, узнайте характеристики механического бура.[]
|
tutorial.blockinfo = Каждый блок имеет разные характеристики.\nЧтобы узнать информацию о блоке и о его характеристиках,[accent] нажмите на «?», когда он выбран в меню строительства.[]\n\n[accent]Сейчас, узнайте характеристики механического бура.[]
|
||||||
tutorial.conveyor = [accent]Конвейера[] используются для транспортировки ресуров в ядро.\nСделайте линию конвейеров от бура к ядру\n[accent]Удерживайте левую кнопку мыши, чтобы разместить конвейерную линию.[]\nУдерживайте[accent] CTRL[] при постройке линии блоков, чтобы сделать её диагональной\n\n[accent]{0}/{1} конвейеров размещённых в линию\n[accent]0/1 предмет доставлен.
|
tutorial.conveyor = [accent]Конвейера[] используются для транспортировки ресуров в ядро.\nСделайте линию конвейеров от бура к ядру\n[accent]Удерживайте левую кнопку мыши, чтобы разместить конвейерную линию.[]\nУдерживайте[accent] CTRL[] при постройке линии блоков, чтобы сделать её диагональной\n\n[accent]{0}/{1} конвейеров размещённых в линию\n[accent]0/1 предмет доставлен.
|
||||||
tutorial.conveyor.mobile = [accent]Конвейера[] используются для транспортировки ресурсов в ядро\nСделайте линию конвейеров от бура к ядру\n[accent]Сделайте линию, удерживая палец несколько секунд в том месте, в котором Вы хотите начать линию,[] и перетяните его в нужном направлении.\n\n[accent]{0}/{1} конвейеров размещённых в линию\n[accent]0/1 предмет доставлен.
|
tutorial.conveyor.mobile = [accent]Конвейера[] используются для транспортировки ресурсов в ядро\nСделайте линию конвейеров от бура к ядру\n[accent]Сделайте линию, удерживая палец несколько секунд в том месте, в котором Вы хотите начать линию,[] и перетяните его в нужном направлении.\n\n[accent]{0}/{1} конвейеров размещённых в линию\n[accent]0/1 предмет доставлен.
|
||||||
tutorial.turret = Защитные структуры нужно строить для отражения[lightgray] противников[].\nПостройте[accent] двойную турель[] возле своего ядра.
|
tutorial.turret = Защитные структуры нужно строить для отражения[lightgray] противников[].\nПостройте[accent] двойную турель[] возле своего ядра.
|
||||||
tutorial.drillturret = Двойным турелям нужна [accent]медь []в качестве боеприпасов.\nРазместите бур рядом с турелью.\nПроведите конвейеры к турели, чтобы снабдить её боеприпасами.\n\n[accent]Боеприпасов доставлено: 0/1
|
tutorial.drillturret = Двойным турелям нужна [accent]медь []в качестве боеприпасов.\nРазместите бур рядом с турелью.\nПроведите конвейеры к турели, чтобы снабдить её боеприпасами.\n\n[accent]Боеприпасов доставлено: 0/1
|
||||||
tutorial.pause = Во время битВы Вы можете[accent] приостановить игру.[]\nВы можете планировать строительство, когда игра стоит на паузе.\n\n[accent]Нажмите ПРОБЕЛ для приостановки игры.
|
tutorial.pause = Во время битвы Вы можете[accent] приостановить игру.[]\nВы можете планировать строительство, когда игра стоит на паузе.\n\n[accent]Нажмите ПРОБЕЛ для приостановки игры.
|
||||||
tutorial.pause.mobile = Во время битВы, Вы можете[accent] приостановить игру.[]\nВы можеть планировать строительство, когда игра стоит на паузе.\n\n[accent]Нажмите кнопку сверху слева, чтобы поставить игру на паузу.
|
tutorial.pause.mobile = Во время битвы, Вы можете[accent] приостановить игру.[]\nВы можеть планировать строительство, когда игра стоит на паузе.\n\n[accent]Нажмите кнопку сверху слева, чтобы поставить игру на паузу.
|
||||||
tutorial.unpause = Теперь нажмите пробел снова для снятия паузы.
|
tutorial.unpause = Теперь нажмите пробел снова для снятия паузы.
|
||||||
tutorial.unpause.mobile = Теперь нажмите снова туда для снятия паузы.
|
tutorial.unpause.mobile = Теперь нажмите снова туда для снятия паузы.
|
||||||
tutorial.breaking = Часто блоки нужно разрушать\n[accent]Зажмите ПКМ[], чтобы разрушить блоки в Выбранной зоне.[]\n\n[accent]Разрушьте все стены из металлолома слева от вашего ядра.
|
tutorial.breaking = Часто блоки нужно разрушать\n[accent]Зажмите ПКМ[], чтобы разрушить блоки в выбранной зоне.[]\n\n[accent]Разрушьте все стены из металлолома слева от вашего ядра.
|
||||||
tutorial.breaking.mobile = Часто блоки нужно разрушить.\n[accent]Выберите режим деконструкции[], после чего нажмите на нужный блок, чтобы его разрушить.\nРазрушьте блоки в Выбранной зоне, зажав палец на несколько секунд[], и проводя его в нужном направлении.\nНажмите на галочку, чтобы подтвердить разрушение.\n\n[accent]Разрушьте все стены из металлолома слева от вашего ядра.
|
tutorial.breaking.mobile = Часто блоки нужно разрушить.\n[accent]Выберите режим деконструкции[], после чего нажмите на нужный блок, чтобы его разрушить.\nРазрушьте блоки в выбранной зоне, зажав палец на несколько секунд[], и проводя его в нужном направлении.\nНажмите на галочку, чтобы подтвердить разрушение.\n\n[accent]Разрушьте все стены из металлолома слева от вашего ядра.
|
||||||
tutorial.withdraw = В некоторых ситуациях, необходимо забрать предметы из блоков вручную.\nЧтобы сделать это, [accent]нажмите на блок[], когда в нём находятся предметы, затем [accent]нажмите на предмет[] в инвентаре.\nМожно забрать несколько предметов [accent]нажатием с зажимом[].\n\n[accent]Заберите немного меди из ядра[]
|
tutorial.withdraw = В некоторых ситуациях, необходимо забрать предметы из блоков вручную.\nЧтобы сделать это, [accent]нажмите на блок[], когда в нём находятся предметы, затем [accent]нажмите на предмет[] в инвентаре.\nМожно забрать несколько предметов [accent]нажатием с зажимом[].\n\n[accent]Заберите немного меди из ядра[]
|
||||||
tutorial.deposit = Положить предметы в блоки можно перетащив от своего корабля к нужному блоку.\n\n[accent]Перенесите медь обратно в ядро[]
|
tutorial.deposit = Положить предметы в блоки можно перетащив от своего корабля к нужному блоку.\n\n[accent]Перенесите медь обратно в ядро[]
|
||||||
tutorial.waves = [lightgray]Противники[] приближаются.\n\nЗащитите ядро от двух волн.[accent] Нажмите левую кнопку мыши[], чтобы Выстрелить.\nПостройте больше турелей и буров. Добудьте больше меди.
|
tutorial.waves = [lightgray]Противники[] приближаются.\n\nЗащитите ядро от двух волн.[accent] Нажмите левую кнопку мыши[], чтобы выстрелить.\nПостройте больше турелей и буров. Добудьте больше меди.
|
||||||
tutorial.waves.mobile = [lightgray]Противники[] приближаются.\n\nЗащитите ядро от двух волн. Ваш мех будет автоматически атаковать противника.\nПостройте больше турелей и буров. Добудьте больше меди.
|
tutorial.waves.mobile = [lightgray]Противники[] приближаются.\n\nЗащитите ядро от двух волн. Ваш мех будет автоматически атаковать противника.\nПостройте больше турелей и буров. Добудьте больше меди.
|
||||||
tutorial.launch = Когда Вы достигаете некоторых волн, Вы можете осуществить[accent] запуск ядра[], оставив базу и[accent] перенести ресурсы из ядра.[]\nЭти ресурсы могут быть использованы для изучения ноВых технологий.\n\n[accent]Нажмите кнопку запуска.
|
tutorial.launch = Когда Вы достигаете некоторых волн, Вы можете осуществить[accent] запуск ядра[], оставив базу и[accent] перенести ресурсы из ядра.[]\nЭти ресурсы могут быть использованы для изучения новых технологий.\n\n[accent]Нажмите кнопку запуска.
|
||||||
item.copper.description = Самый основной строительный материал. Широко используется во всех типах блоков.
|
item.copper.description = Самый основной строительный материал. Широко используется во всех типах блоков.
|
||||||
item.lead.description = Основной стартоВый материал. Широко используется в электронике и блоках для транспортировки жидкостей.
|
item.lead.description = Основной стартовый материал. Широко используется в электронике и блоках для транспортировки жидкостей.
|
||||||
item.metaglass.description = Сверхпрочный сплав стекла. Широко используется для распределения и хранения жидкости.
|
item.metaglass.description = Сверхпрочный сплав стекла. Широко используется для распределения и хранения жидкости.
|
||||||
item.graphite.description = Минерализованный углерод, используемый для боеприпасов и электроизоляции.
|
item.graphite.description = Минерализованный углерод, используемый для боеприпасов и электроизоляции.
|
||||||
item.sand.description = Обычный материал, который широко используется при Выплавке, как при легировании, так и в качестве отходов.
|
item.sand.description = Обычный материал, который широко используется при выплавке, как при легировании, так и в качестве отходов.
|
||||||
item.coal.description = Окаменелое растительное вещество, образовавшееся задолго до посева. Широко используется для производства топлива и ресурсов.
|
item.coal.description = Окаменелое растительное вещество, образовавшееся задолго до посева. Широко используется для производства топлива и ресурсов.
|
||||||
item.titanium.description = Редкий сверхлёгкий металл, широко используемый для транспортировки жидкостей, буров и авиации.
|
item.titanium.description = Редкий сверхлёгкий металл, широко используемый для транспортировки жидкостей, буров и авиации.
|
||||||
item.thorium.description = Плотный радиоактивный металл, используемый в качестве структурной опоры и ядерного топлива.
|
item.thorium.description = Плотный радиоактивный металл, используемый в качестве структурной опоры и ядерного топлива.
|
||||||
item.scrap.description = Остатки старых сооружений и подразделений. Содержит небольшие количества многих различных металлов.
|
item.scrap.description = Остатки старых сооружений и подразделений. Содержит небольшие количества многих различных металлов.
|
||||||
item.silicon.description = ЧрезВычайно полезный полупроводник. Применяется в солнечных панелях, сложной электронике и самонаводящихся боеприпасах.
|
item.silicon.description = Чрезвычайно полезный полупроводник. Применяется в солнечных панелях, сложной электронике и самонаводящихся боеприпасах.
|
||||||
item.plastanium.description = Лёгкий, пластичный материал, используемый в современных авиационных и осколочных боеприпасах.
|
item.plastanium.description = Лёгкий, пластичный материал, используемый в современных авиационных и осколочных боеприпасах.
|
||||||
item.phase-fabric.description = Практически невесомое вещество, используемое в передовой электронике и технологиях самовосстановления.
|
item.phase-fabric.description = Практически невесомое вещество, используемое в передовой электронике и технологиях самовосстановления.
|
||||||
item.surge-alloy.description = Современный сплав с уникальными электрическими свойствами.
|
item.surge-alloy.description = Современный сплав с уникальными электрическими свойствами.
|
||||||
item.spore-pod.description = Стручок синтетических спор, синтезированных из атмосферных концентраций для промышленных целей. Используется для превращения в нефть, взрывчатые вещества и топливо.
|
item.spore-pod.description = Стручок синтетических спор, синтезированных из атмосферных концентраций для промышленных целей. Используется для превращения в нефть, взрывчатые вещества и топливо.
|
||||||
item.blast-compound.description = Нестабильный соединение, используемый в бомбах и взрывчатых веществах. Синтезируется из стручков спор и других летучих веществ. Использовать в качестве топлива не рекомендуется.
|
item.blast-compound.description = Нестабильный соединение, используемый в бомбах и взрывчатых веществах. Синтезируется из стручков спор и других летучих веществ. Использовать в качестве топлива не рекомендуется.
|
||||||
item.pyratite.description = ЧрезВычайно огнеопасное вещество, используемое в зажигательном оружии.
|
item.pyratite.description = Чрезвычайно огнеопасное вещество, используемое в зажигательном оружии.
|
||||||
liquid.water.description = Самая полезная жидкость. Обычно используется для охлаждения машин и переработки отходов.
|
liquid.water.description = Самая полезная жидкость. Обычно используется для охлаждения машин и переработки отходов.
|
||||||
liquid.slag.description = Всевозможно различные типы расплавленного металла, смешанные вместе. Может быть разделен на составляющие его минералы или распылён на вражеских боеВые единицы в качестве оружия.
|
liquid.slag.description = Всевозможно различные типы расплавленного металла, смешанные вместе. Может быть разделен на составляющие его минералы или распылён на вражеских боевые единицы в качестве оружия.
|
||||||
liquid.oil.description = Жидкость, используемая в производстве современных материалов. Может быть превращена в уголь в качестве топлива или распылён и подожжён как оружие.
|
liquid.oil.description = Жидкость, используемая в производстве современных материалов. Может быть превращена в уголь в качестве топлива или распылён и подожжён как оружие.
|
||||||
liquid.cryofluid.description = Инертная, неедкая жидкость, созданная из воды и титана. Обладает чрезВычайно Высокой пропускной способностью. Широко используется в качестве охлаждающей жидкости.
|
liquid.cryofluid.description = Инертная, неедкая жидкость, созданная из воды и титана. Обладает чрезвычайно высокой пропускной способностью. Широко используется в качестве охлаждающей жидкости.
|
||||||
mech.alpha-mech.description = Стандартный управляемый мех. Основан на «Кинжале», с улучшенной броней и строительными возможностями. Имеет больший урон, чем «Дротик».
|
mech.alpha-mech.description = Стандартный управляемый мех. Основан на «Кинжале», с улучшенной броней и строительными возможностями. Имеет больший урон, чем «Дротик».
|
||||||
mech.delta-mech.description = Быстрый, легко бронированный мех, созданный для ударов «атакуй и беги». Наносит мало урона по строениям, но может очень быстро убить большие группы вражеских орудий с помощью дугоВых молний.
|
mech.delta-mech.description = Быстрый, легко бронированный мех, созданный для ударов «атакуй и беги». Наносит мало урона по строениям, но может очень быстро убить большие группы вражеских орудий с помощью дуговых молний.
|
||||||
mech.tau-mech.description = Мех поддержки. Ремонтирует союзные блоки просто стреляя в них. Может лечить союзников в радиусе его ремонтирующей способности.
|
mech.tau-mech.description = Мех поддержки. Ремонтирует союзные блоки просто стреляя в них. Может лечить союзников в радиусе его ремонтирующей способности.
|
||||||
mech.omega-mech.description = Громоздкий и хорошо бронированный мех, созданный для передоВых атак. Его броня может блокировать до 90% входящего урона.
|
mech.omega-mech.description = Громоздкий и хорошо бронированный мех, созданный для передовых атак. Его броня может блокировать до 90% входящего урона.
|
||||||
mech.dart-ship.description = Стандартный управляемый корабль. Достаточно быстрый и легкий, но мало атакующий и обладает низкой скоростью добычи.
|
mech.dart-ship.description = Стандартный управляемый корабль. Достаточно быстрый и легкий, но мало атакующий и обладает низкой скоростью добычи.
|
||||||
mech.javelin-ship.description = Корабль для тактики «атакуй и беги». Сначала он медленный, но позже может разгоняться до огромных скоростей и летать над аванпостами противника, нанося большой урон молниями и ракетами.
|
mech.javelin-ship.description = Корабль для тактики «атакуй и беги». Сначала он медленный, но позже может разгоняться до огромных скоростей и летать над аванпостами противника, нанося большой урон молниями и ракетами.
|
||||||
mech.trident-ship.description = Тяжёлый бомбардировщик, построенный для строительства и уничтожения вражеских укреплений. Достаточно хорошо бронированный.
|
mech.trident-ship.description = Тяжёлый бомбардировщик, построенный для строительства и уничтожения вражеских укреплений. Достаточно хорошо бронированный.
|
||||||
@@ -917,12 +959,12 @@ mech.glaive-ship.description = Большой хорошо бронирован
|
|||||||
unit.draug.description = Примитивный добывающий дрон. Дёшево производить. Расходуемый. Автоматически добывает медь и свинец в непосредственной близости. Поставляет добытые ресурсы в ближайшее ядро.
|
unit.draug.description = Примитивный добывающий дрон. Дёшево производить. Расходуемый. Автоматически добывает медь и свинец в непосредственной близости. Поставляет добытые ресурсы в ближайшее ядро.
|
||||||
unit.spirit.description = Модифицированный «Драугр», предназначенный для ремонта вместо добычи ресурсов. Автоматически ремонтирует любые поврежденные блоки в области.
|
unit.spirit.description = Модифицированный «Драугр», предназначенный для ремонта вместо добычи ресурсов. Автоматически ремонтирует любые поврежденные блоки в области.
|
||||||
unit.phantom.description = Продвинутый дрон. Следует за пользователями. Помогает в строительстве блоков.
|
unit.phantom.description = Продвинутый дрон. Следует за пользователями. Помогает в строительстве блоков.
|
||||||
unit.dagger.description = Самый основной наземный мех. ДешёВый в производстве. Очень сильный при использовании толпами.
|
unit.dagger.description = Самый основной наземный мех. Дешёвый в производстве. Очень сильный при использовании толпами.
|
||||||
unit.crawler.description = Наземный блок, состоящий из урезанной рамы с Высоким взрывчатым веществом, прикрепленным сверху. Не особо прочный. Взрывается при контакте с врагами.
|
unit.crawler.description = Наземный блок, состоящий из урезанной рамы с высоким взрывчатым веществом, прикрепленным сверху. Не особо прочный. Взрывается при контакте с врагами.
|
||||||
unit.titan.description = Продвинутый, бронированный наземный юнит. Атакует как наземные, так и воздушные цели. Оборудован двумя миниатюрными огнеметами класса «Обжигатель».
|
unit.titan.description = Продвинутый, бронированный наземный юнит. Атакует как наземные, так и воздушные цели. Оборудован двумя миниатюрными огнеметами класса «Обжигатель».
|
||||||
unit.fortress.description = Тяжёлый артиллерийский мех. Оснащен двумя модифицированными пушками типа «Град» для штурма дальних объектов и подразделений противника.
|
unit.fortress.description = Тяжёлый артиллерийский мех. Оснащен двумя модифицированными пушками типа «Град» для штурма дальних объектов и подразделений противника.
|
||||||
unit.eruptor.description = Тяжёлый мех, предназначенный для разрушения строений. Выстреливает поток шлака по вражеским укреплениям, плавит их и поджигает летучие вещества.
|
unit.eruptor.description = Тяжёлый мех, предназначенный для разрушения строений. Выстреливает поток шлака по вражеским укреплениям, плавит их и поджигает летучие вещества.
|
||||||
unit.wraith.description = Быстрый перехватчик. ЦелеВые генераторы энергии.
|
unit.wraith.description = Быстрый перехватчик. Целевые генераторы энергии.
|
||||||
unit.ghoul.description = Тяжёлый ковровой бомбардировщик. Проникает через вражеские структуры, нацеливаясь на критическую инфраструктуру.
|
unit.ghoul.description = Тяжёлый ковровой бомбардировщик. Проникает через вражеские структуры, нацеливаясь на критическую инфраструктуру.
|
||||||
unit.revenant.description = Тяжёлый, парящий массив, который вооружён ракетами.
|
unit.revenant.description = Тяжёлый, парящий массив, который вооружён ракетами.
|
||||||
block.graphite-press.description = Сжимает куски угля в чистые листы графита.
|
block.graphite-press.description = Сжимает куски угля в чистые листы графита.
|
||||||
@@ -942,8 +984,8 @@ block.pulverizer.description = Измельчает металлолом в ме
|
|||||||
block.coal-centrifuge.description = Нефть превращается в куски угля.
|
block.coal-centrifuge.description = Нефть превращается в куски угля.
|
||||||
block.incinerator.description = Выпаривает любой лишний предмет или жидкость, которую он получает.
|
block.incinerator.description = Выпаривает любой лишний предмет или жидкость, которую он получает.
|
||||||
block.power-void.description = Аннулирует всю энергию, введенную в него. Только песочница.
|
block.power-void.description = Аннулирует всю энергию, введенную в него. Только песочница.
|
||||||
block.power-source.description = Бесконечно Выводит энергию. Только песочница.
|
block.power-source.description = Бесконечно вводит энергию. Только песочница.
|
||||||
block.item-source.description = Бесконечно Выводит элементы. Только песочница.
|
block.item-source.description = Бесконечно выводит элементы. Только песочница.
|
||||||
block.item-void.description = Уничтожает любые предметы. Только песочница.
|
block.item-void.description = Уничтожает любые предметы. Только песочница.
|
||||||
block.liquid-source.description = Бесконечно выводит жидкости. Только песочница.
|
block.liquid-source.description = Бесконечно выводит жидкости. Только песочница.
|
||||||
block.copper-wall.description = Дешёвый защитный блок.\nПолезно для защиты ядра и турелей в первые несколько волн.
|
block.copper-wall.description = Дешёвый защитный блок.\nПолезно для защиты ядра и турелей в первые несколько волн.
|
||||||
@@ -963,7 +1005,7 @@ block.mend-projector.description = Обновлённая версия Реге
|
|||||||
block.overdrive-projector.description = Увеличивает скорость близлежащих зданий.\nОпционально использует фазовую ткань для увеличения дальности и эффективности.
|
block.overdrive-projector.description = Увеличивает скорость близлежащих зданий.\nОпционально использует фазовую ткань для увеличения дальности и эффективности.
|
||||||
block.force-projector.description = Создает вокруг себя шестиугольное силовое поле, защищая здания и подразделения внутри от повреждений.\nПерегревается, если слишком много повреждений нанесено. Опционально требуется охлаждающая жидкость для предотвращения перегрева. Фазовая ткань может быть использована для увеличения размера щита.
|
block.force-projector.description = Создает вокруг себя шестиугольное силовое поле, защищая здания и подразделения внутри от повреждений.\nПерегревается, если слишком много повреждений нанесено. Опционально требуется охлаждающая жидкость для предотвращения перегрева. Фазовая ткань может быть использована для увеличения размера щита.
|
||||||
block.shock-mine.description = Наносит урон врагам, наступающим на мину. Почти невидим для врага.
|
block.shock-mine.description = Наносит урон врагам, наступающим на мину. Почти невидим для врага.
|
||||||
block.conveyor.description = БазоВый элемент транспортного блока. Перемещает предметы вперед и автоматически складывает их в блоки. Вращающийся.
|
block.conveyor.description = Базовый элемент транспортного блока. Перемещает предметы вперед и автоматически складывает их в блоки. Вращающийся.
|
||||||
block.titanium-conveyor.description = Расширенный транспортный блок элемента. Перемещает предметы быстрее, чем стандартные конвейеры.
|
block.titanium-conveyor.description = Расширенный транспортный блок элемента. Перемещает предметы быстрее, чем стандартные конвейеры.
|
||||||
block.junction.description = Действует как мост для двух пересекающихся конвейерных лент. Полезно в ситуациях, когда два разных конвейера перевозят разные материалы в разные места.
|
block.junction.description = Действует как мост для двух пересекающихся конвейерных лент. Полезно в ситуациях, когда два разных конвейера перевозят разные материалы в разные места.
|
||||||
block.bridge-conveyor.description = Улучшенный транспортный блок элемента. Позволяет транспортировать предметы по 3 плиткам любой местности или здания.
|
block.bridge-conveyor.description = Улучшенный транспортный блок элемента. Позволяет транспортировать предметы по 3 плиткам любой местности или здания.
|
||||||
@@ -978,11 +1020,11 @@ block.rotary-pump.description = Продвинутый насос. Лучше ч
|
|||||||
block.thermal-pump.description = Наилучший насос.
|
block.thermal-pump.description = Наилучший насос.
|
||||||
block.conduit.description = Основной блок транспортировки жидкости. Перемещает жидкости вперед. Используется совместно с насосами и другими трубопроводами.
|
block.conduit.description = Основной блок транспортировки жидкости. Перемещает жидкости вперед. Используется совместно с насосами и другими трубопроводами.
|
||||||
block.pulse-conduit.description = Расширенный блок транспортировки жидкости. Транспортирует жидкости быстрее и хранит больше, чем стандартные трубопроводы.
|
block.pulse-conduit.description = Расширенный блок транспортировки жидкости. Транспортирует жидкости быстрее и хранит больше, чем стандартные трубопроводы.
|
||||||
block.liquid-router.description = Принимает жидкости из одного направления и Выводит их до 3 других направлений в равной степени. Можно также хранить определенное количество жидкости. Полезно для разделения жидкостей из одного источника на несколько целей.
|
block.liquid-router.description = Принимает жидкости из одного направления и выводит их до 3 других направлений в равной степени. Можно также хранить определенное количество жидкости. Полезно для разделения жидкостей из одного источника на несколько целей.
|
||||||
block.liquid-tank.description = Хранит большое количество жидкости. Используется для создания буферов в ситуациях с непостоянной потребностью в материалах или в качестве защиты для охлаждения жизненно важных блоков.
|
block.liquid-tank.description = Хранит большое количество жидкости. Используется для создания буферов в ситуациях с непостоянной потребностью в материалах или в качестве защиты для охлаждения жизненно важных блоков.
|
||||||
block.liquid-junction.description = Действует как мост для двух пересекающихся каналов. Полезно в ситуациях, когда два разных трубопровода переносят разные жидкости в разные места.
|
block.liquid-junction.description = Действует как мост для двух пересекающихся каналов. Полезно в ситуациях, когда два разных трубопровода переносят разные жидкости в разные места.
|
||||||
block.bridge-conduit.description = Расширенный блок транспортировки жидкости. Позволяет транспортировать жидкости до 3 плиток любой местности или здания.
|
block.bridge-conduit.description = Расширенный блок транспортировки жидкости. Позволяет транспортировать жидкости до 3 плиток любой местности или здания.
|
||||||
block.phase-conduit.description = Расширенный блок транспортировки жидкости. Использует энергию для телепортации жидкостей в подключенный фазоВый канал по нескольким плиткам.
|
block.phase-conduit.description = Расширенный блок транспортировки жидкости. Использует энергию для телепортации жидкостей в подключенный фазовый канал по нескольким плиткам.
|
||||||
block.power-node.description = Передает питание на подключенные узлы. Узел будет получать питание или поставлять питание на любые соседние блоки.
|
block.power-node.description = Передает питание на подключенные узлы. Узел будет получать питание или поставлять питание на любые соседние блоки.
|
||||||
block.power-node-large.description = Усовершенствованный силовой узел с большей дальностью и большим количеством соединений.
|
block.power-node-large.description = Усовершенствованный силовой узел с большей дальностью и большим количеством соединений.
|
||||||
block.surge-tower.description = Очень дальний узел питания с меньшим количеством доступных соединений.
|
block.surge-tower.description = Очень дальний узел питания с меньшим количеством доступных соединений.
|
||||||
@@ -997,12 +1039,12 @@ block.solar-panel.description = Обеспечивает небольшое ко
|
|||||||
block.solar-panel-large.description = Значительно более эффективный вариант стандартной солнечной панели.
|
block.solar-panel-large.description = Значительно более эффективный вариант стандартной солнечной панели.
|
||||||
block.thorium-reactor.description = Генерирует значительное количество энергии из тория. Требует постоянного охлаждения. Сильно взорвётся при недостаточном количестве охлаждающей жидкости. Выходная энергия зависит от наполненности, при этом базовая энергия генерируется на полную мощность.
|
block.thorium-reactor.description = Генерирует значительное количество энергии из тория. Требует постоянного охлаждения. Сильно взорвётся при недостаточном количестве охлаждающей жидкости. Выходная энергия зависит от наполненности, при этом базовая энергия генерируется на полную мощность.
|
||||||
block.impact-reactor.description = Усовершенствованный генератор, способный создавать огромное количество энергии с максимальной эффективностью. Требуется значительное количество энергии для запуска процесса.
|
block.impact-reactor.description = Усовершенствованный генератор, способный создавать огромное количество энергии с максимальной эффективностью. Требуется значительное количество энергии для запуска процесса.
|
||||||
block.mechanical-drill.description = ДешёВый бур. При размещении на соответствующих плитках медленные предметы Выводятся бесконечно. Способен добывать только медь, свинец и уголь.
|
block.mechanical-drill.description = ДешёВый бур. При размещении на соответствующих плитках медленные предметы выводятся бесконечно. Способен добывать только медь, свинец и уголь.
|
||||||
block.pneumatic-drill.description = Улучшенный бур, способная добывать титан. Добывает в более быстром темпе, чем механический бур.
|
block.pneumatic-drill.description = Улучшенный бур, способная добывать титан. Добывает в более быстром темпе, чем механический бур.
|
||||||
block.laser-drill.description = Позволяет сверлить еще быстрее с помощью лазерной технологии, но требует энергии. Способен добывать торий.
|
block.laser-drill.description = Позволяет сверлить еще быстрее с помощью лазерной технологии, но требует энергии. Способен добывать торий.
|
||||||
block.blast-drill.description = Конечный бур. Требует большого количества энергии.
|
block.blast-drill.description = Конечный бур. Требует большого количества энергии.
|
||||||
block.water-extractor.description = Выкачивает подземные воды. Используется в местах, где нет поверхностных вод.
|
block.water-extractor.description = Выкачивает подземные воды. Используется в местах, где нет поверхностных вод.
|
||||||
block.cultivator.description = Выращивает крошечные концентрации спор в атмосфере в готоВые к употреблению споры.
|
block.cultivator.description = Выращивает крошечные концентрации спор в атмосфере в готовые к употреблению споры.
|
||||||
block.oil-extractor.description = Использует большое количество энергии, песка и воды для бурения на нефть.
|
block.oil-extractor.description = Использует большое количество энергии, песка и воды для бурения на нефть.
|
||||||
block.core-shard.description = Первая итерация капсулы ядра. После уничтожения весь контакт с регионом теряется. Не позволяйте этому случиться.
|
block.core-shard.description = Первая итерация капсулы ядра. После уничтожения весь контакт с регионом теряется. Не позволяйте этому случиться.
|
||||||
block.core-foundation.description = Вторая версия ядра. Лучше бронированное. Хранит больше ресурсов.
|
block.core-foundation.description = Вторая версия ядра. Лучше бронированное. Хранит больше ресурсов.
|
||||||
@@ -1038,7 +1080,7 @@ block.crawler-factory.description = Производит быстрых само
|
|||||||
block.titan-factory.description = Производит продвинутые бронированне боевые единицы.
|
block.titan-factory.description = Производит продвинутые бронированне боевые единицы.
|
||||||
block.fortress-factory.description = Производит тяжёлые артиллерийские боевые единицы.
|
block.fortress-factory.description = Производит тяжёлые артиллерийские боевые единицы.
|
||||||
block.repair-point.description = Непрерывно лечит ближайший поврежденную боевую единицу или мех, находящийся рядом.
|
block.repair-point.description = Непрерывно лечит ближайший поврежденную боевую единицу или мех, находящийся рядом.
|
||||||
block.dart-mech-pad.description = Обеспечивает превращение в базоВый атакующий мех. \nИспользуйте, нажав, стоя на нём.
|
block.dart-mech-pad.description = Обеспечивает превращение в базовый атакующий мех. \nИспользуйте, нажав, стоя на нём.
|
||||||
block.delta-mech-pad.description = Обеспечивает превращение в легкобронированный атакующий мех.\nИспользуйте, нажав, стоя на нём.
|
block.delta-mech-pad.description = Обеспечивает превращение в легкобронированный атакующий мех.\nИспользуйте, нажав, стоя на нём.
|
||||||
block.tau-mech-pad.description = Обеспечивает превращение в улучшенный мех поддержки.\nИспользуйте, нажав, стоя на нём.
|
block.tau-mech-pad.description = Обеспечивает превращение в улучшенный мех поддержки.\nИспользуйте, нажав, стоя на нём.
|
||||||
block.omega-mech-pad.description = Обеспечивает превращение в тяжелобронированный ракетный мех.\nИспользуйте, нажав, стоя на нём.
|
block.omega-mech-pad.description = Обеспечивает превращение в тяжелобронированный ракетный мех.\nИспользуйте, нажав, стоя на нём.
|
||||||
|
|||||||
@@ -16,11 +16,11 @@ screenshot.invalid = Harita çok büyük, ekran görüntüsü için potansiyel o
|
|||||||
gameover = Kaybettin
|
gameover = Kaybettin
|
||||||
gameover.pvp = [accent] {0}[] Takımı kazandı!
|
gameover.pvp = [accent] {0}[] Takımı kazandı!
|
||||||
highscore = [accent]Yeni rekor!
|
highscore = [accent]Yeni rekor!
|
||||||
load.sound = Sounds
|
load.sound = Sesler
|
||||||
load.map = Maps
|
load.map = Haritalar
|
||||||
load.image = Images
|
load.image = Resimler
|
||||||
load.content = Content
|
load.content = İçerik
|
||||||
load.system = System
|
load.system = Sistem
|
||||||
stat.wave = Yenilen Dalgalar:[accent] {0}
|
stat.wave = Yenilen Dalgalar:[accent] {0}
|
||||||
stat.enemiesDestroyed = Yok Edilen Düşmanlar:[accent] {0}
|
stat.enemiesDestroyed = Yok Edilen Düşmanlar:[accent] {0}
|
||||||
stat.built = İnşa Edilen Yapılar:[accent] {0}
|
stat.built = İnşa Edilen Yapılar:[accent] {0}
|
||||||
@@ -35,7 +35,7 @@ level.select = Seviye Seçimi
|
|||||||
level.mode = Oyun Modu:
|
level.mode = Oyun Modu:
|
||||||
showagain = Bir daha gösterme
|
showagain = Bir daha gösterme
|
||||||
coreattack = < Çekirdek saldırı altında! >
|
coreattack = < Çekirdek saldırı altında! >
|
||||||
nearpoint = [[ [scarlet]İNİŞ PİSTİNDEN AYRIL[] ]\nimha riski yüksek
|
nearpoint = [[ [scarlet]İNİŞ PİSTİNDEN AYRIL[] ]\nimha tehlikesi
|
||||||
database = Çekirdek Veritabanı
|
database = Çekirdek Veritabanı
|
||||||
savegame = Oyunu Kaydet
|
savegame = Oyunu Kaydet
|
||||||
loadgame = Oyunu Yükle
|
loadgame = Oyunu Yükle
|
||||||
@@ -49,8 +49,17 @@ close = Kapat
|
|||||||
website = Website
|
website = Website
|
||||||
quit = Çık
|
quit = Çık
|
||||||
maps = Haritalar
|
maps = Haritalar
|
||||||
|
maps.browse = Haritaları gör
|
||||||
continue = Devam et
|
continue = Devam et
|
||||||
maps.none = [lightgray]Harita Bulunamadı!
|
maps.none = [lightgray]Harita Bulunamadı!
|
||||||
|
invalid = Invalid
|
||||||
|
preparingconfig = Yapılandırma Hazırlanıyor
|
||||||
|
preparingcontent = İçerik Hazırlanıyor
|
||||||
|
uploadingcontent = İçerik Yükleniyor
|
||||||
|
uploadingpreviewfile = Önizleme Dosyası Yükleniyor
|
||||||
|
committingchanges = Değişiklikler Uygulanıyor
|
||||||
|
done = Bittti
|
||||||
|
|
||||||
about.button = Hakkında
|
about.button = Hakkında
|
||||||
name = İsim:
|
name = İsim:
|
||||||
noname = Bir[accent] kullanıcı adı[] seçmelisin.
|
noname = Bir[accent] kullanıcı adı[] seçmelisin.
|
||||||
@@ -58,113 +67,118 @@ filename = Dosya Adı:
|
|||||||
unlocked = Yeni içerik açıldı!
|
unlocked = Yeni içerik açıldı!
|
||||||
completed = [accent]Tamamlandı
|
completed = [accent]Tamamlandı
|
||||||
techtree = Yetenek Ağacı
|
techtree = Yetenek Ağacı
|
||||||
research.list = [lightgray]Araştır:
|
research.list = [lightgray]Araştırmalar:
|
||||||
research = Araştır
|
research = Araştır
|
||||||
researched = [lightgray]{0} Araştırıldı.
|
researched = [lightgray]{0} Araştırıldı.
|
||||||
players = {0} oyuncu çevrimiçi
|
players = {0} çevrimiçi oyuncu
|
||||||
players.single = {0} oyuncu çevrimiçi
|
players.single = {0} çevrimiçi oyuncu
|
||||||
server.closing = [accent]Sunucu kapanıyor...
|
server.closing = [accent]Sunucu kapatılıyor...
|
||||||
|
server.kicked.whitelist = Beyaz listede değilsin.
|
||||||
server.kicked.kick = Sunucudan atıldın!
|
server.kicked.kick = Sunucudan atıldın!
|
||||||
server.kicked.serverClose = Sunucu kapandı.
|
server.kicked.serverClose = Sunucu kapandı.
|
||||||
server.kicked.vote = You have been vote-kicked. Goodbye.
|
server.kicked.vote = Oylama ile atıldın. Görüşürüz.
|
||||||
server.kicked.clientOutdated = Geçersiz sürüm! Oyununu güncelle!
|
server.kicked.clientOutdated = Eski sürüm! Oyununu güncelle!
|
||||||
server.kicked.serverOutdated = Geçersiz sunucu!\nKurucudan oyununu güncellemesini iste!
|
server.kicked.serverOutdated = Geçersiz sunucu!\nKurucudan oyununu güncellemesini iste!
|
||||||
server.kicked.banned = Bu sunucudan yasaklandın.
|
server.kicked.banned = Bu sunucudan yasaklandın.
|
||||||
server.kicked.typeMismatch = This server is not compatible with your build type.
|
server.kicked.typeMismatch = Bu sunucu senin inşa türünle uyumlu değil.
|
||||||
server.kicked.recentKick = Yakın bir zamanda bir sunucudan atıldın.\nBağlanmadan önce biraz bekle.
|
server.kicked.playerLimit = Sunucu dolu. Yer açılmasını bekle.
|
||||||
|
server.kicked.recentKick = Yakın bir zamanda bir sunucudan atıldın.\nBağlanmadan önce bir süre bekle.
|
||||||
server.kicked.nameInUse = Sunucuda zaten o isimde biri var.
|
server.kicked.nameInUse = Sunucuda zaten o isimde biri var.
|
||||||
server.kicked.nameEmpty = İsmin geçersiz.
|
server.kicked.nameEmpty = Seçtiğin isim geçersiz.
|
||||||
server.kicked.idInUse = Zaten bu sunucudasın! İki hesapla bir sunucuya bağlanamazsın.
|
server.kicked.idInUse = Zaten bu sunucudasın! İki hesapla bir sunucuya bağlanamazsın.
|
||||||
server.kicked.customClient = Bu sunucu özel sürümleri kabul etmiyor. Resmi bir sürüm indir.
|
server.kicked.customClient = Bu sunucu özel sürümleri kabul etmiyor. Resmi bir sürüm indir.
|
||||||
server.kicked.gameover = Game over!
|
server.kicked.gameover = Oyun bitti!
|
||||||
server.versions = Senin versiyon:[accent] {0}[]\nSunucunun versiyonu:[accent] {1}[]
|
server.versions = Kullandığın surum:[accent] {0}[]\nSunucunun sürümü:[accent] {1}[]
|
||||||
host.info = The [accent]host[] button hosts a server on port [scarlet]6567[]. \nAnybody on the same [lightgray]wifi or local network[] should be able to see your server in their server list.\n\nIf you want people to be able to connect from anywhere by IP, [accent]port forwarding[] is required.\n\n[lightgray]Note: If someone is experiencing trouble connecting to your LAN game, make sure you have allowed Mindustry access to your local network in your firewall settings. Note that public networks sometimes do not allow server discovery.
|
host.info = [accent]host[], [scarlet]6567[] portunda bir sunucuya ev sahipliği yapıyor. \nAynı [lightgray]wifi veya yerel ağdaki[] herkes sunucu listelerinde senin sunucunu görebiliyor olmalı.\n\nEğer diğerlerinin herhangi bir yerden IP ile bağlanabilmesini istiyorsan [accent]port yönlendirmesi[] gerekli.\n\n[lightgray]Not: Eğer birisi senin yerel ağ oyununa katılmakta sorun yaşıyorsa güvenlik duvarı ayarlarında Mindustry'ye yerel ağ bağlantısı izni verdiğinden emin olun. Halka açık ağların zaman zaman sunucu aramaya engel olduğunu unutmayın.
|
||||||
join.info = 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 = Burada, bağlanmak istediğin sunucunun [accent]IP[] adresini girebilir veya [accent]yerel ağ[] sunucularını görebilirsin..\nHem yerel ağ hem de geniş alan ağı çoklu oyuncu için destekleniyor.\n\n[lightgray]Not: Otomatik bir global sunucu listesi yok; eğer birisine IP adresi kullanarak bağlanmak istiyorsan IP adresini istemelisin.
|
||||||
hostserver = Çok Oyunculu Oyun Aç
|
hostserver = Çok Oyunculu Oyun Aç
|
||||||
hostserver.mobile = Oyun\nKur
|
hostserver.mobile = Oyun\nKur
|
||||||
host = Kur
|
host = Kur
|
||||||
hosting = [accent]Sunucu açılıyor...
|
hosting = [accent]Sunucu açılıyor...
|
||||||
hosts.refresh = Yenile
|
hosts.refresh = Yenile
|
||||||
hosts.discovering = LAN oyunu aranıyor
|
hosts.discovering = Yerel ağ oyunu aranıyor
|
||||||
server.refreshing = Sunucular yenileniyor
|
server.refreshing = Sunucu yenileniyor
|
||||||
hosts.none = [lightgray]LAN oyunu bulunamadı!
|
hosts.none = [lightgray]Yerel oyun bulunamadı!
|
||||||
host.invalid = [scarlet]Kurucuya bağlanılamıyor.
|
host.invalid = [scarlet]Kurucuya bağlanılamıyor.
|
||||||
trace = Oyuncuyu takip et
|
trace = Oyuncuyu Takip Et
|
||||||
trace.playername = Oyuncu İsmi: [accent]{0}
|
trace.playername = Oyuncu İsmi: [accent]{0}
|
||||||
trace.ip = IP: [accent]{0}
|
trace.ip = IP: [accent]{0}
|
||||||
trace.id = Özel ID: [accent]{0}
|
trace.id = Özel ID: [accent]{0}
|
||||||
trace.mobile = Mobil Sürüm: [accent]{0}
|
trace.mobile = Mobil Sürüm: [accent]{0}
|
||||||
trace.modclient = Özel Sürüm: [accent]{0}
|
trace.modclient = Özel Sürüm: [accent]{0}
|
||||||
invalidid = Geçersiz Sürüm ID'si! Bir hata raporu gönder.
|
invalidid = Geçersiz Sürüm ID'si! Bir hata raporu gönder.
|
||||||
server.bans = Yasaklar
|
server.bans = Yasaklılar
|
||||||
server.bans.none = Yasaklanmış oyuncu bulunamadı!
|
server.bans.none = Yasaklanmış oyuncu bulunamadı!
|
||||||
server.admins = Yetkililer
|
server.admins = Yönetici
|
||||||
server.admins.none = Yetkili bulunamadı!
|
server.admins.none = Yönetici bulunamadı!
|
||||||
server.add = Add Server
|
server.add = Sunucu Ekle
|
||||||
server.delete = Are you sure you want to delete this server?
|
server.delete = Bu sunucuyu silmek istediğine emin misin?
|
||||||
server.edit = Edit Server
|
server.edit = Sunucuyu Düzenle
|
||||||
server.outdated = [crimson]Outdated Server![]
|
server.outdated = [crimson]Güncel Olmayan Sunucu![]
|
||||||
server.outdated.client = [crimson]Outdated Client![]
|
server.outdated.client = [crimson]Güncel Olmayan Sürüm![]
|
||||||
server.version = [gray]v{0} {1}
|
server.version = [gray]v{0} {1}
|
||||||
server.custombuild = [yellow]Custom Build
|
server.custombuild = [yellow]Özel Sürüm
|
||||||
confirmban = Are you sure you want to ban this player?
|
confirmban = Bu kullanıcıyı yasaklamak istediğine emin misin?confirmkick = Bu kullanıcıyı atmak istediğine emin misin?
|
||||||
confirmkick = Are you sure you want to kick this player?
|
confirmunban = Bu kullanıcının yasağını kaldırmak istediğine emin misin?
|
||||||
confirmunban = Are you sure you want to unban this player?
|
confirmadmin = Bu kullanıcıyı bir yönetici yapmak istediğine emin misin?
|
||||||
confirmadmin = Are you sure you want to make this player an admin?
|
confirmunadmin = Bu kullanıcının yönetici yetkilerini almak istediğine istediğine emin misin?
|
||||||
confirmunadmin = Are you sure you want to remove admin status from this player?
|
joingame.title = Oyuna Katıl
|
||||||
joingame.title = Join Game
|
joingame.ip = Adres:
|
||||||
joingame.ip = Address:
|
disconnect = Bağlantı kesildi.
|
||||||
disconnect = Disconnected.
|
disconnect.error = Bağlantı hatası.
|
||||||
disconnect.data = Failed to load world data!
|
disconnect.closed = Bağlantı kapatıldı.
|
||||||
connecting = [accent]Connecting...
|
disconnect.timeout = Zaman aşımı.
|
||||||
connecting.data = [accent]Loading world data...
|
disconnect.data = Dünya verisi yüklenemedi!
|
||||||
|
connecting = [accent]Bağlanılıyor...
|
||||||
|
connecting.data = [accent]Dünya verisi yükleniyor...
|
||||||
server.port = Port:
|
server.port = Port:
|
||||||
server.addressinuse = Address already in use!
|
server.addressinuse = Adres zaten kullanılıyor!
|
||||||
server.invalidport = Invalid port number!
|
server.invalidport = Geçersiz port sayısı!
|
||||||
server.error = [crimson]Error hosting server: [accent]{0}
|
server.error = [crimson]Sunucu kurulamadı: [accent]{0}
|
||||||
save.old = This save is for an older version of the game, and can no longer be used.\n\n[lightgray]Save backwards compatibility will be implemented in the full 4.0 release.
|
save.old = Bu kayıt oyunun eski bir sürümü için ve artık kullanılamaz.\n\n[lightgray]Tam 4.0 sürümü yayınlandığında geri kayıt özelliği eklenecek.
|
||||||
save.new = New Save
|
save.new = Yeni kayıt
|
||||||
save.overwrite = Are you sure you want to overwrite\nthis save slot?
|
save.overwrite = Bu kayıdın üstüne yazmak istediğine\nemin misin?
|
||||||
overwrite = Overwrite
|
overwrite = Üstüne yaz
|
||||||
save.none = No saves found!
|
save.none = Kayıt bulunamadı!
|
||||||
saveload = Saving...
|
saveload = Kaydediliyor...
|
||||||
savefail = Failed to save game!
|
savefail = Oyun kaydedilemedi!
|
||||||
save.delete.confirm = Are you sure you want to delete this save?
|
save.delete.confirm = Bu kaydı silmek istediğine emin misin?
|
||||||
save.delete = Delete
|
save.delete = Sil
|
||||||
save.export = Export Save
|
save.export = Kayıdı Dışa Aktar
|
||||||
save.import.invalid = [accent]This save is invalid!
|
save.import.invalid = [accent]Bu kayıt geçersiz!
|
||||||
save.import.fail = [crimson]Failed to import save: [accent]{0}
|
save.import.fail = [crimson]Kayıt içe aktarılamadı: [accent]{0}
|
||||||
save.export.fail = [crimson]Failed to export save: [accent]{0}
|
save.export.fail = [crimson]Kayıt dışa aktarılamadı: [accent]{0}
|
||||||
save.import = Import Save
|
save.import = Kayıdı İçe Aktar
|
||||||
save.newslot = Save name:
|
save.newslot = İsmi kaydet:
|
||||||
save.rename = Rename
|
save.rename = Yeniden isimlendir
|
||||||
save.rename.text = New name:
|
save.rename.text = Yeni isim:
|
||||||
selectslot = Select a save.
|
selectslot = Bir kayıt seçin.
|
||||||
slot = [accent]Slot {0}
|
slot = [accent]Slot {0}
|
||||||
save.corrupted = [accent]Save file corrupted or invalid!\nIf you have just updated your game, this is probably a change in the save format and [scarlet]not[] a bug.
|
save.corrupted = [accent]Kayıt dosyası bozuk veya geçersiz!\nEğer oyununuzu kısa süre öce güncellediyseniz bu, kayıt formatındaki bir değişiklik. Bir hata [scarlet]değil[].
|
||||||
empty = <empty>
|
empty = <boş>
|
||||||
on = On
|
on = Aç
|
||||||
off = Off
|
off = Kapa
|
||||||
save.autosave = Autosave: {0}
|
save.autosave = Otomatk kayıt: {0}
|
||||||
save.map = Map: {0}
|
save.map = Harita: {0}
|
||||||
save.wave = Wave {0}
|
save.wave = Dalga {0}
|
||||||
save.difficulty = Difficulty: {0}
|
save.mode = Oyun modu: {0}
|
||||||
save.date = Last Saved: {0}
|
save.difficulty = Zorluk: {0}
|
||||||
save.playtime = Playtime: {0}
|
save.date = Son Kayıt: {0}
|
||||||
warning = Warning.
|
save.playtime = Oynama süresi: {0}
|
||||||
confirm = Confirm
|
warning = Uyarı.
|
||||||
delete = Delete
|
confirm = Doğrula
|
||||||
|
delete = Sil
|
||||||
ok = OK
|
ok = OK
|
||||||
open = Open
|
open = Aç
|
||||||
customize = Customize Rules
|
customize = Kuralları Özelleştir
|
||||||
cancel = Cancel
|
cancel = İptal
|
||||||
openlink = Open Link
|
openlink = Bağlantıyı Aç
|
||||||
copylink = Copy Link
|
copylink = Bağlantıyı Kopyala
|
||||||
back = Back
|
back = Geri
|
||||||
data.export = Export Data
|
data.export = Veriyi Dışa Aktar
|
||||||
data.import = Import Data
|
data.import = Veriyi İçe Aktar
|
||||||
data.exported = Data exported.
|
data.exported = Veri dışa aktarıldı.
|
||||||
data.invalid = This isn't valid game data.
|
data.invalid = Bu oyun verisi geçerli değil.
|
||||||
data.import.confirm = Importing external data will erase[scarlet] all[] your current game data.\n[accent]This cannot be undone![]\n\nOnce the data is imported, your game will exit immediately.
|
data.import.confirm = Importing external data will erase[scarlet] all[] your current game data.\n[accent]This cannot be undone![]\n\nOnce the data is imported, your game will exit immediately.
|
||||||
classic.export = Export Classic Data
|
classic.export = Export Classic Data
|
||||||
classic.export.text = [accent]Mindustry[] has just had a major update.\nClassic (v3.5 build 40) save or map data has been detected. Would you like to export these saves to your phone's home folder, for use in the Mindustry Classic app?
|
classic.export.text = [accent]Mindustry[] has just had a major update.\nClassic (v3.5 build 40) save or map data has been detected. Would you like to export these saves to your phone's home folder, for use in the Mindustry Classic app?
|
||||||
|
|||||||
@@ -1,33 +1,36 @@
|
|||||||
credits.text = Створив [ROYAL]Anuken[] — [SKY]anukendev@gmail.com[]\n\nЄ питання по грі або проблеми з перекладом?\nЙдіть в офіційний сервер discord Mindustry у канал #український.\nПерекладач: [blue]Prosta4ok_ua[green]#[yellow]6336
|
credits.text = Створив [ROYAL]Anuken[] — [SKY]anukendev@gmail.com[]\n\nЄ питання по грі або проблеми з перекладом?\nЙдіть в офіційний сервер discord Mindustrу\nу канал #український.\nПерекладач: [blue]Prosta4ok_ua[green]#[yellow]6336
|
||||||
credits = Творці
|
credits = Творці
|
||||||
contributors = Перекладачі та помічники
|
contributors = Перекладачі та помічники
|
||||||
discord = Приєднуйтесь до нашого Discord!
|
discord = Приєднуйтесь до Mindustry Discord!
|
||||||
link.discord.description = Офіційний Discord-сервер Mindustry
|
link.discord.description = Офіційний Discord-сервер Mindustry
|
||||||
link.github.description = Вихідний код гри
|
link.github.description = Вихідний код гри
|
||||||
link.changelog.description = Список змін
|
link.changelog.description = Список змін
|
||||||
link.dev-builds.description = Нестабільні версії
|
link.dev-builds.description = Нестабільні версії
|
||||||
link.trello.description = Офіційна дошка Trello для запланованих функцій
|
link.trello.description = Офіційна дошка Trello для запланованих функцій
|
||||||
link.itch.io.description = Завантаж гру на Itch.io
|
link.itch.io.description = Itch.io сторінка, на якій можна завантажити гру
|
||||||
link.google-play.description = Скачати для Android з Google Play
|
link.google-play.description = Завантажити для Android з Google Play
|
||||||
link.wiki.description = Офіційна вікі
|
link.wiki.description = Офіційна Mindustry wiki
|
||||||
linkfail = Не вдалося відкрити посилання!\nURL-адреса була скопійована у буфер обміну.
|
linkfail = Не вдалося відкрити посилання!\nURL-адреса скопійована в буфер обміну.
|
||||||
screenshot = Зняток мапи збережено у {0}
|
screenshot = Зняток мапи збережено в {0}
|
||||||
screenshot.invalid = Мапа занадто велика, тому, мабуть, не вистачає пам’яті для знятку екрана.
|
screenshot.invalid = Мапа занадто велика, тому, мабуть, не вистачає пам’яті для знятку мапи.
|
||||||
gameover = Гру закінчено
|
gameover = Гра завершена
|
||||||
gameover.pvp = [accent] {0}[] команда перемогла!
|
gameover.pvp = [accent] {0}[] команда перемогла!
|
||||||
highscore = [YELLOW]Новий рекорд!
|
highscore = [YELLOW]Новий рекорд!
|
||||||
|
|
||||||
load.sound = Звуки
|
load.sound = Звуки
|
||||||
load.map = Мапи
|
load.map = Мапи
|
||||||
load.image = Зображення
|
load.image = Зображення
|
||||||
load.content = Зміст
|
load.content = Зміст
|
||||||
load.system = Система
|
load.system = Система
|
||||||
|
|
||||||
stat.wave = Хвиль відбито:[accent] {0}
|
stat.wave = Хвиль відбито:[accent] {0}
|
||||||
stat.enemiesDestroyed = Ворогів вбито:[accent] {0}
|
stat.enemiesDestroyed = Ворогів знищено:[accent] {0}
|
||||||
stat.built = Будівель збудувано:[accent] {0}
|
stat.built = Будівель збудувано:[accent] {0}
|
||||||
stat.destroyed = Будівель знищено:[accent] {0}
|
stat.destroyed = Будівель знищено:[accent] {0}
|
||||||
stat.deconstructed = Будівель декоструйовано[accent] {0}
|
stat.deconstructed = Будівель декоструйовано[accent] {0}
|
||||||
stat.delivered = Ресурсів видобуто:
|
stat.delivered = Ресурсів запущено:
|
||||||
stat.rank = Фінальний рахунок: [accent]{0}
|
stat.rank = Фінальний рахунок: [accent]{0}
|
||||||
|
|
||||||
launcheditems = [accent]Запущені предмети
|
launcheditems = [accent]Запущені предмети
|
||||||
map.delete = Ви впевнені, що хочете видалити мапу «[accent]{0}[]»?
|
map.delete = Ви впевнені, що хочете видалити мапу «[accent]{0}[]»?
|
||||||
level.highscore = Рекорд: [accent]{0}
|
level.highscore = Рекорд: [accent]{0}
|
||||||
@@ -35,27 +38,36 @@ level.select = Вибір мапи
|
|||||||
level.mode = Режим гри:
|
level.mode = Режим гри:
|
||||||
showagain = Не показувати знову до наступного сеансу
|
showagain = Не показувати знову до наступного сеансу
|
||||||
coreattack = < Ядро знаходиться під атакою! >
|
coreattack = < Ядро знаходиться під атакою! >
|
||||||
nearpoint = [[ [scarlet]ЗАЛИШТЕ ЦЮ ЗОНУ НЕГАЙНО[] ]\nАннігіляція неминуча.
|
nearpoint = [[ [scarlet]ЗАЛИШТЕ ЗОНУ ВИСАДКИ НЕГАЙНО[] ]\nАннігіляція неминуча.
|
||||||
database = База даних ядра
|
database = База даних ядра
|
||||||
savegame = Зберегти гру
|
savegame = Зберегти гру
|
||||||
loadgame = Завантажити гру
|
loadgame = Завантажити гру
|
||||||
joingame = Мережева гра
|
joingame = Мережева гра
|
||||||
addplayers = Дод./Видалити гравців
|
addplayers = Додати/Видалити гравців
|
||||||
customgame = Користувальницька гра
|
customgame = Користувацька гра
|
||||||
newgame = Нова гра
|
newgame = Нова гра
|
||||||
none = <нічого>
|
none = <нічого>
|
||||||
minimap = Міні-мапа
|
minimap = Мінімапа
|
||||||
close = Закрити
|
close = Закрити
|
||||||
website = Веб-сайт
|
website = Веб-сайт
|
||||||
quit = Вихід
|
quit = Вихід
|
||||||
maps = Мапи
|
maps = Мапи
|
||||||
|
maps.browse = Перегляд мап
|
||||||
continue = Продовжити
|
continue = Продовжити
|
||||||
maps.none = [lightgray]Мап не знайдено!
|
maps.none = [lightgray]Мап не знайдено!
|
||||||
|
invalid = Недійсне
|
||||||
|
preparingconfig = Підготовка конфігурації
|
||||||
|
preparingcontent = Підготовка вмісту
|
||||||
|
uploadingcontent = Вивантаження вмісту
|
||||||
|
uploadingpreviewfile = Вивантаження файлу передперегляду
|
||||||
|
committingchanges = Здійснення змін
|
||||||
|
done = Зроблено
|
||||||
|
|
||||||
about.button = Про гру
|
about.button = Про гру
|
||||||
name = Ім’я:
|
name = Ім’я:
|
||||||
noname = Спочатку придумайте[accent] собі ім’я[].
|
noname = Спочатку придумайте[accent] собі ім’я[].
|
||||||
filename = Ім’я файлу:
|
filename = Ім’я файлу:
|
||||||
unlocked = Новий контент розблоковано!
|
unlocked = Доступний новий вміст!
|
||||||
completed = [accent]Завершено
|
completed = [accent]Завершено
|
||||||
techtree = Дерево технологій
|
techtree = Дерево технологій
|
||||||
research.list = [lightgray]Дослідження:
|
research.list = [lightgray]Дослідження:
|
||||||
@@ -65,22 +77,24 @@ players = Гравців на сервері: {0}
|
|||||||
players.single = {0} гравець на сервері
|
players.single = {0} гравець на сервері
|
||||||
server.closing = [accent]Закриття серверу…
|
server.closing = [accent]Закриття серверу…
|
||||||
server.kicked.kick = Ви були вигнані з сервера!
|
server.kicked.kick = Ви були вигнані з сервера!
|
||||||
|
server.kicked.whitelist = Ви не в білому спискі сервері.
|
||||||
server.kicked.serverClose = Сервер закрито.
|
server.kicked.serverClose = Сервер закрито.
|
||||||
server.kicked.vote = You have been vote-kicked. Goodbye.
|
server.kicked.vote = Вас було вигнано із сервера за допомогою голосування. Прощавайте.
|
||||||
server.kicked.clientOutdated = Застарілий клієнт! Оновіть свою гру!
|
server.kicked.clientOutdated = Застарілий клієнт! Оновіть свою гру!
|
||||||
server.kicked.serverOutdated = Застарілий сервер! Попросіть адміністратора серверу оновити сервер/гру!
|
server.kicked.serverOutdated = Застарілий сервер! Попросіть адміністратора серверу оновити сервер/гру!
|
||||||
server.kicked.banned = Ви заблоковані на цьому сервері.
|
server.kicked.banned = Ви заблоковані на цьому сервері.
|
||||||
server.kicked.typeMismatch = This server is not compatible with your build type.
|
server.kicked.typeMismatch = Цей сервер не сумісний з вашим типом збірки.
|
||||||
server.kicked.recentKick = Нещодавно Вас вигнали. \nПочекайте трохи перед наступним підключенням.
|
server.kicked.playerLimit = Цей сервер — заповнений. Дочекайтесь вільного слота.
|
||||||
|
server.kicked.recentKick = Нещодавно вас вигнали. \nПочекайте трохи перед наступним підключенням.
|
||||||
server.kicked.nameInUse = На цьому сервері є хтось з таким ім’ям.
|
server.kicked.nameInUse = На цьому сервері є хтось з таким ім’ям.
|
||||||
server.kicked.nameEmpty = Ваше ім’я має містити принаймні один символ або цифру.
|
server.kicked.nameEmpty = Ваше ім’я має містити принаймні один символ або цифру.
|
||||||
server.kicked.idInUse = Ви вже на цьому сервері! Підключення двох облікових записів не допускається.
|
server.kicked.idInUse = Ви вже на цьому сервері! Підключення двох облікових записів не дозволяється.
|
||||||
server.kicked.customClient = Цей сервер не підтримує користувальницькі збірки. Завантажте офіційну версію.
|
server.kicked.customClient = Цей сервер не підтримує користувацькі збірки. Завантажте офіційну версію.
|
||||||
server.kicked.gameover = Гра завершена!
|
server.kicked.gameover = Гра завершена!
|
||||||
server.versions = Ваша версія:[accent] {0}[]\nВерсія на сервері:[accent] {1}[]
|
server.versions = Ваша версія:[accent] {0}[]\nВерсія на сервері:[accent] {1}[]
|
||||||
host.info = Кнопка [accent]Сервер[] розміщує сервер на порті [scarlet]6567[]. \nКористувачі, які знаходяться у тій же [lightgray]WiFi або локальній мережі[], повинні бачити ваш сервер у своєму списку серверів.\n\nЯкщо ви хочете, щоб люди могли приєднуватися з будь-якої точки через IP, то [accent] переадресація порту [] обов’язкова.\n\n[lightgray] Примітка. Якщо у вас виникли проблеми з підключенням до вашої локальної гри, переконайтеся, що ви дозволили Mindustry доступ до вашої локальної мережі в налаштуваннях брандмауера. Зауважте, що публічні мережі іноді не дозволяють виявити сервер.
|
host.info = Кнопка [accent]Сервер[] розміщує сервер на порті [scarlet]6567[]. \nКористувачі, які знаходяться у тій же [lightgray]WiFi або локальній мережі[], повинні бачити ваш сервер у своєму списку серверів.\n\nЯкщо ви хочете, щоб люди могли приєднуватися з будь-якої точки через IP, то[accent] переадресація порту []обов’язкова.\n\n[lightgray]Примітка. Якщо у вас виникли проблеми з підключенням до вашої локальної гри, переконайтеся, що ви дозволили Mindustry доступ до вашої локальної мережі в налаштуваннях брандмауера. Зауважте, що публічні мережі іноді не дозволяють виявити сервер.
|
||||||
join.info = Тут Ви можете ввести [accent]IP серверу[] для підключення або знайти сервери у [accent]локальній мережі[] для підключення до них.\nПідтримується локальна мережа(LAN) і широкосмугова мережа(WAN).\n\n[lightgray] Примітка. Тут немає автоматичного глобального списку серверів; якщо ви хочете підключитися до когось через IP, вам доведеться попросити створювача серверу дати свій ip.
|
join.info = Тут ви можете ввести [accent]IP серверу[] для підключення або знайти сервери у [accent]локальній мережі[] для підключення до них.\nПідтримується локальна мережа(LAN) і широкосмугова мережа(WAN).\n\n[lightgray] Примітка. Тут немає автоматичного глобального списку серверів; якщо ви хочете підключитися до когось через IP, вам доведеться попросити створювача серверу дати свій ip.
|
||||||
hostserver = Запустити багатокористувальницький сервер
|
hostserver = Запустити багатокористувацький сервер
|
||||||
hostserver.mobile = Запустити\nсервер
|
hostserver.mobile = Запустити\nсервер
|
||||||
host = Сервер
|
host = Сервер
|
||||||
hosting = [accent]Відкриття серверу…
|
hosting = [accent]Відкриття серверу…
|
||||||
@@ -134,14 +148,14 @@ save.delete = Видалити
|
|||||||
save.export = Експортувати збереження
|
save.export = Експортувати збереження
|
||||||
save.import.invalid = [accent]Це збереження недійсне!
|
save.import.invalid = [accent]Це збереження недійсне!
|
||||||
save.import.fail = [crimson]Не вдалося імпортувати збереження: [accent]{0}
|
save.import.fail = [crimson]Не вдалося імпортувати збереження: [accent]{0}
|
||||||
save.export.fail = [crimson]Не вдалося экспортувати збереження: [accent]{0}
|
save.export.fail = [crimson]Не вдалося експортувати збереження: [accent]{0}
|
||||||
save.import = Імпортувати збереження
|
save.import = Імпортувати збереження
|
||||||
save.newslot = Ім’я збереження:
|
save.newslot = Ім’я збереження:
|
||||||
save.rename = Перейменувати
|
save.rename = Перейменувати
|
||||||
save.rename.text = Нова назва:
|
save.rename.text = Нова назва:
|
||||||
selectslot = Виберіть збереження.
|
selectslot = Виберіть збереження.
|
||||||
slot = [accent]Слот {0}
|
slot = [accent]Слот {0}
|
||||||
save.corrupted = [accent]Збережений файл пошкоджено або э недійсним! \nЯкщо ви щойно оновили свою гру, це, мабуть, є зміною формату збереження та [scarlet] не є[] помилкою.
|
save.corrupted = [accent]Збережений файл пошкоджено або є недійсним! \nЯкщо ви щойно оновили свою гру, це, мабуть, є зміною формату збереження та [scarlet] не є[] помилкою.
|
||||||
empty = <Порожньо>
|
empty = <Порожньо>
|
||||||
on = Увімкнено
|
on = Увімкнено
|
||||||
off = Вимкнено
|
off = Вимкнено
|
||||||
@@ -161,11 +175,11 @@ cancel = Скасувати
|
|||||||
openlink = Відкрити посилання
|
openlink = Відкрити посилання
|
||||||
copylink = Скопіювати посилання
|
copylink = Скопіювати посилання
|
||||||
back = Назад
|
back = Назад
|
||||||
data.export = Export Data
|
data.export = Експортувати дані
|
||||||
data.import = Import Data
|
data.import = Импортувати дані
|
||||||
data.exported = Data exported.
|
data.exported = Дані імпортовано.
|
||||||
data.invalid = This isn't valid game data.
|
data.invalid = Це не дійсні ігрові дані.
|
||||||
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.
|
data.import.confirm = Імпорт зовнішніх даних видалить[scarlet] ВСІ[] віші поточні ігрові дані.\n[accent]Це не може бути скасоване![]\n\nЩойно дані імпортуються, гра негайно завершена.
|
||||||
classic.export = Експортувати класичні дані
|
classic.export = Експортувати класичні дані
|
||||||
classic.export.text = Класичне (версія 3.5 збірка 40) збереження або мапа були знайдені. Ви хочете експортувати ці дані в домашню теку телефону, для використання у додатку Mindustry Classic?
|
classic.export.text = Класичне (версія 3.5 збірка 40) збереження або мапа були знайдені. Ви хочете експортувати ці дані в домашню теку телефону, для використання у додатку Mindustry Classic?
|
||||||
quit.confirm = Ви впевнені, що хочете вийти?
|
quit.confirm = Ви впевнені, що хочете вийти?
|
||||||
@@ -351,7 +365,7 @@ connectfail = [crimson]Помилка підключення: [accent]{0}
|
|||||||
error.unreachable = Сервер не доступний.
|
error.unreachable = Сервер не доступний.
|
||||||
error.invalidaddress = Некоректна адреса.
|
error.invalidaddress = Некоректна адреса.
|
||||||
error.timedout = Час очікування вийшов.\nПереконайтеся, що адреса коректна і що власник сервера налаштував переадресацію порту!
|
error.timedout = Час очікування вийшов.\nПереконайтеся, що адреса коректна і що власник сервера налаштував переадресацію порту!
|
||||||
error.mismatch = Помилка пакету:\nможливе невідповідність версії клієнта/сервера.\nПереконайтеся, що у Вас та у володара сервера встановлена остання версія Mindustry!
|
error.mismatch = Помилка пакету:\nможливе невідповідність версії клієнта/сервера.\nПереконайтеся, що у вас та у володара сервера встановлена остання версія Mindustry!
|
||||||
error.alreadyconnected = Ви вже підключилися.
|
error.alreadyconnected = Ви вже підключилися.
|
||||||
error.mapnotfound = Файл мапи не знайдено
|
error.mapnotfound = Файл мапи не знайдено
|
||||||
error.io = Мережева помилка введення-виведення
|
error.io = Мережева помилка введення-виведення
|
||||||
@@ -386,7 +400,7 @@ zone.fungalPass.description = Перехідна зона між високим
|
|||||||
zone.impact0078.description = <вставити опис тут>
|
zone.impact0078.description = <вставити опис тут>
|
||||||
zone.crags.description = <вставити опис тут>
|
zone.crags.description = <вставити опис тут>
|
||||||
settings.language = Мова
|
settings.language = Мова
|
||||||
settings.data = Game Data
|
settings.data = Ігрові дані
|
||||||
settings.reset = Скинути за замовчуванням
|
settings.reset = Скинути за замовчуванням
|
||||||
settings.rebind = Зміна
|
settings.rebind = Зміна
|
||||||
settings.controls = Керування
|
settings.controls = Керування
|
||||||
@@ -518,7 +532,7 @@ setting.mutemusic.name = Заглушити музику
|
|||||||
setting.sfxvol.name = Гучність звукових ефектів
|
setting.sfxvol.name = Гучність звукових ефектів
|
||||||
setting.mutesound.name = Заглушити звук
|
setting.mutesound.name = Заглушити звук
|
||||||
setting.crashreport.name = Відсилати анонімні звіти про аварійне завершення гри
|
setting.crashreport.name = Відсилати анонімні звіти про аварійне завершення гри
|
||||||
setting.savecreate.name = Auto-Create Saves
|
setting.savecreate.name = Автоматичне створення збережень
|
||||||
setting.chatopacity.name = Непрозорість чату
|
setting.chatopacity.name = Непрозорість чату
|
||||||
setting.playerchat.name = Відображати чат у грі
|
setting.playerchat.name = Відображати чат у грі
|
||||||
uiscale.reset = Масштаб користувальницького інтерфейсу було змінено.\nНатисніть «ОК» для підтверждення цього масшатабу.\n[scarlet]Повернення налаштувань і вихід через[accent] {0}[] …
|
uiscale.reset = Масштаб користувальницького інтерфейсу було змінено.\nНатисніть «ОК» для підтверждення цього масшатабу.\n[scarlet]Повернення налаштувань і вихід через[accent] {0}[] …
|
||||||
@@ -659,6 +673,8 @@ mech.buildspeed = [lightgray]Швидкість будування: {0}%
|
|||||||
liquid.heatcapacity = [lightgray]Теплоємність: {0}
|
liquid.heatcapacity = [lightgray]Теплоємність: {0}
|
||||||
liquid.viscosity = [lightgray]В’язкість: {0}
|
liquid.viscosity = [lightgray]В’язкість: {0}
|
||||||
liquid.temperature = [lightgray]Температура: {0}
|
liquid.temperature = [lightgray]Температура: {0}
|
||||||
|
block.sand-boulder.name = Sand Boulder
|
||||||
|
block.grass.name = Трава
|
||||||
block.sand-boulder.name = Пісочний валун
|
block.sand-boulder.name = Пісочний валун
|
||||||
block.grass.name = Трава
|
block.grass.name = Трава
|
||||||
block.salt.name = Сіль
|
block.salt.name = Сіль
|
||||||
|
|||||||
@@ -16,11 +16,11 @@ screenshot.invalid = 地图太大,可能没有足够的内存用于截图。
|
|||||||
gameover = 你的核心被摧毁了!
|
gameover = 你的核心被摧毁了!
|
||||||
gameover.pvp = [accent] {0}[] 队获胜!
|
gameover.pvp = [accent] {0}[] 队获胜!
|
||||||
highscore = [accent]新纪录!
|
highscore = [accent]新纪录!
|
||||||
load.sound = Sounds
|
load.sound = 音乐加载中
|
||||||
load.map = Maps
|
load.map = 地图加载中
|
||||||
load.image = Images
|
load.image = 图片加载中
|
||||||
load.content = Content
|
load.content = 内容加载中
|
||||||
load.system = System
|
load.system = 系统加载中
|
||||||
stat.wave = 战胜的波数:[accent]{0}
|
stat.wave = 战胜的波数:[accent]{0}
|
||||||
stat.enemiesDestroyed = 消灭的敌人:[accent]{0}
|
stat.enemiesDestroyed = 消灭的敌人:[accent]{0}
|
||||||
stat.built = 建造的建筑:[accent]{0}
|
stat.built = 建造的建筑:[accent]{0}
|
||||||
@@ -64,13 +64,14 @@ researched = [LIGHT_GRAY]{0}己研究。
|
|||||||
players = {0} 玩家在线
|
players = {0} 玩家在线
|
||||||
players.single = {0}玩家在线
|
players.single = {0}玩家在线
|
||||||
server.closing = [accent]正在关闭服务器……
|
server.closing = [accent]正在关闭服务器……
|
||||||
server.kicked.kick = 你被踢出服务器了!
|
server.kicked.kick = 你被踢出了服务器。
|
||||||
|
server.kicked.whitelist = 你不在白名单中。
|
||||||
server.kicked.serverClose = 服务器已关闭。
|
server.kicked.serverClose = 服务器已关闭。
|
||||||
server.kicked.vote = You have been vote-kicked. Goodbye.
|
server.kicked.vote = 你被投票踢出了服务器。永别了。
|
||||||
server.kicked.clientOutdated = 客户端过旧,请更新你的游戏。
|
server.kicked.clientOutdated = 客户端过旧,请更新你的游戏。
|
||||||
server.kicked.serverOutdated = 服务器过旧,请联系房主升级服务器。
|
server.kicked.serverOutdated = 服务器过旧,请联系房主升级服务器。
|
||||||
server.kicked.banned = 你在这个服务器上被拉入黑名单了。
|
server.kicked.banned = 你在这个服务器上被拉入黑名单了。
|
||||||
server.kicked.typeMismatch = This server is not compatible with your build type.
|
server.kicked.typeMismatch = 此服务器与您的不稳定测试版不兼容。
|
||||||
server.kicked.recentKick = 你刚刚被踢出服务器。\n请稍后重新连接!
|
server.kicked.recentKick = 你刚刚被踢出服务器。\n请稍后重新连接!
|
||||||
server.kicked.nameInUse = 你的名字与服务器中的一个人重复了。
|
server.kicked.nameInUse = 你的名字与服务器中的一个人重复了。
|
||||||
server.kicked.nameEmpty = 无效的名字!
|
server.kicked.nameEmpty = 无效的名字!
|
||||||
@@ -161,16 +162,16 @@ cancel = 取消
|
|||||||
openlink = 打开链接
|
openlink = 打开链接
|
||||||
copylink = 复制链接
|
copylink = 复制链接
|
||||||
back = 返回
|
back = 返回
|
||||||
data.export = Export Data
|
data.export = 导出数据
|
||||||
data.import = Import Data
|
data.import = 导入数据
|
||||||
data.exported = Data exported.
|
data.exported = 数据已导入。
|
||||||
data.invalid = This isn't valid game data.
|
data.invalid = 非有效游戏数据。
|
||||||
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.
|
data.import.confirm = 导入外部游戏数据讲覆盖本地[scarlet]全部[]游戏数据。\n[accent]此操作无法撤销![]\n\n数据导入后将自动退出游戏。
|
||||||
classic.export = 导出老版本数据
|
classic.export = 导出老版本数据
|
||||||
classic.export.text = [accent]Mindustry []刚刚有了一个重要的更新。\n检测到此为老版本(v3.5 build 40)的存档或地图。是否要将这些保存导出到手机的主文件夹中,以便在 Mindustry 老版本应用程序中使用?
|
classic.export.text = [accent]Mindustry []有了一个重要的更新。\n检测到此为老版本(v3.5 build 40)的存档或地图。是否要将这些保存导出到手机的主文件夹中,以便在 Mindustry 老版本应用程序中使用?
|
||||||
quit.confirm = 确定退出?
|
quit.confirm = 确定退出?
|
||||||
quit.confirm.tutorial = 你确定不玩教程就开始游戏?\n教程可以通过[accent]设置->游戏->重新游玩教程[]来再次游玩。
|
quit.confirm.tutorial = 你确定不玩教程就开始游戏?\n教程可以通过[accent]设置->游戏->重新游玩教程[]来再次游玩。
|
||||||
loading = [accent]加载中……
|
loading = [accent]老滑稽祈祷中……
|
||||||
saving = [accent]保存中……
|
saving = [accent]保存中……
|
||||||
wave = [accent]波次 {0}
|
wave = [accent]波次 {0}
|
||||||
wave.waiting = [LIGHT_GRAY]下一波将在{0}秒后到来
|
wave.waiting = [LIGHT_GRAY]下一波将在{0}秒后到来
|
||||||
@@ -386,7 +387,7 @@ zone.fungalPass.description = 介于高山和低矮孢子丛生的土地之间
|
|||||||
zone.impact0078.description = <在此处插入说明>
|
zone.impact0078.description = <在此处插入说明>
|
||||||
zone.crags.description = <在此处插入说明>
|
zone.crags.description = <在此处插入说明>
|
||||||
settings.language = 语言
|
settings.language = 语言
|
||||||
settings.data = Game Data
|
settings.data = 游戏数据
|
||||||
settings.reset = 恢复默认
|
settings.reset = 恢复默认
|
||||||
settings.rebind = 重新绑定
|
settings.rebind = 重新绑定
|
||||||
settings.controls = 控制
|
settings.controls = 控制
|
||||||
@@ -518,7 +519,7 @@ setting.mutemusic.name = 静音
|
|||||||
setting.sfxvol.name = 音效音量
|
setting.sfxvol.name = 音效音量
|
||||||
setting.mutesound.name = 静音
|
setting.mutesound.name = 静音
|
||||||
setting.crashreport.name = 发送匿名崩溃报告
|
setting.crashreport.name = 发送匿名崩溃报告
|
||||||
setting.savecreate.name = Auto-Create Saves
|
setting.savecreate.name = 自动创建存档
|
||||||
setting.chatopacity.name = 聊天界面透明度
|
setting.chatopacity.name = 聊天界面透明度
|
||||||
setting.playerchat.name = 显示游戏内聊天界面
|
setting.playerchat.name = 显示游戏内聊天界面
|
||||||
uiscale.reset = UI缩放比例已经改变。\n按下“确定”来确定缩放比例\n[accent]{0}[]秒后[scarlet]退出并恢复设定。
|
uiscale.reset = UI缩放比例已经改变。\n按下“确定”来确定缩放比例\n[accent]{0}[]秒后[scarlet]退出并恢复设定。
|
||||||
|
|||||||
@@ -75,3 +75,4 @@ Markus G
|
|||||||
itskatt
|
itskatt
|
||||||
Agent-Laevain
|
Agent-Laevain
|
||||||
AzariasB
|
AzariasB
|
||||||
|
amrsoll
|
||||||
|
|||||||
|
Before Width: | Height: | Size: 719 B After Width: | Height: | Size: 718 B |
|
Before Width: | Height: | Size: 682 KiB After Width: | Height: | Size: 672 KiB |
|
Before Width: | Height: | Size: 274 KiB After Width: | Height: | Size: 258 KiB |
|
Before Width: | Height: | Size: 579 KiB After Width: | Height: | Size: 577 KiB |
@@ -1,367 +0,0 @@
|
|||||||
{
|
|
||||||
Color: {
|
|
||||||
black: { a: 1, b: 0, g: 0, r: 0 },
|
|
||||||
white: { a: 1, b: 1, g: 1, r: 1 },
|
|
||||||
gray: { a: 1, b: 0.32, g: 0.32, r: 0.32 },
|
|
||||||
lightgray: { a: 1, b: 0.65, g: 0.65, r: 0.65 }
|
|
||||||
orange: { hex: "FFA500" },
|
|
||||||
accent: { hex: "ffd37f" }
|
|
||||||
},
|
|
||||||
TintedDrawable: {
|
|
||||||
dialogDim: {
|
|
||||||
name: whiteui,
|
|
||||||
color: { r: 0, g: 0, b: 0, a: 0.9 }
|
|
||||||
},
|
|
||||||
guideDim: {
|
|
||||||
name: whiteui,
|
|
||||||
color: { r: 0, g: 0, b: 0, a: 0.3 }
|
|
||||||
},
|
|
||||||
invis: {
|
|
||||||
name: whiteui,
|
|
||||||
color: { r: 0, g: 0, b: 0, a: 0 }
|
|
||||||
}
|
|
||||||
loadDim: {
|
|
||||||
name: white,
|
|
||||||
color: { r: 0, g: 0, b: 0, a: 0.8 }
|
|
||||||
},
|
|
||||||
chatfield: {
|
|
||||||
name: whiteui,
|
|
||||||
color: { r: 0, g: 0, b: 0, a: 0.2 }
|
|
||||||
},
|
|
||||||
dark: {
|
|
||||||
name: whiteui,
|
|
||||||
color: { hex: "#000000ff" }
|
|
||||||
},
|
|
||||||
none: {
|
|
||||||
name: whiteui,
|
|
||||||
color: { r: 0, g: 0, b: 0, a: 0 }
|
|
||||||
},
|
|
||||||
flat-trans: {
|
|
||||||
name: whiteui,
|
|
||||||
color: { r: 0.0, g: 0.0, b: 0.0, a: 0.6 }
|
|
||||||
},
|
|
||||||
flat: {
|
|
||||||
name: whiteui,
|
|
||||||
color: { r: 0.0, g: 0.0, b: 0.0, a: 1 }
|
|
||||||
},
|
|
||||||
flat-over: {
|
|
||||||
name: whiteui,
|
|
||||||
color: { hex: "#454545ff" }
|
|
||||||
}
|
|
||||||
},
|
|
||||||
ButtonStyle: {
|
|
||||||
default: {
|
|
||||||
down: button-down,
|
|
||||||
up: button,
|
|
||||||
over: button-over,
|
|
||||||
disabled: button-disabled
|
|
||||||
},
|
|
||||||
square: {
|
|
||||||
over: button-square-over,
|
|
||||||
disabled: button-disabled,
|
|
||||||
down: button-square-down,
|
|
||||||
up: button-square
|
|
||||||
},
|
|
||||||
toggle: {
|
|
||||||
checked: button-down,
|
|
||||||
down: button-down,
|
|
||||||
up: button
|
|
||||||
},
|
|
||||||
wave: {
|
|
||||||
up: button-edge-4,
|
|
||||||
over: button-edge-over-4,
|
|
||||||
disabled: button-edge-4
|
|
||||||
},
|
|
||||||
},
|
|
||||||
TextButtonStyle: {
|
|
||||||
default: {
|
|
||||||
over: button-over,
|
|
||||||
disabled: button-disabled,
|
|
||||||
font: default,
|
|
||||||
fontColor: white,
|
|
||||||
disabledFontColor: gray,
|
|
||||||
down: button-down,
|
|
||||||
up: button
|
|
||||||
},
|
|
||||||
square: {
|
|
||||||
font: default,
|
|
||||||
fontColor: white,
|
|
||||||
disabledFontColor: gray,
|
|
||||||
over: button-square-over,
|
|
||||||
disabled: button-disabled,
|
|
||||||
down: button-square-down,
|
|
||||||
up: button-square
|
|
||||||
},
|
|
||||||
node: {
|
|
||||||
disabled: button,
|
|
||||||
font: default,
|
|
||||||
fontColor: white,
|
|
||||||
disabledFontColor: gray,
|
|
||||||
up: button-over,
|
|
||||||
over: button-down
|
|
||||||
},
|
|
||||||
right: {
|
|
||||||
over: button-right-over,
|
|
||||||
font: default,
|
|
||||||
fontColor: white,
|
|
||||||
disabledFontColor: gray,
|
|
||||||
down: button-right-down,
|
|
||||||
up: button-right
|
|
||||||
},
|
|
||||||
wave: {
|
|
||||||
font: default,
|
|
||||||
fontColor: white,
|
|
||||||
disabledFontColor: gray,
|
|
||||||
up: button-edge-4
|
|
||||||
},
|
|
||||||
clear: {
|
|
||||||
over: flat-over,
|
|
||||||
font: default,
|
|
||||||
fontColor: white,
|
|
||||||
disabledFontColor: gray,
|
|
||||||
down: flat-over,
|
|
||||||
up: flat
|
|
||||||
},
|
|
||||||
discord: {
|
|
||||||
font: default,
|
|
||||||
fontColor: white,
|
|
||||||
up: discord-banner
|
|
||||||
},
|
|
||||||
info: {
|
|
||||||
font: default,
|
|
||||||
fontColor: white,
|
|
||||||
up: info-banner
|
|
||||||
},
|
|
||||||
clear-partial: {
|
|
||||||
down: whiteui,
|
|
||||||
up: pane,
|
|
||||||
over: flat-down,
|
|
||||||
font: default,
|
|
||||||
fontColor: white,
|
|
||||||
disabledFontColor: gray
|
|
||||||
},
|
|
||||||
clear-partial-2: {
|
|
||||||
down: flat-over,
|
|
||||||
up: none,
|
|
||||||
over: flat-over,
|
|
||||||
font: default,
|
|
||||||
fontColor: white,
|
|
||||||
disabledFontColor: gray
|
|
||||||
},
|
|
||||||
empty: {
|
|
||||||
font: default
|
|
||||||
},
|
|
||||||
clear-toggle: {
|
|
||||||
font: default,
|
|
||||||
fontColor: white,
|
|
||||||
checked: flat-down,
|
|
||||||
down: flat-down,
|
|
||||||
up: flat,
|
|
||||||
over: flat-over,
|
|
||||||
disabled: flat,
|
|
||||||
disabledFontColor: gray
|
|
||||||
},
|
|
||||||
clear-toggle-menu: {
|
|
||||||
font: default,
|
|
||||||
fontColor: white,
|
|
||||||
checked: flat-down,
|
|
||||||
down: flat-down,
|
|
||||||
up: clear,
|
|
||||||
over: flat-over,
|
|
||||||
disabled: flat,
|
|
||||||
disabledFontColor: gray
|
|
||||||
}
|
|
||||||
toggle: {
|
|
||||||
font: default,
|
|
||||||
fontColor: white,
|
|
||||||
checked: button-down,
|
|
||||||
down: button-down,
|
|
||||||
up: button,
|
|
||||||
over: button-over,
|
|
||||||
disabled: button-disabled,
|
|
||||||
disabledFontColor: gray
|
|
||||||
}
|
|
||||||
},
|
|
||||||
ImageButtonStyle: {
|
|
||||||
default: {
|
|
||||||
down: button-down,
|
|
||||||
up: button,
|
|
||||||
over: button-over,
|
|
||||||
imageDisabledColor: gray,
|
|
||||||
imageUpColor: white,
|
|
||||||
disabled: button-disabled
|
|
||||||
},
|
|
||||||
node: {
|
|
||||||
up: button-over,
|
|
||||||
over: button-down
|
|
||||||
},
|
|
||||||
right: {
|
|
||||||
over: button-right-over,
|
|
||||||
down: button-right-down,
|
|
||||||
up: button-right
|
|
||||||
},
|
|
||||||
empty: {
|
|
||||||
imageDownColor: accent,
|
|
||||||
imageUpColor: white
|
|
||||||
},
|
|
||||||
emptytoggle: {
|
|
||||||
imageCheckedColor: white,
|
|
||||||
imageDownColor: white,
|
|
||||||
imageUpColor: gray
|
|
||||||
},
|
|
||||||
static: {
|
|
||||||
up: button
|
|
||||||
},
|
|
||||||
static-down: {
|
|
||||||
up: button-down
|
|
||||||
},
|
|
||||||
toggle: {
|
|
||||||
checked: button-down,
|
|
||||||
down: button-down,
|
|
||||||
up: button,
|
|
||||||
imageDisabledColor: gray,
|
|
||||||
imageUpColor: white
|
|
||||||
},
|
|
||||||
select: {
|
|
||||||
checked: button-select,
|
|
||||||
up: none
|
|
||||||
},
|
|
||||||
clear: {
|
|
||||||
down: flat-over,
|
|
||||||
up: flat,
|
|
||||||
over: flat-over
|
|
||||||
},
|
|
||||||
clear-full: {
|
|
||||||
down: whiteui,
|
|
||||||
up: pane,
|
|
||||||
over: flat-down
|
|
||||||
},
|
|
||||||
clear-partial: {
|
|
||||||
down: flat-down,
|
|
||||||
up: none,
|
|
||||||
over: flat-over
|
|
||||||
},
|
|
||||||
clear-toggle: {
|
|
||||||
down: flat-down,
|
|
||||||
checked: flat-down,
|
|
||||||
up: flat,
|
|
||||||
over: flat-over
|
|
||||||
},
|
|
||||||
clear-trans: {
|
|
||||||
down: flat-down,
|
|
||||||
up: flat-trans,
|
|
||||||
over: flat-over
|
|
||||||
},
|
|
||||||
clear-toggle-trans: {
|
|
||||||
down: flat-down,
|
|
||||||
checked: flat-down,
|
|
||||||
up: flat-trans,
|
|
||||||
over: flat-over
|
|
||||||
},
|
|
||||||
clear-toggle-partial: {
|
|
||||||
down: flat-down,
|
|
||||||
checked: flat-down,
|
|
||||||
up: none,
|
|
||||||
over: flat-over
|
|
||||||
},
|
|
||||||
},
|
|
||||||
ScrollPaneStyle: {
|
|
||||||
default: {
|
|
||||||
vScroll: scroll,
|
|
||||||
vScrollKnob: scroll-knob-vertical-black
|
|
||||||
},
|
|
||||||
horizontal: {
|
|
||||||
vScroll: scroll,
|
|
||||||
vScrollKnob: scroll-knob-vertical-black,
|
|
||||||
hScroll: scroll-horizontal,
|
|
||||||
hScrollKnob: scroll-knob-horizontal-black
|
|
||||||
},
|
|
||||||
},
|
|
||||||
WindowStyle: {
|
|
||||||
default: {
|
|
||||||
titleFont: default,
|
|
||||||
titleFontColor: accent
|
|
||||||
},
|
|
||||||
dialog: {
|
|
||||||
stageBackground: dialogDim,
|
|
||||||
titleFont: default,
|
|
||||||
background: window-empty,
|
|
||||||
titleFontColor: accent
|
|
||||||
},
|
|
||||||
fulldialog: {
|
|
||||||
stageBackground: dark,
|
|
||||||
titleFont: default,
|
|
||||||
background: window-empty,
|
|
||||||
titleFontColor: accent
|
|
||||||
}
|
|
||||||
},
|
|
||||||
KeybindDialogStyle: {
|
|
||||||
default: {
|
|
||||||
keyColor: accent,
|
|
||||||
keyNameColor: white,
|
|
||||||
controllerColor: lightgray
|
|
||||||
},
|
|
||||||
},
|
|
||||||
SliderStyle: {
|
|
||||||
default-horizontal: {
|
|
||||||
background: slider,
|
|
||||||
knob: slider-knob,
|
|
||||||
knobOver: slider-knob-over,
|
|
||||||
knobDown: slider-knob-down
|
|
||||||
},
|
|
||||||
default-vertical: {
|
|
||||||
background: slider-vertical,
|
|
||||||
knob: slider-knob,
|
|
||||||
knobOver: slider-knob-over,
|
|
||||||
knobDown: slider-knob-down
|
|
||||||
}
|
|
||||||
},
|
|
||||||
LabelStyle: {
|
|
||||||
default: {
|
|
||||||
font: default,
|
|
||||||
fontColor: white
|
|
||||||
},
|
|
||||||
outline: {
|
|
||||||
font: outline,
|
|
||||||
fontColor: white
|
|
||||||
}
|
|
||||||
},
|
|
||||||
TextFieldStyle: {
|
|
||||||
default: {
|
|
||||||
font: chat,
|
|
||||||
fontColor: white,
|
|
||||||
disabledFontColor: gray,
|
|
||||||
disabledBackground: underline-disabled,
|
|
||||||
selection: selection,
|
|
||||||
background: underline,
|
|
||||||
invalidBackground: underline-red,
|
|
||||||
cursor: cursor,
|
|
||||||
messageFont: default,
|
|
||||||
messageFontColor: gray
|
|
||||||
}
|
|
||||||
textarea: {
|
|
||||||
font: chat,
|
|
||||||
fontColor: white,
|
|
||||||
disabledFontColor: gray,
|
|
||||||
selection: selection,
|
|
||||||
background: underline,
|
|
||||||
cursor: cursor,
|
|
||||||
messageFont: default,
|
|
||||||
messageFontColor: gray
|
|
||||||
}
|
|
||||||
},
|
|
||||||
CheckBoxStyle: {
|
|
||||||
default: {
|
|
||||||
checkboxOn: check-on,
|
|
||||||
checkboxOff: check-off,
|
|
||||||
checkboxOnOver: check-on-over,
|
|
||||||
checkboxOver: check-over,
|
|
||||||
checkboxOnDisabled: check-on-disabled,
|
|
||||||
checkboxOffDisabled: check-disabled,
|
|
||||||
font: default,
|
|
||||||
fontColor: white,
|
|
||||||
disabledFontColor: gray,
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -13,6 +13,7 @@ import io.anuke.mindustry.game.EventType.*;
|
|||||||
import io.anuke.mindustry.gen.*;
|
import io.anuke.mindustry.gen.*;
|
||||||
import io.anuke.mindustry.graphics.*;
|
import io.anuke.mindustry.graphics.*;
|
||||||
import io.anuke.mindustry.maps.*;
|
import io.anuke.mindustry.maps.*;
|
||||||
|
import io.anuke.mindustry.net.Net;
|
||||||
|
|
||||||
import static io.anuke.arc.Core.*;
|
import static io.anuke.arc.Core.*;
|
||||||
import static io.anuke.mindustry.Vars.*;
|
import static io.anuke.mindustry.Vars.*;
|
||||||
@@ -40,6 +41,7 @@ public abstract class ClientLauncher extends ApplicationCore implements Platform
|
|||||||
assets = new AssetManager();
|
assets = new AssetManager();
|
||||||
assets.setLoader(Texture.class, "." + mapExtension, new MapPreviewLoader());
|
assets.setLoader(Texture.class, "." + mapExtension, new MapPreviewLoader());
|
||||||
atlas = TextureAtlas.blankAtlas();
|
atlas = TextureAtlas.blankAtlas();
|
||||||
|
Vars.net = new Net(platform.getNet());
|
||||||
|
|
||||||
UI.loadSystemCursors();
|
UI.loadSystemCursors();
|
||||||
|
|
||||||
@@ -47,7 +49,9 @@ public abstract class ClientLauncher extends ApplicationCore implements Platform
|
|||||||
|
|
||||||
UI.loadDefaultFont();
|
UI.loadDefaultFont();
|
||||||
|
|
||||||
assets.load(new AssetDescriptor<>("sprites/sprites.atlas", TextureAtlas.class)).loaded = t -> atlas = (TextureAtlas)t;
|
assets.load(new AssetDescriptor<>("sprites/sprites.atlas", TextureAtlas.class)).loaded = t -> {
|
||||||
|
atlas = (TextureAtlas)t;
|
||||||
|
};
|
||||||
|
|
||||||
assets.loadRun("maps", Map.class, () -> maps.loadPreviews());
|
assets.loadRun("maps", Map.class, () -> maps.loadPreviews());
|
||||||
|
|
||||||
@@ -84,10 +88,12 @@ public abstract class ClientLauncher extends ApplicationCore implements Platform
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void resize(int width, int height){
|
public void resize(int width, int height){
|
||||||
super.resize(width, height);
|
if(assets == null) return;
|
||||||
|
|
||||||
if(!assets.isFinished()){
|
if(!assets.isFinished()){
|
||||||
Draw.proj().setOrtho(0, 0, width, height);
|
Draw.proj().setOrtho(0, 0, width, height);
|
||||||
|
}else{
|
||||||
|
super.resize(width, height);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -100,6 +106,7 @@ public abstract class ClientLauncher extends ApplicationCore implements Platform
|
|||||||
for(ApplicationListener listener : modules){
|
for(ApplicationListener listener : modules){
|
||||||
listener.init();
|
listener.init();
|
||||||
}
|
}
|
||||||
|
super.resize(graphics.getWidth(), graphics.getHeight());
|
||||||
finished = true;
|
finished = true;
|
||||||
Events.fire(new ClientLoadEvent());
|
Events.fire(new ClientLoadEvent());
|
||||||
}
|
}
|
||||||
@@ -149,15 +156,15 @@ public abstract class ClientLauncher extends ApplicationCore implements Platform
|
|||||||
Core.graphics.clear(Pal.darkerGray);
|
Core.graphics.clear(Pal.darkerGray);
|
||||||
Draw.proj().setOrtho(0, 0, Core.graphics.getWidth(), Core.graphics.getHeight());
|
Draw.proj().setOrtho(0, 0, Core.graphics.getWidth(), Core.graphics.getHeight());
|
||||||
|
|
||||||
float height = UnitScl.dp.scl(50f);
|
float height = Scl.scl(50f);
|
||||||
|
|
||||||
Draw.color(Color.BLACK);
|
Draw.color(Color.black);
|
||||||
Fill.poly(graphics.getWidth()/2f, graphics.getHeight()/2f, 6, Mathf.dst(graphics.getWidth()/2f, graphics.getHeight()/2f) * smoothProgress);
|
Fill.poly(graphics.getWidth()/2f, graphics.getHeight()/2f, 6, Mathf.dst(graphics.getWidth()/2f, graphics.getHeight()/2f) * smoothProgress);
|
||||||
Draw.reset();
|
Draw.reset();
|
||||||
|
|
||||||
float w = graphics.getWidth()*0.6f;
|
float w = graphics.getWidth()*0.6f;
|
||||||
|
|
||||||
Draw.color(Color.BLACK);
|
Draw.color(Color.black);
|
||||||
Fill.rect(graphics.getWidth()/2f, graphics.getHeight()/2f, w, height);
|
Fill.rect(graphics.getWidth()/2f, graphics.getHeight()/2f, w, height);
|
||||||
|
|
||||||
Draw.color(Pal.accent);
|
Draw.color(Pal.accent);
|
||||||
@@ -169,13 +176,13 @@ public abstract class ClientLauncher extends ApplicationCore implements Platform
|
|||||||
|
|
||||||
if(assets.isLoaded("outline")){
|
if(assets.isLoaded("outline")){
|
||||||
BitmapFont font = assets.get("outline");
|
BitmapFont font = assets.get("outline");
|
||||||
font.draw((int)(assets.getProgress() * 100) + "%", graphics.getWidth() / 2f, graphics.getHeight() / 2f + UnitScl.dp.scl(10f), Align.center);
|
font.draw((int)(assets.getProgress() * 100) + "%", graphics.getWidth() / 2f, graphics.getHeight() / 2f + Scl.scl(10f), Align.center);
|
||||||
font.draw(bundle.get("loading", "").replace("[accent]", ""), graphics.getWidth() / 2f, graphics.getHeight() / 2f + height / 2f + UnitScl.dp.scl(20), Align.center);
|
font.draw(bundle.get("loading", "").replace("[accent]", ""), graphics.getWidth() / 2f, graphics.getHeight() / 2f + height / 2f + Scl.scl(20), Align.center);
|
||||||
|
|
||||||
if(assets.getCurrentLoading() != null){
|
if(assets.getCurrentLoading() != null){
|
||||||
String name = assets.getCurrentLoading().fileName.toLowerCase();
|
String name = assets.getCurrentLoading().fileName.toLowerCase();
|
||||||
String key = name.contains("content") ? "content" : name.contains("msav") || name.contains("maps") ? "map" : name.contains("ogg") || name.contains("mp3") ? "sound" : name.contains("png") ? "image" : "system";
|
String key = name.contains("content") ? "content" : name.contains("msav") || name.contains("maps") ? "map" : name.contains("ogg") || name.contains("mp3") ? "sound" : name.contains("png") ? "image" : "system";
|
||||||
font.draw(bundle.get("load." + key, ""), graphics.getWidth() / 2f, graphics.getHeight() / 2f - height / 2f - UnitScl.dp.scl(10f), Align.center);
|
font.draw(bundle.get("load." + key, ""), graphics.getWidth() / 2f, graphics.getHeight() / 2f - height / 2f - Scl.scl(10f), Align.center);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
Draw.flush();
|
Draw.flush();
|
||||||
|
|||||||
@@ -3,6 +3,7 @@ package io.anuke.mindustry;
|
|||||||
import io.anuke.arc.Application.*;
|
import io.anuke.arc.Application.*;
|
||||||
import io.anuke.arc.*;
|
import io.anuke.arc.*;
|
||||||
import io.anuke.arc.assets.*;
|
import io.anuke.arc.assets.*;
|
||||||
|
import io.anuke.arc.collection.*;
|
||||||
import io.anuke.arc.files.*;
|
import io.anuke.arc.files.*;
|
||||||
import io.anuke.arc.graphics.*;
|
import io.anuke.arc.graphics.*;
|
||||||
import io.anuke.arc.scene.ui.layout.*;
|
import io.anuke.arc.scene.ui.layout.*;
|
||||||
@@ -10,9 +11,7 @@ import io.anuke.arc.util.*;
|
|||||||
import io.anuke.mindustry.ai.*;
|
import io.anuke.mindustry.ai.*;
|
||||||
import io.anuke.mindustry.core.*;
|
import io.anuke.mindustry.core.*;
|
||||||
import io.anuke.mindustry.entities.*;
|
import io.anuke.mindustry.entities.*;
|
||||||
import io.anuke.mindustry.entities.bullet.*;
|
|
||||||
import io.anuke.mindustry.entities.effect.*;
|
import io.anuke.mindustry.entities.effect.*;
|
||||||
import io.anuke.mindustry.entities.impl.*;
|
|
||||||
import io.anuke.mindustry.entities.traits.*;
|
import io.anuke.mindustry.entities.traits.*;
|
||||||
import io.anuke.mindustry.entities.type.*;
|
import io.anuke.mindustry.entities.type.*;
|
||||||
import io.anuke.mindustry.game.*;
|
import io.anuke.mindustry.game.*;
|
||||||
@@ -20,6 +19,7 @@ import io.anuke.mindustry.gen.*;
|
|||||||
import io.anuke.mindustry.input.*;
|
import io.anuke.mindustry.input.*;
|
||||||
import io.anuke.mindustry.maps.*;
|
import io.anuke.mindustry.maps.*;
|
||||||
import io.anuke.mindustry.net.Net;
|
import io.anuke.mindustry.net.Net;
|
||||||
|
import io.anuke.mindustry.plugin.*;
|
||||||
import io.anuke.mindustry.world.blocks.defense.ForceProjector.*;
|
import io.anuke.mindustry.world.blocks.defense.ForceProjector.*;
|
||||||
|
|
||||||
import java.nio.charset.*;
|
import java.nio.charset.*;
|
||||||
@@ -43,6 +43,8 @@ public class Vars implements Loadable{
|
|||||||
public static final String discordURL = "https://discord.gg/mindustry";
|
public static final String discordURL = "https://discord.gg/mindustry";
|
||||||
/** URL for sending crash reports to */
|
/** URL for sending crash reports to */
|
||||||
public static final String crashReportURL = "http://mins.us.to/report";
|
public static final String crashReportURL = "http://mins.us.to/report";
|
||||||
|
/** list of built-in servers.*/
|
||||||
|
public static final Array<String> defaultServers = Array.with(/*"mins.us.to"*/);
|
||||||
/** maximum distance between mine and core that supports automatic transferring */
|
/** maximum distance between mine and core that supports automatic transferring */
|
||||||
public static final float mineTransferRange = 220f;
|
public static final float mineTransferRange = 220f;
|
||||||
/** team of the player by default */
|
/** team of the player by default */
|
||||||
@@ -59,14 +61,6 @@ public class Vars implements Loadable{
|
|||||||
public static final float itemSize = 5f;
|
public static final float itemSize = 5f;
|
||||||
/** extra padding around the world; units outside this bound will begin to self-destruct. */
|
/** extra padding around the world; units outside this bound will begin to self-destruct. */
|
||||||
public static final float worldBounds = 100f;
|
public static final float worldBounds = 100f;
|
||||||
/** default size of UI icons.*/
|
|
||||||
public static final int iconsize = 48;
|
|
||||||
/** size of UI icons (small)*/
|
|
||||||
public static final int iconsizesmall = 32;
|
|
||||||
/** size of UI icons (medium)*/
|
|
||||||
public static final int iconsizemed = 30;
|
|
||||||
/** size of UI icons (medium)*/
|
|
||||||
public static final int iconsizetiny = 16;
|
|
||||||
/** units outside of this bound will simply die instantly */
|
/** units outside of this bound will simply die instantly */
|
||||||
public static final float finalWorldBounds = worldBounds + 500;
|
public static final float finalWorldBounds = worldBounds + 500;
|
||||||
/** ticks spent out of bound until self destruct. */
|
/** ticks spent out of bound until self destruct. */
|
||||||
@@ -112,6 +106,8 @@ public class Vars implements Loadable{
|
|||||||
public static boolean android;
|
public static boolean android;
|
||||||
/** whether the game is running on a headless server */
|
/** whether the game is running on a headless server */
|
||||||
public static boolean headless;
|
public static boolean headless;
|
||||||
|
/** whether steam is enabled for this game */
|
||||||
|
public static boolean steam;
|
||||||
/** application data directory, equivalent to {@link io.anuke.arc.Settings#getDataDirectory()} */
|
/** application data directory, equivalent to {@link io.anuke.arc.Settings#getDataDirectory()} */
|
||||||
public static FileHandle dataDirectory;
|
public static FileHandle dataDirectory;
|
||||||
/** data subdirectory used for screenshots */
|
/** data subdirectory used for screenshots */
|
||||||
@@ -136,6 +132,7 @@ public class Vars implements Loadable{
|
|||||||
/** list of all locales that can be switched to */
|
/** list of all locales that can be switched to */
|
||||||
public static Locale[] locales;
|
public static Locale[] locales;
|
||||||
|
|
||||||
|
public static Net net;
|
||||||
public static ContentLoader content;
|
public static ContentLoader content;
|
||||||
public static GameState state;
|
public static GameState state;
|
||||||
public static GlobalData data;
|
public static GlobalData data;
|
||||||
@@ -143,6 +140,7 @@ public class Vars implements Loadable{
|
|||||||
public static DefaultWaves defaultWaves;
|
public static DefaultWaves defaultWaves;
|
||||||
public static LoopControl loops;
|
public static LoopControl loops;
|
||||||
public static Platform platform;
|
public static Platform platform;
|
||||||
|
public static Plugins plugins;
|
||||||
|
|
||||||
public static World world;
|
public static World world;
|
||||||
public static Maps maps;
|
public static Maps maps;
|
||||||
@@ -168,7 +166,6 @@ public class Vars implements Loadable{
|
|||||||
public static EntityGroup<Fire> fireGroup;
|
public static EntityGroup<Fire> fireGroup;
|
||||||
public static EntityGroup<BaseUnit>[] unitGroups;
|
public static EntityGroup<BaseUnit>[] unitGroups;
|
||||||
|
|
||||||
/** all local players, currently only has one player. may be used for local co-op in the future */
|
|
||||||
public static Player player;
|
public static Player player;
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -226,7 +223,7 @@ public class Vars implements Loadable{
|
|||||||
|
|
||||||
for(EntityGroup<?> group : entities.all()){
|
for(EntityGroup<?> group : entities.all()){
|
||||||
group.setRemoveListener(entity -> {
|
group.setRemoveListener(entity -> {
|
||||||
if(entity instanceof SyncTrait && Net.client()){
|
if(entity instanceof SyncTrait && net.client()){
|
||||||
netClient.addRemovedEntity((entity).getID());
|
netClient.addRemovedEntity((entity).getID());
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
@@ -252,11 +249,16 @@ public class Vars implements Loadable{
|
|||||||
|
|
||||||
public static void loadSettings(){
|
public static void loadSettings(){
|
||||||
Core.settings.setAppName(appName);
|
Core.settings.setAppName(appName);
|
||||||
|
|
||||||
|
if(steam){
|
||||||
|
Core.settings.setDataDirectory(Core.files.local("saves/"));
|
||||||
|
}
|
||||||
|
|
||||||
Core.settings.defaults("locale", "default");
|
Core.settings.defaults("locale", "default");
|
||||||
Core.keybinds.setDefaults(Binding.values());
|
Core.keybinds.setDefaults(Binding.values());
|
||||||
Core.settings.load();
|
Core.settings.load();
|
||||||
|
|
||||||
UnitScl.dp.setProduct(settings.getInt("uiscale", 100) / 100f);
|
Scl.setProduct(settings.getInt("uiscale", 100) / 100f);
|
||||||
|
|
||||||
if(!loadLocales) return;
|
if(!loadLocales) return;
|
||||||
|
|
||||||
@@ -268,6 +270,7 @@ public class Vars implements Loadable{
|
|||||||
Core.bundle = I18NBundle.createBundle(handle, locale);
|
Core.bundle = I18NBundle.createBundle(handle, locale);
|
||||||
|
|
||||||
Log.info("NOTE: external translation bundle has been loaded.");
|
Log.info("NOTE: external translation bundle has been loaded.");
|
||||||
|
|
||||||
if(!headless){
|
if(!headless){
|
||||||
Time.run(10f, () -> ui.showInfo("Note: You have successfully loaded an external translation bundle."));
|
Time.run(10f, () -> ui.showInfo("Note: You have successfully loaded an external translation bundle."));
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -242,14 +242,13 @@ public class BlockIndexer{
|
|||||||
int quadrantY = tile.y / quadrantSize;
|
int quadrantY = tile.y / quadrantSize;
|
||||||
itemSet.clear();
|
itemSet.clear();
|
||||||
|
|
||||||
Tile rounded = world.tile(Mathf.clamp(quadrantX * quadrantSize + quadrantSize / 2, 0, world.width() - 1),
|
Tile rounded = world.tile(Mathf.clamp(quadrantX * quadrantSize + quadrantSize / 2, 0, world.width() - 1), Mathf.clamp(quadrantY * quadrantSize + quadrantSize / 2, 0, world.height() - 1));
|
||||||
Mathf.clamp(quadrantY * quadrantSize + quadrantSize / 2, 0, world.height() - 1));
|
|
||||||
|
|
||||||
//find all items that this quadrant contains
|
//find all items that this quadrant contains
|
||||||
for(int x = quadrantX * quadrantSize; x < world.width() && x < (quadrantX + 1) * quadrantSize; x++){
|
for(int x = Math.max(0, rounded.x - quadrantSize / 2); x < rounded.x + quadrantSize / 2 && x < world.width(); x++){
|
||||||
for(int y = quadrantY * quadrantSize; y < world.height() && y < (quadrantY + 1) * quadrantSize; y++){
|
for(int y = Math.max(0, rounded.y - quadrantSize / 2); y < rounded.y + quadrantSize / 2 && y < world.height(); y++){
|
||||||
Tile result = world.tile(x, y);
|
Tile result = world.tile(x, y);
|
||||||
if(result == null || result.drop() == null || !scanOres.contains(result.drop())) continue;
|
if(result == null || result.drop() == null || !scanOres.contains(result.drop()) || result.block() != Blocks.air) continue;
|
||||||
|
|
||||||
itemSet.add(result.drop());
|
itemSet.add(result.drop());
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -5,8 +5,7 @@ import io.anuke.arc.collection.IntArray;
|
|||||||
import io.anuke.arc.collection.IntQueue;
|
import io.anuke.arc.collection.IntQueue;
|
||||||
import io.anuke.arc.math.geom.Geometry;
|
import io.anuke.arc.math.geom.Geometry;
|
||||||
import io.anuke.arc.math.geom.Point2;
|
import io.anuke.arc.math.geom.Point2;
|
||||||
import io.anuke.arc.util.Structs;
|
import io.anuke.arc.util.*;
|
||||||
import io.anuke.arc.util.Time;
|
|
||||||
import io.anuke.mindustry.game.EventType.TileChangeEvent;
|
import io.anuke.mindustry.game.EventType.TileChangeEvent;
|
||||||
import io.anuke.mindustry.game.EventType.WorldLoadEvent;
|
import io.anuke.mindustry.game.EventType.WorldLoadEvent;
|
||||||
import io.anuke.mindustry.game.Team;
|
import io.anuke.mindustry.game.Team;
|
||||||
@@ -26,7 +25,7 @@ public class Pathfinder{
|
|||||||
public Pathfinder(){
|
public Pathfinder(){
|
||||||
Events.on(WorldLoadEvent.class, event -> clear());
|
Events.on(WorldLoadEvent.class, event -> clear());
|
||||||
Events.on(TileChangeEvent.class, event -> {
|
Events.on(TileChangeEvent.class, event -> {
|
||||||
if(Net.client()) return;
|
if(net.client()) return;
|
||||||
|
|
||||||
for(Team team : Team.all){
|
for(Team team : Team.all){
|
||||||
TeamData data = state.teams.get(team);
|
TeamData data = state.teams.get(team);
|
||||||
@@ -44,7 +43,7 @@ public class Pathfinder{
|
|||||||
}
|
}
|
||||||
|
|
||||||
public void update(){
|
public void update(){
|
||||||
if(Net.client() || paths == null) return;
|
if(net.client() || paths == null) return;
|
||||||
|
|
||||||
for(Team team : Team.all){
|
for(Team team : Team.all){
|
||||||
if(state.teams.isActive(team)){
|
if(state.teams.isActive(team)){
|
||||||
@@ -86,7 +85,7 @@ public class Pathfinder{
|
|||||||
}
|
}
|
||||||
|
|
||||||
private boolean passable(Tile tile, Team team){
|
private boolean passable(Tile tile, Team team){
|
||||||
return (!tile.solid()) || (tile.breakable() && (tile.getTeam() != team));
|
return ((!tile.solid()) || (tile.breakable() && (tile.getTeam() != team))) && tile.floor().drownTime <= 0f;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
@@ -14,7 +14,6 @@ import io.anuke.mindustry.entities.Effects;
|
|||||||
import io.anuke.mindustry.entities.type.BaseUnit;
|
import io.anuke.mindustry.entities.type.BaseUnit;
|
||||||
import io.anuke.mindustry.game.EventType.WorldLoadEvent;
|
import io.anuke.mindustry.game.EventType.WorldLoadEvent;
|
||||||
import io.anuke.mindustry.game.SpawnGroup;
|
import io.anuke.mindustry.game.SpawnGroup;
|
||||||
import io.anuke.mindustry.net.Net;
|
|
||||||
import io.anuke.mindustry.world.Tile;
|
import io.anuke.mindustry.world.Tile;
|
||||||
|
|
||||||
import static io.anuke.mindustry.Vars.*;
|
import static io.anuke.mindustry.Vars.*;
|
||||||
@@ -116,7 +115,7 @@ public class WaveSpawner{
|
|||||||
}
|
}
|
||||||
|
|
||||||
public boolean isSpawning(){
|
public boolean isSpawning(){
|
||||||
return spawning && !Net.client();
|
return spawning && !net.client();
|
||||||
}
|
}
|
||||||
|
|
||||||
private void reset(){
|
private void reset(){
|
||||||
|
|||||||
@@ -8,6 +8,7 @@ import io.anuke.arc.util.*;
|
|||||||
import io.anuke.mindustry.*;
|
import io.anuke.mindustry.*;
|
||||||
import io.anuke.mindustry.entities.*;
|
import io.anuke.mindustry.entities.*;
|
||||||
import io.anuke.mindustry.entities.bullet.*;
|
import io.anuke.mindustry.entities.bullet.*;
|
||||||
|
import io.anuke.mindustry.entities.type.Bullet;
|
||||||
import io.anuke.mindustry.game.*;
|
import io.anuke.mindustry.game.*;
|
||||||
import io.anuke.mindustry.gen.*;
|
import io.anuke.mindustry.gen.*;
|
||||||
import io.anuke.mindustry.graphics.*;
|
import io.anuke.mindustry.graphics.*;
|
||||||
@@ -500,6 +501,7 @@ public class Blocks implements ContentList{
|
|||||||
|
|
||||||
consumes.items(new ItemStack(Items.thorium, 4), new ItemStack(Items.sand, 10));
|
consumes.items(new ItemStack(Items.thorium, 4), new ItemStack(Items.sand, 10));
|
||||||
consumes.power(5f);
|
consumes.power(5f);
|
||||||
|
itemCapacity = 20;
|
||||||
|
|
||||||
int bottomRegion = reg("-bottom"), weaveRegion = reg("-weave");
|
int bottomRegion = reg("-bottom"), weaveRegion = reg("-weave");
|
||||||
|
|
||||||
@@ -589,7 +591,7 @@ public class Blocks implements ContentList{
|
|||||||
|
|
||||||
pyratiteMixer = new GenericSmelter("pyratite-mixer"){{
|
pyratiteMixer = new GenericSmelter("pyratite-mixer"){{
|
||||||
requirements(Category.crafting, ItemStack.with(Items.copper, 50, Items.lead, 25));
|
requirements(Category.crafting, ItemStack.with(Items.copper, 50, Items.lead, 25));
|
||||||
flameColor = Color.CLEAR;
|
flameColor = Color.clear;
|
||||||
hasItems = true;
|
hasItems = true;
|
||||||
hasPower = true;
|
hasPower = true;
|
||||||
outputItem = new ItemStack(Items.pyratite, 1);
|
outputItem = new ItemStack(Items.pyratite, 1);
|
||||||
@@ -660,7 +662,7 @@ public class Blocks implements ContentList{
|
|||||||
|
|
||||||
Draw.rect(region, tile.drawx(), tile.drawy());
|
Draw.rect(region, tile.drawx(), tile.drawy());
|
||||||
Draw.rect(reg(frameRegions[(int)Mathf.absin(entity.totalProgress, 5f, 2.999f)]), tile.drawx(), tile.drawy());
|
Draw.rect(reg(frameRegions[(int)Mathf.absin(entity.totalProgress, 5f, 2.999f)]), tile.drawx(), tile.drawy());
|
||||||
Draw.color(Color.CLEAR, tile.entity.liquids.current().color, tile.entity.liquids.total() / liquidCapacity);
|
Draw.color(Color.clear, tile.entity.liquids.current().color, tile.entity.liquids.total() / liquidCapacity);
|
||||||
Draw.rect(reg(liquidRegion), tile.drawx(), tile.drawy());
|
Draw.rect(reg(liquidRegion), tile.drawx(), tile.drawy());
|
||||||
Draw.color();
|
Draw.color();
|
||||||
Draw.rect(reg(topRegion), tile.drawx(), tile.drawy());
|
Draw.rect(reg(topRegion), tile.drawx(), tile.drawy());
|
||||||
@@ -982,7 +984,6 @@ public class Blocks implements ContentList{
|
|||||||
pulseConduit = new Conduit("pulse-conduit"){{
|
pulseConduit = new Conduit("pulse-conduit"){{
|
||||||
requirements(Category.liquid, ItemStack.with(Items.titanium, 1, Items.metaglass, 1));
|
requirements(Category.liquid, ItemStack.with(Items.titanium, 1, Items.metaglass, 1));
|
||||||
liquidCapacity = 16f;
|
liquidCapacity = 16f;
|
||||||
liquidFlowFactor = 4.9f;
|
|
||||||
health = 90;
|
health = 90;
|
||||||
}};
|
}};
|
||||||
|
|
||||||
@@ -1397,7 +1398,7 @@ public class Blocks implements ContentList{
|
|||||||
smokeEffect = Fx.lancerLaserShootSmoke;
|
smokeEffect = Fx.lancerLaserShootSmoke;
|
||||||
chargeEffect = Fx.lancerLaserCharge;
|
chargeEffect = Fx.lancerLaserCharge;
|
||||||
chargeBeginEffect = Fx.lancerLaserChargeBegin;
|
chargeBeginEffect = Fx.lancerLaserChargeBegin;
|
||||||
heatColor = Color.RED;
|
heatColor = Color.red;
|
||||||
size = 2;
|
size = 2;
|
||||||
health = 280 * size * size;
|
health = 280 * size * size;
|
||||||
targetAir = false;
|
targetAir = false;
|
||||||
@@ -1405,16 +1406,16 @@ public class Blocks implements ContentList{
|
|||||||
}};
|
}};
|
||||||
|
|
||||||
arc = new PowerTurret("arc"){{
|
arc = new PowerTurret("arc"){{
|
||||||
requirements(Category.turret, ItemStack.with(Items.copper, 35, Items.lead, 35));
|
requirements(Category.turret, ItemStack.with(Items.copper, 35, Items.lead, 50));
|
||||||
shootType = Bullets.arc;
|
shootType = Bullets.arc;
|
||||||
reload = 24f;
|
reload = 35f;
|
||||||
shootCone = 40f;
|
shootCone = 40f;
|
||||||
rotatespeed = 8f;
|
rotatespeed = 8f;
|
||||||
powerUse = 0.9f;
|
powerUse = 1.5f;
|
||||||
targetAir = false;
|
targetAir = false;
|
||||||
range = 95f;
|
range = 90f;
|
||||||
shootEffect = Fx.lightningShoot;
|
shootEffect = Fx.lightningShoot;
|
||||||
heatColor = Color.RED;
|
heatColor = Color.red;
|
||||||
recoil = 1f;
|
recoil = 1f;
|
||||||
size = 1;
|
size = 1;
|
||||||
health = 260;
|
health = 260;
|
||||||
@@ -1493,7 +1494,7 @@ public class Blocks implements ContentList{
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void init(Bullet b){
|
public void init(io.anuke.mindustry.entities.type.Bullet b){
|
||||||
for(int i = 0; i < rays; i++){
|
for(int i = 0; i < rays; i++){
|
||||||
Damage.collideLine(b, b.getTeam(), hitEffect, b.x, b.y, b.rot(), rayLength - Math.abs(i - (rays / 2)) * 20f);
|
Damage.collideLine(b, b.getTeam(), hitEffect, b.x, b.y, b.rot(), rayLength - Math.abs(i - (rays / 2)) * 20f);
|
||||||
}
|
}
|
||||||
@@ -1502,7 +1503,7 @@ public class Blocks implements ContentList{
|
|||||||
@Override
|
@Override
|
||||||
public void draw(Bullet b){
|
public void draw(Bullet b){
|
||||||
super.draw(b);
|
super.draw(b);
|
||||||
Draw.color(Color.WHITE, Pal.lancerLaser, b.fin());
|
Draw.color(Color.white, Pal.lancerLaser, b.fin());
|
||||||
//Draw.alpha(b.fout());
|
//Draw.alpha(b.fout());
|
||||||
for(int i = 0; i < 7; i++){
|
for(int i = 0; i < 7; i++){
|
||||||
Tmp.v1.trns(b.rot(), i * 8f);
|
Tmp.v1.trns(b.rot(), i * 8f);
|
||||||
|
|||||||
@@ -7,12 +7,14 @@ import io.anuke.arc.util.*;
|
|||||||
import io.anuke.mindustry.entities.*;
|
import io.anuke.mindustry.entities.*;
|
||||||
import io.anuke.mindustry.entities.bullet.*;
|
import io.anuke.mindustry.entities.bullet.*;
|
||||||
import io.anuke.mindustry.entities.effect.*;
|
import io.anuke.mindustry.entities.effect.*;
|
||||||
|
import io.anuke.mindustry.entities.type.*;
|
||||||
|
import io.anuke.mindustry.entities.type.Bullet;
|
||||||
import io.anuke.mindustry.game.*;
|
import io.anuke.mindustry.game.*;
|
||||||
import io.anuke.mindustry.graphics.*;
|
import io.anuke.mindustry.graphics.*;
|
||||||
import io.anuke.mindustry.world.*;
|
import io.anuke.mindustry.world.*;
|
||||||
import io.anuke.mindustry.world.blocks.*;
|
import io.anuke.mindustry.world.blocks.*;
|
||||||
|
|
||||||
import static io.anuke.mindustry.Vars.world;
|
import static io.anuke.mindustry.Vars.*;
|
||||||
|
|
||||||
public class Bullets implements ContentList{
|
public class Bullets implements ContentList{
|
||||||
public static BulletType
|
public static BulletType
|
||||||
@@ -249,7 +251,7 @@ public class Bullets implements ContentList{
|
|||||||
splashDamageRadius = 25f;
|
splashDamageRadius = 25f;
|
||||||
splashDamage = 10f;
|
splashDamage = 10f;
|
||||||
lifetime = 120f;
|
lifetime = 120f;
|
||||||
trailColor = Color.GRAY;
|
trailColor = Color.gray;
|
||||||
backColor = Pal.bulletYellowBack;
|
backColor = Pal.bulletYellowBack;
|
||||||
frontColor = Pal.bulletYellow;
|
frontColor = Pal.bulletYellow;
|
||||||
hitEffect = Fx.blastExplosion;
|
hitEffect = Fx.blastExplosion;
|
||||||
@@ -395,7 +397,7 @@ public class Bullets implements ContentList{
|
|||||||
Draw.color(Pal.heal);
|
Draw.color(Pal.heal);
|
||||||
Lines.stroke(2f);
|
Lines.stroke(2f);
|
||||||
Lines.lineAngleCenter(b.x, b.y, b.rot(), 7f);
|
Lines.lineAngleCenter(b.x, b.y, b.rot(), 7f);
|
||||||
Draw.color(Color.WHITE);
|
Draw.color(Color.white);
|
||||||
Lines.lineAngleCenter(b.x, b.y, b.rot(), 3f);
|
Lines.lineAngleCenter(b.x, b.y, b.rot(), 3f);
|
||||||
Draw.reset();
|
Draw.reset();
|
||||||
}
|
}
|
||||||
@@ -429,7 +431,7 @@ public class Bullets implements ContentList{
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void draw(Bullet b){
|
public void draw(Bullet b){
|
||||||
Draw.color(Pal.lightFlame, Pal.darkFlame, Color.GRAY, b.fin());
|
Draw.color(Pal.lightFlame, Pal.darkFlame, Color.gray, b.fin());
|
||||||
Fill.circle(b.x, b.y, 3f * b.fout());
|
Fill.circle(b.x, b.y, 3f * b.fout());
|
||||||
Draw.reset();
|
Draw.reset();
|
||||||
}
|
}
|
||||||
@@ -497,7 +499,7 @@ public class Bullets implements ContentList{
|
|||||||
};
|
};
|
||||||
|
|
||||||
lancerLaser = new BulletType(0.001f, 140){
|
lancerLaser = new BulletType(0.001f, 140){
|
||||||
Color[] colors = {Pal.lancerLaser.cpy().mul(1f, 1f, 1f, 0.4f), Pal.lancerLaser, Color.WHITE};
|
Color[] colors = {Pal.lancerLaser.cpy().mul(1f, 1f, 1f, 0.4f), Pal.lancerLaser, Color.white};
|
||||||
float[] tscales = {1f, 0.7f, 0.5f, 0.2f};
|
float[] tscales = {1f, 0.7f, 0.5f, 0.2f};
|
||||||
float[] lenscales = {1f, 1.1f, 1.13f, 1.14f};
|
float[] lenscales = {1f, 1.1f, 1.13f, 1.14f};
|
||||||
float length = 160f;
|
float length = 160f;
|
||||||
@@ -539,7 +541,7 @@ public class Bullets implements ContentList{
|
|||||||
|
|
||||||
meltdownLaser = new BulletType(0.001f, 70){
|
meltdownLaser = new BulletType(0.001f, 70){
|
||||||
Color tmpColor = new Color();
|
Color tmpColor = new Color();
|
||||||
Color[] colors = {Color.valueOf("ec745855"), Color.valueOf("ec7458aa"), Color.valueOf("ff9c5a"), Color.WHITE};
|
Color[] colors = {Color.valueOf("ec745855"), Color.valueOf("ec7458aa"), Color.valueOf("ff9c5a"), Color.white};
|
||||||
float[] tscales = {1f, 0.7f, 0.5f, 0.2f};
|
float[] tscales = {1f, 0.7f, 0.5f, 0.2f};
|
||||||
float[] strokes = {2f, 1.5f, 1f, 0.3f};
|
float[] strokes = {2f, 1.5f, 1f, 0.3f};
|
||||||
float[] lenscales = {1f, 1.12f, 1.15f, 1.17f};
|
float[] lenscales = {1f, 1.12f, 1.15f, 1.17f};
|
||||||
@@ -631,11 +633,11 @@ public class Bullets implements ContentList{
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void init(Bullet b){
|
public void init(Bullet b){
|
||||||
Lightning.create(b.getTeam(), Pal.lancerLaser, damage, b.x, b.y, b.rot(), 30);
|
Lightning.create(b.getTeam(), Pal.lancerLaser, damage * (b.getOwner() instanceof Player ? state.rules.playerDamageMultiplier : 1f), b.x, b.y, b.rot(), 30);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
arc = new BulletType(0.001f, 25){
|
arc = new BulletType(0.001f, 21){
|
||||||
{
|
{
|
||||||
lifetime = 1;
|
lifetime = 1;
|
||||||
despawnEffect = Fx.none;
|
despawnEffect = Fx.none;
|
||||||
@@ -687,7 +689,7 @@ public class Bullets implements ContentList{
|
|||||||
bulletHeight = 12f;
|
bulletHeight = 12f;
|
||||||
hitEffect = Fx.pulverize;
|
hitEffect = Fx.pulverize;
|
||||||
backColor = new Color(0x4f4f4fff);
|
backColor = new Color(0x4f4f4fff);
|
||||||
frontColor = Color.GRAY;
|
frontColor = Color.gray;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|||||||
@@ -1,19 +1,17 @@
|
|||||||
package io.anuke.mindustry.content;
|
package io.anuke.mindustry.content;
|
||||||
|
|
||||||
import io.anuke.arc.Core;
|
import io.anuke.arc.*;
|
||||||
import io.anuke.arc.graphics.Color;
|
import io.anuke.arc.graphics.*;
|
||||||
import io.anuke.arc.graphics.g2d.*;
|
import io.anuke.arc.graphics.g2d.*;
|
||||||
import io.anuke.arc.math.Angles;
|
import io.anuke.arc.math.*;
|
||||||
import io.anuke.arc.math.Mathf;
|
import io.anuke.arc.util.*;
|
||||||
import io.anuke.arc.util.Tmp;
|
import io.anuke.mindustry.entities.Effects.*;
|
||||||
import io.anuke.mindustry.entities.Effects.Effect;
|
import io.anuke.mindustry.entities.effect.GroundEffectEntity.*;
|
||||||
import io.anuke.mindustry.entities.effect.GroundEffectEntity.GroundEffect;
|
import io.anuke.mindustry.entities.type.*;
|
||||||
import io.anuke.mindustry.entities.type.BaseUnit;
|
import io.anuke.mindustry.game.*;
|
||||||
import io.anuke.mindustry.game.ContentList;
|
import io.anuke.mindustry.graphics.*;
|
||||||
import io.anuke.mindustry.graphics.Pal;
|
import io.anuke.mindustry.type.*;
|
||||||
import io.anuke.mindustry.graphics.Drawf;
|
import io.anuke.mindustry.type.Item.*;
|
||||||
import io.anuke.mindustry.type.Item;
|
|
||||||
import io.anuke.mindustry.type.Item.Icon;
|
|
||||||
|
|
||||||
import static io.anuke.mindustry.Vars.tilesize;
|
import static io.anuke.mindustry.Vars.tilesize;
|
||||||
|
|
||||||
@@ -32,7 +30,7 @@ public class Fx implements ContentList{
|
|||||||
bigShockwave, nuclearShockwave, explosion, blockExplosion, blockExplosionSmoke, shootSmall, shootHeal, shootSmallSmoke, shootBig, shootBig2, shootBigSmoke,
|
bigShockwave, nuclearShockwave, explosion, blockExplosion, blockExplosionSmoke, shootSmall, shootHeal, shootSmallSmoke, shootBig, shootBig2, shootBigSmoke,
|
||||||
shootBigSmoke2, shootSmallFlame, shootPyraFlame, shootLiquid, shellEjectSmall, shellEjectMedium,
|
shootBigSmoke2, shootSmallFlame, shootPyraFlame, shootLiquid, shellEjectSmall, shellEjectMedium,
|
||||||
shellEjectBig, lancerLaserShoot, lancerLaserShootSmoke, lancerLaserCharge, lancerLaserChargeBegin, lightningCharge, lightningShoot,
|
shellEjectBig, lancerLaserShoot, lancerLaserShootSmoke, lancerLaserCharge, lancerLaserChargeBegin, lightningCharge, lightningShoot,
|
||||||
unitSpawn, spawnShockwave, magmasmoke, impactShockwave, impactcloud, impactsmoke, dynamicExplosion, padlaunch, commandSend;
|
unitSpawn, spawnShockwave, magmasmoke, impactShockwave, impactcloud, impactsmoke, dynamicExplosion, padlaunch, commandSend, coreLand;
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void load(){
|
public void load(){
|
||||||
@@ -93,14 +91,14 @@ public class Fx implements ContentList{
|
|||||||
});
|
});
|
||||||
|
|
||||||
smoke = new Effect(100, e -> {
|
smoke = new Effect(100, e -> {
|
||||||
Draw.color(Color.GRAY, Pal.darkishGray, e.fin());
|
Draw.color(Color.gray, Pal.darkishGray, e.fin());
|
||||||
float size = 7f - e.fin() * 7f;
|
float size = 7f - e.fin() * 7f;
|
||||||
Draw.rect("circle", e.x, e.y, size, size);
|
Draw.rect("circle", e.x, e.y, size, size);
|
||||||
Draw.reset();
|
Draw.reset();
|
||||||
});
|
});
|
||||||
|
|
||||||
magmasmoke = new Effect(110, e -> {
|
magmasmoke = new Effect(110, e -> {
|
||||||
Draw.color(Color.GRAY);
|
Draw.color(Color.gray);
|
||||||
Fill.circle(e.x, e.y, e.fslope() * 6f);
|
Fill.circle(e.x, e.y, e.fslope() * 6f);
|
||||||
Draw.reset();
|
Draw.reset();
|
||||||
});
|
});
|
||||||
@@ -180,7 +178,7 @@ public class Fx implements ContentList{
|
|||||||
|
|
||||||
|
|
||||||
hitBulletSmall = new Effect(14, e -> {
|
hitBulletSmall = new Effect(14, e -> {
|
||||||
Draw.color(Color.WHITE, Pal.lightOrange, e.fin());
|
Draw.color(Color.white, Pal.lightOrange, e.fin());
|
||||||
|
|
||||||
e.scaled(7f, s -> {
|
e.scaled(7f, s -> {
|
||||||
Lines.stroke(0.5f + s.fout());
|
Lines.stroke(0.5f + s.fout());
|
||||||
@@ -199,7 +197,7 @@ public class Fx implements ContentList{
|
|||||||
});
|
});
|
||||||
|
|
||||||
hitFuse = new Effect(14, e -> {
|
hitFuse = new Effect(14, e -> {
|
||||||
Draw.color(Color.WHITE, Pal.surge, e.fin());
|
Draw.color(Color.white, Pal.surge, e.fin());
|
||||||
|
|
||||||
e.scaled(7f, s -> {
|
e.scaled(7f, s -> {
|
||||||
Lines.stroke(0.5f + s.fout());
|
Lines.stroke(0.5f + s.fout());
|
||||||
@@ -218,7 +216,7 @@ public class Fx implements ContentList{
|
|||||||
});
|
});
|
||||||
|
|
||||||
hitBulletBig = new Effect(13, e -> {
|
hitBulletBig = new Effect(13, e -> {
|
||||||
Draw.color(Color.WHITE, Pal.lightOrange, e.fin());
|
Draw.color(Color.white, Pal.lightOrange, e.fin());
|
||||||
Lines.stroke(0.5f + e.fout() * 1.5f);
|
Lines.stroke(0.5f + e.fout() * 1.5f);
|
||||||
|
|
||||||
Angles.randLenVectors(e.id, 8, e.finpow() * 30f, e.rotation, 50f, (x, y) -> {
|
Angles.randLenVectors(e.id, 8, e.finpow() * 30f, e.rotation, 50f, (x, y) -> {
|
||||||
@@ -252,7 +250,7 @@ public class Fx implements ContentList{
|
|||||||
});
|
});
|
||||||
|
|
||||||
hitLancer = new Effect(12, e -> {
|
hitLancer = new Effect(12, e -> {
|
||||||
Draw.color(Color.WHITE);
|
Draw.color(Color.white);
|
||||||
Lines.stroke(e.fout() * 1.5f);
|
Lines.stroke(e.fout() * 1.5f);
|
||||||
|
|
||||||
Angles.randLenVectors(e.id, 8, e.finpow() * 17f, e.rotation, 360f, (x, y) -> {
|
Angles.randLenVectors(e.id, 8, e.finpow() * 17f, e.rotation, 360f, (x, y) -> {
|
||||||
@@ -276,14 +274,14 @@ public class Fx implements ContentList{
|
|||||||
});
|
});
|
||||||
|
|
||||||
hitLaser = new Effect(8, e -> {
|
hitLaser = new Effect(8, e -> {
|
||||||
Draw.color(Color.WHITE, Pal.heal, e.fin());
|
Draw.color(Color.white, Pal.heal, e.fin());
|
||||||
Lines.stroke(0.5f + e.fout());
|
Lines.stroke(0.5f + e.fout());
|
||||||
Lines.circle(e.x, e.y, e.fin() * 5f);
|
Lines.circle(e.x, e.y, e.fin() * 5f);
|
||||||
Draw.reset();
|
Draw.reset();
|
||||||
});
|
});
|
||||||
|
|
||||||
despawn = new Effect(12, e -> {
|
despawn = new Effect(12, e -> {
|
||||||
Draw.color(Pal.lighterOrange, Color.GRAY, e.fin());
|
Draw.color(Pal.lighterOrange, Color.gray, e.fin());
|
||||||
Lines.stroke(e.fout());
|
Lines.stroke(e.fout());
|
||||||
|
|
||||||
Angles.randLenVectors(e.id, 7, e.fin() * 7f, e.rotation, 40f, (x, y) -> {
|
Angles.randLenVectors(e.id, 7, e.fin() * 7f, e.rotation, 40f, (x, y) -> {
|
||||||
@@ -302,7 +300,7 @@ public class Fx implements ContentList{
|
|||||||
Lines.circle(e.x, e.y, 3f + i.fin() * 10f);
|
Lines.circle(e.x, e.y, 3f + i.fin() * 10f);
|
||||||
});
|
});
|
||||||
|
|
||||||
Draw.color(Color.GRAY);
|
Draw.color(Color.gray);
|
||||||
|
|
||||||
Angles.randLenVectors(e.id, 5, 2f + 23f * e.finpow(), (x, y) -> {
|
Angles.randLenVectors(e.id, 5, 2f + 23f * e.finpow(), (x, y) -> {
|
||||||
Fill.circle(e.x + x, e.y + y, e.fout() * 3f + 0.5f);
|
Fill.circle(e.x + x, e.y + y, e.fout() * 3f + 0.5f);
|
||||||
@@ -326,7 +324,7 @@ public class Fx implements ContentList{
|
|||||||
Lines.circle(e.x, e.y, 3f + i.fin() * 24f);
|
Lines.circle(e.x, e.y, 3f + i.fin() * 24f);
|
||||||
});
|
});
|
||||||
|
|
||||||
Draw.color(Color.GRAY);
|
Draw.color(Color.gray);
|
||||||
|
|
||||||
Angles.randLenVectors(e.id, 7, 2f + 28f * e.finpow(), (x, y) -> {
|
Angles.randLenVectors(e.id, 7, 2f + 28f * e.finpow(), (x, y) -> {
|
||||||
Fill.circle(e.x + x, e.y + y, e.fout() * 4f + 0.5f);
|
Fill.circle(e.x + x, e.y + y, e.fout() * 4f + 0.5f);
|
||||||
@@ -350,7 +348,7 @@ public class Fx implements ContentList{
|
|||||||
Lines.circle(e.x, e.y, 3f + i.fin() * 34f);
|
Lines.circle(e.x, e.y, 3f + i.fin() * 34f);
|
||||||
});
|
});
|
||||||
|
|
||||||
Draw.color(Color.GRAY);
|
Draw.color(Color.gray);
|
||||||
|
|
||||||
Angles.randLenVectors(e.id, 7, 2f + 30f * e.finpow(), (x, y) -> {
|
Angles.randLenVectors(e.id, 7, 2f + 30f * e.finpow(), (x, y) -> {
|
||||||
Fill.circle(e.x + x, e.y + y, e.fout() * 4f + 0.5f);
|
Fill.circle(e.x + x, e.y + y, e.fout() * 4f + 0.5f);
|
||||||
@@ -374,7 +372,7 @@ public class Fx implements ContentList{
|
|||||||
Lines.circle(e.x, e.y, 3f + i.fin() * 15f);
|
Lines.circle(e.x, e.y, 3f + i.fin() * 15f);
|
||||||
});
|
});
|
||||||
|
|
||||||
Draw.color(Color.GRAY);
|
Draw.color(Color.gray);
|
||||||
|
|
||||||
Angles.randLenVectors(e.id, 5, 2f + 23f * e.finpow(), (x, y) -> {
|
Angles.randLenVectors(e.id, 5, 2f + 23f * e.finpow(), (x, y) -> {
|
||||||
Fill.circle(e.x + x, e.y + y, e.fout() * 4f + 0.5f);
|
Fill.circle(e.x + x, e.y + y, e.fout() * 4f + 0.5f);
|
||||||
@@ -423,7 +421,7 @@ public class Fx implements ContentList{
|
|||||||
Lines.circle(e.x, e.y, 3f + i.fin() * 25f);
|
Lines.circle(e.x, e.y, 3f + i.fin() * 25f);
|
||||||
});
|
});
|
||||||
|
|
||||||
Draw.color(Color.GRAY);
|
Draw.color(Color.gray);
|
||||||
|
|
||||||
Angles.randLenVectors(e.id, 6, 2f + 23f * e.finpow(), (x, y) -> {
|
Angles.randLenVectors(e.id, 6, 2f + 23f * e.finpow(), (x, y) -> {
|
||||||
Fill.circle(e.x + x, e.y + y, e.fout() * 4f + 0.5f);
|
Fill.circle(e.x + x, e.y + y, e.fout() * 4f + 0.5f);
|
||||||
@@ -461,7 +459,7 @@ public class Fx implements ContentList{
|
|||||||
});
|
});
|
||||||
|
|
||||||
fireSmoke = new Effect(35f, e -> {
|
fireSmoke = new Effect(35f, e -> {
|
||||||
Draw.color(Color.GRAY);
|
Draw.color(Color.gray);
|
||||||
|
|
||||||
Angles.randLenVectors(e.id, 1, 2f + e.fin() * 7f, (x, y) -> {
|
Angles.randLenVectors(e.id, 1, 2f + e.fin() * 7f, (x, y) -> {
|
||||||
Fill.circle(e.x + x, e.y + y, 0.2f + e.fslope() * 1.5f);
|
Fill.circle(e.x + x, e.y + y, 0.2f + e.fslope() * 1.5f);
|
||||||
@@ -471,7 +469,7 @@ public class Fx implements ContentList{
|
|||||||
});
|
});
|
||||||
|
|
||||||
steam = new Effect(35f, e -> {
|
steam = new Effect(35f, e -> {
|
||||||
Draw.color(Color.LIGHT_GRAY);
|
Draw.color(Color.lightGray);
|
||||||
|
|
||||||
Angles.randLenVectors(e.id, 2, 2f + e.fin() * 7f, (x, y) -> {
|
Angles.randLenVectors(e.id, 2, 2f + e.fin() * 7f, (x, y) -> {
|
||||||
Fill.circle(e.x + x, e.y + y, 0.2f + e.fslope() * 1.5f);
|
Fill.circle(e.x + x, e.y + y, 0.2f + e.fslope() * 1.5f);
|
||||||
@@ -481,7 +479,7 @@ public class Fx implements ContentList{
|
|||||||
});
|
});
|
||||||
|
|
||||||
fireballsmoke = new Effect(25f, e -> {
|
fireballsmoke = new Effect(25f, e -> {
|
||||||
Draw.color(Color.GRAY);
|
Draw.color(Color.gray);
|
||||||
|
|
||||||
Angles.randLenVectors(e.id, 1, 2f + e.fin() * 7f, (x, y) -> {
|
Angles.randLenVectors(e.id, 1, 2f + e.fin() * 7f, (x, y) -> {
|
||||||
Fill.circle(e.x + x, e.y + y, 0.2f + e.fout() * 1.5f);
|
Fill.circle(e.x + x, e.y + y, 0.2f + e.fout() * 1.5f);
|
||||||
@@ -511,7 +509,7 @@ public class Fx implements ContentList{
|
|||||||
});
|
});
|
||||||
|
|
||||||
melting = new Effect(40f, e -> {
|
melting = new Effect(40f, e -> {
|
||||||
Draw.color(Liquids.slag.color, Color.WHITE, e.fout() / 5f + Mathf.randomSeedRange(e.id, 0.12f));
|
Draw.color(Liquids.slag.color, Color.white, e.fout() / 5f + Mathf.randomSeedRange(e.id, 0.12f));
|
||||||
|
|
||||||
Angles.randLenVectors(e.id, 2, 1f + e.fin() * 3f, (x, y) -> {
|
Angles.randLenVectors(e.id, 2, 1f + e.fin() * 3f, (x, y) -> {
|
||||||
Fill.circle(e.x + x, e.y + y, .2f + e.fout() * 1.2f);
|
Fill.circle(e.x + x, e.y + y, .2f + e.fout() * 1.2f);
|
||||||
@@ -559,35 +557,35 @@ public class Fx implements ContentList{
|
|||||||
|
|
||||||
|
|
||||||
shockwave = new Effect(10f, 80f, e -> {
|
shockwave = new Effect(10f, 80f, e -> {
|
||||||
Draw.color(Color.WHITE, Color.LIGHT_GRAY, e.fin());
|
Draw.color(Color.white, Color.lightGray, e.fin());
|
||||||
Lines.stroke(e.fout() * 2f + 0.2f);
|
Lines.stroke(e.fout() * 2f + 0.2f);
|
||||||
Lines.circle(e.x, e.y, e.fin() * 28f);
|
Lines.circle(e.x, e.y, e.fin() * 28f);
|
||||||
Draw.reset();
|
Draw.reset();
|
||||||
});
|
});
|
||||||
|
|
||||||
bigShockwave = new Effect(10f, 80f, e -> {
|
bigShockwave = new Effect(10f, 80f, e -> {
|
||||||
Draw.color(Color.WHITE, Color.LIGHT_GRAY, e.fin());
|
Draw.color(Color.white, Color.lightGray, e.fin());
|
||||||
Lines.stroke(e.fout() * 3f);
|
Lines.stroke(e.fout() * 3f);
|
||||||
Lines.circle(e.x, e.y, e.fin() * 50f);
|
Lines.circle(e.x, e.y, e.fin() * 50f);
|
||||||
Draw.reset();
|
Draw.reset();
|
||||||
});
|
});
|
||||||
|
|
||||||
nuclearShockwave = new Effect(10f, 200f, e -> {
|
nuclearShockwave = new Effect(10f, 200f, e -> {
|
||||||
Draw.color(Color.WHITE, Color.LIGHT_GRAY, e.fin());
|
Draw.color(Color.white, Color.lightGray, e.fin());
|
||||||
Lines.stroke(e.fout() * 3f + 0.2f);
|
Lines.stroke(e.fout() * 3f + 0.2f);
|
||||||
Lines.circle(e.x, e.y, e.fin() * 140f);
|
Lines.circle(e.x, e.y, e.fin() * 140f);
|
||||||
Draw.reset();
|
Draw.reset();
|
||||||
});
|
});
|
||||||
|
|
||||||
impactShockwave = new Effect(13f, 300f, e -> {
|
impactShockwave = new Effect(13f, 300f, e -> {
|
||||||
Draw.color(Pal.lighterOrange, Color.LIGHT_GRAY, e.fin());
|
Draw.color(Pal.lighterOrange, Color.lightGray, e.fin());
|
||||||
Lines.stroke(e.fout() * 4f + 0.2f);
|
Lines.stroke(e.fout() * 4f + 0.2f);
|
||||||
Lines.circle(e.x, e.y, e.fin() * 200f);
|
Lines.circle(e.x, e.y, e.fin() * 200f);
|
||||||
Draw.reset();
|
Draw.reset();
|
||||||
});
|
});
|
||||||
|
|
||||||
spawnShockwave = new Effect(20f, 400f, e -> {
|
spawnShockwave = new Effect(20f, 400f, e -> {
|
||||||
Draw.color(Color.WHITE, Color.LIGHT_GRAY, e.fin());
|
Draw.color(Color.white, Color.lightGray, e.fin());
|
||||||
Lines.stroke(e.fout() * 3f + 0.5f);
|
Lines.stroke(e.fout() * 3f + 0.5f);
|
||||||
Lines.circle(e.x, e.y, e.fin() * (e.rotation + 50f));
|
Lines.circle(e.x, e.y, e.fin() * (e.rotation + 50f));
|
||||||
Draw.reset();
|
Draw.reset();
|
||||||
@@ -599,14 +597,14 @@ public class Fx implements ContentList{
|
|||||||
Lines.circle(e.x, e.y, 3f + i.fin() * 10f);
|
Lines.circle(e.x, e.y, 3f + i.fin() * 10f);
|
||||||
});
|
});
|
||||||
|
|
||||||
Draw.color(Color.GRAY);
|
Draw.color(Color.gray);
|
||||||
|
|
||||||
Angles.randLenVectors(e.id, 6, 2f + 19f * e.finpow(), (x, y) -> {
|
Angles.randLenVectors(e.id, 6, 2f + 19f * e.finpow(), (x, y) -> {
|
||||||
Fill.circle(e.x + x, e.y + y, e.fout() * 3f + 0.5f);
|
Fill.circle(e.x + x, e.y + y, e.fout() * 3f + 0.5f);
|
||||||
Fill.circle(e.x + x / 2f, e.y + y / 2f, e.fout() * 1f);
|
Fill.circle(e.x + x / 2f, e.y + y / 2f, e.fout() * 1f);
|
||||||
});
|
});
|
||||||
|
|
||||||
Draw.color(Pal.lighterOrange, Pal.lightOrange, Color.GRAY, e.fin());
|
Draw.color(Pal.lighterOrange, Pal.lightOrange, Color.gray, e.fin());
|
||||||
Lines.stroke(1.5f * e.fout());
|
Lines.stroke(1.5f * e.fout());
|
||||||
|
|
||||||
Angles.randLenVectors(e.id + 1, 8, 1f + 23f * e.finpow(), (x, y) -> {
|
Angles.randLenVectors(e.id + 1, 8, 1f + 23f * e.finpow(), (x, y) -> {
|
||||||
@@ -624,14 +622,14 @@ public class Fx implements ContentList{
|
|||||||
Lines.circle(e.x, e.y, (3f + i.fin() * 14f) * intensity);
|
Lines.circle(e.x, e.y, (3f + i.fin() * 14f) * intensity);
|
||||||
});
|
});
|
||||||
|
|
||||||
Draw.color(Color.GRAY);
|
Draw.color(Color.gray);
|
||||||
|
|
||||||
Angles.randLenVectors(e.id, e.finpow(), (int)(6 * intensity), 21f * intensity, (x, y, in, out) -> {
|
Angles.randLenVectors(e.id, e.finpow(), (int)(6 * intensity), 21f * intensity, (x, y, in, out) -> {
|
||||||
Fill.circle(e.x + x, e.y + y, out * (2f + intensity) * 3 + 0.5f);
|
Fill.circle(e.x + x, e.y + y, out * (2f + intensity) * 3 + 0.5f);
|
||||||
Fill.circle(e.x + x / 2f, e.y + y / 2f, out * (intensity) * 3);
|
Fill.circle(e.x + x / 2f, e.y + y / 2f, out * (intensity) * 3);
|
||||||
});
|
});
|
||||||
|
|
||||||
Draw.color(Pal.lighterOrange, Pal.lightOrange, Color.GRAY, e.fin());
|
Draw.color(Pal.lighterOrange, Pal.lightOrange, Color.gray, e.fin());
|
||||||
Lines.stroke((1.7f * e.fout()) * (1f + (intensity - 1f) / 2f));
|
Lines.stroke((1.7f * e.fout()) * (1f + (intensity - 1f) / 2f));
|
||||||
|
|
||||||
Angles.randLenVectors(e.id + 1, e.finpow(), (int)(9 * intensity), 40f * intensity, (x, y, in, out) -> {
|
Angles.randLenVectors(e.id + 1, e.finpow(), (int)(9 * intensity), 40f * intensity, (x, y, in, out) -> {
|
||||||
@@ -647,14 +645,14 @@ public class Fx implements ContentList{
|
|||||||
Lines.circle(e.x, e.y, 3f + i.fin() * 14f);
|
Lines.circle(e.x, e.y, 3f + i.fin() * 14f);
|
||||||
});
|
});
|
||||||
|
|
||||||
Draw.color(Color.GRAY);
|
Draw.color(Color.gray);
|
||||||
|
|
||||||
Angles.randLenVectors(e.id, 6, 2f + 19f * e.finpow(), (x, y) -> {
|
Angles.randLenVectors(e.id, 6, 2f + 19f * e.finpow(), (x, y) -> {
|
||||||
Fill.circle(e.x + x, e.y + y, e.fout() * 3f + 0.5f);
|
Fill.circle(e.x + x, e.y + y, e.fout() * 3f + 0.5f);
|
||||||
Fill.circle(e.x + x / 2f, e.y + y / 2f, e.fout() * 1f);
|
Fill.circle(e.x + x / 2f, e.y + y / 2f, e.fout() * 1f);
|
||||||
});
|
});
|
||||||
|
|
||||||
Draw.color(Pal.lighterOrange, Pal.lightOrange, Color.GRAY, e.fin());
|
Draw.color(Pal.lighterOrange, Pal.lightOrange, Color.gray, e.fin());
|
||||||
Lines.stroke(1.7f * e.fout());
|
Lines.stroke(1.7f * e.fout());
|
||||||
|
|
||||||
Angles.randLenVectors(e.id + 1, 9, 1f + 23f * e.finpow(), (x, y) -> {
|
Angles.randLenVectors(e.id + 1, 9, 1f + 23f * e.finpow(), (x, y) -> {
|
||||||
@@ -665,7 +663,7 @@ public class Fx implements ContentList{
|
|||||||
});
|
});
|
||||||
|
|
||||||
blockExplosionSmoke = new Effect(30, e -> {
|
blockExplosionSmoke = new Effect(30, e -> {
|
||||||
Draw.color(Color.GRAY);
|
Draw.color(Color.gray);
|
||||||
|
|
||||||
Angles.randLenVectors(e.id, 6, 4f + 30f * e.finpow(), (x, y) -> {
|
Angles.randLenVectors(e.id, 6, 4f + 30f * e.finpow(), (x, y) -> {
|
||||||
Fill.circle(e.x + x, e.y + y, e.fout() * 3f);
|
Fill.circle(e.x + x, e.y + y, e.fout() * 3f);
|
||||||
@@ -693,7 +691,7 @@ public class Fx implements ContentList{
|
|||||||
});
|
});
|
||||||
|
|
||||||
shootSmallSmoke = new Effect(20f, e -> {
|
shootSmallSmoke = new Effect(20f, e -> {
|
||||||
Draw.color(Pal.lighterOrange, Color.LIGHT_GRAY, Color.GRAY, e.fin());
|
Draw.color(Pal.lighterOrange, Color.lightGray, Color.gray, e.fin());
|
||||||
|
|
||||||
Angles.randLenVectors(e.id, 5, e.finpow() * 6f, e.rotation, 20f, (x, y) -> {
|
Angles.randLenVectors(e.id, 5, e.finpow() * 6f, e.rotation, 20f, (x, y) -> {
|
||||||
Fill.circle(e.x + x, e.y + y, e.fout() * 1.5f);
|
Fill.circle(e.x + x, e.y + y, e.fout() * 1.5f);
|
||||||
@@ -711,7 +709,7 @@ public class Fx implements ContentList{
|
|||||||
});
|
});
|
||||||
|
|
||||||
shootBig2 = new Effect(10, e -> {
|
shootBig2 = new Effect(10, e -> {
|
||||||
Draw.color(Pal.lightOrange, Color.GRAY, e.fin());
|
Draw.color(Pal.lightOrange, Color.gray, e.fin());
|
||||||
float w = 1.2f + 8 * e.fout();
|
float w = 1.2f + 8 * e.fout();
|
||||||
Drawf.tri(e.x, e.y, w, 29f * e.fout(), e.rotation);
|
Drawf.tri(e.x, e.y, w, 29f * e.fout(), e.rotation);
|
||||||
Drawf.tri(e.x, e.y, w, 5f * e.fout(), e.rotation + 180f);
|
Drawf.tri(e.x, e.y, w, 5f * e.fout(), e.rotation + 180f);
|
||||||
@@ -719,7 +717,7 @@ public class Fx implements ContentList{
|
|||||||
});
|
});
|
||||||
|
|
||||||
shootBigSmoke = new Effect(17f, e -> {
|
shootBigSmoke = new Effect(17f, e -> {
|
||||||
Draw.color(Pal.lighterOrange, Color.LIGHT_GRAY, Color.GRAY, e.fin());
|
Draw.color(Pal.lighterOrange, Color.lightGray, Color.gray, e.fin());
|
||||||
|
|
||||||
Angles.randLenVectors(e.id, 8, e.finpow() * 19f, e.rotation, 10f, (x, y) -> {
|
Angles.randLenVectors(e.id, 8, e.finpow() * 19f, e.rotation, 10f, (x, y) -> {
|
||||||
Fill.circle(e.x + x, e.y + y, e.fout() * 2f + 0.2f);
|
Fill.circle(e.x + x, e.y + y, e.fout() * 2f + 0.2f);
|
||||||
@@ -729,7 +727,7 @@ public class Fx implements ContentList{
|
|||||||
});
|
});
|
||||||
|
|
||||||
shootBigSmoke2 = new Effect(18f, e -> {
|
shootBigSmoke2 = new Effect(18f, e -> {
|
||||||
Draw.color(Pal.lightOrange, Color.LIGHT_GRAY, Color.GRAY, e.fin());
|
Draw.color(Pal.lightOrange, Color.lightGray, Color.gray, e.fin());
|
||||||
|
|
||||||
Angles.randLenVectors(e.id, 9, e.finpow() * 23f, e.rotation, 20f, (x, y) -> {
|
Angles.randLenVectors(e.id, 9, e.finpow() * 23f, e.rotation, 20f, (x, y) -> {
|
||||||
Fill.circle(e.x + x, e.y + y, e.fout() * 2.4f + 0.2f);
|
Fill.circle(e.x + x, e.y + y, e.fout() * 2.4f + 0.2f);
|
||||||
@@ -739,7 +737,7 @@ public class Fx implements ContentList{
|
|||||||
});
|
});
|
||||||
|
|
||||||
shootSmallFlame = new Effect(32f, e -> {
|
shootSmallFlame = new Effect(32f, e -> {
|
||||||
Draw.color(Pal.lightFlame, Pal.darkFlame, Color.GRAY, e.fin());
|
Draw.color(Pal.lightFlame, Pal.darkFlame, Color.gray, e.fin());
|
||||||
|
|
||||||
Angles.randLenVectors(e.id, 8, e.finpow() * 60f, e.rotation, 10f, (x, y) -> {
|
Angles.randLenVectors(e.id, 8, e.finpow() * 60f, e.rotation, 10f, (x, y) -> {
|
||||||
Fill.circle(e.x + x, e.y + y, 0.65f + e.fout() * 1.5f);
|
Fill.circle(e.x + x, e.y + y, 0.65f + e.fout() * 1.5f);
|
||||||
@@ -749,7 +747,7 @@ public class Fx implements ContentList{
|
|||||||
});
|
});
|
||||||
|
|
||||||
shootPyraFlame = new Effect(33f, e -> {
|
shootPyraFlame = new Effect(33f, e -> {
|
||||||
Draw.color(Pal.lightPyraFlame, Pal.darkPyraFlame, Color.GRAY, e.fin());
|
Draw.color(Pal.lightPyraFlame, Pal.darkPyraFlame, Color.gray, e.fin());
|
||||||
|
|
||||||
Angles.randLenVectors(e.id, 10, e.finpow() * 70f, e.rotation, 10f, (x, y) -> {
|
Angles.randLenVectors(e.id, 10, e.finpow() * 70f, e.rotation, 10f, (x, y) -> {
|
||||||
Fill.circle(e.x + x, e.y + y, 0.65f + e.fout() * 1.6f);
|
Fill.circle(e.x + x, e.y + y, 0.65f + e.fout() * 1.6f);
|
||||||
@@ -759,7 +757,7 @@ public class Fx implements ContentList{
|
|||||||
});
|
});
|
||||||
|
|
||||||
shootLiquid = new Effect(40f, e -> {
|
shootLiquid = new Effect(40f, e -> {
|
||||||
Draw.color(e.color, Color.WHITE, e.fout() / 6f + Mathf.randomSeedRange(e.id, 0.1f));
|
Draw.color(e.color, Color.white, e.fout() / 6f + Mathf.randomSeedRange(e.id, 0.1f));
|
||||||
|
|
||||||
Angles.randLenVectors(e.id, 6, e.finpow() * 60f, e.rotation, 11f, (x, y) -> {
|
Angles.randLenVectors(e.id, 6, e.finpow() * 60f, e.rotation, 11f, (x, y) -> {
|
||||||
Fill.circle(e.x + x, e.y + y, 0.5f + e.fout() * 2.5f);
|
Fill.circle(e.x + x, e.y + y, 0.5f + e.fout() * 2.5f);
|
||||||
@@ -769,7 +767,7 @@ public class Fx implements ContentList{
|
|||||||
});
|
});
|
||||||
|
|
||||||
shellEjectSmall = new GroundEffect(30f, 400f, e -> {
|
shellEjectSmall = new GroundEffect(30f, 400f, e -> {
|
||||||
Draw.color(Pal.lightOrange, Color.LIGHT_GRAY, Pal.lightishGray, e.fin());
|
Draw.color(Pal.lightOrange, Color.lightGray, Pal.lightishGray, e.fin());
|
||||||
float rot = Math.abs(e.rotation) + 90f;
|
float rot = Math.abs(e.rotation) + 90f;
|
||||||
|
|
||||||
int i = Mathf.sign(e.rotation);
|
int i = Mathf.sign(e.rotation);
|
||||||
@@ -784,7 +782,7 @@ public class Fx implements ContentList{
|
|||||||
});
|
});
|
||||||
|
|
||||||
shellEjectMedium = new GroundEffect(34f, 400f, e -> {
|
shellEjectMedium = new GroundEffect(34f, 400f, e -> {
|
||||||
Draw.color(Pal.lightOrange, Color.LIGHT_GRAY, Pal.lightishGray, e.fin());
|
Draw.color(Pal.lightOrange, Color.lightGray, Pal.lightishGray, e.fin());
|
||||||
float rot = e.rotation + 90f;
|
float rot = e.rotation + 90f;
|
||||||
for(int i : Mathf.signs){
|
for(int i : Mathf.signs){
|
||||||
float len = (2f + e.finpow() * 10f) * i;
|
float len = (2f + e.finpow() * 10f) * i;
|
||||||
@@ -795,7 +793,7 @@ public class Fx implements ContentList{
|
|||||||
2f, 3f, rot);
|
2f, 3f, rot);
|
||||||
}
|
}
|
||||||
|
|
||||||
Draw.color(Color.LIGHT_GRAY, Color.GRAY, e.fin());
|
Draw.color(Color.lightGray, Color.gray, e.fin());
|
||||||
|
|
||||||
for(int i : Mathf.signs){
|
for(int i : Mathf.signs){
|
||||||
float ex = e.x, ey = e.y, fout = e.fout();
|
float ex = e.x, ey = e.y, fout = e.fout();
|
||||||
@@ -808,7 +806,7 @@ public class Fx implements ContentList{
|
|||||||
});
|
});
|
||||||
|
|
||||||
shellEjectBig = new GroundEffect(22f, 400f, e -> {
|
shellEjectBig = new GroundEffect(22f, 400f, e -> {
|
||||||
Draw.color(Pal.lightOrange, Color.LIGHT_GRAY, Pal.lightishGray, e.fin());
|
Draw.color(Pal.lightOrange, Color.lightGray, Pal.lightishGray, e.fin());
|
||||||
float rot = e.rotation + 90f;
|
float rot = e.rotation + 90f;
|
||||||
for(int i : Mathf.signs){
|
for(int i : Mathf.signs){
|
||||||
float len = (4f + e.finpow() * 8f) * i;
|
float len = (4f + e.finpow() * 8f) * i;
|
||||||
@@ -820,7 +818,7 @@ public class Fx implements ContentList{
|
|||||||
rot + e.fin() * 30f * i + Mathf.randomSeedRange(e.id + i + 9, 40f * e.fin()));
|
rot + e.fin() * 30f * i + Mathf.randomSeedRange(e.id + i + 9, 40f * e.fin()));
|
||||||
}
|
}
|
||||||
|
|
||||||
Draw.color(Color.LIGHT_GRAY);
|
Draw.color(Color.lightGray);
|
||||||
|
|
||||||
for(int i : Mathf.signs){
|
for(int i : Mathf.signs){
|
||||||
float ex = e.x, ey = e.y, fout = e.fout();
|
float ex = e.x, ey = e.y, fout = e.fout();
|
||||||
@@ -881,7 +879,7 @@ public class Fx implements ContentList{
|
|||||||
});
|
});
|
||||||
|
|
||||||
lightningShoot = new Effect(12f, e -> {
|
lightningShoot = new Effect(12f, e -> {
|
||||||
Draw.color(Color.WHITE, Pal.lancerLaser, e.fin());
|
Draw.color(Color.white, Pal.lancerLaser, e.fin());
|
||||||
Lines.stroke(e.fout() * 1.2f + 0.5f);
|
Lines.stroke(e.fout() * 1.2f + 0.5f);
|
||||||
|
|
||||||
Angles.randLenVectors(e.id, 7, 25f * e.finpow(), e.rotation, 50f, (x, y) -> {
|
Angles.randLenVectors(e.id, 7, 25f * e.finpow(), e.rotation, 50f, (x, y) -> {
|
||||||
@@ -895,7 +893,7 @@ public class Fx implements ContentList{
|
|||||||
reactorsmoke = new Effect(17, e -> {
|
reactorsmoke = new Effect(17, e -> {
|
||||||
Angles.randLenVectors(e.id, 4, e.fin() * 8f, (x, y) -> {
|
Angles.randLenVectors(e.id, 4, e.fin() * 8f, (x, y) -> {
|
||||||
float size = 1f + e.fout() * 5f;
|
float size = 1f + e.fout() * 5f;
|
||||||
Draw.color(Color.LIGHT_GRAY, Color.GRAY, e.fin());
|
Draw.color(Color.lightGray, Color.gray, e.fin());
|
||||||
Draw.rect("circle", e.x + x, e.y + y, size, size);
|
Draw.rect("circle", e.x + x, e.y + y, size, size);
|
||||||
Draw.reset();
|
Draw.reset();
|
||||||
});
|
});
|
||||||
@@ -903,7 +901,7 @@ public class Fx implements ContentList{
|
|||||||
nuclearsmoke = new Effect(40, e -> {
|
nuclearsmoke = new Effect(40, e -> {
|
||||||
Angles.randLenVectors(e.id, 4, e.fin() * 13f, (x, y) -> {
|
Angles.randLenVectors(e.id, 4, e.fin() * 13f, (x, y) -> {
|
||||||
float size = e.fslope() * 4f;
|
float size = e.fslope() * 4f;
|
||||||
Draw.color(Color.LIGHT_GRAY, Color.GRAY, e.fin());
|
Draw.color(Color.lightGray, Color.gray, e.fin());
|
||||||
Draw.rect("circle", e.x + x, e.y + y, size, size);
|
Draw.rect("circle", e.x + x, e.y + y, size, size);
|
||||||
Draw.reset();
|
Draw.reset();
|
||||||
});
|
});
|
||||||
@@ -911,7 +909,7 @@ public class Fx implements ContentList{
|
|||||||
nuclearcloud = new Effect(90, 200f, e -> {
|
nuclearcloud = new Effect(90, 200f, e -> {
|
||||||
Angles.randLenVectors(e.id, 10, e.finpow() * 90f, (x, y) -> {
|
Angles.randLenVectors(e.id, 10, e.finpow() * 90f, (x, y) -> {
|
||||||
float size = e.fout() * 14f;
|
float size = e.fout() * 14f;
|
||||||
Draw.color(Color.LIME, Color.GRAY, e.fin());
|
Draw.color(Color.lime, Color.gray, e.fin());
|
||||||
Draw.rect("circle", e.x + x, e.y + y, size, size);
|
Draw.rect("circle", e.x + x, e.y + y, size, size);
|
||||||
Draw.reset();
|
Draw.reset();
|
||||||
});
|
});
|
||||||
@@ -919,7 +917,7 @@ public class Fx implements ContentList{
|
|||||||
impactsmoke = new Effect(60, e -> {
|
impactsmoke = new Effect(60, e -> {
|
||||||
Angles.randLenVectors(e.id, 7, e.fin() * 20f, (x, y) -> {
|
Angles.randLenVectors(e.id, 7, e.fin() * 20f, (x, y) -> {
|
||||||
float size = e.fslope() * 4f;
|
float size = e.fslope() * 4f;
|
||||||
Draw.color(Color.LIGHT_GRAY, Color.GRAY, e.fin());
|
Draw.color(Color.lightGray, Color.gray, e.fin());
|
||||||
Draw.rect("circle", e.x + x, e.y + y, size, size);
|
Draw.rect("circle", e.x + x, e.y + y, size, size);
|
||||||
Draw.reset();
|
Draw.reset();
|
||||||
});
|
});
|
||||||
@@ -927,7 +925,7 @@ public class Fx implements ContentList{
|
|||||||
impactcloud = new Effect(140, 400f, e -> {
|
impactcloud = new Effect(140, 400f, e -> {
|
||||||
Angles.randLenVectors(e.id, 20, e.finpow() * 160f, (x, y) -> {
|
Angles.randLenVectors(e.id, 20, e.finpow() * 160f, (x, y) -> {
|
||||||
float size = e.fout() * 15f;
|
float size = e.fout() * 15f;
|
||||||
Draw.color(Pal.lighterOrange, Color.LIGHT_GRAY, e.fin());
|
Draw.color(Pal.lighterOrange, Color.lightGray, e.fin());
|
||||||
Draw.rect("circle", e.x + x, e.y + y, size, size);
|
Draw.rect("circle", e.x + x, e.y + y, size, size);
|
||||||
Draw.reset();
|
Draw.reset();
|
||||||
});
|
});
|
||||||
@@ -935,7 +933,7 @@ public class Fx implements ContentList{
|
|||||||
redgeneratespark = new Effect(18, e -> {
|
redgeneratespark = new Effect(18, e -> {
|
||||||
Angles.randLenVectors(e.id, 5, e.fin() * 8f, (x, y) -> {
|
Angles.randLenVectors(e.id, 5, e.fin() * 8f, (x, y) -> {
|
||||||
float len = e.fout() * 4f;
|
float len = e.fout() * 4f;
|
||||||
Draw.color(Pal.redSpark, Color.GRAY, e.fin());
|
Draw.color(Pal.redSpark, Color.gray, e.fin());
|
||||||
Draw.rect("circle", e.x + x, e.y + y, len, len);
|
Draw.rect("circle", e.x + x, e.y + y, len, len);
|
||||||
Draw.reset();
|
Draw.reset();
|
||||||
});
|
});
|
||||||
@@ -943,7 +941,7 @@ public class Fx implements ContentList{
|
|||||||
generatespark = new Effect(18, e -> {
|
generatespark = new Effect(18, e -> {
|
||||||
Angles.randLenVectors(e.id, 5, e.fin() * 8f, (x, y) -> {
|
Angles.randLenVectors(e.id, 5, e.fin() * 8f, (x, y) -> {
|
||||||
float len = e.fout() * 4f;
|
float len = e.fout() * 4f;
|
||||||
Draw.color(Pal.orangeSpark, Color.GRAY, e.fin());
|
Draw.color(Pal.orangeSpark, Color.gray, e.fin());
|
||||||
Draw.rect("circle", e.x + x, e.y + y, len, len);
|
Draw.rect("circle", e.x + x, e.y + y, len, len);
|
||||||
Draw.reset();
|
Draw.reset();
|
||||||
});
|
});
|
||||||
@@ -951,14 +949,14 @@ public class Fx implements ContentList{
|
|||||||
fuelburn = new Effect(23, e -> {
|
fuelburn = new Effect(23, e -> {
|
||||||
Angles.randLenVectors(e.id, 5, e.fin() * 9f, (x, y) -> {
|
Angles.randLenVectors(e.id, 5, e.fin() * 9f, (x, y) -> {
|
||||||
float len = e.fout() * 4f;
|
float len = e.fout() * 4f;
|
||||||
Draw.color(Color.LIGHT_GRAY, Color.GRAY, e.fin());
|
Draw.color(Color.lightGray, Color.gray, e.fin());
|
||||||
Draw.rect("circle", e.x + x, e.y + y, len, len);
|
Draw.rect("circle", e.x + x, e.y + y, len, len);
|
||||||
Draw.reset();
|
Draw.reset();
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
plasticburn = new Effect(40, e -> {
|
plasticburn = new Effect(40, e -> {
|
||||||
Angles.randLenVectors(e.id, 5, 3f + e.fin() * 5f, (x, y) -> {
|
Angles.randLenVectors(e.id, 5, 3f + e.fin() * 5f, (x, y) -> {
|
||||||
Draw.color(Color.valueOf("e9ead3"), Color.GRAY, e.fin());
|
Draw.color(Color.valueOf("e9ead3"), Color.gray, e.fin());
|
||||||
Fill.circle(e.x + x, e.y + y, e.fout() * 1f);
|
Fill.circle(e.x + x, e.y + y, e.fout() * 1f);
|
||||||
Draw.reset();
|
Draw.reset();
|
||||||
});
|
});
|
||||||
@@ -1000,21 +998,21 @@ public class Fx implements ContentList{
|
|||||||
});
|
});
|
||||||
producesmoke = new Effect(12, e -> {
|
producesmoke = new Effect(12, e -> {
|
||||||
Angles.randLenVectors(e.id, 8, 4f + e.fin() * 18f, (x, y) -> {
|
Angles.randLenVectors(e.id, 8, 4f + e.fin() * 18f, (x, y) -> {
|
||||||
Draw.color(Color.WHITE, Pal.accent, e.fin());
|
Draw.color(Color.white, Pal.accent, e.fin());
|
||||||
Fill.square(e.x + x, e.y + y, 1f + e.fout() * 3f, 45);
|
Fill.square(e.x + x, e.y + y, 1f + e.fout() * 3f, 45);
|
||||||
Draw.reset();
|
Draw.reset();
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
smeltsmoke = new Effect(15, e -> {
|
smeltsmoke = new Effect(15, e -> {
|
||||||
Angles.randLenVectors(e.id, 6, 4f + e.fin() * 5f, (x, y) -> {
|
Angles.randLenVectors(e.id, 6, 4f + e.fin() * 5f, (x, y) -> {
|
||||||
Draw.color(Color.WHITE, e.color, e.fin());
|
Draw.color(Color.white, e.color, e.fin());
|
||||||
Fill.square(e.x + x, e.y + y, 0.5f + e.fout() * 2f, 45);
|
Fill.square(e.x + x, e.y + y, 0.5f + e.fout() * 2f, 45);
|
||||||
Draw.reset();
|
Draw.reset();
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
formsmoke = new Effect(40, e -> {
|
formsmoke = new Effect(40, e -> {
|
||||||
Angles.randLenVectors(e.id, 6, 5f + e.fin() * 8f, (x, y) -> {
|
Angles.randLenVectors(e.id, 6, 5f + e.fin() * 8f, (x, y) -> {
|
||||||
Draw.color(Pal.plasticSmoke, Color.LIGHT_GRAY, e.fin());
|
Draw.color(Pal.plasticSmoke, Color.lightGray, e.fin());
|
||||||
Fill.square(e.x + x, e.y + y, 0.2f + e.fout() * 2f, 45);
|
Fill.square(e.x + x, e.y + y, 0.2f + e.fout() * 2f, 45);
|
||||||
Draw.reset();
|
Draw.reset();
|
||||||
});
|
});
|
||||||
@@ -1022,7 +1020,7 @@ public class Fx implements ContentList{
|
|||||||
blastsmoke = new Effect(26, e -> {
|
blastsmoke = new Effect(26, e -> {
|
||||||
Angles.randLenVectors(e.id, 12, 1f + e.fin() * 23f, (x, y) -> {
|
Angles.randLenVectors(e.id, 12, 1f + e.fin() * 23f, (x, y) -> {
|
||||||
float size = 2f + e.fout() * 6f;
|
float size = 2f + e.fout() * 6f;
|
||||||
Draw.color(Color.LIGHT_GRAY, Color.DARK_GRAY, e.fin());
|
Draw.color(Color.lightGray, Color.darkGray, e.fin());
|
||||||
Draw.rect("circle", e.x + x, e.y + y, size, size);
|
Draw.rect("circle", e.x + x, e.y + y, size, size);
|
||||||
Draw.reset();
|
Draw.reset();
|
||||||
});
|
});
|
||||||
@@ -1030,7 +1028,7 @@ public class Fx implements ContentList{
|
|||||||
lava = new Effect(18, e -> {
|
lava = new Effect(18, e -> {
|
||||||
Angles.randLenVectors(e.id, 3, 1f + e.fin() * 10f, (x, y) -> {
|
Angles.randLenVectors(e.id, 3, 1f + e.fin() * 10f, (x, y) -> {
|
||||||
float size = e.fslope() * 4f;
|
float size = e.fslope() * 4f;
|
||||||
Draw.color(Color.ORANGE, Color.GRAY, e.fin());
|
Draw.color(Color.orange, Color.gray, e.fin());
|
||||||
Draw.rect("circle", e.x + x, e.y + y, size, size);
|
Draw.rect("circle", e.x + x, e.y + y, size, size);
|
||||||
Draw.reset();
|
Draw.reset();
|
||||||
});
|
});
|
||||||
@@ -1056,53 +1054,53 @@ public class Fx implements ContentList{
|
|||||||
Draw.reset();
|
Draw.reset();
|
||||||
});
|
});
|
||||||
purify = new Effect(10, e -> {
|
purify = new Effect(10, e -> {
|
||||||
Draw.color(Color.ROYAL, Color.GRAY, e.fin());
|
Draw.color(Color.royal, Color.gray, e.fin());
|
||||||
Lines.stroke(2f);
|
Lines.stroke(2f);
|
||||||
Lines.spikes(e.x, e.y, e.fin() * 4f, 2, 6);
|
Lines.spikes(e.x, e.y, e.fin() * 4f, 2, 6);
|
||||||
Draw.reset();
|
Draw.reset();
|
||||||
});
|
});
|
||||||
purifyoil = new Effect(10, e -> {
|
purifyoil = new Effect(10, e -> {
|
||||||
Draw.color(Color.BLACK, Color.GRAY, e.fin());
|
Draw.color(Color.black, Color.gray, e.fin());
|
||||||
Lines.stroke(2f);
|
Lines.stroke(2f);
|
||||||
Lines.spikes(e.x, e.y, e.fin() * 4f, 2, 6);
|
Lines.spikes(e.x, e.y, e.fin() * 4f, 2, 6);
|
||||||
Draw.reset();
|
Draw.reset();
|
||||||
});
|
});
|
||||||
purifystone = new Effect(10, e -> {
|
purifystone = new Effect(10, e -> {
|
||||||
Draw.color(Color.ORANGE, Color.GRAY, e.fin());
|
Draw.color(Color.orange, Color.gray, e.fin());
|
||||||
Lines.stroke(2f);
|
Lines.stroke(2f);
|
||||||
Lines.spikes(e.x, e.y, e.fin() * 4f, 2, 6);
|
Lines.spikes(e.x, e.y, e.fin() * 4f, 2, 6);
|
||||||
Draw.reset();
|
Draw.reset();
|
||||||
});
|
});
|
||||||
generate = new Effect(11, e -> {
|
generate = new Effect(11, e -> {
|
||||||
Draw.color(Color.ORANGE, Color.YELLOW, e.fin());
|
Draw.color(Color.orange, Color.yellow, e.fin());
|
||||||
Lines.stroke(1f);
|
Lines.stroke(1f);
|
||||||
Lines.spikes(e.x, e.y, e.fin() * 5f, 2, 8);
|
Lines.spikes(e.x, e.y, e.fin() * 5f, 2, 8);
|
||||||
Draw.reset();
|
Draw.reset();
|
||||||
});
|
});
|
||||||
mine = new Effect(20, e -> {
|
mine = new Effect(20, e -> {
|
||||||
Angles.randLenVectors(e.id, 6, 3f + e.fin() * 6f, (x, y) -> {
|
Angles.randLenVectors(e.id, 6, 3f + e.fin() * 6f, (x, y) -> {
|
||||||
Draw.color(e.color, Color.LIGHT_GRAY, e.fin());
|
Draw.color(e.color, Color.lightGray, e.fin());
|
||||||
Fill.square(e.x + x, e.y + y, e.fout() * 2f, 45);
|
Fill.square(e.x + x, e.y + y, e.fout() * 2f, 45);
|
||||||
Draw.reset();
|
Draw.reset();
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
mineBig = new Effect(30, e -> {
|
mineBig = new Effect(30, e -> {
|
||||||
Angles.randLenVectors(e.id, 6, 4f + e.fin() * 8f, (x, y) -> {
|
Angles.randLenVectors(e.id, 6, 4f + e.fin() * 8f, (x, y) -> {
|
||||||
Draw.color(e.color, Color.LIGHT_GRAY, e.fin());
|
Draw.color(e.color, Color.lightGray, e.fin());
|
||||||
Fill.square(e.x + x, e.y + y, e.fout() * 2f + 0.2f, 45);
|
Fill.square(e.x + x, e.y + y, e.fout() * 2f + 0.2f, 45);
|
||||||
Draw.reset();
|
Draw.reset();
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
mineHuge = new Effect(40, e -> {
|
mineHuge = new Effect(40, e -> {
|
||||||
Angles.randLenVectors(e.id, 8, 5f + e.fin() * 10f, (x, y) -> {
|
Angles.randLenVectors(e.id, 8, 5f + e.fin() * 10f, (x, y) -> {
|
||||||
Draw.color(e.color, Color.LIGHT_GRAY, e.fin());
|
Draw.color(e.color, Color.lightGray, e.fin());
|
||||||
Fill.square(e.x + x, e.y + y, e.fout() * 2f + 0.5f, 45);
|
Fill.square(e.x + x, e.y + y, e.fout() * 2f + 0.5f, 45);
|
||||||
Draw.reset();
|
Draw.reset();
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
smelt = new Effect(20, e -> {
|
smelt = new Effect(20, e -> {
|
||||||
Angles.randLenVectors(e.id, 6, 2f + e.fin() * 5f, (x, y) -> {
|
Angles.randLenVectors(e.id, 6, 2f + e.fin() * 5f, (x, y) -> {
|
||||||
Draw.color(Color.WHITE, e.color, e.fin());
|
Draw.color(Color.white, e.color, e.fin());
|
||||||
Fill.square(e.x + x, e.y + y, 0.5f + e.fout() * 2f, 45);
|
Fill.square(e.x + x, e.y + y, 0.5f + e.fout() * 2f, 45);
|
||||||
Draw.reset();
|
Draw.reset();
|
||||||
});
|
});
|
||||||
@@ -1209,5 +1207,8 @@ public class Fx implements ContentList{
|
|||||||
Lines.poly(e.x, e.y, 6, e.rotation + e.fin(), 90);
|
Lines.poly(e.x, e.y, 6, e.rotation + e.fin(), 90);
|
||||||
Draw.reset();
|
Draw.reset();
|
||||||
});
|
});
|
||||||
|
|
||||||
|
coreLand = new Effect(120f, e -> {
|
||||||
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -39,7 +39,7 @@ public class Items implements ContentList{
|
|||||||
}};
|
}};
|
||||||
|
|
||||||
coal = new Item("coal", Color.valueOf("272727")){{
|
coal = new Item("coal", Color.valueOf("272727")){{
|
||||||
explosiveness = 0.4f;
|
explosiveness = 0.2f;
|
||||||
flammability = 1f;
|
flammability = 1f;
|
||||||
hardness = 2;
|
hardness = 2;
|
||||||
}};
|
}};
|
||||||
|
|||||||
@@ -1,10 +1,14 @@
|
|||||||
package io.anuke.mindustry.content;
|
package io.anuke.mindustry.content;
|
||||||
|
|
||||||
|
import io.anuke.arc.*;
|
||||||
import io.anuke.arc.math.Mathf;
|
import io.anuke.arc.math.Mathf;
|
||||||
import io.anuke.mindustry.entities.Effects;
|
import io.anuke.mindustry.entities.Effects;
|
||||||
import io.anuke.mindustry.game.ContentList;
|
import io.anuke.mindustry.game.ContentList;
|
||||||
|
import io.anuke.mindustry.game.EventType.*;
|
||||||
import io.anuke.mindustry.type.StatusEffect;
|
import io.anuke.mindustry.type.StatusEffect;
|
||||||
|
|
||||||
|
import static io.anuke.mindustry.Vars.waveTeam;
|
||||||
|
|
||||||
public class StatusEffects implements ContentList{
|
public class StatusEffects implements ContentList{
|
||||||
public static StatusEffect none, burning, freezing, wet, melting, tarred, overdrive, shielded, shocked, corroded, boss;
|
public static StatusEffect none, burning, freezing, wet, melting, tarred, overdrive, shielded, shocked, corroded, boss;
|
||||||
|
|
||||||
@@ -37,8 +41,14 @@ public class StatusEffects implements ContentList{
|
|||||||
speedMultiplier = 0.9f;
|
speedMultiplier = 0.9f;
|
||||||
effect = Fx.wet;
|
effect = Fx.wet;
|
||||||
|
|
||||||
trans(() -> shocked, ((unit, time, newTime, result) -> unit.damage(15f)));
|
trans(() -> shocked, ((unit, time, newTime, result) -> {
|
||||||
opposite(() -> burning, () -> shocked);
|
unit.damage(20f);
|
||||||
|
if(unit.getTeam() == waveTeam){
|
||||||
|
Events.fire(Trigger.shock);
|
||||||
|
}
|
||||||
|
result.set(this, time);
|
||||||
|
}));
|
||||||
|
opposite(() -> burning);
|
||||||
}};
|
}};
|
||||||
|
|
||||||
melting = new StatusEffect(){{
|
melting = new StatusEffect(){{
|
||||||
|
|||||||
@@ -8,10 +8,13 @@ import io.anuke.mindustry.world.Block;
|
|||||||
import static io.anuke.mindustry.content.Blocks.*;
|
import static io.anuke.mindustry.content.Blocks.*;
|
||||||
|
|
||||||
public class TechTree implements ContentList{
|
public class TechTree implements ContentList{
|
||||||
|
public static Array<TechNode> all;
|
||||||
public static TechNode root;
|
public static TechNode root;
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void load(){
|
public void load(){
|
||||||
|
all = new Array<>();
|
||||||
|
|
||||||
root = node(coreShard, () -> {
|
root = node(coreShard, () -> {
|
||||||
|
|
||||||
node(conveyor, () -> {
|
node(conveyor, () -> {
|
||||||
@@ -326,6 +329,7 @@ public class TechTree implements ContentList{
|
|||||||
context = this;
|
context = this;
|
||||||
children.run();
|
children.run();
|
||||||
context = last;
|
context = last;
|
||||||
|
all.add(this);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -3,6 +3,7 @@ package io.anuke.mindustry.content;
|
|||||||
import io.anuke.arc.collection.*;
|
import io.anuke.arc.collection.*;
|
||||||
import io.anuke.mindustry.entities.bullet.*;
|
import io.anuke.mindustry.entities.bullet.*;
|
||||||
import io.anuke.mindustry.entities.type.*;
|
import io.anuke.mindustry.entities.type.*;
|
||||||
|
import io.anuke.mindustry.entities.type.Bullet;
|
||||||
import io.anuke.mindustry.entities.type.base.*;
|
import io.anuke.mindustry.entities.type.base.*;
|
||||||
import io.anuke.mindustry.game.*;
|
import io.anuke.mindustry.game.*;
|
||||||
import io.anuke.mindustry.gen.*;
|
import io.anuke.mindustry.gen.*;
|
||||||
|
|||||||
@@ -2,7 +2,6 @@ package io.anuke.mindustry.core;
|
|||||||
|
|
||||||
import io.anuke.arc.*;
|
import io.anuke.arc.*;
|
||||||
import io.anuke.arc.assets.*;
|
import io.anuke.arc.assets.*;
|
||||||
import io.anuke.arc.files.*;
|
|
||||||
import io.anuke.arc.graphics.*;
|
import io.anuke.arc.graphics.*;
|
||||||
import io.anuke.arc.graphics.g2d.*;
|
import io.anuke.arc.graphics.g2d.*;
|
||||||
import io.anuke.arc.input.*;
|
import io.anuke.arc.input.*;
|
||||||
@@ -18,7 +17,6 @@ import io.anuke.mindustry.game.*;
|
|||||||
import io.anuke.mindustry.gen.*;
|
import io.anuke.mindustry.gen.*;
|
||||||
import io.anuke.mindustry.input.*;
|
import io.anuke.mindustry.input.*;
|
||||||
import io.anuke.mindustry.maps.Map;
|
import io.anuke.mindustry.maps.Map;
|
||||||
import io.anuke.mindustry.net.Net;
|
|
||||||
import io.anuke.mindustry.type.*;
|
import io.anuke.mindustry.type.*;
|
||||||
import io.anuke.mindustry.ui.dialogs.*;
|
import io.anuke.mindustry.ui.dialogs.*;
|
||||||
import io.anuke.mindustry.world.*;
|
import io.anuke.mindustry.world.*;
|
||||||
@@ -30,6 +28,7 @@ import java.util.*;
|
|||||||
|
|
||||||
import static io.anuke.arc.Core.*;
|
import static io.anuke.arc.Core.*;
|
||||||
import static io.anuke.mindustry.Vars.*;
|
import static io.anuke.mindustry.Vars.*;
|
||||||
|
import static io.anuke.mindustry.Vars.net;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Control module.
|
* Control module.
|
||||||
@@ -48,6 +47,10 @@ public class Control implements ApplicationListener, Loadable{
|
|||||||
private boolean wasPaused = false;
|
private boolean wasPaused = false;
|
||||||
|
|
||||||
public Control(){
|
public Control(){
|
||||||
|
saves = new Saves();
|
||||||
|
tutorial = new Tutorial();
|
||||||
|
music = new MusicControl();
|
||||||
|
|
||||||
Events.on(StateChangeEvent.class, event -> {
|
Events.on(StateChangeEvent.class, event -> {
|
||||||
if((event.from == State.playing && event.to == State.menu) || (event.from == State.menu && event.to != State.menu)){
|
if((event.from == State.playing && event.to == State.menu) || (event.from == State.menu && event.to != State.menu)){
|
||||||
Time.runTask(5f, platform::updateRPC);
|
Time.runTask(5f, platform::updateRPC);
|
||||||
@@ -64,7 +67,7 @@ public class Control implements ApplicationListener, Loadable{
|
|||||||
|
|
||||||
Events.on(WorldLoadEvent.class, event -> {
|
Events.on(WorldLoadEvent.class, event -> {
|
||||||
Core.app.post(() -> Core.app.post(() -> {
|
Core.app.post(() -> Core.app.post(() -> {
|
||||||
if(Net.active() && player.getClosestCore() != null){
|
if(net.active() && player.getClosestCore() != null){
|
||||||
//set to closest core since that's where the player will probably respawn; prevents camera jumps
|
//set to closest core since that's where the player will probably respawn; prevents camera jumps
|
||||||
Core.camera.position.set(player.isDead() ? player.getClosestCore() : player);
|
Core.camera.position.set(player.isDead() ? player.getClosestCore() : player);
|
||||||
}else{
|
}else{
|
||||||
@@ -96,7 +99,7 @@ public class Control implements ApplicationListener, Loadable{
|
|||||||
Effects.shake(5, 6, Core.camera.position.x, Core.camera.position.y);
|
Effects.shake(5, 6, Core.camera.position.x, Core.camera.position.y);
|
||||||
//the restart dialog can show info for any number of scenarios
|
//the restart dialog can show info for any number of scenarios
|
||||||
Call.onGameOver(event.winner);
|
Call.onGameOver(event.winner);
|
||||||
if(state.rules.zone != null && !Net.client()){
|
if(state.rules.zone != null && !net.client()){
|
||||||
//remove zone save on game over
|
//remove zone save on game over
|
||||||
if(saves.getZoneSlot() != null && !state.rules.tutorial){
|
if(saves.getZoneSlot() != null && !state.rules.tutorial){
|
||||||
saves.getZoneSlot().delete();
|
saves.getZoneSlot().delete();
|
||||||
@@ -106,12 +109,12 @@ public class Control implements ApplicationListener, Loadable{
|
|||||||
|
|
||||||
//autohost for pvp maps
|
//autohost for pvp maps
|
||||||
Events.on(WorldLoadEvent.class, event -> {
|
Events.on(WorldLoadEvent.class, event -> {
|
||||||
if(state.rules.pvp && !Net.active()){
|
if(state.rules.pvp && !net.active()){
|
||||||
try{
|
try{
|
||||||
Net.host(port);
|
net.host(port);
|
||||||
player.isAdmin = true;
|
player.isAdmin = true;
|
||||||
}catch(IOException e){
|
}catch(IOException e){
|
||||||
ui.showError(Core.bundle.format("server.error", Strings.parseException(e, true)));
|
ui.showException("$server.error", e);
|
||||||
Core.app.post(() -> state.set(State.menu));
|
Core.app.post(() -> state.set(State.menu));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -148,14 +151,24 @@ public class Control implements ApplicationListener, Loadable{
|
|||||||
Events.on(ZoneConfigureCompleteEvent.class, e -> {
|
Events.on(ZoneConfigureCompleteEvent.class, e -> {
|
||||||
ui.hudfrag.showToast(Core.bundle.format("zone.config.complete", e.zone.configureWave));
|
ui.hudfrag.showToast(Core.bundle.format("zone.config.complete", e.zone.configureWave));
|
||||||
});
|
});
|
||||||
|
|
||||||
|
Events.on(Trigger.newGame, () -> {
|
||||||
|
TileEntity core = player.getClosestCore();
|
||||||
|
|
||||||
|
if(core == null) return;
|
||||||
|
|
||||||
|
app.post(() -> ui.hudfrag.showLand());
|
||||||
|
renderer.zoomIn(Fx.coreLand.lifetime);
|
||||||
|
app.post(() -> Effects.effect(Fx.coreLand, core.x, core.y, 0, core.block));
|
||||||
|
Time.run(Fx.coreLand.lifetime, () -> {
|
||||||
|
Effects.effect(Fx.launch, core);
|
||||||
|
Effects.shake(5f, 5f, core);
|
||||||
|
});
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void loadAsync(){
|
public void loadAsync(){
|
||||||
saves = new Saves();
|
|
||||||
tutorial = new Tutorial();
|
|
||||||
music = new MusicControl();
|
|
||||||
|
|
||||||
Draw.scl = 1f / Core.atlas.find("scale_marker").getWidth();
|
Draw.scl = 1f / Core.atlas.find("scale_marker").getWidth();
|
||||||
|
|
||||||
Core.input.setCatch(KeyCode.BACK, true);
|
Core.input.setCatch(KeyCode.BACK, true);
|
||||||
@@ -174,35 +187,6 @@ public class Control implements ApplicationListener, Loadable{
|
|||||||
saves.load();
|
saves.load();
|
||||||
}
|
}
|
||||||
|
|
||||||
//checks for existing 3.5 app data, android only
|
|
||||||
public void checkClassicData(){
|
|
||||||
try{
|
|
||||||
if(files.local("mindustry-maps").exists() || files.local("mindustry-saves").exists()){
|
|
||||||
settings.getBoolOnce("classic-backup-check", () -> {
|
|
||||||
app.post(() -> app.post(() -> ui.showConfirm("$classic.export", "$classic.export.text", () -> {
|
|
||||||
try{
|
|
||||||
platform.requestExternalPerms(() -> {
|
|
||||||
FileHandle external = files.external("MindustryClassic");
|
|
||||||
if(files.local("mindustry-maps").exists()){
|
|
||||||
files.local("mindustry-maps").copyTo(external);
|
|
||||||
}
|
|
||||||
|
|
||||||
if(files.local("mindustry-saves").exists()){
|
|
||||||
files.local("mindustry-saves").copyTo(external);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}catch(Exception e){
|
|
||||||
e.printStackTrace();
|
|
||||||
ui.showError(Strings.parseException(e, true));
|
|
||||||
}
|
|
||||||
})));
|
|
||||||
});
|
|
||||||
}
|
|
||||||
}catch(Throwable t){
|
|
||||||
t.printStackTrace();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void createPlayer(){
|
void createPlayer(){
|
||||||
player = new Player();
|
player = new Player();
|
||||||
player.name = Core.settings.getString("name");
|
player.name = Core.settings.getString("name");
|
||||||
@@ -234,13 +218,14 @@ public class Control implements ApplicationListener, Loadable{
|
|||||||
if(settings.getBool("savecreate") && !world.isInvalidMap()){
|
if(settings.getBool("savecreate") && !world.isInvalidMap()){
|
||||||
control.saves.addSave(map.name() + " " + new SimpleDateFormat("MMM dd h:mm", Locale.getDefault()).format(new Date()));
|
control.saves.addSave(map.name() + " " + new SimpleDateFormat("MMM dd h:mm", Locale.getDefault()).format(new Date()));
|
||||||
}
|
}
|
||||||
|
Events.fire(Trigger.newGame);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
public void playZone(Zone zone){
|
public void playZone(Zone zone){
|
||||||
ui.loadAnd(() -> {
|
ui.loadAnd(() -> {
|
||||||
logic.reset();
|
logic.reset();
|
||||||
Net.reset();
|
net.reset();
|
||||||
world.loadGenerator(zone.generator);
|
world.loadGenerator(zone.generator);
|
||||||
zone.rules.accept(state.rules);
|
zone.rules.accept(state.rules);
|
||||||
state.rules.zone = zone;
|
state.rules.zone = zone;
|
||||||
@@ -252,6 +237,7 @@ public class Control implements ApplicationListener, Loadable{
|
|||||||
state.set(State.playing);
|
state.set(State.playing);
|
||||||
control.saves.zoneSave();
|
control.saves.zoneSave();
|
||||||
logic.play();
|
logic.play();
|
||||||
|
Events.fire(Trigger.newGame);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -259,7 +245,7 @@ public class Control implements ApplicationListener, Loadable{
|
|||||||
Zone zone = Zones.groundZero;
|
Zone zone = Zones.groundZero;
|
||||||
ui.loadAnd(() -> {
|
ui.loadAnd(() -> {
|
||||||
logic.reset();
|
logic.reset();
|
||||||
Net.reset();
|
net.reset();
|
||||||
|
|
||||||
world.beginMapLoad();
|
world.beginMapLoad();
|
||||||
|
|
||||||
@@ -304,6 +290,7 @@ public class Control implements ApplicationListener, Loadable{
|
|||||||
state.rules.waveSpacing = 60f * 30;
|
state.rules.waveSpacing = 60f * 30;
|
||||||
state.rules.buildCostMultiplier = 0.3f;
|
state.rules.buildCostMultiplier = 0.3f;
|
||||||
state.rules.tutorial = true;
|
state.rules.tutorial = true;
|
||||||
|
Events.fire(Trigger.newGame);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -314,7 +301,7 @@ public class Control implements ApplicationListener, Loadable{
|
|||||||
@Override
|
@Override
|
||||||
public void dispose(){
|
public void dispose(){
|
||||||
content.dispose();
|
content.dispose();
|
||||||
Net.dispose();
|
net.dispose();
|
||||||
Musics.dispose();
|
Musics.dispose();
|
||||||
Sounds.dispose();
|
Sounds.dispose();
|
||||||
ui.editor.dispose();
|
ui.editor.dispose();
|
||||||
@@ -379,13 +366,16 @@ public class Control implements ApplicationListener, Loadable{
|
|||||||
|
|
||||||
if(android){
|
if(android){
|
||||||
Sounds.empty.loop(0f, 1f, 0f);
|
Sounds.empty.loop(0f, 1f, 0f);
|
||||||
checkClassicData();
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void update(){
|
public void update(){
|
||||||
|
//TODO find out why this happens on Android
|
||||||
|
if(assets == null) return;
|
||||||
|
|
||||||
saves.update();
|
saves.update();
|
||||||
|
|
||||||
//update and load any requested assets
|
//update and load any requested assets
|
||||||
assets.update();
|
assets.update();
|
||||||
|
|
||||||
@@ -414,7 +404,7 @@ public class Control implements ApplicationListener, Loadable{
|
|||||||
if(world.isZone()){
|
if(world.isZone()){
|
||||||
for(Tile tile : state.teams.get(player.getTeam()).cores){
|
for(Tile tile : state.teams.get(player.getTeam()).cores){
|
||||||
for(Item item : content.items()){
|
for(Item item : content.items()){
|
||||||
if(tile.entity.items.has(item)){
|
if(tile.entity != null && tile.entity.items.has(item)){
|
||||||
data.unlockContent(item);
|
data.unlockContent(item);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,14 +1,12 @@
|
|||||||
package io.anuke.mindustry.core;
|
package io.anuke.mindustry.core;
|
||||||
|
|
||||||
import io.anuke.arc.Events;
|
import io.anuke.arc.*;
|
||||||
import io.anuke.mindustry.entities.type.BaseUnit;
|
import io.anuke.mindustry.entities.type.*;
|
||||||
import io.anuke.mindustry.entities.type.base.BaseDrone;
|
import io.anuke.mindustry.entities.type.base.*;
|
||||||
import io.anuke.mindustry.game.EventType.StateChangeEvent;
|
import io.anuke.mindustry.game.EventType.*;
|
||||||
import io.anuke.mindustry.game.*;
|
import io.anuke.mindustry.game.*;
|
||||||
import io.anuke.mindustry.net.Net;
|
|
||||||
|
|
||||||
import static io.anuke.mindustry.Vars.unitGroups;
|
import static io.anuke.mindustry.Vars.*;
|
||||||
import static io.anuke.mindustry.Vars.waveTeam;
|
|
||||||
|
|
||||||
public class GameState{
|
public class GameState{
|
||||||
/** Current wave number, can be anything in non-wave modes. */
|
/** Current wave number, can be anything in non-wave modes. */
|
||||||
@@ -29,7 +27,7 @@ public class GameState{
|
|||||||
private State state = State.menu;
|
private State state = State.menu;
|
||||||
|
|
||||||
public int enemies(){
|
public int enemies(){
|
||||||
return Net.client() ? enemies : unitGroups[waveTeam.ordinal()].count(b -> !(b instanceof BaseDrone));
|
return net.client() ? enemies : unitGroups[waveTeam.ordinal()].count(b -> !(b instanceof BaseDrone));
|
||||||
}
|
}
|
||||||
|
|
||||||
public BaseUnit boss(){
|
public BaseUnit boss(){
|
||||||
@@ -46,7 +44,7 @@ public class GameState{
|
|||||||
}
|
}
|
||||||
|
|
||||||
public boolean isPaused(){
|
public boolean isPaused(){
|
||||||
return (is(State.paused) && !Net.active()) || (gameOver && !Net.active());
|
return (is(State.paused) && !net.active()) || (gameOver && !net.active());
|
||||||
}
|
}
|
||||||
|
|
||||||
public boolean is(State astate){
|
public boolean is(State astate){
|
||||||
|
|||||||
@@ -1,28 +1,21 @@
|
|||||||
package io.anuke.mindustry.core;
|
package io.anuke.mindustry.core;
|
||||||
|
|
||||||
import io.anuke.annotations.Annotations.Loc;
|
import io.anuke.annotations.Annotations.*;
|
||||||
import io.anuke.annotations.Annotations.Remote;
|
import io.anuke.arc.*;
|
||||||
import io.anuke.arc.ApplicationListener;
|
import io.anuke.arc.collection.ObjectSet.*;
|
||||||
import io.anuke.arc.Events;
|
|
||||||
import io.anuke.arc.collection.ObjectSet.ObjectSetIterator;
|
|
||||||
import io.anuke.arc.util.*;
|
import io.anuke.arc.util.*;
|
||||||
import io.anuke.mindustry.content.*;
|
import io.anuke.mindustry.content.*;
|
||||||
import io.anuke.mindustry.core.GameState.State;
|
import io.anuke.mindustry.core.GameState.*;
|
||||||
import io.anuke.mindustry.entities.*;
|
import io.anuke.mindustry.entities.*;
|
||||||
import io.anuke.mindustry.entities.type.Player;
|
import io.anuke.mindustry.entities.type.*;
|
||||||
import io.anuke.mindustry.entities.type.TileEntity;
|
|
||||||
import io.anuke.mindustry.game.EventType.*;
|
import io.anuke.mindustry.game.EventType.*;
|
||||||
import io.anuke.mindustry.game.*;
|
import io.anuke.mindustry.game.*;
|
||||||
import io.anuke.mindustry.game.Teams.TeamData;
|
import io.anuke.mindustry.game.Teams.*;
|
||||||
import io.anuke.mindustry.gen.BrokenBlock;
|
import io.anuke.mindustry.gen.*;
|
||||||
import io.anuke.mindustry.gen.Call;
|
import io.anuke.mindustry.type.*;
|
||||||
import io.anuke.mindustry.net.Net;
|
import io.anuke.mindustry.world.*;
|
||||||
import io.anuke.mindustry.type.Item;
|
import io.anuke.mindustry.world.blocks.*;
|
||||||
import io.anuke.mindustry.type.ItemStack;
|
import io.anuke.mindustry.world.blocks.BuildBlock.*;
|
||||||
import io.anuke.mindustry.world.Block;
|
|
||||||
import io.anuke.mindustry.world.Tile;
|
|
||||||
import io.anuke.mindustry.world.blocks.BuildBlock;
|
|
||||||
import io.anuke.mindustry.world.blocks.BuildBlock.BuildEntity;
|
|
||||||
|
|
||||||
import static io.anuke.mindustry.Vars.*;
|
import static io.anuke.mindustry.Vars.*;
|
||||||
|
|
||||||
@@ -164,6 +157,7 @@ public class Logic implements ApplicationListener{
|
|||||||
}
|
}
|
||||||
state.launched = true;
|
state.launched = true;
|
||||||
state.gameOver = true;
|
state.gameOver = true;
|
||||||
|
Events.fire(new LaunchEvent());
|
||||||
//manually fire game over event now
|
//manually fire game over event now
|
||||||
Events.fire(new GameOverEvent(defaultTeam));
|
Events.fire(new GameOverEvent(defaultTeam));
|
||||||
});
|
});
|
||||||
@@ -190,7 +184,7 @@ public class Logic implements ApplicationListener{
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if(!Net.client() && state.wavetime <= 0 && state.rules.waves){
|
if(!net.client() && state.wavetime <= 0 && state.rules.waves){
|
||||||
runWave();
|
runWave();
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -237,7 +231,7 @@ public class Logic implements ApplicationListener{
|
|||||||
pathfinder.update();
|
pathfinder.update();
|
||||||
}
|
}
|
||||||
|
|
||||||
if(!Net.client() && !world.isInvalidMap() && !state.isEditor()){
|
if(!net.client() && !world.isInvalidMap() && !state.isEditor()){
|
||||||
checkGameOver();
|
checkGameOver();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,37 +1,33 @@
|
|||||||
package io.anuke.mindustry.core;
|
package io.anuke.mindustry.core;
|
||||||
|
|
||||||
import io.anuke.annotations.Annotations.*;
|
import io.anuke.annotations.Annotations.*;
|
||||||
import io.anuke.arc.ApplicationListener;
|
import io.anuke.arc.*;
|
||||||
import io.anuke.arc.Core;
|
import io.anuke.arc.collection.*;
|
||||||
import io.anuke.arc.collection.IntSet;
|
import io.anuke.arc.graphics.*;
|
||||||
import io.anuke.arc.graphics.Color;
|
import io.anuke.arc.math.*;
|
||||||
import io.anuke.arc.math.RandomXS128;
|
|
||||||
import io.anuke.arc.util.*;
|
|
||||||
import io.anuke.arc.util.CommandHandler.*;
|
import io.anuke.arc.util.CommandHandler.*;
|
||||||
import io.anuke.arc.util.io.ReusableByteInStream;
|
import io.anuke.arc.util.*;
|
||||||
import io.anuke.arc.util.serialization.Base64Coder;
|
import io.anuke.arc.util.io.*;
|
||||||
import io.anuke.mindustry.Vars;
|
import io.anuke.arc.util.serialization.*;
|
||||||
import io.anuke.mindustry.core.GameState.State;
|
import io.anuke.mindustry.*;
|
||||||
import io.anuke.mindustry.entities.EntityGroup;
|
import io.anuke.mindustry.core.GameState.*;
|
||||||
import io.anuke.mindustry.entities.traits.BuilderTrait.BuildRequest;
|
import io.anuke.mindustry.entities.*;
|
||||||
import io.anuke.mindustry.entities.traits.SyncTrait;
|
import io.anuke.mindustry.entities.traits.BuilderTrait.*;
|
||||||
import io.anuke.mindustry.entities.type.Player;
|
import io.anuke.mindustry.entities.traits.*;
|
||||||
import io.anuke.mindustry.entities.type.Unit;
|
import io.anuke.mindustry.entities.type.*;
|
||||||
import io.anuke.mindustry.game.TypeID;
|
import io.anuke.mindustry.game.EventType.*;
|
||||||
import io.anuke.mindustry.game.Version;
|
import io.anuke.mindustry.game.*;
|
||||||
import io.anuke.mindustry.gen.Call;
|
import io.anuke.mindustry.gen.*;
|
||||||
import io.anuke.mindustry.gen.RemoteReadClient;
|
import io.anuke.mindustry.net.Administration.*;
|
||||||
import io.anuke.mindustry.net.Administration.TraceInfo;
|
import io.anuke.mindustry.net.Net.*;
|
||||||
import io.anuke.mindustry.net.*;
|
import io.anuke.mindustry.net.*;
|
||||||
import io.anuke.mindustry.net.Net.SendMode;
|
|
||||||
import io.anuke.mindustry.net.Packets.*;
|
import io.anuke.mindustry.net.Packets.*;
|
||||||
import io.anuke.mindustry.type.ContentType;
|
import io.anuke.mindustry.type.*;
|
||||||
import io.anuke.mindustry.world.Tile;
|
import io.anuke.mindustry.world.*;
|
||||||
import io.anuke.mindustry.world.modules.ItemModule;
|
import io.anuke.mindustry.world.modules.*;
|
||||||
|
|
||||||
import java.io.DataInputStream;
|
import java.io.*;
|
||||||
import java.io.IOException;
|
import java.util.zip.*;
|
||||||
import java.util.zip.InflaterInputStream;
|
|
||||||
|
|
||||||
import static io.anuke.mindustry.Vars.*;
|
import static io.anuke.mindustry.Vars.*;
|
||||||
|
|
||||||
@@ -40,6 +36,7 @@ public class NetClient implements ApplicationListener{
|
|||||||
private final static float playerSyncTime = 2;
|
private final static float playerSyncTime = 2;
|
||||||
public final static float viewScale = 2f;
|
public final static float viewScale = 2f;
|
||||||
|
|
||||||
|
private long ping;
|
||||||
private Interval timer = new Interval(5);
|
private Interval timer = new Interval(5);
|
||||||
/** Whether the client is currently connecting. */
|
/** Whether the client is currently connecting. */
|
||||||
private boolean connecting = false;
|
private boolean connecting = false;
|
||||||
@@ -60,7 +57,7 @@ public class NetClient implements ApplicationListener{
|
|||||||
|
|
||||||
public NetClient(){
|
public NetClient(){
|
||||||
|
|
||||||
Net.handleClient(Connect.class, packet -> {
|
net.handleClient(Connect.class, packet -> {
|
||||||
Log.info("Connecting to server: {0}", packet.addressTCP);
|
Log.info("Connecting to server: {0}", packet.addressTCP);
|
||||||
|
|
||||||
player.isAdmin = false;
|
player.isAdmin = false;
|
||||||
@@ -74,7 +71,7 @@ public class NetClient implements ApplicationListener{
|
|||||||
ui.loadfrag.hide();
|
ui.loadfrag.hide();
|
||||||
connecting = false;
|
connecting = false;
|
||||||
quiet = true;
|
quiet = true;
|
||||||
Net.disconnect();
|
net.disconnect();
|
||||||
});
|
});
|
||||||
|
|
||||||
ConnectPacket c = new ConnectPacket();
|
ConnectPacket c = new ConnectPacket();
|
||||||
@@ -86,16 +83,16 @@ public class NetClient implements ApplicationListener{
|
|||||||
c.uuid = platform.getUUID();
|
c.uuid = platform.getUUID();
|
||||||
|
|
||||||
if(c.uuid == null){
|
if(c.uuid == null){
|
||||||
ui.showError("$invalidid");
|
ui.showErrorMessage("$invalidid");
|
||||||
ui.loadfrag.hide();
|
ui.loadfrag.hide();
|
||||||
disconnectQuietly();
|
disconnectQuietly();
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
Net.send(c, SendMode.tcp);
|
net.send(c, SendMode.tcp);
|
||||||
});
|
});
|
||||||
|
|
||||||
Net.handleClient(Disconnect.class, packet -> {
|
net.handleClient(Disconnect.class, packet -> {
|
||||||
if(quietReset) return;
|
if(quietReset) return;
|
||||||
|
|
||||||
connecting = false;
|
connecting = false;
|
||||||
@@ -107,17 +104,27 @@ public class NetClient implements ApplicationListener{
|
|||||||
|
|
||||||
Time.runTask(3f, ui.loadfrag::hide);
|
Time.runTask(3f, ui.loadfrag::hide);
|
||||||
|
|
||||||
ui.showError("$disconnect");
|
if(packet.reason != null){
|
||||||
|
if(packet.reason.equals("closed")){
|
||||||
|
ui.showSmall("$disconnect", "$disconnect.closed");
|
||||||
|
}else if(packet.reason.equals("timeout")){
|
||||||
|
ui.showSmall("$disconnect", "$disconnect.timeout");
|
||||||
|
}else if(packet.reason.equals("error")){
|
||||||
|
ui.showSmall("$disconnect", "$disconnect.error");
|
||||||
|
}
|
||||||
|
}else{
|
||||||
|
ui.showErrorMessage("$disconnect");
|
||||||
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
Net.handleClient(WorldStream.class, data -> {
|
net.handleClient(WorldStream.class, data -> {
|
||||||
Log.info("Recieved world data: {0} bytes.", data.stream.available());
|
Log.info("Recieved world data: {0} bytes.", data.stream.available());
|
||||||
NetworkIO.loadWorld(new InflaterInputStream(data.stream));
|
NetworkIO.loadWorld(new InflaterInputStream(data.stream));
|
||||||
|
|
||||||
finishConnecting();
|
finishConnecting();
|
||||||
});
|
});
|
||||||
|
|
||||||
Net.handleClient(InvokePacket.class, packet -> {
|
net.handleClient(InvokePacket.class, packet -> {
|
||||||
packet.writeBuffer.position(0);
|
packet.writeBuffer.position(0);
|
||||||
RemoteReadClient.readPacket(packet.writeBuffer, packet.type);
|
RemoteReadClient.readPacket(packet.writeBuffer, packet.type);
|
||||||
});
|
});
|
||||||
@@ -180,6 +187,8 @@ public class NetClient implements ApplicationListener{
|
|||||||
player.sendMessage(text);
|
player.sendMessage(text);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Events.fire(new PlayerChatEvent(player, message));
|
||||||
}
|
}
|
||||||
|
|
||||||
public static String colorizeName(int id, String name){
|
public static String colorizeName(int id, String name){
|
||||||
@@ -188,6 +197,16 @@ public class NetClient implements ApplicationListener{
|
|||||||
return "[#" + player.color.toString().toUpperCase() + "]" + name;
|
return "[#" + player.color.toString().toUpperCase() + "]" + name;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Remote(targets = Loc.client)
|
||||||
|
public static void onPing(Player player, long time){
|
||||||
|
Call.onPingResponse(player.con, time);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Remote(variants = Variant.one)
|
||||||
|
public static void onPingResponse(long time){
|
||||||
|
netClient.ping = Time.timeSinceMillis(time);
|
||||||
|
}
|
||||||
|
|
||||||
@Remote(variants = Variant.one)
|
@Remote(variants = Variant.one)
|
||||||
public static void onTraceInfo(Player player, TraceInfo info){
|
public static void onTraceInfo(Player player, TraceInfo info){
|
||||||
if(player != null){
|
if(player != null){
|
||||||
@@ -223,7 +242,7 @@ public class NetClient implements ApplicationListener{
|
|||||||
logic.reset();
|
logic.reset();
|
||||||
|
|
||||||
ui.chatfrag.clearMessages();
|
ui.chatfrag.clearMessages();
|
||||||
Net.setClientLoaded(false);
|
net.setClientLoaded(false);
|
||||||
|
|
||||||
ui.loadfrag.show("$connecting.data");
|
ui.loadfrag.show("$connecting.data");
|
||||||
|
|
||||||
@@ -231,7 +250,7 @@ public class NetClient implements ApplicationListener{
|
|||||||
ui.loadfrag.hide();
|
ui.loadfrag.hide();
|
||||||
netClient.connecting = false;
|
netClient.connecting = false;
|
||||||
netClient.quiet = true;
|
netClient.quiet = true;
|
||||||
Net.disconnect();
|
net.disconnect();
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -249,7 +268,7 @@ public class NetClient implements ApplicationListener{
|
|||||||
@Remote(variants = Variant.one, priority = PacketPriority.low, unreliable = true)
|
@Remote(variants = Variant.one, priority = PacketPriority.low, unreliable = true)
|
||||||
public static void onEntitySnapshot(byte groupID, short amount, short dataLen, byte[] data){
|
public static void onEntitySnapshot(byte groupID, short amount, short dataLen, byte[] data){
|
||||||
try{
|
try{
|
||||||
netClient.byteStream.setBytes(Net.decompressSnapshot(data, dataLen));
|
netClient.byteStream.setBytes(net.decompressSnapshot(data, dataLen));
|
||||||
DataInputStream input = netClient.dataStream;
|
DataInputStream input = netClient.dataStream;
|
||||||
|
|
||||||
EntityGroup group = entities.get(groupID);
|
EntityGroup group = entities.get(groupID);
|
||||||
@@ -305,7 +324,7 @@ public class NetClient implements ApplicationListener{
|
|||||||
state.wave = wave;
|
state.wave = wave;
|
||||||
state.enemies = enemies;
|
state.enemies = enemies;
|
||||||
|
|
||||||
netClient.byteStream.setBytes(Net.decompressSnapshot(coreData, coreDataLen));
|
netClient.byteStream.setBytes(net.decompressSnapshot(coreData, coreDataLen));
|
||||||
DataInputStream input = netClient.dataStream;
|
DataInputStream input = netClient.dataStream;
|
||||||
|
|
||||||
byte cores = input.readByte();
|
byte cores = input.readByte();
|
||||||
@@ -327,20 +346,20 @@ public class NetClient implements ApplicationListener{
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void update(){
|
public void update(){
|
||||||
if(!Net.client()) return;
|
if(!net.client()) return;
|
||||||
|
|
||||||
if(!state.is(State.menu)){
|
if(!state.is(State.menu)){
|
||||||
if(!connecting) sync();
|
if(!connecting) sync();
|
||||||
}else if(!connecting){
|
}else if(!connecting){
|
||||||
Net.disconnect();
|
net.disconnect();
|
||||||
}else{ //...must be connecting
|
}else{ //...must be connecting
|
||||||
timeoutTime += Time.delta();
|
timeoutTime += Time.delta();
|
||||||
if(timeoutTime > dataTimeout){
|
if(timeoutTime > dataTimeout){
|
||||||
Log.err("Failed to load data!");
|
Log.err("Failed to load data!");
|
||||||
ui.loadfrag.hide();
|
ui.loadfrag.hide();
|
||||||
quiet = true;
|
quiet = true;
|
||||||
ui.showError("$disconnect.data");
|
ui.showErrorMessage("$disconnect.data");
|
||||||
Net.disconnect();
|
net.disconnect();
|
||||||
timeoutTime = 0f;
|
timeoutTime = 0f;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -350,18 +369,22 @@ public class NetClient implements ApplicationListener{
|
|||||||
return connecting;
|
return connecting;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public int getPing(){
|
||||||
|
return (int)ping;
|
||||||
|
}
|
||||||
|
|
||||||
private void finishConnecting(){
|
private void finishConnecting(){
|
||||||
state.set(State.playing);
|
state.set(State.playing);
|
||||||
connecting = false;
|
connecting = false;
|
||||||
ui.join.hide();
|
ui.join.hide();
|
||||||
Net.setClientLoaded(true);
|
net.setClientLoaded(true);
|
||||||
Core.app.post(Call::connectConfirm);
|
Core.app.post(Call::connectConfirm);
|
||||||
Time.runTask(40f, platform::updateRPC);
|
Time.runTask(40f, platform::updateRPC);
|
||||||
Core.app.post(() -> ui.loadfrag.hide());
|
Core.app.post(() -> ui.loadfrag.hide());
|
||||||
}
|
}
|
||||||
|
|
||||||
private void reset(){
|
private void reset(){
|
||||||
Net.setClientLoaded(false);
|
net.setClientLoaded(false);
|
||||||
removed.clear();
|
removed.clear();
|
||||||
timeoutTime = 0f;
|
timeoutTime = 0f;
|
||||||
connecting = true;
|
connecting = true;
|
||||||
@@ -380,13 +403,13 @@ public class NetClient implements ApplicationListener{
|
|||||||
/** Disconnects, resetting state to the menu. */
|
/** Disconnects, resetting state to the menu. */
|
||||||
public void disconnectQuietly(){
|
public void disconnectQuietly(){
|
||||||
quiet = true;
|
quiet = true;
|
||||||
Net.disconnect();
|
net.disconnect();
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Disconnects, causing no further changes or reset.*/
|
/** Disconnects, causing no further changes or reset.*/
|
||||||
public void disconnectNoReset(){
|
public void disconnectNoReset(){
|
||||||
quiet = quietReset = true;
|
quiet = quietReset = true;
|
||||||
Net.disconnect();
|
net.disconnect();
|
||||||
}
|
}
|
||||||
|
|
||||||
/** When set, any disconnects will be ignored and no dialogs will be shown. */
|
/** When set, any disconnects will be ignored and no dialogs will be shown. */
|
||||||
@@ -425,7 +448,7 @@ public class NetClient implements ApplicationListener{
|
|||||||
}
|
}
|
||||||
|
|
||||||
if(timer.get(1, 60)){
|
if(timer.get(1, 60)){
|
||||||
Net.updatePing();
|
Call.onPing(Time.millis());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -1,39 +1,31 @@
|
|||||||
package io.anuke.mindustry.core;
|
package io.anuke.mindustry.core;
|
||||||
|
|
||||||
import io.anuke.annotations.Annotations.Loc;
|
import io.anuke.annotations.Annotations.*;
|
||||||
import io.anuke.annotations.Annotations.Remote;
|
import io.anuke.arc.*;
|
||||||
import io.anuke.arc.ApplicationListener;
|
|
||||||
import io.anuke.arc.Events;
|
|
||||||
import io.anuke.arc.collection.*;
|
import io.anuke.arc.collection.*;
|
||||||
import io.anuke.arc.graphics.Color;
|
import io.anuke.arc.graphics.*;
|
||||||
import io.anuke.arc.graphics.Colors;
|
import io.anuke.arc.math.*;
|
||||||
import io.anuke.arc.math.Mathf;
|
import io.anuke.arc.math.geom.*;
|
||||||
import io.anuke.arc.math.geom.Rectangle;
|
|
||||||
import io.anuke.arc.math.geom.Vector2;
|
|
||||||
import io.anuke.arc.util.*;
|
import io.anuke.arc.util.*;
|
||||||
import io.anuke.arc.util.CommandHandler.*;
|
import io.anuke.arc.util.CommandHandler.*;
|
||||||
import io.anuke.arc.util.io.*;
|
import io.anuke.arc.util.io.*;
|
||||||
import io.anuke.mindustry.content.Blocks;
|
import io.anuke.mindustry.content.*;
|
||||||
import io.anuke.mindustry.core.GameState.State;
|
import io.anuke.mindustry.core.GameState.*;
|
||||||
import io.anuke.mindustry.entities.EntityGroup;
|
import io.anuke.mindustry.entities.*;
|
||||||
import io.anuke.mindustry.entities.traits.BuilderTrait.BuildRequest;
|
import io.anuke.mindustry.entities.traits.BuilderTrait.*;
|
||||||
import io.anuke.mindustry.entities.traits.Entity;
|
import io.anuke.mindustry.entities.traits.*;
|
||||||
import io.anuke.mindustry.entities.traits.SyncTrait;
|
import io.anuke.mindustry.entities.type.*;
|
||||||
import io.anuke.mindustry.entities.type.Player;
|
import io.anuke.mindustry.game.EventType.*;
|
||||||
import io.anuke.mindustry.game.EventType.WorldLoadEvent;
|
import io.anuke.mindustry.game.*;
|
||||||
import io.anuke.mindustry.game.Team;
|
import io.anuke.mindustry.gen.*;
|
||||||
import io.anuke.mindustry.game.Version;
|
|
||||||
import io.anuke.mindustry.gen.Call;
|
|
||||||
import io.anuke.mindustry.gen.RemoteReadServer;
|
|
||||||
import io.anuke.mindustry.net.*;
|
import io.anuke.mindustry.net.*;
|
||||||
import io.anuke.mindustry.net.Administration.PlayerInfo;
|
import io.anuke.mindustry.net.Administration.*;
|
||||||
import io.anuke.mindustry.net.Administration.TraceInfo;
|
|
||||||
import io.anuke.mindustry.net.Packets.*;
|
import io.anuke.mindustry.net.Packets.*;
|
||||||
import io.anuke.mindustry.world.Tile;
|
import io.anuke.mindustry.world.*;
|
||||||
|
|
||||||
import java.io.*;
|
import java.io.*;
|
||||||
import java.nio.ByteBuffer;
|
import java.nio.*;
|
||||||
import java.util.zip.DeflaterOutputStream;
|
import java.util.zip.*;
|
||||||
|
|
||||||
import static io.anuke.mindustry.Vars.*;
|
import static io.anuke.mindustry.Vars.*;
|
||||||
|
|
||||||
@@ -48,8 +40,6 @@ public class NetServer implements ApplicationListener{
|
|||||||
public final Administration admins = new Administration();
|
public final Administration admins = new Administration();
|
||||||
public final CommandHandler clientCommands = new CommandHandler("/");
|
public final CommandHandler clientCommands = new CommandHandler("/");
|
||||||
|
|
||||||
/** Maps connection IDs to players. */
|
|
||||||
private IntMap<Player> connections = new IntMap<>();
|
|
||||||
private boolean closing = false;
|
private boolean closing = false;
|
||||||
|
|
||||||
private ByteBuffer writeBuffer = ByteBuffer.allocate(127);
|
private ByteBuffer writeBuffer = ByteBuffer.allocate(127);
|
||||||
@@ -61,57 +51,67 @@ public class NetServer implements ApplicationListener{
|
|||||||
private DataOutputStream dataStream = new DataOutputStream(syncStream);
|
private DataOutputStream dataStream = new DataOutputStream(syncStream);
|
||||||
|
|
||||||
public NetServer(){
|
public NetServer(){
|
||||||
Events.on(WorldLoadEvent.class, event -> {
|
|
||||||
if(!headless){
|
|
||||||
connections.clear();
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
Net.handleServer(Connect.class, (id, connect) -> {
|
net.handleServer(Connect.class, (con, connect) -> {
|
||||||
if(admins.isIPBanned(connect.addressTCP)){
|
if(admins.isIPBanned(connect.addressTCP)){
|
||||||
kick(id, KickReason.banned);
|
con.kick(KickReason.banned);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
Net.handleServer(Disconnect.class, (id, packet) -> {
|
net.handleServer(Disconnect.class, (con, packet) -> {
|
||||||
Player player = connections.get(id);
|
if(con.player != null){
|
||||||
if(player != null){
|
onDisconnect(con.player, packet.reason);
|
||||||
onDisconnect(player);
|
|
||||||
}
|
}
|
||||||
connections.remove(id);
|
|
||||||
});
|
});
|
||||||
|
|
||||||
Net.handleServer(ConnectPacket.class, (id, packet) -> {
|
net.handleServer(ConnectPacket.class, (con, packet) -> {
|
||||||
String uuid = packet.uuid;
|
String uuid = packet.uuid;
|
||||||
|
|
||||||
NetConnection connection = Net.getConnection(id);
|
if(admins.isIPBanned(con.address)) return;
|
||||||
|
|
||||||
if(connection == null ||
|
if(con.hasBegunConnecting){
|
||||||
admins.isIPBanned(connection.address)) return;
|
con.kick(KickReason.idInUse);
|
||||||
|
|
||||||
if(connection.hasBegunConnecting){
|
|
||||||
kick(id, KickReason.idInUse);
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
connection.hasBegunConnecting = true;
|
|
||||||
|
|
||||||
PlayerInfo info = admins.getInfo(uuid);
|
PlayerInfo info = admins.getInfo(uuid);
|
||||||
|
|
||||||
connection.mobile = packet.mobile;
|
con.hasBegunConnecting = true;
|
||||||
|
con.mobile = packet.mobile;
|
||||||
|
|
||||||
if(admins.isIDBanned(uuid)){
|
if(admins.isIDBanned(uuid)){
|
||||||
kick(id, KickReason.banned);
|
con.kick(KickReason.banned);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if(Time.millis() - info.lastKicked < kickDuration){
|
if(Time.millis() - info.lastKicked < kickDuration){
|
||||||
kick(id, KickReason.recentKick);
|
con.kick(KickReason.recentKick);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if(admins.isIDBanned(uuid)){
|
||||||
|
con.kick(KickReason.banned);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if(admins.getPlayerLimit() > 0 && playerGroup.size() >= admins.getPlayerLimit()){
|
||||||
|
con.kick(KickReason.playerLimit);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if(!admins.isWhitelisted(packet.uuid, packet.usid)){
|
||||||
|
info.adminUsid = packet.usid;
|
||||||
|
info.lastName = packet.name;
|
||||||
|
info.id = packet.uuid;
|
||||||
|
admins.save();
|
||||||
|
Call.onInfoMessage(con, "You are not whitelisted here.");
|
||||||
|
Log.info("&lcDo &lywhitelist-add {0}&lc to whitelist the player &lb'{1}'", packet.uuid, packet.name);
|
||||||
|
con.kick(KickReason.whitelist);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if(packet.versionType == null || ((packet.version == -1 || !packet.versionType.equals(Version.type)) && Version.build != -1 && !admins.allowsCustomClients())){
|
if(packet.versionType == null || ((packet.version == -1 || !packet.versionType.equals(Version.type)) && Version.build != -1 && !admins.allowsCustomClients())){
|
||||||
kick(id, !Version.type.equals(packet.versionType) ? KickReason.typeMismatch : KickReason.customClient);
|
con.kick(!Version.type.equals(packet.versionType) ? KickReason.typeMismatch : KickReason.customClient);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -120,12 +120,12 @@ public class NetServer implements ApplicationListener{
|
|||||||
if(preventDuplicates){
|
if(preventDuplicates){
|
||||||
for(Player player : playerGroup.all()){
|
for(Player player : playerGroup.all()){
|
||||||
if(player.name.trim().equalsIgnoreCase(packet.name.trim())){
|
if(player.name.trim().equalsIgnoreCase(packet.name.trim())){
|
||||||
kick(id, KickReason.nameInUse);
|
con.kick(KickReason.nameInUse);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if(player.uuid.equals(packet.uuid) || player.usid.equals(packet.usid)){
|
if(player.uuid.equals(packet.uuid) || player.usid.equals(packet.usid)){
|
||||||
kick(id, KickReason.idInUse);
|
con.kick(KickReason.idInUse);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -134,28 +134,26 @@ public class NetServer implements ApplicationListener{
|
|||||||
packet.name = fixName(packet.name);
|
packet.name = fixName(packet.name);
|
||||||
|
|
||||||
if(packet.name.trim().length() <= 0){
|
if(packet.name.trim().length() <= 0){
|
||||||
kick(id, KickReason.nameEmpty);
|
con.kick(KickReason.nameEmpty);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
Log.debug("Recieved connect packet for player '{0}' / UUID {1} / IP {2}", packet.name, uuid, connection.address);
|
String ip = con.address;
|
||||||
|
|
||||||
String ip = Net.getConnection(id).address;
|
|
||||||
|
|
||||||
admins.updatePlayerJoined(uuid, ip, packet.name);
|
admins.updatePlayerJoined(uuid, ip, packet.name);
|
||||||
|
|
||||||
if(packet.version != Version.build && Version.build != -1 && packet.version != -1){
|
if(packet.version != Version.build && Version.build != -1 && packet.version != -1){
|
||||||
kick(id, packet.version > Version.build ? KickReason.serverOutdated : KickReason.clientOutdated);
|
con.kick(packet.version > Version.build ? KickReason.serverOutdated : KickReason.clientOutdated);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if(packet.version == -1){
|
if(packet.version == -1){
|
||||||
connection.modclient = true;
|
con.modclient = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
Player player = new Player();
|
Player player = new Player();
|
||||||
player.isAdmin = admins.isAdmin(uuid, packet.usid);
|
player.isAdmin = admins.isAdmin(uuid, packet.usid);
|
||||||
player.con = Net.getConnection(id);
|
player.con = con;
|
||||||
player.usid = packet.usid;
|
player.usid = packet.usid;
|
||||||
player.name = packet.name;
|
player.name = packet.name;
|
||||||
player.uuid = uuid;
|
player.uuid = uuid;
|
||||||
@@ -170,27 +168,28 @@ public class NetServer implements ApplicationListener{
|
|||||||
player.write(outputBuffer);
|
player.write(outputBuffer);
|
||||||
}catch(Throwable t){
|
}catch(Throwable t){
|
||||||
t.printStackTrace();
|
t.printStackTrace();
|
||||||
kick(id, KickReason.nameEmpty);
|
con.kick(KickReason.nameEmpty);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
con.player = player;
|
||||||
|
|
||||||
//playing in pvp mode automatically assigns players to teams
|
//playing in pvp mode automatically assigns players to teams
|
||||||
if(state.rules.pvp){
|
if(state.rules.pvp){
|
||||||
player.setTeam(assignTeam(player, playerGroup.all()));
|
player.setTeam(assignTeam(player, playerGroup.all()));
|
||||||
Log.info("Auto-assigned player {0} to team {1}.", player.name, player.getTeam());
|
Log.info("Auto-assigned player {0} to team {1}.", player.name, player.getTeam());
|
||||||
}
|
}
|
||||||
|
|
||||||
connections.put(id, player);
|
sendWorldData(player);
|
||||||
|
|
||||||
sendWorldData(player, id);
|
|
||||||
|
|
||||||
platform.updateRPC();
|
platform.updateRPC();
|
||||||
|
|
||||||
|
Events.fire(new PlayerConnect(player));
|
||||||
});
|
});
|
||||||
|
|
||||||
Net.handleServer(InvokePacket.class, (id, packet) -> {
|
net.handleServer(InvokePacket.class, (con, packet) -> {
|
||||||
Player player = connections.get(id);
|
if(con.player == null) return;
|
||||||
if(player == null) return;
|
RemoteReadServer.readPacket(packet.writeBuffer, packet.type, con.player);
|
||||||
RemoteReadServer.readPacket(packet.writeBuffer, packet.type, player);
|
|
||||||
});
|
});
|
||||||
|
|
||||||
registerCommands();
|
registerCommands();
|
||||||
@@ -228,32 +227,43 @@ public class NetServer implements ApplicationListener{
|
|||||||
});
|
});
|
||||||
|
|
||||||
//duration of a a kick in seconds
|
//duration of a a kick in seconds
|
||||||
int kickDuration = 10 * 60;
|
int kickDuration = 15 * 60;
|
||||||
|
|
||||||
class VoteSession{
|
class VoteSession{
|
||||||
Player target;
|
Player target;
|
||||||
ObjectSet<String> voted = new ObjectSet<>();
|
ObjectSet<String> voted = new ObjectSet<>();
|
||||||
ObjectMap<Player, VoteSession> map;
|
VoteSession[] map;
|
||||||
Timer.Task task;
|
Timer.Task task;
|
||||||
int votes;
|
int votes;
|
||||||
|
|
||||||
public VoteSession(ObjectMap<Player, VoteSession> map, Player target){
|
public VoteSession(VoteSession[] map, Player target){
|
||||||
this.target = target;
|
this.target = target;
|
||||||
this.map = map;
|
this.map = map;
|
||||||
this.task = Timer.schedule(() -> {
|
this.task = Timer.schedule(() -> {
|
||||||
if(!checkPass()){
|
if(!checkPass()){
|
||||||
Call.sendMessage(Strings.format("[lightgray]Vote failed. Not enough votes to kick[orange] {0}[lightgray].", target.name));
|
Call.sendMessage(Strings.format("[lightgray]Vote failed. Not enough votes to kick[orange] {0}[lightgray].", target.name));
|
||||||
|
map[0] = null;
|
||||||
|
task.cancel();
|
||||||
}
|
}
|
||||||
map.remove(target);
|
}, 60 * 1);
|
||||||
task.cancel();
|
}
|
||||||
}, 60 * 1.5f);
|
|
||||||
|
void vote(Player player, int d){
|
||||||
|
votes += d;
|
||||||
|
voted.addAll(player.uuid, admins.getInfo(player.uuid).lastIP);
|
||||||
|
|
||||||
|
Call.sendMessage(Strings.format("[orange]{0}[lightgray] has voted to kick[orange] {1}[].[accent] ({2}/{3})\n[lightgray]Type[orange] /vote <y/n>[] to agree.",
|
||||||
|
player.name, target.name, votes, votesRequired()));
|
||||||
|
//checkPass();
|
||||||
}
|
}
|
||||||
|
|
||||||
boolean checkPass(){
|
boolean checkPass(){
|
||||||
if(votes >= votesRequired() && target.isAdded() && target.con.isConnected()){
|
if(votes >= votesRequired() && target.isAdded() && target.con.isConnected()){
|
||||||
Call.sendMessage(Strings.format("[orange]Vote passed.[scarlet] {0}[orange] will be kicked from the server.", target.name));
|
Call.sendMessage(Strings.format("[orange]Vote passed.[scarlet] {0}[orange] will be kicked from the server.", target.name));
|
||||||
admins.getInfo(target.uuid).lastKicked = Time.millis() + kickDuration*1000;
|
admins.getInfo(target.uuid).lastKicked = Time.millis() + kickDuration*1000;
|
||||||
kick(target.con.id, KickReason.vote);
|
target.con.kick(KickReason.vote);
|
||||||
|
map[0] = null;
|
||||||
|
task.cancel();
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
@@ -261,10 +271,10 @@ public class NetServer implements ApplicationListener{
|
|||||||
}
|
}
|
||||||
|
|
||||||
//cooldown between votes
|
//cooldown between votes
|
||||||
int voteTime = 60 * 10;
|
int voteTime = 60 * 5;
|
||||||
Timekeeper vtime = new Timekeeper(voteTime);
|
Timekeeper vtime = new Timekeeper(voteTime);
|
||||||
//current kick sessions
|
//current kick sessions
|
||||||
ObjectMap<Player, VoteSession> currentlyKicking = new ObjectMap<>();
|
VoteSession[] currentlyKicking = {null};
|
||||||
|
|
||||||
clientCommands.<Player>register("votekick", "[player...]", "Vote to kick a player, with a cooldown.", (args, player) -> {
|
clientCommands.<Player>register("votekick", "[player...]", "Vote to kick a player, with a cooldown.", (args, player) -> {
|
||||||
if(playerGroup.size() < 3){
|
if(playerGroup.size() < 3){
|
||||||
@@ -272,8 +282,8 @@ public class NetServer implements ApplicationListener{
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if(currentlyKicking.values().toArray().contains(v -> v.voted.contains(player.uuid) || v.voted.contains(admins.getInfo(player.uuid).lastIP))){
|
if(player.isLocal){
|
||||||
player.sendMessage("[scarlet]You've already voted. Sit down.");
|
player.sendMessage("[scarlet]Just kick them yourself if you're the host.");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -283,37 +293,33 @@ public class NetServer implements ApplicationListener{
|
|||||||
for(Player p : playerGroup.all()){
|
for(Player p : playerGroup.all()){
|
||||||
if(p.isAdmin || p.con == null || p == player) continue;
|
if(p.isAdmin || p.con == null || p == player) continue;
|
||||||
|
|
||||||
builder.append("[lightgray] ").append(p.name).append("[accent] (#").append(p.con.id).append(")\n");
|
builder.append("[lightgray] ").append(p.name).append("[accent] (#").append(p.id).append(")\n");
|
||||||
}
|
}
|
||||||
player.sendMessage(builder.toString());
|
player.sendMessage(builder.toString());
|
||||||
}else{
|
}else{
|
||||||
Player found;
|
Player found;
|
||||||
if(args[0].length() > 1 && args[0].startsWith("#") && Strings.canParseInt(args[0].substring(1))){
|
if(args[0].length() > 1 && args[0].startsWith("#") && Strings.canParseInt(args[0].substring(1))){
|
||||||
int id = Strings.parseInt(args[0].substring(1));
|
int id = Strings.parseInt(args[0].substring(1));
|
||||||
found = playerGroup.find(p -> p.con != null && p.con.id == id);
|
found = playerGroup.find(p -> p.id == id);
|
||||||
}else{
|
}else{
|
||||||
found = playerGroup.find(p -> p.name.equalsIgnoreCase(args[0]));
|
found = playerGroup.find(p -> p.name.equalsIgnoreCase(args[0]));
|
||||||
}
|
}
|
||||||
|
|
||||||
if(found != null){
|
if(found != null){
|
||||||
if(player == found){
|
if(found.isAdmin){
|
||||||
player.sendMessage("[scarlet]If you're interested in kicking yourself, just leave.");
|
|
||||||
}else if(found.isAdmin){
|
|
||||||
player.sendMessage("[scarlet]Did you really expect to be able to kick an admin?");
|
player.sendMessage("[scarlet]Did you really expect to be able to kick an admin?");
|
||||||
|
}else if(found.isLocal){
|
||||||
|
player.sendMessage("[scarlet]Local players cannot be kicked.");
|
||||||
}else{
|
}else{
|
||||||
if(!currentlyKicking.containsKey(found) && !vtime.get()){
|
if(!vtime.get()){
|
||||||
player.sendMessage("[scarlet]You must wait " + voteTime/60 + " minutes between votekicks.");
|
player.sendMessage("[scarlet]You must wait " + voteTime/60 + " minutes between votekicks.");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
VoteSession session = currentlyKicking.getOr(found, () -> new VoteSession(currentlyKicking, found));
|
VoteSession session = new VoteSession(currentlyKicking, found);
|
||||||
session.votes ++;
|
session.vote(player, 1);
|
||||||
session.voted.addAll(player.uuid, admins.getInfo(player.uuid).lastIP);
|
|
||||||
|
|
||||||
Call.sendMessage(Strings.format("[orange]{0}[lightgray] has voted to kick[orange] {1}[].[accent] ({2}/{3})\n[lightgray]Type[orange] /votekick #{4}[] to agree.",
|
|
||||||
player.name, found.name, session.votes, votesRequired(), found.con.id));
|
|
||||||
session.checkPass();
|
|
||||||
vtime.reset();
|
vtime.reset();
|
||||||
|
currentlyKicking[0] = session;
|
||||||
}
|
}
|
||||||
}else{
|
}else{
|
||||||
player.sendMessage("[scarlet]No player[orange]'" + args[0] + "'[scarlet] found.");
|
player.sendMessage("[scarlet]No player[orange]'" + args[0] + "'[scarlet] found.");
|
||||||
@@ -321,18 +327,43 @@ public class NetServer implements ApplicationListener{
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
|
clientCommands.<Player>register("vote", "<y/n>", "Vote to kick the current player.", (arg, player) -> {
|
||||||
|
if(currentlyKicking[0] == null){
|
||||||
|
player.sendMessage("[scarlet]Nobody is being voted on.");
|
||||||
|
}else{
|
||||||
|
if(currentlyKicking[0].voted.contains(player.uuid) || currentlyKicking[0].voted.contains(admins.getInfo(player.uuid).lastIP)){
|
||||||
|
player.sendMessage("[scarlet]You've already voted. Sit down.");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if(currentlyKicking[0].target == player){
|
||||||
|
player.sendMessage("[scarlet]You can't vote on your own trial.");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if(!arg[0].toLowerCase().equals("y") && !arg[0].toLowerCase().equals("n")){
|
||||||
|
player.sendMessage("[scarlet]Vote either 'y' (yes) or 'n' (no).");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
int sign = arg[0].toLowerCase().equals("y") ? 1 : -1;
|
||||||
|
currentlyKicking[0].vote(player, sign);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
|
||||||
clientCommands.<Player>register("sync", "Re-synchronize world state.", (args, player) -> {
|
clientCommands.<Player>register("sync", "Re-synchronize world state.", (args, player) -> {
|
||||||
if(player.isLocal){
|
if(player.isLocal){
|
||||||
player.sendMessage("[scarlet]Re-synchronizing as the host is pointless.");
|
player.sendMessage("[scarlet]Re-synchronizing as the host is pointless.");
|
||||||
}else{
|
}else{
|
||||||
Call.onWorldDataBegin(player.con.id);
|
Call.onWorldDataBegin(player.con);
|
||||||
netServer.sendWorldData(player, player.con.id);
|
netServer.sendWorldData(player);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
public int votesRequired(){
|
public int votesRequired(){
|
||||||
return playerGroup.size() * 2 / 3;
|
return 2 + (playerGroup.size() > 4 ? 1 : 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
public Team assignTeam(Player current, Iterable<Player> players){
|
public Team assignTeam(Player current, Iterable<Player> players){
|
||||||
@@ -351,18 +382,18 @@ public class NetServer implements ApplicationListener{
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
public void sendWorldData(Player player, int clientID){
|
public void sendWorldData(Player player){
|
||||||
ByteArrayOutputStream stream = new ByteArrayOutputStream();
|
ByteArrayOutputStream stream = new ByteArrayOutputStream();
|
||||||
DeflaterOutputStream def = new FastDeflaterOutputStream(stream);
|
DeflaterOutputStream def = new FastDeflaterOutputStream(stream);
|
||||||
NetworkIO.writeWorld(player, def);
|
NetworkIO.writeWorld(player, def);
|
||||||
WorldStream data = new WorldStream();
|
WorldStream data = new WorldStream();
|
||||||
data.stream = new ByteArrayInputStream(stream.toByteArray());
|
data.stream = new ByteArrayInputStream(stream.toByteArray());
|
||||||
Net.sendStream(clientID, data);
|
player.con.sendStream(data);
|
||||||
|
|
||||||
Log.debug("Packed {0} compressed bytes of world data.", stream.size());
|
Log.debug("Packed {0} compressed bytes of world data.", stream.size());
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void onDisconnect(Player player){
|
public static void onDisconnect(Player player, String reason){
|
||||||
//singleplayer multiplayer wierdness
|
//singleplayer multiplayer wierdness
|
||||||
if(player.con == null){
|
if(player.con == null){
|
||||||
player.remove();
|
player.remove();
|
||||||
@@ -370,12 +401,12 @@ public class NetServer implements ApplicationListener{
|
|||||||
}
|
}
|
||||||
|
|
||||||
if(player.con.hasConnected){
|
if(player.con.hasConnected){
|
||||||
|
Events.fire(new PlayerLeave(player));
|
||||||
Call.sendMessage("[accent]" + player.name + "[accent] has disconnected.");
|
Call.sendMessage("[accent]" + player.name + "[accent] has disconnected.");
|
||||||
Call.onPlayerDisconnect(player.id);
|
Call.onPlayerDisconnect(player.id);
|
||||||
}
|
}
|
||||||
player.remove();
|
player.remove();
|
||||||
netServer.connections.remove(player.con.id);
|
Log.info("&lm[{1}] &lc{0} has disconnected. &lg&fi({2})", player.name, player.uuid, reason);
|
||||||
Log.info("&lm[{1}] &lc{0} has disconnected.", player.name, player.uuid);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private static float compound(float speed, float drag){
|
private static float compound(float speed, float drag){
|
||||||
@@ -456,7 +487,7 @@ public class NetServer implements ApplicationListener{
|
|||||||
newx = x;
|
newx = x;
|
||||||
newy = y;
|
newy = y;
|
||||||
}else if(Mathf.dst(x, y, newx, newy) > correctDist){
|
}else if(Mathf.dst(x, y, newx, newy) > correctDist){
|
||||||
Call.onPositionSet(player.con.id, newx, newy); //teleport and correct position when necessary
|
Call.onPositionSet(player.con, newx, newy); //teleport and correct position when necessary
|
||||||
}
|
}
|
||||||
|
|
||||||
//reset player to previous synced position so it gets interpolated
|
//reset player to previous synced position so it gets interpolated
|
||||||
@@ -491,15 +522,15 @@ public class NetServer implements ApplicationListener{
|
|||||||
state.wavetime = 0f;
|
state.wavetime = 0f;
|
||||||
}else if(action == AdminAction.ban){
|
}else if(action == AdminAction.ban){
|
||||||
netServer.admins.banPlayerIP(other.con.address);
|
netServer.admins.banPlayerIP(other.con.address);
|
||||||
netServer.kick(other.con.id, KickReason.banned);
|
other.con.kick(KickReason.banned);
|
||||||
Log.info("&lc{0} has banned {1}.", player.name, other.name);
|
Log.info("&lc{0} has banned {1}.", player.name, other.name);
|
||||||
}else if(action == AdminAction.kick){
|
}else if(action == AdminAction.kick){
|
||||||
netServer.kick(other.con.id, KickReason.kick);
|
other.con.kick(KickReason.kick);
|
||||||
Log.info("&lc{0} has kicked {1}.", player.name, other.name);
|
Log.info("&lc{0} has kicked {1}.", player.name, other.name);
|
||||||
}else if(action == AdminAction.trace){
|
}else if(action == AdminAction.trace){
|
||||||
TraceInfo info = new TraceInfo(other.con.address, other.uuid, other.con.modclient, other.con.mobile);
|
TraceInfo info = new TraceInfo(other.con.address, other.uuid, other.con.modclient, other.con.mobile);
|
||||||
if(player.con != null){
|
if(player.con != null){
|
||||||
Call.onTraceInfo(player.con.id, other, info);
|
Call.onTraceInfo(player.con, other, info);
|
||||||
}else{
|
}else{
|
||||||
NetClient.onTraceInfo(other, info);
|
NetClient.onTraceInfo(other, info);
|
||||||
}
|
}
|
||||||
@@ -515,6 +546,8 @@ public class NetServer implements ApplicationListener{
|
|||||||
player.con.hasConnected = true;
|
player.con.hasConnected = true;
|
||||||
Call.sendMessage("[accent]" + player.name + "[accent] has connected.");
|
Call.sendMessage("[accent]" + player.name + "[accent] has connected.");
|
||||||
Log.info("&lm[{1}] &y{0} has connected. ", player.name, player.uuid);
|
Log.info("&lm[{1}] &y{0} has connected. ", player.name, player.uuid);
|
||||||
|
|
||||||
|
Events.fire(new PlayerJoin(player));
|
||||||
}
|
}
|
||||||
|
|
||||||
public boolean isWaitingForPlayers(){
|
public boolean isWaitingForPlayers(){
|
||||||
@@ -532,51 +565,27 @@ public class NetServer implements ApplicationListener{
|
|||||||
|
|
||||||
public void update(){
|
public void update(){
|
||||||
|
|
||||||
if(!headless && !closing && Net.server() && state.is(State.menu)){
|
if(!headless && !closing && net.server() && state.is(State.menu)){
|
||||||
closing = true;
|
closing = true;
|
||||||
ui.loadfrag.show("$server.closing");
|
ui.loadfrag.show("$server.closing");
|
||||||
Time.runTask(5f, () -> {
|
Time.runTask(5f, () -> {
|
||||||
Net.closeServer();
|
net.closeServer();
|
||||||
ui.loadfrag.hide();
|
ui.loadfrag.hide();
|
||||||
closing = false;
|
closing = false;
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
if(!state.is(State.menu) && Net.server()){
|
if(!state.is(State.menu) && net.server()){
|
||||||
sync();
|
sync();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public void kickAll(KickReason reason){
|
public void kickAll(KickReason reason){
|
||||||
for(NetConnection con : Net.getConnections()){
|
for(NetConnection con : net.getConnections()){
|
||||||
kick(con.id, reason);
|
con.kick(reason);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public void kick(int connection, KickReason reason){
|
|
||||||
NetConnection con = Net.getConnection(connection);
|
|
||||||
if(con == null){
|
|
||||||
Log.err("Cannot kick unknown player!");
|
|
||||||
return;
|
|
||||||
}else{
|
|
||||||
Log.info("Kicking connection #{0} / IP: {1}. Reason: {2}", connection, con.address, reason.name());
|
|
||||||
}
|
|
||||||
|
|
||||||
Player player = connections.get(con.id);
|
|
||||||
|
|
||||||
if(player != null && (reason == KickReason.kick || reason == KickReason.banned || reason == KickReason.vote) && player.uuid != null){
|
|
||||||
PlayerInfo info = admins.getInfo(player.uuid);
|
|
||||||
info.timesKicked++;
|
|
||||||
info.lastKicked = Math.max(Time.millis(), info.lastKicked);
|
|
||||||
}
|
|
||||||
|
|
||||||
Call.onKick(connection, reason);
|
|
||||||
|
|
||||||
Time.runTask(2f, con::close);
|
|
||||||
|
|
||||||
admins.save();
|
|
||||||
}
|
|
||||||
|
|
||||||
public void writeSnapshot(Player player) throws IOException{
|
public void writeSnapshot(Player player) throws IOException{
|
||||||
syncStream.reset();
|
syncStream.reset();
|
||||||
ObjectSet<Tile> cores = state.teams.get(player.getTeam()).cores;
|
ObjectSet<Tile> cores = state.teams.get(player.getTeam()).cores;
|
||||||
@@ -592,7 +601,7 @@ public class NetServer implements ApplicationListener{
|
|||||||
byte[] stateBytes = syncStream.toByteArray();
|
byte[] stateBytes = syncStream.toByteArray();
|
||||||
|
|
||||||
//write basic state data.
|
//write basic state data.
|
||||||
Call.onStateSnapshot(player.con.id, state.wavetime, state.wave, state.enemies(), (short)stateBytes.length, Net.compressSnapshot(stateBytes));
|
Call.onStateSnapshot(player.con, state.wavetime, state.wave, state.enemies(), (short)stateBytes.length, net.compressSnapshot(stateBytes));
|
||||||
|
|
||||||
viewport.setSize(player.con.viewWidth, player.con.viewHeight).setCenter(player.con.viewX, player.con.viewY);
|
viewport.setSize(player.con.viewWidth, player.con.viewHeight).setCenter(player.con.viewX, player.con.viewY);
|
||||||
|
|
||||||
@@ -623,7 +632,7 @@ public class NetServer implements ApplicationListener{
|
|||||||
if(syncStream.size() > maxSnapshotSize){
|
if(syncStream.size() > maxSnapshotSize){
|
||||||
dataStream.close();
|
dataStream.close();
|
||||||
byte[] syncBytes = syncStream.toByteArray();
|
byte[] syncBytes = syncStream.toByteArray();
|
||||||
Call.onEntitySnapshot(player.con.id, (byte)group.getID(), (short)sent, (short)syncBytes.length, Net.compressSnapshot(syncBytes));
|
Call.onEntitySnapshot(player.con, (byte)group.getID(), (short)sent, (short)syncBytes.length, net.compressSnapshot(syncBytes));
|
||||||
sent = 0;
|
sent = 0;
|
||||||
syncStream.reset();
|
syncStream.reset();
|
||||||
}
|
}
|
||||||
@@ -633,7 +642,7 @@ public class NetServer implements ApplicationListener{
|
|||||||
dataStream.close();
|
dataStream.close();
|
||||||
|
|
||||||
byte[] syncBytes = syncStream.toByteArray();
|
byte[] syncBytes = syncStream.toByteArray();
|
||||||
Call.onEntitySnapshot(player.con.id, (byte)group.getID(), (short)sent, (short)syncBytes.length, Net.compressSnapshot(syncBytes));
|
Call.onEntitySnapshot(player.con, (byte)group.getID(), (short)sent, (short)syncBytes.length, net.compressSnapshot(syncBytes));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -699,9 +708,9 @@ public class NetServer implements ApplicationListener{
|
|||||||
|
|
||||||
NetConnection connection = player.con;
|
NetConnection connection = player.con;
|
||||||
|
|
||||||
if(connection == null || !connection.isConnected() || !connections.containsKey(connection.id)){
|
if(connection == null || !connection.isConnected()){
|
||||||
//player disconnected, call d/c event
|
//player disconnected, call d/c event
|
||||||
onDisconnect(player);
|
onDisconnect(player, "disappeared");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -1,18 +1,44 @@
|
|||||||
package io.anuke.mindustry.core;
|
package io.anuke.mindustry.core;
|
||||||
|
|
||||||
import io.anuke.arc.Core;
|
import io.anuke.arc.*;
|
||||||
import io.anuke.arc.Input.TextInput;
|
import io.anuke.arc.Input.*;
|
||||||
import io.anuke.arc.files.FileHandle;
|
import io.anuke.arc.collection.*;
|
||||||
import io.anuke.arc.function.Consumer;
|
import io.anuke.arc.files.*;
|
||||||
import io.anuke.arc.function.Predicate;
|
import io.anuke.arc.function.*;
|
||||||
import io.anuke.arc.math.RandomXS128;
|
import io.anuke.arc.math.*;
|
||||||
import io.anuke.arc.scene.ui.TextField;
|
import io.anuke.arc.scene.ui.*;
|
||||||
import io.anuke.arc.util.serialization.Base64Coder;
|
import io.anuke.arc.util.serialization.*;
|
||||||
|
import io.anuke.mindustry.maps.*;
|
||||||
|
import io.anuke.mindustry.net.*;
|
||||||
|
import io.anuke.mindustry.net.Net.*;
|
||||||
|
import io.anuke.mindustry.ui.dialogs.*;
|
||||||
|
|
||||||
import static io.anuke.mindustry.Vars.mobile;
|
import static io.anuke.mindustry.Vars.mobile;
|
||||||
|
|
||||||
public interface Platform{
|
public interface Platform{
|
||||||
|
|
||||||
|
/** Steam: Update lobby visibility.*/
|
||||||
|
default void updateLobby(){}
|
||||||
|
|
||||||
|
/** Steam: Show multiplayer friend invite dialog.*/
|
||||||
|
default void inviteFriends(){}
|
||||||
|
|
||||||
|
/** Steam: Share a map on the workshop.*/
|
||||||
|
default void publishMap(Map map){}
|
||||||
|
|
||||||
|
/** Steam: Return external workshop maps to be loaded.*/
|
||||||
|
default Array<FileHandle> getExternalMaps(){
|
||||||
|
return Array.with();
|
||||||
|
}
|
||||||
|
|
||||||
|
/** Steam: Open workshop for maps.*/
|
||||||
|
default void openWorkshop(){}
|
||||||
|
|
||||||
|
/** Get the networking implementation.*/
|
||||||
|
default NetProvider getNet(){
|
||||||
|
return new ArcNetImpl();
|
||||||
|
}
|
||||||
|
|
||||||
/** Add a text input dialog that should show up after the field is tapped. */
|
/** Add a text input dialog that should show up after the field is tapped. */
|
||||||
default void addDialog(TextField field){
|
default void addDialog(TextField field){
|
||||||
addDialog(field, 16);
|
addDialog(field, 16);
|
||||||
@@ -36,11 +62,6 @@ public interface Platform{
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Request external read/write perms. Run callback when complete.*/
|
|
||||||
default void requestExternalPerms(Runnable callback){
|
|
||||||
callback.run();
|
|
||||||
}
|
|
||||||
|
|
||||||
/** Update discord RPC. */
|
/** Update discord RPC. */
|
||||||
default void updateRPC(){
|
default void updateRPC(){
|
||||||
}
|
}
|
||||||
@@ -70,24 +91,29 @@ public interface Platform{
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Show a file chooser.
|
* Show a file chooser.
|
||||||
* @param text File chooser title text
|
|
||||||
* @param content Description of the type of files to be loaded
|
|
||||||
* @param cons Selection listener
|
* @param cons Selection listener
|
||||||
* @param open Whether to open or save files
|
* @param open Whether to open or save files
|
||||||
* @param filetype File extension to filter
|
* @param extension File extension to filter
|
||||||
*/
|
*/
|
||||||
default void showFileChooser(String text, String content, Consumer<FileHandle> cons, boolean open, Predicate<String> filetype){
|
default void showFileChooser(boolean open, String extension, Consumer<FileHandle> cons){
|
||||||
|
new FileChooser(open ? "$open" : "$save", file -> file.extension().toLowerCase().equals(extension), open, file -> {
|
||||||
|
if(!open){
|
||||||
|
cons.accept(file.parent().child(file.nameWithoutExtension() + "." + extension));
|
||||||
|
}else{
|
||||||
|
cons.accept(file);
|
||||||
|
}
|
||||||
|
}).show();
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Hide the app. Android only. */
|
/** Hide the app. Android only. */
|
||||||
default void hide(){
|
default void hide(){
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Forces the app into landscape mode. Currently Android only. */
|
/** Forces the app into landscape mode.*/
|
||||||
default void beginForceLandscape(){
|
default void beginForceLandscape(){
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Stops forcing the app into landscape orientation. Currently Android only. */
|
/** Stops forcing the app into landscape orientation.*/
|
||||||
default void endForceLandscape(){
|
default void endForceLandscape(){
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -16,12 +16,13 @@ import io.anuke.mindustry.core.GameState.*;
|
|||||||
import io.anuke.mindustry.entities.*;
|
import io.anuke.mindustry.entities.*;
|
||||||
import io.anuke.mindustry.entities.effect.*;
|
import io.anuke.mindustry.entities.effect.*;
|
||||||
import io.anuke.mindustry.entities.effect.GroundEffectEntity.*;
|
import io.anuke.mindustry.entities.effect.GroundEffectEntity.*;
|
||||||
import io.anuke.mindustry.entities.impl.*;
|
|
||||||
import io.anuke.mindustry.entities.traits.*;
|
import io.anuke.mindustry.entities.traits.*;
|
||||||
import io.anuke.mindustry.entities.type.*;
|
import io.anuke.mindustry.entities.type.*;
|
||||||
|
import io.anuke.mindustry.entities.type.EffectEntity;
|
||||||
import io.anuke.mindustry.game.EventType.*;
|
import io.anuke.mindustry.game.EventType.*;
|
||||||
import io.anuke.mindustry.game.*;
|
import io.anuke.mindustry.game.*;
|
||||||
import io.anuke.mindustry.graphics.*;
|
import io.anuke.mindustry.graphics.*;
|
||||||
|
import io.anuke.mindustry.world.*;
|
||||||
import io.anuke.mindustry.world.blocks.defense.ForceProjector.*;
|
import io.anuke.mindustry.world.blocks.defense.ForceProjector.*;
|
||||||
|
|
||||||
import static io.anuke.arc.Core.*;
|
import static io.anuke.arc.Core.*;
|
||||||
@@ -36,8 +37,10 @@ public class Renderer implements ApplicationListener{
|
|||||||
public FrameBuffer shieldBuffer = new FrameBuffer(2, 2);
|
public FrameBuffer shieldBuffer = new FrameBuffer(2, 2);
|
||||||
private Bloom bloom;
|
private Bloom bloom;
|
||||||
private Color clearColor;
|
private Color clearColor;
|
||||||
private float targetscale = UnitScl.dp.scl(4);
|
private float targetscale = Scl.scl(4);
|
||||||
private float camerascale = targetscale;
|
private float camerascale = targetscale;
|
||||||
|
private float landscale = 0f, landTime;
|
||||||
|
private float minZoomScl = Scl.scl(0.01f);
|
||||||
private Rectangle rect = new Rectangle(), rect2 = new Rectangle();
|
private Rectangle rect = new Rectangle(), rect2 = new Rectangle();
|
||||||
private float shakeIntensity, shaketime;
|
private float shakeIntensity, shaketime;
|
||||||
|
|
||||||
@@ -99,15 +102,22 @@ public class Renderer implements ApplicationListener{
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void update(){
|
public void update(){
|
||||||
//TODO hack, find source of this bug
|
Color.white.set(1f, 1f, 1f, 1f);
|
||||||
Color.WHITE.set(1f, 1f, 1f, 1f);
|
|
||||||
|
|
||||||
camerascale = Mathf.lerpDelta(camerascale, targetscale, 0.1f);
|
camerascale = Mathf.lerpDelta(camerascale, targetscale, 0.1f);
|
||||||
|
|
||||||
|
if(landTime > 0){
|
||||||
|
landTime -= Time.delta();
|
||||||
|
landscale = Interpolation.pow5In.apply(minZoomScl, Scl.scl(4f), 1f - landTime / Fx.coreLand.lifetime);
|
||||||
|
camerascale = landscale;
|
||||||
|
}
|
||||||
|
|
||||||
camera.width = graphics.getWidth() / camerascale;
|
camera.width = graphics.getWidth() / camerascale;
|
||||||
camera.height = graphics.getHeight() / camerascale;
|
camera.height = graphics.getHeight() / camerascale;
|
||||||
|
|
||||||
if(state.is(State.menu)){
|
if(state.is(State.menu)){
|
||||||
graphics.clear(Color.BLACK);
|
landTime = 0f;
|
||||||
|
graphics.clear(Color.black);
|
||||||
}else{
|
}else{
|
||||||
Vector2 position = Tmp.v3.set(player);
|
Vector2 position = Tmp.v3.set(player);
|
||||||
|
|
||||||
@@ -131,6 +141,10 @@ public class Renderer implements ApplicationListener{
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public float landScale(){
|
||||||
|
return landTime > 0 ? landscale : 1f;
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void dispose(){
|
public void dispose(){
|
||||||
minimap.dispose();
|
minimap.dispose();
|
||||||
@@ -162,7 +176,7 @@ public class Renderer implements ApplicationListener{
|
|||||||
e.printStackTrace();
|
e.printStackTrace();
|
||||||
settings.put("bloom", false);
|
settings.put("bloom", false);
|
||||||
settings.save();
|
settings.save();
|
||||||
ui.showError("$error.bloom");
|
ui.showErrorMessage("$error.bloom");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -257,13 +271,13 @@ public class Renderer implements ApplicationListener{
|
|||||||
}
|
}
|
||||||
|
|
||||||
overlays.drawBottom();
|
overlays.drawBottom();
|
||||||
playerGroup.draw(p -> true, Player::drawBuildRequests);
|
playerGroup.draw(p -> p.isLocal, Player::drawBuildRequests);
|
||||||
|
|
||||||
if(shieldGroup.countInBounds() > 0){
|
if(shieldGroup.countInBounds() > 0){
|
||||||
if(settings.getBool("animatedshields") && Shaders.shield != null){
|
if(settings.getBool("animatedshields") && Shaders.shield != null){
|
||||||
Draw.flush();
|
Draw.flush();
|
||||||
shieldBuffer.begin();
|
shieldBuffer.begin();
|
||||||
graphics.clear(Color.CLEAR);
|
graphics.clear(Color.clear);
|
||||||
shieldGroup.draw();
|
shieldGroup.draw();
|
||||||
shieldGroup.draw(shield -> true, ShieldEntity::drawOver);
|
shieldGroup.draw(shield -> true, ShieldEntity::drawOver);
|
||||||
Draw.flush();
|
Draw.flush();
|
||||||
@@ -282,10 +296,37 @@ public class Renderer implements ApplicationListener{
|
|||||||
|
|
||||||
playerGroup.draw(p -> !p.isDead() && !p.isLocal, Player::drawName);
|
playerGroup.draw(p -> !p.isDead() && !p.isLocal, Player::drawName);
|
||||||
|
|
||||||
|
drawLanding();
|
||||||
|
|
||||||
Draw.color();
|
Draw.color();
|
||||||
Draw.flush();
|
Draw.flush();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void drawLanding(){
|
||||||
|
if(landTime > 0 && player.getClosestCore() != null){
|
||||||
|
float fract = landTime / Fx.coreLand.lifetime;
|
||||||
|
TileEntity entity = player.getClosestCore();
|
||||||
|
|
||||||
|
TextureRegion reg = entity.block.icon(Block.Icon.full);
|
||||||
|
float scl = Scl.scl(4f) / camerascale;
|
||||||
|
float s = reg.getWidth() * Draw.scl * scl * 4f * fract;
|
||||||
|
|
||||||
|
Draw.color(Pal.lightTrail);
|
||||||
|
Draw.rect("circle-shadow", entity.x, entity.y, s, s);
|
||||||
|
|
||||||
|
Angles.randLenVectors(1, (1f- fract), 100, 1000f * scl * (1f-fract), (x, y, fin, fout) -> {
|
||||||
|
Lines.stroke(scl * fin);
|
||||||
|
Lines.lineAngle(entity.x + x, entity.y + y, Mathf.angle(x, y), (fin * 20 + 1f) * scl);
|
||||||
|
});
|
||||||
|
|
||||||
|
Draw.color();
|
||||||
|
Draw.mixcol(Color.white, fract);
|
||||||
|
Draw.rect(reg, entity.x, entity.y, reg.getWidth() * Draw.scl * scl, reg.getHeight() * Draw.scl * scl, fract * 135f);
|
||||||
|
|
||||||
|
Draw.reset();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
private void drawGroundShadows(){
|
private void drawGroundShadows(){
|
||||||
Draw.color(0, 0, 0, 0.4f);
|
Draw.color(0, 0, 0, 0.4f);
|
||||||
float rad = 1.6f;
|
float rad = 1.6f;
|
||||||
@@ -348,7 +389,7 @@ public class Renderer implements ApplicationListener{
|
|||||||
}
|
}
|
||||||
|
|
||||||
public void clampScale(){
|
public void clampScale(){
|
||||||
float s = UnitScl.dp.scl(1f);
|
float s = Scl.scl(1f);
|
||||||
targetscale = Mathf.clamp(targetscale, s * 1.5f, Math.round(s * 6));
|
targetscale = Mathf.clamp(targetscale, s * 1.5f, Math.round(s * 6));
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -361,6 +402,11 @@ public class Renderer implements ApplicationListener{
|
|||||||
clampScale();
|
clampScale();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void zoomIn(float duration){
|
||||||
|
landscale = minZoomScl;
|
||||||
|
landTime = duration;
|
||||||
|
}
|
||||||
|
|
||||||
public void takeMapScreenshot(){
|
public void takeMapScreenshot(){
|
||||||
drawGroundShadows();
|
drawGroundShadows();
|
||||||
|
|
||||||
|
|||||||
@@ -3,6 +3,7 @@ package io.anuke.mindustry.core;
|
|||||||
import io.anuke.arc.*;
|
import io.anuke.arc.*;
|
||||||
import io.anuke.arc.Graphics.*;
|
import io.anuke.arc.Graphics.*;
|
||||||
import io.anuke.arc.Graphics.Cursor.*;
|
import io.anuke.arc.Graphics.Cursor.*;
|
||||||
|
import io.anuke.arc.Input.*;
|
||||||
import io.anuke.arc.assets.*;
|
import io.anuke.arc.assets.*;
|
||||||
import io.anuke.arc.assets.loaders.*;
|
import io.anuke.arc.assets.loaders.*;
|
||||||
import io.anuke.arc.assets.loaders.resolvers.*;
|
import io.anuke.arc.assets.loaders.resolvers.*;
|
||||||
@@ -13,14 +14,13 @@ import io.anuke.arc.freetype.FreeTypeFontGenerator.*;
|
|||||||
import io.anuke.arc.freetype.FreetypeFontLoader.*;
|
import io.anuke.arc.freetype.FreetypeFontLoader.*;
|
||||||
import io.anuke.arc.function.*;
|
import io.anuke.arc.function.*;
|
||||||
import io.anuke.arc.graphics.*;
|
import io.anuke.arc.graphics.*;
|
||||||
|
import io.anuke.arc.graphics.Texture.*;
|
||||||
import io.anuke.arc.graphics.g2d.*;
|
import io.anuke.arc.graphics.g2d.*;
|
||||||
import io.anuke.arc.graphics.g2d.TextureAtlas.*;
|
|
||||||
import io.anuke.arc.input.*;
|
import io.anuke.arc.input.*;
|
||||||
import io.anuke.arc.math.*;
|
import io.anuke.arc.math.*;
|
||||||
import io.anuke.arc.scene.*;
|
import io.anuke.arc.scene.*;
|
||||||
import io.anuke.arc.scene.actions.*;
|
import io.anuke.arc.scene.actions.*;
|
||||||
import io.anuke.arc.scene.event.*;
|
import io.anuke.arc.scene.event.*;
|
||||||
import io.anuke.arc.scene.style.*;
|
|
||||||
import io.anuke.arc.scene.ui.*;
|
import io.anuke.arc.scene.ui.*;
|
||||||
import io.anuke.arc.scene.ui.TextField.*;
|
import io.anuke.arc.scene.ui.TextField.*;
|
||||||
import io.anuke.arc.scene.ui.Tooltip.*;
|
import io.anuke.arc.scene.ui.Tooltip.*;
|
||||||
@@ -31,6 +31,7 @@ import io.anuke.mindustry.editor.*;
|
|||||||
import io.anuke.mindustry.game.EventType.*;
|
import io.anuke.mindustry.game.EventType.*;
|
||||||
import io.anuke.mindustry.gen.*;
|
import io.anuke.mindustry.gen.*;
|
||||||
import io.anuke.mindustry.graphics.*;
|
import io.anuke.mindustry.graphics.*;
|
||||||
|
import io.anuke.mindustry.ui.*;
|
||||||
import io.anuke.mindustry.ui.dialogs.*;
|
import io.anuke.mindustry.ui.dialogs.*;
|
||||||
import io.anuke.mindustry.ui.fragments.*;
|
import io.anuke.mindustry.ui.fragments.*;
|
||||||
|
|
||||||
@@ -38,8 +39,6 @@ import static io.anuke.arc.scene.actions.Actions.*;
|
|||||||
import static io.anuke.mindustry.Vars.*;
|
import static io.anuke.mindustry.Vars.*;
|
||||||
|
|
||||||
public class UI implements ApplicationListener, Loadable{
|
public class UI implements ApplicationListener, Loadable{
|
||||||
private Skin skin;
|
|
||||||
|
|
||||||
public MenuFragment menufrag;
|
public MenuFragment menufrag;
|
||||||
public HudFragment hudfrag;
|
public HudFragment hudfrag;
|
||||||
public ChatFragment chatfrag;
|
public ChatFragment chatfrag;
|
||||||
@@ -73,7 +72,6 @@ public class UI implements ApplicationListener, Loadable{
|
|||||||
public Cursor drillCursor, unloadCursor;
|
public Cursor drillCursor, unloadCursor;
|
||||||
|
|
||||||
public UI(){
|
public UI(){
|
||||||
skin = new Skin();
|
|
||||||
setupFonts();
|
setupFonts();
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -84,22 +82,19 @@ public class UI implements ApplicationListener, Loadable{
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void loadSync(){
|
public void loadSync(){
|
||||||
//TODO type-safe skin files
|
Fonts.outline.getData().markupEnabled = true;
|
||||||
skin.addRegions(Core.atlas);
|
Fonts.def.getData().markupEnabled = true;
|
||||||
loadExtraStyle(skin);
|
Fonts.def.setOwnsTexture(false);
|
||||||
skin.add("outline", Core.assets.get("outline"));
|
|
||||||
skin.getFont("outline").getData().markupEnabled = true;
|
|
||||||
skin.getFont("default").getData().markupEnabled = true;
|
|
||||||
skin.getFont("default").setOwnsTexture(false);
|
|
||||||
skin.load(Core.files.internal("sprites/uiskin.json"));
|
|
||||||
|
|
||||||
for(BitmapFont font : skin.getAll(BitmapFont.class).values()){
|
Core.assets.getAll(BitmapFont.class, new Array<>()).each(font -> font.setUseIntegerPositions(true));
|
||||||
font.setUseIntegerPositions(true);
|
Core.scene = new Scene();
|
||||||
}
|
|
||||||
|
|
||||||
Core.scene = new Scene(skin);
|
|
||||||
Core.input.addProcessor(Core.scene);
|
Core.input.addProcessor(Core.scene);
|
||||||
|
|
||||||
|
Tex.load();
|
||||||
|
Icon.load();
|
||||||
|
Styles.load();
|
||||||
|
Tex.loadStyles();
|
||||||
|
|
||||||
Dialog.setShowAction(() -> sequence(alpha(0f), fadeIn(0.1f)));
|
Dialog.setShowAction(() -> sequence(alpha(0f), fadeIn(0.1f)));
|
||||||
Dialog.setHideAction(() -> sequence(fadeOut(0.1f)));
|
Dialog.setHideAction(() -> sequence(fadeOut(0.1f)));
|
||||||
|
|
||||||
@@ -107,13 +102,13 @@ public class UI implements ApplicationListener, Loadable{
|
|||||||
|
|
||||||
Core.settings.setErrorHandler(e -> {
|
Core.settings.setErrorHandler(e -> {
|
||||||
e.printStackTrace();
|
e.printStackTrace();
|
||||||
Core.app.post(() -> showError("Failed to access local storage.\nSettings will not be saved."));
|
Core.app.post(() -> showErrorMessage("Failed to access local storage.\nSettings will not be saved."));
|
||||||
});
|
});
|
||||||
|
|
||||||
ClickListener.clicked = () -> Sounds.press.play();
|
ClickListener.clicked = () -> Sounds.press.play();
|
||||||
|
|
||||||
Colors.put("accent", Pal.accent);
|
Colors.put("accent", Pal.accent);
|
||||||
Colors.put("highlight", Pal.accent.cpy().lerp(Color.WHITE, 0.3f));
|
Colors.put("highlight", Pal.accent.cpy().lerp(Color.white, 0.3f));
|
||||||
Colors.put("stat", Pal.stat);
|
Colors.put("stat", Pal.stat);
|
||||||
loadExtraCursors();
|
loadExtraCursors();
|
||||||
}
|
}
|
||||||
@@ -140,39 +135,22 @@ public class UI implements ApplicationListener, Loadable{
|
|||||||
@Override
|
@Override
|
||||||
public BitmapFont loadSync(AssetManager manager, String fileName, FileHandle file, FreeTypeFontLoaderParameter parameter){
|
public BitmapFont loadSync(AssetManager manager, String fileName, FileHandle file, FreeTypeFontLoaderParameter parameter){
|
||||||
if(fileName.equals("outline")){
|
if(fileName.equals("outline")){
|
||||||
parameter.fontParameters.borderWidth = UnitScl.dp.scl(2f);
|
parameter.fontParameters.borderWidth = Scl.scl(2f);
|
||||||
parameter.fontParameters.spaceX -= parameter.fontParameters.borderWidth;
|
parameter.fontParameters.spaceX -= parameter.fontParameters.borderWidth;
|
||||||
}
|
}
|
||||||
|
parameter.fontParameters.magFilter = TextureFilter.Linear;
|
||||||
|
parameter.fontParameters.minFilter = TextureFilter.Linear;
|
||||||
parameter.fontParameters.size = fontParameter().size;
|
parameter.fontParameters.size = fontParameter().size;
|
||||||
return super.loadSync(manager, fileName, file, parameter);
|
return super.loadSync(manager, fileName, file, parameter);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
FreeTypeFontParameter param = new FreeTypeFontParameter(){{
|
FreeTypeFontParameter param = new FreeTypeFontParameter(){{
|
||||||
borderColor = Color.DARK_GRAY;
|
borderColor = Color.darkGray;
|
||||||
incremental = true;
|
incremental = true;
|
||||||
}};
|
}};
|
||||||
|
|
||||||
Core.assets.load("outline", BitmapFont.class, new FreeTypeFontLoaderParameter("fonts/font.ttf", param));
|
Core.assets.load("outline", BitmapFont.class, new FreeTypeFontLoaderParameter("fonts/font.ttf", param)).loaded = t -> Fonts.outline = (BitmapFont)t;
|
||||||
}
|
|
||||||
|
|
||||||
void loadExtraStyle(Skin skin){
|
|
||||||
AtlasRegion region = Core.atlas.find("flat-down-base");
|
|
||||||
int[] splits = region.splits;
|
|
||||||
|
|
||||||
ScaledNinePatchDrawable copy = new ScaledNinePatchDrawable(new NinePatch(region, splits[0], splits[1], splits[2], splits[3])){
|
|
||||||
public float getLeftWidth(){ return 0; }
|
|
||||||
public float getRightWidth(){ return 0; }
|
|
||||||
public float getTopHeight(){ return 0; }
|
|
||||||
public float getBottomHeight(){ return 0; }
|
|
||||||
};
|
|
||||||
copy.setMinWidth(0);
|
|
||||||
copy.setMinHeight(0);
|
|
||||||
copy.setTopHeight(0);
|
|
||||||
copy.setRightWidth(0);
|
|
||||||
copy.setBottomHeight(0);
|
|
||||||
copy.setLeftWidth(0);
|
|
||||||
skin.add("flat-down", copy, Drawable.class);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void loadExtraCursors(){
|
void loadExtraCursors(){
|
||||||
@@ -185,14 +163,14 @@ public class UI implements ApplicationListener, Loadable{
|
|||||||
|
|
||||||
FreeTypeFontParameter param = fontParameter();
|
FreeTypeFontParameter param = fontParameter();
|
||||||
|
|
||||||
Core.assets.load("default", BitmapFont.class, new FreeTypeFontLoaderParameter(fontName, param)).loaded = f -> skin.add("default", f);
|
Core.assets.load("default", BitmapFont.class, new FreeTypeFontLoaderParameter(fontName, param)).loaded = f -> Fonts.def = (BitmapFont)f;
|
||||||
Core.assets.load("chat", BitmapFont.class, new FreeTypeFontLoaderParameter(fontName, param)).loaded = f -> skin.add("chat", f);
|
Core.assets.load("chat", BitmapFont.class, new FreeTypeFontLoaderParameter(fontName, param)).loaded = f -> Fonts.chat = (BitmapFont)f;
|
||||||
}
|
}
|
||||||
|
|
||||||
static FreeTypeFontParameter fontParameter(){
|
static FreeTypeFontParameter fontParameter(){
|
||||||
return new FreeTypeFontParameter(){{
|
return new FreeTypeFontParameter(){{
|
||||||
size = (int)(UnitScl.dp.scl(18f));
|
size = (int)(Scl.scl(18f));
|
||||||
shadowColor = Color.DARK_GRAY;
|
shadowColor = Color.darkGray;
|
||||||
shadowOffsetY = 2;
|
shadowOffsetY = 2;
|
||||||
incremental = true;
|
incremental = true;
|
||||||
}};
|
}};
|
||||||
@@ -290,28 +268,37 @@ public class UI implements ApplicationListener, Loadable{
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
public void showTextInput(String titleText, String text, int textLength, String def, TextFieldFilter filter, Consumer<String> confirmed){
|
public void showTextInput(String titleText, String dtext, int textLength, String def, boolean inumeric, Consumer<String> confirmed){
|
||||||
new Dialog(titleText, "dialog"){{
|
if(mobile){
|
||||||
cont.margin(30).add(text).padRight(6f);
|
Core.input.getTextInput(new TextInput(){{
|
||||||
TextField field = cont.addField(def, t -> {
|
this.title = (titleText.startsWith("$") ? Core.bundle.get(titleText.substring(1)) : titleText);
|
||||||
}).size(170f, 50f).get();
|
this.text = def;
|
||||||
field.setFilter((f, c) -> field.getText().length() < textLength && filter.acceptChar(f, c));
|
this.numeric = inumeric;
|
||||||
platform.addDialog(field);
|
this.maxLength = textLength;
|
||||||
buttons.defaults().size(120, 54).pad(4);
|
this.accepted = confirmed;
|
||||||
buttons.addButton("$ok", () -> {
|
}});
|
||||||
confirmed.accept(field.getText());
|
}else{
|
||||||
hide();
|
new Dialog(titleText){{
|
||||||
}).disabled(b -> field.getText().isEmpty());
|
cont.margin(30).add(dtext).padRight(6f);
|
||||||
buttons.addButton("$cancel", this::hide);
|
TextFieldFilter filter = inumeric ? TextFieldFilter.digitsOnly : (f, c) -> true;
|
||||||
}}.show();
|
TextField field = cont.addField(def, t -> {}).size(170f, 50f).get();
|
||||||
|
field.setFilter((f, c) -> field.getText().length() < textLength && filter.acceptChar(f, c));
|
||||||
|
buttons.defaults().size(120, 54).pad(4);
|
||||||
|
buttons.addButton("$ok", () -> {
|
||||||
|
confirmed.accept(field.getText());
|
||||||
|
hide();
|
||||||
|
}).disabled(b -> field.getText().isEmpty());
|
||||||
|
buttons.addButton("$cancel", this::hide);
|
||||||
|
}}.show();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public void showTextInput(String title, String text, String def, Consumer<String> confirmed){
|
public void showTextInput(String title, String text, String def, Consumer<String> confirmed){
|
||||||
showTextInput(title, text, 12, def, (field, c) -> true, confirmed);
|
showTextInput(title, text, 24, def, confirmed);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void showTextInput(String title, String text, int textLength, String def, Consumer<String> confirmed){
|
public void showTextInput(String titleText, String text, int textLength, String def, Consumer<String> confirmed){
|
||||||
showTextInput(title, text, textLength < 0 ? 12 : textLength, def, (field, c) -> true, confirmed);
|
showTextInput(titleText, text, textLength, def, false, confirmed);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void showInfoFade(String info){
|
public void showInfoFade(String info){
|
||||||
@@ -323,43 +310,76 @@ public class UI implements ApplicationListener, Loadable{
|
|||||||
}
|
}
|
||||||
|
|
||||||
public void showInfo(String info){
|
public void showInfo(String info){
|
||||||
new Dialog("", "dialog"){{
|
new Dialog(""){{
|
||||||
getCell(cont).growX();
|
getCell(cont).growX();
|
||||||
cont.margin(15).add(info).width(400f).wrap().get().setAlignment(Align.center, Align.center);
|
cont.margin(15).add(info).width(400f).wrap().get().setAlignment(Align.center, Align.center);
|
||||||
buttons.addButton("$ok", this::hide).size(90, 50).pad(4);
|
buttons.addButton("$ok", this::hide).size(90, 50).pad(4);
|
||||||
}}.show();
|
}}.show();
|
||||||
}
|
}
|
||||||
|
|
||||||
public void showError(String text){
|
public void showErrorMessage(String text){
|
||||||
new Dialog("", "dialog"){{
|
new Dialog(""){{
|
||||||
setFillParent(true);
|
setFillParent(true);
|
||||||
|
cont.margin(15f);
|
||||||
cont.add("$error.title");
|
cont.add("$error.title");
|
||||||
cont.row();
|
cont.row();
|
||||||
cont.margin(15).pane(t -> {
|
cont.addImage().width(300f).pad(2).height(4f).color(Color.scarlet);
|
||||||
Label l = t.add(text).pad(14f).get();
|
cont.row();
|
||||||
l.setAlignment(Align.center, Align.left);
|
cont.add(text).pad(2f).growX().wrap().get().setAlignment(Align.center);
|
||||||
if(mobile){
|
cont.row();
|
||||||
t.getCell(l).wrap().width(400f);
|
cont.addButton("$ok", this::hide).size(120, 50).pad(4);
|
||||||
}
|
}}.show();
|
||||||
});
|
}
|
||||||
buttons.addButton("$ok", this::hide).size(90, 50).pad(4);
|
|
||||||
|
public void showException(Throwable t){
|
||||||
|
showException("", t);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void showException(String text, Throwable exc){
|
||||||
|
new Dialog(""){{
|
||||||
|
String message = Strings.getFinalMesage(exc);
|
||||||
|
|
||||||
|
setFillParent(true);
|
||||||
|
cont.margin(15);
|
||||||
|
cont.add("$error.title").colspan(2);
|
||||||
|
cont.row();
|
||||||
|
cont.addImage().width(300f).pad(2).colspan(2).height(4f).color(Color.scarlet);
|
||||||
|
cont.row();
|
||||||
|
cont.add((text.startsWith("$") ? Core.bundle.get(text.substring(1)) : text) + (message == null ? "" : "\n[lightgray](" + message + ")")).colspan(2).wrap().growX().center().get().setAlignment(Align.center);
|
||||||
|
cont.row();
|
||||||
|
|
||||||
|
Collapser col = new Collapser(base -> base.pane(t -> t.margin(14f).add(Strings.parseException(exc, true)).color(Color.lightGray).left()), true);
|
||||||
|
|
||||||
|
cont.addButton("$details", Styles.togglet, col::toggle).size(180f, 50f).checked(b -> !col.isCollapsed()).fillX().right();
|
||||||
|
cont.addButton("$ok", this::hide).size(100, 50).fillX().left();
|
||||||
|
cont.row();
|
||||||
|
cont.add(col).colspan(2).pad(2);
|
||||||
}}.show();
|
}}.show();
|
||||||
}
|
}
|
||||||
|
|
||||||
public void showText(String titleText, String text){
|
public void showText(String titleText, String text){
|
||||||
new Dialog(titleText, "dialog"){{
|
new Dialog(titleText){{
|
||||||
cont.margin(15).add(text).width(400f).wrap().get().setAlignment(Align.center, Align.center);
|
cont.margin(15).add(text).width(400f).wrap().get().setAlignment(Align.center, Align.center);
|
||||||
buttons.addButton("$ok", this::hide).size(90, 50).pad(4);
|
buttons.addButton("$ok", this::hide).size(90, 50).pad(4);
|
||||||
}}.show();
|
}}.show();
|
||||||
}
|
}
|
||||||
|
|
||||||
public void showInfoText(String titleText, String text){
|
public void showInfoText(String titleText, String text){
|
||||||
new Dialog(titleText, "dialog"){{
|
new Dialog(titleText){{
|
||||||
cont.margin(15).add(text).width(400f).wrap().left().get().setAlignment(Align.left, Align.left);
|
cont.margin(15).add(text).width(400f).wrap().left().get().setAlignment(Align.left, Align.left);
|
||||||
buttons.addButton("$ok", this::hide).size(90, 50).pad(4);
|
buttons.addButton("$ok", this::hide).size(90, 50).pad(4);
|
||||||
}}.show();
|
}}.show();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void showSmall(String titleText, String text){
|
||||||
|
new Dialog(titleText){{
|
||||||
|
cont.margin(10).add(text);
|
||||||
|
titleTable.row();
|
||||||
|
titleTable.addImage().color(Pal.accent).height(3f).growX().pad(2f);
|
||||||
|
buttons.addButton("$ok", this::hide).size(90, 50).pad(4);
|
||||||
|
}}.show();
|
||||||
|
}
|
||||||
|
|
||||||
public void showConfirm(String title, String text, Runnable confirmed){
|
public void showConfirm(String title, String text, Runnable confirmed){
|
||||||
showConfirm(title, text, null, confirmed);
|
showConfirm(title, text, null, confirmed);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -215,7 +215,7 @@ public class World{
|
|||||||
}catch(Exception e){
|
}catch(Exception e){
|
||||||
Log.err(e);
|
Log.err(e);
|
||||||
if(!headless){
|
if(!headless){
|
||||||
ui.showError("$map.invalid");
|
ui.showErrorMessage("$map.invalid");
|
||||||
Core.app.post(() -> state.set(State.menu));
|
Core.app.post(() -> state.set(State.menu));
|
||||||
invalidMap = true;
|
invalidMap = true;
|
||||||
}
|
}
|
||||||
@@ -229,7 +229,7 @@ public class World{
|
|||||||
|
|
||||||
if(!headless){
|
if(!headless){
|
||||||
if(state.teams.get(defaultTeam).cores.size == 0 && !checkRules.pvp){
|
if(state.teams.get(defaultTeam).cores.size == 0 && !checkRules.pvp){
|
||||||
ui.showError("$map.nospawn");
|
ui.showErrorMessage("$map.nospawn");
|
||||||
invalidMap = true;
|
invalidMap = true;
|
||||||
}else if(checkRules.pvp){ //pvp maps need two cores to be valid
|
}else if(checkRules.pvp){ //pvp maps need two cores to be valid
|
||||||
int teams = 0;
|
int teams = 0;
|
||||||
@@ -240,12 +240,12 @@ public class World{
|
|||||||
}
|
}
|
||||||
if(teams < 2){
|
if(teams < 2){
|
||||||
invalidMap = true;
|
invalidMap = true;
|
||||||
ui.showError("$map.nospawn.pvp");
|
ui.showErrorMessage("$map.nospawn.pvp");
|
||||||
}
|
}
|
||||||
}else if(checkRules.attackMode){ //attack maps need two cores to be valid
|
}else if(checkRules.attackMode){ //attack maps need two cores to be valid
|
||||||
invalidMap = state.teams.get(waveTeam).cores.isEmpty();
|
invalidMap = state.teams.get(waveTeam).cores.isEmpty();
|
||||||
if(invalidMap){
|
if(invalidMap){
|
||||||
ui.showError("$map.nospawn.attack");
|
ui.showErrorMessage("$map.nospawn.attack");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}else{
|
}else{
|
||||||
|
|||||||
@@ -13,19 +13,19 @@ import io.anuke.arc.scene.actions.*;
|
|||||||
import io.anuke.arc.scene.event.*;
|
import io.anuke.arc.scene.event.*;
|
||||||
import io.anuke.arc.scene.style.*;
|
import io.anuke.arc.scene.style.*;
|
||||||
import io.anuke.arc.scene.ui.*;
|
import io.anuke.arc.scene.ui.*;
|
||||||
import io.anuke.arc.scene.ui.TextButton.*;
|
|
||||||
import io.anuke.arc.scene.ui.layout.*;
|
import io.anuke.arc.scene.ui.layout.*;
|
||||||
import io.anuke.arc.util.*;
|
import io.anuke.arc.util.*;
|
||||||
import io.anuke.mindustry.*;
|
import io.anuke.mindustry.*;
|
||||||
import io.anuke.mindustry.content.*;
|
import io.anuke.mindustry.content.*;
|
||||||
import io.anuke.mindustry.core.GameState.*;
|
import io.anuke.mindustry.core.GameState.*;
|
||||||
import io.anuke.mindustry.game.*;
|
import io.anuke.mindustry.game.*;
|
||||||
|
import io.anuke.mindustry.gen.*;
|
||||||
import io.anuke.mindustry.graphics.*;
|
import io.anuke.mindustry.graphics.*;
|
||||||
import io.anuke.mindustry.io.*;
|
import io.anuke.mindustry.io.*;
|
||||||
import io.anuke.mindustry.maps.*;
|
import io.anuke.mindustry.maps.*;
|
||||||
|
import io.anuke.mindustry.ui.Styles;
|
||||||
import io.anuke.mindustry.ui.dialogs.*;
|
import io.anuke.mindustry.ui.dialogs.*;
|
||||||
import io.anuke.mindustry.world.*;
|
import io.anuke.mindustry.world.*;
|
||||||
import io.anuke.mindustry.world.Block.*;
|
|
||||||
import io.anuke.mindustry.world.blocks.*;
|
import io.anuke.mindustry.world.blocks.*;
|
||||||
import io.anuke.mindustry.world.blocks.storage.*;
|
import io.anuke.mindustry.world.blocks.storage.*;
|
||||||
|
|
||||||
@@ -47,9 +47,9 @@ public class MapEditorDialog extends Dialog implements Disposable{
|
|||||||
private Array<Block> blocksOut = new Array<>();
|
private Array<Block> blocksOut = new Array<>();
|
||||||
|
|
||||||
public MapEditorDialog(){
|
public MapEditorDialog(){
|
||||||
super("", "dialog");
|
super("");
|
||||||
|
|
||||||
background("dark");
|
background(Styles.black);
|
||||||
|
|
||||||
editor = new MapEditor();
|
editor = new MapEditor();
|
||||||
view = new MapView(editor);
|
view = new MapView(editor);
|
||||||
@@ -59,27 +59,26 @@ public class MapEditorDialog extends Dialog implements Disposable{
|
|||||||
menu = new FloatingDialog("$menu");
|
menu = new FloatingDialog("$menu");
|
||||||
menu.addCloseButton();
|
menu.addCloseButton();
|
||||||
|
|
||||||
float isize = iconsize;
|
|
||||||
float swidth = 180f;
|
float swidth = 180f;
|
||||||
|
|
||||||
menu.cont.table(t -> {
|
menu.cont.table(t -> {
|
||||||
t.defaults().size(swidth, 60f).padBottom(5).padRight(5).padLeft(5);
|
t.defaults().size(swidth, 60f).padBottom(5).padRight(5).padLeft(5);
|
||||||
|
|
||||||
t.addImageTextButton("$editor.savemap", "icon-floppy-16", isize, this::save);
|
t.addImageTextButton("$editor.savemap", Icon.floppy16Small, this::save);
|
||||||
|
|
||||||
t.addImageTextButton("$editor.mapinfo", "icon-pencil", isize, () -> {
|
t.addImageTextButton("$editor.mapinfo", Icon.pencilSmall, () -> {
|
||||||
infoDialog.show();
|
infoDialog.show();
|
||||||
menu.hide();
|
menu.hide();
|
||||||
});
|
});
|
||||||
|
|
||||||
t.row();
|
t.row();
|
||||||
|
|
||||||
t.addImageTextButton("$editor.generate", "icon-editor", isize, () -> {
|
t.addImageTextButton("$editor.generate", Icon.editorSmall, () -> {
|
||||||
generateDialog.show(generateDialog::applyToEditor);
|
generateDialog.show(generateDialog::applyToEditor);
|
||||||
menu.hide();
|
menu.hide();
|
||||||
});
|
});
|
||||||
|
|
||||||
t.addImageTextButton("$editor.resize", "icon-resize", isize, () -> {
|
t.addImageTextButton("$editor.resize", Icon.resizeSmall, () -> {
|
||||||
resizeDialog.show();
|
resizeDialog.show();
|
||||||
menu.hide();
|
menu.hide();
|
||||||
});
|
});
|
||||||
@@ -87,54 +86,50 @@ public class MapEditorDialog extends Dialog implements Disposable{
|
|||||||
t.row();
|
t.row();
|
||||||
|
|
||||||
if(!ios){
|
if(!ios){
|
||||||
t.addImageTextButton("$editor.import", "icon-load-map", isize, () ->
|
t.addImageTextButton("$editor.import", Icon.loadMapSmall, () ->
|
||||||
createDialog("$editor.import",
|
createDialog("$editor.import",
|
||||||
"$editor.importmap", "$editor.importmap.description", "icon-load-map", (Runnable)loadDialog::show,
|
"$editor.importmap", "$editor.importmap.description", Icon.loadMap, (Runnable)loadDialog::show,
|
||||||
"$editor.importfile", "$editor.importfile.description", "icon-file", (Runnable)() ->
|
"$editor.importfile", "$editor.importfile.description", Icon.file, (Runnable)() ->
|
||||||
platform.showFileChooser("$editor.loadmap", "Map Files", file -> ui.loadAnd(() -> {
|
platform.showFileChooser(true, mapExtension, file -> ui.loadAnd(() -> {
|
||||||
maps.tryCatchMapError(() -> {
|
maps.tryCatchMapError(() -> {
|
||||||
if(MapIO.isImage(file)){
|
if(MapIO.isImage(file)){
|
||||||
ui.showInfo("$editor.errorimage");
|
ui.showInfo("$editor.errorimage");
|
||||||
}else if(file.extension().equalsIgnoreCase(oldMapExtension)){
|
|
||||||
editor.beginEdit(maps.makeLegacyMap(file));
|
|
||||||
}else{
|
}else{
|
||||||
editor.beginEdit(MapIO.createMap(file, true));
|
editor.beginEdit(MapIO.createMap(file, true));
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}), true, FileChooser.anyMapFiles),
|
})),
|
||||||
|
|
||||||
"$editor.importimage", "$editor.importimage.description", "icon-file-image", (Runnable)() ->
|
"$editor.importimage", "$editor.importimage.description", Icon.fileImage, (Runnable)() ->
|
||||||
platform.showFileChooser("$loadimage", "Image Files", file ->
|
platform.showFileChooser(true, "png", file ->
|
||||||
ui.loadAnd(() -> {
|
ui.loadAnd(() -> {
|
||||||
try{
|
try{
|
||||||
Pixmap pixmap = new Pixmap(file);
|
Pixmap pixmap = new Pixmap(file);
|
||||||
editor.beginEdit(pixmap);
|
editor.beginEdit(pixmap);
|
||||||
pixmap.dispose();
|
pixmap.dispose();
|
||||||
}catch(Exception e){
|
}catch(Exception e){
|
||||||
ui.showError(Core.bundle.format("editor.errorload", Strings.parseException(e, true)));
|
ui.showException("$editor.errorload", e);
|
||||||
Log.err(e);
|
Log.err(e);
|
||||||
}
|
}
|
||||||
}), true, FileChooser.pngFiles))
|
})))
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
Cell cell = t.addImageTextButton("$editor.export", "icon-save-map", isize, () -> {
|
Cell cell = t.addImageTextButton("$editor.export", Icon.saveMapSmall, () -> {
|
||||||
if(!ios){
|
if(!ios){
|
||||||
platform.showFileChooser("$editor.savemap", "Map Files", file -> {
|
platform.showFileChooser(false, mapExtension, file -> {
|
||||||
file = file.parent().child(file.nameWithoutExtension() + "." + mapExtension);
|
|
||||||
FileHandle result = file;
|
|
||||||
ui.loadAnd(() -> {
|
ui.loadAnd(() -> {
|
||||||
try{
|
try{
|
||||||
if(!editor.getTags().containsKey("name")){
|
if(!editor.getTags().containsKey("name")){
|
||||||
editor.getTags().put("name", result.nameWithoutExtension());
|
editor.getTags().put("name", file.nameWithoutExtension());
|
||||||
}
|
}
|
||||||
MapIO.writeMap(result, editor.createMap(result));
|
MapIO.writeMap(file, editor.createMap(file));
|
||||||
}catch(Exception e){
|
}catch(Exception e){
|
||||||
ui.showError(Core.bundle.format("editor.errorsave", Strings.parseException(e, true)));
|
ui.showException("$editor.errorsave", e);
|
||||||
Log.err(e);
|
Log.err(e);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}, false, FileChooser.mapFiles);
|
});
|
||||||
}else{
|
}else{
|
||||||
ui.loadAnd(() -> {
|
ui.loadAnd(() -> {
|
||||||
try{
|
try{
|
||||||
@@ -142,7 +137,7 @@ public class MapEditorDialog extends Dialog implements Disposable{
|
|||||||
MapIO.writeMap(result, editor.createMap(result));
|
MapIO.writeMap(result, editor.createMap(result));
|
||||||
platform.shareFile(result);
|
platform.shareFile(result);
|
||||||
}catch(Exception e){
|
}catch(Exception e){
|
||||||
ui.showError(Core.bundle.format("editor.errorsave", Strings.parseException(e, true)));
|
ui.showException("$editor.errorsave", e);
|
||||||
Log.err(e);
|
Log.err(e);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
@@ -156,11 +151,22 @@ public class MapEditorDialog extends Dialog implements Disposable{
|
|||||||
|
|
||||||
menu.cont.row();
|
menu.cont.row();
|
||||||
|
|
||||||
menu.cont.addImageTextButton("$editor.ingame", "icon-arrow", isize, this::playtest).padTop(-5).size(swidth * 2f + 10, 60f);
|
if(steam){
|
||||||
|
menu.cont.addImageTextButton("$editor.publish.workshop", Icon.linkSmall, () -> {
|
||||||
|
Map map = save();
|
||||||
|
if(map != null){
|
||||||
|
platform.publishMap(map);
|
||||||
|
}
|
||||||
|
}).padTop(-3).size(swidth * 2f + 10, 60f);
|
||||||
|
|
||||||
|
menu.cont.row();
|
||||||
|
}
|
||||||
|
|
||||||
|
menu.cont.addImageTextButton("$editor.ingame", Icon.arrowSmall, this::playtest).padTop(!steam ? -3 : 1).size(swidth * 2f + 10, 60f);
|
||||||
|
|
||||||
menu.cont.row();
|
menu.cont.row();
|
||||||
|
|
||||||
menu.cont.addImageTextButton("$quit", "icon-back", isize, () -> {
|
menu.cont.addImageTextButton("$quit", Icon.backSmall, () -> {
|
||||||
tryExit();
|
tryExit();
|
||||||
menu.hide();
|
menu.hide();
|
||||||
}).size(swidth * 2f + 10, 60f);
|
}).size(swidth * 2f + 10, 60f);
|
||||||
@@ -177,7 +183,7 @@ public class MapEditorDialog extends Dialog implements Disposable{
|
|||||||
try{
|
try{
|
||||||
editor.beginEdit(map);
|
editor.beginEdit(map);
|
||||||
}catch(Exception e){
|
}catch(Exception e){
|
||||||
ui.showError(Core.bundle.format("editor.errorload", Strings.parseException(e, true)));
|
ui.showException("$editor.errorload", e);
|
||||||
Log.err(e);
|
Log.err(e);
|
||||||
}
|
}
|
||||||
}));
|
}));
|
||||||
@@ -186,7 +192,6 @@ public class MapEditorDialog extends Dialog implements Disposable{
|
|||||||
|
|
||||||
clearChildren();
|
clearChildren();
|
||||||
margin(0);
|
margin(0);
|
||||||
shown(this::build);
|
|
||||||
|
|
||||||
update(() -> {
|
update(() -> {
|
||||||
if(Core.scene.getKeyboardFocus() instanceof Dialog && Core.scene.getKeyboardFocus() != this){
|
if(Core.scene.getKeyboardFocus() instanceof Dialog && Core.scene.getKeyboardFocus() != this){
|
||||||
@@ -228,11 +233,8 @@ public class MapEditorDialog extends Dialog implements Disposable{
|
|||||||
platform.updateRPC();
|
platform.updateRPC();
|
||||||
if(!Core.settings.getBool("landscape")) platform.endForceLandscape();
|
if(!Core.settings.getBool("landscape")) platform.endForceLandscape();
|
||||||
});
|
});
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
shown(this::build);
|
||||||
protected void drawBackground(float x, float y){
|
|
||||||
drawDefaultBackground(x, y);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public void resumeEditing(){
|
public void resumeEditing(){
|
||||||
@@ -274,33 +276,36 @@ public class MapEditorDialog extends Dialog implements Disposable{
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
private void save(){
|
private Map save(){
|
||||||
String name = editor.getTags().get("name", "").trim();
|
String name = editor.getTags().get("name", "").trim();
|
||||||
editor.getTags().put("rules", JsonIO.write(state.rules));
|
editor.getTags().put("rules", JsonIO.write(state.rules));
|
||||||
editor.getTags().remove("width");
|
editor.getTags().remove("width");
|
||||||
editor.getTags().remove("height");
|
editor.getTags().remove("height");
|
||||||
player.dead = true;
|
player.dead = true;
|
||||||
|
|
||||||
|
Map returned = null;
|
||||||
|
|
||||||
if(name.isEmpty()){
|
if(name.isEmpty()){
|
||||||
infoDialog.show();
|
infoDialog.show();
|
||||||
Core.app.post(() -> ui.showError("$editor.save.noname"));
|
Core.app.post(() -> ui.showErrorMessage("$editor.save.noname"));
|
||||||
}else{
|
}else{
|
||||||
Map map = maps.all().find(m -> m.name().equals(name));
|
Map map = maps.all().find(m -> m.name().equals(name));
|
||||||
if(map != null && !map.custom){
|
if(map != null && !map.custom){
|
||||||
handleSaveBuiltin(map);
|
handleSaveBuiltin(map);
|
||||||
}else{
|
}else{
|
||||||
maps.saveMap(editor.getTags());
|
returned = maps.saveMap(editor.getTags());
|
||||||
ui.showInfoFade("$editor.saved");
|
ui.showInfoFade("$editor.saved");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
menu.hide();
|
menu.hide();
|
||||||
saved = true;
|
saved = true;
|
||||||
|
return returned;
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Called when a built-in map save is attempted.*/
|
/** Called when a built-in map save is attempted.*/
|
||||||
protected void handleSaveBuiltin(Map map){
|
protected void handleSaveBuiltin(Map map){
|
||||||
ui.showError("$editor.save.overwrite");
|
ui.showErrorMessage("$editor.save.overwrite");
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -320,7 +325,7 @@ public class MapEditorDialog extends Dialog implements Disposable{
|
|||||||
for(int i = 0; i < arguments.length; i += 4){
|
for(int i = 0; i < arguments.length; i += 4){
|
||||||
String name = (String)arguments[i];
|
String name = (String)arguments[i];
|
||||||
String description = (String)arguments[i + 1];
|
String description = (String)arguments[i + 1];
|
||||||
String iconname = (String)arguments[i + 2];
|
Drawable iconname = (Drawable)arguments[i + 2];
|
||||||
Runnable listenable = (Runnable)arguments[i + 3];
|
Runnable listenable = (Runnable)arguments[i + 3];
|
||||||
|
|
||||||
TextButton button = dialog.cont.addButton(name, () -> {
|
TextButton button = dialog.cont.addButton(name, () -> {
|
||||||
@@ -330,11 +335,11 @@ public class MapEditorDialog extends Dialog implements Disposable{
|
|||||||
}).left().margin(0).get();
|
}).left().margin(0).get();
|
||||||
|
|
||||||
button.clearChildren();
|
button.clearChildren();
|
||||||
button.addImage(iconname).size(iconsize).padLeft(10);
|
button.addImage(iconname).padLeft(10);
|
||||||
button.table(t -> {
|
button.table(t -> {
|
||||||
t.add(name).growX().wrap();
|
t.add(name).growX().wrap();
|
||||||
t.row();
|
t.row();
|
||||||
t.add(description).color(Color.GRAY).growX().wrap();
|
t.add(description).color(Color.gray).growX().wrap();
|
||||||
}).growX().pad(10f).padLeft(5);
|
}).growX().pad(10f).padLeft(5);
|
||||||
|
|
||||||
button.row();
|
button.row();
|
||||||
@@ -369,7 +374,7 @@ public class MapEditorDialog extends Dialog implements Disposable{
|
|||||||
show();
|
show();
|
||||||
}catch(Exception e){
|
}catch(Exception e){
|
||||||
Log.err(e);
|
Log.err(e);
|
||||||
ui.showError(Core.bundle.format("editor.errorload", Strings.parseException(e, true)));
|
ui.showException("$editor.errorload", e);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
@@ -407,14 +412,13 @@ public class MapEditorDialog extends Dialog implements Disposable{
|
|||||||
|
|
||||||
Consumer<EditorTool> addTool = tool -> {
|
Consumer<EditorTool> addTool = tool -> {
|
||||||
|
|
||||||
ImageButton button = new ImageButton("icon-" + tool.name() + "-small", "clear-toggle");
|
ImageButton button = new ImageButton(Core.atlas.drawable("icon-" + tool.name() + "-small"), Styles.clearTogglei);
|
||||||
button.clicked(() -> {
|
button.clicked(() -> {
|
||||||
view.setTool(tool);
|
view.setTool(tool);
|
||||||
if(lastTable[0] != null){
|
if(lastTable[0] != null){
|
||||||
lastTable[0].remove();
|
lastTable[0].remove();
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
button.resizeImage(iconsizesmall);
|
|
||||||
button.update(() -> button.setChecked(view.getTool() == tool));
|
button.update(() -> button.setChecked(view.getTool() == tool));
|
||||||
group.add(button);
|
group.add(button);
|
||||||
|
|
||||||
@@ -434,7 +438,7 @@ public class MapEditorDialog extends Dialog implements Disposable{
|
|||||||
lastTable[0].remove();
|
lastTable[0].remove();
|
||||||
}
|
}
|
||||||
|
|
||||||
Table table = new Table("dialogDim");
|
Table table = new Table(Styles.black9);
|
||||||
table.defaults().size(300f, 70f);
|
table.defaults().size(300f, 70f);
|
||||||
|
|
||||||
for(int i = 0; i < tool.altModes.length; i++){
|
for(int i = 0; i < tool.altModes.length; i++){
|
||||||
@@ -444,10 +448,10 @@ public class MapEditorDialog extends Dialog implements Disposable{
|
|||||||
table.addButton(b -> {
|
table.addButton(b -> {
|
||||||
b.left();
|
b.left();
|
||||||
b.marginLeft(6);
|
b.marginLeft(6);
|
||||||
b.setStyle(Core.scene.skin.get("clear-toggle", TextButtonStyle.class));
|
b.setStyle(Styles.clearTogglet);
|
||||||
b.add(Core.bundle.get("toolmode." + name)).left();
|
b.add(Core.bundle.get("toolmode." + name)).left();
|
||||||
b.row();
|
b.row();
|
||||||
b.add(Core.bundle.get("toolmode." + name + ".description")).color(Color.LIGHT_GRAY).left();
|
b.add(Core.bundle.get("toolmode." + name + ".description")).color(Color.lightGray).left();
|
||||||
}, () -> {
|
}, () -> {
|
||||||
tool.mode = (tool.mode == mode ? -1 : mode);
|
tool.mode = (tool.mode == mode ? -1 : mode);
|
||||||
table.remove();
|
table.remove();
|
||||||
@@ -484,16 +488,16 @@ public class MapEditorDialog extends Dialog implements Disposable{
|
|||||||
|
|
||||||
tools.defaults().size(size, size);
|
tools.defaults().size(size, size);
|
||||||
|
|
||||||
tools.addImageButton("icon-menu-large-small", "clear", iconsizesmall, menu::show);
|
tools.addImageButton(Icon.menuLargeSmall, Styles.cleari, menu::show);
|
||||||
|
|
||||||
ImageButton grid = tools.addImageButton("icon-grid-small", "clear-toggle", iconsizesmall, () -> view.setGrid(!view.isGrid())).get();
|
ImageButton grid = tools.addImageButton(Icon.gridSmall, Styles.clearTogglei, () -> view.setGrid(!view.isGrid())).get();
|
||||||
|
|
||||||
addTool.accept(EditorTool.zoom);
|
addTool.accept(EditorTool.zoom);
|
||||||
|
|
||||||
tools.row();
|
tools.row();
|
||||||
|
|
||||||
ImageButton undo = tools.addImageButton("icon-undo-small", "clear", iconsizesmall, editor::undo).get();
|
ImageButton undo = tools.addImageButton(Icon.undoSmall, Styles.cleari, editor::undo).get();
|
||||||
ImageButton redo = tools.addImageButton("icon-redo-small", "clear", iconsizesmall, editor::redo).get();
|
ImageButton redo = tools.addImageButton(Icon.redoSmall, Styles.cleari, editor::redo).get();
|
||||||
|
|
||||||
addTool.accept(EditorTool.pick);
|
addTool.accept(EditorTool.pick);
|
||||||
|
|
||||||
@@ -502,8 +506,8 @@ public class MapEditorDialog extends Dialog implements Disposable{
|
|||||||
undo.setDisabled(() -> !editor.canUndo());
|
undo.setDisabled(() -> !editor.canUndo());
|
||||||
redo.setDisabled(() -> !editor.canRedo());
|
redo.setDisabled(() -> !editor.canRedo());
|
||||||
|
|
||||||
undo.update(() -> undo.getImage().setColor(undo.isDisabled() ? Color.GRAY : Color.WHITE));
|
undo.update(() -> undo.getImage().setColor(undo.isDisabled() ? Color.gray : Color.white));
|
||||||
redo.update(() -> redo.getImage().setColor(redo.isDisabled() ? Color.GRAY : Color.WHITE));
|
redo.update(() -> redo.getImage().setColor(redo.isDisabled() ? Color.gray : Color.white));
|
||||||
grid.update(() -> grid.setChecked(view.isGrid()));
|
grid.update(() -> grid.setChecked(view.isGrid()));
|
||||||
|
|
||||||
addTool.accept(EditorTool.line);
|
addTool.accept(EditorTool.line);
|
||||||
@@ -515,7 +519,7 @@ public class MapEditorDialog extends Dialog implements Disposable{
|
|||||||
addTool.accept(EditorTool.fill);
|
addTool.accept(EditorTool.fill);
|
||||||
addTool.accept(EditorTool.spray);
|
addTool.accept(EditorTool.spray);
|
||||||
|
|
||||||
ImageButton rotate = tools.addImageButton("icon-arrow-16-small", "clear", iconsizesmall, () -> editor.rotation = (editor.rotation + 1) % 4).get();
|
ImageButton rotate = tools.addImageButton(Icon.arrow16Small, Styles.cleari, () -> editor.rotation = (editor.rotation + 1) % 4).get();
|
||||||
rotate.getImage().update(() -> {
|
rotate.getImage().update(() -> {
|
||||||
rotate.getImage().setRotation(editor.rotation * 90);
|
rotate.getImage().setRotation(editor.rotation * 90);
|
||||||
rotate.getImage().setOrigin(Align.center);
|
rotate.getImage().setOrigin(Align.center);
|
||||||
@@ -523,7 +527,7 @@ public class MapEditorDialog extends Dialog implements Disposable{
|
|||||||
|
|
||||||
tools.row();
|
tools.row();
|
||||||
|
|
||||||
tools.table("underline", t -> t.add("$editor.teams"))
|
tools.table(Tex.underline, t -> t.add("$editor.teams"))
|
||||||
.colspan(3).height(40).width(size * 3f + 3f).padBottom(3);
|
.colspan(3).height(40).width(size * 3f + 3f).padBottom(3);
|
||||||
|
|
||||||
tools.row();
|
tools.row();
|
||||||
@@ -533,7 +537,7 @@ public class MapEditorDialog extends Dialog implements Disposable{
|
|||||||
int i = 0;
|
int i = 0;
|
||||||
|
|
||||||
for(Team team : Team.all){
|
for(Team team : Team.all){
|
||||||
ImageButton button = new ImageButton("whiteui", "clear-toggle-partial");
|
ImageButton button = new ImageButton(Tex.whiteui, Styles.clearTogglePartiali);
|
||||||
button.margin(4f);
|
button.margin(4f);
|
||||||
button.getImageCell().grow();
|
button.getImageCell().grow();
|
||||||
button.getStyle().imageUpColor = team.color;
|
button.getStyle().imageUpColor = team.color;
|
||||||
@@ -549,7 +553,7 @@ public class MapEditorDialog extends Dialog implements Disposable{
|
|||||||
|
|
||||||
mid.row();
|
mid.row();
|
||||||
|
|
||||||
mid.table("underline", t -> {
|
mid.table(Tex.underline, t -> {
|
||||||
Slider slider = new Slider(0, MapEditor.brushSizes.length - 1, 1, false);
|
Slider slider = new Slider(0, MapEditor.brushSizes.length - 1, 1, false);
|
||||||
slider.moved(f -> editor.brushSize = MapEditor.brushSizes[(int)(float)f]);
|
slider.moved(f -> editor.brushSize = MapEditor.brushSizes[(int)(float)f]);
|
||||||
for(int j = 0; j < MapEditor.brushSizes.length; j++){
|
for(int j = 0; j < MapEditor.brushSizes.length; j++){
|
||||||
@@ -578,7 +582,6 @@ public class MapEditorDialog extends Dialog implements Disposable{
|
|||||||
|
|
||||||
if(Core.input.ctrl()){
|
if(Core.input.ctrl()){
|
||||||
//alt mode select
|
//alt mode select
|
||||||
//TODO these keycode are unusable, tweak later
|
|
||||||
for(int i = 0; i < view.getTool().altModes.length + 1; i++){
|
for(int i = 0; i < view.getTool().altModes.length + 1; i++){
|
||||||
if(Core.input.keyTap(KeyCode.valueOf("NUM_" + (i + 1)))){
|
if(Core.input.keyTap(KeyCode.valueOf("NUM_" + (i + 1)))){
|
||||||
view.getTool().mode = i - 1;
|
view.getTool().mode = i - 1;
|
||||||
@@ -681,11 +684,11 @@ public class MapEditorDialog extends Dialog implements Disposable{
|
|||||||
});
|
});
|
||||||
|
|
||||||
for(Block block : blocksOut){
|
for(Block block : blocksOut){
|
||||||
TextureRegion region = block.icon(Icon.medium);
|
TextureRegion region = block.icon(Block.Icon.medium);
|
||||||
|
|
||||||
if(!Core.atlas.isFound(region)) continue;
|
if(!Core.atlas.isFound(region)) continue;
|
||||||
|
|
||||||
ImageButton button = new ImageButton("whiteui", "clear-toggle");
|
ImageButton button = new ImageButton(Tex.whiteui, Styles.clearTogglei);
|
||||||
button.getStyle().imageUp = new TextureRegionDrawable(region);
|
button.getStyle().imageUp = new TextureRegionDrawable(region);
|
||||||
button.clicked(() -> editor.drawBlock = block);
|
button.clicked(() -> editor.drawBlock = block);
|
||||||
button.resizeImage(8 * 4f);
|
button.resizeImage(8 * 4f);
|
||||||
@@ -700,7 +703,7 @@ public class MapEditorDialog extends Dialog implements Disposable{
|
|||||||
|
|
||||||
group.getButtons().get(2).setChecked(true);
|
group.getButtons().get(2).setChecked(true);
|
||||||
|
|
||||||
table.table("underline", extra -> extra.labelWrap(() -> editor.drawBlock.localizedName).width(200f).center()).growX();
|
table.table(Tex.underline, extra -> extra.labelWrap(() -> editor.drawBlock.localizedName).width(200f).center()).growX();
|
||||||
table.row();
|
table.row();
|
||||||
table.add(pane).growY().fillX();
|
table.add(pane).growY().fillX();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -8,10 +8,12 @@ import io.anuke.arc.graphics.Pixmap.*;
|
|||||||
import io.anuke.arc.math.*;
|
import io.anuke.arc.math.*;
|
||||||
import io.anuke.arc.math.geom.*;
|
import io.anuke.arc.math.geom.*;
|
||||||
import io.anuke.arc.scene.ui.*;
|
import io.anuke.arc.scene.ui.*;
|
||||||
|
import io.anuke.arc.scene.ui.ImageButton.*;
|
||||||
import io.anuke.arc.scene.ui.layout.*;
|
import io.anuke.arc.scene.ui.layout.*;
|
||||||
import io.anuke.arc.util.*;
|
import io.anuke.arc.util.*;
|
||||||
import io.anuke.arc.util.async.*;
|
import io.anuke.arc.util.async.*;
|
||||||
import io.anuke.mindustry.game.*;
|
import io.anuke.mindustry.game.*;
|
||||||
|
import io.anuke.mindustry.gen.*;
|
||||||
import io.anuke.mindustry.graphics.*;
|
import io.anuke.mindustry.graphics.*;
|
||||||
import io.anuke.mindustry.io.*;
|
import io.anuke.mindustry.io.*;
|
||||||
import io.anuke.mindustry.maps.filters.*;
|
import io.anuke.mindustry.maps.filters.*;
|
||||||
@@ -84,7 +86,7 @@ public class MapGenerateDialog extends FloatingDialog{
|
|||||||
update();
|
update();
|
||||||
}).size(160f, 64f);
|
}).size(160f, 64f);
|
||||||
|
|
||||||
buttons.addImageTextButton("$add", "icon-add", iconsize, this::showAdd).height(64f).width(140f);
|
buttons.addImageTextButton("$add", Icon.add, this::showAdd).height(64f).width(140f);
|
||||||
|
|
||||||
if(!applied){
|
if(!applied){
|
||||||
hidden(this::apply);
|
hidden(this::apply);
|
||||||
@@ -176,10 +178,8 @@ public class MapGenerateDialog extends FloatingDialog{
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}, new Stack(){{
|
}, new Stack(){{
|
||||||
add(new Image("loadDim"));
|
add(new Image(Styles.black8));
|
||||||
add(new Image("icon-refresh"){{
|
add(new Image(Icon.refresh, Scaling.none));
|
||||||
setScaling(Scaling.none);
|
|
||||||
}});
|
|
||||||
visible(() -> generating && !updateEditorOnChange);
|
visible(() -> generating && !updateEditorOnChange);
|
||||||
}}).grow().padRight(10);
|
}}).grow().padRight(10);
|
||||||
t.pane(p -> filterTable = p.marginRight(6)).update(pane -> {
|
t.pane(p -> filterTable = p.marginRight(6)).update(pane -> {
|
||||||
@@ -216,7 +216,7 @@ public class MapGenerateDialog extends FloatingDialog{
|
|||||||
}
|
}
|
||||||
|
|
||||||
void rebuildFilters(){
|
void rebuildFilters(){
|
||||||
int cols = Math.max((int)(Math.max(filterTable.getParent().getWidth(), Core.graphics.getWidth()/2f * 0.9f) / UnitScl.dp.scl(290f)), 1);
|
int cols = Math.max((int)(Math.max(filterTable.getParent().getWidth(), Core.graphics.getWidth()/2f * 0.9f) / Scl.scl(290f)), 1);
|
||||||
filterTable.clearChildren();
|
filterTable.clearChildren();
|
||||||
filterTable.top().left();
|
filterTable.top().left();
|
||||||
int i = 0;
|
int i = 0;
|
||||||
@@ -224,7 +224,7 @@ public class MapGenerateDialog extends FloatingDialog{
|
|||||||
for(GenerateFilter filter : filters){
|
for(GenerateFilter filter : filters){
|
||||||
|
|
||||||
//main container
|
//main container
|
||||||
filterTable.table("button", c -> {
|
filterTable.table(Tex.button, c -> {
|
||||||
//icons to perform actions
|
//icons to perform actions
|
||||||
c.table(t -> {
|
c.table(t -> {
|
||||||
t.top();
|
t.top();
|
||||||
@@ -233,26 +233,26 @@ public class MapGenerateDialog extends FloatingDialog{
|
|||||||
t.row();
|
t.row();
|
||||||
|
|
||||||
t.table(b -> {
|
t.table(b -> {
|
||||||
String style = "clear";
|
ImageButtonStyle style = Styles.cleari;
|
||||||
b.defaults().size(50f);
|
b.defaults().size(50f);
|
||||||
b.addImageButton("icon-refresh-small", style, iconsizesmall, () -> {
|
b.addImageButton(Icon.refreshSmall, style, () -> {
|
||||||
filter.randomize();
|
filter.randomize();
|
||||||
update();
|
update();
|
||||||
});
|
});
|
||||||
|
|
||||||
b.addImageButton("icon-arrow-up-small", style, iconsizesmall, () -> {
|
b.addImageButton(Icon.arrowUpSmall, style, () -> {
|
||||||
int idx = filters.indexOf(filter);
|
int idx = filters.indexOf(filter);
|
||||||
filters.swap(idx, Math.max(0, idx - 1));
|
filters.swap(idx, Math.max(0, idx - 1));
|
||||||
rebuildFilters();
|
rebuildFilters();
|
||||||
update();
|
update();
|
||||||
});
|
});
|
||||||
b.addImageButton("icon-arrow-down-small",style, iconsizesmall, () -> {
|
b.addImageButton(Icon.arrowDownSmall, style, () -> {
|
||||||
int idx = filters.indexOf(filter);
|
int idx = filters.indexOf(filter);
|
||||||
filters.swap(idx, Math.min(filters.size - 1, idx + 1));
|
filters.swap(idx, Math.min(filters.size - 1, idx + 1));
|
||||||
rebuildFilters();
|
rebuildFilters();
|
||||||
update();
|
update();
|
||||||
});
|
});
|
||||||
b.addImageButton("icon-trash-small", style, iconsizesmall, () -> {
|
b.addImageButton(Icon.trashSmall, style, () -> {
|
||||||
filters.remove(filter);
|
filters.remove(filter);
|
||||||
rebuildFilters();
|
rebuildFilters();
|
||||||
update();
|
update();
|
||||||
|
|||||||
@@ -6,6 +6,7 @@ import io.anuke.arc.scene.ui.*;
|
|||||||
import io.anuke.mindustry.*;
|
import io.anuke.mindustry.*;
|
||||||
import io.anuke.mindustry.game.*;
|
import io.anuke.mindustry.game.*;
|
||||||
import io.anuke.mindustry.io.*;
|
import io.anuke.mindustry.io.*;
|
||||||
|
import io.anuke.mindustry.ui.*;
|
||||||
import io.anuke.mindustry.ui.dialogs.*;
|
import io.anuke.mindustry.ui.dialogs.*;
|
||||||
|
|
||||||
public class MapInfoDialog extends FloatingDialog{
|
public class MapInfoDialog extends FloatingDialog{
|
||||||
@@ -42,7 +43,7 @@ public class MapInfoDialog extends FloatingDialog{
|
|||||||
t.row();
|
t.row();
|
||||||
t.add("$editor.description").padRight(8).left();
|
t.add("$editor.description").padRight(8).left();
|
||||||
|
|
||||||
TextArea description = t.addArea(tags.get("description", ""), "textarea", text -> {
|
TextArea description = t.addArea(tags.get("description", ""), Styles.areaField, text -> {
|
||||||
tags.put("description", text);
|
tags.put("description", text);
|
||||||
}).size(400f, 140f).get();
|
}).size(400f, 140f).get();
|
||||||
|
|
||||||
|
|||||||
@@ -48,12 +48,12 @@ public class MapLoadDialog extends FloatingDialog{
|
|||||||
table.defaults().size(200f, 90f).pad(4f);
|
table.defaults().size(200f, 90f).pad(4f);
|
||||||
table.margin(10f);
|
table.margin(10f);
|
||||||
|
|
||||||
ScrollPane pane = new ScrollPane(table, "horizontal");
|
ScrollPane pane = new ScrollPane(table, Styles.horizontalPane);
|
||||||
pane.setFadeScrollBars(false);
|
pane.setFadeScrollBars(false);
|
||||||
|
|
||||||
for(Map map : maps.all()){
|
for(Map map : maps.all()){
|
||||||
|
|
||||||
TextButton button = new TextButton(map.name(), "toggle");
|
TextButton button = new TextButton(map.name(), Styles.togglet);
|
||||||
button.add(new BorderImage(map.texture, 2f).setScaling(Scaling.fit)).size(16 * 4f);
|
button.add(new BorderImage(map.texture, 2f).setScaling(Scaling.fit)).size(16 * 4f);
|
||||||
button.getCells().reverse();
|
button.getCells().reverse();
|
||||||
button.clicked(() -> selected = map);
|
button.clicked(() -> selected = map);
|
||||||
|
|||||||
@@ -155,7 +155,7 @@ public class MapRenderer implements Disposable{
|
|||||||
}
|
}
|
||||||
|
|
||||||
mesh.draw(idxDecal, region, wx * tilesize + offsetX, wy * tilesize + offsetY, width, height);
|
mesh.draw(idxDecal, region, wx * tilesize + offsetX, wy * tilesize + offsetY, width, height);
|
||||||
mesh.setColor(Color.WHITE);
|
mesh.setColor(Color.white);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|||||||
@@ -1,9 +1,10 @@
|
|||||||
package io.anuke.mindustry.editor;
|
package io.anuke.mindustry.editor;
|
||||||
|
|
||||||
import io.anuke.arc.function.IntPositionConsumer;
|
import io.anuke.arc.function.*;
|
||||||
import io.anuke.arc.math.Mathf;
|
import io.anuke.arc.math.*;
|
||||||
import io.anuke.arc.scene.ui.layout.Table;
|
import io.anuke.arc.scene.ui.layout.*;
|
||||||
import io.anuke.mindustry.ui.dialogs.FloatingDialog;
|
import io.anuke.mindustry.gen.*;
|
||||||
|
import io.anuke.mindustry.ui.dialogs.*;
|
||||||
|
|
||||||
public class MapResizeDialog extends FloatingDialog{
|
public class MapResizeDialog extends FloatingDialog{
|
||||||
private static final int minSize = 50, maxSize = 500, increment = 50;
|
private static final int minSize = 50, maxSize = 500, increment = 50;
|
||||||
@@ -28,7 +29,7 @@ public class MapResizeDialog extends FloatingDialog{
|
|||||||
height = move(height, -1);
|
height = move(height, -1);
|
||||||
}).size(60f);
|
}).size(60f);
|
||||||
|
|
||||||
table.table("button", t -> t.label(() -> (w ? width : height) + "")).width(200);
|
table.table(Tex.button, t -> t.label(() -> (w ? width : height) + "")).width(200);
|
||||||
|
|
||||||
table.addButton(">", () -> {
|
table.addButton(">", () -> {
|
||||||
if(w)
|
if(w)
|
||||||
|
|||||||
@@ -55,7 +55,7 @@ public class MapSaveDialog extends FloatingDialog{
|
|||||||
if(!invalid()){
|
if(!invalid()){
|
||||||
listener.accept(field.getText());
|
listener.accept(field.getText());
|
||||||
}else{
|
}else{
|
||||||
ui.showError("$editor.failoverwrite");
|
ui.showErrorMessage("$editor.failoverwrite");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -11,7 +11,7 @@ import io.anuke.arc.math.geom.*;
|
|||||||
import io.anuke.arc.scene.Element;
|
import io.anuke.arc.scene.Element;
|
||||||
import io.anuke.arc.scene.event.*;
|
import io.anuke.arc.scene.event.*;
|
||||||
import io.anuke.arc.scene.ui.TextField;
|
import io.anuke.arc.scene.ui.TextField;
|
||||||
import io.anuke.arc.scene.ui.layout.UnitScl;
|
import io.anuke.arc.scene.ui.layout.Scl;
|
||||||
import io.anuke.arc.util.*;
|
import io.anuke.arc.util.*;
|
||||||
import io.anuke.mindustry.graphics.Pal;
|
import io.anuke.mindustry.graphics.Pal;
|
||||||
import io.anuke.mindustry.input.Binding;
|
import io.anuke.mindustry.input.Binding;
|
||||||
@@ -241,7 +241,7 @@ public class MapView extends Element implements GestureListener{
|
|||||||
Draw.reset();
|
Draw.reset();
|
||||||
|
|
||||||
if(grid){
|
if(grid){
|
||||||
Draw.color(Color.GRAY);
|
Draw.color(Color.gray);
|
||||||
image.setBounds(centerx - sclwidth / 2, centery - sclheight / 2, sclwidth, sclheight);
|
image.setBounds(centerx - sclwidth / 2, centery - sclheight / 2, sclwidth, sclheight);
|
||||||
image.draw();
|
image.draw();
|
||||||
Draw.color();
|
Draw.color();
|
||||||
@@ -258,7 +258,7 @@ public class MapView extends Element implements GestureListener{
|
|||||||
float scaling = zoom * Math.min(width, height) / editor.width();
|
float scaling = zoom * Math.min(width, height) / editor.width();
|
||||||
|
|
||||||
Draw.color(Pal.accent);
|
Draw.color(Pal.accent);
|
||||||
Lines.stroke(UnitScl.dp.scl(2f));
|
Lines.stroke(Scl.scl(2f));
|
||||||
|
|
||||||
if((!editor.drawBlock.isMultiblock() || tool == EditorTool.eraser) && tool != EditorTool.fill){
|
if((!editor.drawBlock.isMultiblock() || tool == EditorTool.eraser) && tool != EditorTool.fill){
|
||||||
if(tool == EditorTool.line && drawing){
|
if(tool == EditorTool.line && drawing){
|
||||||
@@ -294,7 +294,7 @@ public class MapView extends Element implements GestureListener{
|
|||||||
}
|
}
|
||||||
|
|
||||||
Draw.color(Pal.accent);
|
Draw.color(Pal.accent);
|
||||||
Lines.stroke(UnitScl.dp.scl(3f));
|
Lines.stroke(Scl.scl(3f));
|
||||||
Lines.rect(x, y, width, height);
|
Lines.rect(x, y, width, height);
|
||||||
Draw.reset();
|
Draw.reset();
|
||||||
|
|
||||||
@@ -320,7 +320,7 @@ public class MapView extends Element implements GestureListener{
|
|||||||
public boolean zoom(float initialDistance, float distance){
|
public boolean zoom(float initialDistance, float distance){
|
||||||
if(!active()) return false;
|
if(!active()) return false;
|
||||||
float nzoom = distance - initialDistance;
|
float nzoom = distance - initialDistance;
|
||||||
zoom += nzoom / 10000f / UnitScl.dp.scl(1f) * zoom;
|
zoom += nzoom / 10000f / Scl.scl(1f) * zoom;
|
||||||
clampZoom();
|
clampZoom();
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,22 +1,23 @@
|
|||||||
package io.anuke.mindustry.editor;
|
package io.anuke.mindustry.editor;
|
||||||
|
|
||||||
import io.anuke.arc.Core;
|
import io.anuke.arc.*;
|
||||||
import io.anuke.arc.collection.Array;
|
import io.anuke.arc.collection.*;
|
||||||
import io.anuke.arc.graphics.Color;
|
import io.anuke.arc.graphics.*;
|
||||||
import io.anuke.arc.input.KeyCode;
|
import io.anuke.arc.input.*;
|
||||||
import io.anuke.arc.math.Mathf;
|
import io.anuke.arc.math.*;
|
||||||
import io.anuke.arc.scene.event.Touchable;
|
import io.anuke.arc.scene.event.*;
|
||||||
import io.anuke.arc.scene.ui.Label;
|
import io.anuke.arc.scene.ui.*;
|
||||||
import io.anuke.arc.scene.ui.TextField.TextFieldFilter;
|
import io.anuke.arc.scene.ui.TextField.*;
|
||||||
import io.anuke.arc.scene.ui.layout.Table;
|
import io.anuke.arc.scene.ui.layout.*;
|
||||||
import io.anuke.arc.util.*;
|
import io.anuke.arc.util.*;
|
||||||
import io.anuke.mindustry.Vars;
|
import io.anuke.mindustry.*;
|
||||||
import io.anuke.mindustry.content.*;
|
import io.anuke.mindustry.content.*;
|
||||||
import io.anuke.mindustry.game.*;
|
import io.anuke.mindustry.game.*;
|
||||||
import io.anuke.mindustry.graphics.Pal;
|
import io.anuke.mindustry.gen.*;
|
||||||
import io.anuke.mindustry.io.JsonIO;
|
import io.anuke.mindustry.graphics.*;
|
||||||
|
import io.anuke.mindustry.io.*;
|
||||||
import io.anuke.mindustry.type.*;
|
import io.anuke.mindustry.type.*;
|
||||||
import io.anuke.mindustry.ui.dialogs.FloatingDialog;
|
import io.anuke.mindustry.ui.dialogs.*;
|
||||||
|
|
||||||
import static io.anuke.mindustry.Vars.*;
|
import static io.anuke.mindustry.Vars.*;
|
||||||
import static io.anuke.mindustry.game.SpawnGroup.never;
|
import static io.anuke.mindustry.game.SpawnGroup.never;
|
||||||
@@ -61,7 +62,8 @@ public class WaveInfoDialog extends FloatingDialog{
|
|||||||
groups = maps.readWaves(Core.app.getClipboardText());
|
groups = maps.readWaves(Core.app.getClipboardText());
|
||||||
buildGroups();
|
buildGroups();
|
||||||
}catch(Exception e){
|
}catch(Exception e){
|
||||||
ui.showError("$waves.invalid");
|
e.printStackTrace();
|
||||||
|
ui.showErrorMessage("$waves.invalid");
|
||||||
}
|
}
|
||||||
dialog.hide();
|
dialog.hide();
|
||||||
}).disabled(b -> Core.app.getClipboardText() == null || Core.app.getClipboardText().isEmpty());
|
}).disabled(b -> Core.app.getClipboardText() == null || Core.app.getClipboardText().isEmpty());
|
||||||
@@ -79,7 +81,7 @@ public class WaveInfoDialog extends FloatingDialog{
|
|||||||
groups = JsonIO.copy(state.rules.spawns.isEmpty() ? defaultWaves.get() : state.rules.spawns);
|
groups = JsonIO.copy(state.rules.spawns.isEmpty() ? defaultWaves.get() : state.rules.spawns);
|
||||||
|
|
||||||
cont.clear();
|
cont.clear();
|
||||||
cont.stack(new Table("clear", main -> {
|
cont.stack(new Table(Tex.clear, main -> {
|
||||||
main.pane(t -> table = t).growX().growY().padRight(8f).get().setScrollingDisabled(true, false);
|
main.pane(t -> table = t).growX().growY().padRight(8f).get().setScrollingDisabled(true, false);
|
||||||
main.row();
|
main.row();
|
||||||
main.addButton("$add", () -> {
|
main.addButton("$add", () -> {
|
||||||
@@ -94,8 +96,8 @@ public class WaveInfoDialog extends FloatingDialog{
|
|||||||
setAlignment(Align.center, Align.center);
|
setAlignment(Align.center, Align.center);
|
||||||
}}).width(390f).growY();
|
}}).width(390f).growY();
|
||||||
|
|
||||||
cont.table("clear", m -> {
|
cont.table(Tex.clear, m -> {
|
||||||
m.add("$waves.preview").color(Color.LIGHT_GRAY).growX().center().get().setAlignment(Align.center, Align.center);
|
m.add("$waves.preview").color(Color.lightGray).growX().center().get().setAlignment(Align.center, Align.center);
|
||||||
m.row();
|
m.row();
|
||||||
m.addButton("-", () -> {
|
m.addButton("-", () -> {
|
||||||
}).update(t -> {
|
}).update(t -> {
|
||||||
@@ -134,7 +136,7 @@ public class WaveInfoDialog extends FloatingDialog{
|
|||||||
|
|
||||||
if(groups != null){
|
if(groups != null){
|
||||||
for(SpawnGroup group : groups){
|
for(SpawnGroup group : groups){
|
||||||
table.table("button", t -> {
|
table.table(Tex.button, t -> {
|
||||||
t.margin(0).defaults().pad(3).padLeft(5f).growX().left();
|
t.margin(0).defaults().pad(3).padLeft(5f).growX().left();
|
||||||
t.addButton(b -> {
|
t.addButton(b -> {
|
||||||
b.left();
|
b.left();
|
||||||
@@ -238,7 +240,7 @@ public class WaveInfoDialog extends FloatingDialog{
|
|||||||
|
|
||||||
for(int i = start; i < displayed + start; i++){
|
for(int i = start; i < displayed + start; i++){
|
||||||
int wave = i;
|
int wave = i;
|
||||||
preview.table("underline", table -> {
|
preview.table(Tex.underline, table -> {
|
||||||
table.add((wave + 1) + "").color(Pal.accent).center().colspan(2).get().setAlignment(Align.center, Align.center);
|
table.add((wave + 1) + "").color(Pal.accent).center().colspan(2).get().setAlignment(Align.center, Align.center);
|
||||||
table.row();
|
table.row();
|
||||||
|
|
||||||
@@ -252,7 +254,7 @@ public class WaveInfoDialog extends FloatingDialog{
|
|||||||
if(spawned[j] > 0){
|
if(spawned[j] > 0){
|
||||||
UnitType type = content.getByID(ContentType.unit, j);
|
UnitType type = content.getByID(ContentType.unit, j);
|
||||||
table.addImage(type.iconRegion).size(30f).padRight(4);
|
table.addImage(type.iconRegion).size(30f).padRight(4);
|
||||||
table.add(spawned[j] + "x").color(Color.LIGHT_GRAY).padRight(6);
|
table.add(spawned[j] + "x").color(Color.lightGray).padRight(6);
|
||||||
table.row();
|
table.row();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,20 +1,22 @@
|
|||||||
package io.anuke.mindustry.entities;
|
package io.anuke.mindustry.entities;
|
||||||
|
|
||||||
import io.anuke.annotations.Annotations.Struct;
|
import io.anuke.annotations.Annotations.Struct;
|
||||||
|
import io.anuke.arc.*;
|
||||||
import io.anuke.arc.collection.GridBits;
|
import io.anuke.arc.collection.GridBits;
|
||||||
import io.anuke.arc.collection.IntQueue;
|
import io.anuke.arc.collection.IntQueue;
|
||||||
import io.anuke.arc.function.*;
|
import io.anuke.arc.function.*;
|
||||||
import io.anuke.arc.graphics.Color;
|
import io.anuke.arc.graphics.Color;
|
||||||
import io.anuke.arc.math.Mathf;
|
import io.anuke.arc.math.Mathf;
|
||||||
import io.anuke.arc.math.geom.*;
|
import io.anuke.arc.math.geom.*;
|
||||||
import io.anuke.arc.util.Time;
|
import io.anuke.arc.util.*;
|
||||||
import io.anuke.mindustry.content.Bullets;
|
import io.anuke.mindustry.content.Bullets;
|
||||||
import io.anuke.mindustry.content.Fx;
|
import io.anuke.mindustry.content.Fx;
|
||||||
import io.anuke.mindustry.entities.Effects.Effect;
|
import io.anuke.mindustry.entities.Effects.Effect;
|
||||||
import io.anuke.mindustry.entities.bullet.Bullet;
|
import io.anuke.mindustry.entities.type.Bullet;
|
||||||
import io.anuke.mindustry.entities.effect.Fire;
|
import io.anuke.mindustry.entities.effect.Fire;
|
||||||
import io.anuke.mindustry.entities.effect.Lightning;
|
import io.anuke.mindustry.entities.effect.Lightning;
|
||||||
import io.anuke.mindustry.entities.type.Unit;
|
import io.anuke.mindustry.entities.type.Unit;
|
||||||
|
import io.anuke.mindustry.game.EventType.*;
|
||||||
import io.anuke.mindustry.game.Team;
|
import io.anuke.mindustry.game.Team;
|
||||||
import io.anuke.mindustry.gen.Call;
|
import io.anuke.mindustry.gen.Call;
|
||||||
import io.anuke.mindustry.gen.PropCell;
|
import io.anuke.mindustry.gen.PropCell;
|
||||||
@@ -187,6 +189,10 @@ public class Damage{
|
|||||||
//TODO better velocity displacement
|
//TODO better velocity displacement
|
||||||
float dst = tr.set(entity.x - x, entity.y - y).len();
|
float dst = tr.set(entity.x - x, entity.y - y).len();
|
||||||
entity.velocity().add(tr.setLength((1f - dst / radius) * 2f / entity.mass()));
|
entity.velocity().add(tr.setLength((1f - dst / radius) * 2f / entity.mass()));
|
||||||
|
|
||||||
|
if(complete && damage >= 9999999f && entity == player){
|
||||||
|
Events.fire(Trigger.exclusionDeath);
|
||||||
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
rect.setSize(radius * 2).setCenter(x, y);
|
rect.setSize(radius * 2).setCenter(x, y);
|
||||||
|
|||||||
@@ -7,7 +7,7 @@ import io.anuke.arc.graphics.Color;
|
|||||||
import io.anuke.arc.math.Mathf;
|
import io.anuke.arc.math.Mathf;
|
||||||
import io.anuke.arc.math.geom.Position;
|
import io.anuke.arc.math.geom.Position;
|
||||||
import io.anuke.arc.util.pooling.Pools;
|
import io.anuke.arc.util.pooling.Pools;
|
||||||
import io.anuke.mindustry.entities.impl.EffectEntity;
|
import io.anuke.mindustry.entities.type.EffectEntity;
|
||||||
import io.anuke.mindustry.entities.traits.ScaleTrait;
|
import io.anuke.mindustry.entities.traits.ScaleTrait;
|
||||||
|
|
||||||
public class Effects{
|
public class Effects{
|
||||||
@@ -49,7 +49,7 @@ public class Effects{
|
|||||||
}
|
}
|
||||||
|
|
||||||
public static void effect(Effect effect, float x, float y, float rotation){
|
public static void effect(Effect effect, float x, float y, float rotation){
|
||||||
provider.createEffect(effect, Color.WHITE, x, y, rotation, null);
|
provider.createEffect(effect, Color.white, x, y, rotation, null);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void effect(Effect effect, float x, float y){
|
public static void effect(Effect effect, float x, float y){
|
||||||
@@ -61,7 +61,7 @@ public class Effects{
|
|||||||
}
|
}
|
||||||
|
|
||||||
public static void effect(Effect effect, Position loc){
|
public static void effect(Effect effect, Position loc){
|
||||||
provider.createEffect(effect, Color.WHITE, loc.getX(), loc.getY(), 0f, null);
|
provider.createEffect(effect, Color.white, loc.getX(), loc.getY(), 0f, null);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void effect(Effect effect, Color color, float x, float y, float rotation){
|
public static void effect(Effect effect, Color color, float x, float y, float rotation){
|
||||||
@@ -73,7 +73,7 @@ public class Effects{
|
|||||||
}
|
}
|
||||||
|
|
||||||
public static void effect(Effect effect, float x, float y, float rotation, Object data){
|
public static void effect(Effect effect, float x, float y, float rotation, Object data){
|
||||||
provider.createEffect(effect, Color.WHITE, x, y, rotation, data);
|
provider.createEffect(effect, Color.white, x, y, rotation, data);
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Default value is 1000. Higher numbers mean more powerful shake (less falloff). */
|
/** Default value is 1000. Higher numbers mean more powerful shake (less falloff). */
|
||||||
|
|||||||
@@ -18,6 +18,8 @@ public class EntityGroup<T extends Entity>{
|
|||||||
private final Array<T> entityArray = new Array<>(false, 32);
|
private final Array<T> entityArray = new Array<>(false, 32);
|
||||||
private final Array<T> entitiesToRemove = new Array<>(false, 32);
|
private final Array<T> entitiesToRemove = new Array<>(false, 32);
|
||||||
private final Array<T> entitiesToAdd = new Array<>(false, 32);
|
private final Array<T> entitiesToAdd = new Array<>(false, 32);
|
||||||
|
private final Array<T> intersectArray = new Array<>();
|
||||||
|
private final Rectangle intersectRect = new Rectangle();
|
||||||
private IntMap<T> map;
|
private IntMap<T> map;
|
||||||
private QuadTree tree;
|
private QuadTree tree;
|
||||||
private Consumer<T> removeListener;
|
private Consumer<T> removeListener;
|
||||||
@@ -161,6 +163,15 @@ public class EntityGroup<T extends Entity>{
|
|||||||
tree().getIntersect(out, x, y, width, height);
|
tree().getIntersect(out, x, y, width, height);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@SuppressWarnings("unchecked")
|
||||||
|
public Array<T> intersect(float x, float y, float width, float height){
|
||||||
|
intersectArray.clear();
|
||||||
|
//don't waste time for empty groups
|
||||||
|
if(isEmpty()) return intersectArray;
|
||||||
|
tree().getIntersect(intersectArray, intersectRect.set(x, y, width, height));
|
||||||
|
return intersectArray;
|
||||||
|
}
|
||||||
|
|
||||||
public QuadTree tree(){
|
public QuadTree tree(){
|
||||||
if(!useTree) throw new RuntimeException("This group does not support quadtrees! Enable quadtrees when creating it.");
|
if(!useTree) throw new RuntimeException("This group does not support quadtrees! Enable quadtrees when creating it.");
|
||||||
return tree;
|
return tree;
|
||||||
|
|||||||
@@ -4,6 +4,7 @@ import io.anuke.arc.graphics.g2d.*;
|
|||||||
import io.anuke.mindustry.content.*;
|
import io.anuke.mindustry.content.*;
|
||||||
import io.anuke.mindustry.entities.*;
|
import io.anuke.mindustry.entities.*;
|
||||||
import io.anuke.mindustry.entities.Effects.*;
|
import io.anuke.mindustry.entities.Effects.*;
|
||||||
|
import io.anuke.mindustry.entities.type.Bullet;
|
||||||
import io.anuke.mindustry.gen.*;
|
import io.anuke.mindustry.gen.*;
|
||||||
|
|
||||||
//TODO scale velocity depending on fslope()
|
//TODO scale velocity depending on fslope()
|
||||||
@@ -20,7 +21,7 @@ public class ArtilleryBulletType extends BasicBulletType{
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void update(Bullet b){
|
public void update(io.anuke.mindustry.entities.type.Bullet b){
|
||||||
super.update(b);
|
super.update(b);
|
||||||
|
|
||||||
if(b.timer.get(0, 3 + b.fslope() * 2f)){
|
if(b.timer.get(0, 3 + b.fslope() * 2f)){
|
||||||
|
|||||||
@@ -4,6 +4,7 @@ import io.anuke.arc.Core;
|
|||||||
import io.anuke.arc.graphics.Color;
|
import io.anuke.arc.graphics.Color;
|
||||||
import io.anuke.arc.graphics.g2d.Draw;
|
import io.anuke.arc.graphics.g2d.Draw;
|
||||||
import io.anuke.arc.graphics.g2d.TextureRegion;
|
import io.anuke.arc.graphics.g2d.TextureRegion;
|
||||||
|
import io.anuke.mindustry.entities.type.Bullet;
|
||||||
import io.anuke.mindustry.graphics.Pal;
|
import io.anuke.mindustry.graphics.Pal;
|
||||||
|
|
||||||
/** An extended BulletType for most ammo-based bullets shot from turrets and units. */
|
/** An extended BulletType for most ammo-based bullets shot from turrets and units. */
|
||||||
|
|||||||
@@ -7,6 +7,7 @@ import io.anuke.mindustry.entities.*;
|
|||||||
import io.anuke.mindustry.entities.Effects.*;
|
import io.anuke.mindustry.entities.Effects.*;
|
||||||
import io.anuke.mindustry.entities.effect.*;
|
import io.anuke.mindustry.entities.effect.*;
|
||||||
import io.anuke.mindustry.entities.traits.*;
|
import io.anuke.mindustry.entities.traits.*;
|
||||||
|
import io.anuke.mindustry.entities.type.*;
|
||||||
import io.anuke.mindustry.game.*;
|
import io.anuke.mindustry.game.*;
|
||||||
import io.anuke.mindustry.gen.*;
|
import io.anuke.mindustry.gen.*;
|
||||||
import io.anuke.mindustry.graphics.*;
|
import io.anuke.mindustry.graphics.*;
|
||||||
|
|||||||
@@ -4,6 +4,7 @@ import io.anuke.arc.math.geom.Rectangle;
|
|||||||
import io.anuke.arc.util.Time;
|
import io.anuke.arc.util.Time;
|
||||||
import io.anuke.mindustry.content.Fx;
|
import io.anuke.mindustry.content.Fx;
|
||||||
import io.anuke.mindustry.entities.Units;
|
import io.anuke.mindustry.entities.Units;
|
||||||
|
import io.anuke.mindustry.entities.type.Bullet;
|
||||||
|
|
||||||
public abstract class FlakBulletType extends BasicBulletType{
|
public abstract class FlakBulletType extends BasicBulletType{
|
||||||
protected static Rectangle rect = new Rectangle();
|
protected static Rectangle rect = new Rectangle();
|
||||||
|
|||||||
@@ -6,6 +6,7 @@ import io.anuke.arc.math.geom.*;
|
|||||||
import io.anuke.mindustry.content.*;
|
import io.anuke.mindustry.content.*;
|
||||||
import io.anuke.mindustry.entities.*;
|
import io.anuke.mindustry.entities.*;
|
||||||
import io.anuke.mindustry.entities.effect.*;
|
import io.anuke.mindustry.entities.effect.*;
|
||||||
|
import io.anuke.mindustry.entities.type.Bullet;
|
||||||
import io.anuke.mindustry.type.*;
|
import io.anuke.mindustry.type.*;
|
||||||
import io.anuke.mindustry.world.*;
|
import io.anuke.mindustry.world.*;
|
||||||
|
|
||||||
@@ -35,7 +36,7 @@ public class LiquidBulletType extends BulletType{
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void update(Bullet b){
|
public void update(io.anuke.mindustry.entities.type.Bullet b){
|
||||||
super.update(b);
|
super.update(b);
|
||||||
|
|
||||||
if(liquid.canExtinguish()){
|
if(liquid.canExtinguish()){
|
||||||
@@ -49,8 +50,8 @@ public class LiquidBulletType extends BulletType{
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void draw(Bullet b){
|
public void draw(io.anuke.mindustry.entities.type.Bullet b){
|
||||||
Draw.color(liquid.color, Color.WHITE, b.fout() / 100f);
|
Draw.color(liquid.color, Color.white, b.fout() / 100f);
|
||||||
|
|
||||||
Fill.circle(b.x, b.y, 0.5f + b.fout() * 2.5f);
|
Fill.circle(b.x, b.y, 0.5f + b.fout() * 2.5f);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -6,6 +6,7 @@ import io.anuke.arc.math.Angles;
|
|||||||
import io.anuke.arc.math.Mathf;
|
import io.anuke.arc.math.Mathf;
|
||||||
import io.anuke.mindustry.content.Fx;
|
import io.anuke.mindustry.content.Fx;
|
||||||
import io.anuke.mindustry.entities.Effects;
|
import io.anuke.mindustry.entities.Effects;
|
||||||
|
import io.anuke.mindustry.entities.type.Bullet;
|
||||||
import io.anuke.mindustry.graphics.Pal;
|
import io.anuke.mindustry.graphics.Pal;
|
||||||
import io.anuke.mindustry.world.blocks.distribution.MassDriver.DriverBulletData;
|
import io.anuke.mindustry.world.blocks.distribution.MassDriver.DriverBulletData;
|
||||||
|
|
||||||
@@ -23,7 +24,7 @@ public class MassDriverBolt extends BulletType{
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void draw(Bullet b){
|
public void draw(io.anuke.mindustry.entities.type.Bullet b){
|
||||||
float w = 11f, h = 13f;
|
float w = 11f, h = 13f;
|
||||||
|
|
||||||
Draw.color(Pal.bulletYellowBack);
|
Draw.color(Pal.bulletYellowBack);
|
||||||
@@ -36,7 +37,7 @@ public class MassDriverBolt extends BulletType{
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void update(Bullet b){
|
public void update(io.anuke.mindustry.entities.type.Bullet b){
|
||||||
//data MUST be an instance of DriverBulletData
|
//data MUST be an instance of DriverBulletData
|
||||||
if(!(b.getData() instanceof DriverBulletData)){
|
if(!(b.getData() instanceof DriverBulletData)){
|
||||||
hit(b);
|
hit(b);
|
||||||
@@ -82,7 +83,7 @@ public class MassDriverBolt extends BulletType{
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void despawned(Bullet b){
|
public void despawned(io.anuke.mindustry.entities.type.Bullet b){
|
||||||
super.despawned(b);
|
super.despawned(b);
|
||||||
|
|
||||||
if(!(b.getData() instanceof DriverBulletData)) return;
|
if(!(b.getData() instanceof DriverBulletData)) return;
|
||||||
@@ -93,7 +94,7 @@ public class MassDriverBolt extends BulletType{
|
|||||||
int amountDropped = Mathf.random(0, data.items[i]);
|
int amountDropped = Mathf.random(0, data.items[i]);
|
||||||
if(amountDropped > 0){
|
if(amountDropped > 0){
|
||||||
float angle = b.rot() + Mathf.range(100f);
|
float angle = b.rot() + Mathf.range(100f);
|
||||||
Effects.effect(Fx.dropItem, Color.WHITE, b.x, b.y, angle, content.item(i));
|
Effects.effect(Fx.dropItem, Color.white, b.x, b.y, angle, content.item(i));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -5,6 +5,7 @@ import io.anuke.arc.math.Mathf;
|
|||||||
import io.anuke.arc.util.Time;
|
import io.anuke.arc.util.Time;
|
||||||
import io.anuke.mindustry.content.Fx;
|
import io.anuke.mindustry.content.Fx;
|
||||||
import io.anuke.mindustry.entities.Effects;
|
import io.anuke.mindustry.entities.Effects;
|
||||||
|
import io.anuke.mindustry.entities.type.Bullet;
|
||||||
import io.anuke.mindustry.gen.*;
|
import io.anuke.mindustry.gen.*;
|
||||||
import io.anuke.mindustry.graphics.Pal;
|
import io.anuke.mindustry.graphics.Pal;
|
||||||
|
|
||||||
|
|||||||
@@ -3,7 +3,7 @@ package io.anuke.mindustry.entities.effect;
|
|||||||
import io.anuke.arc.graphics.g2d.Draw;
|
import io.anuke.arc.graphics.g2d.Draw;
|
||||||
import io.anuke.arc.math.Mathf;
|
import io.anuke.arc.math.Mathf;
|
||||||
import io.anuke.mindustry.entities.EntityGroup;
|
import io.anuke.mindustry.entities.EntityGroup;
|
||||||
import io.anuke.mindustry.entities.impl.TimedEntity;
|
import io.anuke.mindustry.entities.type.TimedEntity;
|
||||||
import io.anuke.mindustry.entities.traits.BelowLiquidTrait;
|
import io.anuke.mindustry.entities.traits.BelowLiquidTrait;
|
||||||
import io.anuke.mindustry.entities.traits.DrawTrait;
|
import io.anuke.mindustry.entities.traits.DrawTrait;
|
||||||
import io.anuke.mindustry.graphics.Pal;
|
import io.anuke.mindustry.graphics.Pal;
|
||||||
|
|||||||
@@ -1,18 +1,19 @@
|
|||||||
package io.anuke.mindustry.entities.effect;
|
package io.anuke.mindustry.entities.effect;
|
||||||
|
|
||||||
import io.anuke.annotations.Annotations.*;
|
import io.anuke.annotations.Annotations.*;
|
||||||
|
import io.anuke.arc.*;
|
||||||
import io.anuke.arc.collection.*;
|
import io.anuke.arc.collection.*;
|
||||||
import io.anuke.arc.math.*;
|
import io.anuke.arc.math.*;
|
||||||
import io.anuke.arc.math.geom.*;
|
import io.anuke.arc.math.geom.*;
|
||||||
import io.anuke.arc.util.*;
|
import io.anuke.arc.util.*;
|
||||||
import io.anuke.mindustry.content.*;
|
import io.anuke.mindustry.content.*;
|
||||||
import io.anuke.mindustry.entities.*;
|
import io.anuke.mindustry.entities.*;
|
||||||
import io.anuke.mindustry.entities.impl.*;
|
|
||||||
import io.anuke.mindustry.entities.traits.*;
|
import io.anuke.mindustry.entities.traits.*;
|
||||||
import io.anuke.mindustry.entities.type.*;
|
import io.anuke.mindustry.entities.type.*;
|
||||||
|
import io.anuke.mindustry.entities.type.TimedEntity;
|
||||||
|
import io.anuke.mindustry.game.EventType.*;
|
||||||
import io.anuke.mindustry.game.*;
|
import io.anuke.mindustry.game.*;
|
||||||
import io.anuke.mindustry.gen.*;
|
import io.anuke.mindustry.gen.*;
|
||||||
import io.anuke.mindustry.net.*;
|
|
||||||
import io.anuke.mindustry.world.*;
|
import io.anuke.mindustry.world.*;
|
||||||
|
|
||||||
import java.io.*;
|
import java.io.*;
|
||||||
@@ -40,7 +41,7 @@ public class Fire extends TimedEntity implements SaveTrait, SyncTrait{
|
|||||||
|
|
||||||
/** Start a fire on the tile. If there already is a file there, refreshes its lifetime. */
|
/** Start a fire on the tile. If there already is a file there, refreshes its lifetime. */
|
||||||
public static void create(Tile tile){
|
public static void create(Tile tile){
|
||||||
if(Net.client() || tile == null) return; //not clientside.
|
if(net.client() || tile == null) return; //not clientside.
|
||||||
|
|
||||||
Fire fire = map.get(tile.pos());
|
Fire fire = map.get(tile.pos());
|
||||||
|
|
||||||
@@ -70,7 +71,11 @@ public class Fire extends TimedEntity implements SaveTrait, SyncTrait{
|
|||||||
*/
|
*/
|
||||||
public static void extinguish(Tile tile, float intensity){
|
public static void extinguish(Tile tile, float intensity){
|
||||||
if(tile != null && map.containsKey(tile.pos())){
|
if(tile != null && map.containsKey(tile.pos())){
|
||||||
map.get(tile.pos()).time += intensity * Time.delta();
|
Fire fire = map.get(tile.pos());
|
||||||
|
fire.time += intensity * Time.delta();
|
||||||
|
if(fire.time >= fire.lifetime()){
|
||||||
|
Events.fire(Trigger.fireExtinguish);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -106,7 +111,7 @@ public class Fire extends TimedEntity implements SaveTrait, SyncTrait{
|
|||||||
time = Mathf.clamp(time + Time.delta(), 0, lifetime());
|
time = Mathf.clamp(time + Time.delta(), 0, lifetime());
|
||||||
map.put(tile.pos(), this);
|
map.put(tile.pos(), this);
|
||||||
|
|
||||||
if(Net.client()){
|
if(net.client()){
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -6,7 +6,7 @@ import io.anuke.mindustry.Vars;
|
|||||||
import io.anuke.mindustry.entities.Effects;
|
import io.anuke.mindustry.entities.Effects;
|
||||||
import io.anuke.mindustry.entities.Effects.Effect;
|
import io.anuke.mindustry.entities.Effects.Effect;
|
||||||
import io.anuke.mindustry.entities.Effects.EffectRenderer;
|
import io.anuke.mindustry.entities.Effects.EffectRenderer;
|
||||||
import io.anuke.mindustry.entities.impl.EffectEntity;
|
import io.anuke.mindustry.entities.type.EffectEntity;
|
||||||
import io.anuke.mindustry.world.Tile;
|
import io.anuke.mindustry.world.Tile;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
@@ -10,14 +10,14 @@ import io.anuke.arc.math.geom.Vector2;
|
|||||||
import io.anuke.arc.util.Time;
|
import io.anuke.arc.util.Time;
|
||||||
import io.anuke.arc.util.pooling.Pools;
|
import io.anuke.arc.util.pooling.Pools;
|
||||||
import io.anuke.mindustry.entities.EntityGroup;
|
import io.anuke.mindustry.entities.EntityGroup;
|
||||||
import io.anuke.mindustry.entities.impl.TimedEntity;
|
import io.anuke.mindustry.entities.type.TimedEntity;
|
||||||
import io.anuke.mindustry.entities.traits.DrawTrait;
|
import io.anuke.mindustry.entities.traits.DrawTrait;
|
||||||
import io.anuke.mindustry.entities.type.Unit;
|
import io.anuke.mindustry.entities.type.Unit;
|
||||||
import io.anuke.mindustry.graphics.Pal;
|
import io.anuke.mindustry.graphics.Pal;
|
||||||
import io.anuke.mindustry.type.Item;
|
import io.anuke.mindustry.type.Item;
|
||||||
import io.anuke.mindustry.world.Tile;
|
import io.anuke.mindustry.world.Tile;
|
||||||
|
|
||||||
import static io.anuke.mindustry.Vars.effectGroup;
|
import static io.anuke.mindustry.Vars.*;
|
||||||
|
|
||||||
public class ItemTransfer extends TimedEntity implements DrawTrait{
|
public class ItemTransfer extends TimedEntity implements DrawTrait{
|
||||||
private Vector2 from = new Vector2();
|
private Vector2 from = new Vector2();
|
||||||
|
|||||||
@@ -12,8 +12,8 @@ import io.anuke.arc.util.pooling.Pools;
|
|||||||
import io.anuke.mindustry.content.Bullets;
|
import io.anuke.mindustry.content.Bullets;
|
||||||
import io.anuke.mindustry.entities.EntityGroup;
|
import io.anuke.mindustry.entities.EntityGroup;
|
||||||
import io.anuke.mindustry.entities.Units;
|
import io.anuke.mindustry.entities.Units;
|
||||||
import io.anuke.mindustry.entities.bullet.Bullet;
|
import io.anuke.mindustry.entities.type.Bullet;
|
||||||
import io.anuke.mindustry.entities.impl.TimedEntity;
|
import io.anuke.mindustry.entities.type.TimedEntity;
|
||||||
import io.anuke.mindustry.entities.traits.DrawTrait;
|
import io.anuke.mindustry.entities.traits.DrawTrait;
|
||||||
import io.anuke.mindustry.entities.traits.TimeTrait;
|
import io.anuke.mindustry.entities.traits.TimeTrait;
|
||||||
import io.anuke.mindustry.entities.type.Unit;
|
import io.anuke.mindustry.entities.type.Unit;
|
||||||
@@ -110,7 +110,7 @@ public class Lightning extends TimedEntity implements DrawTrait, TimeTrait{
|
|||||||
@Override
|
@Override
|
||||||
public void draw(){
|
public void draw(){
|
||||||
Lines.stroke(3f * fout());
|
Lines.stroke(3f * fout());
|
||||||
Draw.color(color, Color.WHITE, fin());
|
Draw.color(color, Color.white, fin());
|
||||||
Lines.beginLine();
|
Lines.beginLine();
|
||||||
|
|
||||||
Lines.linePoint(x, y);
|
Lines.linePoint(x, y);
|
||||||
|
|||||||
@@ -14,11 +14,10 @@ import io.anuke.arc.util.pooling.Pool.Poolable;
|
|||||||
import io.anuke.arc.util.pooling.Pools;
|
import io.anuke.arc.util.pooling.Pools;
|
||||||
import io.anuke.mindustry.content.*;
|
import io.anuke.mindustry.content.*;
|
||||||
import io.anuke.mindustry.entities.*;
|
import io.anuke.mindustry.entities.*;
|
||||||
import io.anuke.mindustry.entities.impl.SolidEntity;
|
import io.anuke.mindustry.entities.type.SolidEntity;
|
||||||
import io.anuke.mindustry.entities.traits.*;
|
import io.anuke.mindustry.entities.traits.*;
|
||||||
import io.anuke.mindustry.game.TypeID;
|
import io.anuke.mindustry.game.TypeID;
|
||||||
import io.anuke.mindustry.gen.Call;
|
import io.anuke.mindustry.gen.Call;
|
||||||
import io.anuke.mindustry.net.Net;
|
|
||||||
import io.anuke.mindustry.type.Liquid;
|
import io.anuke.mindustry.type.Liquid;
|
||||||
import io.anuke.mindustry.world.Tile;
|
import io.anuke.mindustry.world.Tile;
|
||||||
|
|
||||||
@@ -83,7 +82,7 @@ public class Puddle extends SolidEntity implements SaveTrait, Poolable, DrawTrai
|
|||||||
|
|
||||||
Puddle p = map.get(tile.pos());
|
Puddle p = map.get(tile.pos());
|
||||||
if(p == null){
|
if(p == null){
|
||||||
if(Net.client()) return; //not clientside.
|
if(net.client()) return; //not clientside.
|
||||||
|
|
||||||
Puddle puddle = Pools.obtain(Puddle.class, Puddle::new);
|
Puddle puddle = Pools.obtain(Puddle.class, Puddle::new);
|
||||||
puddle.tile = tile;
|
puddle.tile = tile;
|
||||||
@@ -168,7 +167,7 @@ public class Puddle extends SolidEntity implements SaveTrait, Poolable, DrawTrai
|
|||||||
public void update(){
|
public void update(){
|
||||||
|
|
||||||
//no updating happens clientside
|
//no updating happens clientside
|
||||||
if(Net.client()){
|
if(net.client()){
|
||||||
amount = Mathf.lerpDelta(amount, targetAmount, 0.15f);
|
amount = Mathf.lerpDelta(amount, targetAmount, 0.15f);
|
||||||
}else{
|
}else{
|
||||||
//update code
|
//update code
|
||||||
|
|||||||
@@ -88,7 +88,7 @@ public interface MinerTrait extends Entity{
|
|||||||
float ex = tile.worldx() + Mathf.sin(Time.time() + 48, swingScl, swingMag);
|
float ex = tile.worldx() + Mathf.sin(Time.time() + 48, swingScl, swingMag);
|
||||||
float ey = tile.worldy() + Mathf.sin(Time.time() + 48, swingScl + 2f, swingMag);
|
float ey = tile.worldy() + Mathf.sin(Time.time() + 48, swingScl + 2f, swingMag);
|
||||||
|
|
||||||
Draw.color(Color.LIGHT_GRAY, Color.WHITE, 1f - flashScl + Mathf.absin(Time.time(), 0.5f, flashScl));
|
Draw.color(Color.lightGray, Color.white, 1f - flashScl + Mathf.absin(Time.time(), 0.5f, flashScl));
|
||||||
|
|
||||||
Drawf.laser(Core.atlas.find("minelaser"), Core.atlas.find("minelaser-end"), px, py, ex, ey, 0.75f);
|
Drawf.laser(Core.atlas.find("minelaser"), Core.atlas.find("minelaser-end"), px, py, ex, ey, 0.75f);
|
||||||
|
|
||||||
|
|||||||