Merge branch 'master' into translation

This commit is contained in:
Anuken
2019-09-15 20:37:28 -04:00
committed by GitHub
283 changed files with 9929 additions and 6829 deletions

4
.gitignore vendored
View File

@@ -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/

View File

@@ -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}"

View File

@@ -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.*

View File

@@ -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>

View File

@@ -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"

View File

@@ -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);

View File

@@ -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)

View File

@@ -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();
}
} }

View File

@@ -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;

View File

@@ -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)");

View File

@@ -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";
} }
} }

View File

@@ -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{

View File

Before

Width:  |  Height:  |  Size: 91 B

After

Width:  |  Height:  |  Size: 91 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.9 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 168 B

After

Width:  |  Height:  |  Size: 2.3 KiB

View File

Before

Width:  |  Height:  |  Size: 9.7 KiB

After

Width:  |  Height:  |  Size: 9.7 KiB

View File

Before

Width:  |  Height:  |  Size: 38 KiB

After

Width:  |  Height:  |  Size: 38 KiB

View File

Before

Width:  |  Height:  |  Size: 8.0 KiB

After

Width:  |  Height:  |  Size: 8.0 KiB

View File

Before

Width:  |  Height:  |  Size: 8.8 KiB

After

Width:  |  Height:  |  Size: 8.8 KiB

View File

Before

Width:  |  Height:  |  Size: 7.2 KiB

After

Width:  |  Height:  |  Size: 7.2 KiB

View File

Before

Width:  |  Height:  |  Size: 29 KiB

After

Width:  |  Height:  |  Size: 29 KiB

View File

Before

Width:  |  Height:  |  Size: 15 KiB

After

Width:  |  Height:  |  Size: 15 KiB

View File

Before

Width:  |  Height:  |  Size: 33 KiB

After

Width:  |  Height:  |  Size: 33 KiB

View File

Before

Width:  |  Height:  |  Size: 19 KiB

After

Width:  |  Height:  |  Size: 19 KiB

View File

Before

Width:  |  Height:  |  Size: 15 KiB

After

Width:  |  Height:  |  Size: 15 KiB

View File

Before

Width:  |  Height:  |  Size: 17 KiB

After

Width:  |  Height:  |  Size: 17 KiB

View File

Before

Width:  |  Height:  |  Size: 14 KiB

After

Width:  |  Height:  |  Size: 14 KiB

View File

@@ -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
@@ -345,6 +371,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 +472,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 +485,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 +562,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 +915,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 +934,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.

View File

@@ -16,6 +16,11 @@ screenshot.invalid = Map too large, potentially not enough memory for screenshot
gameover = Konec hry gameover = Konec hry
gameover.pvp = [accent] {0}[] Tým Vyhrál! gameover.pvp = [accent] {0}[] Tým Vyhrál!
highscore = [accent]Nový Rekord! highscore = [accent]Nový Rekord!
load.sound = Sounds
load.map = Maps
load.image = Images
load.content = Content
load.system = System
stat.wave = Waves Defeated:[accent] {0} stat.wave = Waves Defeated:[accent] {0}
stat.enemiesDestroyed = Enemies Destroyed:[accent] {0} stat.enemiesDestroyed = Enemies Destroyed:[accent] {0}
stat.built = Buildings Built:[accent] {0} stat.built = Buildings Built:[accent] {0}
@@ -23,8 +28,6 @@ stat.destroyed = Buildings Destroyed:[accent] {0}
stat.deconstructed = Buildings Deconstructed:[accent] {0} stat.deconstructed = Buildings Deconstructed:[accent] {0}
stat.delivered = Resources Launched: stat.delivered = Resources Launched:
stat.rank = Final Rank: [accent]{0} stat.rank = Final Rank: [accent]{0}
placeline = You have selected a block.\nYou can[accent] place in a line[] by[accent] holding down your finger for a few seconds[] and dragging in a direction.\nTry it.
removearea = You have selected removal mode.\nYou can[accent] remove blocks in a rectangle[] by[accent] holding down your finger for a few seconds[] and dragging.\nTry it.
launcheditems = [accent]Launched Items launcheditems = [accent]Launched Items
map.delete = Jsi si jistý že chceš smazat mapu "[accent]{0}[]"? map.delete = Jsi si jistý že chceš smazat mapu "[accent]{0}[]"?
level.highscore = Nejvyšší skóre: [accent]{0} level.highscore = Nejvyšší skóre: [accent]{0}
@@ -63,9 +66,11 @@ players.single = {0} hráč online
server.closing = [accent]Zavírám server... server.closing = [accent]Zavírám server...
server.kicked.kick = Byl jsi vykopnut ze serveru! server.kicked.kick = Byl jsi vykopnut ze serveru!
server.kicked.serverClose = Server je zavřený. server.kicked.serverClose = Server je zavřený.
server.kicked.vote = You have been vote-kicked. Goodbye.
server.kicked.clientOutdated = Zastaralý klient hry! Aktualizuj si hru! server.kicked.clientOutdated = Zastaralý klient hry! Aktualizuj si hru!
server.kicked.serverOutdated = Zastaralý server! Řekni hostiteli o aktualizaci! server.kicked.serverOutdated = Zastaralý server! Řekni hostiteli o aktualizaci!
server.kicked.banned = Jsi zabanován na tomto serveru. server.kicked.banned = Jsi zabanován na tomto serveru.
server.kicked.typeMismatch = This server is not compatible with your build type.
server.kicked.recentKick = Před nedávnem jsi byl vykopnut.\nPočkej než se znovu připojíš. server.kicked.recentKick = Před nedávnem jsi byl vykopnut.\nPočkej než se znovu připojíš.
server.kicked.nameInUse = Někdo se stejným jménem\nje aktuálně na serveru. server.kicked.nameInUse = Někdo se stejným jménem\nje aktuálně na serveru.
server.kicked.nameEmpty = Tvé jméno je neplatné. server.kicked.nameEmpty = Tvé jméno je neplatné.
@@ -156,6 +161,11 @@ cancel = Zrušit
openlink = Otevřít Odkaz openlink = Otevřít Odkaz
copylink = Zkopírovat Odkaz copylink = Zkopírovat Odkaz
back = Zpět back = Zpět
data.export = Export Data
data.import = Import Data
data.exported = Data exported.
data.invalid = This isn't valid game data.
data.import.confirm = Importing external data will erase[scarlet] all[] your current game data.\n[accent]This cannot be undone![]\n\nOnce the data is imported, your game will exit immediately.
classic.export = Export Classic Data classic.export = Export Classic Data
classic.export.text = [accent]Mindustry[] has just had a major update.\nClassic (v3.5 build 40) save or map data has been detected. Would you like to export these saves to your phone's home folder, for use in the Mindustry Classic app? classic.export.text = [accent]Mindustry[] has just had a major update.\nClassic (v3.5 build 40) save or map data has been detected. Would you like to export these saves to your phone's home folder, for use in the Mindustry Classic app?
quit.confirm = Jsi si jistý že chceš ukončit ? quit.confirm = Jsi si jistý že chceš ukončit ?
@@ -376,6 +386,7 @@ zone.fungalPass.description = A transition area between high mountains and lower
zone.impact0078.description = <insert description here> zone.impact0078.description = <insert description here>
zone.crags.description = <insert description here> zone.crags.description = <insert description here>
settings.language = Jazyk settings.language = Jazyk
settings.data = Game Data
settings.reset = nastavit výchozí settings.reset = nastavit výchozí
settings.rebind = Přenastavit settings.rebind = Přenastavit
settings.controls = Ovládání settings.controls = Ovládání
@@ -507,6 +518,7 @@ setting.mutemusic.name = Ztišit hudbu
setting.sfxvol.name = SFX hlasitost setting.sfxvol.name = SFX hlasitost
setting.mutesound.name = Ztišit zvuky setting.mutesound.name = Ztišit zvuky
setting.crashreport.name = Poslat anonymní spis o zhroucení hry setting.crashreport.name = Poslat anonymní spis o zhroucení hry
setting.savecreate.name = Auto-Create Saves
setting.chatopacity.name = Chat Opacity setting.chatopacity.name = Chat Opacity
setting.playerchat.name = Display In-Game Chat setting.playerchat.name = Display In-Game Chat
uiscale.reset = UI scale has been changed.\nPress "OK" to confirm this scale.\n[scarlet]Reverting and exiting in[accent] {0}[] settings... uiscale.reset = UI scale has been changed.\nPress "OK" to confirm this scale.\n[scarlet]Reverting and exiting in[accent] {0}[] settings...
@@ -527,6 +539,7 @@ keybind.press.axis = Stiskni osu nebo klávesu...
keybind.screenshot.name = Sníměk mapy keybind.screenshot.name = Sníměk mapy
keybind.move_x.name = Pohyb na X keybind.move_x.name = Pohyb na X
keybind.move_y.name = Pohyb na Y keybind.move_y.name = Pohyb na Y
keybind.fullscreen.name = Toggle Fullscreen
keybind.select.name = Vybrat/Střílet keybind.select.name = Vybrat/Střílet
keybind.diagonal_placement.name = Diagonal Placement keybind.diagonal_placement.name = Diagonal Placement
keybind.pick.name = Pick Block keybind.pick.name = Pick Block
@@ -790,6 +803,7 @@ block.blast-mixer.name = Výbušninový mixér
block.solar-panel.name = Solární panel block.solar-panel.name = Solární panel
block.solar-panel-large.name = Velký solární panel block.solar-panel-large.name = Velký solární panel
block.oil-extractor.name = Ropný Extraktor block.oil-extractor.name = Ropný Extraktor
block.command-center.name = Command Center
block.draug-factory.name = Draug Miner Drone Factory block.draug-factory.name = Draug Miner Drone Factory
block.spirit-factory.name = Továrna na Spirit Drony block.spirit-factory.name = Továrna na Spirit Drony
block.phantom-factory.name = Továrna na Fantom Drony block.phantom-factory.name = Továrna na Fantom Drony
@@ -1012,6 +1026,7 @@ block.ripple.description = Velká artilérní střílna, která vystřelí něko
block.cyclone.description = Velká rychle pálící střílna. block.cyclone.description = Velká rychle pálící střílna.
block.spectre.description = Velká střílna, která vystřelí dva mocné projektily naráz. block.spectre.description = Velká střílna, která vystřelí dva mocné projektily naráz.
block.meltdown.description = Velká střílna, která vystřelí mocný paprsek dalekého dosahu. block.meltdown.description = Velká střílna, která vystřelí mocný paprsek dalekého dosahu.
block.command-center.description = Issues movement commands to allied units across the map.\nCauses units to patrol, attack an enemy core or retreat to the core/factory. When no enemy core is present, units will default to patrolling under the attack command.
block.draug-factory.description = Produces Draug mining drones. block.draug-factory.description = Produces Draug mining drones.
block.spirit-factory.description = Produkuje lehké drony, kteří teží minerály a opravují budovy block.spirit-factory.description = Produkuje lehké drony, kteří teží minerály a opravují budovy
block.phantom-factory.description = Produkuje pokročilé drony kteří jsou podstatně efektivnější jak spirit droni. block.phantom-factory.description = Produkuje pokročilé drony kteří jsou podstatně efektivnější jak spirit droni.

View File

@@ -16,6 +16,11 @@ screenshot.invalid = Karte zu groß! Eventuell nicht ausreichend Arbeitsspeicher
gameover = Der Kern wurde zerstört. gameover = Der Kern wurde zerstört.
gameover.pvp = Das[accent] {0}[] Team ist siegreich! gameover.pvp = Das[accent] {0}[] Team ist siegreich!
highscore = [YELLOW] Neuer Highscore! highscore = [YELLOW] Neuer Highscore!
load.sound = Sounds
load.map = Maps
load.image = Images
load.content = Content
load.system = System
stat.wave = Wellen besiegt:[accent] {0} stat.wave = Wellen besiegt:[accent] {0}
stat.enemiesDestroyed = Gegner zerstört:[accent] {0} stat.enemiesDestroyed = Gegner zerstört:[accent] {0}
stat.built = Gebäude gebaut:[accent] {0} stat.built = Gebäude gebaut:[accent] {0}
@@ -23,8 +28,6 @@ stat.destroyed = Gebäude zerstört:[accent] {0}
stat.deconstructed = Gebäude abgebaut:[accent] {0} stat.deconstructed = Gebäude abgebaut:[accent] {0}
stat.delivered = Übertragene Ressourcen: stat.delivered = Übertragene Ressourcen:
stat.rank = Finaler Rang: [accent]{0} stat.rank = Finaler Rang: [accent]{0}
placeline = Du hast einen Block ausgewählt.\nDu kannst[accent] davon eine Reihe bauen,[] indem du[accent] wenige Sekunden mit einem Finger drückst[] und ihn in eine Richtung ziehst.\nVersuche es.
removearea = Du hast den Zerstörungsmodus ausgewählt.\nDu kannst[accent] Blöcke im Rechteck zerstören,[] indem du[accent] wenige Sekunden mit einem Finger drückst[] und ihn ziehst.\nVersuche es.
launcheditems = [accent]Übertragene Items launcheditems = [accent]Übertragene Items
map.delete = Bist du sicher, dass du die Karte "[accent]{0}[]" löschen möchtest? map.delete = Bist du sicher, dass du die Karte "[accent]{0}[]" löschen möchtest?
level.highscore = Highscore: [accent]{0} level.highscore = Highscore: [accent]{0}
@@ -63,9 +66,11 @@ players.single = {0} Spieler online
server.closing = [accent]Schließe den Server ... server.closing = [accent]Schließe den Server ...
server.kicked.kick = Du wurdest vom Server gekickt! server.kicked.kick = Du wurdest vom Server gekickt!
server.kicked.serverClose = Server geschlossen. server.kicked.serverClose = Server geschlossen.
server.kicked.vote = You have been vote-kicked. Goodbye.
server.kicked.clientOutdated = Veralteter Client! Aktualisiere dein Spiel! server.kicked.clientOutdated = Veralteter Client! Aktualisiere dein Spiel!
server.kicked.serverOutdated = Veralteter Server! Bitte den Host um ein Update! server.kicked.serverOutdated = Veralteter Server! Bitte den Host um ein Update!
server.kicked.banned = Du wurdest vom Server verbannt. server.kicked.banned = Du wurdest vom Server verbannt.
server.kicked.typeMismatch = This server is not compatible with your build type.
server.kicked.recentKick = Du wurdest gerade gekickt.\nWarte bevor du dich wieder verbindest. server.kicked.recentKick = Du wurdest gerade gekickt.\nWarte bevor du dich wieder verbindest.
server.kicked.nameInUse = Es ist bereits ein Spieler \nmit diesem Namen auf dem Server. server.kicked.nameInUse = Es ist bereits ein Spieler \nmit diesem Namen auf dem Server.
server.kicked.nameEmpty = Dein Name muss mindestens einen Buchstaben oder eine Zahl enthalten. server.kicked.nameEmpty = Dein Name muss mindestens einen Buchstaben oder eine Zahl enthalten.
@@ -156,6 +161,11 @@ cancel = Abbruch
openlink = Link öffnen openlink = Link öffnen
copylink = Kopiere Link copylink = Kopiere Link
back = Zurück back = Zurück
data.export = Export Data
data.import = Import Data
data.exported = Data exported.
data.invalid = This isn't valid game data.
data.import.confirm = Importing external data will erase[scarlet] all[] your current game data.\n[accent]This cannot be undone![]\n\nOnce the data is imported, your game will exit immediately.
classic.export = Export Classic Data classic.export = Export Classic Data
classic.export.text = [accent]Mindustry[] has just had a major update.\nClassic (v3.5 build 40) save or map data has been detected. Would you like to export these saves to your phone's home folder, for use in the Mindustry Classic app? classic.export.text = [accent]Mindustry[] has just had a major update.\nClassic (v3.5 build 40) save or map data has been detected. Would you like to export these saves to your phone's home folder, for use in the Mindustry Classic app?
quit.confirm = Willst du wirklich aufhören? quit.confirm = Willst du wirklich aufhören?
@@ -376,6 +386,7 @@ zone.fungalPass.description = A transition area between high mountains and lower
zone.impact0078.description = <Beschreibung hier einfügen> zone.impact0078.description = <Beschreibung hier einfügen>
zone.crags.description = <Beschreibung hier einfügen> zone.crags.description = <Beschreibung hier einfügen>
settings.language = Sprache settings.language = Sprache
settings.data = Game Data
settings.reset = Auf Standard zurücksetzen settings.reset = Auf Standard zurücksetzen
settings.rebind = Zuweisen settings.rebind = Zuweisen
settings.controls = Steuerung settings.controls = Steuerung
@@ -507,6 +518,7 @@ setting.mutemusic.name = Musik stummschalten
setting.sfxvol.name = Audioeffekt-Lautstärke setting.sfxvol.name = Audioeffekt-Lautstärke
setting.mutesound.name = Audioeffekte stummschalten setting.mutesound.name = Audioeffekte stummschalten
setting.crashreport.name = Anonyme Absturzberichte senden setting.crashreport.name = Anonyme Absturzberichte senden
setting.savecreate.name = Auto-Create Saves
setting.chatopacity.name = Chat Deckkraft setting.chatopacity.name = Chat Deckkraft
setting.playerchat.name = Chat im Spiel anzeigen setting.playerchat.name = Chat im Spiel anzeigen
uiscale.reset = UI-Skalierung wurde geändert.\nDrücke "OK", um diese Skalierung zu bestätigen.\n[scarlet]Zurückkehren und Beenden in[accent] {0}[] Einstellungen... uiscale.reset = UI-Skalierung wurde geändert.\nDrücke "OK", um diese Skalierung zu bestätigen.\n[scarlet]Zurückkehren und Beenden in[accent] {0}[] Einstellungen...
@@ -527,6 +539,7 @@ keybind.press.axis = Drücke eine Taste oder bewege eine Achse...
keybind.screenshot.name = Karten Screenshot keybind.screenshot.name = Karten Screenshot
keybind.move_x.name = X-Achse keybind.move_x.name = X-Achse
keybind.move_y.name = Y-Achse keybind.move_y.name = Y-Achse
keybind.fullscreen.name = Toggle Fullscreen
keybind.select.name = Auswählen/Schießen keybind.select.name = Auswählen/Schießen
keybind.diagonal_placement.name = Diagonal platzieren keybind.diagonal_placement.name = Diagonal platzieren
keybind.pick.name = Block Auswählen keybind.pick.name = Block Auswählen
@@ -790,6 +803,7 @@ block.blast-mixer.name = Sprengmixer
block.solar-panel.name = Solarpanel block.solar-panel.name = Solarpanel
block.solar-panel-large.name = Großes Solarpanel block.solar-panel-large.name = Großes Solarpanel
block.oil-extractor.name = Öl-Extraktor block.oil-extractor.name = Öl-Extraktor
block.command-center.name = Command Center
block.draug-factory.name = Draug Miner-Drohnenfactory block.draug-factory.name = Draug Miner-Drohnenfactory
block.spirit-factory.name = Spirit-Drohnenfabrik block.spirit-factory.name = Spirit-Drohnenfabrik
block.phantom-factory.name = Phantom-Drohnenfabrik block.phantom-factory.name = Phantom-Drohnenfabrik
@@ -1012,6 +1026,7 @@ block.ripple.description = Ein großer Artillerie-Geschützturm, der mehrere Sch
block.cyclone.description = Ein großer Schnellfeuer-Geschützturm. block.cyclone.description = Ein großer Schnellfeuer-Geschützturm.
block.spectre.description = Ein großer Geschützturm, der zwei starke Schüsse gleichzeitig abfeuert. block.spectre.description = Ein großer Geschützturm, der zwei starke Schüsse gleichzeitig abfeuert.
block.meltdown.description = Ein großer Geschützturm, der starke Strahlen mit großer Reichweite abfeuert. block.meltdown.description = Ein großer Geschützturm, der starke Strahlen mit großer Reichweite abfeuert.
block.command-center.description = Issues movement commands to allied units across the map.\nCauses units to patrol, attack an enemy core or retreat to the core/factory. When no enemy core is present, units will default to patrolling under the attack command.
block.draug-factory.description = Produziert Draug-Mining-Drohnen. block.draug-factory.description = Produziert Draug-Mining-Drohnen.
block.spirit-factory.description = Produziert leichte Drohnen, die Erz abbauen und Blöcke reparieren können. block.spirit-factory.description = Produziert leichte Drohnen, die Erz abbauen und Blöcke reparieren können.
block.phantom-factory.description = Produziert erweiterte Drohnen, die deutlich effizienter sind als Spirit-Drohnen. block.phantom-factory.description = Produziert erweiterte Drohnen, die deutlich effizienter sind als Spirit-Drohnen.

File diff suppressed because it is too large Load Diff

View File

@@ -16,6 +16,11 @@ screenshot.invalid = Maailm liiga suur, tõenäoliselt pole piisavalt mälu salv
gameover = Mäng Läbi gameover = Mäng Läbi
gameover.pvp = [accent] {0}[] tiim võitis! gameover.pvp = [accent] {0}[] tiim võitis!
highscore = [accent]Uus rekord! highscore = [accent]Uus rekord!
load.sound = Sounds
load.map = Maps
load.image = Images
load.content = Content
load.system = System
stat.wave = Raund:[accent] {0} stat.wave = Raund:[accent] {0}
stat.enemiesDestroyed = Vaenlasi hävitatud:[accent] {0} stat.enemiesDestroyed = Vaenlasi hävitatud:[accent] {0}
stat.built = Ehitisi ehitatud:[accent] {0} stat.built = Ehitisi ehitatud:[accent] {0}
@@ -23,8 +28,6 @@ stat.destroyed = Ehitisi hävitatud:[accent] {0}
stat.deconstructed = Ehitisi lahtivõetud:[accent] {0} stat.deconstructed = Ehitisi lahtivõetud:[accent] {0}
stat.delivered = Materjale kaasa võetud: stat.delivered = Materjale kaasa võetud:
stat.rank = Lõplik Hinne: [accent]{0} stat.rank = Lõplik Hinne: [accent]{0}
placeline = Sa valisid ehitise\nSa saad[accent] panna neid sirges reas[] hoides näpuga all ja, siis viibates mõnes suunas.\n\n[scarlet] TEE SEDA
removearea = Sa valisid hävitamise funktsiooni.\nsa saad[accent] hävitada[]hoides oma sõrme all mõne sekundi ja, siis viibates mõnele poole.\n\n[scarlet]TEE SEDA
launcheditems = [accent]Kaasa võetud materjalid launcheditems = [accent]Kaasa võetud materjalid
map.delete = Kas oled kindel, et soovid kustutada "[accent]{0}[]". map.delete = Kas oled kindel, et soovid kustutada "[accent]{0}[]".
level.highscore = Rekord: [accent]{0} level.highscore = Rekord: [accent]{0}
@@ -63,9 +66,11 @@ players.single = {0} mängija mängus
server.closing = [accent]Serveri sulgemine... server.closing = [accent]Serveri sulgemine...
server.kicked.kick = Sind visati serverist välja! server.kicked.kick = Sind visati serverist välja!
server.kicked.serverClose = Server suletud. server.kicked.serverClose = Server suletud.
server.kicked.vote = You have been vote-kicked. Goodbye.
server.kicked.clientOutdated = Aegunud versioon! Uuenda oma mängu! server.kicked.clientOutdated = Aegunud versioon! Uuenda oma mängu!
server.kicked.serverOutdated = Aegunud server! Palu omanikul serverit uuendada! server.kicked.serverOutdated = Aegunud server! Palu omanikul serverit uuendada!
server.kicked.banned = Sul on keeld seal mängida. server.kicked.banned = Sul on keeld seal mängida.
server.kicked.typeMismatch = This server is not compatible with your build type.
server.kicked.recentKick = Sind visati hiljuti välja.\nOota natuke enne uuesti proovimist. server.kicked.recentKick = Sind visati hiljuti välja.\nOota natuke enne uuesti proovimist.
server.kicked.nameInUse = Keegi sellise nimega\non juba seal serveris. server.kicked.nameInUse = Keegi sellise nimega\non juba seal serveris.
server.kicked.nameEmpty = Sinu valitud nimi ei sobi. server.kicked.nameEmpty = Sinu valitud nimi ei sobi.
@@ -156,6 +161,11 @@ cancel = Tühista
openlink = Ava Link openlink = Ava Link
copylink = Kopeeri Link copylink = Kopeeri Link
back = Tagasi back = Tagasi
data.export = Export Data
data.import = Import Data
data.exported = Data exported.
data.invalid = This isn't valid game data.
data.import.confirm = Importing external data will erase[scarlet] all[] your current game data.\n[accent]This cannot be undone![]\n\nOnce the data is imported, your game will exit immediately.
classic.export = Export Classic Data classic.export = Export Classic Data
classic.export.text = [accent]Mindustry[] has just had a major update.\nClassic (v3.5 build 40) save or map data has been detected. Would you like to export these saves to your phone's home folder, for use in the Mindustry Classic app? classic.export.text = [accent]Mindustry[] has just had a major update.\nClassic (v3.5 build 40) save or map data has been detected. Would you like to export these saves to your phone's home folder, for use in the Mindustry Classic app?
quit.confirm = Oled kindel, et soovid lahkuda? quit.confirm = Oled kindel, et soovid lahkuda?
@@ -376,6 +386,7 @@ zone.fungalPass.description = A transition area between high mountains and lower
zone.impact0078.description = <insert description here> zone.impact0078.description = <insert description here>
zone.crags.description = <insert description here> zone.crags.description = <insert description here>
settings.language = Keel settings.language = Keel
settings.data = Game Data
settings.reset = Reset to Defaults settings.reset = Reset to Defaults
settings.rebind = Rebind settings.rebind = Rebind
settings.controls = Controls settings.controls = Controls
@@ -507,6 +518,7 @@ setting.mutemusic.name = Vaigista muusika
setting.sfxvol.name = SFX Volume setting.sfxvol.name = SFX Volume
setting.mutesound.name = Mute Sound setting.mutesound.name = Mute Sound
setting.crashreport.name = Send Anonymous Crash Reports setting.crashreport.name = Send Anonymous Crash Reports
setting.savecreate.name = Auto-Create Saves
setting.chatopacity.name = Chat Opacity setting.chatopacity.name = Chat Opacity
setting.playerchat.name = Display In-Game Chat setting.playerchat.name = Display In-Game Chat
uiscale.reset = UI scale has been changed.\nPress "OK" to confirm this scale.\n[scarlet]Reverting and exiting in[accent] {0}[] seconds... uiscale.reset = UI scale has been changed.\nPress "OK" to confirm this scale.\n[scarlet]Reverting and exiting in[accent] {0}[] seconds...
@@ -527,6 +539,7 @@ keybind.press.axis = Press an axis or key...
keybind.screenshot.name = Map Screenshot keybind.screenshot.name = Map Screenshot
keybind.move_x.name = Move x keybind.move_x.name = Move x
keybind.move_y.name = Move y keybind.move_y.name = Move y
keybind.fullscreen.name = Toggle Fullscreen
keybind.select.name = Select/Shoot keybind.select.name = Select/Shoot
keybind.diagonal_placement.name = Diagonal Placement keybind.diagonal_placement.name = Diagonal Placement
keybind.pick.name = Pick Block keybind.pick.name = Pick Block
@@ -790,6 +803,7 @@ block.blast-mixer.name = Blast Mixer
block.solar-panel.name = Solar Panel block.solar-panel.name = Solar Panel
block.solar-panel-large.name = Large Solar Panel block.solar-panel-large.name = Large Solar Panel
block.oil-extractor.name = Oil Extractor block.oil-extractor.name = Oil Extractor
block.command-center.name = Command Center
block.draug-factory.name = Draug Miner Drone Factory block.draug-factory.name = Draug Miner Drone Factory
block.spirit-factory.name = Spirit Drone Factory block.spirit-factory.name = Spirit Drone Factory
block.phantom-factory.name = Phantom Drone Factory block.phantom-factory.name = Phantom Drone Factory
@@ -1012,6 +1026,7 @@ block.ripple.description = A large artillery turret which fires several shots si
block.cyclone.description = A large rapid fire turret. block.cyclone.description = A large rapid fire turret.
block.spectre.description = A large turret which shoots two powerful bullets at once. block.spectre.description = A large turret which shoots two powerful bullets at once.
block.meltdown.description = A large turret which shoots powerful long-range beams. block.meltdown.description = A large turret which shoots powerful long-range beams.
block.command-center.description = Issues movement commands to allied units across the map.\nCauses units to patrol, attack an enemy core or retreat to the core/factory. When no enemy core is present, units will default to patrolling under the attack command.
block.draug-factory.description = Produces Draug mining drones. block.draug-factory.description = Produces Draug mining drones.
block.spirit-factory.description = Produces light drones which mine ore and repair blocks. block.spirit-factory.description = Produces light drones which mine ore and repair blocks.
block.phantom-factory.description = Produces advanced drone units which are significantly more effective than a spirit drone. block.phantom-factory.description = Produces advanced drone units which are significantly more effective than a spirit drone.

View File

@@ -16,13 +16,11 @@ screenshot.invalid = La carte est trop large, il n'y a potentiellement pas assez
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 = [YELLOW]Nouveau meilleur score!
load.sound = Sonds load.sound = Sonds
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}
@@ -30,7 +28,6 @@ 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 supprimer cette carte "[accent]{0}[]"?
level.highscore = Meilleur score: [accent]{0} level.highscore = Meilleur score: [accent]{0}
@@ -257,13 +254,12 @@ 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 avez des modifications non sauvegardés ![]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 réécrit 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 la réécrire?
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
@@ -278,7 +274,6 @@ toolmode.fillteams = Remplire les équipes
toolmode.fillteams.description = Rempli les équipes au lieu de blocs. toolmode.fillteams.description = Rempli les équipes au lieu de 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 = [LIGHT_GRAY]Aucun filtre! Ajoutez-en un avec les boutons ci-dessous.
filter.distort = Déformation filter.distort = Déformation
filter.noise = Bruit filter.noise = Bruit
@@ -310,7 +305,6 @@ 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
@@ -328,7 +322,6 @@ 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 = Abandon
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é
@@ -354,7 +347,6 @@ zone.objective.survival = Survive
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 = Vie du Boss
connectfail = [crimson]Échec de la connexion au serveur : [accent]{0} connectfail = [crimson]Échec de la connexion au serveur : [accent]{0}
error.unreachable = Serveur injoignable. error.unreachable = Serveur injoignable.
error.invalidaddress = Adresse invalide. error.invalidaddress = Adresse invalide.
@@ -365,7 +357,6 @@ error.mapnotfound = Fichier de la 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écharge Désertique
zone.craters.name = Les Cratères zone.craters.name = Les Cratères
@@ -380,7 +371,6 @@ 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 = Fungal Pass
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.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.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.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.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.
@@ -395,7 +385,6 @@ zone.nuclearComplex.description = Une ancienne installation de production et de
zone.fungalPass.description = A transition area between high mountains and lower, spore-ridden lands. A small enemy reconnaissance base is located here.\nDestroy it.\nUse Dagger and Crawler units. Take out the two cores. zone.fungalPass.description = A transition area between high mountains and lower, spore-ridden lands. A small enemy reconnaissance base is located here.\nDestroy it.\nUse Dagger and Crawler units. Take out the two cores.
zone.impact0078.description = <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.
@@ -449,7 +438,6 @@ blocks.inaccuracy = Précision
blocks.shots = Tir blocks.shots = Tir
blocks.reload = Tirs/Seconde blocks.reload = Tirs/Seconde
blocks.ammo = Munitions blocks.ammo = Munitions
bar.drilltierreq = Meilleure Foreuse Requise bar.drilltierreq = Meilleure Foreuse Requise
bar.drillspeed = Vitesse de forage: {0}/s bar.drillspeed = Vitesse de forage: {0}/s
bar.efficiency = Efficacité: {0}% bar.efficiency = Efficacité: {0}%
@@ -462,7 +450,6 @@ 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.damage = [stat]{0}[lightgray] dgt
bullet.splashdamage = [stat]{0}[lightgray] dgt de zone ~[stat] {1}[lightgray] tuiles bullet.splashdamage = [stat]{0}[lightgray] dgt de zone ~[stat] {1}[lightgray] tuiles
bullet.incendiary = [stat]incendiaire bullet.incendiary = [stat]incendiaire
@@ -474,7 +461,6 @@ bullet.freezing = [stat]gel
bullet.tarred = [stat]Pétrolené bullet.tarred = [stat]Pétrolené
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 rechargement
unit.blocks = blocs unit.blocks = blocs
unit.powersecond = Énergie/seconde unit.powersecond = Énergie/seconde
unit.liquidsecond = Liquides/seconde unit.liquidsecond = Liquides/seconde
@@ -586,7 +572,6 @@ 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
@@ -613,7 +598,6 @@ rules.title.resourcesbuilding = Ressources & Constructions
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
@@ -675,7 +659,6 @@ 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
@@ -903,8 +886,6 @@ 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.

View File

@@ -16,6 +16,11 @@ 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.map = Maps
load.image = Images
load.content = Content
load.system = System
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}
@@ -61,9 +66,11 @@ 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.serverClose = Serveur fermé. server.kicked.serverClose = Serveur fermé.
server.kicked.vote = You have been vote-kicked. Goodbye.
server.kicked.clientOutdated = Client dépassé! Mettez à jour votre jeu ! server.kicked.clientOutdated = Client dépassé! Mettez à jour votre jeu !
server.kicked.serverOutdated = Serveur dépassé! Demandez à l'hôte de le mettre à jour ! server.kicked.serverOutdated = Serveur dépassé! Demandez à l'hôte de le mettre à jour !
server.kicked.banned = Vous êtes banni de ce serveur. server.kicked.banned = Vous êtes banni de ce serveur.
server.kicked.typeMismatch = This server is not compatible with your build type.
server.kicked.recentKick = Vous avez été expulsé récemment.\nAttendez avant de vous connecter à nouveau. server.kicked.recentKick = Vous avez été expulsé récemment.\nAttendez avant de vous connecter à nouveau.
server.kicked.nameInUse = Il y a déjà quelqu'un avec ce nom\nsur ce serveur. server.kicked.nameInUse = Il y a déjà quelqu'un avec ce nom\nsur ce serveur.
server.kicked.nameEmpty = Votre nom doit contenir au moins une lettre ou un chiffre. server.kicked.nameEmpty = Votre nom doit contenir au moins une lettre ou un chiffre.
@@ -154,6 +161,11 @@ cancel = Annuler
openlink = Ouvrir le lien openlink = Ouvrir le lien
copylink = Copier le lien copylink = Copier le lien
back = Retour back = Retour
data.export = Export Data
data.import = Import Data
data.exported = Data exported.
data.invalid = This isn't valid game data.
data.import.confirm = Importing external data will erase[scarlet] all[] your current game data.\n[accent]This cannot be undone![]\n\nOnce the data is imported, your game will exit immediately.
classic.export = Export Classic Data classic.export = Export Classic Data
classic.export.text = [accent]Mindustry[] has just had a major update.\nClassic (v3.5 build 40) save or map data has been detected. Would you like to export these saves to your phone's home folder, for use in the Mindustry Classic app? classic.export.text = [accent]Mindustry[] has just had a major update.\nClassic (v3.5 build 40) save or map data has been detected. Would you like to export these saves to your phone's home folder, for use in the Mindustry Classic app?
quit.confirm = Êtes-vous sûr de vouloir quitter? quit.confirm = Êtes-vous sûr de vouloir quitter?
@@ -374,6 +386,7 @@ zone.fungalPass.description = A transition area between high mountains and lower
zone.impact0078.description = <insérer la description ici> zone.impact0078.description = <insérer la description ici>
zone.crags.description = <insérer la description ici> zone.crags.description = <insérer la description ici>
settings.language = Langage settings.language = Langage
settings.data = Game Data
settings.reset = Valeur par défaut. settings.reset = Valeur par défaut.
settings.rebind = Réatttribuer settings.rebind = Réatttribuer
settings.controls = Contrôles settings.controls = Contrôles
@@ -505,6 +518,7 @@ setting.mutemusic.name = Couper la musique
setting.sfxvol.name = Volume des SFX setting.sfxvol.name = Volume des SFX
setting.mutesound.name = Couper les SFX setting.mutesound.name = Couper les SFX
setting.crashreport.name = Envoyer des rapports d'incident anonymement. setting.crashreport.name = Envoyer des rapports d'incident anonymement.
setting.savecreate.name = Auto-Create Saves
setting.chatopacity.name = Opacité du tchat setting.chatopacity.name = Opacité du tchat
setting.playerchat.name = Afficher le tchat en jeu setting.playerchat.name = Afficher le tchat en jeu
uiscale.reset = L'échelle de l'interface a été modifiée.\nAppuyez sur "OK" pour confirmer cette échelle.\n[scarlet]Revenir et sortir en[accent] {0}[] réglages... uiscale.reset = L'échelle de l'interface a été modifiée.\nAppuyez sur "OK" pour confirmer cette échelle.\n[scarlet]Revenir et sortir en[accent] {0}[] réglages...
@@ -523,9 +537,9 @@ keybind.gridModeShift.name = Sélection de la catégorie
keybind.press = Appuyez sur une touche ... keybind.press = Appuyez sur une touche ...
keybind.press.axis = Appuyez sur un axe ou une touche... keybind.press.axis = Appuyez sur un axe ou une touche...
keybind.screenshot.name = Map Screenshot keybind.screenshot.name = Map Screenshot
keybind.fullscreen.name = Basculer en plein é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.select.name = Sélectionner/Tirer keybind.select.name = Sélectionner/Tirer
keybind.diagonal_placement.name = Placement en diagonal keybind.diagonal_placement.name = Placement en diagonal
keybind.pick.name = Choisir un bloc keybind.pick.name = Choisir un bloc
@@ -912,7 +926,6 @@ unit.wraith.description = Une unité volante rapide harcelant les ennemis. Utili
unit.ghoul.description = Un bombardier lourd. Utilise de la pyratite ou des explosifs comme munitions. unit.ghoul.description = Un bombardier lourd. Utilise de la pyratite ou des explosifs comme munitions.
unit.revenant.description = Un arsenal de missiles lourd et planant. unit.revenant.description = Un arsenal de missiles lourd et planant.
block.graphite-press.description = Compresse des morceaux de charbon en feuilles de graphite. block.graphite-press.description = Compresse des morceaux de charbon en feuilles de graphite.
block.command-center.description = Donne des ordres aux unités alliées sur la carte.\nPermet aux unités de patrouiller, dattaquer un noyau ennemi ou de se retirer dans le noyau/lusine. En l'absence de base ennemi, les unités patrouillent par défaut autour du centre de commandement.
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 coke* très pur afin de produire du silicium. (*Coke produit à partir de charbon:REF) block.silicon-smelter.description = Réduit le sable avec du coke* très pur afin de produire du silicium. (*Coke produit à partir de charbon:REF)
block.kiln.description = Fait fondre le sable et le plomb en métaverre. Nécessite de petites quantités d'énergie. block.kiln.description = Fait fondre le sable et le plomb en métaverre. Nécessite de petites quantités d'énergie.
@@ -1013,6 +1026,7 @@ block.ripple.description = Une grande tourelle d'artillerie qui tire plusieurs c
block.cyclone.description = Une grande tourelle à tir rapide. block.cyclone.description = Une grande tourelle à tir rapide.
block.spectre.description = Une grande tourelle qui tire deux balles puissantes à la fois. block.spectre.description = Une grande tourelle qui tire deux balles puissantes à la fois.
block.meltdown.description = Une grande tourelle qui tire de puissants faisceaux à longue portée. block.meltdown.description = Une grande tourelle qui tire de puissants faisceaux à longue portée.
block.command-center.description = Donne des ordres aux unités alliées sur la carte.\nPermet aux unités de patrouiller, dattaquer un noyau ennemi ou de se retirer dans le noyau/lusine. En l'absence de base ennemi, les unités patrouillent par défaut autour du centre de commandement.
block.draug-factory.description = Produces Draug mining drones. block.draug-factory.description = Produces Draug mining drones.
block.spirit-factory.description = Produit des drones légers qui extraient du minerai et réparent des blocs. block.spirit-factory.description = Produit des drones légers qui extraient du minerai et réparent des blocs.
block.phantom-factory.description = Produit des drones avancés qui sont bien plus efficaces que les drones spirituels. block.phantom-factory.description = Produit des drones avancés qui sont bien plus efficaces que les drones spirituels.

View File

@@ -16,6 +16,11 @@ screenshot.invalid = Peta terlalu besar, tidak cukp memori untuk menangkap layar
gameover = Permainan Habis gameover = Permainan Habis
gameover.pvp = Tim[accent] {0}[] menang! gameover.pvp = Tim[accent] {0}[] menang!
highscore = [accent]Rekor Baru! highscore = [accent]Rekor Baru!
load.sound = Sounds
load.map = Maps
load.image = Images
load.content = Content
load.system = System
stat.wave = Gelombang Terkalahkan:[accent] {0} stat.wave = Gelombang Terkalahkan:[accent] {0}
stat.enemiesDestroyed = Musuh Terhancurkan:[accent] {0} stat.enemiesDestroyed = Musuh Terhancurkan:[accent] {0}
stat.built = Jumlah Blok yang Dibangun:[accent] {0} stat.built = Jumlah Blok yang Dibangun:[accent] {0}
@@ -23,8 +28,6 @@ stat.destroyed = Jumlah Blok Dihancurkan Musuh:[accent] {0}
stat.deconstructed = Jumlah Blok Dihancurkan Pemain:[accent] {0} stat.deconstructed = Jumlah Blok Dihancurkan Pemain:[accent] {0}
stat.delivered = Sumber Daya yang Diluncurkan: stat.delivered = Sumber Daya yang Diluncurkan:
stat.rank = Nilai Akhir: [accent]{0} stat.rank = Nilai Akhir: [accent]{0}
placeline = Anda telah memilih sebuah blok.\nAnda bisa[accent] menaruhnya berjejeran[] dengan[accent] menekan layar beberapa saat[] dan menarik jarimu ke arah yang dituju.\n\n[scarlet]Cobalah.
removearea = Anda telah memilih mode penghancuran.\nAnda bisa[accent] menghancurkan blok dalam sebuah kotak[] dengan[accent] menekan layar beberapa saat[] dan menarik jarimu sampai membentuk sebuah area.\n\n[scarlet]Cobalah.
launcheditems = [accent]Sumber Daya launcheditems = [accent]Sumber Daya
map.delete = Apakah Anda yakin ingin menghapus peta "[accent]{0}[]"? map.delete = Apakah Anda yakin ingin menghapus peta "[accent]{0}[]"?
level.highscore = Nilai Tertinggi: [accent]{0} level.highscore = Nilai Tertinggi: [accent]{0}
@@ -63,9 +66,11 @@ players.single = {0} pemain aktif
server.closing = [accent]Menutup server... server.closing = [accent]Menutup server...
server.kicked.kick = Anda telah dikeluarkan dari server! server.kicked.kick = Anda telah dikeluarkan dari server!
server.kicked.serverClose = Server ditutup. server.kicked.serverClose = Server ditutup.
server.kicked.vote = You have been vote-kicked. Goodbye.
server.kicked.clientOutdated = Client kadaluarsa! perbarui permainan Anda! server.kicked.clientOutdated = Client kadaluarsa! perbarui permainan Anda!
server.kicked.serverOutdated = Server kadaluarsa! Tanya host untuk diperbarui! server.kicked.serverOutdated = Server kadaluarsa! Tanya host untuk diperbarui!
server.kicked.banned = Anda telah dilarang untuk memasuki server ini. server.kicked.banned = Anda telah dilarang untuk memasuki server ini.
server.kicked.typeMismatch = This server is not compatible with your build type.
server.kicked.recentKick = Anda baru saja dikeluarkan dari server ini.\nTunggu sebelum masuk lagi. server.kicked.recentKick = Anda baru saja dikeluarkan dari server ini.\nTunggu sebelum masuk lagi.
server.kicked.nameInUse = Sudah ada pemain dengan nama itu \ndi server ini. server.kicked.nameInUse = Sudah ada pemain dengan nama itu \ndi server ini.
server.kicked.nameEmpty = Nama yang dipilih tidak valid. server.kicked.nameEmpty = Nama yang dipilih tidak valid.
@@ -156,6 +161,11 @@ cancel = Batal
openlink = Buka Tautan openlink = Buka Tautan
copylink = Salin Tautan copylink = Salin Tautan
back = Kembali back = Kembali
data.export = Export Data
data.import = Import Data
data.exported = Data exported.
data.invalid = This isn't valid game data.
data.import.confirm = Importing external data will erase[scarlet] all[] your current game data.\n[accent]This cannot be undone![]\n\nOnce the data is imported, your game will exit immediately.
classic.export = Export Classic Data classic.export = Export Classic Data
classic.export.text = [accent]Mindustry[] has just had a major update.\nClassic (v3.5 build 40) save or map data has been detected. Would you like to export these saves to your phone's home folder, for use in the Mindustry Classic app? classic.export.text = [accent]Mindustry[] has just had a major update.\nClassic (v3.5 build 40) save or map data has been detected. Would you like to export these saves to your phone's home folder, for use in the Mindustry Classic app?
quit.confirm = Apakah Anda yakin ingin keluar? quit.confirm = Apakah Anda yakin ingin keluar?
@@ -376,6 +386,7 @@ zone.fungalPass.description = A transition area between high mountains and lower
zone.impact0078.description = <insert description here> zone.impact0078.description = <insert description here>
zone.crags.description = <insert description here> zone.crags.description = <insert description here>
settings.language = Bahasa settings.language = Bahasa
settings.data = Game Data
settings.reset = Atur ulang ke Default (standar) settings.reset = Atur ulang ke Default (standar)
settings.rebind = Rebind settings.rebind = Rebind
settings.controls = Kontrol settings.controls = Kontrol
@@ -507,6 +518,7 @@ setting.mutemusic.name = Diamkan Musik
setting.sfxvol.name = Volume SFX setting.sfxvol.name = Volume SFX
setting.mutesound.name = Diamkan Suara setting.mutesound.name = Diamkan Suara
setting.crashreport.name = Laporkan Masalah setting.crashreport.name = Laporkan Masalah
setting.savecreate.name = Auto-Create Saves
setting.chatopacity.name = Jelas-Beningnya Chat setting.chatopacity.name = Jelas-Beningnya Chat
setting.playerchat.name = Tunjukkan Chat dalam Permainan setting.playerchat.name = Tunjukkan Chat dalam Permainan
uiscale.reset = UI scale has been changed.\nPress "OK" to confirm this scale.\n[scarlet]Reverting and exiting in[accent] {0}[] settings... uiscale.reset = UI scale has been changed.\nPress "OK" to confirm this scale.\n[scarlet]Reverting and exiting in[accent] {0}[] settings...
@@ -527,6 +539,7 @@ keybind.press.axis = Tekan sumbu atau kunci...
keybind.screenshot.name = Tangkapan Layar Peta keybind.screenshot.name = Tangkapan Layar Peta
keybind.move_x.name = Pindah x keybind.move_x.name = Pindah x
keybind.move_y.name = Pindah y keybind.move_y.name = Pindah y
keybind.fullscreen.name = Toggle Fullscreen
keybind.select.name = Pilih/Tembak keybind.select.name = Pilih/Tembak
keybind.diagonal_placement.name = Penaruhan Diagonal keybind.diagonal_placement.name = Penaruhan Diagonal
keybind.pick.name = Memilih Blok keybind.pick.name = Memilih Blok
@@ -790,6 +803,7 @@ block.blast-mixer.name = Mixer Peledak
block.solar-panel.name = Panel Surya block.solar-panel.name = Panel Surya
block.solar-panel-large.name = Panel Surya Besar block.solar-panel-large.name = Panel Surya Besar
block.oil-extractor.name = Pegekstrak Oli block.oil-extractor.name = Pegekstrak Oli
block.command-center.name = Command Center
block.draug-factory.name = Draug Miner Drone Factory block.draug-factory.name = Draug Miner Drone Factory
block.spirit-factory.name = Pabrik Drone Spirit block.spirit-factory.name = Pabrik Drone Spirit
block.phantom-factory.name = Pabrik Drone Phantom block.phantom-factory.name = Pabrik Drone Phantom
@@ -1012,6 +1026,7 @@ block.ripple.description = Menara meriam besar yang menembak beberapa peluru sek
block.cyclone.description = Menara Penembak Beruntun Besar. block.cyclone.description = Menara Penembak Beruntun Besar.
block.spectre.description = Menara besar yang menembak dua peluru kuat sekaligus. block.spectre.description = Menara besar yang menembak dua peluru kuat sekaligus.
block.meltdown.description = Menara besar ini menembak sinar panjang yang kuat. block.meltdown.description = Menara besar ini menembak sinar panjang yang kuat.
block.command-center.description = Issues movement commands to allied units across the map.\nCauses units to patrol, attack an enemy core or retreat to the core/factory. When no enemy core is present, units will default to patrolling under the attack command.
block.draug-factory.description = Produces Draug mining drones. block.draug-factory.description = Produces Draug mining drones.
block.spirit-factory.description = Memproduksi drone ringan yang menambang sumber daya dan memulih blok. block.spirit-factory.description = Memproduksi drone ringan yang menambang sumber daya dan memulih blok.
block.phantom-factory.description = Memproduksi drone canggih yang lebih efektif dibandingkan drone spirit. block.phantom-factory.description = Memproduksi drone canggih yang lebih efektif dibandingkan drone spirit.

View File

@@ -1,10 +1,10 @@
credits.text = Creato da [ROYAL]Anuken[] - [SKY]anukendev@gmail.com[]\n\n[GRAY](Nel caso non te ne sia accorto, la traduzione del gioco non è completa.\n Chi di dovere sta lavorando più velocemente possibile per completarla! Un aiutino non sarebbe male!) credits.text = Creato da [ROYAL]Anuken[] - [SKY]anukendev@gmail.com[]\n\n[GRAY](Nel caso non te ne sia accorto, la traduzione del gioco non è completa.\n Chi di dovere sta lavorando più velocemente possibile per completarla! Un aiutino non sarebbe male!)
credits = Crediti credits = Crediti
contributors = Translators and Contributors contributors = Traduttori e Contributori
discord = Unisciti sul server discord di mindustry! discord = Entra nel server discord di mindustry!
link.discord.description = la chatroom ufficiale del server discord di Mindustry link.discord.description = la chatroom ufficiale del server discord di Mindustry
link.github.description = Codice sorgente del gioco link.github.description = Codice sorgente del gioco
link.changelog.description = List of update changes link.changelog.description = Elenco delle modifiche del gioco
link.dev-builds.description = Build di sviluppo versioni instabili link.dev-builds.description = Build di sviluppo versioni instabili
link.trello.description = Scheda ufficiale trello per funzionalità pianificate link.trello.description = Scheda ufficiale trello per funzionalità pianificate
link.itch.io.description = pagina di itch.io con download per PC e versione web link.itch.io.description = pagina di itch.io con download per PC e versione web
@@ -156,19 +156,19 @@ cancel = Annulla
openlink = Apri Link openlink = Apri Link
copylink = Copia link copylink = Copia link
back = Indietro back = Indietro
classic.export = Export Classic Data classic.export = Esporta dati classici
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[] ha appena rilasciato un aggiornamento importante.\nSalvataggio Classic (v3.5 build 40) o dati delle mappe è stato ritrovato. Vorresti esportare questi salvatagggi sul tuo telefono per usarli nella Mindustry Classic app?
quit.confirm = Sei sicuro di voler uscire? quit.confirm = Sei sicuro di voler uscire?
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 = Sei sicuro di sapere cosa stai facendo? Il tutorial può essere ripetuto in[accent] Impostazioni->Gioco->Ripeti il tutorial.[]
loading = [accent]Caricamento in corso ... loading = [accent]Caricamento in corso ...
saving = [accent]Salvando . . . saving = [accent]Salvando . . .
wave = [accent]Ondata {0} wave = [accent]Ondata {0}
wave.waiting = Ondata in {0} wave.waiting = Ondata in {0}
wave.waveInProgress = [LIGHT_GRAY]Wave in progress wave.waveInProgress = [LIGHT_GRAY]Ondata in corso...
waiting = In attesa... waiting = In attesa...
waiting.players = Waiting for players... waiting.players = Aspettando giocatori...
wave.enemies = [LIGHT_GRAY]{0} Enemies Remaining wave.enemies = [LIGHT_GRAY]{0} Nemici Rimasti
wave.enemy = [LIGHT_GRAY]{0} Enemy Remaining wave.enemy = [LIGHT_GRAY]{0} Nemico Rimasto
loadimage = Carica immagine loadimage = Carica immagine
saveimage = Salva Immagine saveimage = Salva Immagine
unknown = Sconosciuto unknown = Sconosciuto
@@ -188,10 +188,10 @@ editor.mapinfo = Informazioni mappa
editor.author = Autore: editor.author = Autore:
editor.description = Descrizione: editor.description = Descrizione:
editor.waves = Ondate: editor.waves = Ondate:
editor.rules = Rules: editor.rules = Regole:
editor.generation = Generation: editor.generation = Generazione:
editor.ingame = Edit In-Game editor.ingame = Modifica in gioco
editor.newmap = New Map editor.newmap = Nuova mappa
waves.title = Ondate waves.title = Ondate
waves.remove = Rimuovi waves.remove = Rimuovi
waves.never = <mai> waves.never = <mai>
@@ -206,18 +206,18 @@ waves.copy = Copia negli appunti
waves.load = Caica dagli appunti waves.load = Caica dagli appunti
waves.invalid = Onde dagli appunti non valide. waves.invalid = Onde dagli appunti non valide.
waves.copied = Onde copiate. waves.copied = Onde copiate.
waves.none = No enemies defined.\nNote that empty wave layouts will automatically be replaced with the default layout. waves.none = Nessun nemico definiti.\n Nota che le disposizioni di ondate vuote verranno automaticamente rimpiazzate con la disposizione predefinita.
editor.default = [LIGHT_GRAY]<Predefinito> editor.default = [LIGHT_GRAY]<Predefinito>
edit = Modifica... edit = Modifica...
editor.name = Nome: editor.name = Nome:
editor.spawn = Spawn Unit editor.spawn = Piazza un'unità
editor.removeunit = Remove Unit editor.removeunit = Rimuovi un'unità
editor.teams = Squadre editor.teams = Squadre
editor.errorload = Errore nel caricamento di:\n[accent]{0} editor.errorload = Errore nel caricamento di:\n[accent]{0}
editor.errorsave = Errore nel salvataggio di:\n[accent]{0} editor.errorsave = Errore nel salvataggio di:\n[accent]{0}
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 = Quella è un'immagine, non una mappa. Non cambiare estensioni sperando che funzioni.\n\n Se vuoi importare una mappa vecchia clicca su "importa una mappa vecchia" nell'editor.
editor.errorlegacy = This map is too old, and uses a legacy map format that is no longer supported. editor.errorlegacy = La mappa è troppo vecchia e usa un formato che non è più supportato.
editor.errorheader = This map file is either not valid or corrupt. editor.errorheader = Questo file della mappa è invalido o corrotto.
editor.errorname = Questa mappa è senza nome. editor.errorname = Questa mappa è senza nome.
editor.update = Aggiorna editor.update = Aggiorna
editor.randomize = Casualizza editor.randomize = Casualizza
@@ -250,56 +250,56 @@ editor.mapname = Nome Mappa:
editor.overwrite = [Accent]Attenzione!\nQuesto sovrascrive una mappa esistente. editor.overwrite = [Accent]Attenzione!\nQuesto sovrascrive una mappa esistente.
editor.overwrite.confirm = [scarlet]Attenzione![] Una mappa con questo nome esiste già. Sei sicuro di volerla sovrascrivere? editor.overwrite.confirm = [scarlet]Attenzione![] Una mappa con questo nome esiste già. Sei sicuro di volerla sovrascrivere?
editor.selectmap = Seleziona una mappa da caricare: editor.selectmap = Seleziona una mappa da caricare:
toolmode.replace = Replace toolmode.replace = Rimpiazzare
toolmode.replace.description = Draws only on solid blocks. toolmode.replace.description = Disegna solo su blocchi solidi.
toolmode.replaceall = Replace All toolmode.replaceall = Rimpiazzare tutto
toolmode.replaceall.description = Replace all blocks in map. toolmode.replaceall.description = Rimpiazza tutti i blocchi nella mappa
toolmode.orthogonal = Orthogonal toolmode.orthogonal = Ortogonale
toolmode.orthogonal.description = Draws only orthogonal lines. toolmode.orthogonal.description = Disegna solo linee ortogonali
toolmode.square = Square toolmode.square = Quadrato
toolmode.square.description = Square brush. toolmode.square.description = Pennello quadrato
toolmode.eraseores = Erase Ores toolmode.eraseores = Rimuovi Minerali
toolmode.eraseores.description = Erase only ores. toolmode.eraseores.description = Rimuove solo minerali
toolmode.fillteams = Fill Teams toolmode.fillteams = Riempi squadre
toolmode.fillteams.description = Fill teams instead of blocks. toolmode.fillteams.description = Riempe squadre al posto di blocchi
toolmode.drawteams = Draw Teams toolmode.drawteams = Disegna squadre
toolmode.drawteams.description = Draw teams instead of blocks. toolmode.drawteams.description = Disegna squadre al posto di blocchi
filters.empty = [LIGHT_GRAY]No filters! Add one with the button below. filters.empty = [LIGHT_GRAY]Nessun filtro! Aggiungi uno cliccando il tasto sotto.
filter.distort = Modifica filter.distort = Modifica
filter.noise = Interferenza filter.noise = Interferenza
filter.median = Median filter.median = Mediana
filter.oremedian = Ore Median filter.oremedian = Mediana Minerali
filter.blend = Blend filter.blend = Miscela
filter.defaultores = Default Ores filter.defaultores = Minerali predefiniti
filter.ore = Minerali filter.ore = Minerali
filter.rivernoise = Interferenze a fiume filter.rivernoise = Interferenze a fiume
filter.mirror = Mirror filter.mirror = Specchia
filter.clear = Clear filter.clear = Resetta il filtro
filter.option.ignore = Ignore filter.option.ignore = Ignora
filter.scatter = Dispersione filter.scatter = Dispersione
filter.terrain = Terreno filter.terrain = Terreno
filter.option.scale = Scala filter.option.scale = Scala
filter.option.chance = Probabilità filter.option.chance = Probabilità
filter.option.mag = Magnitudine filter.option.mag = Magnitudine
filter.option.threshold = Threshold filter.option.threshold = Soglia
filter.option.circle-scale = Circle Scale filter.option.circle-scale = Modifica grandezza cerchio
filter.option.octaves = Octaves filter.option.octaves = Ottavi
filter.option.falloff = Falloff filter.option.falloff = Cadere
filter.option.angle = Angle filter.option.angle = Angolo
filter.option.block = Block filter.option.block = Blocco
filter.option.floor = Floor filter.option.floor = Pavimento
filter.option.flooronto = Target Floor filter.option.flooronto = Pavimento mirato
filter.option.wall = Wall filter.option.wall = Muro
filter.option.ore = Ore filter.option.ore = Minerale
filter.option.floor2 = Secondary Floor filter.option.floor2 = Pavimento secondario
filter.option.threshold2 = Secondary Threshold filter.option.threshold2 = Soglia secondaria
filter.option.radius = Radius filter.option.radius = Raggio
filter.option.percentile = Percentile filter.option.percentile = percentuale
width = Larghezza: width = Larghezza:
height = Altezza: height = Altezza:
menu = Menu menu = Menu
play = Gioca play = Gioca
campaign = Campaign campaign = Campagna
load = Carica load = Carica
save = Salva save = Salva
fps = FPS: {0} fps = FPS: {0}
@@ -308,148 +308,148 @@ ping = Ping: {0}ms
language.restart = Riavvia il gioco affinché il cambiamento della lingua abbia effetto. language.restart = Riavvia il gioco affinché il cambiamento della lingua abbia effetto.
settings = Impostazioni settings = Impostazioni
tutorial = Tutorial tutorial = Tutorial
tutorial.retake = Re-Take Tutorial tutorial.retake = Ripeti il tutorial
editor = Editor editor = Editor
mapeditor = Editor Mappe mapeditor = Editor Mappe
donate = Dona donate = Dona
abandon = Abandon abandon = Abbandona
abandon.text = This zone and all its resources will be lost to the enemy. abandon.text = Questa zona e tutte le sue risorse saranno perdute e passeranno al nemico.
locked = Locked locked = Bloccato
complete = [LIGHT_GRAY]Complete: complete = [LIGHT_GRAY]Completato:
zone.requirement = Wave {0} in zone {1} zone.requirement = Onda {0} in zona {1}
resume = Resume Zone:\n[LIGHT_GRAY]{0} resume = Riprendi zona:\n[LIGHT_GRAY]{0}
bestwave = [LIGHT_GRAY]Best: {0} bestwave = [LIGHT_GRAY]Migliore: {0}
launch = Launch launch = Decollare
launch.title = Launch Successful launch.title = Decollo riuscito!
launch.next = [LIGHT_GRAY]next opportunity at wave {0} launch.next = [LIGHT_GRAY]Nuova opportunità all'ondata {0}
launch.unable2 = [scarlet]Unable to LAUNCH.[] launch.unable2 = [scarlet]Decollo FALLITO![]
launch.confirm = This will launch all resources in your core.\nYou will not be able to return to this base. launch.confirm = Questo trasporterà tutte le risorse nel tuo nucleo.\nNon riuscirai a ritornare in questa base.
launch.skip.confirm = If you skip now, you will not be able to launch until later waves. launch.skip.confirm = Se salti adesso non riuscirai a decollare fino alle onde sucessive
uncover = Uncover uncover = Svlare
configure = Configure Loadout configure = Configura l'equipaggio
configure.locked = [LIGHT_GRAY]Reach wave {0}\nto configure loadout. configure.locked = [LIGHT_GRAY]Arriva all'ondata {0}\nper configurare l'equipaggiamento.
zone.unlocked = [LIGHT_GRAY]{0} unlocked. zone.unlocked = [LIGHT_GRAY]{0} sbloccata.
zone.requirement.complete = Wave {0} reached:\n{1} zone requirements met. zone.requirement.complete = Ondata {0} raggiunta:\n{1} requisiti di zona soddisfatti.
zone.config.complete = Wave {0} reached:\nLoadout config unlocked. zone.config.complete = Ondata {0} reached:\nLoadout config unlocked.
zone.resources = Resources Detected: zone.resources = Risorse trovate:
zone.objective = [lightgray]Objective: [accent]{0} zone.objective = [lightgray]Obiettivo: [accent]{0}
zone.objective.survival = Survive zone.objective.survival = Sopravvivere
zone.objective.attack = Destroy Enemy Core zone.objective.attack = Distruggere il nucleo nemico
add = Add... add = Aggiungi...
boss.health = Boss Health boss.health = Vita del Boss
connectfail = [crimson] Impossibile connettersi al server: [accent] {0} connectfail = [crimson] Impossibile connettersi al server: [accent] {0}
error.unreachable = Server unreachable. error.unreachable = Server irraggiungibile
error.invalidaddress = Invalid address. error.invalidaddress = Indirizzo invalido.
error.timedout = Timed out!\nMake sure the host has port forwarding set up, and that the address is correct! error.timedout = Timeout!\n Assicurati che l'host abbia il port forwarding impostato e che l'indirizzo sia corretto!
error.mismatch = Packet error:\npossible client/server version mismatch.\nMake sure you and the host have the latest version of Mindustry! error.mismatch = Errore pacchetti:\nPossibile discordanza della versione client / server.\n Assicurati che tu e l'host possiediate l'ultima versione di Mindustry!
error.alreadyconnected = Already connected. error.alreadyconnected = Già connesso.
error.mapnotfound = Map file not found! error.mapnotfound = Mappa non trovata
error.io = Network I/O error. error.io = Errore I/O di rete.
error.any = Unkown network error. error.any = Errore di rete sconosciuto.
error.bloom = Failed to initialize bloom.\nYour device may not support it. error.bloom = Failed to initialize bloom.\nYour device may not support it.
zone.groundZero.name = Ground Zero zone.groundZero.name = Terreno Zero
zone.desertWastes.name = Desert Wastes zone.desertWastes.name = Rifiuti Desertici
zone.craters.name = The Craters zone.craters.name = Crateri
zone.frozenForest.name = Frozen Forest zone.frozenForest.name = Foresta Ghiacciata
zone.ruinousShores.name = Ruinous Shores zone.ruinousShores.name = Spiaggie in Rovina
zone.stainedMountains.name = Stained Mountains zone.stainedMountains.name = Montagne Macchiate
zone.desolateRift.name = Desolate Rift zone.desolateRift.name = Spaccatura Desolata
zone.nuclearComplex.name = Nuclear Production Complex zone.nuclearComplex.name = Complesso di Produzione Nucleare
zone.overgrowth.name = Overgrowth zone.overgrowth.name = Crescita Eccessiva
zone.tarFields.name = Tar Fields zone.tarFields.name = Campi di Catrame
zone.saltFlats.name = Salt Flats zone.saltFlats.name = Saline
zone.impact0078.name = Impact 0078 zone.impact0078.name = Impatto 0078
zone.crags.name = Crags zone.crags.name = Dirupi
zone.fungalPass.name = Fungal Pass zone.fungalPass.name = Passaggio Fungoso
zone.groundZero.description = The optimal location to begin once more. Low enemy threat. Few resources.\nGather as much lead and copper as possible.\nMove on. zone.groundZero.description = La posizione ottimale per cominciare. Bassa minaccia nemica. Poche risorse.\nRaccogli quanto più piombo e rame possibile.\nProcedi.
zone.frozenForest.description = Even here, closer to mountains, the spores have spread. The fridgid temperatures cannot contain them forever.\n\nBegin the venture into power. Build combustion generators. Learn to use menders. zone.frozenForest.description = Anche qui, più vicino alle montagne, le spore si sono diffuse. Le temperature rigide non possono contenerle per sempre.\n Inizia la scoperta dell'energia. Costruisci generatori di combustione. Impara a usare i riparatori.
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 = Questi rifiuti sono vasti, imprevedibili e attraversati da strutture settoriali abbandonate.\n\nIl carbone è presente nella regione. Bruciatelo per ottenere energia o sintetizzate la grafite.\n\n[lightgray]Questa posizione di atterraggio non può essere garantita.
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 = Alle periferie del deserto si trovano le saline. Poche risorse possono essere trovate in questa posizione.\n\nIl nemico ha eretto un complesso di archiviazione delle risorse qui. Sradicare il loro nucleo. Non lasciare nulla in piedi.
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 = L'acqua si è accumulata in questo cratere, reliquia delle vecchie guerre. Recupera l'area. Raccogli la sabbia. Fondi il metaglass. Pompa l'acqua per raffreddare torrette e trapani.
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 = Oltre i rifiuti, c'è il litorale. Una volta, questa posizione ospitava una schiera di difesa costiera. Non rimane molto. Solo le strutture di difesa più elementari sono rimaste incolume, tutto il resto ridotto a rottami.\nContinua l'espansione verso l'esterno. Riscopri la tecnologia.
zone.stainedMountains.description = Further inland lie the mountains, yet untainted by spores.\nExtract the abundant titanium in this area. Learn how to use it.\n\nThe enemy presence is greater here. Do not give them time to send their strongest units. zone.stainedMountains.description = Più nell'entroterra si trovano le montagne, non ancora contaminate da spore.\nEstrai l'abbondante titanio in questa zona. Scopri come usarlo.\n\nLa presenza del nemico è maggiore qui. Non dare loro il tempo di inviare le loro unità più forti.
zone.overgrowth.description = This area is overgrown, closer to the source of the spores.\nThe enemy has established an outpost here. Build dagger units. Destroy it. Reclaim that which was lost. zone.overgrowth.description = Quest'area è invasa, più vicina alla fonte delle spore.\nIl nemico ha stabilito qui un avamposto. Costruisci unità col pugnale. Distruggilo. Riprenditi ciò che è stato perso.
zone.tarFields.description = The outskirts of an oil production zone, between the mountains and desert. One of the few areas with usable tar reserves.\nAlthough abandoned, this area has some dangerous enemy forces nearby. Do not underestimate them.\n\n[lightgray]Research oil processing technology if possible. zone.tarFields.description = La periferia di una zona di produzione di petrolio, tra le montagne e il deserto. Una delle poche aree con riserve di catrame utilizzabili.\nAnche se abbandonata, questa zona ha alcune pericolose forze nemiche nelle vicinanze. Non sottovalutarlo.\n\n[lightgray]Ricerca la tecnologia di lavorazione dell'olio, se possibile.
zone.desolateRift.description = An extremely dangerous zone. Plentiful resources, but little space. High risk of destruction. Leave as soon as possible. Do not be fooled by the long spacing between enemy attacks. zone.desolateRift.description = Una zona estremamente pericolosa. Risorse abbondanti, ma poco spazio. Alto rischio di distruzione. Lascia il prima possibile. Non lasciarti ingannare dalla lunga distanza tra gli attacchi nemici.
zone.nuclearComplex.description = A former facility for the production and processing of thorium, reduced to ruins.\n[lightgray]Research the thorium and its many uses.\n\nThe enemy is present here in great numbers, constantly scouting for attackers. zone.nuclearComplex.description = Un ex impianto per la produzione e la lavorazione del torio, ridotto in rovina.\n[lightgray] Ricerca il torio e i suoi numerosi usi.\n\nIl nemico è presente qui in gran numero, alla costante ricerca di aggressori.
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 = Un'area di transizione tra alte montagne e terre più basse, piene di spore. Qui si trova una piccola base di ricognizione nemica.\nDistruggila.\nUsa le unità Pugnale e Strisciatore. Elimina i due nuclei.
zone.impact0078.description = <insert description here> zone.impact0078.description = <inserisci descrizione>
zone.crags.description = <insert description here> zone.crags.description = <inserisci descrizione>
settings.language = Lingua settings.language = Lingua
settings.reset = Resetta Alle Impostazioni Predefinite settings.reset = Resetta Alle Impostazioni Predefinite
settings.rebind = Reimposta settings.rebind = Reimposta
settings.controls = Controlli settings.controls = Controlli
settings.game = Gioco settings.game = Gioco
settings.sound = Suono settings.sound = Suoni
settings.graphics = Grafica settings.graphics = Grafica
settings.cleardata = Clear Game Data... settings.cleardata = Cancella dati di gioco...
settings.clear.confirm = Are you sure you want to clear this data?\nWhat is done cannot be undone! settings.clear.confirm = Sei sicuro di voler cancellare i dati?\nNon può essere annullato!
settings.clearall.confirm = [scarlet]WARNING![]\nThis will clear all data, including saves, maps, unlocks and keybinds.\nOnce you press 'ok' the game will wipe all data and automatically exit. settings.clearall.confirm = [scarlet]ATTENZIONE![]\nQuesto cancellerà tutti i dati, includendo salvataggi, mappe, oggetti sbloccati, impostazioni.\nDopo aver premuto su 'ok' il gioco eliminerà i dati e si chiuderà.
settings.clearunlocks = Clear Unlocks settings.clearunlocks = Cancella oggetti sbloccati
settings.clearall = Clear All settings.clearall = Cancella tutto
paused = In pausa paused = In pausa
yes = Si yes = Si
no = No no = No
info.title = [accent] Info info.title = [accent] Info
error.title = [crimson]Si è verificato un errore error.title = [crimson]Si è verificato un errore
error.crashtitle = Si è verificato un errore error.crashtitle = Si è verificato un errore
attackpvponly = [scarlet]Only available in Attack/PvP modes attackpvponly = [scarlet]Solo possible nelle modalità Attacco/PvP
blocks.input = Input blocks.input = Ingresso
blocks.output = Output blocks.output = Uscita
blocks.booster = Booster blocks.booster = Booster
block.unknown = [LIGHT_GRAY]??? block.unknown = [LIGHT_GRAY]???
blocks.powercapacity = Capacità Energetica blocks.powercapacity = Capacità Energetica
blocks.powershot = Danno/Colpo blocks.powershot = Danno/Colpo
blocks.damage = Damage blocks.damage = Danno
blocks.targetsair = Attacca nemici aerei blocks.targetsair = Attacca nemici aerei
blocks.targetsground = Targets Ground blocks.targetsground = Attacca nemici terreni
blocks.itemsmoved = Move Speed blocks.itemsmoved = Velocità movimento
blocks.launchtime = Time Between Launches blocks.launchtime = Tempo fra decolli
blocks.shootrange = Raggio blocks.shootrange = Raggio
blocks.size = Grandezza blocks.size = Grandezza
blocks.liquidcapacity = Capacità del liquido blocks.liquidcapacity = Capacità del liquido
blocks.powerrange = Raggio Energia blocks.powerrange = Raggio Energia
blocks.poweruse = Utilizzo energia blocks.poweruse = Utilizzo energia
blocks.powerdamage = Power/Damage blocks.powerdamage = Energia/Danno
blocks.itemcapacity = Capacità blocks.itemcapacity = Capacità
blocks.basepowergeneration = Base Power Generation blocks.basepowergeneration = Generazione energia di base
blocks.productiontime = Production Time blocks.productiontime = Tempo produzione
blocks.repairtime = Block Full Repair Time blocks.repairtime = Tempo di riparo completo
blocks.speedincrease = Speed Increase blocks.speedincrease = Aumento Velocità
blocks.range = Range blocks.range = Raggio
blocks.drilltier = Scavabili blocks.drilltier = Scavabili
blocks.drillspeed = Velocità scavo stbile blocks.drillspeed = Velocità scavo stbile
blocks.boosteffect = Boost Effect blocks.boosteffect = Effetto boost
blocks.maxunits = Max Active Units blocks.maxunits = Unità attive max
blocks.health = Salute blocks.health = Salute
blocks.buildtime = Build Time blocks.buildtime = Tempo costruzione
blocks.inaccuracy = Inaccuratezza blocks.inaccuracy = Inaccuratezza
blocks.shots = Colpi blocks.shots = Colpi
blocks.reload = Ricarica blocks.reload = Ricarica
blocks.ammo = Ammo blocks.ammo = Munizioni
bar.drilltierreq = Better Drill Required bar.drilltierreq = Migliore trapano richiesto
bar.drillspeed = Drill Speed: {0}/s bar.drillspeed = Velocità scavo: {0}/s
bar.efficiency = Efficiency: {0}% bar.efficiency = Efficienza: {0}%
bar.powerbalance = Power: {0} bar.powerbalance = Energia: {0}
bar.poweramount = Power: {0} bar.poweramount = Energia: {0}
bar.poweroutput = Power Output: {0} bar.poweroutput = Energia in uscita: {0}
bar.items = Items: {0} bar.items = Oggetti: {0}
bar.liquid = Liquid bar.liquid = Liquido
bar.heat = Heat bar.heat = Calore
bar.power = Power bar.power = Energia
bar.progress = Build Progress bar.progress = Progresso della costruzione
bar.spawned = Units: {0}/{1} bar.spawned = Unità: {0}/{1}
bullet.damage = [stat]{0}[lightgray] dmg bullet.damage = [stat]{0}[lightgray] danno
bullet.splashdamage = [stat]{0}[lightgray] area dmg ~[stat] {1}[lightgray] tiles bullet.splashdamage = [stat]{0}[lightgray] danno ad area ~[stat] {1}[lightgray] blocchi
bullet.incendiary = [stat]incendiary bullet.incendiary = [stat]incendiario
bullet.homing = [stat]homing bullet.homing = [stat]autoguidato
bullet.shock = [stat]shock bullet.shock = [stat]shock
bullet.frag = [stat]frag bullet.frag = [stat]frammentazione
bullet.knockback = [stat]{0}[lightgray] knockback bullet.knockback = [stat]{0}[lightgray] contraccolpo
bullet.freezing = [stat]freezing bullet.freezing = [stat]congelamento
bullet.tarred = [stat]tarred bullet.tarred = [stat]asfaltata
bullet.multiplier = [stat]{0}[lightgray]x ammo multiplier bullet.multiplier = [stat]{0}[lightgray]x moltiplicatore munizioni
bullet.reload = [stat]{0}[lightgray]x reload bullet.reload = [stat]{0}[lightgray]x ricarica
unit.blocks = blocchi unit.blocks = blocchi
unit.powersecond = unità energia/secondo unit.powersecond = unità energia/secondo
unit.liquidsecond = unità liquide/secondo unit.liquidsecond = unità liquide/secondo
@@ -459,7 +459,7 @@ unit.powerunits = unità energia
unit.degrees = gradi unit.degrees = gradi
unit.seconds = secondi unit.seconds = secondi
unit.persecond = /sec unit.persecond = /sec
unit.timesspeed = x speed unit.timesspeed = x velocità
unit.percent = % unit.percent = %
unit.items = oggetti unit.items = oggetti
category.general = Generali category.general = Generali
@@ -468,26 +468,26 @@ category.liquids = Liquidi
category.items = Oggetti category.items = Oggetti
category.crafting = Produzione category.crafting = Produzione
category.shooting = Potenza di fuoco category.shooting = Potenza di fuoco
category.optional = Optional Enhancements category.optional = Miglioramenti Opzionali
setting.landscape.name = Lock Landscape setting.landscape.name = Blocca paesaggio
setting.shadows.name = Shadows setting.shadows.name = Ombre
setting.linear.name = Linear Filtering setting.linear.name = Filtro lineare
setting.animatedwater.name = Animated Water setting.animatedwater.name = Acqua animata
setting.animatedshields.name = Animated Shields setting.animatedshields.name = Scudi animati
setting.antialias.name = Antialias[LIGHT_GRAY] (requires restart)[] setting.antialias.name = Antialias[LIGHT_GRAY] (richiede riapertura gioco)[]
setting.indicators.name = Ally Indicators setting.indicators.name = Indicatori Alleati
setting.autotarget.name = Auto-Target setting.autotarget.name = Mira automatica
setting.keyboard.name = Mouse+Keyboard Controls setting.keyboard.name = Controlli Mouse+Tastiera
setting.fpscap.name = Limite FPS setting.fpscap.name = Limite FPS
setting.fpscap.none = Niente setting.fpscap.none = Niente
setting.fpscap.text = {0} FPS setting.fpscap.text = {0} FPS
setting.uiscale.name = UI Scaling[lightgray] (require restart)[] setting.uiscale.name = Ridimensionamento dell'interfaccia utente[lightgray] (richiede riapertura gioco)[]
setting.swapdiagonal.name = Always Diagonal Placement setting.swapdiagonal.name = Posizionamento sempre diagonale
setting.difficulty.training = training setting.difficulty.training = formazione
setting.difficulty.easy = facile setting.difficulty.easy = facile
setting.difficulty.normal = medio setting.difficulty.normal = medio
setting.difficulty.hard = difficile setting.difficulty.hard = difficile
setting.difficulty.insane = folle setting.difficulty.insane = impossibile
setting.difficulty.name = Difficoltà: setting.difficulty.name = Difficoltà:
setting.screenshake.name = Movimento dello schermo setting.screenshake.name = Movimento dello schermo
setting.effects.name = Visualizza effetti setting.effects.name = Visualizza effetti
@@ -495,49 +495,49 @@ setting.sensitivity.name = Sensibilità del controller
setting.saveinterval.name = Intervallo di salvataggio automatico setting.saveinterval.name = Intervallo di salvataggio automatico
setting.seconds = {0} Secondi setting.seconds = {0} Secondi
setting.fullscreen.name = Schermo Intero setting.fullscreen.name = Schermo Intero
setting.borderlesswindow.name = Borderless Window[LIGHT_GRAY] (may require restart) setting.borderlesswindow.name = Schermo senza bordi[LIGHT_GRAY] (potrebbe richiedere riapertura gioco)
setting.fps.name = Mostra FPS setting.fps.name = Mostra FPS
setting.vsync.name = VSync setting.vsync.name = VSync
setting.lasers.name = Mostra Laser Energetici setting.lasers.name = Mostra Laser Energetici
setting.pixelate.name = Pixelate [LIGHT_GRAY](may decrease performance) setting.pixelate.name = Sfocare [LIGHT_GRAY](potrebbe ridure il rendimento)
setting.minimap.name = Mostra minimappa setting.minimap.name = Mostra minimappa
setting.musicvol.name = Volume Musica setting.musicvol.name = Volume Musica
setting.ambientvol.name = Ambient Volume setting.ambientvol.name = Volume Ambiente
setting.mutemusic.name = Silenzia musica setting.mutemusic.name = Silenzia musica
setting.sfxvol.name = Volume SFX setting.sfxvol.name = Volume Effetti
setting.mutesound.name = Togli suoni setting.mutesound.name = Togli suoni
setting.crashreport.name = Send Anonymous Crash Reports setting.crashreport.name = Invia rapporti sugli arresti anomali anonimamente
setting.chatopacity.name = Chat Opacity setting.chatopacity.name = Opacità chat
setting.playerchat.name = Display In-Game Chat setting.playerchat.name = Mostra Chat in-game
uiscale.reset = UI scale has been changed.\nPress "OK" to confirm this scale.\n[scarlet]Reverting and exiting in[accent] {0}[] settings... uiscale.reset = La scala dell'interfaccia utente è stata modificata.\nPremere "OK" per confermare questa scala.\n[scarlet] Ripristina ed esci dalle impostazioni [accent] {0}[] impostazioni...
uiscale.cancel = Cancel & Exit uiscale.cancel = Annulla e esci
setting.bloom.name = Bloom setting.bloom.name = Shaders
keybind.title = Configurazione Tasti keybind.title = Configurazione Tasti
keybinds.mobile = [scarlet]Most keybinds here are not functional on mobile. Only basic movement is supported. keybinds.mobile = [scarlet]La maggior parte dei keybind qui non sono funzionali sui dispositivi mobili. È supportato solo il movimento di base.
category.general.name = Generale category.general.name = Generale
category.view.name = Visualizzazione category.view.name = Visualizzazione
category.multiplayer.name = Multigiocatore category.multiplayer.name = Multigiocatore
command.attack = Attack command.attack = Attacca
command.retreat = Retreat command.retreat = Ritorna indietro
command.patrol = Patrol command.patrol = Guardia
keybind.gridMode.name = Block Select keybind.gridMode.name = Seleziona blocco
keybind.gridModeShift.name = Category Select keybind.gridModeShift.name = Seleziona categoria
keybind.press = Press a key... keybind.press = Premi un tasto...
keybind.press.axis = Press an axis or key... keybind.press.axis = Premi un'asse o un tasto...
keybind.screenshot.name = Map Screenshot keybind.screenshot.name = Screenshot della mappa
keybind.move_x.name = Sposta_x keybind.move_x.name = Sposta_x
keybind.move_y.name = Sposta_y keybind.move_y.name = Sposta_y
keybind.select.name = seleziona keybind.select.name = seleziona
keybind.diagonal_placement.name = Diagonal Placement keybind.diagonal_placement.name = Posizionamento diagonale
keybind.pick.name = Pick Block keybind.pick.name = Scegli Blocco
keybind.break_block.name = Break Block keybind.break_block.name = Rompi blocco
keybind.deselect.name = Deselect keybind.deselect.name = Deseleziona
keybind.shoot.name = spara keybind.shoot.name = spara
keybind.zoom_hold.name = zoom_hold keybind.zoom_hold.name = zoomma
keybind.zoom.name = zoom keybind.zoom.name = zoom
keybind.menu.name = menu keybind.menu.name = menu
keybind.pause.name = pausa keybind.pause.name = pausa
keybind.minimap.name = Minimap keybind.minimap.name = Minimappa
keybind.dash.name = Scatto keybind.dash.name = Scatto
keybind.chat.name = Chat keybind.chat.name = Chat
keybind.player_list.name = lista_giocatori keybind.player_list.name = lista_giocatori
@@ -550,66 +550,66 @@ keybind.chat_scroll.name = Scorri chat
keybind.drop_unit.name = droppa materiali keybind.drop_unit.name = droppa materiali
keybind.zoom_minimap.name = Zomma minimappa keybind.zoom_minimap.name = Zomma minimappa
mode.help.title = Descrizione delle modalità mode.help.title = Descrizione delle modalità
mode.survival.name = Survival mode.survival.name = Sopravvivenza
mode.survival.description = The normal mode. Limited resources and automatic incoming waves. mode.survival.description = La modalità normale. Risorse limitate e ondate in entrata automatiche.
mode.sandbox.name = Sandbox mode.sandbox.name = Sandbox
mode.sandbox.description = risorse infinite e nessun timer per le ondate. mode.sandbox.description = risorse infinite e nessun timer per le ondate.
mode.pvp.name = PvP mode.pvp.name = PvP
mode.pvp.description = fight against other players locally. mode.pvp.description = Lotta contro altri giocatori
mode.attack.name = Attack mode.attack.name = Attacco
mode.attack.description = No waves, with the goal to destroy the enemy base. mode.attack.description = Obiettivo: Distruggere la base nemica, non ci sono ondate
mode.custom = Custom Rules mode.custom = Regole customizzabili
rules.infiniteresources = Infinite Resources rules.infiniteresources = Risorse infinite
rules.wavetimer = Wave Timer rules.wavetimer = Timer ondate
rules.waves = Waves rules.waves = Ondate
rules.attack = Attack Mode rules.attack = Modalità attacco
rules.enemyCheat = Infinite AI Resources rules.enemyCheat = Infinite Risorse AI
rules.unitdrops = Unit Drops rules.unitdrops = Drops Unità
rules.unitbuildspeedmultiplier = Unit Creation Speed Multiplier rules.unitbuildspeedmultiplier = Moltiplicatore velocità costruzione unità
rules.unithealthmultiplier = Unit Health Multiplier rules.unithealthmultiplier = Moltiplicatore vita unità
rules.playerhealthmultiplier = Player Health Multiplier rules.playerhealthmultiplier = Moltiplicatore vita giocatore
rules.playerdamagemultiplier = Player Damage Multiplier rules.playerdamagemultiplier = Moltiplicatore danno giocatore
rules.unitdamagemultiplier = Unit Damage Multiplier rules.unitdamagemultiplier = Moltiplicatore danno unità
rules.enemycorebuildradius = Enemy Core No-Build Radius:[LIGHT_GRAY] (tiles) rules.enemycorebuildradius = Raggio dove non si può costruire attorno al nucleo nemico:[LIGHT_GRAY] (tiles)
rules.respawntime = Respawn Time:[LIGHT_GRAY] (sec) rules.respawntime = Tempo di rigeneratione:[LIGHT_GRAY] (sec)
rules.wavespacing = Wave Spacing:[LIGHT_GRAY] (sec) rules.wavespacing = Tempo fra ondate:[LIGHT_GRAY] (secondi)
rules.buildcostmultiplier = Build Cost Multiplier rules.buildcostmultiplier = Moltiplicatore costo costruzione
rules.buildspeedmultiplier = Build Speed Multiplier rules.buildspeedmultiplier = Moltiplicatore velocità costruzione
rules.waitForWaveToEnd = Waves wait for enemies rules.waitForWaveToEnd = Ondate aspettano fino a quando l'ondata precedente finisce
rules.dropzoneradius = Drop Zone Radius:[LIGHT_GRAY] (tiles) rules.dropzoneradius = Raggio di drop:[LIGHT_GRAY] (blocchi)
rules.respawns = Max respawns per wave rules.respawns = Massimo di rigenerazioni per ondata
rules.limitedRespawns = Limit Respawns rules.limitedRespawns = Limite rigenerazioni
rules.title.waves = Waves rules.title.waves = Ondate
rules.title.respawns = Respawns rules.title.respawns = Rigenerazioni
rules.title.resourcesbuilding = Resources & Building rules.title.resourcesbuilding = Risorse e costruzioni
rules.title.player = Players rules.title.player = Giocatori
rules.title.enemy = Enemies rules.title.enemy = Nemici
rules.title.unit = Units rules.title.unit = Unità
content.item.name = Oggetti content.item.name = Oggetti
content.liquid.name = Liquidi content.liquid.name = Liquidi
content.unit.name = Units content.unit.name = Unità
content.block.name = Blocks content.block.name = Blocchi
content.mech.name = Mech content.mech.name = Mechs
item.copper.name = Rame item.copper.name = Rame
item.lead.name = Piombo item.lead.name = Piombo
item.coal.name = carbone item.coal.name = Carbone
item.graphite.name = Graphite item.graphite.name = Graphite
item.titanium.name = titanio item.titanium.name = titanio
item.thorium.name = Torio item.thorium.name = Torio
item.silicon.name = Silicio item.silicon.name = Silicio
item.plastanium.name = Plastaniu item.plastanium.name = Plastanio
item.phase-fabric.name = Phase Fabric item.phase-fabric.name = Tessuto Fase
item.surge-alloy.name = Surge Alloy item.surge-alloy.name = Lega Ondata
item.spore-pod.name = Spore Pod item.spore-pod.name = Piattaforma Spore
item.sand.name = sabbia item.sand.name = Sabbia
item.blast-compound.name = Polvere esplosiva item.blast-compound.name = Polvere esplosiva
item.pyratite.name = Pirite item.pyratite.name = Pirite
item.metaglass.name = Metaglass item.metaglass.name = Metaglass
item.scrap.name = Scrap item.scrap.name = Rottame
liquid.water.name = acqua liquid.water.name = Acqua
liquid.slag.name = Slag liquid.slag.name = Scorie
liquid.oil.name = petrolio liquid.oil.name = Petrolio
liquid.cryofluid.name = criogenium liquid.cryofluid.name = Criogenium
mech.alpha-mech.name = Alpha mech.alpha-mech.name = Alpha
mech.alpha-mech.weapon = Ripetitore pesante mech.alpha-mech.weapon = Ripetitore pesante
mech.alpha-mech.ability = Orda di droni mech.alpha-mech.ability = Orda di droni
@@ -620,13 +620,13 @@ mech.tau-mech.name = Tau
mech.tau-mech.weapon = Laser ricostruttore mech.tau-mech.weapon = Laser ricostruttore
mech.tau-mech.ability = Ripara esplosioni mech.tau-mech.ability = Ripara esplosioni
mech.omega-mech.name = Omega mech.omega-mech.name = Omega
mech.omega-mech.weapon = SCiame di missili mech.omega-mech.weapon = Sciame di missili
mech.omega-mech.ability = Configurazione armata mech.omega-mech.ability = Configurazione armata
mech.dart-ship.name = Dart mech.dart-ship.name = Dart
mech.dart-ship.weapon = Ripetitore mech.dart-ship.weapon = Ripetitore
mech.javelin-ship.name = Javelin mech.javelin-ship.name = Giavellotto
mech.javelin-ship.weapon = Missili esplosivi mech.javelin-ship.weapon = Missili esplosivi
mech.javelin-ship.ability = Discharge Booster mech.javelin-ship.ability = Booster di scarico
mech.trident-ship.name = Tridente mech.trident-ship.name = Tridente
mech.trident-ship.weapon = Valle delle bombe mech.trident-ship.weapon = Valle delle bombe
mech.glaive-ship.name = Glaive mech.glaive-ship.name = Glaive
@@ -637,90 +637,90 @@ item.radioactivity = [LIGHT_GRAY]Radioattività: {0}
unit.health = [LIGHT_GRAY]Vita: {0} unit.health = [LIGHT_GRAY]Vita: {0}
unit.speed = [LIGHT_GRAY]Velocità: {0} unit.speed = [LIGHT_GRAY]Velocità: {0}
mech.weapon = [LIGHT_GRAY]Armi: {0} mech.weapon = [LIGHT_GRAY]Armi: {0}
mech.health = [LIGHT_GRAY]Health: {0} mech.health = [LIGHT_GRAY]Vita: {0}
mech.itemcapacity = [LIGHT_GRAY]Capacità oggetti: {0} mech.itemcapacity = [LIGHT_GRAY]Capacità oggetti: {0}
mech.minespeed = [LIGHT_GRAY]Velocità di scavo: {0} mech.minespeed = [LIGHT_GRAY]Velocità di scavo: {0}
mech.minepower = [LIGHT_GRAY]Potenza di scavo: {0} mech.minepower = [LIGHT_GRAY]Potenza di scavo: {0}
mech.ability = [LIGHT_GRAY]Abilità: {0} mech.ability = [LIGHT_GRAY]Abilità: {0}
mech.buildspeed = [LIGHT_GRAY]Building Speed: {0}% mech.buildspeed = [LIGHT_GRAY]Velocità costruzione: {0}%
liquid.heatcapacity = [LIGHT_GRAY]Capacità calorifica: {0} liquid.heatcapacity = [LIGHT_GRAY]Capacità calorifica: {0}
liquid.viscosity = [LIGHT_GRAY]Viscosità: {0} liquid.viscosity = [LIGHT_GRAY]Viscosità: {0}
liquid.temperature = [LIGHT_GRAY]Temperatura: {0} liquid.temperature = [LIGHT_GRAY]Temperatura: {0}
block.sand-boulder.name = Sand Boulder block.sand-boulder.name = Masso di Sabbia
block.grass.name = Grass block.grass.name = Grass
block.salt.name = Salt block.salt.name = Sale
block.saltrocks.name = Salt Rocks block.saltrocks.name = Rocce salate
block.pebbles.name = Pebbles block.pebbles.name = Ciottole
block.tendrils.name = Tendrils block.tendrils.name = Viticci
block.sandrocks.name = Sand Rocks block.sandrocks.name = Rocce sabbiose
block.spore-pine.name = Spore Pine block.spore-pine.name = Pino Spora
block.sporerocks.name = Spore Rocks block.sporerocks.name = Roccia Spora
block.rock.name = Rock block.rock.name = Roccia
block.snowrock.name = Snow Rock block.snowrock.name = Roccia innevata
block.snow-pine.name = Snow Pine block.snow-pine.name = Pino innevato
block.shale.name = Shale block.shale.name = Scisto
block.shale-boulder.name = Shale Boulder block.shale-boulder.name = Masso di scisto
block.moss.name = Moss block.moss.name = Muschio
block.shrubs.name = Shrubs block.shrubs.name = Arbusti
block.spore-moss.name = Spore Moss block.spore-moss.name = Spore di Muschio
block.shalerocks.name = Shale Rocks block.shalerocks.name = Roccie di scisto
block.scrap-wall.name = Scrap Wall block.scrap-wall.name = Muro di Rottami
block.scrap-wall-large.name = Large Scrap Wall block.scrap-wall-large.name = Muro di rottami grande
block.scrap-wall-huge.name = Huge Scrap Wall block.scrap-wall-huge.name = Muro di rottami enorme
block.scrap-wall-gigantic.name = Gigantic Scrap Wall block.scrap-wall-gigantic.name = Muro di Rottami Gigante
block.thruster.name = Thruster block.thruster.name = Propulsore
block.kiln.name = Kiln block.kiln.name = Forno
block.graphite-press.name = Graphite Press block.graphite-press.name = Pressa per grafite
block.multi-press.name = Multi-Press block.multi-press.name = Multi Pressa
block.constructing = {0}\n[LIGHT_GRAY](Constructing) block.constructing = {0}\n[LIGHT_GRAY](In costruzione)
block.spawn.name = Enemy Spawn block.spawn.name = Spawning nemico
block.core-shard.name = Core: Shard block.core-shard.name = Nucleo: Frammento
block.core-foundation.name = Core: Foundation block.core-foundation.name = Nucleo: Fondamento
block.core-nucleus.name = Core: Nucleus block.core-nucleus.name = Nucleo: Kernel
block.deepwater.name = acqua profonda block.deepwater.name = acqua profonda
block.water.name = acqua block.water.name = acqua
block.tainted-water.name = Tainted Water block.tainted-water.name = Acqua contaminata
block.darksand-tainted-water.name = Dark Sand Tainted Water block.darksand-tainted-water.name = Acqua contaminata scura
block.tar.name = Tar block.tar.name = Catrame
block.stone.name = pietra block.stone.name = pietra
block.sand.name = sabbia block.sand.name = sabbia
block.darksand.name = Dark Sand block.darksand.name = Sabbia scura
block.ice.name = ghiaccio block.ice.name = ghiaccio
block.snow.name = neve block.snow.name = neve
block.craters.name = Craters block.craters.name = Crateri
block.sand-water.name = Sand water block.sand-water.name = Acqua sabbiosa
block.darksand-water.name = Dark Sand Water block.darksand-water.name = Acqua sabbiosa scura
block.char.name = Char block.char.name = Carbone
block.holostone.name = Holo stone block.holostone.name = Pietra di holo
block.ice-snow.name = Ice Snow block.ice-snow.name = Neve ghiacciata
block.rocks.name = Rocks block.rocks.name = Roccie
block.icerocks.name = Ice rocks block.icerocks.name = Rocce ghiacciate
block.snowrocks.name = Snow Rocks block.snowrocks.name = Rocce innevate
block.dunerocks.name = Dune Rocks block.dunerocks.name = Rocce delle dune
block.pine.name = Pine block.pine.name = Pino
block.white-tree-dead.name = White Tree Dead block.white-tree-dead.name = Albero bianco morto
block.white-tree.name = White Tree block.white-tree.name = Albero morto
block.spore-cluster.name = Spore Cluster block.spore-cluster.name = Agglomerato di spore
block.metal-floor.name = Metal Floor block.metal-floor.name = Pavimento metallico
block.metal-floor-2.name = Metal Floor 2 block.metal-floor-2.name = Pavimento metallico 2
block.metal-floor-3.name = Metal Floor 3 block.metal-floor-3.name = Pavimento metallico 3
block.metal-floor-5.name = Metal Floor 5 block.metal-floor-5.name = Pavimento metallico 5
block.metal-floor-damaged.name = Metal Floor Damaged block.metal-floor-damaged.name = Pavimento metallico danneggiato
block.dark-panel-1.name = Dark Panel 1 block.dark-panel-1.name = Pannello scuro 1
block.dark-panel-2.name = Dark Panel 2 block.dark-panel-2.name = Pannello scuro 2
block.dark-panel-3.name = Dark Panel 3 block.dark-panel-3.name = Pannello scuro 3
block.dark-panel-4.name = Dark Panel 4 block.dark-panel-4.name = Pannello scuro 4
block.dark-panel-5.name = Dark Panel 5 block.dark-panel-5.name = Pannello scuro 5
block.dark-panel-6.name = Dark Panel 6 block.dark-panel-6.name = Pannello scuro 6
block.dark-metal.name = Dark Metal block.dark-metal.name = Metallo Scuro
block.ignarock.name = Igna Rock block.ignarock.name = Roccia Ignea
block.hotrock.name = Hot Rock block.hotrock.name = Roccia bollente
block.magmarock.name = Magma Rock block.magmarock.name = Roccia magmatica
block.cliffs.name = Cliffs block.cliffs.name = Scogliere
block.copper-wall.name = Muro di rame block.copper-wall.name = Muro di rame
block.copper-wall-large.name = Muro grande di rame block.copper-wall-large.name = Muro grande di rame
block.titanium-wall.name = Titanium Wall block.titanium-wall.name = Muro di titanio
block.titanium-wall-large.name = Large Titanium Wall block.titanium-wall-large.name = Muro grande di titanio
block.phase-wall.name = Muro di fase block.phase-wall.name = Muro di fase
block.phase-wall-large.name = Muro grande di fase block.phase-wall-large.name = Muro grande di fase
block.thorium-wall.name = Muro di torio block.thorium-wall.name = Muro di torio
@@ -728,15 +728,15 @@ block.thorium-wall-large.name = Muro grande di torio
block.door.name = porta block.door.name = porta
block.door-large.name = Porta grande block.door-large.name = Porta grande
block.duo.name = Duo block.duo.name = Duo
block.scorch.name = Scorch block.scorch.name = Bruciatore
block.scatter.name = Scatter block.scatter.name = Spargimento
block.hail.name = Bombardiere block.hail.name = Bombardiere
block.lancer.name = Idrogetto block.lancer.name = Idrogetto
block.conveyor.name = trasportatore block.conveyor.name = trasportatore
block.titanium-conveyor.name = Nastro trasportatore potenziato block.titanium-conveyor.name = Nastro trasportatore potenziato
block.junction.name = Incrocio block.junction.name = Incrocio
block.router.name = router block.router.name = Separatore
block.distributor.name = Mega router block.distributor.name = Mega Separatore
block.sorter.name = Filtro block.sorter.name = Filtro
block.overflow-gate.name = splitter per eccesso block.overflow-gate.name = splitter per eccesso
block.silicon-smelter.name = Fonderia per silicio block.silicon-smelter.name = Fonderia per silicio

View File

@@ -16,6 +16,11 @@ screenshot.invalid = マップが広すぎます。スクリーンショット
gameover = ゲームオーバー gameover = ゲームオーバー
gameover.pvp = [accent] {0}[] チームの勝利! gameover.pvp = [accent] {0}[] チームの勝利!
highscore = [accent]ハイスコアを記録! highscore = [accent]ハイスコアを記録!
load.sound = Sounds
load.map = Maps
load.image = Images
load.content = Content
load.system = System
stat.wave = 防衛したウェーブ:[accent] {0} stat.wave = 防衛したウェーブ:[accent] {0}
stat.enemiesDestroyed = 敵による破壊数:[accent] {0} stat.enemiesDestroyed = 敵による破壊数:[accent] {0}
stat.built = 建設した建造物数:[accent] {0} stat.built = 建設した建造物数:[accent] {0}
@@ -23,8 +28,6 @@ stat.destroyed = 破壊した建造物数:[accent] {0}
stat.deconstructed = 解体した建造物数:[accent] {0} stat.deconstructed = 解体した建造物数:[accent] {0}
stat.delivered = 獲得した資源: stat.delivered = 獲得した資源:
stat.rank = 最終ランク: [accent]{0} stat.rank = 最終ランク: [accent]{0}
placeline = ブロックを選択しました。\n[accent]少し長押し[]して、好きな方向にドラッグすると[accent]一直線上にブロックを設置[]することができます。\nやってみよう。
removearea = 撤去モードが選択されました。\n[accent]少し長押し[]して、ドラッグすると[accent]範囲内のブロックを撤去[]することができます。\nやってみよう。
launcheditems = [accent]回収したアイテム launcheditems = [accent]回収したアイテム
map.delete = マップ "[accent]{0}[]" を削除してもよろしいですか? map.delete = マップ "[accent]{0}[]" を削除してもよろしいですか?
level.highscore = ハイスコア: [accent]{0} level.highscore = ハイスコア: [accent]{0}
@@ -63,9 +66,11 @@ players.single = {0} 人がオンライン
server.closing = [accent]サーバーを閉じています... server.closing = [accent]サーバーを閉じています...
server.kicked.kick = サーバからキックされました! server.kicked.kick = サーバからキックされました!
server.kicked.serverClose = サーバーが閉じられました。 server.kicked.serverClose = サーバーが閉じられました。
server.kicked.vote = You have been vote-kicked. Goodbye.
server.kicked.clientOutdated = 古いクライアントです! ゲームをアップデートしてください! server.kicked.clientOutdated = 古いクライアントです! ゲームをアップデートしてください!
server.kicked.serverOutdated = 古いサーバーです! ホストに更新してもらってください! server.kicked.serverOutdated = 古いサーバーです! ホストに更新してもらってください!
server.kicked.banned = サーバーからブロックされています。 server.kicked.banned = サーバーからブロックされています。
server.kicked.typeMismatch = This server is not compatible with your build type.
server.kicked.recentKick = 直前にキックされています。\nもう一度接続できるまでお待ちください。 server.kicked.recentKick = 直前にキックされています。\nもう一度接続できるまでお待ちください。
server.kicked.nameInUse = このサーバーでは、\nすでに同じ名前が使用されています。 server.kicked.nameInUse = このサーバーでは、\nすでに同じ名前が使用されています。
server.kicked.nameEmpty = 無効な名前です。 server.kicked.nameEmpty = 無効な名前です。
@@ -156,6 +161,11 @@ cancel = キャンセル
openlink = リンクを開く openlink = リンクを開く
copylink = リンクをコピー copylink = リンクをコピー
back = 戻る back = 戻る
data.export = Export Data
data.import = Import Data
data.exported = Data exported.
data.invalid = This isn't valid game data.
data.import.confirm = Importing external data will erase[scarlet] all[] your current game data.\n[accent]This cannot be undone![]\n\nOnce the data is imported, your game will exit immediately.
classic.export = Export Classic Data classic.export = Export Classic Data
classic.export.text = [accent]Mindustry[] has just had a major update.\nClassic (v3.5 build 40) save or map data has been detected. Would you like to export these saves to your phone's home folder, for use in the Mindustry Classic app? classic.export.text = [accent]Mindustry[] has just had a major update.\nClassic (v3.5 build 40) save or map data has been detected. Would you like to export these saves to your phone's home folder, for use in the Mindustry Classic app?
quit.confirm = 終了してもよろしいですか? quit.confirm = 終了してもよろしいですか?
@@ -376,6 +386,7 @@ zone.fungalPass.description = A transition area between high mountains and lower
zone.impact0078.description = <insert description here> zone.impact0078.description = <insert description here>
zone.crags.description = <insert description here> zone.crags.description = <insert description here>
settings.language = 言語 settings.language = 言語
settings.data = Game Data
settings.reset = デフォルトにリセット settings.reset = デフォルトにリセット
settings.rebind = 再設定 settings.rebind = 再設定
settings.controls = コントロール settings.controls = コントロール
@@ -507,6 +518,7 @@ setting.mutemusic.name = 音楽をミュート
setting.sfxvol.name = 効果音 音量 setting.sfxvol.name = 効果音 音量
setting.mutesound.name = 効果音をミュート setting.mutesound.name = 効果音をミュート
setting.crashreport.name = 匿名でクラッシュレポートを送信する setting.crashreport.name = 匿名でクラッシュレポートを送信する
setting.savecreate.name = Auto-Create Saves
setting.chatopacity.name = チャットの透明度 setting.chatopacity.name = チャットの透明度
setting.playerchat.name = ゲーム内にチャットを表示 setting.playerchat.name = ゲーム内にチャットを表示
uiscale.reset = UI scale has been changed.\nPress "OK" to confirm this scale.\n[scarlet]Reverting and exiting in[accent] {0}[] settings... uiscale.reset = UI scale has been changed.\nPress "OK" to confirm this scale.\n[scarlet]Reverting and exiting in[accent] {0}[] settings...
@@ -527,6 +539,7 @@ keybind.press.axis = 軸またはキーを押してください...
keybind.screenshot.name = スクリーンショット keybind.screenshot.name = スクリーンショット
keybind.move_x.name = 左右移動 keybind.move_x.name = 左右移動
keybind.move_y.name = 上下移動 keybind.move_y.name = 上下移動
keybind.fullscreen.name = Toggle Fullscreen
keybind.select.name = 選択/ショット keybind.select.name = 選択/ショット
keybind.diagonal_placement.name = 斜め設置 keybind.diagonal_placement.name = 斜め設置
keybind.pick.name = ブロックの選択 keybind.pick.name = ブロックの選択
@@ -790,6 +803,7 @@ block.blast-mixer.name = 化合物ミキサー
block.solar-panel.name = ソーラーパネル block.solar-panel.name = ソーラーパネル
block.solar-panel-large.name = 大型ソーラーパネル block.solar-panel-large.name = 大型ソーラーパネル
block.oil-extractor.name = 石油抽出機 block.oil-extractor.name = 石油抽出機
block.command-center.name = Command Center
block.draug-factory.name = Draug Miner Drone Factory block.draug-factory.name = Draug Miner Drone Factory
block.spirit-factory.name = スピリットドローン製造機 block.spirit-factory.name = スピリットドローン製造機
block.phantom-factory.name = ファントムドローン製造機 block.phantom-factory.name = ファントムドローン製造機
@@ -1012,6 +1026,7 @@ block.ripple.description = 同時に複数ショットを発射する大型タ
block.cyclone.description = 大型の連射型ターレットです。 block.cyclone.description = 大型の連射型ターレットです。
block.spectre.description = 一度に2発の強力な弾を放つ大型のターレットです。 block.spectre.description = 一度に2発の強力な弾を放つ大型のターレットです。
block.meltdown.description = 強力な長距離攻撃が可能な大型のターレットです。 block.meltdown.description = 強力な長距離攻撃が可能な大型のターレットです。
block.command-center.description = Issues movement commands to allied units across the map.\nCauses units to patrol, attack an enemy core or retreat to the core/factory. When no enemy core is present, units will default to patrolling under the attack command.
block.draug-factory.description = Produces Draug mining drones. block.draug-factory.description = Produces Draug mining drones.
block.spirit-factory.description = 鉱石の採掘やブロックの修復を行う小型のドローンユニットのスピリットを製造します。 block.spirit-factory.description = 鉱石の採掘やブロックの修復を行う小型のドローンユニットのスピリットを製造します。
block.phantom-factory.description = スピリットドローンの性能を遥かに凌ぐ上位のドローンユニットのファントムドローンを製造します。 block.phantom-factory.description = スピリットドローンの性能を遥かに凌ぐ上位のドローンユニットのファントムドローンを製造します。

View File

@@ -20,7 +20,7 @@ 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}
@@ -52,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] 유저 이름[] 을 설정하세요.
@@ -68,16 +77,18 @@ 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 = 클라이언트와 호환되지 않는 서버입니다. 디스코드에서 #mods에 들러보는 건 어떨까요?
server.kicked.playerLimit = 서버가 꽉 찼습니다. 빈 공간이 생길 때까지 기다려주세요.
server.kicked.recentKick = 방금 추방처리 되었습니다.\n잠시 기다린 후에 접속 해 주세요. server.kicked.recentKick = 방금 추방처리 되었습니다.\n잠시 기다린 후에 접속 해 주세요.
server.kicked.nameInUse = 이 닉네임이 이미 서버에서 사용중입니다. server.kicked.nameInUse = 이 닉네임이 이미 서버에서 사용중입니다.
server.kicked.nameEmpty = 닉네임에는 반드시 알파벳 또는 숫자가 있어야 합니다.
server.kicked.idInUse = 이미 서버에 접속중입니다! 다중 계정은 허용되지 않습니다.
server.kicked.nameEmpty = 당신의 닉네임이 비어있습니다. server.kicked.nameEmpty = 당신의 닉네임이 비어있습니다.
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}[]
@@ -89,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]서버에 연결할 수 없습니다!
@@ -118,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 = 새로 저장
@@ -151,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 = 경고.
@@ -169,8 +185,8 @@ data.import = 데이터 불러오기
data.exported = 데이터를 내보냈습니다. data.exported = 데이터를 내보냈습니다.
data.invalid = 유효한 게임 데이터가 아닙니다. data.invalid = 유효한 게임 데이터가 아닙니다.
data.import.confirm = 외부 게임 데이터를 불러옵니다...\n[accent]이 작업시 현재 게임 데이터는 삭제되고, 외부의 게임 데이터를 불러오니 주의하세요. 실행 취소가 불가능하며, 작업 후 게임이 바로 꺼집니다. data.import.confirm = 외부 게임 데이터를 불러옵니다...\n[accent]이 작업시 현재 게임 데이터는 삭제되고, 외부의 게임 데이터를 불러오니 주의하세요. 실행 취소가 불가능하며, 작업 후 게임이 바로 꺼집니다.
classic.export.text = Mindustry 클래식 (v3.5 build 40)의 세이브파일 또는 맵 데이터가 발견되었습니다. 이 것들을 Mindustry 클래식 앱에서 사용하기 위해 홈 폴더로 추출할까요?
classic.export = 클래식 데이터 추출 classic.export = 클래식 데이터 추출
classic.export.text = Mindustry 클래식 (v3.5 build 40)의 세이브파일 또는 맵 데이터가 발견되었습니다. 이 것들을 Mindustry 클래식 앱에서 사용하기 위해 홈 폴더로 추출할까요?
quit.confirm = 정말로 종료하시겠습니까? quit.confirm = 정말로 종료하시겠습니까?
quit.confirm.tutorial = 튜토리얼을 종료하시겠습니까?\n튜토리얼은 [accent]설정 -> 게임 -> 튜토리얼[]에서 다시 해보실 수 있습니다. quit.confirm.tutorial = 튜토리얼을 종료하시겠습니까?\n튜토리얼은 [accent]설정 -> 게임 -> 튜토리얼[]에서 다시 해보실 수 있습니다.
loading = [accent]불러오는중... loading = [accent]불러오는중...
@@ -193,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 = 광물 무작위 생성
@@ -204,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 = 여기까지 유닛생성
@@ -221,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 = 유닛 생성
@@ -230,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 = 업데이트
@@ -345,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시작자원 설정 기능이 해금되었습니다!
@@ -422,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 = 이동 속도
@@ -445,6 +469,7 @@ 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 = 재장전
@@ -533,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...
@@ -944,10 +970,6 @@ unit.eruptor.description = 지상 유닛. 광재를 넣은 파도와 같은 무
unit.wraith.description = 적 핵심 건물 및 유닛을 집중적으로 공격하는 방식을 사용하는 전투기 입니다. unit.wraith.description = 적 핵심 건물 및 유닛을 집중적으로 공격하는 방식을 사용하는 전투기 입니다.
unit.ghoul.description = 무겁고 튼튼한 지상 폭격기 입니다.\n주로 적 건물로 이동하여 엄청난 폭격을 가합니다. unit.ghoul.description = 무겁고 튼튼한 지상 폭격기 입니다.\n주로 적 건물로 이동하여 엄청난 폭격을 가합니다.
unit.revenant.description = 플래이어가 생산가능한 최종 공중 전투기. 폭발물을 쓰는 스웜 포탑과 같은 무기를 사용합니다. unit.revenant.description = 플래이어가 생산가능한 최종 공중 전투기. 폭발물을 쓰는 스웜 포탑과 같은 무기를 사용합니다.
unit.chaos-array.description = 고속 설금 3연발 총을 장착한 지상 보스 유닛입니다. 중간보스 같다고 얕봤다가는 생산건물에 큰 타격을 입을 수 있습니다.\n\n[royal]하지만 스코치에겐 너도 한방! 나도 한방!
unit.eradicator.description = 강력한 토륨 연사 총을 2개 장착한 지상 보스 유닛입니다. 체력도 지상 유닛에 한해서 가장 많습니다.
unit.lich.description = 작은 폭발물 연사포탑을 2개 장착한 공중 보스 유닛입니다.\n\n[royal]망령 전함의 강화판이라 볼 수 있습니다.
unit.reaper.description = 강력한 토륨 연사 포탑를 2개 장착하고 Mindustry 내 모든 것중에서 가장 많은 체력을 가진 공중 보스 유닛입니다.
block.graphite-press.description = 석탄 덩어리를 흑연으로 압축합니다. block.graphite-press.description = 석탄 덩어리를 흑연으로 압축합니다.
block.multi-press.description = 흑연 압축기의 상향 버전입니다. 물과 전력을 이용해 석탄을 빠르고 효율적으로 압축합니다. block.multi-press.description = 흑연 압축기의 상향 버전입니다. 물과 전력을 이용해 석탄을 빠르고 효율적으로 압축합니다.
block.silicon-smelter.description = 석탄과 모래를 사용해 실리콘을 생산합니다. block.silicon-smelter.description = 석탄과 모래를 사용해 실리콘을 생산합니다.

View File

@@ -16,6 +16,11 @@ screenshot.invalid = Map too large, potentially not enough memory for screenshot
gameover = Game Over gameover = Game Over
gameover.pvp = het[accent] {0}[] team heeft gewonnen! gameover.pvp = het[accent] {0}[] team heeft gewonnen!
highscore = [accent]Nieuw topscore! highscore = [accent]Nieuw topscore!
load.sound = Sounds
load.map = Maps
load.image = Images
load.content = Content
load.system = System
stat.wave = Waves Verslagen:[accent] {0} stat.wave = Waves Verslagen:[accent] {0}
stat.enemiesDestroyed = Vijanden Vernietigd:[accent] {0} stat.enemiesDestroyed = Vijanden Vernietigd:[accent] {0}
stat.built = Gebouwen Gebouwd:[accent] {0} stat.built = Gebouwen Gebouwd:[accent] {0}
@@ -23,8 +28,6 @@ stat.destroyed = Gebouwen Vernietigd:[accent] {0}
stat.deconstructed = Gebouwen Gesloopt:[accent] {0} stat.deconstructed = Gebouwen Gesloopt:[accent] {0}
stat.delivered = Middelen Gelanceerd: stat.delivered = Middelen Gelanceerd:
stat.rank = Eindrang: [accent]{0} stat.rank = Eindrang: [accent]{0}
placeline = You have selected a block.\nYou can[accent] place in a line[] by[accent] holding down your finger for a few seconds[] and dragging in a direction.\nTry it.
removearea = You have selected removal mode.\nYou can[accent] remove blocks in a rectangle[] by[accent] holding down your finger for a few seconds[] and dragging.\nTry it.
launcheditems = [accent]Launched Items launcheditems = [accent]Launched Items
map.delete = Weet je zeker dat je de map wilt verwijderen? "[accent]{0}[]"? map.delete = Weet je zeker dat je de map wilt verwijderen? "[accent]{0}[]"?
level.highscore = Topscore: [accent]{0} level.highscore = Topscore: [accent]{0}
@@ -63,9 +66,11 @@ players.single = {0} player online
server.closing = [accent]Closing server... server.closing = [accent]Closing server...
server.kicked.kick = You have been kicked from the server! server.kicked.kick = You have been kicked from the server!
server.kicked.serverClose = Server closed. server.kicked.serverClose = Server closed.
server.kicked.vote = You have been vote-kicked. Goodbye.
server.kicked.clientOutdated = Outdated client! Update your game! server.kicked.clientOutdated = Outdated client! Update your game!
server.kicked.serverOutdated = Outdated server! Ask the host to update! server.kicked.serverOutdated = Outdated server! Ask the host to update!
server.kicked.banned = You are banned on this server. server.kicked.banned = You are banned on this server.
server.kicked.typeMismatch = This server is not compatible with your build type.
server.kicked.recentKick = You have been kicked recently.\nWait before connecting again. server.kicked.recentKick = You have been kicked recently.\nWait before connecting again.
server.kicked.nameInUse = There is someone with that name\nalready on this server. server.kicked.nameInUse = There is someone with that name\nalready on this server.
server.kicked.nameEmpty = Your chosen name is invalid. server.kicked.nameEmpty = Your chosen name is invalid.
@@ -156,6 +161,11 @@ cancel = Cancel
openlink = Open Link openlink = Open Link
copylink = Copy Link copylink = Copy Link
back = Back back = Back
data.export = Export Data
data.import = Import Data
data.exported = Data exported.
data.invalid = This isn't valid game data.
data.import.confirm = Importing external data will erase[scarlet] all[] your current game data.\n[accent]This cannot be undone![]\n\nOnce the data is imported, your game will exit immediately.
classic.export = Export Classic Data classic.export = Export Classic Data
classic.export.text = [accent]Mindustry[] has just had a major update.\nClassic (v3.5 build 40) save or map data has been detected. Would you like to export these saves to your phone's home folder, for use in the Mindustry Classic app? classic.export.text = [accent]Mindustry[] has just had a major update.\nClassic (v3.5 build 40) save or map data has been detected. Would you like to export these saves to your phone's home folder, for use in the Mindustry Classic app?
quit.confirm = Are you sure you want to quit? quit.confirm = Are you sure you want to quit?
@@ -376,6 +386,7 @@ zone.fungalPass.description = A transition area between high mountains and lower
zone.impact0078.description = <insert description here> zone.impact0078.description = <insert description here>
zone.crags.description = <insert description here> zone.crags.description = <insert description here>
settings.language = Language settings.language = Language
settings.data = Game Data
settings.reset = Reset to Defaults settings.reset = Reset to Defaults
settings.rebind = Rebind settings.rebind = Rebind
settings.controls = Controls settings.controls = Controls
@@ -507,6 +518,7 @@ setting.mutemusic.name = Mute Music
setting.sfxvol.name = SFX Volume setting.sfxvol.name = SFX Volume
setting.mutesound.name = Mute Sound setting.mutesound.name = Mute Sound
setting.crashreport.name = Send Anonymous Crash Reports setting.crashreport.name = Send Anonymous Crash Reports
setting.savecreate.name = Auto-Create Saves
setting.chatopacity.name = Chat Opacity setting.chatopacity.name = Chat Opacity
setting.playerchat.name = Display In-Game Chat setting.playerchat.name = Display In-Game Chat
uiscale.reset = UI scale has been changed.\nPress "OK" to confirm this scale.\n[scarlet]Reverting and exiting in[accent] {0}[] settings... uiscale.reset = UI scale has been changed.\nPress "OK" to confirm this scale.\n[scarlet]Reverting and exiting in[accent] {0}[] settings...
@@ -527,6 +539,7 @@ keybind.press.axis = Press an axis or key...
keybind.screenshot.name = Map Screenshot keybind.screenshot.name = Map Screenshot
keybind.move_x.name = Move x keybind.move_x.name = Move x
keybind.move_y.name = Move y keybind.move_y.name = Move y
keybind.fullscreen.name = Toggle Fullscreen
keybind.select.name = Select/Shoot keybind.select.name = Select/Shoot
keybind.diagonal_placement.name = Diagonal Placement keybind.diagonal_placement.name = Diagonal Placement
keybind.pick.name = Pick Block keybind.pick.name = Pick Block
@@ -790,6 +803,7 @@ block.blast-mixer.name = Blast Mixer
block.solar-panel.name = Solar Panel block.solar-panel.name = Solar Panel
block.solar-panel-large.name = Large Solar Panel block.solar-panel-large.name = Large Solar Panel
block.oil-extractor.name = Oil Extractor block.oil-extractor.name = Oil Extractor
block.command-center.name = Command Center
block.draug-factory.name = Draug Miner Drone Factory block.draug-factory.name = Draug Miner Drone Factory
block.spirit-factory.name = Spirit Drone Factory block.spirit-factory.name = Spirit Drone Factory
block.phantom-factory.name = Phantom Drone Factory block.phantom-factory.name = Phantom Drone Factory
@@ -1012,6 +1026,7 @@ block.ripple.description = A large artillery turret which fires several shots si
block.cyclone.description = A large rapid fire turret. block.cyclone.description = A large rapid fire turret.
block.spectre.description = A large turret which shoots two powerful bullets at once. block.spectre.description = A large turret which shoots two powerful bullets at once.
block.meltdown.description = A large turret which shoots powerful long-range beams. block.meltdown.description = A large turret which shoots powerful long-range beams.
block.command-center.description = Issues movement commands to allied units across the map.\nCauses units to patrol, attack an enemy core or retreat to the core/factory. When no enemy core is present, units will default to patrolling under the attack command.
block.draug-factory.description = Produces Draug mining drones. block.draug-factory.description = Produces Draug mining drones.
block.spirit-factory.description = Produces light drones which mine ore and repair blocks. block.spirit-factory.description = Produces light drones which mine ore and repair blocks.
block.phantom-factory.description = Produces advanced drone units which are significantly more effective than a spirit drone. block.phantom-factory.description = Produces advanced drone units which are significantly more effective than a spirit drone.

View File

@@ -16,6 +16,11 @@ screenshot.invalid = Kaart te groot, mogelijks te weinig geheugen voor een scree
gameover = Game Over gameover = Game Over
gameover.pvp = Het[accent] {0}[] team heeft gewonnen! gameover.pvp = Het[accent] {0}[] team heeft gewonnen!
highscore = [accent]Nieuw record! highscore = [accent]Nieuw record!
load.sound = Sounds
load.map = Maps
load.image = Images
load.content = Content
load.system = System
stat.wave = Je overleefde tot aanvalsgolf: [accent]{0}[]. stat.wave = Je overleefde tot aanvalsgolf: [accent]{0}[].
stat.enemiesDestroyed = Vijanden vernietigd:[accent] {0} stat.enemiesDestroyed = Vijanden vernietigd:[accent] {0}
stat.built = Gebouwen gebouwd:[accent] {0} stat.built = Gebouwen gebouwd:[accent] {0}
@@ -23,8 +28,6 @@ stat.destroyed = Gebouwen vernietigd:[accent] {0}
stat.deconstructed = Gebouwen afgebroken:[accent] {0} stat.deconstructed = Gebouwen afgebroken:[accent] {0}
stat.delivered = Gronstoffen meegenomen: stat.delivered = Gronstoffen meegenomen:
stat.rank = Eindresultaat: [accent]{0} stat.rank = Eindresultaat: [accent]{0}
placeline = Je hebt een blok geselecteerd.\nJe kan[accent] in een lijn plaatsen[] door[accent] je vinger voor enkele seconden ingedrukt te houden[] en in een richting te slepen.\n\n[scarlet]DOE HET.
removearea = Je hebt verwijderingsmodus geselecteerd.\nJe kan[accent] blokken verwijderen in een rechthoek[] door[accent] je vinger voor enkele seconden ingedrukt te houden[] en te slepen.\n\n[scarlet]DOE HET.
launcheditems = [accent]Meegenomen grondstoffen launcheditems = [accent]Meegenomen grondstoffen
map.delete = Ben je zeker dat je de kaart "[accent]{0}[]" wilt verwijderen? map.delete = Ben je zeker dat je de kaart "[accent]{0}[]" wilt verwijderen?
level.highscore = Beste score: [accent]{0} level.highscore = Beste score: [accent]{0}
@@ -63,9 +66,11 @@ players.single = {0} speler online
server.closing = [accent]Server wordt gesloten... server.closing = [accent]Server wordt gesloten...
server.kicked.kick = Je bent uit de server gegooid! server.kicked.kick = Je bent uit de server gegooid!
server.kicked.serverClose = Server gesloten. server.kicked.serverClose = Server gesloten.
server.kicked.vote = You have been vote-kicked. Goodbye.
server.kicked.clientOutdated = Verouderde versie! Update Mindustry! server.kicked.clientOutdated = Verouderde versie! Update Mindustry!
server.kicked.serverOutdated = Verouderde server! Vraag de eigenaar van de server om de server te updaten! server.kicked.serverOutdated = Verouderde server! Vraag de eigenaar van de server om de server te updaten!
server.kicked.banned = Je bent verbannen van deze server. server.kicked.banned = Je bent verbannen van deze server.
server.kicked.typeMismatch = This server is not compatible with your build type.
server.kicked.recentKick = Je bent daarnet van de server gegooid.\nWacht even voor je weer verbindt server.kicked.recentKick = Je bent daarnet van de server gegooid.\nWacht even voor je weer verbindt
server.kicked.nameInUse = Er is al iemand met dezelfde naam op de server. server.kicked.nameInUse = Er is al iemand met dezelfde naam op de server.
server.kicked.nameEmpty = Je gekozen naam is ongeldig. server.kicked.nameEmpty = Je gekozen naam is ongeldig.
@@ -156,6 +161,11 @@ cancel = Annuleer
openlink = Open Link openlink = Open Link
copylink = Kopiëer Link copylink = Kopiëer Link
back = Terug back = Terug
data.export = Export Data
data.import = Import Data
data.exported = Data exported.
data.invalid = This isn't valid game data.
data.import.confirm = Importing external data will erase[scarlet] all[] your current game data.\n[accent]This cannot be undone![]\n\nOnce the data is imported, your game will exit immediately.
classic.export = Export Classic Data classic.export = Export Classic Data
classic.export.text = [accent]Mindustry[] has just had a major update.\nClassic (v3.5 build 40) save or map data has been detected. Would you like to export these saves to your phone's home folder, for use in the Mindustry Classic app? classic.export.text = [accent]Mindustry[] has just had a major update.\nClassic (v3.5 build 40) save or map data has been detected. Would you like to export these saves to your phone's home folder, for use in the Mindustry Classic app?
quit.confirm = Weet je zeker dat je wilt stoppen? quit.confirm = Weet je zeker dat je wilt stoppen?
@@ -376,6 +386,7 @@ zone.fungalPass.description = A transition area between high mountains and lower
zone.impact0078.description = <insert description here> zone.impact0078.description = <insert description here>
zone.crags.description = <insert description here> zone.crags.description = <insert description here>
settings.language = Language settings.language = Language
settings.data = Game Data
settings.reset = Reset to Defaults settings.reset = Reset to Defaults
settings.rebind = Rebind settings.rebind = Rebind
settings.controls = Controls settings.controls = Controls
@@ -507,6 +518,7 @@ setting.mutemusic.name = Mute Music
setting.sfxvol.name = SFX Volume setting.sfxvol.name = SFX Volume
setting.mutesound.name = Mute Sound setting.mutesound.name = Mute Sound
setting.crashreport.name = Send Anonymous Crash Reports setting.crashreport.name = Send Anonymous Crash Reports
setting.savecreate.name = Auto-Create Saves
setting.chatopacity.name = Chat Opacity setting.chatopacity.name = Chat Opacity
setting.playerchat.name = Display In-Game Chat setting.playerchat.name = Display In-Game Chat
uiscale.reset = UI scale has been changed.\nPress "OK" to confirm this scale.\n[scarlet]Reverting and exiting in[accent] {0}[] settings... uiscale.reset = UI scale has been changed.\nPress "OK" to confirm this scale.\n[scarlet]Reverting and exiting in[accent] {0}[] settings...
@@ -527,6 +539,7 @@ keybind.press.axis = Press an axis or key...
keybind.screenshot.name = Map Screenshot keybind.screenshot.name = Map Screenshot
keybind.move_x.name = Move x keybind.move_x.name = Move x
keybind.move_y.name = Move y keybind.move_y.name = Move y
keybind.fullscreen.name = Toggle Fullscreen
keybind.select.name = Select/Shoot keybind.select.name = Select/Shoot
keybind.diagonal_placement.name = Diagonal Placement keybind.diagonal_placement.name = Diagonal Placement
keybind.pick.name = Pick Block keybind.pick.name = Pick Block
@@ -790,6 +803,7 @@ block.blast-mixer.name = Blast Mixer
block.solar-panel.name = Solar Panel block.solar-panel.name = Solar Panel
block.solar-panel-large.name = Large Solar Panel block.solar-panel-large.name = Large Solar Panel
block.oil-extractor.name = Oil Extractor block.oil-extractor.name = Oil Extractor
block.command-center.name = Command Center
block.draug-factory.name = Draug Miner Drone Factory block.draug-factory.name = Draug Miner Drone Factory
block.spirit-factory.name = Spirit Drone Factory block.spirit-factory.name = Spirit Drone Factory
block.phantom-factory.name = Phantom Drone Factory block.phantom-factory.name = Phantom Drone Factory
@@ -1012,6 +1026,7 @@ block.ripple.description = A large artillery turret which fires several shots si
block.cyclone.description = A large rapid fire turret. block.cyclone.description = A large rapid fire turret.
block.spectre.description = A large turret which shoots two powerful bullets at once. block.spectre.description = A large turret which shoots two powerful bullets at once.
block.meltdown.description = A large turret which shoots powerful long-range beams. block.meltdown.description = A large turret which shoots powerful long-range beams.
block.command-center.description = Issues movement commands to allied units across the map.\nCauses units to patrol, attack an enemy core or retreat to the core/factory. When no enemy core is present, units will default to patrolling under the attack command.
block.draug-factory.description = Produces Draug mining drones. block.draug-factory.description = Produces Draug mining drones.
block.spirit-factory.description = Produces light drones which mine ore and repair blocks. block.spirit-factory.description = Produces light drones which mine ore and repair blocks.
block.phantom-factory.description = Produces advanced drone units which are significantly more effective than a spirit drone. block.phantom-factory.description = Produces advanced drone units which are significantly more effective than a spirit drone.

View File

@@ -4,7 +4,7 @@ contributors = Tłumacze i pomocnicy
discord = Odwiedź nasz serwer Discord! discord = Odwiedź nasz serwer Discord!
link.discord.description = Oficjalny serwer Discord Mindustry link.discord.description = Oficjalny serwer Discord Mindustry
link.github.description = Kod Gry link.github.description = Kod Gry
link.changelog.description = List of update changes link.changelog.description = Informacje o aktualizacjach
link.dev-builds.description = Niestabilne wersje gry link.dev-builds.description = Niestabilne wersje gry
link.trello.description = Oficjalna tablica Trello z planowanym funkcjami link.trello.description = Oficjalna tablica Trello z planowanym funkcjami
link.itch.io.description = Strona itch.io z oficjanymi wersjami do pobrania link.itch.io.description = Strona itch.io z oficjanymi wersjami do pobrania
@@ -16,6 +16,13 @@ screenshot.invalid = Zrzut ekranu jest zbyt duży. Najprawdopodobniej brakuje mi
gameover = Rdzeń został zniszczony. gameover = Rdzeń został zniszczony.
gameover.pvp = Zwyciężyła drużyna [accent]{0}[]! gameover.pvp = Zwyciężyła drużyna [accent]{0}[]!
highscore = [YELLOW] Nowy rekord! highscore = [YELLOW] Nowy rekord!
load.sound = Dźwięki
load.map = Mapy
load.image = Obrazy
load.content = Treść
load.system = System
stat.wave = Fale powstrzymane:[accent] {0} stat.wave = Fale powstrzymane:[accent] {0}
stat.enemiesDestroyed = Przeciwnicy zniszczeni:[accent] {0} stat.enemiesDestroyed = Przeciwnicy zniszczeni:[accent] {0}
stat.built = Budynki zbudowane:[accent] {0} stat.built = Budynki zbudowane:[accent] {0}
@@ -23,8 +30,7 @@ stat.destroyed = Budynki zniszczone:[accent] {0}
stat.deconstructed = Budynki zrekonstruowane:[accent] {0} stat.deconstructed = Budynki zrekonstruowane:[accent] {0}
stat.delivered = Surowce wystrzelone: stat.delivered = Surowce wystrzelone:
stat.rank = Ocena: [accent]{0} stat.rank = Ocena: [accent]{0}
placeline = Wybrałeś blok.\nMożesz umieścić[accent] w linii,[] [accent]przytrzymując palec przez kilka sekund[] i przeciągając.\nSpróbuj.
removearea = Wybrałeś tryb usuwania.\nMożesz[accent] usunąć bloki w prostokoncie,[] [accent]przytrzymując palec przez kilka sekund i przeciągając[] and dragging.\nTry it.
launcheditems = [accent]Wystrzelone przedmioty launcheditems = [accent]Wystrzelone przedmioty
map.delete = Jesteś pewny, że chcesz usunąć "[accent]{0}[]"? map.delete = Jesteś pewny, że chcesz usunąć "[accent]{0}[]"?
level.highscore = Rekord: [accent]{0} level.highscore = Rekord: [accent]{0}
@@ -43,11 +49,18 @@ newgame = Nowa Gra
none = <none> none = <none>
minimap = Minimapa minimap = Minimapa
close = Zamknij close = Zamknij
website = Website website = Strona Gry
quit = Wyjdź quit = Wyjdź
maps = Mapy maps = Mapy
continue = Kontynuuj continue = Kontynuuj
maps.none = [LIGHT_GRAY]Nie znaleziono żadnych map! maps.none = [LIGHT_GRAY]Nie znaleziono żadnych map!
invalid = Invalid
preparingconfig = Preparing Config
preparingcontent = Preparing Content
uploadingcontent = Uploading Content
uploadingpreviewfile = Uploading Preview File
committingchanges = Comitting Changes
done = Done
about.button = O grze about.button = O grze
name = Nazwa: name = Nazwa:
noname = Najpierw wybierz [accent]nazwę gracza[] noname = Najpierw wybierz [accent]nazwę gracza[]
@@ -62,17 +75,21 @@ players = {0} graczy online
players.single = {0} gracz online players.single = {0} gracz online
server.closing = [accent] Zamykanie serwera... server.closing = [accent] Zamykanie serwera...
server.kicked.kick = Zostałeś wyrzucony z serwera! server.kicked.kick = Zostałeś wyrzucony z serwera!
server.kicked.whitelist = You are not whitelisted here.
server.kicked.serverClose = Serwer został zamknięty. server.kicked.serverClose = Serwer został zamknięty.
server.kicked.vote = Zostałeś wyrzucony z gry. Żegnaj.
server.kicked.clientOutdated = Nieaktualna gra! Zaktualizują ją! server.kicked.clientOutdated = Nieaktualna gra! Zaktualizują ją!
server.kicked.serverOutdated = Nieaktualny serwer! Poproś hosta o jego aktualizację. server.kicked.serverOutdated = Nieaktualny serwer! Poproś hosta o jego aktualizację.
server.kicked.banned = Zostałeś zbanowany na tym serwerze. server.kicked.banned = Zostałeś zbanowany na tym serwerze.
server.kicked.typeMismatch = Ten serwer jest niekompatybilny z twoją wersją gry.
server.kicked.playerLimit = Serwer pełny. Poczekaj na wolny slot.
server.kicked.recentKick = Zostałeś niedawno wyrzucony.\nPoczekaj chwilę przed ponownym połączniem. server.kicked.recentKick = Zostałeś niedawno wyrzucony.\nPoczekaj chwilę przed ponownym połączniem.
server.kicked.nameInUse = Ta nazwa jest już zajęta na tym serwerze. server.kicked.nameInUse = Ta nazwa jest już zajęta na tym serwerze.
server.kicked.nameEmpty = Wybrana przez Ciebie nazwa jest nieprawidłowa. server.kicked.nameEmpty = Wybrana przez Ciebie nazwa jest nieprawidłowa.
server.kicked.idInUse = Jesteś już na serwerze! Używanie tego samego konta na 2 urządzeniach jest zabronione. server.kicked.idInUse = Jesteś już na serwerze! Używanie tego samego konta na 2 urządzeniach jest zabronione.
server.kicked.customClient = Ten serwer nie wspomaga wersji deweloperskich. Pobierz oficjalną wersję. server.kicked.customClient = Ten serwer nie wspomaga wersji deweloperskich. Pobierz oficjalną wersję.
server.kicked.gameover = Koniec gry! server.kicked.gameover = Koniec gry!
server.versions = Your version:[accent] {0}[]\nServer version:[accent] {1}[] server.versions = Twoja wersja gry:[accent] {0}[]\nWersja gry serwera:[accent] {1}[]
host.info = Przycisk [accent]host[] hostuje serwer na porcie [scarlet]6567[] i [scarlet]6568.[]\nKtokolwiek z tym samym [LIGHT_GRAY]wifi lub hotspotem[] powinien zobaczyć twój serwer.\n\nJeśli chcesz, aby każdy z twoim IP mógł dołączyć, [accent]przekierowywanie portów[] jest potrzebne.\n\n[LIGHT_GRAY]Notka:Jeśli ktokolwiek ma problem z dołączeniem do gry, upewnij się, że udostępniłeś Mindustry dostęp do sieci. host.info = Przycisk [accent]host[] hostuje serwer na porcie [scarlet]6567[] i [scarlet]6568.[]\nKtokolwiek z tym samym [LIGHT_GRAY]wifi lub hotspotem[] powinien zobaczyć twój serwer.\n\nJeśli chcesz, aby każdy z twoim IP mógł dołączyć, [accent]przekierowywanie portów[] jest potrzebne.\n\n[LIGHT_GRAY]Notka:Jeśli ktokolwiek ma problem z dołączeniem do gry, upewnij się, że udostępniłeś Mindustry dostęp do sieci.
join.info = Tutaj możesz wpisać [accent]IP serwera[], aby dołączyć lub wyszukaj [accent]serwery w lokalnej sieci[], do których chcesz dołączyć .\nGra wieloosobowa na LAN i WAN jest wspomagana.\n\n[LIGHT_GRAY]Notka: Nie ma automatycznej listy wszystkich serwerów; jeśli chcesz dołączyć przez IP, musisz zapytać się hosta o IP. join.info = Tutaj możesz wpisać [accent]IP serwera[], aby dołączyć lub wyszukaj [accent]serwery w lokalnej sieci[], do których chcesz dołączyć .\nGra wieloosobowa na LAN i WAN jest wspomagana.\n\n[LIGHT_GRAY]Notka: Nie ma automatycznej listy wszystkich serwerów; jeśli chcesz dołączyć przez IP, musisz zapytać się hosta o IP.
hostserver = Stwórz Serwer hostserver = Stwórz Serwer
@@ -81,6 +98,7 @@ host = Hostuj
hosting = [accent] Otwieranie serwera... hosting = [accent] Otwieranie serwera...
hosts.refresh = Odśwież hosts.refresh = Odśwież
hosts.discovering = Wyszukiwanie gier w sieci LAN hosts.discovering = Wyszukiwanie gier w sieci LAN
hosts.discovering.any = Discovering games
server.refreshing = Odświeżanie serwera server.refreshing = Odświeżanie serwera
hosts.none = [lightgray] Brak serwerów w sieci LAN! hosts.none = [lightgray] Brak serwerów w sieci LAN!
host.invalid = [scarlet] Nie można połączyć się z hostem. host.invalid = [scarlet] Nie można połączyć się z hostem.
@@ -88,7 +106,7 @@ trace = Zlokalizuj gracza
trace.playername = Nazwa gracza: [accent]{0} trace.playername = Nazwa gracza: [accent]{0}
trace.ip = IP: [accent]{0} trace.ip = IP: [accent]{0}
trace.id = Wyjątkowe ID: [accent]{0} trace.id = Wyjątkowe ID: [accent]{0}
trace.mobile = Mobile Client: [accent]{0} trace.mobile = Klient Mobilny: [accent]{0}
trace.modclient = Zmodowany klient: [accent]{0} trace.modclient = Zmodowany klient: [accent]{0}
invalidid = Złe ID klienta! Udostępnij raport błędu. invalidid = Złe ID klienta! Udostępnij raport błędu.
server.bans = Bany server.bans = Bany
@@ -110,6 +128,9 @@ confirmunadmin = Jesteś pewny, że chcesz zabrać rangę admina temu graczowi?
joingame.title = Dołącz do gry joingame.title = Dołącz do gry
joingame.ip = IP: joingame.ip = IP:
disconnect = Rozłączono. disconnect = Rozłączono.
disconnect.error = Błąd połączenia.
disconnect.closed = Połączenie zostało zamknięte.
disconnect.timeout = Przekroczono limit czasu.
disconnect.data = Nie udało się załadować mapy! disconnect.data = Nie udało się załadować mapy!
connecting = [accent]Łączenie... connecting = [accent]Łączenie...
connecting.data = [accent]Ładowanie danych świata... connecting.data = [accent]Ładowanie danych świata...
@@ -136,7 +157,7 @@ save.rename = Zmień nazwę
save.rename.text = Nowa nazwa: save.rename.text = Nowa nazwa:
selectslot = Wybierz zapis. selectslot = Wybierz zapis.
slot = [accent]Slot {0} slot = [accent]Slot {0}
save.corrupted = [accent]Zapis gry jest uszkodzony lub nieprawidłowy! Jeżeli aktualizowałeś grę, najprawdopodobniej zmiana w formacie zapisu i [scarlet]nie jest[] to błąd. save.corrupted = [accent]Zapis gry jest uszkodzony lub nieprawidłowy! Jeżeli aktualizowałeś grę, najprawdopodobniej jest to zmiana w formacie zapisu i [scarlet]nie jest[] to błąd.
empty = <pusto> empty = <pusto>
on = Włączone on = Włączone
off = Wyłączone off = Wyłączone
@@ -151,20 +172,25 @@ confirm = Potwierdź
delete = Usuń delete = Usuń
ok = Ok ok = Ok
open = Otwórz open = Otwórz
customize = Customize customize = Dostosuj
cancel = Anuluj cancel = Anuluj
openlink = Otwórz link openlink = Otwórz link
copylink = Kopiuj link copylink = Kopiuj link
back = Wróć back = Wróć
classic.export = Export Classic Data data.export = Eksportuj Dane
classic.export.text = [accent]Mindustry[] has just had a major update.\nClassic (v3.5 build 40) save or map data has been detected. Would you like to export these saves to your phone's home folder, for use in the Mindustry Classic app? data.import = Importuj Dane
data.exported = Dane wyeksportowane.
data.invalid = Nieprawidłowe dane gry.
data.import.confirm = Zaimportowanie zewnętrznych danych usunie[scarlet] wszystkie[] obecne dane gry.\n[accent]Nie można tego cofnąć![]\n\nGdy dane zostaną zimportowane, gra automatycznie się wyłączy.
classic.export = Eksportuj dane wersji klasycznej
classic.export.text = [accent]Mindustry[] otrzymało ostatnio ważną aktualizację.\nClassic (v3.5 build 40) zapis albo mapa zostały wykryte. Czy chciałbyś eksportować te zapisy do katalogu domowego swojego telefonu, do użycia w aplikacji Mindustry Classic?
quit.confirm = Czy na pewno chcesz wyjść? quit.confirm = Czy na pewno chcesz wyjść?
quit.confirm.tutorial = Are you sure you know what you're doing?\nThe tutorial can be re-taken in[accent] Settings->Game->Re-Take Tutorial.[] quit.confirm.tutorial = Czy jesteś pewien tego co robisz?\nSamouczek może zostać powtórzony w[accent] Opcje->Gra->Powtórz samouczek.[]
loading = [accent]Ładowanie... loading = [accent]Ładowanie...
saving = [accent]Zapisywanie... saving = [accent]Zapisywanie...
wave = [accent]Fala {0} wave = [accent]Fala {0}
wave.waiting = Fala za {0} wave.waiting = Fala za {0}
wave.waveInProgress = [LIGHT_GRAY]Wave in progress wave.waveInProgress = [LIGHT_GRAY]Fala w trakcie
waiting = [LIGHT_GRAY]Oczekiwanie... waiting = [LIGHT_GRAY]Oczekiwanie...
waiting.players = Oczekiwanie na graczy... waiting.players = Oczekiwanie na graczy...
wave.enemies = Pozostało [LIGHT_GRAY]{0} wrogów wave.enemies = Pozostało [LIGHT_GRAY]{0} wrogów
@@ -180,6 +206,9 @@ map.nospawn = Ta mapa nie zawiera żadnego rdzenia! Dodaj [ROYAL]niebieski[] rdz
map.nospawn.pvp = Ta mapa nie ma żadnego rdzenia przeciwnika, aby mogli się zrespić przeciwnicy! Dodaj[SCARLET] inny niż niebieski[] rdzeń do mapy w edytorze. map.nospawn.pvp = Ta mapa nie ma żadnego rdzenia przeciwnika, aby mogli się zrespić przeciwnicy! Dodaj[SCARLET] inny niż niebieski[] rdzeń do mapy w edytorze.
map.nospawn.attack = Ta mapa nie ma żadnego rdzenia przeciwnika, aby można było go zaatakować! Dodaj[SCARLET] czerwony[] rdzeń do mapy w edytorze. map.nospawn.attack = Ta mapa nie ma żadnego rdzenia przeciwnika, aby można było go zaatakować! Dodaj[SCARLET] czerwony[] rdzeń do mapy w edytorze.
map.invalid = Błąd podczas ładowania mapy: uszkodzony lub niepoprawny plik mapy. map.invalid = Błąd podczas ładowania mapy: uszkodzony lub niepoprawny plik mapy.
map.publish.error = Błąd podczas publikowania mapy: {0}
map.publish = Opublikowano mapę.
map.publishing = [accent]Publikowanie mapy...
editor.brush = Pędzel editor.brush = Pędzel
editor.openin = Otwórz w edytorze editor.openin = Otwórz w edytorze
editor.oregen = Generacja złóż editor.oregen = Generacja złóż
@@ -188,19 +217,21 @@ editor.mapinfo = Informacje o mapie
editor.author = Autor: editor.author = Autor:
editor.description = Opis: editor.description = Opis:
editor.waves = Fale: editor.waves = Fale:
editor.rules = Rules: editor.rules = Zasady:
editor.generation = Generation: editor.generation = Generacja:
editor.ingame = Edytuj w grze editor.ingame = Edytuj w grze
editor.newmap = New Map editor.publish.workshop = Opublikuj w Workshop
editor.newmap = Nowa Mapa
workshop = Workshop
waves.title = Fale waves.title = Fale
waves.remove = Usuń waves.remove = Usuń
waves.never = <nigdy> waves.never = <nigdy>
waves.every = co waves.every = co
waves.waves = wave(s) waves.waves = fal(e)
waves.perspawn = per spawn waves.perspawn = co pojawienie
waves.to = do waves.to = do
waves.boss = Boss waves.boss = Boss
waves.preview = Preview waves.preview = Podgląd
waves.edit = Edytuj... waves.edit = Edytuj...
waves.copy = Kopiuj do schowka waves.copy = Kopiuj do schowka
waves.load = Załaduj ze schowka waves.load = Załaduj ze schowka
@@ -208,15 +239,17 @@ waves.invalid = Nieprawidłowe fale w schowku.
waves.copied = Fale zostały skopiowane. waves.copied = Fale zostały skopiowane.
waves.none = Brak zdefiniowanych wrogów.\nPamiętaj, że puste układy fal zostaną automatycznie zastąpione układem domyślnym. waves.none = Brak zdefiniowanych wrogów.\nPamiętaj, że puste układy fal zostaną automatycznie zastąpione układem domyślnym.
editor.default = [LIGHT_GRAY]<Domyślne> editor.default = [LIGHT_GRAY]<Domyślne>
details = Detale...
edit = Edytuj... edit = Edytuj...
editor.name = Nazwa: editor.name = Nazwa:
editor.spawn = Spawn Unit editor.spawn = Stwórz jednostkę
editor.removeunit = Remove Unit editor.removeunit = Usuń jednostkę
editor.teams = Drużyny editor.teams = Drużyny
editor.errorload = Błąd podczas ładowania pliku:\n[accent]{0} editor.errorload = Błąd podczas ładowania pliku:\n[accent]{0}
editor.errorsave = Błąd podczas zapisywania pliku:\n[accent]{0} editor.errorsave = Błąd podczas zapisywania pliku:\n[accent]{0}
editor.errorimage = To obraz, nie mapa. Nie zmieniaj rozszeżenia spodziewając sie że to coś zmieni.\n\nJeśli chcesz zaimportować starszą mapę, użyj przycisku „importuj starszą mapę” w edytorze. editor.errorimage = To obraz, nie mapa. Nie zmieniaj rozszeżenia spodziewając sie że to coś zmieni.\n\nJeśli chcesz zaimportować starszą mapę, użyj przycisku „importuj starszą mapę” w edytorze.
editor.errorlegacy = Ta mapa jest zbyt stara i używa starszego formatu mapy, który nie jest już obsługiwany. editor.errorlegacy = Ta mapa jest zbyt stara i używa starszego formatu mapy, który nie jest już obsługiwany.
editor.errornot = To nie jest plik mapy.
editor.errorheader = Ten plik mapy jest nieprawidłowy lub uszkodzony. editor.errorheader = Ten plik mapy jest nieprawidłowy lub uszkodzony.
editor.errorname = Mapa nie zawiera nazwy. editor.errorname = Mapa nie zawiera nazwy.
editor.update = Aktualizuj editor.update = Aktualizuj
@@ -250,6 +283,7 @@ editor.mapname = Nazwa mapy:
editor.overwrite = [accent]Uwaga!\nSpowoduje to nadpisanie istniejącej mapy. editor.overwrite = [accent]Uwaga!\nSpowoduje to nadpisanie istniejącej mapy.
editor.overwrite.confirm = [scarlet]Uwaga![] Mapa pod tą nazwą już istnieje. Jesteś pewny, że chcesz ją nadpisać? editor.overwrite.confirm = [scarlet]Uwaga![] Mapa pod tą nazwą już istnieje. Jesteś pewny, że chcesz ją nadpisać?
editor.selectmap = Wybierz mapę do załadowania: editor.selectmap = Wybierz mapę do załadowania:
toolmode.replace = Zastąp toolmode.replace = Zastąp
toolmode.replace.description = Rysuje tylko na stałych blokach. toolmode.replace.description = Rysuje tylko na stałych blokach.
toolmode.replaceall = Zastąp wszystko toolmode.replaceall = Zastąp wszystko
@@ -257,30 +291,31 @@ toolmode.replaceall.description = Zastąp wszystkie bloki na mapie.
toolmode.orthogonal = Prostokątny toolmode.orthogonal = Prostokątny
toolmode.orthogonal.description = Rysuje tylko prostopadłe linie. toolmode.orthogonal.description = Rysuje tylko prostopadłe linie.
toolmode.square = Kwadrat toolmode.square = Kwadrat
toolmode.square.description = Square brush. toolmode.square.description = Kwadratowy pędzel.
toolmode.eraseores = Wymaż Rudy toolmode.eraseores = Wymaż Rudy
toolmode.eraseores.description = Usuń tylko rudy. toolmode.eraseores.description = Usuń tylko rudy.
toolmode.fillteams = Wypełń Drużyny toolmode.fillteams = Wypełń Drużyny
toolmode.fillteams.description = Wypełniaj drużyny zamiast bloków. toolmode.fillteams.description = Wypełniaj drużyny zamiast bloków.
toolmode.drawteams = Rysuj Drużyny toolmode.drawteams = Rysuj Drużyny
toolmode.drawteams.description = Rysuj drużyny zamiast bloków. toolmode.drawteams.description = Rysuj drużyny zamiast bloków.
filters.empty = [LIGHT_GRAY]Brak filtrów! Dodaj jeden za pomocą przycisku poniżej. filters.empty = [LIGHT_GRAY]Brak filtrów! Dodaj jeden za pomocą przycisku poniżej.
filter.distort = Zniekształcanie filter.distort = Zniekształcanie
filter.noise = Szum filter.noise = Szum
filter.median = Median filter.median = Mediana
filter.oremedian = Ore Median filter.oremedian = Mediana rud
filter.blend = Blend filter.blend = Wtopienie
filter.defaultores = Domyślne rudy filter.defaultores = Domyślne rudy
filter.ore = Ruda filter.ore = Ruda
filter.rivernoise = Szum rzeki filter.rivernoise = Szum rzeki
filter.mirror = Lustro filter.mirror = Lustro
filter.clear = Oczyść filter.clear = Oczyść
filter.option.ignore = Ignore filter.option.ignore = Ignoruj
filter.scatter = Zozprosz filter.scatter = Rozprosz
filter.terrain = Teren filter.terrain = Teren
filter.option.scale = Skala filter.option.scale = Skala
filter.option.chance = Szansa filter.option.chance = Szansa
filter.option.mag = Magnituda filter.option.mag = Wielkość
filter.option.threshold = Próg filter.option.threshold = Próg
filter.option.circle-scale = Skala koła filter.option.circle-scale = Skala koła
filter.option.octaves = Oktawy filter.option.octaves = Oktawy
@@ -292,14 +327,15 @@ filter.option.flooronto = Podłoga Docelowa
filter.option.wall = Ściana filter.option.wall = Ściana
filter.option.ore = Ruda filter.option.ore = Ruda
filter.option.floor2 = Druga podłoga filter.option.floor2 = Druga podłoga
filter.option.threshold2 = Secondary Threshold filter.option.threshold2 = Drugi próg
filter.option.radius = Zasięg filter.option.radius = Zasięg
filter.option.percentile = Percentyl filter.option.percentile = Percentyl
width = Szerokość: width = Szerokość:
height = Wysokość: height = Wysokość:
menu = Menu menu = Menu
play = Graj play = Graj
campaign = Campaign campaign = Kampania
load = Wczytaj load = Wczytaj
save = Zapisz save = Zapisz
fps = FPS: {0} fps = FPS: {0}
@@ -308,10 +344,11 @@ ping = Ping: {0}ms
language.restart = Uruchom grę ponownie, aby ustawiony język zaczął funkcjonować. language.restart = Uruchom grę ponownie, aby ustawiony język zaczął funkcjonować.
settings = Ustawienia settings = Ustawienia
tutorial = Poradnik tutorial = Poradnik
tutorial.retake = Re-Take Tutorial tutorial.retake = Ponów Samouczek
editor = Edytor editor = Edytor
mapeditor = Edytor map mapeditor = Edytor map
donate = Wspomóż nas donate = Wspomóż nas
abandon = Opuść abandon = Opuść
abandon.text = Ta strefa i wszystkie jej surowce będą przejęte przez przeciwników. abandon.text = Ta strefa i wszystkie jej surowce będą przejęte przez przeciwników.
locked = Zablokowane locked = Zablokowane
@@ -322,21 +359,23 @@ bestwave = [LIGHT_GRAY]Najwyższa fala: {0}
launch = < WYSTRZEL > launch = < WYSTRZEL >
launch.title = Wystrzelenie Udane launch.title = Wystrzelenie Udane
launch.next = [LIGHT_GRAY]Następna okazja przy fali {0} launch.next = [LIGHT_GRAY]Następna okazja przy fali {0}
launch.unable2 = [scarlet]Unable to LAUNCH.[] launch.unable2 = [scarlet]WYSTZRZELENIE niedostępne.[]
launch.confirm = Spowoduje to wystrzelenie wszystkich surowców w rdzeniu.\nNie będziesz mógł wrócić do tej bazy. launch.confirm = Spowoduje to wystrzelenie wszystkich surowców w rdzeniu.\nNie będziesz mógł wrócić do tej bazy.
launch.skip.confirm = If you skip now, you will not be able to launch until later waves. launch.skip.confirm = Jeśli teraz przejdziesz do kolejnej fali, Nie biędziesz miał możliwości wystrzelenia do czasu pokonania dalszych fal.
uncover = Odkryj uncover = Odkryj
configure = Skonfiguruj ładunek configure = Skonfiguruj ładunek
configure.locked = [LIGHT_GRAY]Dotrzyj do fali {0}\nAby skonfigurować ładunek. configure.locked = [LIGHT_GRAY]Dotrzyj do fali {0}\nAby skonfigurować ładunek.
configure.invalid = Ilość musi być liczbą pomiędzy 0 a {0}.
zone.unlocked = [LIGHT_GRAY]Strefa {0} odblokowana. zone.unlocked = [LIGHT_GRAY]Strefa {0} odblokowana.
zone.requirement.complete = Fala {0} osiągnięta:\n{1} Wymagania strefy zostały spełnione. zone.requirement.complete = Fala {0} osiągnięta:\n{1} Wymagania strefy zostały spełnione.
zone.config.complete = Fala {0} osiągnięta:\nKonfiguracja ładunku odblokowana. zone.config.complete = Fala {0} osiągnięta:\nKonfiguracja ładunku odblokowana.
zone.resources = Wykryte Zasoby: zone.resources = Wykryte Zasoby:
zone.objective = [lightgray]Objective: [accent]{0} zone.objective = [lightgray]Cel: [accent]{0}
zone.objective.survival = Przeżyj zone.objective.survival = Przeżyj
zone.objective.attack = Zniszcz Rdzeń Wroga zone.objective.attack = Zniszcz Rdzeń Wroga
add = Dodaj... add = Dodaj...
boss.health = Boss Health boss.health = Zdrowie Bossa
connectfail = [crimson]Nie można połączyć się z serwerem:\n\n[accent]{0} connectfail = [crimson]Nie można połączyć się z serwerem:\n\n[accent]{0}
error.unreachable = Serwer niedostępny.\nCzy adres jest wpisany poprawnie? error.unreachable = Serwer niedostępny.\nCzy adres jest wpisany poprawnie?
error.invalidaddress = Niepoprawny adres. error.invalidaddress = Niepoprawny adres.
@@ -346,36 +385,39 @@ error.alreadyconnected = Jesteś już połączony.
error.mapnotfound = Plik mapy nie został znaleziony! error.mapnotfound = Plik mapy nie został znaleziony!
error.io = Błąd siecowy I/O. error.io = Błąd siecowy I/O.
error.any = Nieznany błąd sieci. error.any = Nieznany błąd sieci.
error.bloom = Failed to initialize bloom.\nYour device may not support it. error.bloom = Nie udało się załadować bloom.\nTwoje urządzenie może nie wspierać tej funkcji.
zone.groundZero.name = Wybuch Lądowy zone.groundZero.name = Wybuch Lądowy
zone.desertWastes.name = Pustynne Pustkowia zone.desertWastes.name = Pustynne Pustkowia
zone.craters.name = Kratery zone.craters.name = Kratery
zone.frozenForest.name = Zamrożony Las zone.frozenForest.name = Zamrożony Las
zone.ruinousShores.name = Zniszczone Przybrzerza zone.ruinousShores.name = Zniszczone Przybrzeża
zone.stainedMountains.name = Zabarwione Góry zone.stainedMountains.name = Zabarwione Góry
zone.desolateRift.name = Ponura Szczelina zone.desolateRift.name = Ponura Szczelina
zone.nuclearComplex.name = Centrum Wyrobu Jądrowego zone.nuclearComplex.name = Centrum Wyrobu Jądrowego
zone.overgrowth.name = Przerośnięty Las zone.overgrowth.name = Przerośnięty Las
zone.tarFields.name = Pola Smołowe zone.tarFields.name = Pola Smołowe
zone.saltFlats.name = Salt Flats zone.saltFlats.name = Solne Równiny
zone.impact0078.name = Uderzenie 0078 zone.impact0078.name = Uderzenie 0078
zone.crags.name = Urwisko zone.crags.name = Urwisko
zone.fungalPass.name = Fungal Pass zone.fungalPass.name = Grzybowa Przełęcz
zone.groundZero.description = Optymalna lokalizacja, aby rozpocząć jeszcze raz. Niskie zagrożenie. Niewiele zasobów.\nZbierz jak najwięcej miedzi i ołowiu, tyle ile jest możliwe.\nPrzejdź do następnej strefy jak najszybciej. zone.groundZero.description = Optymalna lokalizacja, aby rozpocząć jeszcze raz. Niskie zagrożenie. Niewiele zasobów.\nZbierz jak najwięcej miedzi i ołowiu, tyle ile jest możliwe.\nPrzejdź do następnej strefy jak najszybciej.
zone.frozenForest.description = Nawet tutaj, bliżej gór, zarodniki rozprzestrzeniły się. Niskie temperatury nie mogą ich zatrzymać na zawsze.\n\nRozpocznij przedsięwzięcie od władzy. Buduj generatory spalinowe. Naucz się korzystać z naprawiaczy. zone.frozenForest.description = Nawet tutaj, bliżej gór, zarodniki rozprzestrzeniły się. Niskie temperatury nie mogą ich zatrzymać na zawsze.\n\nRozpocznij przedsięwzięcie od władzy. Buduj generatory spalinowe. Naucz się korzystać z naprawiaczy.
zone.desertWastes.description = These wastes are vast, unpredictable, and criss-crossed with derelict sector structures.\nCoal is present in the region. Burn it for power, or synthesize graphite.\n\n[lightgray]This landing location cannot be guaranteed. zone.desertWastes.description = Te pustkowia są rozległe, nieprzewidywalne, i znajdują się na nich opuszczone struktury.\nWęgiel jest obecny w tym regionie. Użyj go do produkcji energii, lub do stworzenia grafitu.\n\n[lightgray]Miejsce lądowania nie jest pewne.
zone.saltFlats.description = On the outskirts of the desert lie the Salt Flats. Few resources can be found in this location.\n\nThe enemy has erected a resource storage complex here. Eradicate their core. Leave nothing standing. zone.saltFlats.description = Na obrzeżach pustyni spoczywają Solne Równiny. Można tu znaleźć niewiele surowców.\n\nWrogowie zbudowali tu bazę składującą surowce. Zniszcz ich rdżeń. Zniszcz wszystko co stanie ci na drodze.
zone.craters.description = Water has accumulated in this crater, relic of the old wars. Reclaim the area. Collect sand. Smelt metaglass. Pump water to cool turrets and drills. zone.craters.description = W tym kraterze zebrała się woda. Pozostałość dawnych wojen. Odzyskaj ten teren. Wykop piasek. Wytop metaszkło. Pompuj wodę do działek obronnych i wierteł by je schłodzić
zone.ruinousShores.description = Past the wastes, is the shoreline. Once, this location housed a coastal defense array. Not much of it remains. Only the most basic defense structures have remained unscathed, everything else reduced to scrap.\nContinue the expansion outwards. Rediscover the technology. zone.ruinousShores.description = Za pustkowiami ciągnie się linia brzegowa. Kiedyś znajdowała się tu przybrzeżna linia obronna. Niewiele z niej zostało. Ostały się tylko podstawowe struktury obronne, z reszty został tylko złom.\nKontynuuj eksploracje. Odkryj pozostawioną tu technolog.
zone.stainedMountains.description = W głębi lądu leżą góry, jeszcze nieskażone przez zarodniki.\nWydobądź obfity tytan w tym obszarze. Dowiedz się, jak z niego korzystać.\n\nObecność wroga jest tutaj większa. Nie daj im czasu na wysłanie swoich najsilniejszych jednostek. zone.stainedMountains.description = W głębi lądu leżą góry, jeszcze nieskażone przez zarodniki.\nWydobądź obfity tytan w tym obszarze. Dowiedz się, jak z niego korzystać.\n\nObecność wroga jest tutaj większa. Nie daj im czasu na wysłanie swoich najsilniejszych jednostek.
zone.overgrowth.description = Obszar ten jest zarośnięty, bliżej źródła zarodników.\nWróg założył tu placówkę. Zbuduj jednostki Nóż. Zniszcz to. Odzyskaj to, co nam odebrano. zone.overgrowth.description = Obszar ten jest zarośnięty, bliżej źródła zarodników.\nWróg założył tu placówkę. Zbuduj jednostki Nóż. Zniszcz to. Odzyskaj to, co nam odebrano.
zone.tarFields.description = Obrzeża strefy produkcji ropy, między górami a pustynią. Jeden z niewielu obszarów z rezerwami użytecznej smoły.\nMimo że ta strefa jest opuszczona, w pobliżu znajdują się niebezpieczne siły wroga. Nie lekceważ ich.\n\n[lightgray]Jeśli to możliwe, zbadaj technologię przetwarzania oleju. zone.tarFields.description = Obrzeża strefy produkcji ropy, między górami a pustynią. Jeden z niewielu obszarów z rezerwami użytecznej smoły.\nMimo że ta strefa jest opuszczona, w pobliżu znajdują się niebezpieczne siły wroga. Nie lekceważ ich.\n\n[lightgray]Jeśli to możliwe, zbadaj technologię przetwarzania oleju.
zone.desolateRift.description = Strefa wyjątkowo niebezpieczna. Opfita w zasoby ale mało miejsca. Wysokie ryzyko zniszczenia. Opuść tę strefe jak najszybciej. Nie daj się zwieść długiemu odstępowi między atakami wroga. zone.desolateRift.description = Strefa wyjątkowo niebezpieczna. Obfita w zasoby ale mało miejsca. Wysokie ryzyko zniszczenia. Opuść tę strefe jak najszybciej. Nie daj się zwieść długiemu odstępowi między atakami wroga.
zone.nuclearComplex.description = Dawny zakład produkcji i przetwarzania toru, zredukowny do ruin.\n[lightgray]Zbadaj tor i jego zastosowania.\n\nWróg jest tutaj obecny w dużej ilości, nieustannie poszukuje napastników. zone.nuclearComplex.description = Dawny zakład produkcji i przetwarzania toru, zredukowny do ruin.\n[lightgray]Zbadaj tor i jego zastosowania.\n\nWróg jest tutaj obecny w dużej ilości, nieustannie poszukuje napastników.
zone.fungalPass.description = A transition area between high mountains and lower, spore-ridden lands. A small enemy reconnaissance base is located here.\nDestroy it.\nUse Dagger and Crawler units. Take out the two cores. zone.fungalPass.description = Przejściowy obszar pomiędzy wysokimi górami a nisko znajdującymi się, ogarniętymi przez zarodniki równinami. Znajduje się tu mała postawiona przez wrogów baza zwiadowcza.\nZniszcz ją.\nUżyj jednostek Nóż i Pełzak. Zniszcz oba rdżenie.
zone.impact0078.description = <insert description here> zone.impact0078.description = <insert description here>
zone.crags.description = <insert description here> zone.crags.description = <insert description here>
settings.language = Język settings.language = Język
settings.data = Dane Gry
settings.reset = Przywróć domyślne settings.reset = Przywróć domyślne
settings.rebind = Zmień settings.rebind = Zmień
settings.controls = Sterowanie settings.controls = Sterowanie
@@ -393,14 +435,14 @@ no = Nie ma mowy!
info.title = Informacje info.title = Informacje
error.title = [crimson]Wystąpił błąd error.title = [crimson]Wystąpił błąd
error.crashtitle = Wystąpił błąd error.crashtitle = Wystąpił błąd
attackpvponly = [scarlet]Only available in Attack/PvP modes attackpvponly = [scarlet]Dostępne tylko w trybach Atak/PvP
blocks.input = Wejście blocks.input = Wejście
blocks.output = Wyjście blocks.output = Wyjście
blocks.booster = Wzmacniacz blocks.booster = Wzmacniacz
block.unknown = [LIGHT_GRAY]??? block.unknown = [LIGHT_GRAY]???
blocks.powercapacity = Pojemność mocy blocks.powercapacity = Pojemność mocy
blocks.powershot = moc/strzał blocks.powershot = moc/strzał
blocks.damage = Damage blocks.damage = Obrażenia
blocks.targetsair = Namierzanie wrogów powietrznych blocks.targetsair = Namierzanie wrogów powietrznych
blocks.targetsground = Namierzanie wrogów lądowych blocks.targetsground = Namierzanie wrogów lądowych
blocks.itemsmoved = Prędkość poruszania się blocks.itemsmoved = Prędkość poruszania się
@@ -423,22 +465,26 @@ blocks.boosteffect = Efekt wzmocnienia
blocks.maxunits = Maksymalna ilość jednostek blocks.maxunits = Maksymalna ilość jednostek
blocks.health = Zdrowie blocks.health = Zdrowie
blocks.buildtime = Czas budowy blocks.buildtime = Czas budowy
blocks.buildcost = Koszt budowy
blocks.inaccuracy = Niedokładność blocks.inaccuracy = Niedokładność
blocks.shots = Strzały blocks.shots = Strzały
blocks.reload = Strzałów/sekundę blocks.reload = Strzałów/sekundę
blocks.ammo = Amunicja blocks.ammo = Amunicja
bar.drilltierreq = Better Drill Required
bar.drilltierreq = Wymagane Lepsze Wiertło
bar.drillspeed = Prędkość wiertła: {0}/s bar.drillspeed = Prędkość wiertła: {0}/s
bar.efficiency = Efektywność: {0}% bar.efficiency = Efektywność: {0}%
bar.powerbalance = Moc: {0} bar.powerbalance = Moc: {0}
bar.poweramount = Moc: {0} bar.poweramount = Moc: {0}
bar.poweroutput = Wyjście mocy: {0} bar.poweroutput = Wyjście mocy: {0}
bar.items = Przedmiotów: {0} bar.items = Przedmiotów: {0}
bar.capacity = Pojemność: {0}
bar.liquid = Płyn bar.liquid = Płyn
bar.heat = Ciepło bar.heat = Ciepło
bar.power = Prąd bar.power = Prąd
bar.progress = Postęp Budowy bar.progress = Postęp Budowy
bar.spawned = Jednostki: {0}/{1} bar.spawned = Jednostki: {0}/{1}
bullet.damage = [stat]{0}[lightgray] Obrażenia bullet.damage = [stat]{0}[lightgray] Obrażenia
bullet.splashdamage = [stat]{0}[lightgray] Obrażenia obszarowe ~[stat] {1}[lightgray] kratki bullet.splashdamage = [stat]{0}[lightgray] Obrażenia obszarowe ~[stat] {1}[lightgray] kratki
bullet.incendiary = [stat]zapalający bullet.incendiary = [stat]zapalający
@@ -450,6 +496,7 @@ bullet.freezing = [stat]zamrażający
bullet.tarred = [stat]smolny bullet.tarred = [stat]smolny
bullet.multiplier = [stat]{0}[lightgray]x mnożnik amunicji bullet.multiplier = [stat]{0}[lightgray]x mnożnik amunicji
bullet.reload = [stat]{0}[lightgray]x szybkość ataku bullet.reload = [stat]{0}[lightgray]x szybkość ataku
unit.blocks = Klocki unit.blocks = Klocki
unit.powersecond = jednostek prądu na sekundę unit.powersecond = jednostek prądu na sekundę
unit.liquidsecond = jednostek płynów na sekundę unit.liquidsecond = jednostek płynów na sekundę
@@ -471,17 +518,17 @@ category.shooting = Strzelanie
category.optional = Dodatkowe ulepszenia category.optional = Dodatkowe ulepszenia
setting.landscape.name = Zablokuj tryb panoramiczny setting.landscape.name = Zablokuj tryb panoramiczny
setting.shadows.name = Cienie setting.shadows.name = Cienie
setting.linear.name = Linear Filtering setting.linear.name = Filtrowanie Liniowe
setting.animatedwater.name = Animowana woda setting.animatedwater.name = Animowana woda
setting.animatedshields.name = Animowana Tarcza setting.animatedshields.name = Animowana Tarcza
setting.antialias.name = Antialias[LIGHT_GRAY] (wymaga restartu)[] setting.antialias.name = Antialias[LIGHT_GRAY] (wymaga restartu)[]
setting.indicators.name = Wskaźniki Przyjaciół setting.indicators.name = Wskaźniki Przyjaciół
setting.autotarget.name = Automatyczne Celowanie setting.autotarget.name = Automatyczne Celowanie
setting.keyboard.name = Mouse+Keyboard Controls setting.keyboard.name = Sterowanie Myszka+Klawiatura
setting.fpscap.name = Maksymalny FPS setting.fpscap.name = Maksymalny FPS
setting.fpscap.none = Nieograniczone setting.fpscap.none = Nieograniczone
setting.fpscap.text = {0} FPS setting.fpscap.text = {0} FPS
setting.uiscale.name = UI Scaling[lightgray] (require restart)[] setting.uiscale.name = Skalowanie Interfejsu[lightgray] (wymaga restartu)[]
setting.swapdiagonal.name = Pozwala na ukośne stawianie setting.swapdiagonal.name = Pozwala na ukośne stawianie
setting.difficulty.training = trening setting.difficulty.training = trening
setting.difficulty.easy = Łatwy setting.difficulty.easy = Łatwy
@@ -502,18 +549,21 @@ setting.lasers.name = Pokaż lasery zasilające
setting.pixelate.name = Pikselacja [LIGHT_GRAY](wyłącza animacje) setting.pixelate.name = Pikselacja [LIGHT_GRAY](wyłącza animacje)
setting.minimap.name = Pokaż Minimapę setting.minimap.name = Pokaż Minimapę
setting.musicvol.name = Głośność muzyki setting.musicvol.name = Głośność muzyki
setting.ambientvol.name = Ambient Volume setting.ambientvol.name = Głośność otoczenia
setting.mutemusic.name = Wycisz muzykę setting.mutemusic.name = Wycisz muzykę
setting.sfxvol.name = Głośność dźwięków setting.sfxvol.name = Głośność dźwięków
setting.mutesound.name = Wycisz dźwięki setting.mutesound.name = Wycisz dźwięki
setting.crashreport.name = Wysyłaj anonimowo dane o crashu gry setting.crashreport.name = Wysyłaj anonimowo dane o crashu gry
setting.savecreate.name = Automatyczne tworzenie zapisu
setting.publichost.name = Widoczność gry publicznej
setting.chatopacity.name = Przezroczystość czatu setting.chatopacity.name = Przezroczystość czatu
setting.playerchat.name = Wyświetlaj czat w grze setting.playerchat.name = Wyświetlaj czat w grze
uiscale.reset = UI scale has been changed.\nPress "OK" to confirm this scale.\n[scarlet]Reverting and exiting in[accent] {0}[] settings... uiscale.reset = Skala interfejsu uległa zmianie.\nNaciśnij "OK" by potwierdzić zmiany.\n[scarlet]Cofanie zmian i wyjście z gry za[accent] {0}[]
uiscale.cancel = Cancel & Exit uiscale.cancel = Anuluj i wyjdź
setting.bloom.name = Bloom setting.bloom.name = Bloom
keybind.title = Zmień keybind.title = Zmień
keybinds.mobile = [scarlet]Most keybinds here are not functional on mobile. Only basic movement is supported. keybinds.mobile = [scarlet]Większość skrótów klawiszowych nie funkcjonuje w wersji mobilnej. Tylko podstawowe poruszanie się jest wspierane.
category.general.name = Ogólne category.general.name = Ogólne
category.view.name = Wyświetl category.view.name = Wyświetl
category.multiplayer.name = Multiplayer category.multiplayer.name = Multiplayer
@@ -527,8 +577,9 @@ keybind.press.axis = Naciśnij oś lub klawisz...
keybind.screenshot.name = Zrzut ekranu mapy keybind.screenshot.name = Zrzut ekranu mapy
keybind.move_x.name = Poruszanie w poziomie keybind.move_x.name = Poruszanie w poziomie
keybind.move_y.name = Poruszanie w pionie keybind.move_y.name = Poruszanie w pionie
keybind.fullscreen.name = Toggle Fullscreen
keybind.select.name = Zaznacz keybind.select.name = Zaznacz
keybind.diagonal_placement.name = Diagonal Placement keybind.diagonal_placement.name = Budowa po skosie
keybind.pick.name = Wybierz Blok keybind.pick.name = Wybierz Blok
keybind.break_block.name = Zniszcz Blok keybind.break_block.name = Zniszcz Blok
keybind.deselect.name = Odznacz keybind.deselect.name = Odznacz
@@ -537,7 +588,7 @@ keybind.zoom_hold.name = Inicjator przybliżania
keybind.zoom.name = Przybliżanie keybind.zoom.name = Przybliżanie
keybind.menu.name = Menu keybind.menu.name = Menu
keybind.pause.name = Pauza keybind.pause.name = Pauza
keybind.minimap.name = Minimap keybind.minimap.name = Minimapa
keybind.dash.name = Przyspieszenie keybind.dash.name = Przyspieszenie
keybind.chat.name = Czat keybind.chat.name = Czat
keybind.player_list.name = Lista graczy keybind.player_list.name = Lista graczy
@@ -559,24 +610,25 @@ mode.pvp.description = Walcz przeciwko innym graczom.
mode.attack.name = Atak mode.attack.name = Atak
mode.attack.description = Brak fal, celem jest zniszczenie bazy przeciwnika. mode.attack.description = Brak fal, celem jest zniszczenie bazy przeciwnika.
mode.custom = Własny tryb mode.custom = Własny tryb
rules.infiniteresources = Nieskończone zasoby rules.infiniteresources = Nieskończone zasoby
rules.wavetimer = Zegar fal rules.wavetimer = Zegar fal
rules.waves = Fale rules.waves = Fale
rules.attack = Attack Mode rules.attack = Tryb Ataku
rules.enemyCheat = Nieskończone zasoby komputera-przeciwnika (czerwonego zespołu) rules.enemyCheat = Nieskończone zasoby komputera-przeciwnika (czerwonego zespołu)
rules.unitdrops = Unit Drops rules.unitdrops = Surowce z zniszczonych jednostek
rules.unitbuildspeedmultiplier = Mnożnik Prędkości Tworzenia Jednostek rules.unitbuildspeedmultiplier = Mnożnik Prędkości Tworzenia Jednostek
rules.unithealthmultiplier = Mnożnik Życia Jednostek rules.unithealthmultiplier = Mnożnik Życia Jednostek
rules.playerhealthmultiplier = Mnożnik Życia Gracza rules.playerhealthmultiplier = Mnożnik Życia Gracza
rules.playerdamagemultiplier = Mnożnik Obrażeń Gracza rules.playerdamagemultiplier = Mnożnik Obrażeń Gracza
rules.unitdamagemultiplier = Mnożnik Obrażeń Jednostek rules.unitdamagemultiplier = Mnożnik Obrażeń Jednostek
rules.enemycorebuildradius = Enemy Core No-Build Radius:[LIGHT_GRAY] (tiles) rules.enemycorebuildradius = Zasięg blokady budowy przy rdżeniu wroga:[LIGHT_GRAY] (kratki)
rules.respawntime = Respawn Time:[LIGHT_GRAY] (sec) rules.respawntime = Czas Odrodzenia:[LIGHT_GRAY] (sek)
rules.wavespacing = Odstępy między falami:[LIGHT_GRAY] (sek) rules.wavespacing = Odstępy między falami:[LIGHT_GRAY] (sek)
rules.buildcostmultiplier = Mnożnik Kosztów Budowania rules.buildcostmultiplier = Mnożnik Kosztów Budowania
rules.buildspeedmultiplier = Mnożnik Prędkości Budowania rules.buildspeedmultiplier = Mnożnik Prędkości Budowania
rules.waitForWaveToEnd = Fale czekają na przeciwników rules.waitForWaveToEnd = Fale czekają na przeciwników
rules.dropzoneradius = Drop Zone Radius:[LIGHT_GRAY] (tiles) rules.dropzoneradius = Zasięg strefy zrzutu:[LIGHT_GRAY] (kratki)
rules.respawns = Maksymalna ilośc odrodzeń na falę rules.respawns = Maksymalna ilośc odrodzeń na falę
rules.limitedRespawns = Ogranicz Odrodzenia rules.limitedRespawns = Ogranicz Odrodzenia
rules.title.waves = Fale rules.title.waves = Fale
@@ -585,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
@@ -624,7 +677,7 @@ mech.omega-mech.weapon = Rakiety Chmarowe
mech.omega-mech.ability = Układ Obronny mech.omega-mech.ability = Układ Obronny
mech.dart-ship.name = Strzałka mech.dart-ship.name = Strzałka
mech.dart-ship.weapon = Karabin mech.dart-ship.weapon = Karabin
mech.javelin-ship.name = Javelin mech.javelin-ship.name = Oszczep
mech.javelin-ship.weapon = Seria Rakiet mech.javelin-ship.weapon = Seria Rakiet
mech.javelin-ship.ability = Wyładowania Dopalacza mech.javelin-ship.ability = Wyładowania Dopalacza
mech.trident-ship.name = Trójząb mech.trident-ship.name = Trójząb
@@ -642,11 +695,12 @@ mech.itemcapacity = [LIGHT_GRAY]Pojemność przedmiotów: {0}
mech.minespeed = [LIGHT_GRAY]Prędkość kopania: {0} mech.minespeed = [LIGHT_GRAY]Prędkość kopania: {0}
mech.minepower = [LIGHT_GRAY]Moc kopania: {0} mech.minepower = [LIGHT_GRAY]Moc kopania: {0}
mech.ability = [LIGHT_GRAY]Umiejętność: {0} mech.ability = [LIGHT_GRAY]Umiejętność: {0}
mech.buildspeed = [LIGHT_GRAY]Building Speed: {0}% mech.buildspeed = [LIGHT_GRAY]Szybkość Budowy: {0}%
liquid.heatcapacity = [LIGHT_GRAY]Wytrzymałość na przegrzewanie: {0} liquid.heatcapacity = [LIGHT_GRAY]Wytrzymałość na przegrzewanie: {0}
liquid.viscosity = [LIGHT_GRAY]Lepkość: {0} liquid.viscosity = [LIGHT_GRAY]Lepkość: {0}
liquid.temperature = [LIGHT_GRAY]Temperatura: {0} liquid.temperature = [LIGHT_GRAY]Temperatura: {0}
block.sand-boulder.name = Sand Boulder
block.sand-boulder.name = Piaskowy Głaz
block.grass.name = Trawa block.grass.name = Trawa
block.salt.name = Sól block.salt.name = Sól
block.saltrocks.name = Skały Solne block.saltrocks.name = Skały Solne
@@ -657,7 +711,7 @@ block.spore-pine.name = Sosna Zarodkowa
block.sporerocks.name = Skała z Zarodkami block.sporerocks.name = Skała z Zarodkami
block.rock.name = Skały block.rock.name = Skały
block.snowrock.name = Skały śnieżne block.snowrock.name = Skały śnieżne
block.snow-pine.name = Snow Pine block.snow-pine.name = Sosna śniegowa
block.shale.name = Łupek block.shale.name = Łupek
block.shale-boulder.name = Głaz Łupkowy block.shale-boulder.name = Głaz Łupkowy
block.moss.name = Mech block.moss.name = Mech
@@ -690,13 +744,13 @@ block.snow.name = Śnieg
block.craters.name = Kratery block.craters.name = Kratery
block.sand-water.name = Woda z Piaskiem block.sand-water.name = Woda z Piaskiem
block.darksand-water.name = Woda z Ciemnym Piaskiem block.darksand-water.name = Woda z Ciemnym Piaskiem
block.char.name = Char block.char.name = Popiół
block.holostone.name = Holo stone block.holostone.name = Błyszczący kamień
block.ice-snow.name = Lodowy Śnieg block.ice-snow.name = Lodowy Śnieg
block.rocks.name = Skały block.rocks.name = Skały
block.icerocks.name = Lodowe skały block.icerocks.name = Lodowe skały
block.snowrocks.name = Śnieżne Skały block.snowrocks.name = Śnieżne Skały
block.dunerocks.name = Dune Rocks block.dunerocks.name = Skały wydmowe
block.pine.name = Sosna block.pine.name = Sosna
block.white-tree-dead.name = Białe Drzewo Martwe block.white-tree-dead.name = Białe Drzewo Martwe
block.white-tree.name = Białe Drzewo block.white-tree.name = Białe Drzewo
@@ -715,7 +769,7 @@ block.dark-panel-6.name = Ciemny Panel 6
block.dark-metal.name = Ciemny Metal block.dark-metal.name = Ciemny Metal
block.ignarock.name = Skała Wulkaniczna block.ignarock.name = Skała Wulkaniczna
block.hotrock.name = Gorący Kamień block.hotrock.name = Gorący Kamień
block.magmarock.name = Magma Rock block.magmarock.name = Skała magmowa
block.cliffs.name = Klify block.cliffs.name = Klify
block.copper-wall.name = Miedziana Ściana block.copper-wall.name = Miedziana Ściana
block.copper-wall-large.name = Duża miedziana ściana block.copper-wall-large.name = Duża miedziana ściana
@@ -730,7 +784,7 @@ block.door-large.name = Duże drzwi
block.duo.name = Podwójne działko block.duo.name = Podwójne działko
block.scorch.name = Płomień block.scorch.name = Płomień
block.scatter.name = Flak block.scatter.name = Flak
block.hail.name = Hail block.hail.name = Grad
block.lancer.name = Lancer block.lancer.name = Lancer
block.conveyor.name = Przenośnik block.conveyor.name = Przenośnik
block.titanium-conveyor.name = Tytanowy przenośnik block.titanium-conveyor.name = Tytanowy przenośnik
@@ -747,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
@@ -778,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
@@ -799,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
@@ -833,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
@@ -855,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)!
@@ -890,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.
@@ -908,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.
@@ -921,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.
@@ -945,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ę.
@@ -971,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.
@@ -1016,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.

View File

@@ -16,6 +16,11 @@ screenshot.invalid = Mapa grande demais, Potencialmente sem memoria suficiente p
gameover = O núcleo foi destruído. gameover = O núcleo foi destruído.
gameover.pvp = O time[accent] {0}[] É vitorioso! gameover.pvp = O time[accent] {0}[] É vitorioso!
highscore = [YELLOW]Novo recorde! highscore = [YELLOW]Novo recorde!
load.sound = Sounds
load.map = Maps
load.image = Images
load.content = Content
load.system = System
stat.wave = Hordas derrotadas:[accent] {0} stat.wave = Hordas derrotadas:[accent] {0}
stat.enemiesDestroyed = Enimigos Destruídos:[accent] {0} stat.enemiesDestroyed = Enimigos Destruídos:[accent] {0}
stat.built = Construções construídas:[accent] {0} stat.built = Construções construídas:[accent] {0}
@@ -23,8 +28,6 @@ stat.destroyed = Construções destruídas:[accent] {0}
stat.deconstructed = Construções desconstruídas:[accent] {0} stat.deconstructed = Construções desconstruídas:[accent] {0}
stat.delivered = Recursos lançados: stat.delivered = Recursos lançados:
stat.rank = Rank Final: [accent]{0} stat.rank = Rank Final: [accent]{0}
placeline = Você selecionou um bloco.\nVocê pode[accent] colocar uma linha[] por[accent] carregar o seu dedo por alguns segundos[] e arrastar em uma direção.\nTente.
removearea = Você selecionou o modo de remoção.\nVocê pode[accent] remover blocos dentro de um retângulo[] por[accent] carregar o seu dedo por alguns segundos[] e arrastar.\nTente.
launcheditems = [accent]Itens lançados launcheditems = [accent]Itens lançados
map.delete = Certeza que quer deletar o mapa "[accent]{0}[]"? map.delete = Certeza que quer deletar o mapa "[accent]{0}[]"?
level.highscore = Melhor\npontuação: [accent] {0} level.highscore = Melhor\npontuação: [accent] {0}
@@ -63,9 +66,11 @@ players.single = {0} Jogador Ativo
server.closing = [accent]Fechando servidor... server.closing = [accent]Fechando servidor...
server.kicked.kick = Voce foi expulso do servidor! server.kicked.kick = Voce foi expulso do servidor!
server.kicked.serverClose = Servidor Fechado. server.kicked.serverClose = Servidor Fechado.
server.kicked.vote = You have been vote-kicked. Goodbye.
server.kicked.clientOutdated = Cliente desatualizado! Atualize seu jogo! server.kicked.clientOutdated = Cliente desatualizado! Atualize seu jogo!
server.kicked.serverOutdated = Servidor desatualiado! Peca ao dono para atualizar! server.kicked.serverOutdated = Servidor desatualiado! Peca ao dono para atualizar!
server.kicked.banned = Voce foi banido do servidor. server.kicked.banned = Voce foi banido do servidor.
server.kicked.typeMismatch = This server is not compatible with your build type.
server.kicked.recentKick = Voce foi banido recentemente.\nEspere para conectar de novo. server.kicked.recentKick = Voce foi banido recentemente.\nEspere para conectar de novo.
server.kicked.nameInUse = Este nome ja esta sendo usado\nneste servidor. server.kicked.nameInUse = Este nome ja esta sendo usado\nneste servidor.
server.kicked.nameEmpty = Voce deve ter pelo menos uma letra ou numero. server.kicked.nameEmpty = Voce deve ter pelo menos uma letra ou numero.
@@ -156,6 +161,11 @@ cancel = Cancelar
openlink = Abrir Link openlink = Abrir Link
copylink = Copiar link copylink = Copiar link
back = Voltar back = Voltar
data.export = Export Data
data.import = Import Data
data.exported = Data exported.
data.invalid = This isn't valid game data.
data.import.confirm = Importing external data will erase[scarlet] all[] your current game data.\n[accent]This cannot be undone![]\n\nOnce the data is imported, your game will exit immediately.
classic.export = Export Classic Data classic.export = Export Classic Data
classic.export.text = [accent]Mindustry[] has just had a major update.\nClassic (v3.5 build 40) save or map data has been detected. Would you like to export these saves to your phone's home folder, for use in the Mindustry Classic app? classic.export.text = [accent]Mindustry[] has just had a major update.\nClassic (v3.5 build 40) save or map data has been detected. Would you like to export these saves to your phone's home folder, for use in the Mindustry Classic app?
quit.confirm = Você tem certeza que quer sair? quit.confirm = Você tem certeza que quer sair?
@@ -376,6 +386,7 @@ zone.fungalPass.description = A transition area between high mountains and lower
zone.impact0078.description = <insert description here> zone.impact0078.description = <insert description here>
zone.crags.description = <insert description here> zone.crags.description = <insert description here>
settings.language = Linguagem settings.language = Linguagem
settings.data = Game Data
settings.reset = Restaurar Padrões settings.reset = Restaurar Padrões
settings.rebind = Religar settings.rebind = Religar
settings.controls = Controles settings.controls = Controles
@@ -507,6 +518,7 @@ setting.mutemusic.name = Desligar Música
setting.sfxvol.name = Volume de Efeitos setting.sfxvol.name = Volume de Efeitos
setting.mutesound.name = Desligar Som setting.mutesound.name = Desligar Som
setting.crashreport.name = Enviar denuncias de crash anonimas setting.crashreport.name = Enviar denuncias de crash anonimas
setting.savecreate.name = Auto-Create Saves
setting.chatopacity.name = Opacidade do chat setting.chatopacity.name = Opacidade do chat
setting.playerchat.name = Mostrar chat em-jogo setting.playerchat.name = Mostrar chat em-jogo
uiscale.reset = UI scale has been changed.\nPress "OK" to confirm this scale.\n[scarlet]Reverting and exiting in[accent] {0}[] settings... uiscale.reset = UI scale has been changed.\nPress "OK" to confirm this scale.\n[scarlet]Reverting and exiting in[accent] {0}[] settings...
@@ -527,6 +539,7 @@ keybind.press.axis = Pressione uma Axis ou tecla...
keybind.screenshot.name = Captura do mapa keybind.screenshot.name = Captura do mapa
keybind.move_x.name = mover_x keybind.move_x.name = mover_x
keybind.move_y.name = mover_y keybind.move_y.name = mover_y
keybind.fullscreen.name = Toggle Fullscreen
keybind.select.name = selecionar keybind.select.name = selecionar
keybind.diagonal_placement.name = Colocação diagonal keybind.diagonal_placement.name = Colocação diagonal
keybind.pick.name = Pegar bloco keybind.pick.name = Pegar bloco
@@ -790,6 +803,7 @@ block.blast-mixer.name = Misturador de Explosão
block.solar-panel.name = Painel Solar block.solar-panel.name = Painel Solar
block.solar-panel-large.name = Painel Solar Grande block.solar-panel-large.name = Painel Solar Grande
block.oil-extractor.name = Extrator de Óleo block.oil-extractor.name = Extrator de Óleo
block.command-center.name = Command Center
block.draug-factory.name = Draug Miner Drone Factory block.draug-factory.name = Draug Miner Drone Factory
block.spirit-factory.name = Fabrica de Drone Spirit block.spirit-factory.name = Fabrica de Drone Spirit
block.phantom-factory.name = Fabrica de Drone Phantom block.phantom-factory.name = Fabrica de Drone Phantom
@@ -1012,6 +1026,7 @@ block.ripple.description = Uma grande torre que atira simultaneamente.
block.cyclone.description = Uma grande torre de tiro rapido. block.cyclone.description = Uma grande torre de tiro rapido.
block.spectre.description = Uma grande torre que da dois tiros poderosos ao mesmo tempo. block.spectre.description = Uma grande torre que da dois tiros poderosos ao mesmo tempo.
block.meltdown.description = Uma grande torre que atira dois raios poderosos ao mesmo tempo. block.meltdown.description = Uma grande torre que atira dois raios poderosos ao mesmo tempo.
block.command-center.description = Issues movement commands to allied units across the map.\nCauses units to patrol, attack an enemy core or retreat to the core/factory. When no enemy core is present, units will default to patrolling under the attack command.
block.draug-factory.description = Produces Draug mining drones. block.draug-factory.description = Produces Draug mining drones.
block.spirit-factory.description = Produz drones leves que mineram e reparam blocos. block.spirit-factory.description = Produz drones leves que mineram e reparam blocos.
block.phantom-factory.description = Produz unidades de drone avancadas Que são significativamente mais efetivos que um drone spirit. block.phantom-factory.description = Produz unidades de drone avancadas Que são significativamente mais efetivos que um drone spirit.

View File

@@ -403,7 +403,6 @@ zone.saltFlats.name = Соляные равнины
zone.impact0078.name = Воздействие 0078 zone.impact0078.name = Воздействие 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\nНачните вкладываться в энергию. Постройте генераторы внутреннего сгорания. Научитесь пользоваться регенератором. zone.frozenForest.description = Даже здесь, ближе к горам, споры распространились. Холодные температуры не могут сдерживать их вечно.\n\nНачните вкладываться в энергию. Постройте генераторы внутреннего сгорания. Научитесь пользоваться регенератором.
zone.desertWastes.description = Эти пустоши огромны, непредсказуемы и пронизаны заброшенными секторальными структурами.\nВ регионе представлен уголь. Сожгите его для энергии, или синтезируйте в графит.\n\n[lightgray]Место посадки здесь может не быть гарантировано. zone.desertWastes.description = Эти пустоши огромны, непредсказуемы и пронизаны заброшенными секторальными структурами.\nВ регионе представлен уголь. Сожгите его для энергии, или синтезируйте в графит.\n\n[lightgray]Место посадки здесь может не быть гарантировано.

View File

@@ -16,6 +16,11 @@ screenshot.invalid = Map too large, potentially not enough memory for screenshot
gameover = Game Over gameover = Game Over
gameover.pvp = The[accent] {0}[] team is victorious! gameover.pvp = The[accent] {0}[] team is victorious!
highscore = [accent]Nytt rekord! highscore = [accent]Nytt rekord!
load.sound = Sounds
load.map = Maps
load.image = Images
load.content = Content
load.system = System
stat.wave = Waves Defeated:[accent] {0} stat.wave = Waves Defeated:[accent] {0}
stat.enemiesDestroyed = Enemies Destroyed:[accent] {0} stat.enemiesDestroyed = Enemies Destroyed:[accent] {0}
stat.built = Buildings Built:[accent] {0} stat.built = Buildings Built:[accent] {0}
@@ -23,8 +28,6 @@ stat.destroyed = Buildings Destroyed:[accent] {0}
stat.deconstructed = Buildings Deconstructed:[accent] {0} stat.deconstructed = Buildings Deconstructed:[accent] {0}
stat.delivered = Resources Launched: stat.delivered = Resources Launched:
stat.rank = Final Rank: [accent]{0} stat.rank = Final Rank: [accent]{0}
placeline = Du har valt ett block.\nDu kan[accent] placera i en linje[] genom att[accent] hålla ner ett finger i några sekunder[] och sedan dra åt ett håll.\n\n[scarlet]GÖR DET.
removearea = Du har valt borttagningsläget.\nDu kan[accent] ta bort block inom en rektangel[] genom att[accent] hålla ner ett finger i några sekunder[] och dra.\n\n[scarlet]GÖR DET.
launcheditems = [accent]Launched Items launcheditems = [accent]Launched Items
map.delete = Are you sure you want to delete the map "[accent]{0}[]"? map.delete = Are you sure you want to delete the map "[accent]{0}[]"?
level.highscore = High Score: [accent]{0} level.highscore = High Score: [accent]{0}
@@ -63,9 +66,11 @@ players.single = {0} spelare online
server.closing = [accent]Stänger server... server.closing = [accent]Stänger server...
server.kicked.kick = You have been kicked from the server! server.kicked.kick = You have been kicked from the server!
server.kicked.serverClose = Server stängd. server.kicked.serverClose = Server stängd.
server.kicked.vote = You have been vote-kicked. Goodbye.
server.kicked.clientOutdated = Outdated client! Uppdatera ditt spel! server.kicked.clientOutdated = Outdated client! Uppdatera ditt spel!
server.kicked.serverOutdated = Outdated server! Ask the host to update! server.kicked.serverOutdated = Outdated server! Ask the host to update!
server.kicked.banned = Du är bannad från servern. server.kicked.banned = Du är bannad från servern.
server.kicked.typeMismatch = This server is not compatible with your build type.
server.kicked.recentKick = You have been kicked recently.\nWait before connecting again. server.kicked.recentKick = You have been kicked recently.\nWait before connecting again.
server.kicked.nameInUse = Någon med det namnet finns redan\npå servern. server.kicked.nameInUse = Någon med det namnet finns redan\npå servern.
server.kicked.nameEmpty = Ditt namn är ogiltigt. server.kicked.nameEmpty = Ditt namn är ogiltigt.
@@ -156,6 +161,11 @@ cancel = Avbryt
openlink = Öppna Länk openlink = Öppna Länk
copylink = Kopiera Länk copylink = Kopiera Länk
back = Tillbaka back = Tillbaka
data.export = Export Data
data.import = Import Data
data.exported = Data exported.
data.invalid = This isn't valid game data.
data.import.confirm = Importing external data will erase[scarlet] all[] your current game data.\n[accent]This cannot be undone![]\n\nOnce the data is imported, your game will exit immediately.
classic.export = Exportera Classic-Data classic.export = Exportera Classic-Data
classic.export.text = Sparad data från Classic (v3.5 build 40) har hittats. Vill du exportera den här datan till telefonens hem-mapp för att använda i Mindustry Classic-appen? classic.export.text = Sparad data från Classic (v3.5 build 40) har hittats. Vill du exportera den här datan till telefonens hem-mapp för att använda i Mindustry Classic-appen?
quit.confirm = Är du säker på att du vill avsluta? quit.confirm = Är du säker på att du vill avsluta?
@@ -376,6 +386,7 @@ zone.fungalPass.description = A transition area between high mountains and lower
zone.impact0078.description = <insert description here> zone.impact0078.description = <insert description here>
zone.crags.description = <insert description here> zone.crags.description = <insert description here>
settings.language = Språk settings.language = Språk
settings.data = Game Data
settings.reset = Återställ till Standardvärden settings.reset = Återställ till Standardvärden
settings.rebind = Byt settings.rebind = Byt
settings.controls = Kontroller settings.controls = Kontroller
@@ -507,6 +518,7 @@ setting.mutemusic.name = Stäng Av Musik
setting.sfxvol.name = Ljudeffektvolym setting.sfxvol.name = Ljudeffektvolym
setting.mutesound.name = Stäng Av Ljudeffekter setting.mutesound.name = Stäng Av Ljudeffekter
setting.crashreport.name = Skicka Anonyma Krashrapporter setting.crashreport.name = Skicka Anonyma Krashrapporter
setting.savecreate.name = Auto-Create Saves
setting.chatopacity.name = Chattgenomskinlighet setting.chatopacity.name = Chattgenomskinlighet
setting.playerchat.name = Visa Chatt setting.playerchat.name = Visa Chatt
uiscale.reset = UI-skalan har ändrats.\nTryck "OK" för att använda den här skalan.\n[scarlet]Avslutar och återställer om[accent] {0}[] sekunder... uiscale.reset = UI-skalan har ändrats.\nTryck "OK" för att använda den här skalan.\n[scarlet]Avslutar och återställer om[accent] {0}[] sekunder...
@@ -527,6 +539,7 @@ keybind.press.axis = Press an axis or key...
keybind.screenshot.name = Map Screenshot keybind.screenshot.name = Map Screenshot
keybind.move_x.name = Move x keybind.move_x.name = Move x
keybind.move_y.name = Move y keybind.move_y.name = Move y
keybind.fullscreen.name = Toggle Fullscreen
keybind.select.name = Select/Shoot keybind.select.name = Select/Shoot
keybind.diagonal_placement.name = Diagonal Placement keybind.diagonal_placement.name = Diagonal Placement
keybind.pick.name = Pick Block keybind.pick.name = Pick Block
@@ -790,6 +803,7 @@ block.blast-mixer.name = Blast Mixer
block.solar-panel.name = Solpanel block.solar-panel.name = Solpanel
block.solar-panel-large.name = Stor Solpanel block.solar-panel-large.name = Stor Solpanel
block.oil-extractor.name = Oljeextraktor block.oil-extractor.name = Oljeextraktor
block.command-center.name = Command Center
block.draug-factory.name = Draug Miner Drone Factory block.draug-factory.name = Draug Miner Drone Factory
block.spirit-factory.name = Spirit Repair Drone Factory block.spirit-factory.name = Spirit Repair Drone Factory
block.phantom-factory.name = Phantom Builder Drone Factory block.phantom-factory.name = Phantom Builder Drone Factory
@@ -1012,6 +1026,7 @@ block.ripple.description = An extremely poweful artillery turret. Shoots cluster
block.cyclone.description = A large anti-air and anti-ground turret. Fires explosive clumps of flak at nearby units. block.cyclone.description = A large anti-air and anti-ground turret. Fires explosive clumps of flak at nearby units.
block.spectre.description = A massive dual-barreled cannon. Shoots large armor-piercing bullets at air and ground targets. block.spectre.description = A massive dual-barreled cannon. Shoots large armor-piercing bullets at air and ground targets.
block.meltdown.description = A massive laser cannon. Charges and fires a persistent laser beam at nearby enemies. Requires coolant to operate. block.meltdown.description = A massive laser cannon. Charges and fires a persistent laser beam at nearby enemies. Requires coolant to operate.
block.command-center.description = Issues movement commands to allied units across the map.\nCauses units to patrol, attack an enemy core or retreat to the core/factory. When no enemy core is present, units will default to patrolling under the attack command.
block.draug-factory.description = Produces Draug mining drones. block.draug-factory.description = Produces Draug mining drones.
block.spirit-factory.description = Produces Spirit structural repair drones. block.spirit-factory.description = Produces Spirit structural repair drones.
block.phantom-factory.description = Produces advanced construction drones. block.phantom-factory.description = Produces advanced construction drones.

View File

@@ -16,6 +16,11 @@ screenshot.invalid = Map too large, potentially not enough memory for screenshot
gameover = Cekirdegin yok edildi. gameover = Cekirdegin yok edildi.
gameover.pvp = The[accent] {0}[] team is victorious! gameover.pvp = The[accent] {0}[] team is victorious!
highscore = [accent]Yeni Yuksek skor! highscore = [accent]Yeni Yuksek skor!
load.sound = Sounds
load.map = Maps
load.image = Images
load.content = Content
load.system = System
stat.wave = Waves Defeated:[accent] {0} stat.wave = Waves Defeated:[accent] {0}
stat.enemiesDestroyed = Enemies Destroyed:[accent] {0} stat.enemiesDestroyed = Enemies Destroyed:[accent] {0}
stat.built = Buildings Built:[accent] {0} stat.built = Buildings Built:[accent] {0}
@@ -23,8 +28,6 @@ stat.destroyed = Buildings Destroyed:[accent] {0}
stat.deconstructed = Buildings Deconstructed:[accent] {0} stat.deconstructed = Buildings Deconstructed:[accent] {0}
stat.delivered = Resources Launched: stat.delivered = Resources Launched:
stat.rank = Final Rank: [accent]{0} stat.rank = Final Rank: [accent]{0}
placeline = You have selected a block.\nYou can[accent] place in a line[] by[accent] holding down your finger for a few seconds[] and dragging in a direction.\nTry it.
removearea = You have selected removal mode.\nYou can[accent] remove blocks in a rectangle[] by[accent] holding down your finger for a few seconds[] and dragging.\nTry it.
launcheditems = [accent]Launched Items launcheditems = [accent]Launched Items
map.delete = Su haritayi silmek istediginden emin misin? "[accent]{0}[]"? map.delete = Su haritayi silmek istediginden emin misin? "[accent]{0}[]"?
level.highscore = Yuksek Skor: [accent]{0} level.highscore = Yuksek Skor: [accent]{0}
@@ -63,9 +66,11 @@ players.single = {0} oyuncu cevrimici
server.closing = [accent]Oyun kapaniyor. server.closing = [accent]Oyun kapaniyor.
server.kicked.kick = Oyundan cikarildin server.kicked.kick = Oyundan cikarildin
server.kicked.serverClose = Oyun kapandi server.kicked.serverClose = Oyun kapandi
server.kicked.vote = You have been vote-kicked. Goodbye.
server.kicked.clientOutdated = Yeni bir versiyon mevcut! Hemen indir! server.kicked.clientOutdated = Yeni bir versiyon mevcut! Hemen indir!
server.kicked.serverOutdated = Eski oyun! Yapimciya guncellemesini soyle! server.kicked.serverOutdated = Eski oyun! Yapimciya guncellemesini soyle!
server.kicked.banned = Oyundan kalici olarak cikarildin. server.kicked.banned = Oyundan kalici olarak cikarildin.
server.kicked.typeMismatch = This server is not compatible with your build type.
server.kicked.recentKick = Oyundan cikarilmistin.\nBaglanmadn once biraz bekle. server.kicked.recentKick = Oyundan cikarilmistin.\nBaglanmadn once biraz bekle.
server.kicked.nameInUse = Oyunda bu isimde bir\nkisi zaten var. server.kicked.nameInUse = Oyunda bu isimde bir\nkisi zaten var.
server.kicked.nameEmpty = ismin gecerli degil. server.kicked.nameEmpty = ismin gecerli degil.
@@ -156,6 +161,11 @@ cancel = iptal
openlink = Linki ac openlink = Linki ac
copylink = Linki kopyala copylink = Linki kopyala
back = Geri don back = Geri don
data.export = Export Data
data.import = Import Data
data.exported = Data exported.
data.invalid = This isn't valid game data.
data.import.confirm = Importing external data will erase[scarlet] all[] your current game data.\n[accent]This cannot be undone![]\n\nOnce the data is imported, your game will exit immediately.
classic.export = Export Classic Data classic.export = Export Classic Data
classic.export.text = [accent]Mindustry[] has just had a major update.\nClassic (v3.5 build 40) save or map data has been detected. Would you like to export these saves to your phone's home folder, for use in the Mindustry Classic app? classic.export.text = [accent]Mindustry[] has just had a major update.\nClassic (v3.5 build 40) save or map data has been detected. Would you like to export these saves to your phone's home folder, for use in the Mindustry Classic app?
quit.confirm = Cikmak istedigine emin misin? quit.confirm = Cikmak istedigine emin misin?
@@ -376,6 +386,7 @@ zone.fungalPass.description = A transition area between high mountains and lower
zone.impact0078.description = <insert description here> zone.impact0078.description = <insert description here>
zone.crags.description = <insert description here> zone.crags.description = <insert description here>
settings.language = Dil settings.language = Dil
settings.data = Game Data
settings.reset = ilk ayarlara geri al settings.reset = ilk ayarlara geri al
settings.rebind = Geri al settings.rebind = Geri al
settings.controls = Kontroller settings.controls = Kontroller
@@ -507,6 +518,7 @@ setting.mutemusic.name = Sesi kapat
setting.sfxvol.name = Ses seviyesi setting.sfxvol.name = Ses seviyesi
setting.mutesound.name = Sesi kapat setting.mutesound.name = Sesi kapat
setting.crashreport.name = Send Anonymous Crash Reports setting.crashreport.name = Send Anonymous Crash Reports
setting.savecreate.name = Auto-Create Saves
setting.chatopacity.name = Chat Opacity setting.chatopacity.name = Chat Opacity
setting.playerchat.name = Display In-Game Chat setting.playerchat.name = Display In-Game Chat
uiscale.reset = UI scale has been changed.\nPress "OK" to confirm this scale.\n[scarlet]Reverting and exiting in[accent] {0}[] settings... uiscale.reset = UI scale has been changed.\nPress "OK" to confirm this scale.\n[scarlet]Reverting and exiting in[accent] {0}[] settings...
@@ -527,6 +539,7 @@ keybind.press.axis = Bir yone cevir yada tusa bas...
keybind.screenshot.name = Map Screenshot keybind.screenshot.name = Map Screenshot
keybind.move_x.name = Sol/Sag hareket keybind.move_x.name = Sol/Sag hareket
keybind.move_y.name = Yukari/asagi hareket keybind.move_y.name = Yukari/asagi hareket
keybind.fullscreen.name = Toggle Fullscreen
keybind.select.name = Sec/silahi sik keybind.select.name = Sec/silahi sik
keybind.diagonal_placement.name = Diagonal Placement keybind.diagonal_placement.name = Diagonal Placement
keybind.pick.name = Pick Block keybind.pick.name = Pick Block
@@ -790,6 +803,7 @@ block.blast-mixer.name = Patlayici karistiricisi
block.solar-panel.name = gunes paneli block.solar-panel.name = gunes paneli
block.solar-panel-large.name = genis gunes paneli block.solar-panel-large.name = genis gunes paneli
block.oil-extractor.name = benzin ayirici block.oil-extractor.name = benzin ayirici
block.command-center.name = Command Center
block.draug-factory.name = Draug Miner Drone Factory block.draug-factory.name = Draug Miner Drone Factory
block.spirit-factory.name = Spirit Drone Factory block.spirit-factory.name = Spirit Drone Factory
block.phantom-factory.name = Phantom Drone Factory block.phantom-factory.name = Phantom Drone Factory
@@ -1012,6 +1026,7 @@ block.ripple.description = A large artillery turret which fires several shots si
block.cyclone.description = A large rapid fire turret. block.cyclone.description = A large rapid fire turret.
block.spectre.description = A large turret which shoots two powerful bullets at once. block.spectre.description = A large turret which shoots two powerful bullets at once.
block.meltdown.description = A large turret which shoots powerful long-range beams. block.meltdown.description = A large turret which shoots powerful long-range beams.
block.command-center.description = Issues movement commands to allied units across the map.\nCauses units to patrol, attack an enemy core or retreat to the core/factory. When no enemy core is present, units will default to patrolling under the attack command.
block.draug-factory.description = Produces Draug mining drones. block.draug-factory.description = Produces Draug mining drones.
block.spirit-factory.description = Produces light drones which mine ore and repair blocks. block.spirit-factory.description = Produces light drones which mine ore and repair blocks.
block.phantom-factory.description = Produces advanced drone units which are significantly more effective than a spirit drone. block.phantom-factory.description = Produces advanced drone units which are significantly more effective than a spirit drone.

View File

@@ -16,7 +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 = Sesler
load.map = Haritalar
load.image = Resimler
load.content = İçerik
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}
@@ -24,10 +28,6 @@ stat.destroyed = Yok Edilen Yapılar:[accent] {0}
stat.deconstructed = Yıkılan Yapılar:[accent] {0} stat.deconstructed = Yıkılan Yapılar:[accent] {0}
stat.delivered = Gönderilen Kaynaklar: stat.delivered = Gönderilen Kaynaklar:
stat.rank = Rütbe: [accent]{0} stat.rank = Rütbe: [accent]{0}
placeline = Bir blok seçtin.\nYou can[accent] place in a line[] by[accent] holding down your finger for a few seconds[] and dragging in a direction.\n\n[scarlet]DO IT.
removearea = You have selected removal mode.\nYou can[accent] remove blocks in a rectangle[] by[accent] holding down your finger for a few seconds[] and dragging.\n\n[scarlet]DO IT.
launcheditems = [accent]Gönderilen Kaynaklar launcheditems = [accent]Gönderilen Kaynaklar
map.delete = "[accent]{0}[]"Haritasını silmek istediğine emin misin? map.delete = "[accent]{0}[]"Haritasını silmek istediğine emin misin?
level.highscore = Rekor: [accent]{0} level.highscore = Rekor: [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,107 +67,119 @@ 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.clientOutdated = Geçersiz sürüm! Oyununu güncelle! server.kicked.vote = Oylama ile atıldın. Görüşürüz.
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.recentKick = Yakın bir zamanda bir sunucudan atıldın.\nBağlanmadan önce biraz bekle. server.kicked.typeMismatch = Bu sunucu senin inşa türünle uyumlu değil.
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 =
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 =
customize = Customize Rules customize = Kuralları Özelleştir
cancel = Cancel cancel = İptal
openlink = Open Link openlink = Bağlantıyı
copylink = Copy Link copylink = Bağlantıyı Kopyala
back = Back back = Geri
data.export = Veriyi Dışa Aktar
data.import = Veriyi İçe Aktar
data.exported = Veri dışa aktarıldı.
data.invalid = Bu oyun verisi geçerli değil.
data.import.confirm = Importing external data will erase[scarlet] all[] your current game data.\n[accent]This cannot be undone![]\n\nOnce the data is imported, your game will exit immediately.
classic.export = Export Classic Data classic.export = Export Classic Data
classic.export.text = [accent]Mindustry[] has just had a major update.\nClassic (v3.5 build 40) save or map data has been detected. Would you like to export these saves to your phone's home folder, for use in the Mindustry Classic app? classic.export.text = [accent]Mindustry[] has just had a major update.\nClassic (v3.5 build 40) save or map data has been detected. Would you like to export these saves to your phone's home folder, for use in the Mindustry Classic app?
quit.confirm = Are you sure you want to quit? quit.confirm = Are you sure you want to quit?
@@ -253,7 +274,6 @@ editor.mapname = Map Name:
editor.overwrite = [accent]Warning!\nThis overwrites an existing map. editor.overwrite = [accent]Warning!\nThis overwrites an existing map.
editor.overwrite.confirm = [scarlet]Warning![] A map with this name already exists. Are you sure you want to overwrite it? editor.overwrite.confirm = [scarlet]Warning![] A map with this name already exists. Are you sure you want to overwrite it?
editor.selectmap = Select a map to load: editor.selectmap = Select a map to load:
toolmode.replace = Replace toolmode.replace = Replace
toolmode.replace.description = Draws only on solid blocks. toolmode.replace.description = Draws only on solid blocks.
toolmode.replaceall = Replace All toolmode.replaceall = Replace All
@@ -268,7 +288,6 @@ toolmode.fillteams = Fill Teams
toolmode.fillteams.description = Fill teams instead of blocks. toolmode.fillteams.description = Fill teams instead of blocks.
toolmode.drawteams = Draw Teams toolmode.drawteams = Draw Teams
toolmode.drawteams.description = Draw teams instead of blocks. toolmode.drawteams.description = Draw teams instead of blocks.
filters.empty = [lightgray]No filters! Add one with the button below. filters.empty = [lightgray]No filters! Add one with the button below.
filter.distort = Distort filter.distort = Distort
filter.noise = Noise filter.noise = Noise
@@ -300,7 +319,6 @@ filter.option.floor2 = Secondary Floor
filter.option.threshold2 = Secondary Threshold filter.option.threshold2 = Secondary Threshold
filter.option.radius = Radius filter.option.radius = Radius
filter.option.percentile = Percentile filter.option.percentile = Percentile
width = Width: width = Width:
height = Height: height = Height:
menu = Menu menu = Menu
@@ -318,7 +336,6 @@ tutorial.retake = Re-Take Tutorial
editor = Editor editor = Editor
mapeditor = Map Editor mapeditor = Map Editor
donate = Donate donate = Donate
abandon = Abandon abandon = Abandon
abandon.text = This zone and all its resources will be lost to the enemy. abandon.text = This zone and all its resources will be lost to the enemy.
locked = Locked locked = Locked
@@ -344,7 +361,6 @@ zone.objective.survival = Survive
zone.objective.attack = Destroy Enemy Core zone.objective.attack = Destroy Enemy Core
add = Add... add = Add...
boss.health = Boss Health boss.health = Boss Health
connectfail = [crimson]Connection error:\n\n[accent]{0} connectfail = [crimson]Connection error:\n\n[accent]{0}
error.unreachable = Server unreachable.\nIs the address spelled correctly? error.unreachable = Server unreachable.\nIs the address spelled correctly?
error.invalidaddress = Invalid address. error.invalidaddress = Invalid address.
@@ -355,7 +371,6 @@ error.mapnotfound = Map file not found!
error.io = Network I/O error. error.io = Network I/O error.
error.any = Unknown network error. error.any = Unknown network error.
error.bloom = Failed to initialize bloom.\nYour device may not support it. error.bloom = Failed to initialize bloom.\nYour device may not support it.
zone.groundZero.name = Ground Zero zone.groundZero.name = Ground Zero
zone.desertWastes.name = Desert Wastes zone.desertWastes.name = Desert Wastes
zone.craters.name = The Craters zone.craters.name = The Craters
@@ -370,7 +385,6 @@ zone.saltFlats.name = Salt Flats
zone.impact0078.name = Impact 0078 zone.impact0078.name = Impact 0078
zone.crags.name = Crags zone.crags.name = Crags
zone.fungalPass.name = Fungal Pass zone.fungalPass.name = Fungal Pass
zone.groundZero.description = The optimal location to begin once more. Low enemy threat. Few resources.\nGather as much lead and copper as possible.\nMove on. zone.groundZero.description = The optimal location to begin once more. Low enemy threat. Few resources.\nGather as much lead and copper as possible.\nMove on.
zone.frozenForest.description = Even here, closer to mountains, the spores have spread. The frigid temperatures cannot contain them forever.\n\nBegin the venture into power. Build combustion generators. Learn to use menders. zone.frozenForest.description = Even here, closer to mountains, the spores have spread. The frigid temperatures cannot contain them forever.\n\nBegin the venture into power. Build combustion generators. Learn to use menders.
zone.desertWastes.description = These wastes are vast, unpredictable, and criss-crossed with derelict sector structures.\nCoal is present in the region. Burn it for power, or synthesize graphite.\n\n[lightgray]This landing location cannot be guaranteed. zone.desertWastes.description = These wastes are vast, unpredictable, and criss-crossed with derelict sector structures.\nCoal is present in the region. Burn it for power, or synthesize graphite.\n\n[lightgray]This landing location cannot be guaranteed.
@@ -385,8 +399,8 @@ zone.nuclearComplex.description = A former facility for the production and proce
zone.fungalPass.description = A transition area between high mountains and lower, spore-ridden lands. A small enemy reconnaissance base is located here.\nDestroy it.\nUse Dagger and Crawler units. Take out the two cores. zone.fungalPass.description = A transition area between high mountains and lower, spore-ridden lands. A small enemy reconnaissance base is located here.\nDestroy it.\nUse Dagger and Crawler units. Take out the two cores.
zone.impact0078.description = <insert description here> zone.impact0078.description = <insert description here>
zone.crags.description = <insert description here> zone.crags.description = <insert description here>
settings.language = Language settings.language = Language
settings.data = Game Data
settings.reset = Reset to Defaults settings.reset = Reset to Defaults
settings.rebind = Rebind settings.rebind = Rebind
settings.controls = Controls settings.controls = Controls
@@ -438,7 +452,6 @@ blocks.inaccuracy = Inaccuracy
blocks.shots = Shots blocks.shots = Shots
blocks.reload = Shots/Second blocks.reload = Shots/Second
blocks.ammo = Ammo blocks.ammo = Ammo
bar.drilltierreq = Better Drill Required bar.drilltierreq = Better Drill Required
bar.drillspeed = Drill Speed: {0}/s bar.drillspeed = Drill Speed: {0}/s
bar.efficiency = Efficiency: {0}% bar.efficiency = Efficiency: {0}%
@@ -451,7 +464,6 @@ bar.heat = Heat
bar.power = Power bar.power = Power
bar.progress = Build Progress bar.progress = Build Progress
bar.spawned = Units: {0}/{1} bar.spawned = Units: {0}/{1}
bullet.damage = [stat]{0}[lightgray] damage bullet.damage = [stat]{0}[lightgray] damage
bullet.splashdamage = [stat]{0}[lightgray] area dmg ~[stat] {1}[lightgray] tiles bullet.splashdamage = [stat]{0}[lightgray] area dmg ~[stat] {1}[lightgray] tiles
bullet.incendiary = [stat]incendiary bullet.incendiary = [stat]incendiary
@@ -463,7 +475,6 @@ bullet.freezing = [stat]freezing
bullet.tarred = [stat]tarred bullet.tarred = [stat]tarred
bullet.multiplier = [stat]{0}[lightgray]x ammo multiplier bullet.multiplier = [stat]{0}[lightgray]x ammo multiplier
bullet.reload = [stat]{0}[lightgray]x fire rate bullet.reload = [stat]{0}[lightgray]x fire rate
unit.blocks = blocks unit.blocks = blocks
unit.powersecond = power units/second unit.powersecond = power units/second
unit.liquidsecond = liquid units/second unit.liquidsecond = liquid units/second
@@ -521,6 +532,7 @@ setting.mutemusic.name = Mute Music
setting.sfxvol.name = SFX Volume setting.sfxvol.name = SFX Volume
setting.mutesound.name = Mute Sound setting.mutesound.name = Mute Sound
setting.crashreport.name = Send Anonymous Crash Reports setting.crashreport.name = Send Anonymous Crash Reports
setting.savecreate.name = Auto-Create Saves
setting.chatopacity.name = Chat Opacity setting.chatopacity.name = Chat Opacity
setting.playerchat.name = Display In-Game Chat setting.playerchat.name = Display In-Game Chat
uiscale.reset = UI scale has been changed.\nPress "OK" to confirm this scale.\n[scarlet]Reverting and exiting in[accent] {0}[] seconds... uiscale.reset = UI scale has been changed.\nPress "OK" to confirm this scale.\n[scarlet]Reverting and exiting in[accent] {0}[] seconds...
@@ -541,6 +553,7 @@ keybind.press.axis = Press an axis or key...
keybind.screenshot.name = Map Screenshot keybind.screenshot.name = Map Screenshot
keybind.move_x.name = Move x keybind.move_x.name = Move x
keybind.move_y.name = Move y keybind.move_y.name = Move y
keybind.fullscreen.name = Toggle Fullscreen
keybind.select.name = Select/Shoot keybind.select.name = Select/Shoot
keybind.diagonal_placement.name = Diagonal Placement keybind.diagonal_placement.name = Diagonal Placement
keybind.pick.name = Pick Block keybind.pick.name = Pick Block
@@ -573,7 +586,6 @@ mode.pvp.description = Fight against other players locally.\n[gray]Requires at l
mode.attack.name = Attack mode.attack.name = Attack
mode.attack.description = Destroy the enemy's base. No waves.\n[gray]Requires a red core in the map to play. mode.attack.description = Destroy the enemy's base. No waves.\n[gray]Requires a red core in the map to play.
mode.custom = Custom Rules mode.custom = Custom Rules
rules.infiniteresources = Infinite Resources rules.infiniteresources = Infinite Resources
rules.wavetimer = Wave Timer rules.wavetimer = Wave Timer
rules.waves = Waves rules.waves = Waves
@@ -600,7 +612,6 @@ rules.title.resourcesbuilding = Resources & Building
rules.title.player = Players rules.title.player = Players
rules.title.enemy = Enemies rules.title.enemy = Enemies
rules.title.unit = Units rules.title.unit = Units
content.item.name = Items content.item.name = Items
content.liquid.name = Liquids content.liquid.name = Liquids
content.unit.name = Units content.unit.name = Units
@@ -662,7 +673,6 @@ mech.buildspeed = [lightgray]Building Speed: {0}%
liquid.heatcapacity = [lightgray]Heat Capacity: {0} liquid.heatcapacity = [lightgray]Heat Capacity: {0}
liquid.viscosity = [lightgray]Viscosity: {0} liquid.viscosity = [lightgray]Viscosity: {0}
liquid.temperature = [lightgray]Temperature: {0} liquid.temperature = [lightgray]Temperature: {0}
block.sand-boulder.name = Sand Boulder block.sand-boulder.name = Sand Boulder
block.grass.name = Grass block.grass.name = Grass
block.salt.name = Salt block.salt.name = Salt
@@ -807,6 +817,7 @@ block.blast-mixer.name = Blast Mixer
block.solar-panel.name = Solar Panel block.solar-panel.name = Solar Panel
block.solar-panel-large.name = Large Solar Panel block.solar-panel-large.name = Large Solar Panel
block.oil-extractor.name = Oil Extractor block.oil-extractor.name = Oil Extractor
block.command-center.name = Command Center
block.draug-factory.name = Draug Miner Drone Factory block.draug-factory.name = Draug Miner Drone Factory
block.spirit-factory.name = Spirit Repair Drone Factory block.spirit-factory.name = Spirit Repair Drone Factory
block.phantom-factory.name = Phantom Builder Drone Factory block.phantom-factory.name = Phantom Builder Drone Factory
@@ -889,8 +900,6 @@ tutorial.deposit = Deposit items into blocks by dragging from your ship to the d
tutorial.waves = The[lightgray] enemy[] approaches.\n\nDefend the core for 2 waves.[accent] Click[] to shoot.\nBuild more turrets and drills. Mine more copper. tutorial.waves = The[lightgray] enemy[] approaches.\n\nDefend the core for 2 waves.[accent] Click[] to shoot.\nBuild more turrets and drills. Mine more copper.
tutorial.waves.mobile = The[lightgray] enemy[] approaches.\n\nDefend the core for 2 waves. Your ship will automatically fire at enemies.\nBuild more turrets and drills. Mine more copper. tutorial.waves.mobile = The[lightgray] enemy[] approaches.\n\nDefend the core for 2 waves. Your ship will automatically fire at enemies.\nBuild more turrets and drills. Mine more copper.
tutorial.launch = Once you reach a specific wave, you are able to[accent] launch the core[], leaving your defenses behind and[accent] obtaining all the resources in your core.[]\nThese resources can then be used to research new technology.\n\n[accent]Press the launch button. tutorial.launch = Once you reach a specific wave, you are able to[accent] launch the core[], leaving your defenses behind and[accent] obtaining all the resources in your core.[]\nThese resources can then be used to research new technology.\n\n[accent]Press the launch button.
item.copper.description = The most basic structural material. Used extensively in all types of blocks. item.copper.description = The most basic structural material. Used extensively in all types of blocks.
item.lead.description = A basic starter material. Used extensively in electronics and liquid transportation blocks. item.lead.description = A basic starter material. Used extensively in electronics and liquid transportation blocks.
item.metaglass.description = A super-tough glass compound. Extensively used for liquid distribution and storage. item.metaglass.description = A super-tough glass compound. Extensively used for liquid distribution and storage.
@@ -1031,6 +1040,7 @@ block.ripple.description = An extremely powerful artillery turret. Shoots cluste
block.cyclone.description = A large anti-air and anti-ground turret. Fires explosive clumps of flak at nearby units. block.cyclone.description = A large anti-air and anti-ground turret. Fires explosive clumps of flak at nearby units.
block.spectre.description = A massive dual-barreled cannon. Shoots large armor-piercing bullets at air and ground targets. block.spectre.description = A massive dual-barreled cannon. Shoots large armor-piercing bullets at air and ground targets.
block.meltdown.description = A massive laser cannon. Charges and fires a persistent laser beam at nearby enemies. Requires coolant to operate. block.meltdown.description = A massive laser cannon. Charges and fires a persistent laser beam at nearby enemies. Requires coolant to operate.
block.command-center.description = Issues movement commands to allied units across the map.\nCauses units to patrol, attack an enemy core or retreat to the core/factory. When no enemy core is present, units will default to patrolling under the attack command.
block.draug-factory.description = Produces Draug mining drones. block.draug-factory.description = Produces Draug mining drones.
block.spirit-factory.description = Produces Spirit structural repair drones. block.spirit-factory.description = Produces Spirit structural repair drones.
block.phantom-factory.description = Produces advanced construction drones. block.phantom-factory.description = Produces advanced construction drones.

View File

@@ -16,7 +16,11 @@ screenshot.invalid = 地图太大,可能没有足够的内存用于截图。
gameover = 你的核心被摧毁了! gameover = 你的核心被摧毁了!
gameover.pvp = [accent] {0}[] 队获胜! gameover.pvp = [accent] {0}[] 队获胜!
highscore = [accent]新纪录! highscore = [accent]新纪录!
load.sound = Sounds
load.map = Maps
load.image = Images
load.content = Content
load.system = System
stat.wave = 战胜的波数:[accent]{0} stat.wave = 战胜的波数:[accent]{0}
stat.enemiesDestroyed = 消灭的敌人:[accent]{0} stat.enemiesDestroyed = 消灭的敌人:[accent]{0}
stat.built = 建造的建筑:[accent]{0} stat.built = 建造的建筑:[accent]{0}
@@ -24,7 +28,6 @@ stat.destroyed = 摧毁的建筑:[accent]{0}
stat.deconstructed = 拆除的建筑:[accent]{0} stat.deconstructed = 拆除的建筑:[accent]{0}
stat.delivered = 发射的资源: stat.delivered = 发射的资源:
stat.rank = 最终等级:[accent]{0} stat.rank = 最终等级:[accent]{0}
launcheditems = [accent]发射的资源 launcheditems = [accent]发射的资源
map.delete = 确定要删除 "[accent]{0}[]" 地图吗? map.delete = 确定要删除 "[accent]{0}[]" 地图吗?
level.highscore = 最高分:[accent]{0} level.highscore = 最高分:[accent]{0}
@@ -63,9 +66,11 @@ players.single = {0}玩家在线
server.closing = [accent]正在关闭服务器…… server.closing = [accent]正在关闭服务器……
server.kicked.kick = 你被踢出服务器了! server.kicked.kick = 你被踢出服务器了!
server.kicked.serverClose = 服务器已关闭。 server.kicked.serverClose = 服务器已关闭。
server.kicked.vote = You have been vote-kicked. Goodbye.
server.kicked.clientOutdated = 客户端过旧,请更新你的游戏。 server.kicked.clientOutdated = 客户端过旧,请更新你的游戏。
server.kicked.serverOutdated = 服务器过旧,请联系房主升级服务器。 server.kicked.serverOutdated = 服务器过旧,请联系房主升级服务器。
server.kicked.banned = 你在这个服务器上被拉入黑名单了。 server.kicked.banned = 你在这个服务器上被拉入黑名单了。
server.kicked.typeMismatch = This server is not compatible with your build type.
server.kicked.recentKick = 你刚刚被踢出服务器。\n请稍后重新连接 server.kicked.recentKick = 你刚刚被踢出服务器。\n请稍后重新连接
server.kicked.nameInUse = 你的名字与服务器中的一个人重复了。 server.kicked.nameInUse = 你的名字与服务器中的一个人重复了。
server.kicked.nameEmpty = 无效的名字! server.kicked.nameEmpty = 无效的名字!
@@ -156,6 +161,11 @@ cancel = 取消
openlink = 打开链接 openlink = 打开链接
copylink = 复制链接 copylink = 复制链接
back = 返回 back = 返回
data.export = Export Data
data.import = Import Data
data.exported = Data exported.
data.invalid = This isn't valid game data.
data.import.confirm = Importing external data will erase[scarlet] all[] your current game data.\n[accent]This cannot be undone![]\n\nOnce the data is imported, your game will exit immediately.
classic.export = 导出老版本数据 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 = 确定退出?
@@ -250,7 +260,6 @@ 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 = 仅在实心块上绘制。 toolmode.replace.description = 仅在实心块上绘制。
toolmode.replaceall = 全部替换 toolmode.replaceall = 全部替换
@@ -265,7 +274,6 @@ 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 = Distort filter.distort = Distort
filter.noise = Noise filter.noise = Noise
@@ -297,7 +305,6 @@ filter.option.floor2 = Secondary Floor
filter.option.threshold2 = Secondary Threshold filter.option.threshold2 = Secondary Threshold
filter.option.radius = Radius filter.option.radius = Radius
filter.option.percentile = Percentile filter.option.percentile = Percentile
width = 宽度: width = 宽度:
height = 高度: height = 高度:
menu = 菜单 menu = 菜单
@@ -315,7 +322,6 @@ tutorial.retake = 重新游玩教程
editor = 编辑器 editor = 编辑器
mapeditor = 地图编辑器 mapeditor = 地图编辑器
donate = 打赏 donate = 打赏
abandon = 放弃 abandon = 放弃
abandon.text = 这个区域和它的所有资源会被敌人重置。 abandon.text = 这个区域和它的所有资源会被敌人重置。
locked = 已被锁定 locked = 已被锁定
@@ -341,7 +347,6 @@ zone.objective.survival = 生存
zone.objective.attack = 摧毁敌方核心 zone.objective.attack = 摧毁敌方核心
add = 添加…… add = 添加……
boss.health = BOSS 生命值 boss.health = BOSS 生命值
connectfail = [crimson]服务器连接失败:[accent]{0} connectfail = [crimson]服务器连接失败:[accent]{0}
error.unreachable = 服务器无法访问。 error.unreachable = 服务器无法访问。
error.invalidaddress = 地址无效。 error.invalidaddress = 地址无效。
@@ -352,7 +357,6 @@ 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 = 陨石带
@@ -367,7 +371,6 @@ zone.saltFlats.name = 盐碱荒滩
zone.impact0078.name = 0078号冲击 zone.impact0078.name = 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\n此行动须投入电力。建造燃烧发电机并学会使用修理者。 zone.frozenForest.description = 即使在这里,靠近山脉的地方,孢子也已经扩散。寒冷的温度不可能永远容纳它们。\n\n此行动须投入电力。建造燃烧发电机并学会使用修理者。
zone.desertWastes.description = 这些废物是巨大的,不可预测的,并且与废弃的结构交错在一起。燃烧它以获取动力或合成石墨。\n\n[lightgray]无法保证此着陆位置。 zone.desertWastes.description = 这些废物是巨大的,不可预测的,并且与废弃的结构交错在一起。燃烧它以获取动力或合成石墨。\n\n[lightgray]无法保证此着陆位置。
@@ -382,8 +385,8 @@ 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.reset = 恢复默认 settings.reset = 恢复默认
settings.rebind = 重新绑定 settings.rebind = 重新绑定
settings.controls = 控制 settings.controls = 控制
@@ -435,7 +438,6 @@ 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}%
@@ -448,7 +450,6 @@ 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] 燃烧
@@ -460,7 +461,6 @@ 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 = 液体单位/秒
@@ -518,6 +518,7 @@ setting.mutemusic.name = 静音
setting.sfxvol.name = 音效音量 setting.sfxvol.name = 音效音量
setting.mutesound.name = 静音 setting.mutesound.name = 静音
setting.crashreport.name = 发送匿名崩溃报告 setting.crashreport.name = 发送匿名崩溃报告
setting.savecreate.name = Auto-Create Saves
setting.chatopacity.name = 聊天界面透明度 setting.chatopacity.name = 聊天界面透明度
setting.playerchat.name = 显示游戏内聊天界面 setting.playerchat.name = 显示游戏内聊天界面
uiscale.reset = UI缩放比例已经改变。\n按下“确定”来确定缩放比例\n[accent]{0}[]秒后[scarlet]退出并恢复设定。 uiscale.reset = UI缩放比例已经改变。\n按下“确定”来确定缩放比例\n[accent]{0}[]秒后[scarlet]退出并恢复设定。
@@ -571,7 +572,6 @@ mode.pvp.description = 和本地玩家对战。
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,7 +598,6 @@ 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 = 部队
@@ -660,7 +659,6 @@ 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 = 盐碱地
@@ -888,8 +886,6 @@ tutorial.deposit = 将物品从机甲拖向方块来放下物品。\n\n[accent]
tutorial.waves = [lightgray]敌人[]来了。\n\n保护核心防御2波攻击。造更多的炮塔。[accent]点击[]以射击。\n建造更多的炮塔和钻头并采更多的矿。 tutorial.waves = [lightgray]敌人[]来了。\n\n保护核心防御2波攻击。造更多的炮塔。[accent]点击[]以射击。\n建造更多的炮塔和钻头并采更多的矿。
tutorial.waves.mobile = [lightgray]敌人[]来了。\n\n保护核心防御2波攻击。造更多的炮塔。你的机甲将对敌人自动开火。\n建造更多的炮塔和钻头并采更多的矿。 tutorial.waves.mobile = [lightgray]敌人[]来了。\n\n保护核心防御2波攻击。造更多的炮塔。你的机甲将对敌人自动开火。\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 = 一种超级强硬的复合玻璃。通常用来传送和收藏液体。

View File

@@ -16,6 +16,11 @@ screenshot.invalid = 地圖太大了,可能沒有足夠的內存用於截圖
gameover = 遊戲結束 gameover = 遊戲結束
gameover.pvp = [accent]{0}[]隊獲勝! gameover.pvp = [accent]{0}[]隊獲勝!
highscore = [accent]新的高分紀錄! highscore = [accent]新的高分紀錄!
load.sound = Sounds
load.map = Maps
load.image = Images
load.content = Content
load.system = System
stat.wave = 打敗的波次:[accent]{0} stat.wave = 打敗的波次:[accent]{0}
stat.enemiesDestroyed = 摧毀的敵人:[accent]{0} stat.enemiesDestroyed = 摧毀的敵人:[accent]{0}
stat.built = 建設的建築:[accent]{0} stat.built = 建設的建築:[accent]{0}
@@ -23,8 +28,6 @@ stat.destroyed = 摧毀的建築:[accent]{0}
stat.deconstructed = 移除的建築:[accent]{0} stat.deconstructed = 移除的建築:[accent]{0}
stat.delivered = 發射的資源: stat.delivered = 發射的資源:
stat.rank = 最終排名:[accent]{0} stat.rank = 最終排名:[accent]{0}
placeline = 你選擇了一個方塊。\n[accent]按住你的手指幾秒鐘[]並拖動以[accent]直線放置方塊[]。\n試試吧。
removearea = 你選擇了移除模式。\n[accent]按住你的手指幾秒鐘[]並拖動以[accent]移除矩形中的方塊[]。\n試試吧。
launcheditems = [accent]發射了的物品 launcheditems = [accent]發射了的物品
map.delete = 確認要刪除「[accent]{0}[]」地圖嗎? map.delete = 確認要刪除「[accent]{0}[]」地圖嗎?
level.highscore = 最高分:[accent]{0} level.highscore = 最高分:[accent]{0}
@@ -63,9 +66,11 @@ players.single = {0}個線上玩家
server.closing = [accent]正在關閉伺服器…… server.closing = [accent]正在關閉伺服器……
server.kicked.kick = 您已被踢出伺服器! server.kicked.kick = 您已被踢出伺服器!
server.kicked.serverClose = 伺服器已關閉。 server.kicked.serverClose = 伺服器已關閉。
server.kicked.vote = You have been vote-kicked. Goodbye.
server.kicked.clientOutdated = 客戶端版本過舊!請更新遊戲! server.kicked.clientOutdated = 客戶端版本過舊!請更新遊戲!
server.kicked.serverOutdated = 伺服器版本過舊!請聯絡伺服主更新伺服器! server.kicked.serverOutdated = 伺服器版本過舊!請聯絡伺服主更新伺服器!
server.kicked.banned = 您已經從這個伺服器被封禁。 server.kicked.banned = 您已經從這個伺服器被封禁。
server.kicked.typeMismatch = This server is not compatible with your build type.
server.kicked.recentKick = 您已經從伺服器被踢除。\n請稍後再進行連線。 server.kicked.recentKick = 您已經從伺服器被踢除。\n請稍後再進行連線。
server.kicked.nameInUse = 伺服器中已經\n有人有相同的名稱了。 server.kicked.nameInUse = 伺服器中已經\n有人有相同的名稱了。
server.kicked.nameEmpty = 你的名稱必須至少包含一個字母或數字。 server.kicked.nameEmpty = 你的名稱必須至少包含一個字母或數字。
@@ -156,6 +161,11 @@ cancel = 取消
openlink = 開啟連結 openlink = 開啟連結
copylink = 複製連結 copylink = 複製連結
back = 返回 back = 返回
data.export = Export Data
data.import = Import Data
data.exported = Data exported.
data.invalid = This isn't valid game data.
data.import.confirm = Importing external data will erase[scarlet] all[] your current game data.\n[accent]This cannot be undone![]\n\nOnce the data is imported, your game will exit immediately.
classic.export = Export Classic Data classic.export = Export Classic Data
classic.export.text = [accent]Mindustry[] has just had a major update.\nClassic (v3.5 build 40) save or map data has been detected. Would you like to export these saves to your phone's home folder, for use in the Mindustry Classic app? classic.export.text = [accent]Mindustry[] has just had a major update.\nClassic (v3.5 build 40) save or map data has been detected. Would you like to export these saves to your phone's home folder, for use in the Mindustry Classic app?
quit.confirm = 您確定要退出嗎? quit.confirm = 您確定要退出嗎?
@@ -376,6 +386,7 @@ zone.fungalPass.description = A transition area between high mountains and lower
zone.impact0078.description = <insert description here> zone.impact0078.description = <insert description here>
zone.crags.description = <insert description here> zone.crags.description = <insert description here>
settings.language = 語言 settings.language = 語言
settings.data = Game Data
settings.reset = 重設為預設設定 settings.reset = 重設為預設設定
settings.rebind = 重新綁定 settings.rebind = 重新綁定
settings.controls = 操作 settings.controls = 操作
@@ -507,6 +518,7 @@ setting.mutemusic.name = 靜音
setting.sfxvol.name = 音效音量 setting.sfxvol.name = 音效音量
setting.mutesound.name = 靜音 setting.mutesound.name = 靜音
setting.crashreport.name = 發送匿名崩潰報告 setting.crashreport.name = 發送匿名崩潰報告
setting.savecreate.name = Auto-Create Saves
setting.chatopacity.name = 聊天框不透明度 setting.chatopacity.name = 聊天框不透明度
setting.playerchat.name = 在遊戲中顯示聊天框 setting.playerchat.name = 在遊戲中顯示聊天框
uiscale.reset = UI scale has been changed.\nPress "OK" to confirm this scale.\n[scarlet]Reverting and exiting in[accent] {0}[] settings... uiscale.reset = UI scale has been changed.\nPress "OK" to confirm this scale.\n[scarlet]Reverting and exiting in[accent] {0}[] settings...
@@ -527,6 +539,7 @@ keybind.press.axis = 按一下軸心或鍵……
keybind.screenshot.name = 地圖截圖 keybind.screenshot.name = 地圖截圖
keybind.move_x.name = 水平移動 keybind.move_x.name = 水平移動
keybind.move_y.name = 垂直移動 keybind.move_y.name = 垂直移動
keybind.fullscreen.name = Toggle Fullscreen
keybind.select.name = 選取 keybind.select.name = 選取
keybind.diagonal_placement.name = 對角線放置 keybind.diagonal_placement.name = 對角線放置
keybind.pick.name = 選擇方塊 keybind.pick.name = 選擇方塊
@@ -790,6 +803,7 @@ block.blast-mixer.name = 爆炸混合器
block.solar-panel.name = 太陽能板 block.solar-panel.name = 太陽能板
block.solar-panel-large.name = 大型太陽能板 block.solar-panel-large.name = 大型太陽能板
block.oil-extractor.name = 石油鑽井 block.oil-extractor.name = 石油鑽井
block.command-center.name = Command Center
block.draug-factory.name = Draug Miner Drone Factory block.draug-factory.name = Draug Miner Drone Factory
block.spirit-factory.name = 輕型無人機工廠 block.spirit-factory.name = 輕型無人機工廠
block.phantom-factory.name = 幻影無人機工廠 block.phantom-factory.name = 幻影無人機工廠
@@ -1012,6 +1026,7 @@ block.ripple.description = 一種一次射出幾發子彈的大型火砲。
block.cyclone.description = 一種快速射擊的大型砲塔。 block.cyclone.description = 一種快速射擊的大型砲塔。
block.spectre.description = 一種一次射出兩顆強大的子彈的大型砲塔。 block.spectre.description = 一種一次射出兩顆強大的子彈的大型砲塔。
block.meltdown.description = 一種射出強大的遠程光束的大型砲塔。 block.meltdown.description = 一種射出強大的遠程光束的大型砲塔。
block.command-center.description = Issues movement commands to allied units across the map.\nCauses units to patrol, attack an enemy core or retreat to the core/factory. When no enemy core is present, units will default to patrolling under the attack command.
block.draug-factory.description = Produces Draug mining drones. block.draug-factory.description = Produces Draug mining drones.
block.spirit-factory.description = 生產輕型無人機,用於開採礦石和修復方塊。 block.spirit-factory.description = 生產輕型無人機,用於開採礦石和修復方塊。
block.phantom-factory.description = 生產高級的無人機,比輕型無人機明顯更有效。 block.phantom-factory.description = 生產高級的無人機,比輕型無人機明顯更有效。

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Before

Width:  |  Height:  |  Size: 719 B

After

Width:  |  Height:  |  Size: 718 B

File diff suppressed because it is too large Load Diff

Binary file not shown.

Before

Width:  |  Height:  |  Size: 682 KiB

After

Width:  |  Height:  |  Size: 672 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 274 KiB

After

Width:  |  Height:  |  Size: 258 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 579 KiB

After

Width:  |  Height:  |  Size: 577 KiB

View File

@@ -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,
}
}
}

View File

@@ -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();

View File

@@ -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,11 +11,11 @@ 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.entities.type.Bullet;
import io.anuke.mindustry.entities.type.EffectEntity;
import io.anuke.mindustry.game.*; 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.*;
@@ -43,6 +44,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 +62,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 +107,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 +133,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;
@@ -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."));
} }

View File

@@ -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());
} }

View File

@@ -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;
} }
/** /**

View File

@@ -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(){

View File

@@ -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);

View File

@@ -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

View File

@@ -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 -> {
});
} }
} }

View File

@@ -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;
}}; }};

View File

@@ -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,13 @@ 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);
}
}));
opposite(() -> burning);
}}; }};
melting = new StatusEffect(){{ melting = new StatusEffect(){{

View File

@@ -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);
} }
} }
} }

View File

@@ -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.*;

View File

@@ -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,7 +366,6 @@ public class Control implements ApplicationListener, Loadable{
if(android){ if(android){
Sounds.empty.loop(0f, 1f, 0f); Sounds.empty.loop(0f, 1f, 0f);
checkClassicData();
} }
} }
@@ -414,7 +400,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);
} }
} }

View File

@@ -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){

View File

@@ -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();
} }
} }

View File

@@ -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());
} }
} }

View File

@@ -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;
} }

View File

@@ -1,18 +1,38 @@
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.files.*;
import io.anuke.arc.function.Consumer; import io.anuke.arc.function.*;
import io.anuke.arc.function.Predicate; import io.anuke.arc.math.*;
import io.anuke.arc.math.RandomXS128; import io.anuke.arc.scene.ui.*;
import io.anuke.arc.scene.ui.TextField; import io.anuke.arc.util.serialization.*;
import io.anuke.arc.util.serialization.Base64Coder; 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: 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 +56,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 +85,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(){
} }
} }

View File

@@ -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();

View File

@@ -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,75 @@ 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(false);
cont.margin(15f);
cont.add("$error.title"); cont.add("$error.title");
cont.row(); cont.row();
cont.margin(15).pane(t -> { cont.addImage().fillX().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);
if(mobile){ buttons.addButton("$ok", this::hide).size(120, 50).pad(4);
t.getCell(l).wrap().width(400f); }}.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);
} }

View File

@@ -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{

View File

@@ -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();
} }

View File

@@ -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();

View File

@@ -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();

View File

@@ -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);

View File

@@ -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

View File

@@ -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)

View File

@@ -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");
} }
} }

View File

@@ -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;
} }

View File

@@ -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();
} }
} }

View File

@@ -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);

View File

@@ -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). */

View File

@@ -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)){

View File

@@ -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. */

View File

@@ -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.*;

View File

@@ -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();

View File

@@ -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);
} }

View File

@@ -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));
} }
} }
} }

View File

@@ -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;

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